Content Scope Runner: Difference between revisions

From GreaseSpot Wiki
Jump to navigationJump to search
(restore the original version, with comments, fixed, and the example @require line to it)
(remove obsolete content)
 
(9 intermediate revisions by 4 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 ('undefined' == typeof __PAGE_SCOPE_RUN__) {
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() {
    // If we're _not_ already running in the page, grab the full source
    // of this script.
    var my_src = "(" + page_scope_runner.caller.toString() + ")();";
 
    // 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).
    // Note that we are intentionally *not* scope-wrapping here.
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.setAttribute("src",
        "data:,"+escape("const __PAGE_SCOPE_RUN__ = true;\n" + my_src));
 
    // Insert the script node into the page, so it will run, and immediately
    // remove it to clean up. Use setTimeout to force execution "outside" of
    // the user script scope completely.
    setTimeout(function() {
          document.body.appendChild(script);
          document.body.removeChild(script);
        }, 0);
  })();
 
  // Stop running, because we know Greasemonkey actually runs us in
  // an anonymous wrapper.
  return;
}</pre>
 
As soon as execution reaches this code, the entire script will be injected into the page and re-run. 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.
 
== Tips ==
 
* This code must not be wrapped in a function, or the <code>return</code> will fail to work. It may be wrapped in a conditional.
* Any code before (and including) this block will be run twice: Once in GreaseMonkey context, once in page context.
* Any code after this block will only be run once, in the page context.
 
== Explanation ==
 
The code block first checks to see if it is being run inside the page by looking for a marker it knows about.
If the marker is not present, the block creates and injects a script element that starts by setting the aforementioned marker variable and finishes by executing the text of the user script.
Finally, the block calls <code>return</code>, ending execution.
 
== @require ==
 
Since it must run before the rest of the script, this snipped functions best as the first [[Metadata Block#.40require|@require]].
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.