Bug 1334842 - Fix intermittent browser_temporary_permissions.js. r=nhnt11 draft
authorJohann Hofmann <jhofmann@mozilla.com>
Wed, 29 Mar 2017 16:15:56 +0200
changeset 553692 24a440d295584636ae108e0fe88d73e22e150746
parent 552691 272ce6c2572164f5f6a9fba2a980ba9ccf50770c
child 622143 6da8e745bf884c06e24077d0c438c4bf3e759249
push id51722
push userbmo:jhofmann@mozilla.com
push dateThu, 30 Mar 2017 13:22:32 +0000
reviewersnhnt11
bugs1334842
milestone55.0a1
Bug 1334842 - Fix intermittent browser_temporary_permissions.js. r=nhnt11 This intermittent was likely occurring because we set the expiry timeout for temporary permissions to a really low value in the previous test. The failing test was only failing on slow machines, leading me to believe that the time between setting and checking was larger than the 500ms timeout defined in the previous test. Thus, the permission was reset on checking it. The expiry pref was set using pushPrefEnv, which restores prefs only after the entire test was run. To just eradicate this category of problems in the future I moved the test that manipulates the expiry into its own file. MozReview-Commit-ID: 3mc5xHY4XLn
browser/base/content/test/permissions/browser.ini
browser/base/content/test/permissions/browser_temporary_permissions.js
browser/base/content/test/permissions/browser_temporary_permissions_expiry.js
--- a/browser/base/content/test/permissions/browser.ini
+++ b/browser/base/content/test/permissions/browser.ini
@@ -1,14 +1,13 @@
 [DEFAULT]
 support-files=
   head.js
+  permissions.html
 
 [browser_permissions.js]
-support-files =
-  permissions.html
 [browser_temporary_permissions.js]
 support-files =
-  permissions.html
   temporary_permissions_subframe.html
   ../webrtc/get_user_media.html
+[browser_temporary_permissions_expiry.js]
 [browser_temporary_permissions_navigation.js]
 [browser_temporary_permissions_tabs.js]
--- a/browser/base/content/test/permissions/browser_temporary_permissions.js
+++ b/browser/base/content/test/permissions/browser_temporary_permissions.js
@@ -4,19 +4,16 @@
 "use strict";
 
 Cu.import("resource:///modules/E10SUtils.jsm");
 
 const ORIGIN = "https://example.com";
 const PERMISSIONS_PAGE = getRootDirectory(gTestPath).replace("chrome://mochitests/content", ORIGIN) + "permissions.html";
 const SUBFRAME_PAGE = getRootDirectory(gTestPath).replace("chrome://mochitests/content", ORIGIN) + "temporary_permissions_subframe.html";
 
