diff options
Diffstat (limited to 'browser/modules/test/browser_NetworkPrioritizer.js')
-rw-r--r-- | browser/modules/test/browser_NetworkPrioritizer.js | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/browser/modules/test/browser_NetworkPrioritizer.js b/browser/modules/test/browser_NetworkPrioritizer.js new file mode 100644 index 000000000..91557b0fd --- /dev/null +++ b/browser/modules/test/browser_NetworkPrioritizer.js @@ -0,0 +1,165 @@ +/* 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/. */ + +/** Tests for NetworkPrioritizer.jsm (Bug 514490) **/ + +const LOWEST = Ci.nsISupportsPriority.PRIORITY_LOWEST; +const LOW = Ci.nsISupportsPriority.PRIORITY_LOW; +const NORMAL = Ci.nsISupportsPriority.PRIORITY_NORMAL; +const HIGH = Ci.nsISupportsPriority.PRIORITY_HIGH; +const HIGHEST = Ci.nsISupportsPriority.PRIORITY_HIGHEST; + +const DELTA = NORMAL - LOW; // lower value means higher priority + +// Test helper functions. +// getPriority and setPriority can take a tab or a Browser +function* getPriority(aBrowser) { + if (aBrowser.localName == "tab") + aBrowser = aBrowser.linkedBrowser; + + return yield ContentTask.spawn(aBrowser, null, function* () { + return docShell.QueryInterface(Components.interfaces.nsIWebNavigation) + .QueryInterface(Components.interfaces.nsIDocumentLoader) + .loadGroup + .QueryInterface(Components.interfaces.nsISupportsPriority) + .priority; + }); +} + +function* setPriority(aBrowser, aPriority) { + if (aBrowser.localName == "tab") + aBrowser = aBrowser.linkedBrowser; + + yield ContentTask.spawn(aBrowser, aPriority, function* (aPriority) { + docShell.QueryInterface(Components.interfaces.nsIWebNavigation) + .QueryInterface(Components.interfaces.nsIDocumentLoader) + .loadGroup + .QueryInterface(Ci.nsISupportsPriority) + .priority = aPriority; + }); +} + +function* isWindowState(aWindow, aTabPriorities) { + let browsers = aWindow.gBrowser.browsers; + // Make sure we have the right number of tabs & priorities + is(browsers.length, aTabPriorities.length, + "Window has expected number of tabs"); + // aState should be in format [ priority, priority, priority ] + for (let i = 0; i < browsers.length; i++) { + is(yield getPriority(browsers[i]), aTabPriorities[i], + "Tab " + i + " had expected priority"); + } +} + +function promiseWaitForFocus(aWindow) { + return new Promise((resolve) => { + waitForFocus(resolve, aWindow); + }); +} + +add_task(function*() { + // This is the real test. It creates multiple tabs & windows, changes focus, + // closes windows/tabs to make sure we behave correctly. + // This test assumes that no priorities have been adjusted and the loadgroup + // priority starts at 0. + + // Call window "window_A" to make the test easier to follow + let window_A = window; + + // Test 1 window, 1 tab case. + yield isWindowState(window_A, [HIGH]); + + // Exising tab is tab_A1 + let tab_A2 = window_A.gBrowser.addTab("http://example.com"); + let tab_A3 = window_A.gBrowser.addTab("about:config"); + yield BrowserTestUtils.browserLoaded(tab_A3.linkedBrowser); + + // tab_A2 isn't focused yet + yield isWindowState(window_A, [HIGH, NORMAL, NORMAL]); + + // focus tab_A2 & make sure priority got updated + window_A.gBrowser.selectedTab = tab_A2; + yield isWindowState(window_A, [NORMAL, HIGH, NORMAL]); + + window_A.gBrowser.removeTab(tab_A2); + // Next tab is auto selected synchronously as part of removeTab, and we + // expect the priority to be updated immediately. + yield isWindowState(window_A, [NORMAL, HIGH]); + + // Open another window then play with focus + let window_B = yield BrowserTestUtils.openNewBrowserWindow(); + + yield promiseWaitForFocus(window_B); + yield isWindowState(window_A, [LOW, NORMAL]); + yield isWindowState(window_B, [HIGH]); + + yield promiseWaitForFocus(window_A); + yield isWindowState(window_A, [NORMAL, HIGH]); + yield isWindowState(window_B, [NORMAL]); + + yield promiseWaitForFocus(window_B); + yield isWindowState(window_A, [LOW, NORMAL]); + yield isWindowState(window_B, [HIGH]); + + // Cleanup + window_A.gBrowser.removeTab(tab_A3); + yield BrowserTestUtils.closeWindow(window_B); +}); + +add_task(function*() { + // This is more a test of nsLoadGroup and how it handles priorities. But since + // we depend on its behavior, it's good to test it. This is testing that there + // are no errors if we adjust beyond nsISupportsPriority's bounds. + + yield promiseWaitForFocus(); + + let tab1 = gBrowser.tabs[0]; + let oldPriority = yield getPriority(tab1); + + // Set the priority of tab1 to the lowest possible. Selecting the other tab + // will try to lower it + yield setPriority(tab1, LOWEST); + + let tab2 = gBrowser.addTab("http://example.com"); + yield BrowserTestUtils.browserLoaded(tab2.linkedBrowser); + gBrowser.selectedTab = tab2; + is(yield getPriority(tab1), LOWEST - DELTA, "Can adjust priority beyond 'lowest'"); + + // Now set priority to "highest" and make sure that no errors occur. + yield setPriority(tab1, HIGHEST); + gBrowser.selectedTab = tab1; + + is(yield getPriority(tab1), HIGHEST + DELTA, "Can adjust priority beyond 'highest'"); + + // Cleanup + gBrowser.removeTab(tab2); + yield setPriority(tab1, oldPriority); +}); + +add_task(function*() { + // This tests that the priority doesn't get lost when switching the browser's remoteness + + if (!gMultiProcessBrowser) { + return; + } + + let browser = gBrowser.selectedBrowser; + + browser.loadURI("http://example.com"); + yield BrowserTestUtils.browserLoaded(browser); + ok(browser.isRemoteBrowser, "web page should be loaded in remote browser"); + is(yield getPriority(browser), HIGH, "priority of selected tab should be 'high'"); + + browser.loadURI("about:rights"); + yield BrowserTestUtils.browserLoaded(browser); + ok(!browser.isRemoteBrowser, "about:rights should switch browser to non-remote"); + is(yield getPriority(browser), HIGH, + "priority of selected tab should be 'high' when going from remote to non-remote"); + + browser.loadURI("http://example.com"); + yield BrowserTestUtils.browserLoaded(browser); + ok(browser.isRemoteBrowser, "going from about:rights to web page should switch browser to remote"); + is(yield getPriority(browser), HIGH, + "priority of selected tab should be 'high' when going from non-remote to remote"); +}); |