Bug 1560301 - Implement very minimal support of browser context. r=remote-protocol-reviewers,ato

Differential Revision: https://phabricator.services.mozilla.com/D35427

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Alexandre Poirot 2019-07-02 12:40:58 +00:00
parent 3ac5afd32b
commit 6e45d0129a
5 changed files with 78 additions and 4 deletions

View file

@ -146,11 +146,12 @@ class TabObserver {
} }
var TabManager = { var TabManager = {
addTab() { addTab({ userContextId }) {
const window = Services.wm.getMostRecentWindow("navigator:browser"); const window = Services.wm.getMostRecentWindow("navigator:browser");
const { gBrowser } = window; const { gBrowser } = window;
const tab = gBrowser.addTab("about:blank", { const tab = gBrowser.addTab("about:blank", {
triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(), triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
userContextId,
}); });
gBrowser.selectedTab = tab; gBrowser.selectedTab = tab;
return tab; return tab;

View file

@ -9,8 +9,10 @@ var EXPORTED_SYMBOLS = ["Target"];
const {Domain} = ChromeUtils.import("chrome://remote/content/domains/Domain.jsm"); const {Domain} = ChromeUtils.import("chrome://remote/content/domains/Domain.jsm");
const {TabManager} = ChromeUtils.import("chrome://remote/content/WindowManager.jsm"); const {TabManager} = ChromeUtils.import("chrome://remote/content/WindowManager.jsm");
const {TabSession} = ChromeUtils.import("chrome://remote/content/sessions/TabSession.jsm"); const {TabSession} = ChromeUtils.import("chrome://remote/content/sessions/TabSession.jsm");
const {ContextualIdentityService} = ChromeUtils.import("resource://gre/modules/ContextualIdentityService.jsm");
let sessionIds = 1; let sessionIds = 1;
let browserContextIds = 1;
class Target extends Domain { class Target extends Domain {
constructor(session) { constructor(session) {
@ -26,6 +28,16 @@ class Target extends Domain {
}; };
} }
createBrowserContext() {
const identity = ContextualIdentityService.create("remote-agent-" + (browserContextIds++));
return { browserContextId: identity.userContextId };
}
disposeBrowserContext({ browserContextId }) {
ContextualIdentityService.remove(browserContextId);
ContextualIdentityService.closeContainerTabs(browserContextId);
}
setDiscoverTargets({ discover }) { setDiscoverTargets({ discover }) {
const { targets } = this.session.target; const { targets } = this.session.target;
if (discover) { if (discover) {
@ -43,7 +55,7 @@ class Target extends Domain {
onTargetCreated(eventName, target) { onTargetCreated(eventName, target) {
this.emit("Target.targetCreated", { this.emit("Target.targetCreated", {
targetInfo: { targetInfo: {
browserContextId: target.id, browserContextId: target.browserContextId,
targetId: target.id, targetId: target.id,
type: target.type, type: target.type,
url: target.url, url: target.url,
@ -57,10 +69,10 @@ class Target extends Domain {
}); });
} }
async createTarget() { async createTarget({ browserContextId }) {
const { targets } = this.session.target; const { targets } = this.session.target;
const onTarget = targets.once("connect"); const onTarget = targets.once("connect");
const tab = TabManager.addTab(); const tab = TabManager.addTab({ userContextId: browserContextId });
const target = await onTarget; const target = await onTarget;
if (tab.linkedBrowser != target.browser) { if (tab.linkedBrowser != target.browser) {
throw new Error("Unexpected tab opened: " + tab.linkedBrowser.currentURI.spec); throw new Error("Unexpected tab opened: " + tab.linkedBrowser.currentURI.spec);

View file

@ -45,6 +45,10 @@ class TabTarget extends Target {
return this.browsingContext.id; return this.browsingContext.id;
} }
get browserContextId() {
return parseInt(this.browser.getAttribute("usercontextid"));
}
get browsingContext() { get browsingContext() {
return this.browser.browsingContext; return this.browser.browsingContext;
} }

View file

@ -26,4 +26,5 @@ skip-if = os == "mac" || (verify && os == 'win') # bug 1547961
[browser_session.js] [browser_session.js]
[browser_tabs.js] [browser_tabs.js]
[browser_target.js] [browser_target.js]
[browser_target_browserContext.js]
[browser_target_close.js] [browser_target_close.js]

View file

@ -0,0 +1,56 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Test the Target domain
add_task(async function() {
// Start the CDP server
await RemoteAgent.listen(Services.io.newURI("http://localhost:9222"));
// Retrieve the chrome-remote-interface library object
const CDP = await getCDP();
// Connect to the server
const {webSocketDebuggerUrl} = await CDP.Version();
const client = await CDP({"target": webSocketDebuggerUrl});
ok(true, "CDP client has been instantiated");
const {Target} = client;
ok("Target" in client, "Target domain is available");
// Wait for all Target.targetCreated event. One for each tab, plus the one
// for the main process target.
const targetsCreated = new Promise(resolve => {
let targets = 0;
const unsubscribe = Target.targetCreated(event => {
if (++targets >= gBrowser.tabs.length + 1) {
unsubscribe();
resolve();
}
});
});
Target.setDiscoverTargets({ discover: true });
await targetsCreated;
const {browserContextId} = await Target.createBrowserContext();
const targetCreated = Target.targetCreated();
const {targetId} = await Target.createTarget({ browserContextId });
ok(true, `Target created: ${targetId}`);
ok(!!targetId, "createTarget returns a non-empty target id");
const {targetInfo} = await targetCreated;
is(targetId, targetInfo.targetId, "createTarget and targetCreated refers to the same target id");
is(browserContextId, targetInfo.browserContextId, "the created target is reported to be of the same browser context");
is(targetInfo.type, "page", "The target is a page");
// Releasing the browser context is going to remove the tab opened when calling createTarget
await Target.disposeBrowserContext({ browserContextId });
await client.close();
ok(true, "The client is closed");
await RemoteAgent.close();
});