Content Scope Runner: Difference between revisions

From GreaseSpot Wiki
Jump to navigationJump to search
(Clean up, provide tips)
(Comment out the @require library category)
Line 31: Line 31:


  <nowiki>// @require http://userscripts.org/scripts/source/68059.user.js</nowiki>
  <nowiki>// @require http://userscripts.org/scripts/source/68059.user.js</nowiki>
[[Category:@require Library]]
-->
-->


[[Category:Coding Tips:Interacting With The Page]]
[[Category:Coding Tips:Interacting With The Page]]
[[Category:@require Library]]

Revision as of 16:29, 7 August 2010

An extension of the Content Script Injection technique, this snippet automatically runs the entire user script in the content scope.

if(typeof __PAGE_SCOPE_RUN__ == 'undefined') {
   (function page_scope_runner() {
      var script = document.createElement('script');
      script.setAttribute("type", "application/javascript");
      script.textContent = "(function() { var __PAGE_SCOPE_RUN__ = 'yes'; (" + page_scope_runner.caller.toString() + ")(); })();";
      document.documentElement.appendChild(script);
      document.documentElement.removeChild(script);
   })();
   return;
}

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 APIs.

Tips

  • This code must not be wrapped in a function, or the return will fail to work. It may be wrapped in a conditional.
  • Any code before the block will be run twice: Once in GreaseMonkey context, once in page context.
  • Any code after the 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 userscript. Finally, the block calls return, ending execution.