Content Scope Runner: Difference between revisions

From GreaseSpot Wiki
Jump to navigationJump to search
(Created page with 'An extension of the content script injection technique, this snippet automatically runs the ''entire'' user script in the content scope. <pre class='sample'> (function page_…')
 
(remove obsolete content)
 
(20 intermediate revisions by 7 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'>
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 ('undefined' == typeof __PAGE_SCOPE_RUN__) {
    // 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).
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = "const __PAGE_SCOPE_RUN__ = true;" + my_src;
 
    // Insert the script node into the page, so it will run, and immediately
    // remove it to clean up.
    document.body.appendChild(script);
    document.body.removeChild(script);
 
    // Stop running, because we know Greasemonkey actually runs us in
    // an anonymous wrapper.
    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.
 
== @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]]:
 
// @require http://userscripts.org/scripts/source/68059.user.js
 
[[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.