Index: chrome/browser/ui/webui/options/options_browsertest.js |
diff --git a/chrome/browser/ui/webui/options/options_browsertest.js b/chrome/browser/ui/webui/options/options_browsertest.js |
deleted file mode 100644 |
index 05dfd8c96b371f195964e0263045b3cb25823ac8..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/webui/options/options_browsertest.js |
+++ /dev/null |
@@ -1,969 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-GEN_INCLUDE(['options_browsertest_base.js']); |
-GEN('#include "chrome/browser/ui/webui/options/options_browsertest.h"'); |
- |
-/** @const */ var SUPERVISED_USERS_PREF = 'profile.managed_users'; |
- |
-/** |
- * Wait for the method specified by |methodName|, on the |object| object, to be |
- * called, then execute |afterFunction|. |
- * @param {*} object Object with callable property named |methodName|. |
- * @param {string} methodName The name of the property on |object| to use as a |
- * callback. |
- * @param {!Function} afterFunction A function to call after object.methodName() |
- * is called. |
- */ |
-function waitForResponse(object, methodName, afterFunction) { |
- var originalCallback = object[methodName]; |
- |
- // Install a wrapper that temporarily replaces the original function. |
- object[methodName] = function() { |
- object[methodName] = originalCallback; |
- originalCallback.apply(this, arguments); |
- afterFunction(); |
- }; |
-} |
- |
-/** |
- * Wait for the global window.onpopstate callback to be called (after a tab |
- * history navigation), then execute |afterFunction|. |
- * @param {!Function} afterFunction A function to call after pop state events. |
- */ |
-function waitForPopstate(afterFunction) { |
- waitForResponse(window, 'onpopstate', afterFunction); |
-} |
- |
-/** |
- * TestFixture for OptionsPage WebUI testing. |
- * @extends {testing.Test} |
- * @constructor |
- */ |
-function OptionsWebUITest() {} |
- |
-OptionsWebUITest.prototype = { |
- __proto__: OptionsBrowsertestBase.prototype, |
- |
- /** |
- * Browse to the options page & call our preLoad(). |
- * @override |
- */ |
- browsePreload: 'chrome://settings-frame', |
- |
- /** @override */ |
- isAsync: true, |
- |
- /** |
- * Register a mock handler to ensure expectations are met and options pages |
- * behave correctly. |
- */ |
- preLoad: function() { |
- this.makeAndRegisterMockHandler( |
- ['defaultZoomFactorAction', |
- 'fetchPrefs', |
- 'observePrefs', |
- 'setBooleanPref', |
- 'setIntegerPref', |
- 'setDoublePref', |
- 'setStringPref', |
- 'setObjectPref', |
- 'clearPref', |
- 'coreOptionsUserMetricsAction', |
- ]); |
- |
- // Register stubs for methods expected to be called before/during tests. |
- // Specific expectations can be made in the tests themselves. |
- this.mockHandler.stubs().fetchPrefs(ANYTHING); |
- this.mockHandler.stubs().observePrefs(ANYTHING); |
- this.mockHandler.stubs().coreOptionsUserMetricsAction(ANYTHING); |
- }, |
- |
- /** @override */ |
- setUp: function() { |
- OptionsBrowsertestBase.prototype.setUp.call(this); |
- |
- // Enable when failure is resolved. |
- // AX_ARIA_10: http://crbug.com/559329 |
- this.accessibilityAuditConfig.ignoreSelectors( |
- 'unsupportedAriaAttribute', |
- '#profiles-list'); |
- |
- var linkWithUnclearPurposeSelectors = [ |
- '#sync-overview > A', |
- '#privacy-explanation > A', |
- '#languages-section > .settings-row > A', |
- '#cloudprint-options-mdns > .settings-row > A', |
- '#cups-printers-section > .settings-row > A', |
- '#do-not-track-confirm-overlay > .action-area > .hbox.stretch > A', |
- ]; |
- |
- // Enable when failure is resolved. |
- // AX_TEXT_04: http://crbug.com/559318 |
- this.accessibilityAuditConfig.ignoreSelectors( |
- 'linkWithUnclearPurpose', |
- linkWithUnclearPurposeSelectors); |
- |
- // Causes testDefaultZoomFactor to flake. See http://crbug.com/611233. |
- var requiredOwnedAriaRoleMissingSelectors = [ |
- '#default-search-engine-list', |
- '#other-search-engine-list', |
- ]; |
- |
- // Enable when failure is resolved. |
- // AX_ARIA_08: http://crbug.com/606657 |
- this.accessibilityAuditConfig.ignoreSelectors( |
- 'requiredOwnedAriaRoleMissing', |
- requiredOwnedAriaRoleMissingSelectors); |
- }, |
-}; |
- |
-/** |
- * Wait for all targets to be hidden. |
- * @param {Array<Element>} targets |
- */ |
-function waitUntilHidden(targets) { |
- function isHidden(el) { return el.hidden; } |
- function ensureTransition(el) { ensureTransitionEndEvent(el, 500); } |
- |
- document.addEventListener('transitionend', function f(e) { |
- if (targets.indexOf(e.target) >= 0 && targets.every(isHidden)) { |
- document.removeEventListener(f, 'transitionend'); |
- testDone(); |
- } |
- }); |
- |
- targets.forEach(ensureTransition); |
-} |
- |
-// Crashes on Mac only. See http://crbug.com/79181 |
-GEN('#if defined(OS_MACOSX)'); |
-GEN('#define MAYBE_testSetBooleanPrefTriggers ' + |
- 'DISABLED_testSetBooleanPrefTriggers'); |
-GEN('#else'); |
-GEN('#define MAYBE_testSetBooleanPrefTriggers testSetBooleanPrefTriggers'); |
-GEN('#endif // defined(OS_MACOSX)'); |
- |
-TEST_F('OptionsWebUITest', 'MAYBE_testSetBooleanPrefTriggers', function() { |
- // TODO(dtseng): make generic to click all buttons. |
- var showHomeButton = |
- document.querySelector('input[pref="browser.show_home_button"]'); |
- var trueListValue = [ |
- 'browser.show_home_button', |
- true, |
- 'Options_Homepage_HomeButton', |
- ]; |
- // Note: this expectation is checked in testing::Test::tearDown. |
- this.mockHandler.expects(once()).setBooleanPref(trueListValue); |
- |
- // Cause the handler to be called. |
- showHomeButton.click(); |
- showHomeButton.blur(); |
- testDone(); |
-}); |
- |
-// Not meant to run on ChromeOS at this time. |
-// Not finishing in windows. http://crbug.com/81723 |
-TEST_F('OptionsWebUITest', 'DISABLED_testRefreshStaysOnCurrentPage', |
- function() { |
- assertTrue($('search-engine-manager-page').hidden); |
- var item = $('manage-default-search-engines'); |
- item.click(); |
- |
- assertFalse($('search-engine-manager-page').hidden); |
- |
- window.location.reload(); |
- |
- assertEquals('chrome://settings-frame/searchEngines', document.location.href); |
- assertFalse($('search-engine-manager-page').hidden); |
- testDone(); |
-}); |
- |
-/** |
- * Test the default zoom factor select element. |
- */ |
-TEST_F('OptionsWebUITest', 'testDefaultZoomFactor', function() { |
- // The expected minimum length of the |defaultZoomFactor| element. |
- var defaultZoomFactorMinimumLength = 10; |
- // Verify that the zoom factor element exists. |
- var defaultZoomFactor = $('defaultZoomFactor'); |
- assertNotEquals(defaultZoomFactor, null); |
- |
- // Verify that the zoom factor element has a reasonable number of choices. |
- expectGE(defaultZoomFactor.options.length, defaultZoomFactorMinimumLength); |
- |
- // Simulate a change event, selecting the highest zoom value. Verify that |
- // the javascript handler was invoked once. |
- this.mockHandler.expects(once()).defaultZoomFactorAction(NOT_NULL). |
- will(callFunction(function() { })); |
- defaultZoomFactor.selectedIndex = defaultZoomFactor.options.length - 1; |
- var event = {target: defaultZoomFactor}; |
- if (defaultZoomFactor.onchange) defaultZoomFactor.onchange(event); |
- testDone(); |
-}); |
- |
-/** |
- * If |confirmInterstitial| is true, the OK button of the Do Not Track |
- * interstitial is pressed, otherwise the abort button is pressed. |
- * @param {boolean} confirmInterstitial Whether to confirm the Do Not Track |
- * interstitial. |
- */ |
-OptionsWebUITest.prototype.testDoNotTrackInterstitial = |
- function(confirmInterstitial) { |
- Preferences.prefsFetchedCallback({'enable_do_not_track': {'value': false}}); |
- var buttonToClick = confirmInterstitial ? $('do-not-track-confirm-ok') : |
- $('do-not-track-confirm-cancel'); |
- var dntCheckbox = $('do-not-track-enabled'); |
- var dntOverlay = PageManager.registeredOverlayPages['donottrackconfirm']; |
- assertFalse(dntCheckbox.checked); |
- |
- var visibleChangeCounter = 0; |
- var visibleChangeHandler = function() { |
- ++visibleChangeCounter; |
- switch (visibleChangeCounter) { |
- case 1: |
- window.setTimeout(function() { |
- assertTrue(dntOverlay.visible); |
- buttonToClick.click(); |
- }, 0); |
- break; |
- case 2: |
- window.setTimeout(function() { |
- assertFalse(dntOverlay.visible); |
- assertEquals(confirmInterstitial, dntCheckbox.checked); |
- dntOverlay.removeEventListener('visibleChange', visibleChangeHandler); |
- testDone(); |
- }, 0); |
- break; |
- default: |
- assertTrue(false); |
- } |
- }; |
- dntOverlay.addEventListener('visibleChange', visibleChangeHandler); |
- |
- if (confirmInterstitial) { |
- this.mockHandler.expects(once()).setBooleanPref( |
- ['enable_do_not_track', true, 'Options_DoNotTrackCheckbox']); |
- } else { |
- // The mock handler complains if setBooleanPref is called even though |
- // it should not be. |
- } |
- |
- dntCheckbox.click(); |
-}; |
- |
-TEST_F('OptionsWebUITest', 'EnableDoNotTrackAndConfirmInterstitial', |
- function() { |
- this.testDoNotTrackInterstitial(true); |
-}); |
- |
-TEST_F('OptionsWebUITest', 'EnableDoNotTrackAndCancelInterstitial', |
- function() { |
- this.testDoNotTrackInterstitial(false); |
-}); |
- |
-// Check that the "Do not Track" preference can be correctly disabled. |
-// In order to do that, we need to enable it first. |
-TEST_F('OptionsWebUITest', 'EnableAndDisableDoNotTrack', function() { |
- Preferences.prefsFetchedCallback({'enable_do_not_track': {'value': false}}); |
- var dntCheckbox = $('do-not-track-enabled'); |
- var dntOverlay = PageManager.registeredOverlayPages.donottrackconfirm; |
- assertFalse(dntCheckbox.checked); |
- |
- var visibleChangeCounter = 0; |
- var visibleChangeHandler = function() { |
- ++visibleChangeCounter; |
- switch (visibleChangeCounter) { |
- case 1: |
- window.setTimeout(function() { |
- assertTrue(dntOverlay.visible); |
- $('do-not-track-confirm-ok').click(); |
- }, 0); |
- break; |
- case 2: |
- window.setTimeout(function() { |
- assertFalse(dntOverlay.visible); |
- assertTrue(dntCheckbox.checked); |
- dntOverlay.removeEventListener('visibleChange', visibleChangeHandler); |
- dntCheckbox.click(); |
- }, 0); |
- break; |
- default: |
- assertNotReached(); |
- } |
- }; |
- dntOverlay.addEventListener('visibleChange', visibleChangeHandler); |
- |
- this.mockHandler.expects(once()).setBooleanPref( |
- eq(['enable_do_not_track', true, 'Options_DoNotTrackCheckbox'])); |
- |
- var verifyCorrectEndState = function() { |
- window.setTimeout(function() { |
- assertFalse(dntOverlay.visible); |
- assertFalse(dntCheckbox.checked); |
- testDone(); |
- }, 0); |
- }; |
- this.mockHandler.expects(once()).setBooleanPref( |
- eq(['enable_do_not_track', false, 'Options_DoNotTrackCheckbox'])).will( |
- callFunction(verifyCorrectEndState)); |
- |
- dntCheckbox.click(); |
-}); |
- |
-// Fails on chromeos, http://crbug.com/660867 |
-// Verify that preventDefault() is called on 'Enter' keydown events that trigger |
-// the default button. If this doesn't happen, other elements that may get |
-// focus (by the overlay closing for instance), will execute in addition to the |
-// default button. See crbug.com/268336. |
-TEST_F('OptionsWebUITest', 'DISABLED_EnterPreventsDefault', function() { |
- var page = HomePageOverlay.getInstance(); |
- PageManager.showPageByName(page.name); |
- var event = new KeyboardEvent('keydown', { |
- 'bubbles': true, |
- 'cancelable': true, |
- 'key': 'Enter' |
- }); |
- assertFalse(event.defaultPrevented); |
- page.pageDiv.dispatchEvent(event); |
- assertTrue(event.defaultPrevented); |
- testDone(); |
-}); |
- |
-// Verifies that sending an empty list of indexes to move doesn't crash chrome. |
-TEST_F('OptionsWebUITest', 'emptySelectedIndexesDoesntCrash', function() { |
- chrome.send('dragDropStartupPage', [0, []]); |
- setTimeout(testDone); |
-}); |
- |
-// This test turns out to be flaky on all platforms. |
-// See http://crbug.com/315250. |
- |
-// An overlay's position should remain the same as it shows. |
-TEST_F('OptionsWebUITest', 'DISABLED_OverlayShowDoesntShift', function() { |
- var overlayName = 'startup'; |
- var overlay = $('startup-overlay'); |
- var frozenPages = document.getElementsByClassName('frozen'); // Gets updated. |
- expectEquals(0, frozenPages.length); |
- |
- document.addEventListener('transitionend', function(e) { |
- if (e.target != overlay) |
- return; |
- |
- assertFalse(overlay.classList.contains('transparent')); |
- expectEquals(numFrozenPages, frozenPages.length); |
- testDone(); |
- }); |
- |
- PageManager.showPageByName(overlayName); |
- var numFrozenPages = frozenPages.length; |
- expectGT(numFrozenPages, 0); |
-}); |
- |
-GEN('#if defined(OS_CHROMEOS)'); |
-// Verify that range inputs respond to touch events. Currently only Chrome OS |
-// uses slider options. |
-TEST_F('OptionsWebUITest', 'RangeInputHandlesTouchEvents', function() { |
- this.mockHandler.expects(once()).setIntegerPref([ |
- 'settings.touchpad.sensitivity2', 1]); |
- |
- var touchpadRange = $('touchpad-sensitivity-range'); |
- var event = document.createEvent('UIEvent'); |
- event.initUIEvent('touchstart', true, true, window); |
- touchpadRange.dispatchEvent(event); |
- |
- event = document.createEvent('UIEvent'); |
- event.initUIEvent('touchmove', true, true, window); |
- touchpadRange.dispatchEvent(event); |
- |
- touchpadRange.value = 1; |
- |
- event = document.createEvent('UIEvent'); |
- event.initUIEvent('touchend', true, true, window); |
- touchpadRange.dispatchEvent(event); |
- |
- // touchcancel should also trigger the handler, since it |
- // changes the slider position. |
- this.mockHandler.expects(once()).setIntegerPref([ |
- 'settings.touchpad.sensitivity2', 2]); |
- |
- event = document.createEvent('UIEvent'); |
- event.initUIEvent('touchstart', true, true, window); |
- touchpadRange.dispatchEvent(event); |
- |
- touchpadRange.value = 2; |
- |
- event = document.createEvent('UIEvent'); |
- event.initUIEvent('touchcancel', true, true, window); |
- touchpadRange.dispatchEvent(event); |
- |
- testDone(); |
-}); |
-GEN('#endif'); // defined(OS_CHROMEOS) |
- |
-/** |
- * TestFixture for OptionsPage WebUI testing including tab history and support |
- * for preference manipulation. If you don't need the features in the C++ |
- * fixture, use the simpler OptionsWebUITest (above) instead. |
- * @extends {testing.Test} |
- * @constructor |
- */ |
-function OptionsWebUIExtendedTest() {} |
- |
-OptionsWebUIExtendedTest.prototype = { |
- __proto__: OptionsWebUITest.prototype, |
- |
- /** @override */ |
- typedefCppFixture: 'OptionsBrowserTest', |
- |
- /** @override */ |
- setUp: function() { |
- OptionsWebUITest.prototype.setUp.call(this); |
- |
- // Enable when failure is resolved. |
- // AX_ARIA_10: http://crbug.com/559329 |
- this.accessibilityAuditConfig.ignoreSelectors( |
- 'unsupportedAriaAttribute', |
- '#profiles-list'); |
- |
- var controlsWithoutLabelSelectors = [ |
- '#cookies-view-page > .content-area.cookies-list-content-area > *', |
- '#other-search-engine-list > .deletable-item > DIV > *', |
- ]; |
- |
- // Enable when failure is resolved. |
- // AX_TEXT_01: http://crbug.com/559330 |
- this.accessibilityAuditConfig.ignoreSelectors( |
- 'controlsWithoutLabel', |
- controlsWithoutLabelSelectors); |
- |
- var linkWithUnclearPurposeSelectors = [ |
- '#sync-overview > A', |
- '#privacy-explanation > A', |
- '#languages-section > .settings-row > A', |
- '#cloudprint-options-mdns > .settings-row > A', |
- // Selectors below only affect ChromeOS tests. |
- '#privacy-section > DIV > DIV:nth-of-type(9) > A', |
- '#accessibility-learn-more', |
- ]; |
- |
- // Enable when failure is resolved. |
- // AX_TEXT_04: http://crbug.com/559326 |
- this.accessibilityAuditConfig.ignoreSelectors( |
- 'linkWithUnclearPurpose', |
- linkWithUnclearPurposeSelectors); |
- |
- var requiredOwnedAriaRoleMissingSelectors = [ |
- '#default-search-engine-list', |
- '#other-search-engine-list', |
- ]; |
- |
- // Enable when failure is resolved. |
- // AX_ARIA_08: http://crbug.com/605689 |
- this.accessibilityAuditConfig.ignoreSelectors( |
- 'requiredOwnedAriaRoleMissing', |
- requiredOwnedAriaRoleMissingSelectors); |
- }, |
- |
- testGenPreamble: function() { |
- // Start with no supervised users managed by this profile. |
- GEN(' ClearPref("' + SUPERVISED_USERS_PREF + '");'); |
- }, |
- |
- /** |
- * Asserts that two non-nested arrays are equal. The arrays must contain only |
- * plain data types, no nested arrays or other objects. |
- * @param {Array} expected An array of expected values. |
- * @param {Array} result An array of actual values. |
- * @param {boolean} doSort If true, the arrays will be sorted before being |
- * compared. |
- * @param {string} description A brief description for the array of actual |
- * values, to use in an error message if the arrays differ. |
- * @private |
- */ |
- compareArrays_: function(expected, result, doSort, description) { |
- var errorMessage = '\n' + description + ': ' + result + |
- '\nExpected: ' + expected; |
- assertEquals(expected.length, result.length, errorMessage); |
- |
- var expectedSorted = expected.slice(); |
- var resultSorted = result.slice(); |
- if (doSort) { |
- expectedSorted.sort(); |
- resultSorted.sort(); |
- } |
- |
- for (var i = 0; i < expectedSorted.length; ++i) { |
- assertEquals(expectedSorted[i], resultSorted[i], errorMessage); |
- } |
- }, |
- |
- /** |
- * Verifies that the correct pages are currently open/visible. |
- * @param {!Array<string>} expectedPages An array of page names expected to |
- * be open, with the topmost listed last. |
- * @param {string=} opt_expectedUrl The URL path, including hash, expected to |
- * be open. If undefined, the topmost (last) page name in |expectedPages| |
- * will be used. In either case, 'chrome://settings-frame/' will be |
- * prepended. |
- * @private |
- */ |
- verifyOpenPages_: function(expectedPages, opt_expectedUrl) { |
- // Check the topmost page. |
- expectEquals(null, PageManager.getVisibleBubble()); |
- var currentPage = PageManager.getTopmostVisiblePage(); |
- |
- var lastExpected = expectedPages[expectedPages.length - 1]; |
- expectEquals(lastExpected, currentPage.name); |
- // We'd like to check the title too, but we have to load the settings-frame |
- // instead of the outer settings page in order to have access to |
- // OptionsPage, and setting the title from within the settings-frame fails |
- // because of cross-origin access restrictions. |
- // TODO(pamg): Add a test fixture that loads chrome://settings and uses |
- // UI elements to access sub-pages, so we can test the titles and |
- // search-page URLs. |
- var expectedUrl = (typeof opt_expectedUrl == 'undefined') ? |
- lastExpected : opt_expectedUrl; |
- var fullExpectedUrl = 'chrome://settings-frame/' + expectedUrl; |
- expectEquals(fullExpectedUrl, window.location.href); |
- |
- // Collect open pages. |
- var allPageNames = Object.keys(PageManager.registeredPages).concat( |
- Object.keys(PageManager.registeredOverlayPages)); |
- var openPages = []; |
- for (var i = 0; i < allPageNames.length; ++i) { |
- var name = allPageNames[i]; |
- var page = PageManager.registeredPages[name] || |
- PageManager.registeredOverlayPages[name]; |
- if (page.visible) |
- openPages.push(page.name); |
- } |
- |
- this.compareArrays_(expectedPages, openPages, true, 'Open pages'); |
- }, |
- |
- /* |
- * Verifies that the correct URLs are listed in the history. Asynchronous. |
- * @param {!Array<string>} expectedHistory An array of URL paths expected to |
- * be in the tab navigation history, sorted by visit time, including the |
- * current page as the last entry. The base URL (chrome://settings-frame/) |
- * will be prepended to each. An initial 'about:blank' history entry is |
- * assumed and should not be included in this list. |
- * @param {Function=} callback A function to be called after the history has |
- * been verified successfully. May be undefined. |
- * @private |
- */ |
- verifyHistory_: function(expectedHistory, callback) { |
- var self = this; |
- OptionsWebUIExtendedTest.verifyHistoryCallback = function(results) { |
- // The history always starts with a blank page. |
- assertEquals('about:blank', results.shift()); |
- var fullExpectedHistory = []; |
- for (var i = 0; i < expectedHistory.length; ++i) { |
- fullExpectedHistory.push( |
- 'chrome://settings-frame/' + expectedHistory[i]); |
- } |
- self.compareArrays_(fullExpectedHistory, results, false, 'History'); |
- callback(); |
- }; |
- |
- // The C++ fixture will call verifyHistoryCallback with the results. |
- chrome.send('optionsTestReportHistory'); |
- }, |
- |
- /** |
- * Overrides the page callbacks for the given PageManager overlay to verify |
- * that they are not called. |
- * @param {Object} overlay The singleton instance of the overlay. |
- * @private |
- */ |
- prohibitChangesToOverlay_: function(overlay) { |
- overlay.initializePage = |
- overlay.didShowPage = |
- overlay.didClosePage = function() { |
- assertTrue(false, |
- 'Overlay was affected when changes were prohibited.'); |
- }; |
- }, |
-}; |
- |
-/** |
- * Set by verifyHistory_ to incorporate a followup callback, then called by the |
- * C++ fixture with the navigation history to be verified. |
- * @type {Function} |
- */ |
-OptionsWebUIExtendedTest.verifyHistoryCallback = null; |
- |
-// Show the search page with no query string, to fall back to the settings page. |
-// Test disabled because it's flaky. crbug.com/303841 |
-TEST_F('OptionsWebUIExtendedTest', 'DISABLED_ShowSearchPageNoQuery', |
- function() { |
- PageManager.showPageByName('search'); |
- this.verifyOpenPages_(['settings']); |
- this.verifyHistory_(['settings'], testDone); |
-}); |
- |
-// Manipulate the search page via the search field. |
-TEST_F('OptionsWebUIExtendedTest', 'ShowSearchFromField', function() { |
- $('search-field').onsearch({currentTarget: {value: 'query'}}); |
- this.verifyOpenPages_(['settings', 'search'], 'search#query'); |
- this.verifyHistory_(['', 'search#query'], function() { |
- $('search-field').onsearch({currentTarget: {value: 'query2'}}); |
- this.verifyOpenPages_(['settings', 'search'], 'search#query2'); |
- this.verifyHistory_(['', 'search#query', 'search#query2'], function() { |
- $('search-field').onsearch({currentTarget: {value: ''}}); |
- this.verifyOpenPages_(['settings'], ''); |
- this.verifyHistory_(['', 'search#query', 'search#query2', ''], testDone); |
- }.bind(this)); |
- }.bind(this)); |
-}); |
- |
-// Show a page without updating history. |
-TEST_F('OptionsWebUIExtendedTest', 'ShowPageNoHistory', function() { |
- this.verifyOpenPages_(['settings'], ''); |
- PageManager.showPageByName('search', true, {hash: '#query'}); |
- |
- // The settings page is also still "open" (i.e., visible), in order to show |
- // the search results. Furthermore, the URL hasn't been updated in the parent |
- // page, because we've loaded the chrome-settings frame instead of the whole |
- // settings page, so the cross-origin call to set the URL fails. |
- this.verifyOpenPages_(['settings', 'search'], 'search#query'); |
- var self = this; |
- this.verifyHistory_(['', 'search#query'], function() { |
- PageManager.showPageByName('settings', false); |
- self.verifyOpenPages_(['settings'], 'search#query'); |
- self.verifyHistory_(['', 'search#query'], testDone); |
- }); |
-}); |
- |
-TEST_F('OptionsWebUIExtendedTest', 'ShowPageWithHistory', function() { |
- PageManager.showPageByName('search', true, {hash: '#query'}); |
- var self = this; |
- this.verifyHistory_(['', 'search#query'], function() { |
- PageManager.showPageByName('settings', true); |
- self.verifyOpenPages_(['settings'], ''); |
- self.verifyHistory_(['', 'search#query', ''], |
- testDone); |
- }); |
-}); |
- |
-TEST_F('OptionsWebUIExtendedTest', 'ShowPageReplaceHistory', function() { |
- PageManager.showPageByName('search', true, {hash: '#query'}); |
- var self = this; |
- this.verifyHistory_(['', 'search#query'], function() { |
- PageManager.showPageByName('settings', true, {'replaceState': true}); |
- self.verifyOpenPages_(['settings'], ''); |
- self.verifyHistory_(['', ''], testDone); |
- }); |
-}); |
- |
-// This should be identical to ShowPageWithHisory. |
-TEST_F('OptionsWebUIExtendedTest', 'NavigateToPage', function() { |
- PageManager.showPageByName('search', true, {hash: '#query'}); |
- var self = this; |
- this.verifyHistory_(['', 'search#query'], function() { |
- PageManager.showPageByName('settings'); |
- self.verifyOpenPages_(['settings'], ''); |
- self.verifyHistory_(['', 'search#query', ''], testDone); |
- }); |
-}); |
- |
-// Settings overlays are much more straightforward than settings pages, opening |
-// normally with none of the latter's quirks in the expected history or URL. |
-TEST_F('OptionsWebUIExtendedTest', 'ShowOverlayNoHistory', function() { |
- // Open a layer-1 overlay, not updating history. |
- PageManager.showPageByName('languages', false); |
- this.verifyOpenPages_(['settings', 'languages'], ''); |
- |
- var self = this; |
- this.verifyHistory_([''], function() { |
- // Open a layer-2 overlay for which the layer-1 is a parent, not updating |
- // history. |
- PageManager.showPageByName('addLanguage', false); |
- self.verifyOpenPages_(['settings', 'languages', 'addLanguage'], |
- ''); |
- self.verifyHistory_([''], testDone); |
- }); |
-}); |
- |
-TEST_F('OptionsWebUIExtendedTest', 'ShowOverlayWithHistory', function() { |
- // Open a layer-1 overlay, updating history. |
- PageManager.showPageByName('languages', true); |
- this.verifyOpenPages_(['settings', 'languages']); |
- |
- var self = this; |
- this.verifyHistory_(['', 'languages'], function() { |
- // Open a layer-2 overlay, updating history. |
- PageManager.showPageByName('addLanguage', true); |
- self.verifyOpenPages_(['settings', 'languages', 'addLanguage']); |
- self.verifyHistory_(['', 'languages', 'addLanguage'], testDone); |
- }); |
-}); |
- |
-TEST_F('OptionsWebUIExtendedTest', 'ShowOverlayReplaceHistory', function() { |
- // Open a layer-1 overlay, updating history. |
- PageManager.showPageByName('languages', true); |
- var self = this; |
- this.verifyHistory_(['', 'languages'], function() { |
- // Open a layer-2 overlay, replacing history. |
- PageManager.showPageByName('addLanguage', true, {'replaceState': true}); |
- self.verifyOpenPages_(['settings', 'languages', 'addLanguage']); |
- self.verifyHistory_(['', 'addLanguage'], testDone); |
- }); |
-}); |
- |
-// Directly show an overlay further above this page, i.e. one for which the |
-// current page is an ancestor but not a parent. |
-TEST_F('OptionsWebUIExtendedTest', 'ShowOverlayFurtherAbove', function() { |
- // Open a layer-2 overlay directly. |
- PageManager.showPageByName('addLanguage', true); |
- this.verifyOpenPages_(['settings', 'languages', 'addLanguage']); |
- var self = this; |
- this.verifyHistory_(['', 'addLanguage'], testDone); |
-}); |
- |
-// Directly show a layer-2 overlay for which the layer-1 overlay is not a |
-// parent. |
-TEST_F('OptionsWebUIExtendedTest', 'ShowUnrelatedOverlay', function() { |
- // Open a layer-1 overlay. |
- PageManager.showPageByName('languages', true); |
- this.verifyOpenPages_(['settings', 'languages']); |
- |
- var self = this; |
- this.verifyHistory_(['', 'languages'], function() { |
- // Open an unrelated layer-2 overlay. |
- PageManager.showPageByName('cookies', true); |
- self.verifyOpenPages_(['settings', 'content', 'cookies']); |
- self.verifyHistory_(['', 'languages', 'cookies'], testDone); |
- }); |
-}); |
- |
-// Close an overlay. |
-TEST_F('OptionsWebUIExtendedTest', 'CloseOverlay', function() { |
- // Open a layer-1 overlay, then a layer-2 overlay on top of it. |
- PageManager.showPageByName('languages', true); |
- this.verifyOpenPages_(['settings', 'languages']); |
- PageManager.showPageByName('addLanguage', true); |
- this.verifyOpenPages_(['settings', 'languages', 'addLanguage']); |
- |
- var self = this; |
- this.verifyHistory_(['', 'languages', 'addLanguage'], function() { |
- // Close the layer-2 overlay. |
- PageManager.closeOverlay(); |
- self.verifyOpenPages_(['settings', 'languages']); |
- self.verifyHistory_( |
- ['', 'languages', 'addLanguage', 'languages'], |
- function() { |
- // Close the layer-1 overlay. |
- PageManager.closeOverlay(); |
- self.verifyOpenPages_(['settings'], ''); |
- self.verifyHistory_( |
- ['', 'languages', 'addLanguage', 'languages', ''], |
- function noop() {}); |
- waitUntilHidden([$('overlay-container-1'), $('overlay-container-2')]); |
- }); |
- }); |
-}); |
- |
-// Hashes are maintained separately for each page and are preserved when |
-// overlays close. |
-TEST_F('OptionsWebUIExtendedTest', 'CloseOverlayWithHashes', function() { |
- // Open an overlay on top of the search page. |
- PageManager.showPageByName('search', true, {hash: '#1'}); |
- this.verifyOpenPages_(['settings', 'search'], 'search#1'); |
- PageManager.showPageByName('languages', true, {hash: '#2'}); |
- this.verifyOpenPages_(['settings', 'search', 'languages'], |
- 'languages#2'); |
- PageManager.showPageByName('addLanguage', true, {hash: '#3'}); |
- this.verifyOpenPages_(['settings', 'search', 'languages', 'addLanguage'], |
- 'addLanguage#3'); |
- |
- this.verifyHistory_(['', 'search#1', 'languages#2', 'addLanguage#3'], |
- function() { |
- // Close the layer-2 overlay. |
- PageManager.closeOverlay(); |
- this.verifyOpenPages_(['settings', 'search', 'languages'], 'languages#2'); |
- this.verifyHistory_( |
- ['', 'search#1', 'languages#2', 'addLanguage#3', 'languages#2'], |
- function() { |
- // Close the layer-1 overlay. |
- PageManager.closeOverlay(); |
- this.verifyOpenPages_(['settings', 'search'], 'search#1'); |
- this.verifyHistory_( |
- ['', 'search#1', 'languages#2', 'addLanguage#3', 'languages#2', |
- 'search#1'], |
- function noop() {}); |
- waitUntilHidden([$('overlay-container-1'), $('overlay-container-2')]); |
- }.bind(this)); |
- }.bind(this)); |
-}); |
- |
-// Test that closing an overlay that did not push history when opening does not |
-// again push history. |
-TEST_F('OptionsWebUIExtendedTest', 'CloseOverlayNoHistory', function() { |
- // Open the do not track confirmation prompt. |
- PageManager.showPageByName('doNotTrackConfirm', false); |
- |
- // Opening the prompt does not add to the history. |
- this.verifyHistory_([''], function() { |
- // Close the overlay. |
- PageManager.closeOverlay(); |
- // Still no history changes. |
- this.verifyHistory_([''], function noop() {}); |
- waitUntilHidden([$('overlay-container-1')]); |
- }.bind(this)); |
-}); |
- |
-// Make sure an overlay isn't closed (even temporarily) when another overlay is |
-// opened on top. |
-TEST_F('OptionsWebUIExtendedTest', 'OverlayAboveNoReset', function() { |
- // Open a layer-1 overlay. |
- PageManager.showPageByName('languages', true); |
- this.verifyOpenPages_(['settings', 'languages']); |
- |
- // Open a layer-2 overlay on top. This should not close 'languages'. |
- this.prohibitChangesToOverlay_(options.LanguageOptions.getInstance()); |
- PageManager.showPageByName('addLanguage', true); |
- this.verifyOpenPages_(['settings', 'languages', 'addLanguage']); |
- testDone(); |
-}); |
- |
-TEST_F('OptionsWebUIExtendedTest', 'OverlayTabNavigation', function() { |
- // Open a layer-1 overlay, then a layer-2 overlay on top of it. |
- PageManager.showPageByName('languages', true); |
- PageManager.showPageByName('addLanguage', true); |
- var self = this; |
- |
- // Go back twice, then forward twice. |
- self.verifyOpenPages_(['settings', 'languages', 'addLanguage']); |
- self.verifyHistory_(['', 'languages', 'addLanguage'], function() { |
- window.history.back(); |
- waitForPopstate(function() { |
- self.verifyOpenPages_(['settings', 'languages']); |
- self.verifyHistory_(['', 'languages'], function() { |
- window.history.back(); |
- waitForPopstate(function() { |
- self.verifyOpenPages_(['settings'], ''); |
- self.verifyHistory_([''], function() { |
- window.history.forward(); |
- waitForPopstate(function() { |
- self.verifyOpenPages_(['settings', 'languages']); |
- self.verifyHistory_(['', 'languages'], function() { |
- window.history.forward(); |
- waitForPopstate(function() { |
- self.verifyOpenPages_( |
- ['settings', 'languages', 'addLanguage']); |
- self.verifyHistory_( |
- ['', 'languages', 'addLanguage'], testDone); |
- }); |
- }); |
- }); |
- }); |
- }); |
- }); |
- }); |
- }); |
-}); |
- |
-// Going "back" to an overlay that's a child of the current overlay shouldn't |
-// close the current one. |
-TEST_F('OptionsWebUIExtendedTest', 'OverlayBackToChild', function() { |
- // Open a layer-1 overlay, then a layer-2 overlay on top of it. |
- PageManager.showPageByName('languages', true); |
- PageManager.showPageByName('addLanguage', true); |
- var self = this; |
- |
- self.verifyOpenPages_(['settings', 'languages', 'addLanguage']); |
- self.verifyHistory_(['', 'languages', 'addLanguage'], function() { |
- // Close the top overlay, then go back to it. |
- PageManager.closeOverlay(); |
- self.verifyOpenPages_(['settings', 'languages']); |
- self.verifyHistory_( |
- ['', 'languages', 'addLanguage', 'languages'], |
- function() { |
- // Going back to the 'addLanguage' page should not close 'languages'. |
- self.prohibitChangesToOverlay_(options.LanguageOptions.getInstance()); |
- window.history.back(); |
- waitForPopstate(function() { |
- self.verifyOpenPages_(['settings', 'languages', 'addLanguage']); |
- self.verifyHistory_(['', 'languages', 'addLanguage'], |
- testDone); |
- }); |
- }); |
- }); |
-}); |
- |
-// Going back to an unrelated overlay should close the overlay and its parent. |
-TEST_F('OptionsWebUIExtendedTest', 'OverlayBackToUnrelated', function() { |
- // Open a layer-1 overlay, then an unrelated layer-2 overlay. |
- PageManager.showPageByName('languages', true); |
- PageManager.showPageByName('cookies', true); |
- var self = this; |
- self.verifyOpenPages_(['settings', 'content', 'cookies']); |
- self.verifyHistory_(['', 'languages', 'cookies'], function() { |
- window.history.back(); |
- waitForPopstate(function() { |
- self.verifyOpenPages_(['settings', 'languages']); |
- testDone(); |
- }); |
- }); |
-}); |
- |
-// Verify history changes properly while the page is loading. |
-TEST_F('OptionsWebUIExtendedTest', 'HistoryUpdatedAfterLoading', function() { |
- var loc = location.href; |
- |
- document.documentElement.classList.add('loading'); |
- assertTrue(PageManager.isLoading()); |
- PageManager.showPageByName('searchEngines'); |
- expectNotEquals(loc, location.href); |
- |
- document.documentElement.classList.remove('loading'); |
- assertFalse(PageManager.isLoading()); |
- PageManager.showDefaultPage(); |
- expectEquals(loc, location.href); |
- |
- testDone(); |
-}); |
- |
-// A tip should be shown or hidden depending on whether this profile manages any |
-// supervised users. |
-TEST_F('OptionsWebUIExtendedTest', 'SupervisingUsers', function() { |
- // We start managing no supervised users. |
- assertTrue($('profiles-supervised-dashboard-tip').hidden); |
- |
- // Remove all supervised users, then add some, watching for the pref change |
- // notifications and UI updates in each case. Any non-empty pref dictionary |
- // is interpreted as having supervised users. |
- chrome.send('optionsTestSetPref', [SUPERVISED_USERS_PREF, {key: 'value'}]); |
- waitForResponse(BrowserOptions, 'updateManagesSupervisedUsers', function() { |
- assertFalse($('profiles-supervised-dashboard-tip').hidden); |
- chrome.send('optionsTestSetPref', [SUPERVISED_USERS_PREF, {}]); |
- waitForResponse(BrowserOptions, 'updateManagesSupervisedUsers', function() { |
- assertTrue($('profiles-supervised-dashboard-tip').hidden); |
- testDone(); |
- }); |
- }); |
-}); |
- |
-/** |
- * TestFixture that loads the options page at a bogus URL. |
- * @extends {OptionsWebUIExtendedTest} |
- * @constructor |
- */ |
-function OptionsWebUIRedirectTest() { |
- OptionsWebUIExtendedTest.call(this); |
-} |
- |
-OptionsWebUIRedirectTest.prototype = { |
- __proto__: OptionsWebUIExtendedTest.prototype, |
- |
- /** @override */ |
- browsePreload: 'chrome://settings-frame/nonexistantPage', |
-}; |
- |
-TEST_F('OptionsWebUIRedirectTest', 'TestURL', function() { |
- assertEquals('chrome://settings-frame/', document.location.href); |
- this.verifyHistory_([''], testDone); |
-}); |