Bug 1324062. Part 2 - Add tests for Report Site Issue button.
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