Bug 1324062. Part 2 - Add tests for Report Site Issue button. draft
authorMike Taylor <miket@mozilla.com>
Wed, 28 Dec 2016 13:37:32 -0600
changeset 454281 ae94d7865bef06f682a59cc25fc5bc74db254f2d
parent 454280 2e22305965460774d109867e5119a8ec32c05178
child 540672 5b6529b01ce95d10c406faab101259c43081b2c4
push id39890
push userbmo:miket@mozilla.com
push dateWed, 28 Dec 2016 20:58:22 +0000
bugs1324062
milestone53.0a1
Bug 1324062. Part 2 - Add tests for Report Site Issue button.
browser/extensions/webcompat-reporter/test/browser/.eslintrc.js
browser/extensions/webcompat-reporter/test/browser/browser.ini
browser/extensions/webcompat-reporter/test/browser/browser_button_state.js
browser/extensions/webcompat-reporter/test/browser/browser_disabled_cleanup.js
browser/extensions/webcompat-reporter/test/browser/browser_report_site_issue.js
browser/extensions/webcompat-reporter/test/browser/head.js
browser/extensions/webcompat-reporter/test/browser/test.html
browser/extensions/webcompat-reporter/test/browser/webcompat.html
testing/profiles/prefs_general.js
new file mode 100644
--- /dev/null
+++ b/browser/extensions/webcompat-reporter/test/browser/.eslintrc.js
@@ -0,0 +1,7 @@
+"use strict";
+
+module.exports = {
+  "extends": [
+    "../../../../../testing/mochitest/browser.eslintrc.js"
+  ]
+};
new file mode 100644
--- /dev/null
+++ b/browser/extensions/webcompat-reporter/test/browser/browser.ini
@@ -0,0 +1,9 @@
+[DEFAULT]
+support-files =
+  head.js
+  test.html
+  webcompat.html
+
+[browser_disabled_cleanup.js]
+[browser_button_state.js]
+[browser_report_site_issue.js]
new file mode 100644
--- /dev/null
+++ b/browser/extensions/webcompat-reporter/test/browser/browser_button_state.js
@@ -0,0 +1,31 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const REPORTABLE_PAGE = "http://example.com/";
+const REPORTABLE_PAGE2 = "https://example.com/";
+const NONREPORTABLE_PAGE = "about:blank";
+
+/* Test that the Report Site Issue button is enabled for http and https tabs,
+   on page load, or TabSelect, and disabled for everything else. */
+add_task(function* test_button_state_disabled() {
+  let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, REPORTABLE_PAGE);
+  yield panelShown(window);
+  is(isButtonDisabled(), false, "Check that button is enabled for reportable schemes on tab load");
+
+  let tab2 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, NONREPORTABLE_PAGE);
+  is(isButtonDisabled(), true, "Check that button is disabled for non-reportable schemes on tab load");
+
+  let tab3 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, REPORTABLE_PAGE2);
+  is(isButtonDisabled(), false, "Check that button is enabled for reportable schemes on tab load");
+
+
+  yield BrowserTestUtils.switchTab(gBrowser, tab2);
+  is(isButtonDisabled(), true, "Check that button is disabled for non-reportable schemes on TabSelect");
+
+  yield BrowserTestUtils.switchTab(gBrowser, tab1);
+  is(isButtonDisabled(), false, "Check that button is enabled for reportable schemes on TabSelect");
+
+  yield BrowserTestUtils.removeTab(tab1);
+  yield BrowserTestUtils.removeTab(tab2);
+  yield BrowserTestUtils.removeTab(tab3);
+});
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/browser/extensions/webcompat-reporter/test/browser/browser_disabled_cleanup.js
@@ -0,0 +1,15 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+registerCleanupFunction(function() {
+  SpecialPowers.clearUserPref(PREF_WC_REPORTER_ENABLED);
+});
+
+// Test the addon is cleaning up after itself when disabled.
+add_task(function* test_disabled() {
+  yield BrowserTestUtils.withNewTab({gBrowser, url: "about:blank"}, function() {
+    SpecialPowers.setBoolPref(PREF_WC_REPORTER_ENABLED, false);
+    is(typeof window._webCompatReporterTabListener , "undefined", "TabListener expando does not exist.");
+    is(document.getElementById("webcompat-reporter-button"), null, "Report Site Issue button does not exist.");
+  });
+});
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/browser/extensions/webcompat-reporter/test/browser/browser_report_site_issue.js
@@ -0,0 +1,36 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/* Test that clicking on the Report Site Issue button opens a new tab
+   and sends a postMessaged blob at it.
+   testing/profiles/prefs_general.js sets the value for
+   "extensions.webcompat-reporter.newIssueEndpoint" */
+add_task(function* test_screenshot() {
+  const TEST_PAGE = "http://example.com/browser/browser/extensions/webcompat-reporter/test/browser/test.html";
+
+  let tab1 = yield BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_PAGE);
+  yield PanelUI.show();
+
+  let webcompatButton = document.getElementById("webcompat-reporter-button");
+  ok(webcompatButton, "Report Site Issue button exists.");
+  webcompatButton.click();
+
+  yield BrowserTestUtils.waitForCondition(function() {
+    return gBrowser.currentURI.path.includes("webcompat.html");
+  }, "Wait until the new issue endpoint is opened.");
+
+  let urlParam = gBrowser.selectedBrowser.contentWindow.document.getElementById("url").innerText;
+  is(urlParam, TEST_PAGE, "Reported page is added to url param");
+
+  let preview = gBrowser.selectedBrowser.contentWindow.document.getElementById("screenshot-preview");
+
+  yield BrowserTestUtils.waitForCondition(function() {
+    return preview.style.background !== "";
+  }, "Wait until the blob is converted to base64 and set as background of preview div.");
+
+  isnot(preview.innerText, "Fail", "A Blob object was successfully transferred to the test page.")
+  ok(preview.style.background.includes("data:image/png;base64,iVBOR"), "A green screenshot was successfully postMessaged");
+
+  gBrowser.removeCurrentTab();
+  yield BrowserTestUtils.removeTab(tab1);
+});
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/browser/extensions/webcompat-reporter/test/browser/head.js
@@ -0,0 +1,41 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const PREF_WC_REPORTER_ENABLED = "extensions.webcompat-reporter.enabled";
+const PREF_WC_REPORTER_ENDPOINT = "extensions.webcompat-reporter.newIssueEndpoint";
+
+function panelShown(window) {
+  return new Promise(resolve => {
+    PanelUI.panel.addEventListener("popupshown", function onPopUpShown() {
+      PanelUI.panel.removeEventListener("popupshown", onPopUpShown);
+        resolve();
+    });
+    PanelUI.show();
+  });
+}
+
+function isButtonDisabled() {
+  return document.getElementById("webcompat-reporter-button").disabled;
+}
+
+function waitForCondition(aConditionFn, aMaxTries=50, aCheckInterval=100) {
+  return new Promise((resolve, reject) => {
+    function tryNow() {
+      tries++;
+      if (aConditionFn()) {
+        resolve();
+      } else if (tries < aMaxTries) {
+        tryAgain();
+      } else {
+        reject("Condition timed out: " + aConditionFn.toSource());
+      }
+    }
+
+    function tryAgain() {
+      setTimeout(tryNow, aCheckInterval);
+    }
+
+    let tries = 0;
+    tryAgain();
+  });
+}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/browser/extensions/webcompat-reporter/test/browser/test.html
@@ -0,0 +1,7 @@
+<!-- Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!DOCTYPE html>
+<meta charset="utf-8">
+<style>
+  body {background: rgb(0, 128, 0);}
+</style>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/browser/extensions/webcompat-reporter/test/browser/webcompat.html
@@ -0,0 +1,29 @@
+<!-- Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!DOCTYPE html>
+<meta charset="utf-8">
+<style>
+ #screenshot-preview {width: 200px; height: 200px;}
+</style>
+<p id="url"></p>
+<div id="screenshot-preview"></div>
+<script>
+window.addEventListener("message", function(event) {
+  let preview = document.getElementById("screenshot-preview");
+  if (!event.data instanceof Blob) {
+    preview.innerText = "Fail";
+  }
+
+  let reader = new FileReader();
+  reader.onload = event => {
+    let dataURI = event.target.result;
+    preview.style.background = `url(${dataURI})`;
+  };
+  reader.readAsDataURL(event.data);
+});
+
+
+ let params = new URLSearchParams(location.search.slice(1));
+ let url = document.getElementById("url");
+ url.innerText = params.get("url");
+</script>
\ No newline at end of file
--- a/testing/profiles/prefs_general.js
+++ b/testing/profiles/prefs_general.js
@@ -354,8 +354,11 @@ user_pref("plugin.load_flash_only", fals
 // cannot easily be upgraded.
 user_pref("media.libavcodec.allow-obsolete", true);
 
 user_pref("media.openUnsupportedTypeWithExternalApp", false);
 
 // Disable password capture, so that mochitests that include forms aren't
 // influenced by the presence of the persistent doorhanger notification.
 user_pref("signon.rememberSignons", false);
+
+// Make sure "Report Site Issue" button won't hit the network.
+user_pref("extensions.webcompat-reporter.newIssueEndpoint", "http://example.com/browser/browser/extensions/webcompat-reporter/test/browser/webcompat.html");
\ No newline at end of file