diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /browser/base/content/test/general/browser_datachoices_notification.js | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip |
Add m-esr52 at 52.6.0
Diffstat (limited to 'browser/base/content/test/general/browser_datachoices_notification.js')
-rw-r--r-- | browser/base/content/test/general/browser_datachoices_notification.js | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/browser/base/content/test/general/browser_datachoices_notification.js b/browser/base/content/test/general/browser_datachoices_notification.js new file mode 100644 index 000000000..360728b4c --- /dev/null +++ b/browser/base/content/test/general/browser_datachoices_notification.js @@ -0,0 +1,221 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +// Pass an empty scope object to the import to prevent "leaked window property" +// errors in tests. +var Preferences = Cu.import("resource://gre/modules/Preferences.jsm", {}).Preferences; +var TelemetryReportingPolicy = + Cu.import("resource://gre/modules/TelemetryReportingPolicy.jsm", {}).TelemetryReportingPolicy; + +const PREF_BRANCH = "datareporting.policy."; +const PREF_BYPASS_NOTIFICATION = PREF_BRANCH + "dataSubmissionPolicyBypassNotification"; +const PREF_CURRENT_POLICY_VERSION = PREF_BRANCH + "currentPolicyVersion"; +const PREF_ACCEPTED_POLICY_VERSION = PREF_BRANCH + "dataSubmissionPolicyAcceptedVersion"; +const PREF_ACCEPTED_POLICY_DATE = PREF_BRANCH + "dataSubmissionPolicyNotifiedTime"; + +const TEST_POLICY_VERSION = 37; + +function fakeShowPolicyTimeout(set, clear) { + let reportingPolicy = + Cu.import("resource://gre/modules/TelemetryReportingPolicy.jsm", {}).Policy; + reportingPolicy.setShowInfobarTimeout = set; + reportingPolicy.clearShowInfobarTimeout = clear; +} + +function sendSessionRestoredNotification() { + let reportingPolicyImpl = + Cu.import("resource://gre/modules/TelemetryReportingPolicy.jsm", {}).TelemetryReportingPolicyImpl; + reportingPolicyImpl.observe(null, "sessionstore-windows-restored", null); +} + +/** + * Wait for a tick. + */ +function promiseNextTick() { + return new Promise(resolve => executeSoon(resolve)); +} + +/** + * Wait for a notification to be shown in a notification box. + * @param {Object} aNotificationBox The notification box. + * @return {Promise} Resolved when the notification is displayed. + */ +function promiseWaitForAlertActive(aNotificationBox) { + let deferred = PromiseUtils.defer(); + aNotificationBox.addEventListener("AlertActive", function onActive() { + aNotificationBox.removeEventListener("AlertActive", onActive, true); + deferred.resolve(); + }); + return deferred.promise; +} + +/** + * Wait for a notification to be closed. + * @param {Object} aNotification The notification. + * @return {Promise} Resolved when the notification is closed. + */ +function promiseWaitForNotificationClose(aNotification) { + let deferred = PromiseUtils.defer(); + waitForNotificationClose(aNotification, deferred.resolve); + return deferred.promise; +} + +function triggerInfoBar(expectedTimeoutMs) { + let showInfobarCallback = null; + let timeoutMs = null; + fakeShowPolicyTimeout((callback, timeout) => { + showInfobarCallback = callback; + timeoutMs = timeout; + }, () => {}); + sendSessionRestoredNotification(); + Assert.ok(!!showInfobarCallback, "Must have a timer callback."); + if (expectedTimeoutMs !== undefined) { + Assert.equal(timeoutMs, expectedTimeoutMs, "Timeout should match"); + } + showInfobarCallback(); +} + +var checkInfobarButton = Task.async(function* (aNotification) { + // Check that the button on the data choices infobar does the right thing. + let buttons = aNotification.getElementsByTagName("button"); + Assert.equal(buttons.length, 1, "There is 1 button in the data reporting notification."); + let button = buttons[0]; + + // Add an observer to ensure the "advanced" pane opened (but don't bother + // closing it - we close the entire window when done.) + let paneLoadedPromise = promiseTopicObserved("advanced-pane-loaded"); + + // Click on the button. + button.click(); + + // Wait for the preferences panel to open. + yield paneLoadedPromise; + yield promiseNextTick(); +}); + +add_task(function* setup() { + const bypassNotification = Preferences.get(PREF_BYPASS_NOTIFICATION, true); + const currentPolicyVersion = Preferences.get(PREF_CURRENT_POLICY_VERSION, 1); + + // Register a cleanup function to reset our preferences. + registerCleanupFunction(() => { + Preferences.set(PREF_BYPASS_NOTIFICATION, bypassNotification); + Preferences.set(PREF_CURRENT_POLICY_VERSION, currentPolicyVersion); + + return closeAllNotifications(); + }); + + // Don't skip the infobar visualisation. + Preferences.set(PREF_BYPASS_NOTIFICATION, false); + // Set the current policy version. + Preferences.set(PREF_CURRENT_POLICY_VERSION, TEST_POLICY_VERSION); +}); + +function clearAcceptedPolicy() { + // Reset the accepted policy. + Preferences.reset(PREF_ACCEPTED_POLICY_VERSION); + Preferences.reset(PREF_ACCEPTED_POLICY_DATE); +} + +add_task(function* test_single_window() { + clearAcceptedPolicy(); + + // Close all the notifications, then try to trigger the data choices infobar. + yield closeAllNotifications(); + + let notificationBox = document.getElementById("global-notificationbox"); + + // Make sure that we have a coherent initial state. + Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_VERSION, 0), 0, + "No version should be set on init."); + Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_DATE, 0), 0, + "No date should be set on init."); + Assert.ok(!TelemetryReportingPolicy.testIsUserNotified(), + "User not notified about datareporting policy."); + + let alertShownPromise = promiseWaitForAlertActive(notificationBox); + Assert.ok(!TelemetryReportingPolicy.canUpload(), + "User should not be allowed to upload."); + + // Wait for the infobar to be displayed. + triggerInfoBar(10 * 1000); + yield alertShownPromise; + + Assert.equal(notificationBox.allNotifications.length, 1, "Notification Displayed."); + Assert.ok(TelemetryReportingPolicy.canUpload(), "User should be allowed to upload now."); + + yield promiseNextTick(); + let promiseClosed = promiseWaitForNotificationClose(notificationBox.currentNotification); + yield checkInfobarButton(notificationBox.currentNotification); + yield promiseClosed; + + Assert.equal(notificationBox.allNotifications.length, 0, "No notifications remain."); + + // Check that we are still clear to upload and that the policy data is saved. + Assert.ok(TelemetryReportingPolicy.canUpload()); + Assert.equal(TelemetryReportingPolicy.testIsUserNotified(), true, + "User notified about datareporting policy."); + Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_VERSION, 0), TEST_POLICY_VERSION, + "Version pref set."); + Assert.greater(parseInt(Preferences.get(PREF_ACCEPTED_POLICY_DATE, null), 10), -1, + "Date pref set."); +}); + +add_task(function* test_multiple_windows() { + clearAcceptedPolicy(); + + // Close all the notifications, then try to trigger the data choices infobar. + yield closeAllNotifications(); + + // Ensure we see the notification on all windows and that action on one window + // results in dismiss on every window. + let otherWindow = yield BrowserTestUtils.openNewBrowserWindow(); + + // Get the notification box for both windows. + let notificationBoxes = [ + document.getElementById("global-notificationbox"), + otherWindow.document.getElementById("global-notificationbox") + ]; + + Assert.ok(notificationBoxes[1], "2nd window has a global notification box."); + + // Make sure that we have a coherent initial state. + Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_VERSION, 0), 0, "No version should be set on init."); + Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_DATE, 0), 0, "No date should be set on init."); + Assert.ok(!TelemetryReportingPolicy.testIsUserNotified(), "User not notified about datareporting policy."); + + let showAlertPromises = [ + promiseWaitForAlertActive(notificationBoxes[0]), + promiseWaitForAlertActive(notificationBoxes[1]) + ]; + + Assert.ok(!TelemetryReportingPolicy.canUpload(), + "User should not be allowed to upload."); + + // Wait for the infobars. + triggerInfoBar(10 * 1000); + yield Promise.all(showAlertPromises); + + // Both notification were displayed. Close one and check that both gets closed. + let closeAlertPromises = [ + promiseWaitForNotificationClose(notificationBoxes[0].currentNotification), + promiseWaitForNotificationClose(notificationBoxes[1].currentNotification) + ]; + notificationBoxes[0].currentNotification.close(); + yield Promise.all(closeAlertPromises); + + // Close the second window we opened. + yield BrowserTestUtils.closeWindow(otherWindow); + + // Check that we are clear to upload and that the policy data us saved. + Assert.ok(TelemetryReportingPolicy.canUpload(), "User should be allowed to upload now."); + Assert.equal(TelemetryReportingPolicy.testIsUserNotified(), true, + "User notified about datareporting policy."); + Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_VERSION, 0), TEST_POLICY_VERSION, + "Version pref set."); + Assert.greater(parseInt(Preferences.get(PREF_ACCEPTED_POLICY_DATE, null), 10), -1, + "Date pref set."); +}); |