Content Scope Runner: Difference between revisions

From GreaseSpot Wiki
Jump to navigationJump to search
(This version actually works.)
(remove obsolete content)
 
(14 intermediate revisions by 6 users not shown)
Line 1: Line 1:
An extension of the [[Content Script Injection]] technique, this snippet automatically runs the ''entire'' user script in the content scope.
As of Greasemonkey 1.0 specifying <code>[[@grant]] none</code> provides the behavior previously available by this technique.


<pre class='sample'>if(typeof __PAGE_SCOPE_RUN__ == 'undefined') {
The previous content of this page is available [http://wiki.greasespot.net/index.php?title=Content_Scope_Runner&oldid=7215 via history] only.
  (function page_scope_runner() {
      // Grab the anonymous function the entire script is wrapped in
      var my_src = page_scope_runner.caller.toString();
     
      // Alter the script's environment to prevent unbounded recursion...
      var safe_source = "var __PAGE_SCOPE_RUN__ = 'yes';\n";
      // ...and then allow it to call our anonymous function.
      safeSource += "(" + my_src + ")();\n";
 
      // Create a script node holding this script, plus a marker that lets us
      // know we are running in the page scope (not the Greasemonkey sandbox).
      var script = document.createElement('script');
      script.setAttribute("type", "application/javascript");
      script.appendChild(document.createTextNode(safe_src));
 
      // Insert the script node into the page, so it will run, and immediately
      // remove it to clean up.
      document.documentElement.appendChild(script);
      document.documentElement.removeChild(script);
  })();
  return;
}</pre>
 
As long as this is the ''first'' piece of code in your script, it will stop execution of the remainder of the script, and re-start execution completely within the content scope.
Thus you need not worry about any of the [[security]] restrictions from [[XPCNativeWrappers]] in the Greasemonkey [[sandbox]].
You also will, of course, not have access to any of the [[API]]s.
 
<!-- This still needs work.
== @require ==
 
If used as the first [[Metadata Block#.40require|@require]]d script, this snippet will continue to run and work perfectly.
Try it by adding this line as the first @require in the [[Metadata Block]]:
 
<nowiki>// @require http://userscripts.org/scripts/source/68059.user.js</nowiki>
-->
 
[[Category:Coding Tips:Interacting With The Page]]
[[Category:@require Library]]

Latest revision as of 15:12, 23 September 2015

As of Greasemonkey 1.0 specifying @grant none provides the behavior previously available by this technique.

The previous content of this page is available via history only.