Bug 1376865 Add a test for Canvas Image Prompts triggered by user inputs. r?baku draft
authorTom Ritter <tom@mozilla.com>
Sat, 17 Feb 2018 22:04:11 -0600
changeset 759712 a61d4d74ce8ae8c6c41c2ab9049ca531e5595014
parent 759711 1469702b25a192df821a4615c4b94235c41a105c
push id100437
push userbmo:tom@mozilla.com
push dateMon, 26 Feb 2018 13:40:15 +0000
reviewersbaku
bugs1376865
milestone60.0a1
Bug 1376865 Add a test for Canvas Image Prompts triggered by user inputs. r?baku MozReview-Commit-ID: Ht9gaW92yMG
browser/base/content/test/permissions/browser_canvas_fingerprinting_resistance.js
--- a/browser/base/content/test/permissions/browser_canvas_fingerprinting_resistance.js
+++ b/browser/base/content/test/permissions/browser_canvas_fingerprinting_resistance.js
@@ -23,30 +23,39 @@ function initTab() {
     canvas.setAttribute("width", width);
     canvas.setAttribute("height", height);
     contentDocument.body.appendChild(canvas);
 
     let context = canvas.getContext("2d");
     context.fillStyle = fillStyle;
     context.fillRect(0, 0, width, height);
 
+    if (id) {
+      let button = contentDocument.createElement("button");
+      button.addEventListener("click", function() { canvas.toDataURL(); });
+      button.setAttribute("id", "clickme");
+      button.innerHTML = "Click Me!";
+      contentDocument.body.appendChild(button);
+    }
+
     return canvas;
   };
 
   let placeholder = drawCanvas("white");
   contentWindow.kPlaceholderData = placeholder.toDataURL();
   let canvas = drawCanvas("cyan", "canvas-id-canvas");
   isnot(canvas.toDataURL(), contentWindow.kPlaceholderData,
       "privacy.resistFingerprinting = false, canvas data != placeholder data");
 }
 
-function enableResistFingerprinting() {
+function enableResistFingerprinting(autoDeclineNoInput) {
   return SpecialPowers.pushPrefEnv({
     set: [
-      ["privacy.resistFingerprinting", true]
+      ["privacy.resistFingerprinting", true],
+      ["privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts", autoDeclineNoInput]
     ]
   });
 }
 
 function promisePopupShown() {
   return BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown");
 }
 
@@ -83,19 +92,19 @@ function triggerMainCommand() {
 function triggerSecondaryCommand() {
   triggerCommand("secondaryButton");
 }
 
 function testPermission() {
   return Services.perms.testPermissionFromPrincipal(kPrincipal, kPermission);
 }
 
-async function withNewTab(grantPermission, browser) {
+async function withNewTabNoInput(grantPermission, browser) {
   await ContentTask.spawn(browser, null, initTab);
-  await enableResistFingerprinting();
+  await enableResistFingerprinting(false);
   let popupShown = promisePopupShown();
   await ContentTask.spawn(browser, null, extractCanvasData);
   await popupShown;
   let popupHidden = promisePopupHidden();
   if (grantPermission) {
     triggerMainCommand();
     await popupHidden;
     is(testPermission(), Services.perms.ALLOW_ACTION, "permission granted");
@@ -103,18 +112,75 @@ async function withNewTab(grantPermissio
     triggerSecondaryCommand();
     await popupHidden;
     is(testPermission(), Services.perms.DENY_ACTION, "permission denied");
   }
   await ContentTask.spawn(browser, grantPermission, extractCanvasData);
   await SpecialPowers.popPrefEnv();
 }
 
-async function doTest(grantPermission) {
+async function doTestNoInput(grantPermission) {
   Services.perms.removeFromPrincipal(kPrincipal, kPermission);
-  await BrowserTestUtils.withNewTab(kUrl, withNewTab.bind(null, grantPermission));
+  await BrowserTestUtils.withNewTab(kUrl, withNewTabNoInput.bind(null, grantPermission));
+}
+
+// With auto-declining disabled (not the default)
+// Tests clicking "Don't Allow" button of the permission prompt.
+add_task(doTestNoInput.bind(null, false));
+
+// Tests clicking "Allow" button of the permission prompt.
+add_task(doTestNoInput.bind(null, true));
+
+// I don't know how to write a test for "Make sure a prompt is not shown"...
+// But ideally we would have one of those...
+
+function extractCanvasDataUserInput(grantPermission) {
+  let contentWindow = content.wrappedJSObject;
+  let canvas = contentWindow.document.getElementById("canvas-id-canvas");
+  let canvasData = canvas.toDataURL();
+  if (grantPermission) {
+    isnot(canvasData, contentWindow.kPlaceholderData,
+        "privacy.resistFingerprinting = true, permission granted, canvas data != placeholderdata");
+  } else if (grantPermission === false) {
+    is(canvasData, contentWindow.kPlaceholderData,
+        "privacy.resistFingerprinting = true, permission denied, canvas data == placeholderdata");
+  } else {
+    is(canvasData, contentWindow.kPlaceholderData,
+        "privacy.resistFingerprinting = true, requesting permission, canvas data == placeholderdata");
+  }
 }
 
+async function withNewTabInput(grantPermission, browser) {
+  await ContentTask.spawn(browser, null, initTab);
+  await enableResistFingerprinting(true);
+  let popupShown = promisePopupShown();
+  await ContentTask.spawn(browser, null, function(host) {
+    E10SUtils.wrapHandlingUserInput(content, true, function() {
+      var button = content.document.getElementById("clickme");
+      button.click();
+    });
+  });
+  await popupShown;
+  let popupHidden = promisePopupHidden();
+  if (grantPermission) {
+    triggerMainCommand();
+    await popupHidden;
+    is(testPermission(), Services.perms.ALLOW_ACTION, "permission granted");
+  } else {
+    triggerSecondaryCommand();
+    await popupHidden;
+    is(testPermission(), Services.perms.DENY_ACTION, "permission denied");
+  }
+  await ContentTask.spawn(browser, grantPermission, extractCanvasDataUserInput);
+  await SpecialPowers.popPrefEnv();
+}
+
+async function doTestInput(grantPermission, autoDeclineNoInput) {
+  Services.perms.removeFromPrincipal(kPrincipal, kPermission);
+  await BrowserTestUtils.withNewTab(kUrl, withNewTabInput.bind(null, grantPermission));
+}
+
+// With auto-declining enabled (the default)
 // Tests clicking "Don't Allow" button of the permission prompt.
-add_task(doTest.bind(null, false));
+add_task(doTestInput.bind(null, false));
 
 // Tests clicking "Allow" button of the permission prompt.
-add_task(doTest.bind(null, true));
+add_task(doTestInput.bind(null, true));