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 = {
|
||||
addTab() {
|
||||
addTab({ userContextId }) {
|
||||
const window = Services.wm.getMostRecentWindow("navigator:browser");
|
||||
const { gBrowser } = window;
|
||||
const tab = gBrowser.addTab("about:blank", {
|
||||
triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
|
||||
userContextId,
|
||||
});
|
||||
gBrowser.selectedTab = tab;
|
||||
return tab;
|
||||
|
|
|
|||
|
|
@ -9,8 +9,10 @@ var EXPORTED_SYMBOLS = ["Target"];
|
|||
const {Domain} = ChromeUtils.import("chrome://remote/content/domains/Domain.jsm");
|
||||
const {TabManager} = ChromeUtils.import("chrome://remote/content/WindowManager.jsm");
|
||||
const {TabSession} = ChromeUtils.import("chrome://remote/content/sessions/TabSession.jsm");
|
||||
const {ContextualIdentityService} = ChromeUtils.import("resource://gre/modules/ContextualIdentityService.jsm");
|
||||
|
||||
let sessionIds = 1;
|
||||
let browserContextIds = 1;
|
||||
|
||||
class Target extends Domain {
|
||||
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 }) {
|
||||
const { targets } = this.session.target;
|
||||
if (discover) {
|
||||
|
|
@ -43,7 +55,7 @@ class Target extends Domain {
|
|||
onTargetCreated(eventName, target) {
|
||||
this.emit("Target.targetCreated", {
|
||||
targetInfo: {
|
||||
browserContextId: target.id,
|
||||
browserContextId: target.browserContextId,
|
||||
targetId: target.id,
|
||||
type: target.type,
|
||||
url: target.url,
|
||||
|
|
@ -57,10 +69,10 @@ class Target extends Domain {
|
|||
});
|
||||
}
|
||||
|
||||
async createTarget() {
|
||||
async createTarget({ browserContextId }) {
|
||||
const { targets } = this.session.target;
|
||||
const onTarget = targets.once("connect");
|
||||
const tab = TabManager.addTab();
|
||||
const tab = TabManager.addTab({ userContextId: browserContextId });
|
||||
const target = await onTarget;
|
||||
if (tab.linkedBrowser != target.browser) {
|
||||
throw new Error("Unexpected tab opened: " + tab.linkedBrowser.currentURI.spec);
|
||||
|
|
|
|||
|
|
@ -45,6 +45,10 @@ class TabTarget extends Target {
|
|||
return this.browsingContext.id;
|
||||
}
|
||||
|
||||
get browserContextId() {
|
||||
return parseInt(this.browser.getAttribute("usercontextid"));
|
||||
}
|
||||
|
||||
get browsingContext() {
|
||||
return this.browser.browsingContext;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,4 +26,5 @@ skip-if = os == "mac" || (verify && os == 'win') # bug 1547961
|
|||
[browser_session.js]
|
||||
[browser_tabs.js]
|
||||
[browser_target.js]
|
||||
[browser_target_browserContext.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