@@ -489,7 +489,7 @@ index 6dca2b78830edc1ddbd66264bd332853729dac71..fbe89c9682834e11b9d9219d9eb056ed
489
489
490
490
diff --git a/testing/juggler/BrowserContextManager.js b/testing/juggler/BrowserContextManager.js
491
491
new file mode 100644
492
- index 0000000000000000000000000000000000000000..483667dbec8e4c76533e4cf5e69ca9e322f2e708
492
+ index 0000000000000000000000000000000000000000..dfb1f50b3a6ad915b99481c987975cb99c268ed7
493
493
--- /dev/null
494
494
+++ b/testing/juggler/BrowserContextManager.js
495
495
@@ -0,0 +1,194 @@
@@ -593,7 +593,7 @@ index 0000000000000000000000000000000000000000..483667dbec8e4c76533e4cf5e69ca9e3
593
593
+ this._principals.push(principal);
594
594
+ for (const permission of ALL_PERMISSIONS) {
595
595
+ const action = permissions.includes(permission) ? Ci.nsIPermissionManager.ALLOW_ACTION : Ci.nsIPermissionManager.DENY_ACTION;
596
- + Services.perms.addFromPrincipal(principal, permission, action);
596
+ + Services.perms.addFromPrincipal(principal, permission, action, Ci.nsIPermissionManager.EXPIRE_NEVER, 0 /* expireTime */ );
597
597
+ }
598
598
+ }
599
599
+
@@ -1628,10 +1628,10 @@ index 0000000000000000000000000000000000000000..ba34976ad05e7f5f1a99777f76ac08b1
1628
1628
+ this.SimpleChannel = SimpleChannel;
1629
1629
diff --git a/testing/juggler/TargetRegistry.js b/testing/juggler/TargetRegistry.js
1630
1630
new file mode 100644
1631
- index 0000000000000000000000000000000000000000..2cb5f24b079289f00d84d0d7b266443635edd2b2
1631
+ index 0000000000000000000000000000000000000000..1bcbafed549090fe533fb1340b2598e5962b855d
1632
1632
--- /dev/null
1633
1633
+++ b/testing/juggler/TargetRegistry.js
1634
- @@ -0,0 +1,257 @@
1634
+ @@ -0,0 +1,264 @@
1635
1635
+ const {EventEmitter} = ChromeUtils.import('resource://gre/modules/EventEmitter.jsm');
1636
1636
+ const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
1637
1637
+ const {SimpleChannel} = ChromeUtils.import('chrome://juggler/content/SimpleChannel.js');
@@ -1689,6 +1689,13 @@ index 0000000000000000000000000000000000000000..2cb5f24b079289f00d84d0d7b2664436
1689
1689
+ Services.obs.addObserver(this, 'oop-frameloader-crashed');
1690
1690
+ }
1691
1691
+
1692
+ + async ensurePermissionsInContextPages(browserContextId, permissions) {
1693
+ + const browserContext = this._contextManager.browserContextForId(browserContextId);
1694
+ + const pageTargets = [...this._targets.values()].filter(target => target instanceof PageTarget);
1695
+ + const contextPages = pageTargets.filter(target => target._browserContext === browserContext);
1696
+ + await Promise.all(contextPages.map(page => page._channel.connect('').send('ensurePermissions', permissions).catch(e => void e)));
1697
+ + }
1698
+ +
1692
1699
+ async newPage({browserContextId}) {
1693
1700
+ const browserContext = this._contextManager.browserContextForId(browserContextId);
1694
1701
+ const tab = this._mainWindow.gBrowser.addTab('about:blank', {
@@ -4166,10 +4173,11 @@ index 0000000000000000000000000000000000000000..3a386425d3796d0a6786dea193b3402d
4166
4173
+
4167
4174
diff --git a/testing/juggler/content/main.js b/testing/juggler/content/main.js
4168
4175
new file mode 100644
4169
- index 0000000000000000000000000000000000000000..887180f71ef78604d2756ffa6a026ac968bda276
4176
+ index 0000000000000000000000000000000000000000..212f1c1a218efebe8685b019e79fb553db720453
4170
4177
--- /dev/null
4171
4178
+++ b/testing/juggler/content/main.js
4172
- @@ -0,0 +1,96 @@
4179
+ @@ -0,0 +1,129 @@
4180
+ + const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
4173
4181
+ const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
4174
4182
+ const {FrameTree} = ChromeUtils.import('chrome://juggler/content/content/FrameTree.js');
4175
4183
+ const {NetworkMonitor} = ChromeUtils.import('chrome://juggler/content/content/NetworkMonitor.js');
@@ -4178,6 +4186,13 @@ index 0000000000000000000000000000000000000000..887180f71ef78604d2756ffa6a026ac9
4178
4186
+ const {RuntimeAgent} = ChromeUtils.import('chrome://juggler/content/content/RuntimeAgent.js');
4179
4187
+ const {PageAgent} = ChromeUtils.import('chrome://juggler/content/content/PageAgent.js');
4180
4188
+
4189
+ + const ALL_PERMISSIONS = [
4190
+ + 'geo',
4191
+ + 'microphone',
4192
+ + 'camera',
4193
+ + 'desktop-notifications',
4194
+ + ];
4195
+ +
4181
4196
+ const scrollbarManager = new ScrollbarManager(docShell);
4182
4197
+ let frameTree;
4183
4198
+ let networkMonitor;
@@ -4246,6 +4261,31 @@ index 0000000000000000000000000000000000000000..887180f71ef78604d2756ffa6a026ac9
4246
4261
+ frameTree.addScriptToEvaluateOnNewDocument(script);
4247
4262
+ },
4248
4263
+
4264
+ + async ensurePermissions(permissions) {
4265
+ + const checkPermissions = () => {
4266
+ + for (const permission of ALL_PERMISSIONS) {
4267
+ + const actual = Services.perms.testExactPermissionFromPrincipal(this._docShell.domWindow.document.nodePrincipal, permission);
4268
+ + const expected = permissions.include(permission) ? Ci.nsIPermissionManager.ALLOW_ACTION : Ci.nsIPermissionManager.DENY_ACTION;
4269
+ + if (actual !== expected)
4270
+ + return false;
4271
+ + }
4272
+ + return true;
4273
+ + }
4274
+ +
4275
+ + if (checkPermissions())
4276
+ + return;
4277
+ +
4278
+ + // Track all 'perm-changed' events and wait until permissions are expected.
4279
+ + await new Promise(resolve => {
4280
+ + const listeners = [helper.addObserver(() => {
4281
+ + if (!checkPermission())
4282
+ + return;
4283
+ + helper.removeListeners(listeners);
4284
+ + resolve();
4285
+ + }, 'perm-changed')];
4286
+ + });
4287
+ + },
4288
+ +
4249
4289
+ dispose() {
4250
4290
+ },
4251
4291
+ });
@@ -4348,17 +4388,18 @@ index 0000000000000000000000000000000000000000..2f2b7ca247f6b6dff396fb4b644654de
4348
4388
+ this.AccessibilityHandler = AccessibilityHandler;
4349
4389
diff --git a/testing/juggler/protocol/BrowserHandler.js b/testing/juggler/protocol/BrowserHandler.js
4350
4390
new file mode 100644
4351
- index 0000000000000000000000000000000000000000..061bcb4ff8a34610a5ec433393bf7901c4cafe86
4391
+ index 0000000000000000000000000000000000000000..c34d0852b2e5b550d063f93e29429c651ec2501e
4352
4392
--- /dev/null
4353
4393
+++ b/testing/juggler/protocol/BrowserHandler.js
4354
- @@ -0,0 +1,81 @@
4394
+ @@ -0,0 +1,84 @@
4355
4395
+ "use strict";
4356
4396
+
4357
4397
+ const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
4358
4398
+ const { allowAllCerts } = ChromeUtils.import(
4359
4399
+ "chrome://marionette/content/cert.js"
4360
4400
+ );
4361
4401
+ const {BrowserContextManager} = ChromeUtils.import("chrome://juggler/content/BrowserContextManager.js");
4402
+ + const {TargetRegistry} = ChromeUtils.import("chrome://juggler/content/TargetRegistry.js");
4362
4403
+
4363
4404
+ class BrowserHandler {
4364
4405
+ /**
@@ -4367,6 +4408,7 @@ index 0000000000000000000000000000000000000000..061bcb4ff8a34610a5ec433393bf7901
4367
4408
+ constructor() {
4368
4409
+ this._sweepingOverride = null;
4369
4410
+ this._contextManager = BrowserContextManager.instance();
4411
+ + this._targetRegistry = TargetRegistry.instance();
4370
4412
+ }
4371
4413
+
4372
4414
+ async close() {
@@ -4389,8 +4431,9 @@ index 0000000000000000000000000000000000000000..061bcb4ff8a34610a5ec433393bf7901
4389
4431
+ }
4390
4432
+ }
4391
4433
+
4392
- + grantPermissions({browserContextId, origin, permissions}) {
4434
+ + async grantPermissions({browserContextId, origin, permissions}) {
4393
4435
+ this._contextManager.browserContextForId(browserContextId).grantPermissions(origin, permissions);
4436
+ + await this._targetRegistry.ensurePermissionsInContextPages(browserContextId, permissions);
4394
4437
+ }
4395
4438
+
4396
4439
+ resetPermissions({browserContextId}) {
0 commit comments