Skip to content

Commit b0d037e

Browse files
authored
browser(firefox): fix flaky permissions in Firefox (#1249)
Review URL: aslushnikov/juggler@9bd6e72 Wait for permissions to propagate to all context pages. References #720
1 parent cd8714d commit b0d037e

File tree

2 files changed

+53
-10
lines changed

2 files changed

+53
-10
lines changed

browser_patches/firefox/BUILD_NUMBER

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1036
1+
1037

browser_patches/firefox/patches/bootstrap.diff

+52-9
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ index 6dca2b78830edc1ddbd66264bd332853729dac71..fbe89c9682834e11b9d9219d9eb056ed
489489

490490
diff --git a/testing/juggler/BrowserContextManager.js b/testing/juggler/BrowserContextManager.js
491491
new file mode 100644
492-
index 0000000000000000000000000000000000000000..483667dbec8e4c76533e4cf5e69ca9e322f2e708
492+
index 0000000000000000000000000000000000000000..dfb1f50b3a6ad915b99481c987975cb99c268ed7
493493
--- /dev/null
494494
+++ b/testing/juggler/BrowserContextManager.js
495495
@@ -0,0 +1,194 @@
@@ -593,7 +593,7 @@ index 0000000000000000000000000000000000000000..483667dbec8e4c76533e4cf5e69ca9e3
593593
+ this._principals.push(principal);
594594
+ for (const permission of ALL_PERMISSIONS) {
595595
+ 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 */);
597597
+ }
598598
+ }
599599
+
@@ -1628,10 +1628,10 @@ index 0000000000000000000000000000000000000000..ba34976ad05e7f5f1a99777f76ac08b1
16281628
+this.SimpleChannel = SimpleChannel;
16291629
diff --git a/testing/juggler/TargetRegistry.js b/testing/juggler/TargetRegistry.js
16301630
new file mode 100644
1631-
index 0000000000000000000000000000000000000000..2cb5f24b079289f00d84d0d7b266443635edd2b2
1631+
index 0000000000000000000000000000000000000000..1bcbafed549090fe533fb1340b2598e5962b855d
16321632
--- /dev/null
16331633
+++ b/testing/juggler/TargetRegistry.js
1634-
@@ -0,0 +1,257 @@
1634+
@@ -0,0 +1,264 @@
16351635
+const {EventEmitter} = ChromeUtils.import('resource://gre/modules/EventEmitter.jsm');
16361636
+const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
16371637
+const {SimpleChannel} = ChromeUtils.import('chrome://juggler/content/SimpleChannel.js');
@@ -1689,6 +1689,13 @@ index 0000000000000000000000000000000000000000..2cb5f24b079289f00d84d0d7b2664436
16891689
+ Services.obs.addObserver(this, 'oop-frameloader-crashed');
16901690
+ }
16911691
+
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+
+
16921699
+ async newPage({browserContextId}) {
16931700
+ const browserContext = this._contextManager.browserContextForId(browserContextId);
16941701
+ const tab = this._mainWindow.gBrowser.addTab('about:blank', {
@@ -4166,10 +4173,11 @@ index 0000000000000000000000000000000000000000..3a386425d3796d0a6786dea193b3402d
41664173
+
41674174
diff --git a/testing/juggler/content/main.js b/testing/juggler/content/main.js
41684175
new file mode 100644
4169-
index 0000000000000000000000000000000000000000..887180f71ef78604d2756ffa6a026ac968bda276
4176+
index 0000000000000000000000000000000000000000..212f1c1a218efebe8685b019e79fb553db720453
41704177
--- /dev/null
41714178
+++ 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");
41734181
+const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
41744182
+const {FrameTree} = ChromeUtils.import('chrome://juggler/content/content/FrameTree.js');
41754183
+const {NetworkMonitor} = ChromeUtils.import('chrome://juggler/content/content/NetworkMonitor.js');
@@ -4178,6 +4186,13 @@ index 0000000000000000000000000000000000000000..887180f71ef78604d2756ffa6a026ac9
41784186
+const {RuntimeAgent} = ChromeUtils.import('chrome://juggler/content/content/RuntimeAgent.js');
41794187
+const {PageAgent} = ChromeUtils.import('chrome://juggler/content/content/PageAgent.js');
41804188
+
4189+
+const ALL_PERMISSIONS = [
4190+
+ 'geo',
4191+
+ 'microphone',
4192+
+ 'camera',
4193+
+ 'desktop-notifications',
4194+
+];
4195+
+
41814196
+const scrollbarManager = new ScrollbarManager(docShell);
41824197
+let frameTree;
41834198
+let networkMonitor;
@@ -4246,6 +4261,31 @@ index 0000000000000000000000000000000000000000..887180f71ef78604d2756ffa6a026ac9
42464261
+ frameTree.addScriptToEvaluateOnNewDocument(script);
42474262
+ },
42484263
+
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+
+
42494289
+ dispose() {
42504290
+ },
42514291
+ });
@@ -4348,17 +4388,18 @@ index 0000000000000000000000000000000000000000..2f2b7ca247f6b6dff396fb4b644654de
43484388
+this.AccessibilityHandler = AccessibilityHandler;
43494389
diff --git a/testing/juggler/protocol/BrowserHandler.js b/testing/juggler/protocol/BrowserHandler.js
43504390
new file mode 100644
4351-
index 0000000000000000000000000000000000000000..061bcb4ff8a34610a5ec433393bf7901c4cafe86
4391+
index 0000000000000000000000000000000000000000..c34d0852b2e5b550d063f93e29429c651ec2501e
43524392
--- /dev/null
43534393
+++ b/testing/juggler/protocol/BrowserHandler.js
4354-
@@ -0,0 +1,81 @@
4394+
@@ -0,0 +1,84 @@
43554395
+"use strict";
43564396
+
43574397
+const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
43584398
+const { allowAllCerts } = ChromeUtils.import(
43594399
+ "chrome://marionette/content/cert.js"
43604400
+);
43614401
+const {BrowserContextManager} = ChromeUtils.import("chrome://juggler/content/BrowserContextManager.js");
4402+
+const {TargetRegistry} = ChromeUtils.import("chrome://juggler/content/TargetRegistry.js");
43624403
+
43634404
+class BrowserHandler {
43644405
+ /**
@@ -4367,6 +4408,7 @@ index 0000000000000000000000000000000000000000..061bcb4ff8a34610a5ec433393bf7901
43674408
+ constructor() {
43684409
+ this._sweepingOverride = null;
43694410
+ this._contextManager = BrowserContextManager.instance();
4411+
+ this._targetRegistry = TargetRegistry.instance();
43704412
+ }
43714413
+
43724414
+ async close() {
@@ -4389,8 +4431,9 @@ index 0000000000000000000000000000000000000000..061bcb4ff8a34610a5ec433393bf7901
43894431
+ }
43904432
+ }
43914433
+
4392-
+ grantPermissions({browserContextId, origin, permissions}) {
4434+
+ async grantPermissions({browserContextId, origin, permissions}) {
43934435
+ this._contextManager.browserContextForId(browserContextId).grantPermissions(origin, permissions);
4436+
+ await this._targetRegistry.ensurePermissionsInContextPages(browserContextId, permissions);
43944437
+ }
43954438
+
43964439
+ resetPermissions({browserContextId}) {

0 commit comments

Comments
 (0)