Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Side by Side Diff: chrome/test/data/webui/extensions/extension_navigation_helper_test.js

Issue 2811993004: [MD Extensions] Add support for URL navigation (Closed)
Patch Set: Michael's Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 cr.define('extension_navigation_helper_tests', function() {
6 /** @enum {string} */
7 var TestNames = {
8 Basic: 'basic',
9 Conversions: 'conversions',
10 PushAndReplaceState: 'push and replace state',
11 };
12
13 /**
14 * @return {!Promise<void>} A promise that resolves after the next popstate
15 * event.
16 */
17 function getOnPopState() {
18 return new Promise(function(resolve, reject) {
19 window.addEventListener('popstate', function listener() {
20 window.removeEventListener('popstate', listener);
21 // Resolve asynchronously to allow all other listeners to run.
22 window.setTimeout(resolve, 0);
23 });
24 });
25 }
26
27 function registerTests() {
28 suite('ExtensionNavigationHelperTest', function() {
29 setup(function() {
30 PolymerTest.clearBody();
31 Polymer.dom.flush();
32 });
33
34 test(assert(TestNames.Basic), function(done) {
35 var id = 'a'.repeat(32);
36 var mock = new MockMethod();
37 var changePage = function(state) {
38 mock.recordCall([state]);
39 };
40 var navigationHelper = new extensions.NavigationHelper(changePage);
41
42 expectEquals('chrome://extensions/navigation_helper.html',
43 location.href);
44 expectDeepEquals({page: Page.LIST}, navigationHelper.getCurrentPage());
45
46 var currentLength = history.length;
47 navigationHelper.updateHistory({page: Page.DETAILS, id: id});
48 expectEquals(++currentLength, history.length);
49
50 navigationHelper.updateHistory({page: Page.ERRORS, id: id});
51 expectEquals(++currentLength, history.length);
52
53 mock.addExpectation({page: Page.DETAILS, id: id});
54 var waitForPop = getOnPopState();
55 history.back();
56 waitForPop.then(() => {
michaelpg 2017/05/01 23:41:26 I think returning this Promise will let you elimin
Devlin 2017/05/02 01:04:07 Done.
57 mock.verifyMock();
58
59 mock.addExpectation({page: Page.LIST});
60 waitForPop = getOnPopState();
michaelpg 2017/05/01 23:41:26 setting a variable in a function passed as an argu
Devlin 2017/05/02 01:04:07 waitFor*Next*Pop? :)
61 history.back();
62 return waitForPop;
63 }).then(() => {
64 mock.verifyMock();
65 done();
66 }).catch(done);
67 });
68
69 test(assert(TestNames.Conversions), function() {
70 var id = 'a'.repeat(32);
71 var stateUrlPairs = {
72 list: {
73 url: 'chrome://extensions/',
74 state: {page: Page.LIST},
75 },
76 details: {
77 url: 'chrome://extensions/?id=' + id,
78 state: {page: Page.DETAILS, id: id},
79 },
80 options: {
81 url: 'chrome://extensions/?options=' + id,
82 state: {page: Page.DETAILS, id: id, subpage: Dialog.OPTIONS},
83 },
84 errors: {
85 url: 'chrome://extensions/?errors=' + id,
86 state: {page: Page.ERRORS, id: id},
87 },
88 shortcuts: {
89 url: 'chrome://extensions/shortcuts',
90 state: {page: Page.SHORTCUTS},
91 },
92 };
93
94 var navigationHelper = new extensions.NavigationHelper(function() {});
95
96 // Test url -> state.
97 for (let key in stateUrlPairs) {
98 let entry = stateUrlPairs[key];
99 history.pushState({}, '', entry.url);
100 var currentPage = navigationHelper.getCurrentPage();
michaelpg 2017/05/01 23:41:26 unused? also, mixing var/let?
Devlin 2017/05/02 01:04:07 Removed.
101 expectDeepEquals(entry.state, navigationHelper.getCurrentPage(), key);
102 }
103
104 // Test state -> url.
105 for (let key in stateUrlPairs) {
106 let entry = stateUrlPairs[key];
107 navigationHelper.updateHistory(entry.state);
108 expectEquals(entry.url, location.href, key);
109 }
110 });
111
112 test(assert(TestNames.PushAndReplaceState), function() {
113 var id1 = 'a'.repeat(32);
114 var id2 = 'b'.repeat(32);
115 var navigationHelper = new extensions.NavigationHelper(function() {});
116
117 history.pushState({}, '', 'chrome://extensions/');
118 expectDeepEquals({page: Page.LIST}, navigationHelper.getCurrentPage());
119
120 var expectedLength = history.length;
121
122 // Navigating to a new page pushes new state.
123 navigationHelper.updateHistory({page: Page.DETAILS, id: id1});
124 expectEquals(++expectedLength, history.length);
125
126 // Navigating to a subpage (like the options page) just opens a dialog,
127 // and shouldn't push new state.
128 navigationHelper.updateHistory(
129 {page: Page.DETAILS, id: id1, subpage: Dialog.OPTIONS});
130 expectEquals(expectedLength, history.length);
131
132 // Navigating away from a subpage also shouldn't push state (it just
133 // closes the dialog).
134 navigationHelper.updateHistory({page: Page.DETAILS, id: id1});
135 expectEquals(expectedLength, history.length);
136
137 // Navigating away should push new state.
138 navigationHelper.updateHistory({page: Page.LIST});
139 expectEquals(++expectedLength, history.length);
140
141 // Navigating to a subpage of a different page should push state.
142 navigationHelper.updateHistory(
143 {page: Page.DETAILS, id: id1, subpage: Dialog.OPTIONS});
144 expectEquals(++expectedLength, history.length);
145
146 // Navigating away from a subpage to a page for a different item should
147 // push state.
148 navigationHelper.updateHistory({page: Page.DETAILS, id: id2});
149 expectEquals(++expectedLength, history.length);
150 });
151 });
152 }
153
154 return {
155 registerTests: registerTests,
156 TestNames: TestNames,
157 };
158 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698