Bug 1474980 - Remove deprecated DebuggerServer.addActors(). r=jryans draft
authorAlexandre Poirot <poirot.alex@gmail.com>
Wed, 11 Jul 2018 10:41:27 -0700
changeset 817604 a18bef7ae21cc9c3f67cf48324301ee81bcea537
parent 817216 0a540c2a59ed486320544a81f890742756631f8f
child 817605 61d2bca5a64b3856b681a98b8cf04b2a9c846ef4
push id116135
push userbmo:poirot.alex@gmail.com
push dateFri, 13 Jul 2018 09:17:18 +0000
reviewersjryans
bugs1474980
milestone63.0a1
Bug 1474980 - Remove deprecated DebuggerServer.addActors(). r=jryans MozReview-Commit-ID: 8J1wucp1G0p
devtools/client/debugger/test/mochitest/browser_dbg_globalactor.js
devtools/client/debugger/test/mochitest/browser_dbg_target-scoped-actor-01.js
devtools/client/debugger/test/mochitest/browser_dbg_target-scoped-actor-02.js
devtools/client/debugger/test/mochitest/testactors.js
devtools/server/main.js
devtools/server/startup/frame.js
devtools/server/tests/browser/browser_actor_error.js
devtools/server/tests/browser/error-actor.js
devtools/server/tests/unit/post_init_global_actors.js
devtools/server/tests/unit/post_init_target_scoped_actors.js
devtools/server/tests/unit/pre_init_global_actors.js
devtools/server/tests/unit/pre_init_target_scoped_actors.js
devtools/server/tests/unit/test_add_actors.js
testing/xpcshell/dbg-actors.js
testing/xpcshell/head.js
--- a/devtools/client/debugger/test/mochitest/browser_dbg_globalactor.js
+++ b/devtools/client/debugger/test/mochitest/browser_dbg_globalactor.js
@@ -10,50 +10,54 @@
 const ACTORS_URL = CHROME_URL + "testactors.js";
 
 function test() {
   let gClient;
 
   DebuggerServer.init();
   DebuggerServer.registerAllActors();
 
-  DebuggerServer.addActors(ACTORS_URL);
+  DebuggerServer.registerModule(ACTORS_URL, {
+    prefix: "testOne",
+    constructor: "TestActor1",
+    type: { global: true },
+  });
 
   let transport = DebuggerServer.connectPipe();
   gClient = new DebuggerClient(transport);
   gClient.connect().then(([aType, aTraits]) => {
     is(aType, "browser",
       "Root actor should identify itself as a browser.");
 
     gClient.listTabs().then(aResponse => {
-      let globalActor = aResponse.testGlobalActor1;
+      let globalActor = aResponse.testOneActor;
       ok(globalActor, "Found the test global actor.");
-      ok(globalActor.includes("test_one"),
+      ok(globalActor.includes("testOne"),
         "testGlobalActor1's actorPrefix should be used.");
 
       gClient.request({ to: globalActor, type: "ping" }, aResponse => {
         is(aResponse.pong, "pong", "Actor should respond to requests.");
 
         // Send another ping to see if the same actor is used.
         gClient.request({ to: globalActor, type: "ping" }, aResponse => {
           is(aResponse.pong, "pong", "Actor should respond to requests.");
 
           // Make sure that lazily-created actors are created only once.
           let count = 0;
           for (let connID of Object.getOwnPropertyNames(DebuggerServer._connections)) {
             let conn = DebuggerServer._connections[connID];
-            let actorPrefix = conn._prefix + "test_one";
+            let actorPrefix = conn._prefix + "testOne";
             for (let pool of conn._extraPools) {
               count += Object.keys(pool._actors).filter(e => {
                 return e.startsWith(actorPrefix);
               }).length;
             }
           }
 
-          is(count, 2,
-            "Only two actor exists in all pools. One target-scoped actor and one global.");
+          is(count, 1,
+            "Only one actor exists in all pools. One global actor.");
 
           gClient.close().then(finish);
         });
       });
     });
   });
 }
--- a/devtools/client/debugger/test/mochitest/browser_dbg_target-scoped-actor-01.js
+++ b/devtools/client/debugger/test/mochitest/browser_dbg_target-scoped-actor-01.js
@@ -11,17 +11,21 @@ const ACTORS_URL = CHROME_URL + "testact
 const TAB_URL = EXAMPLE_URL + "doc_empty-tab-01.html";
 
 var gClient;
 
 function test() {
   DebuggerServer.init();
   DebuggerServer.registerAllActors();
 
-  DebuggerServer.addActors(ACTORS_URL);
+  DebuggerServer.registerModule(ACTORS_URL, {
+    prefix: "testOne",
+    constructor: "TestActor1",
+    type: { target: true },
+  });
 
   let transport = DebuggerServer.connectPipe();
   gClient = new DebuggerClient(transport);
   gClient.connect().then(([aType, aTraits]) => {
     is(aType, "browser",
       "Root actor should identify itself as a browser.");
 
     addTab(TAB_URL)
@@ -34,22 +38,22 @@ function test() {
         ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
       });
   });
 }
 
 function testTargetScopedActor([aGrip, aResponse]) {
   let deferred = promise.defer();
 
-  ok(aGrip.testTargetScopedActor1,
+  ok(aGrip.testOneActor,
     "Found the test target-scoped actor.");
-  ok(aGrip.testTargetScopedActor1.includes("test_one"),
-    "testTargetScopedActor1's actorPrefix should be used.");
+  ok(aGrip.testOneActor.includes("testOne"),
+    "testOneActor's actorPrefix should be used.");
 
-  gClient.request({ to: aGrip.testTargetScopedActor1, type: "ping" }, aResponse => {
+  gClient.request({ to: aGrip.testOneActor, type: "ping" }, aResponse => {
     is(aResponse.pong, "pong",
       "Actor should respond to requests.");
 
     deferred.resolve();
   });
 
   return deferred.promise;
 }
--- a/devtools/client/debugger/test/mochitest/browser_dbg_target-scoped-actor-02.js
+++ b/devtools/client/debugger/test/mochitest/browser_dbg_target-scoped-actor-02.js
@@ -11,17 +11,21 @@ const ACTORS_URL = CHROME_URL + "testact
 const TAB_URL = EXAMPLE_URL + "doc_empty-tab-01.html";
 
 var gClient;
 
 function test() {
   DebuggerServer.init();
   DebuggerServer.registerAllActors();
 
-  DebuggerServer.addActors(ACTORS_URL);
+  DebuggerServer.registerModule(ACTORS_URL, {
+    prefix: "testOne",
+    constructor: "TestActor1",
+    type: { target: true },
+  });
 
   let transport = DebuggerServer.connectPipe();
   gClient = new DebuggerClient(transport);
   gClient.connect().then(([aType, aTraits]) => {
     is(aType, "browser",
       "Root actor should identify itself as a browser.");
 
     addTab(TAB_URL)
@@ -34,22 +38,22 @@ function test() {
         ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
       });
   });
 }
 
 function testTargetScopedActor([aGrip, aResponse]) {
   let deferred = promise.defer();
 
-  ok(aGrip.testTargetScopedActor1,
+  ok(aGrip.testOneActor,
     "Found the test target-scoped actor.");
-  ok(aGrip.testTargetScopedActor1.includes("test_one"),
-    "testTargetScopedActor1's actorPrefix should be used.");
+  ok(aGrip.testOneActor.includes("testOne"),
+    "testOneActor's actorPrefix should be used.");
 
-  gClient.request({ to: aGrip.testTargetScopedActor1, type: "ping" }, aResponse => {
+  gClient.request({ to: aGrip.testOneActor, type: "ping" }, aResponse => {
     is(aResponse.pong, "pong",
       "Actor should respond to requests.");
 
     deferred.resolve(aResponse.actor);
   });
 
   return deferred.promise;
 }
@@ -59,17 +63,17 @@ function closeTab(aTestActor) {
     let deferred = promise.defer();
 
     try {
       gClient.request({ to: aTestActor, type: "ping" }, aResponse => {
         ok(false, "testTargetScopedActor1 didn't go away with the tab.");
         deferred.reject(aResponse);
       });
     } catch (e) {
-      is(e.message, "'ping' request packet has no destination.", "testTargetScopedActor1 went away.");
+      is(e.message, "'ping' request packet has no destination.", "testOnActor went away.");
       deferred.resolve();
     }
 
     return deferred.promise;
   });
 }
 
 registerCleanupFunction(function () {
--- a/devtools/client/debugger/test/mochitest/testactors.js
+++ b/devtools/client/debugger/test/mochitest/testactors.js
@@ -4,35 +4,24 @@
 "use strict";
 
 function TestActor1(aConnection, aTab) {
   this.conn = aConnection;
   this.tab = aTab;
 }
 
 TestActor1.prototype = {
-  actorPrefix: "test_one",
+  actorPrefix: "testOne",
 
   grip: function TA1_grip() {
     return { actor: this.actorID,
              test: "TestActor1" };
   },
 
   onPing: function TA1_onPing() {
     return { pong: "pong" };
   }
 };
 
 TestActor1.prototype.requestTypes = {
   "ping": TestActor1.prototype.onPing
 };
-
-DebuggerServer.removeTargetScopedActor("testTargetScopedActor1");
-DebuggerServer.removeGlobalActor("testGlobalActor1");
-
-DebuggerServer.addTargetScopedActor({
-  constructorName: "TestActor1",
-  constructorFun: TestActor1,
-}, "testTargetScopedActor1");
-DebuggerServer.addGlobalActor({
-  constructorName: "TestActor1",
-  constructorFun: TestActor1,
-}, "testGlobalActor1");
+exports.TestActor1 = TestActor1;
--- a/devtools/server/main.js
+++ b/devtools/server/main.js
@@ -24,41 +24,19 @@ loader.lazyRequireGetter(this, "MainThre
 
 loader.lazyGetter(this, "generateUUID", () => {
   // eslint-disable-next-line no-shadow
   const { generateUUID } = Cc["@mozilla.org/uuid-generator;1"]
                            .getService(Ci.nsIUUIDGenerator);
   return generateUUID;
 });
 
-// Overload `Components` to prevent DevTools loader exception on Components
-// object usage
-// eslint-disable-next-line no-unused-vars
-Object.defineProperty(this, "Components", {
-  get() {
-    return require("chrome").components;
-  }
-});
-
 const CONTENT_PROCESS_SERVER_STARTUP_SCRIPT =
   "resource://devtools/server/startup/content-process.js";
 
-function loadSubScript(url) {
-  try {
-    Services.scriptloader.loadSubScript(url, this);
-  } catch (e) {
-    const errorStr = "Error loading: " + url + ":\n" +
-                   (e.fileName ? "at " + e.fileName + " : " + e.lineNumber + "\n" : "") +
-                   e + " - " + e.stack + "\n";
-    dump(errorStr);
-    reportError(errorStr);
-    throw e;
-  }
-}
-
 loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/event-emitter");
 
 var gRegisteredModules = Object.create(null);
 
 /**
  * Public API
  */
 var DebuggerServer = {
@@ -151,17 +129,17 @@ var DebuggerServer = {
    * Raises an exception if the server has not been properly initialized.
    */
   _checkInit() {
     if (!this._initialized) {
       throw new Error("DebuggerServer has not been initialized.");
     }
 
     if (!this.rootlessServer && !this.createRootActor) {
-      throw new Error("Use DebuggerServer.addActors() to add a root actor " +
+      throw new Error("Use DebuggerServer.setRootActor() to add a root actor " +
                       "implementation.");
     }
   },
 
   /**
    * Register different type of actors. Only register the one that are not already
    * registered.
    *
@@ -193,28 +171,16 @@ var DebuggerServer = {
   /**
    * Register all possible actors for this DebuggerServer.
    */
   registerAllActors() {
     this.registerActors({ root: true, browser: true, target: true });
   },
 
   /**
-   * Load a subscript into the debugging global.
-   *
-   * @param url string A url that will be loaded as a subscript into the
-   *        debugging global.  The user must load at least one script
-   *        that implements a createRootActor() function to create the
-   *        server's root actor.
-   */
-  addActors(url) {
-    loadSubScript.call(this, url);
-  },
-
-  /**
    * Register a CommonJS module with the debugger server.
    * @param id string
    *        The ID of a CommonJS module.
    *        The actor is going to be registered immediately, but loaded only
    *        when a client starts sending packets to an actor with the same id.
    *
    * @param options object
    *        An object with 3 mandatory attributes:
@@ -1339,25 +1305,16 @@ if (this.exports) {
   exports.OriginalLocation = OriginalLocation;
 }
 
 // Needed on B2G (See header note)
 this.DebuggerServer = DebuggerServer;
 this.ActorPool = ActorPool;
 this.OriginalLocation = OriginalLocation;
 
-// When using DebuggerServer.addActors, some symbols are expected to be in
-// the scope of the added actor even before the corresponding modules are
-// loaded, so let's explicitly bind the expected symbols here.
-var includes = ["Components", "Ci", "Cu", "require", "Services", "DebuggerServer",
-                "ActorPool", "DevToolsUtils"];
-includes.forEach(name => {
-  DebuggerServer[name] = this[name];
-});
-
 /**
  * Creates a DebuggerServerConnection.
  *
  * Represents a connection to this debugging global from a client.
  * Manages a set of actors and actor pools, allocates actor ids, and
  * handles incoming requests.
  *
  * @param prefix string
--- a/devtools/server/startup/frame.js
+++ b/devtools/server/startup/frame.js
@@ -16,17 +16,18 @@ try {
   var chromeGlobal = this;
 
   // Encapsulate in its own scope to allows loading this frame script more than once.
   (function() {
     const { require } = ChromeUtils.import("resource://devtools/shared/Loader.jsm", {});
 
     const DevToolsUtils = require("devtools/shared/DevToolsUtils");
     const { dumpn } = DevToolsUtils;
-    const { DebuggerServer, ActorPool } = require("devtools/server/main");
+    const { DebuggerServer } = require("devtools/server/main");
+    const { ActorPool } = require("devtools/server/actors/common");
 
     DebuggerServer.init();
     // We want a special server without any root actor and only target-scoped actors.
     // We are going to spawn a FrameTargetActor instance in the next few lines,
     // it is going to act like a root actor without being one.
     DebuggerServer.registerActors({ target: true });
 
     const connections = new Map();
--- a/devtools/server/tests/browser/browser_actor_error.js
+++ b/devtools/server/tests/browser/browser_actor_error.js
@@ -11,17 +11,21 @@
 
 const ACTORS_URL =
   "chrome://mochitests/content/browser/devtools/server/tests/browser/error-actor.js";
 
 async function test() {
   DebuggerServer.init();
   DebuggerServer.registerAllActors();
 
-  DebuggerServer.addActors(ACTORS_URL);
+  DebuggerServer.registerModule(ACTORS_URL, {
+    prefix: "error",
+    constructor: "ErrorActor",
+    type: { global: true },
+  });
 
   const transport = DebuggerServer.connectPipe();
   const gClient = new DebuggerClient(transport);
   await gClient.connect();
 
   const { errorActor } = await gClient.listTabs();
   ok(errorActor, "Found the error actor.");
 
--- a/devtools/server/tests/browser/error-actor.js
+++ b/devtools/server/tests/browser/error-actor.js
@@ -22,14 +22,9 @@ ErrorActor.prototype = {
   onError: function() {
     throw new Error("error");
   }
 };
 
 ErrorActor.prototype.requestTypes = {
   "error": ErrorActor.prototype.onError
 };
-
-DebuggerServer.removeGlobalActor("errorActor");
-DebuggerServer.addGlobalActor({
-  constructorName: "ErrorActor",
-  constructorFun: ErrorActor,
-}, "errorActor");
+exports.ErrorActor = ErrorActor;
--- a/devtools/server/tests/unit/post_init_global_actors.js
+++ b/devtools/server/tests/unit/post_init_global_actors.js
@@ -13,13 +13,9 @@ PostInitGlobalActor.prototype = {
   onPing(request) {
     return { message: "pong" };
   },
 };
 
 PostInitGlobalActor.prototype.requestTypes = {
   "ping": PostInitGlobalActor.prototype.onPing,
 };
-
-DebuggerServer.addGlobalActor({
-  constructorName: "PostInitGlobalActor",
-  constructorFun: PostInitGlobalActor,
-}, "postInitGlobalActor");
+exports.PostInitGlobalActor = PostInitGlobalActor;
--- a/devtools/server/tests/unit/post_init_target_scoped_actors.js
+++ b/devtools/server/tests/unit/post_init_target_scoped_actors.js
@@ -4,22 +4,18 @@
 "use strict";
 
 // Uses the same scope as test_add_actors.js
 /* import-globals-from head_dbg.js */
 
 function PostInitTargetScopedActor(connection) {}
 
 PostInitTargetScopedActor.prototype = {
-  actorPostfix: "postInitTab",
+  actorPostfix: "postInitTargetScoped",
   onPing(request) {
     return { message: "pong" };
   },
 };
 
 PostInitTargetScopedActor.prototype.requestTypes = {
   "ping": PostInitTargetScopedActor.prototype.onPing,
 };
-
-DebuggerServer.addTargetScopedActor({
-  constructorName: "PostInitTargetScopedActor",
-  constructorFun: PostInitTargetScopedActor,
-}, "postInitTargetScopedActor");
+exports.PostInitTargetScopedActor = PostInitTargetScopedActor;
--- a/devtools/server/tests/unit/pre_init_global_actors.js
+++ b/devtools/server/tests/unit/pre_init_global_actors.js
@@ -13,13 +13,9 @@ PreInitGlobalActor.prototype = {
   onPing(request) {
     return { message: "pong" };
   },
 };
 
 PreInitGlobalActor.prototype.requestTypes = {
   "ping": PreInitGlobalActor.prototype.onPing,
 };
-
-DebuggerServer.addGlobalActor({
-  constructorName: "PreInitGlobalActor",
-  constructorFun: PreInitGlobalActor,
-}, "preInitGlobalActor");
+exports.PreInitGlobalActor = PreInitGlobalActor;
--- a/devtools/server/tests/unit/pre_init_target_scoped_actors.js
+++ b/devtools/server/tests/unit/pre_init_target_scoped_actors.js
@@ -4,22 +4,18 @@
 "use strict";
 
 // Uses the same scope as test_add_actors.js
 /* import-globals-from head_dbg.js */
 
 function PreInitTargetScopedActor(connection) {}
 
 PreInitTargetScopedActor.prototype = {
-  actorPrefix: "preInitTab",
+  actorPrefix: "preInitTargetScoped",
   onPing(request) {
     return { message: "pong" };
   },
 };
 
 PreInitTargetScopedActor.prototype.requestTypes = {
   "ping": PreInitTargetScopedActor.prototype.onPing,
 };
-
-DebuggerServer.addTargetScopedActor({
-  constructorName: "PreInitTargetScopedActor",
-  constructorFun: PreInitTargetScopedActor,
-}, "preInitTargetScopedActor");
+exports.PreInitTargetScopedActor = PreInitTargetScopedActor;
--- a/devtools/server/tests/unit/test_add_actors.js
+++ b/devtools/server/tests/unit/test_add_actors.js
@@ -11,23 +11,39 @@ function getActorInstance(connID, actorI
 /**
  * The purpose of these tests is to verify that it's possible to add actors
  * both before and after the DebuggerServer has been initialized, so addons
  * that add actors don't have to poll the object for its initialization state
  * in order to add actors after initialization but rather can add actors anytime
  * regardless of the object's state.
  */
 add_task(async function() {
-  DebuggerServer.addActors("resource://test/pre_init_global_actors.js");
-  DebuggerServer.addActors("resource://test/pre_init_target_scoped_actors.js");
+  DebuggerServer.registerModule("resource://test/pre_init_global_actors.js", {
+    prefix: "preInitGlobal",
+    constructor: "PreInitGlobalActor",
+    type: { global: true },
+  });
+  DebuggerServer.registerModule("resource://test/pre_init_target_scoped_actors.js", {
+    prefix: "preInitTargetScoped",
+    constructor: "PreInitTargetScopedActor",
+    type: { target: true },
+  });
 
   const client = await startTestDebuggerServer("example tab");
 
-  DebuggerServer.addActors("resource://test/post_init_global_actors.js");
-  DebuggerServer.addActors("resource://test/post_init_target_scoped_actors.js");
+  DebuggerServer.registerModule("resource://test/post_init_global_actors.js", {
+    prefix: "postInitGlobal",
+    constructor: "PostInitGlobalActor",
+    type: { global: true },
+  });
+  DebuggerServer.registerModule("resource://test/post_init_target_scoped_actors.js", {
+    prefix: "postInitTargetScoped",
+    constructor: "PostInitTargetScopedActor",
+    type: { target: true },
+  });
 
   let actors = await client.listTabs();
   Assert.equal(actors.tabs.length, 1);
 
   let reply = await client.request({
     to: actors.preInitGlobalActor,
     type: "ping",
   });
--- a/testing/xpcshell/dbg-actors.js
+++ b/testing/xpcshell/dbg-actors.js
@@ -1,24 +1,20 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+/* globals require, exports */
+
 "use strict";
 
-/* import-globals-from ../../devtools/server/main.js */
-/* eslint "mozilla/use-chromeutils-import": ["error", {allowCu: true}] */
-
-// eslint-disable-next-line mozilla/no-define-cc-etc
-const Cu = Components.utils; // eslint-disable-line mozilla/use-cc-etc
-const { Promise } = Cu.import("resource://gre/modules/Promise.jsm", {});
-var { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
-const { devtools } = Cu.import("resource://devtools/shared/Loader.jsm", {});
-const { RootActor } = devtools.require("devtools/server/actors/root");
-const { BrowserTabList } = devtools.require("devtools/server/actors/webbrowser");
+const DebuggerServer = require("devtools/server/main");
+const { RootActor } = require("devtools/server/actors/root");
+const { BrowserTabList } = require("devtools/server/actors/webbrowser");
+const Services = require("Services");
 
 /**
  * xpcshell-test (XPCST) specific actors.
  *
  */
 
 /**
  * Construct a root actor appropriate for use in a server running xpcshell
@@ -31,16 +27,17 @@ function createRootActor(connection) {
     onShutdown() {
       // If the user never switches to the "debugger" tab we might get a
       // shutdown before we've attached.
       Services.obs.notifyObservers(null, "xpcshell-test-devtools-shutdown");
     }
   };
   return new RootActor(connection, parameters);
 }
+exports.createRootActor = createRootActor;
 
 /**
  * A "stub" TabList implementation that provides no tabs.
  */
 
 function XPCSTTabList(connection) {
   BrowserTabList.call(this, connection);
 }
--- a/testing/xpcshell/head.js
+++ b/testing/xpcshell/head.js
@@ -390,17 +390,18 @@ function _setupDebuggerServer(breakpoint
                     "triggering additional browser code to run, so check " +
                     "test behavior after making this change.\n" +
                     "See also https://bugzil.la/1215378.");
   }
   let { DebuggerServer } = require("devtools/server/main");
   let { OriginalLocation } = require("devtools/server/actors/common");
   DebuggerServer.init();
   DebuggerServer.registerAllActors();
-  DebuggerServer.addActors("resource://testing-common/dbg-actors.js");
+  let { createRootActor } = require("resource://testing-common/dbg-actors.js");
+  DebuggerServer.setRootActor(createRootActor);
   DebuggerServer.allowChromeProcess = true;
 
   // An observer notification that tells us when we can "resume" script
   // execution.
   const TOPICS = ["devtools-thread-resumed", "xpcshell-test-devtools-shutdown"];
   let observe = function(subject, topic, data) {
     switch (topic) {
       case "devtools-thread-resumed":