summaryrefslogtreecommitdiffstats
path: root/devtools/client/shared/test/test-actor-registry.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/shared/test/test-actor-registry.js')
-rw-r--r--devtools/client/shared/test/test-actor-registry.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/devtools/client/shared/test/test-actor-registry.js b/devtools/client/shared/test/test-actor-registry.js
new file mode 100644
index 000000000..e3b47c154
--- /dev/null
+++ b/devtools/client/shared/test/test-actor-registry.js
@@ -0,0 +1,97 @@
+/* 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/. */
+"use strict";
+
+(function (exports) {
+ const Cu = Components.utils;
+ const CC = Components.Constructor;
+
+ const { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
+ const { fetch } = require("devtools/shared/DevToolsUtils");
+ const defer = require("devtools/shared/defer");
+ const { Task } = require("devtools/shared/task");
+
+ const TEST_URL_ROOT = "http://example.com/browser/devtools/client/shared/test/";
+ const ACTOR_URL = TEST_URL_ROOT + "test-actor.js";
+
+ // Register a test actor that can operate on the remote document
+ exports.registerTestActor = Task.async(function* (client) {
+ // First, instanciate ActorRegistryFront to be able to dynamically register an actor
+ let deferred = defer();
+ client.listTabs(deferred.resolve);
+ let response = yield deferred.promise;
+ let { ActorRegistryFront } = require("devtools/shared/fronts/actor-registry");
+ let registryFront = ActorRegistryFront(client, response);
+
+ // Then ask to register our test-actor to retrieve its front
+ let options = {
+ type: { tab: true },
+ constructor: "TestActor",
+ prefix: "testActor"
+ };
+ let testActorFront = yield registryFront.registerActor(ACTOR_URL, options);
+ return testActorFront;
+ });
+
+ // Load the test actor in a custom sandbox as we can't use SDK module loader with URIs
+ let loadFront = Task.async(function* () {
+ let sourceText = yield request(ACTOR_URL);
+ const principal = CC("@mozilla.org/systemprincipal;1", "nsIPrincipal")();
+ const sandbox = Cu.Sandbox(principal);
+ sandbox.exports = {};
+ sandbox.require = require;
+ Cu.evalInSandbox(sourceText, sandbox, "1.8", ACTOR_URL, 1);
+ return sandbox.exports;
+ });
+
+ // Ensure fetching a live TabActor form for the targeted app
+ // (helps fetching the test actor registered dynamically)
+ let getUpdatedForm = function (client, tab) {
+ return client.getTab({tab: tab})
+ .then(response => response.tab);
+ };
+
+ // Spawn an instance of the test actor for the given toolbox
+ exports.getTestActor = Task.async(function* (toolbox) {
+ let client = toolbox.target.client;
+ return getTestActor(client, toolbox.target.tab, toolbox);
+ });
+
+ // Sometimes, we need the test actor before opening or without a toolbox then just
+ // create a front for the given `tab`
+ exports.getTestActorWithoutToolbox = Task.async(function* (tab) {
+ let { DebuggerServer } = require("devtools/server/main");
+ let { DebuggerClient } = require("devtools/shared/client/main");
+
+ // We need to spawn a client instance,
+ // but for that we have to first ensure a server is running
+ if (!DebuggerServer.initialized) {
+ DebuggerServer.init();
+ DebuggerServer.addBrowserActors();
+ }
+ let client = new DebuggerClient(DebuggerServer.connectPipe());
+
+ yield client.connect();
+
+ // We also need to make sure the test actor is registered on the server.
+ yield exports.registerTestActor(client);
+
+ return getTestActor(client, tab);
+ });
+
+ // Fetch the content of a URI
+ let request = function (uri) {
+ return fetch(uri).then(({ content }) => content);
+ };
+
+ let getTestActor = Task.async(function* (client, tab, toolbox) {
+ // We may have to update the form in order to get the dynamically registered
+ // test actor.
+ let form = yield getUpdatedForm(client, tab);
+
+ let { TestActorFront } = yield loadFront();
+
+ return new TestActorFront(client, form, toolbox);
+ });
+})(this);