-const EXPIRE_TIME_MS = 100;
-const TIMEOUT_MS = 500;
-
 // Test that setting temp permissions triggers a change in the identity block.
 add_task(function* testTempPermissionChangeEvents() {
   let uri = NetUtil.newURI(ORIGIN);
   let id = "geo";
 
   yield BrowserTestUtils.withNewTab(uri.spec, function*(browser) {
     SitePermissions.set(uri, id, SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY, browser);
 
@@ -30,77 +27,25 @@ add_task(function* testTempPermissionCha
     Assert.notEqual(geoIcon.boxObject.width, 0, "geo anchor should be visible");
 
     SitePermissions.remove(uri, id, browser);
 
     Assert.equal(geoIcon.boxObject.width, 0, "geo anchor should not be visible");
   });
 });
 
-// Test that temporary permissions can be re-requested after they expired
-// and that the identity block is updated accordingly.
-// TODO (bug 1349144): Write a check for webrtc permissions,
-// because they use a different code path.
-add_task(function* testTempPermissionRequestAfterExpiry() {
-  yield SpecialPowers.pushPrefEnv({set: [
-        ["privacy.temporary_permission_expire_time_ms", EXPIRE_TIME_MS],
-  ]});
-
-  let uri = NetUtil.newURI(ORIGIN);
-  let id = "geo";
-
-  yield BrowserTestUtils.withNewTab(PERMISSIONS_PAGE, function*(browser) {
-    let blockedIcon = gIdentityHandler._identityBox
-      .querySelector(`.blocked-permission-icon[data-permission-id='${id}']`);
-
-    SitePermissions.set(uri, id, SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY, browser);
-
-    Assert.deepEqual(SitePermissions.get(uri, id, browser), {
-      state: SitePermissions.BLOCK,
-      scope: SitePermissions.SCOPE_TEMPORARY,
-    });
-
-    ok(blockedIcon.hasAttribute("showing"), "blocked permission icon is shown");
-
-    yield new Promise((c) => setTimeout(c, TIMEOUT_MS));
-
-    Assert.deepEqual(SitePermissions.get(uri, id, browser), {
-      state: SitePermissions.UNKNOWN,
-      scope: SitePermissions.SCOPE_PERSISTENT,
-    });
-
-    let popupshown = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown");
-
-    // Request a permission;
-    yield BrowserTestUtils.synthesizeMouseAtCenter(`#${id}`, {}, browser);
-
-    yield popupshown;
-
-    ok(!blockedIcon.hasAttribute("showing"), "blocked permission icon is not shown");
-
-    let popuphidden = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popuphidden");
-
-    let notification = PopupNotifications.panel.firstChild;
-    EventUtils.synthesizeMouseAtCenter(notification.secondaryButton, {});
-
-    yield popuphidden;
-
-    SitePermissions.remove(uri, id, browser);
-  });
-});
-
 // Test that temp blocked permissions requested by subframes (with a different URI) affect the whole page.
 add_task(function* testTempPermissionSubframes() {
   let uri = NetUtil.newURI(ORIGIN);
   let id = "geo";
 
   yield BrowserTestUtils.withNewTab(SUBFRAME_PAGE, function*(browser) {
     let popupshown = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown");
 
-    // Request a permission;
+    // Request a permission.
     yield ContentTask.spawn(browser, uri.host, function(host) {
       E10SUtils.wrapHandlingUserInput(content, true, function() {
         let frame = content.document.getElementById("frame");
         let frameDoc = frame.contentWindow.document;
 
         // Make sure that the origin of our test page is different.
         Assert.notEqual(frameDoc.location.host, host);
 
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/permissions/browser_temporary_permissions_expiry.js
@@ -0,0 +1,62 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const ORIGIN = "https://example.com";
+const PERMISSIONS_PAGE = getRootDirectory(gTestPath).replace("chrome://mochitests/content", ORIGIN) + "permissions.html";
+
+const EXPIRE_TIME_MS = 100;
+const TIMEOUT_MS = 500;
+
+// Test that temporary permissions can be re-requested after they expired
+// and that the identity block is updated accordingly.
+// TODO (bug 1349144): Write a check for webrtc permissions,
+// because they use a different code path.
+add_task(function* testTempPermissionRequestAfterExpiry() {
+  yield SpecialPowers.pushPrefEnv({set: [
+        ["privacy.temporary_permission_expire_time_ms", EXPIRE_TIME_MS],
+  ]});
+
+  let uri = NetUtil.newURI(ORIGIN);
+  let id = "geo";
+
+  yield BrowserTestUtils.withNewTab(PERMISSIONS_PAGE, function*(browser) {
+    let blockedIcon = gIdentityHandler._identityBox
+      .querySelector(`.blocked-permission-icon[data-permission-id='${id}']`);
+
+    SitePermissions.set(uri, id, SitePermissions.BLOCK, SitePermissions.SCOPE_TEMPORARY, browser);
+
+    Assert.deepEqual(SitePermissions.get(uri, id, browser), {
+      state: SitePermissions.BLOCK,
+      scope: SitePermissions.SCOPE_TEMPORARY,
+    });
+
+    ok(blockedIcon.hasAttribute("showing"), "blocked permission icon is shown");
+
+    yield new Promise((c) => setTimeout(c, TIMEOUT_MS));
+
+    Assert.deepEqual(SitePermissions.get(uri, id, browser), {
+      state: SitePermissions.UNKNOWN,
+      scope: SitePermissions.SCOPE_PERSISTENT,
+    });
+
+    let popupshown = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown");
+
+    // Request a permission;
+    yield BrowserTestUtils.synthesizeMouseAtCenter(`#${id}`, {}, browser);
+
+    yield popupshown;
+
+    ok(!blockedIcon.hasAttribute("showing"), "blocked permission icon is not shown");
+
+    let popuphidden = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popuphidden");
+
+    let notification = PopupNotifications.panel.firstChild;
+    EventUtils.synthesizeMouseAtCenter(notification.secondaryButton, {});
+
+    yield popuphidden;
+
+    SitePermissions.remove(uri, id, browser);
+  });
+});