diff options
Diffstat (limited to 'browser/base/content/test/general/browser_refreshBlocker.js')
-rw-r--r-- | browser/base/content/test/general/browser_refreshBlocker.js | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/browser/base/content/test/general/browser_refreshBlocker.js b/browser/base/content/test/general/browser_refreshBlocker.js new file mode 100644 index 000000000..ee274f2c2 --- /dev/null +++ b/browser/base/content/test/general/browser_refreshBlocker.js @@ -0,0 +1,135 @@ +"use strict"; + +const META_PAGE = "http://example.org/browser/browser/base/content/test/general/refresh_meta.sjs" +const HEADER_PAGE = "http://example.org/browser/browser/base/content/test/general/refresh_header.sjs" +const TARGET_PAGE = "http://example.org/browser/browser/base/content/test/general/dummy_page.html"; +const PREF = "accessibility.blockautorefresh"; + +/** + * Goes into the content, and simulates a meta-refresh header at a very + * low level, and checks to see if it was blocked. This will always cancel + * the refresh, regardless of whether or not the refresh was blocked. + * + * @param browser (<xul:browser>) + * The browser to test for refreshing. + * @param expectRefresh (bool) + * Whether or not we expect the refresh attempt to succeed. + * @returns Promise + */ +function* attemptFakeRefresh(browser, expectRefresh) { + yield ContentTask.spawn(browser, expectRefresh, function*(contentExpectRefresh) { + let URI = docShell.QueryInterface(Ci.nsIWebNavigation).currentURI; + let refresher = docShell.QueryInterface(Ci.nsIRefreshURI); + refresher.refreshURI(URI, 0, false, true); + + Assert.equal(refresher.refreshPending, contentExpectRefresh, + "Got the right refreshPending state"); + + if (refresher.refreshPending) { + // Cancel the pending refresh + refresher.cancelRefreshURITimers(); + } + + // The RefreshBlocker will wait until onLocationChange has + // been fired before it will show any notifications (see bug + // 1246291), so we cause this to occur manually here. + content.location = URI.spec + "#foo"; + }); +} + +/** + * Tests that we can enable the blocking pref and block a refresh + * from occurring while showing a notification bar. Also tests that + * when we disable the pref, that refreshes can go through again. + */ +add_task(function* test_can_enable_and_block() { + yield BrowserTestUtils.withNewTab({ + gBrowser, + url: TARGET_PAGE, + }, function*(browser) { + // By default, we should be able to reload the page. + yield attemptFakeRefresh(browser, true); + + yield pushPrefs(["accessibility.blockautorefresh", true]); + + let notificationPromise = + BrowserTestUtils.waitForNotificationBar(gBrowser, browser, + "refresh-blocked"); + + yield attemptFakeRefresh(browser, false); + + yield notificationPromise; + + yield pushPrefs(["accessibility.blockautorefresh", false]); + + // Page reloads should go through again. + yield attemptFakeRefresh(browser, true); + }); +}); + +/** + * Attempts a "real" refresh by opening a tab, and then sending it to + * an SJS page that will attempt to cause a refresh. This will also pass + * a delay amount to the SJS page. The refresh should be blocked, and + * the notification should be shown. Once shown, the "Allow" button will + * be clicked, and the refresh will go through. Finally, the helper will + * close the tab and resolve the Promise. + * + * @param refreshPage (string) + * The SJS page to use. Use META_PAGE for the <meta> tag refresh + * case. Use HEADER_PAGE for the HTTP header case. + * @param delay (int) + * The amount, in ms, for the page to wait before attempting the + * refresh. + * + * @returns Promise + */ +function* testRealRefresh(refreshPage, delay) { + yield BrowserTestUtils.withNewTab({ + gBrowser, + url: "about:blank", + }, function*(browser) { + yield pushPrefs(["accessibility.blockautorefresh", true]); + + browser.loadURI(refreshPage + "?p=" + TARGET_PAGE + "&d=" + delay); + yield BrowserTestUtils.browserLoaded(browser); + + // Once browserLoaded resolves, all nsIWebProgressListener callbacks + // should have fired, so the notification should be visible. + let notificationBox = gBrowser.getNotificationBox(browser); + let notification = notificationBox.currentNotification; + + ok(notification, "Notification should be visible"); + is(notification.value, "refresh-blocked", + "Should be showing the right notification"); + + // Then click the button to allow the refresh. + let buttons = notification.querySelectorAll(".notification-button"); + is(buttons.length, 1, "Should have one button."); + + // Prepare a Promise that should resolve when the refresh goes through + let refreshPromise = BrowserTestUtils.browserLoaded(browser); + buttons[0].click(); + + yield refreshPromise; + }); +} + +/** + * Tests the meta-tag case for both short and longer delay times. + */ +add_task(function* test_can_allow_refresh() { + yield testRealRefresh(META_PAGE, 0); + yield testRealRefresh(META_PAGE, 100); + yield testRealRefresh(META_PAGE, 500); +}); + +/** + * Tests that when a HTTP header case for both short and longer + * delay times. + */ +add_task(function* test_can_block_refresh_from_header() { + yield testRealRefresh(HEADER_PAGE, 0); + yield testRealRefresh(HEADER_PAGE, 100); + yield testRealRefresh(HEADER_PAGE, 500); +}); |