forked from mirrors/gecko-dev
		
	Also removes some dead code. A lot of the code in ExtensionUtils.jsm is not needed in all processes, and a lot of the rest isn't needed until extension code runs. Most of it winds up being loaded into all processes way earlier than necessary. MozReview-Commit-ID: CMRjCPOjRF2 --HG-- extra : rebase_source : 37718eaf05a22b8ccb95f633cf7454bd7975cdce
		
			
				
	
	
		
			84 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 | 
						|
/* vim: set sts=2 sw=2 et tw=80: */
 | 
						|
"use strict";
 | 
						|
 | 
						|
/* global getDevToolsTargetForContext */
 | 
						|
 | 
						|
var {
 | 
						|
  SpreadArgs,
 | 
						|
} = ExtensionCommon;
 | 
						|
 | 
						|
this.devtools_inspectedWindow = class extends ExtensionAPI {
 | 
						|
  getAPI(context) {
 | 
						|
    const {
 | 
						|
      WebExtensionInspectedWindowFront,
 | 
						|
    } = require("devtools/shared/fronts/webextension-inspected-window");
 | 
						|
 | 
						|
    // Lazily retrieve and store an inspectedWindow actor front per child context.
 | 
						|
    let waitForInspectedWindowFront;
 | 
						|
    async function getInspectedWindowFront() {
 | 
						|
      // If there is not yet a front instance, then a lazily cloned target for the context is
 | 
						|
      // retrieved using the DevtoolsParentContextsManager helper (which is an asynchronous operation,
 | 
						|
      // because the first time that the target has been cloned, it is not ready to be used to create
 | 
						|
      // the front instance until it is connected to the remote debugger successfully).
 | 
						|
      const clonedTarget = await getDevToolsTargetForContext(context);
 | 
						|
      return new WebExtensionInspectedWindowFront(clonedTarget.client, clonedTarget.form);
 | 
						|
    }
 | 
						|
 | 
						|
    function getToolboxOptions() {
 | 
						|
      const options = {};
 | 
						|
      const toolbox = context.devToolsToolbox;
 | 
						|
      const selectedNode = toolbox.selection;
 | 
						|
 | 
						|
      if (selectedNode && selectedNode.nodeFront) {
 | 
						|
        // If there is a selected node in the inspector, we hand over
 | 
						|
        // its actor id to the eval request in order to provide the "$0" binding.
 | 
						|
        options.toolboxSelectedNodeActorID = selectedNode.nodeFront.actorID;
 | 
						|
      }
 | 
						|
 | 
						|
      // Provide the console actor ID to implement the "inspect" binding.
 | 
						|
      options.toolboxConsoleActorID = toolbox.target.form.consoleActor;
 | 
						|
 | 
						|
      return options;
 | 
						|
    }
 | 
						|
 | 
						|
    // TODO(rpl): retrive a more detailed callerInfo object, like the filename and
 | 
						|
    // lineNumber of the actual extension called, in the child process.
 | 
						|
    const callerInfo = {
 | 
						|
      addonId: context.extension.id,
 | 
						|
      url: context.extension.baseURI.spec,
 | 
						|
    };
 | 
						|
 | 
						|
    return {
 | 
						|
      devtools: {
 | 
						|
        inspectedWindow: {
 | 
						|
          async eval(expression, options) {
 | 
						|
            if (!waitForInspectedWindowFront) {
 | 
						|
              waitForInspectedWindowFront = getInspectedWindowFront();
 | 
						|
            }
 | 
						|
 | 
						|
            const front = await waitForInspectedWindowFront;
 | 
						|
 | 
						|
            const evalOptions = Object.assign({}, options, getToolboxOptions());
 | 
						|
 | 
						|
            const evalResult = await front.eval(callerInfo, expression, evalOptions);
 | 
						|
 | 
						|
            // TODO(rpl): check for additional undocumented behaviors on chrome
 | 
						|
            // (e.g. if we should also print error to the console or set lastError?).
 | 
						|
            return new SpreadArgs([evalResult.value, evalResult.exceptionInfo]);
 | 
						|
          },
 | 
						|
          async reload(options) {
 | 
						|
            const {ignoreCache, userAgent, injectedScript} = options || {};
 | 
						|
 | 
						|
            if (!waitForInspectedWindowFront) {
 | 
						|
              waitForInspectedWindowFront = getInspectedWindowFront();
 | 
						|
            }
 | 
						|
 | 
						|
            const front = await waitForInspectedWindowFront;
 | 
						|
            front.reload(callerInfo, {ignoreCache, userAgent, injectedScript});
 | 
						|
          },
 | 
						|
        },
 | 
						|
      },
 | 
						|
    };
 | 
						|
  }
 | 
						|
};
 |