forked from mirrors/gecko-dev
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:
parent
3ac5afd32b
commit
6e45d0129a
5 changed files with 78 additions and 4 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
56
remote/test/browser/browser_target_browserContext.js
Normal file
56
remote/test/browser/browser_target_browserContext.js
Normal 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();
|
||||||
|
});
|
||||||
Loading…
Reference in a new issue