OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** @fileoverview Suite of tests for site-list. */ | 5 /** @fileoverview Suite of tests for site-list. */ |
6 cr.define('site_list', function() { | 6 |
7 /** | |
8 * An example pref with 2 blocked location items and 2 allowed. This pref | |
9 * is also used for the All Sites category and therefore needs values for | |
10 * all types, even though some might be blank. | |
11 * @type {SiteSettingsPref} | |
12 */ | |
13 var prefs = { | |
14 exceptions: { | |
15 auto_downloads: [], | |
16 background_sync: [], | |
17 camera: [], | |
18 cookies: [], | |
19 geolocation: [ | |
20 { | |
21 embeddingOrigin: 'https://bar-allow.com:443', | |
22 origin: 'https://bar-allow.com:443', | |
23 setting: 'allow', | |
24 source: 'preference', | |
25 }, | |
26 { | |
27 embeddingOrigin: 'https://foo-allow.com:443', | |
28 origin: 'https://foo-allow.com:443', | |
29 setting: 'allow', | |
30 source: 'preference', | |
31 }, | |
32 { | |
33 embeddingOrigin: 'https://bar-block.com:443', | |
34 origin: 'https://bar-block.com:443', | |
35 setting: 'block', | |
36 source: 'preference', | |
37 }, | |
38 { | |
39 embeddingOrigin: 'https://foo-block.com:443', | |
40 origin: 'https://foo-block.com:443', | |
41 setting: 'block', | |
42 source: 'preference', | |
43 }, | |
44 ], | |
45 images: [], | |
46 javascript: [], | |
47 mic: [], | |
48 midiDevices: [], | |
49 notifications: [], | |
50 plugins: [], | |
51 protectedContent: [], | |
52 popups: [], | |
53 subresource_filter: [], | |
54 unsandboxed_plugins: [], | |
55 } | |
56 }; | |
57 | |
58 /** | |
59 * An example of prefs controlledBy policy. | |
dschuyler
2017/05/03 19:38:56
Aside from the formatting change, this comment was
| |
60 * @type {SiteSettingsPref} | |
61 */ | |
62 var prefsControlled = { | |
63 exceptions: { | |
64 plugins: [ | |
65 { | |
66 embeddingOrigin: 'http://foo-block.com', | |
67 origin: 'http://foo-block.com', | |
68 setting: 'block', | |
69 source: 'policy', | |
70 }, | |
71 ] | |
72 } | |
73 }; | |
74 | |
75 /** | |
76 * An example pref with mixed schemes (present and absent). | |
77 * @type {SiteSettingsPref} | |
78 */ | |
79 var prefsMixedSchemes = { | |
80 exceptions: { | |
81 geolocation: [ | |
82 { | |
83 embeddingOrigin: 'https://foo-allow.com', | |
84 origin: 'https://foo-allow.com', | |
85 setting: 'allow', | |
86 source: 'preference', | |
87 }, | |
88 { | |
89 embeddingOrigin: 'bar-allow.com', | |
90 origin: 'bar-allow.com', | |
91 setting: 'allow', | |
92 source: 'preference', | |
93 }, | |
94 ] | |
95 } | |
96 }; | |
97 | |
98 | |
99 /** | |
100 * An example pref with exceptions with origins and patterns from | |
101 * different providers. | |
102 * @type {SiteSettingsPref} | |
103 */ | |
104 var prefsMixedProvider = { | |
105 exceptions: { | |
106 geolocation: [ | |
107 { | |
108 embeddingOrigin: 'https://[*.]foo.com', | |
109 origin: 'https://[*.]foo.com', | |
110 setting: 'block', | |
111 source: 'policy', | |
112 }, | |
113 { | |
114 embeddingOrigin: 'https://bar.foo.com', | |
115 origin: 'https://bar.foo.com', | |
116 setting: 'block', | |
117 source: 'preference', | |
118 }, | |
119 { | |
120 embeddingOrigin: 'https://[*.]foo.com', | |
121 origin: 'https://[*.]foo.com', | |
122 setting: 'block', | |
123 source: 'preference', | |
124 }, | |
125 ] | |
126 } | |
127 }; | |
128 | |
129 /** | |
130 * An example pref with mixed origin and pattern. | |
131 * @type {SiteSettingsPref} | |
132 */ | |
133 var prefsMixedOriginAndPattern = { | |
134 exceptions: { | |
135 auto_downloads: [], | |
136 background_sync: [], | |
137 camera: [], | |
138 cookies: [], | |
139 geolocation: [ | |
140 { | |
141 origin: 'https://foo.com', | |
142 embeddingOrigin: '*', | |
143 setting: 'allow', | |
144 source: 'preference', | |
145 }, | |
146 ], | |
147 images: [], | |
148 javascript: [ | |
149 { | |
150 origin: 'https://[*.]foo.com', | |
151 embeddingOrigin: '*', | |
152 setting: 'allow', | |
153 source: 'preference', | |
154 }, | |
155 ], | |
156 mic: [], | |
157 notifications: [], | |
158 plugins: [], | |
159 midiDevices: [], | |
160 protectedContent: [], | |
161 popups: [], | |
162 subresource_filter: [], | |
163 unsandboxed_plugins: [], | |
164 } | |
165 }; | |
166 | |
167 /** | |
168 * An example pref with multiple categories and multiple allow/block | |
169 * state. | |
170 * @type {SiteSettingsPref} | |
171 */ | |
172 var prefsVarious = { | |
173 exceptions: { | |
174 auto_downloads: [], | |
175 background_sync: [], | |
176 camera: [], | |
177 cookies: [], | |
178 geolocation: [ | |
179 { | |
180 embeddingOrigin: 'https://foo.com', | |
181 incognito: false, | |
182 origin: 'https://foo.com', | |
183 setting: 'allow', | |
184 source: 'preference', | |
185 }, | |
186 { | |
187 embeddingOrigin: 'https://bar.com', | |
188 incognito: false, | |
189 origin: 'https://bar.com', | |
190 setting: 'block', | |
191 source: 'preference', | |
192 }, | |
193 ], | |
194 images: [], | |
195 javascript: [], | |
196 mic: [], | |
197 midiDevices: [], | |
198 notifications: [ | |
199 { | |
200 embeddingOrigin: 'https://google.com', | |
201 incognito: false, | |
202 origin: 'https://google.com', | |
203 setting: 'block', | |
204 source: 'preference', | |
205 }, | |
206 { | |
207 embeddingOrigin: 'https://bar.com', | |
208 incognito: false, | |
209 origin: 'https://bar.com', | |
210 setting: 'block', | |
211 source: 'preference', | |
212 }, | |
213 { | |
214 embeddingOrigin: 'https://foo.com', | |
215 incognito: false, | |
216 origin: 'https://foo.com', | |
217 setting: 'block', | |
218 source: 'preference', | |
219 }, | |
220 ], | |
221 plugins: [], | |
222 protectedContent: [], | |
223 popups: [], | |
224 subresource_filter: [], | |
225 unsandboxed_plugins: [], | |
226 } | |
227 }; | |
228 | |
229 /** | |
230 * An example pref with 1 allowed location item. | |
231 * @type {SiteSettingsPref} | |
232 */ | |
233 var prefsOneEnabled = { | |
234 exceptions: { | |
235 geolocation: [ | |
236 { | |
237 embeddingOrigin: 'https://foo-allow.com:443', | |
238 incognito: false, | |
239 origin: 'https://foo-allow.com:443', | |
240 setting: 'allow', | |
241 source: 'preference', | |
242 }, | |
243 ] | |
244 } | |
245 }; | |
246 | |
247 /** | |
248 * An example pref with 1 blocked location item. | |
249 * @type {SiteSettingsPref} | |
250 */ | |
251 var prefsOneDisabled = { | |
252 exceptions: { | |
253 geolocation: [ | |
254 { | |
255 embeddingOrigin: 'https://foo-block.com:443', | |
256 incognito: false, | |
257 origin: 'https://foo-block.com:443', | |
258 setting: 'block', | |
259 source: 'preference', | |
260 }, | |
261 ] | |
262 } | |
263 }; | |
264 | |
265 /** | |
266 * An example Cookies pref with 1 in each of the three categories. | |
267 * @type {SiteSettingsPref} | |
268 */ | |
269 var prefsSessionOnly = { | |
270 exceptions: { | |
271 cookies: [ | |
272 { | |
273 embeddingOrigin: 'http://foo-block.com', | |
274 incognito: false, | |
275 origin: 'http://foo-block.com', | |
276 setting: 'block', | |
277 source: 'preference', | |
278 }, | |
279 { | |
280 embeddingOrigin: 'http://foo-allow.com', | |
281 incognito: false, | |
282 origin: 'http://foo-allow.com', | |
283 setting: 'allow', | |
284 source: 'preference', | |
285 }, | |
286 { | |
287 embeddingOrigin: 'http://foo-session.com', | |
288 incognito: false, | |
289 origin: 'http://foo-session.com', | |
290 setting: 'session_only', | |
291 source: 'preference', | |
292 }, | |
293 ] | |
294 } | |
295 }; | |
296 | |
297 /** | |
298 * An example Cookies pref with mixed incognito and regular settings. | |
299 * @type {SiteSettingsPref} | |
300 */ | |
301 var prefsIncognito = { | |
302 exceptions: { | |
303 cookies: [ | |
304 // foo.com is blocked for regular sessions. | |
305 { | |
306 embeddingOrigin: 'http://foo.com', | |
307 incognito: false, | |
308 origin: 'http://foo.com', | |
309 setting: 'block', | |
310 source: 'preference', | |
311 }, | |
312 // bar.com is an allowed incognito item without an embedder. | |
313 { | |
314 embeddingOrigin: '', | |
315 incognito: true, | |
316 origin: 'http://bar.com', | |
317 setting: 'allow', | |
318 source: 'preference', | |
319 }, | |
320 // foo.com is allowed in incognito (overridden). | |
321 { | |
322 embeddingOrigin: 'http://foo.com', | |
323 incognito: true, | |
324 origin: 'http://foo.com', | |
325 setting: 'allow', | |
326 source: 'preference', | |
327 }, | |
328 | |
329 ] | |
330 } | |
331 }; | |
332 | |
333 /** | |
334 * An example Javascript pref with a chrome-extension:// scheme. | |
335 * @type {SiteSettingsPref} | |
336 */ | |
337 var prefsChromeExtension = { | |
338 exceptions: { | |
339 javascript: [ | |
340 { | |
341 embeddingOrigin: '', | |
342 incognito: false, | |
343 origin: 'chrome-extension://cfhgfbfpcbnnbibfphagcjmgjfjmojfa/', | |
344 setting: 'block', | |
345 source: 'preference', | |
346 }, | |
347 ] | |
348 } | |
349 }; | |
350 | |
351 | |
352 suite('SiteList', function() { | |
7 /** | 353 /** |
8 * An example pref with 2 blocked location items and 2 allowed. This pref | 354 * A site list element created before each test. |
9 * is also used for the All Sites category and therefore needs values for | 355 * @type {SiteList} |
10 * all types, even though some might be blank. | |
11 * @type {SiteSettingsPref} | |
12 */ | 356 */ |
13 var prefs = { | 357 var testElement; |
14 exceptions: { | 358 |
15 auto_downloads: [], | 359 /** |
16 background_sync: [], | 360 * The mock proxy object to use during test. |
17 camera: [], | 361 * @type {TestSiteSettingsPrefsBrowserProxy} |
18 cookies: [], | 362 */ |
19 geolocation: [ | 363 var browserProxy = null; |
20 { | 364 |
21 embeddingOrigin: 'https://bar-allow.com:443', | 365 |
22 origin: 'https://bar-allow.com:443', | 366 suiteSetup(function() { |
23 setting: 'allow', | 367 CrSettingsPrefs.setInitialized(); |
24 source: 'preference', | 368 }); |
25 }, | 369 |
26 { | 370 suiteTeardown(function() { |
27 embeddingOrigin: 'https://foo-allow.com:443', | 371 CrSettingsPrefs.resetForTesting(); |
28 origin: 'https://foo-allow.com:443', | 372 }); |
29 setting: 'allow', | 373 |
30 source: 'preference', | 374 // Initialize a site-list before each test. |
31 }, | 375 setup(function() { |
32 { | 376 browserProxy = new TestSiteSettingsPrefsBrowserProxy(); |
33 embeddingOrigin: 'https://bar-block.com:443', | 377 settings.SiteSettingsPrefsBrowserProxyImpl.instance_ = browserProxy; |
34 origin: 'https://bar-block.com:443', | 378 PolymerTest.clearBody(); |
35 setting: 'block', | 379 testElement = document.createElement('site-list'); |
36 source: 'preference', | 380 document.body.appendChild(testElement); |
37 }, | 381 }); |
38 { | 382 |
39 embeddingOrigin: 'https://foo-block.com:443', | 383 teardown(function() { |
40 origin: 'https://foo-block.com:443', | 384 closeActionMenu(); |
41 setting: 'block', | 385 // The code being tested changes the Route. Reset so that state is not |
42 source: 'preference', | 386 // leaked across tests. |
43 }, | 387 settings.resetRouteForTesting(); |
44 ], | 388 }); |
45 images: [], | 389 |
46 javascript: [], | 390 /** |
47 mic: [], | 391 * Opens the action menu for a particular element in the list. |
48 midiDevices: [], | 392 * @param {number} index The index of the child element (which site) to |
49 notifications: [], | 393 * open the action menu for. |
50 plugins: [], | 394 */ |
51 protectedContent: [], | 395 function openActionMenu(index) { |
52 popups: [], | 396 var item = testElement.$.listContainer.children[index]; |
53 subresource_filter: [], | 397 var dots = item.querySelector('#actionMenuButton'); |
54 unsandboxed_plugins: [], | 398 MockInteractions.tap(dots); |
399 Polymer.dom.flush(); | |
400 } | |
401 | |
402 /** Closes the action menu. */ | |
403 function closeActionMenu() { | |
404 var menu = testElement.$$('dialog[is=cr-action-menu]'); | |
405 if (menu.open) | |
406 menu.close(); | |
407 } | |
408 | |
409 /** | |
410 * Asserts the menu looks as expected. | |
411 * @param {Array<string>} items The items expected to show in the menu. | |
412 */ | |
413 function assertMenu(items) { | |
414 var menu = testElement.$$('dialog[is=cr-action-menu]'); | |
415 assertTrue(!!menu); | |
416 var menuItems = menu.querySelectorAll('button:not([hidden])'); | |
417 assertEquals(items.length, menuItems.length); | |
418 for (var i = 0; i < items.length; i++) | |
419 assertEquals(items[i], menuItems[i].textContent.trim()); | |
420 } | |
421 | |
422 /** | |
423 * @param {HTMLElement} listContainer Node with the exceptions listed. | |
424 * @return {boolean} Whether the entry is incognito only. | |
425 */ | |
426 function hasAnIncognito(listContainer) { | |
427 var descriptions = listContainer.querySelectorAll('#siteDescription'); | |
428 for (var i = 0; i < descriptions.length; ++i) { | |
429 if (descriptions[i].textContent == 'Current incognito session') | |
430 return true; | |
55 } | 431 } |
56 }; | 432 return false; |
433 } | |
57 | 434 |
58 /** | 435 /** |
59 * An example of prefs controlleBy policy. | 436 * Configures the test element for a particular category. |
60 * @type {SiteSettingsPref} | 437 * @param {settings.ContentSettingsTypes} category The category to set up. |
438 * @param {settings.PermissionValues} subtype Type of list to use. | |
439 * @param {Array<dictionary>} prefs The prefs to use. | |
61 */ | 440 */ |
62 var prefsControlled = { | 441 function setUpCategory(category, subtype, prefs) { |
63 exceptions: { | 442 browserProxy.setPrefs(prefs); |
64 plugins: [ | 443 if (category == settings.ALL_SITES) { |
65 { | 444 testElement.categorySubtype = settings.INVALID_CATEGORY_SUBTYPE; |
66 embeddingOrigin: 'http://foo-block.com', | 445 testElement.allSites = true; |
67 origin: 'http://foo-block.com', | 446 } else { |
68 setting: 'block', | 447 testElement.categorySubtype = subtype; |
69 source: 'policy', | 448 testElement.allSites = false; |
70 }, | |
71 ] | |
72 } | 449 } |
73 }; | 450 // Some route is needed, but the actual route doesn't matter. |
74 | 451 testElement.currentRoute = { |
75 /** | 452 page: 'dummy', |
76 * An example pref with mixed schemes (present and absent). | 453 section: 'privacy', |
77 * @type {SiteSettingsPref} | 454 subpage: ['site-settings', 'site-settings-category-location'], |
78 */ | 455 }; |
79 var prefsMixedSchemes = { | 456 testElement.category = category; |
80 exceptions: { | 457 } |
81 geolocation: [ | 458 |
82 { | 459 test('read-only attribute', function() { |
83 embeddingOrigin: 'https://foo-allow.com', | 460 setUpCategory( |
84 origin: 'https://foo-allow.com', | 461 settings.ContentSettingsTypes.GEOLOCATION, |
85 setting: 'allow', | 462 settings.PermissionValues.ALLOW, prefsVarious); |
86 source: 'preference', | 463 return browserProxy.whenCalled('getExceptionList') |
87 }, | 464 .then(function(contentType) { |
88 { | 465 // Flush to be sure list container is populated. |
89 embeddingOrigin: 'bar-allow.com', | 466 Polymer.dom.flush(); |
90 origin: 'bar-allow.com', | 467 var dotsMenu = |
91 setting: 'allow', | 468 testElement.$.listContainer.querySelector('#actionMenuButton'); |
92 source: 'preference', | 469 assertFalse(dotsMenu.hidden); |
93 }, | 470 testElement.setAttribute('read-only-list', true); |
94 ] | 471 Polymer.dom.flush(); |
95 } | 472 assertTrue(dotsMenu.hidden); |
96 }; | 473 testElement.removeAttribute('read-only-list'); |
97 | 474 Polymer.dom.flush(); |
98 | 475 assertFalse(dotsMenu.hidden); |
99 /** | 476 }); |
100 * An example pref with exceptions with origins and patterns from | 477 }); |
101 * different providers. | 478 |
102 * @type {SiteSettingsPref} | 479 test('getExceptionList API used', function() { |
103 */ | 480 setUpCategory( |
104 var prefsMixedProvider = { | 481 settings.ContentSettingsTypes.GEOLOCATION, |
105 exceptions: { | 482 settings.PermissionValues.ALLOW, prefsEmpty); |
106 geolocation: [ | 483 return browserProxy.whenCalled('getExceptionList') |
107 { | 484 .then(function(contentType) { |
108 embeddingOrigin: 'https://[*.]foo.com', | 485 assertEquals(settings.ContentSettingsTypes.GEOLOCATION, contentType); |
109 origin: 'https://[*.]foo.com', | 486 }); |
110 setting: 'block', | 487 }); |
111 source: 'policy', | 488 |
112 }, | 489 test('Empty list', function() { |
113 { | 490 setUpCategory( |
114 embeddingOrigin: 'https://bar.foo.com', | 491 settings.ContentSettingsTypes.GEOLOCATION, |
115 origin: 'https://bar.foo.com', | 492 settings.PermissionValues.ALLOW, prefsEmpty); |
116 setting: 'block', | 493 return browserProxy.whenCalled('getExceptionList') |
117 source: 'preference', | 494 .then(function(contentType) { |
118 }, | 495 assertEquals(settings.ContentSettingsTypes.GEOLOCATION, contentType); |
119 { | 496 |
120 embeddingOrigin: 'https://[*.]foo.com', | 497 assertEquals(0, testElement.sites.length); |
121 origin: 'https://[*.]foo.com', | 498 |
122 setting: 'block', | 499 assertEquals( |
123 source: 'preference', | 500 settings.PermissionValues.ALLOW, testElement.categorySubtype); |
124 }, | 501 |
125 ] | 502 assertFalse(testElement.$.category.hidden); |
126 } | 503 }); |
127 }; | 504 }); |
128 | 505 |
129 /** | 506 test('initial ALLOW state is correct', function() { |
130 * An example pref with mixed origin and pattern. | 507 setUpCategory( |
131 * @type {SiteSettingsPref} | 508 settings.ContentSettingsTypes.GEOLOCATION, |
132 */ | 509 settings.PermissionValues.ALLOW, prefs); |
133 var prefsMixedOriginAndPattern = { | 510 return browserProxy.whenCalled('getExceptionList') |
134 exceptions: { | 511 .then(function(contentType) { |
135 auto_downloads: [], | 512 assertEquals(settings.ContentSettingsTypes.GEOLOCATION, contentType); |
136 background_sync: [], | 513 |
137 camera: [], | 514 assertEquals(2, testElement.sites.length); |
138 cookies: [], | 515 assertEquals( |
139 geolocation: [ | 516 prefs.exceptions.geolocation[0].origin, |
140 { | 517 testElement.sites[0].origin); |
141 origin: 'https://foo.com', | 518 assertEquals( |
142 embeddingOrigin: '*', | 519 prefs.exceptions.geolocation[1].origin, |
143 setting: 'allow', | 520 testElement.sites[1].origin); |
144 source: 'preference', | 521 assertEquals( |
145 }, | 522 settings.PermissionValues.ALLOW, testElement.categorySubtype); |
146 ], | |
147 images: [], | |
148 javascript: [ | |
149 { | |
150 origin: 'https://[*.]foo.com', | |
151 embeddingOrigin: '*', | |
152 setting: 'allow', | |
153 source: 'preference', | |
154 }, | |
155 ], | |
156 mic: [], | |
157 notifications: [], | |
158 plugins: [], | |
159 midiDevices: [], | |
160 protectedContent: [], | |
161 popups: [], | |
162 subresource_filter: [], | |
163 unsandboxed_plugins: [], | |
164 } | |
165 }; | |
166 | |
167 /** | |
168 * An example pref with multiple categories and multiple allow/block | |
169 * state. | |
170 * @type {SiteSettingsPref} | |
171 */ | |
172 var prefsVarious = { | |
173 exceptions: { | |
174 auto_downloads: [], | |
175 background_sync: [], | |
176 camera: [], | |
177 cookies: [], | |
178 geolocation: [ | |
179 { | |
180 embeddingOrigin: 'https://foo.com', | |
181 incognito: false, | |
182 origin: 'https://foo.com', | |
183 setting: 'allow', | |
184 source: 'preference', | |
185 }, | |
186 { | |
187 embeddingOrigin: 'https://bar.com', | |
188 incognito: false, | |
189 origin: 'https://bar.com', | |
190 setting: 'block', | |
191 source: 'preference', | |
192 }, | |
193 ], | |
194 images: [], | |
195 javascript: [], | |
196 mic: [], | |
197 midiDevices: [], | |
198 notifications: [ | |
199 { | |
200 embeddingOrigin: 'https://google.com', | |
201 incognito: false, | |
202 origin: 'https://google.com', | |
203 setting: 'block', | |
204 source: 'preference', | |
205 }, | |
206 { | |
207 embeddingOrigin: 'https://bar.com', | |
208 incognito: false, | |
209 origin: 'https://bar.com', | |
210 setting: 'block', | |
211 source: 'preference', | |
212 }, | |
213 { | |
214 embeddingOrigin: 'https://foo.com', | |
215 incognito: false, | |
216 origin: 'https://foo.com', | |
217 setting: 'block', | |
218 source: 'preference', | |
219 }, | |
220 ], | |
221 plugins: [], | |
222 protectedContent: [], | |
223 popups: [], | |
224 subresource_filter: [], | |
225 unsandboxed_plugins: [], | |
226 } | |
227 }; | |
228 | |
229 /** | |
230 * An example pref with 1 allowed location item. | |
231 * @type {SiteSettingsPref} | |
232 */ | |
233 var prefsOneEnabled = { | |
234 exceptions: { | |
235 geolocation: [ | |
236 { | |
237 embeddingOrigin: 'https://foo-allow.com:443', | |
238 incognito: false, | |
239 origin: 'https://foo-allow.com:443', | |
240 setting: 'allow', | |
241 source: 'preference', | |
242 }, | |
243 ] | |
244 } | |
245 }; | |
246 | |
247 /** | |
248 * An example pref with 1 blocked location item. | |
249 * @type {SiteSettingsPref} | |
250 */ | |
251 var prefsOneDisabled = { | |
252 exceptions: { | |
253 geolocation: [ | |
254 { | |
255 embeddingOrigin: 'https://foo-block.com:443', | |
256 incognito: false, | |
257 origin: 'https://foo-block.com:443', | |
258 setting: 'block', | |
259 source: 'preference', | |
260 }, | |
261 ] | |
262 } | |
263 }; | |
264 | |
265 /** | |
266 * An example Cookies pref with 1 in each of the three categories. | |
267 * @type {SiteSettingsPref} | |
268 */ | |
269 var prefsSessionOnly = { | |
270 exceptions: { | |
271 cookies: [ | |
272 { | |
273 embeddingOrigin: 'http://foo-block.com', | |
274 incognito: false, | |
275 origin: 'http://foo-block.com', | |
276 setting: 'block', | |
277 source: 'preference', | |
278 }, | |
279 { | |
280 embeddingOrigin: 'http://foo-allow.com', | |
281 incognito: false, | |
282 origin: 'http://foo-allow.com', | |
283 setting: 'allow', | |
284 source: 'preference', | |
285 }, | |
286 { | |
287 embeddingOrigin: 'http://foo-session.com', | |
288 incognito: false, | |
289 origin: 'http://foo-session.com', | |
290 setting: 'session_only', | |
291 source: 'preference', | |
292 }, | |
293 ] | |
294 } | |
295 }; | |
296 | |
297 /** | |
298 * An example Cookies pref with mixed incognito and regular settings. | |
299 * @type {SiteSettingsPref} | |
300 */ | |
301 var prefsIncognito = { | |
302 exceptions: { | |
303 cookies: [ | |
304 // foo.com is blocked for regular sessions. | |
305 { | |
306 embeddingOrigin: 'http://foo.com', | |
307 incognito: false, | |
308 origin: 'http://foo.com', | |
309 setting: 'block', | |
310 source: 'preference', | |
311 }, | |
312 // bar.com is an allowed incognito item without an embedder. | |
313 { | |
314 embeddingOrigin: '', | |
315 incognito: true, | |
316 origin: 'http://bar.com', | |
317 setting: 'allow', | |
318 source: 'preference', | |
319 }, | |
320 // foo.com is allowed in incognito (overridden). | |
321 { | |
322 embeddingOrigin: 'http://foo.com', | |
323 incognito: true, | |
324 origin: 'http://foo.com', | |
325 setting: 'allow', | |
326 source: 'preference', | |
327 }, | |
328 | |
329 ] | |
330 } | |
331 }; | |
332 | |
333 /** | |
334 * An example Javascript pref with a chrome-extension:// scheme. | |
335 * @type {SiteSettingsPref} | |
336 */ | |
337 var prefsChromeExtension = { | |
338 exceptions: { | |
339 javascript: [ | |
340 { | |
341 embeddingOrigin: '', | |
342 incognito: false, | |
343 origin: 'chrome-extension://cfhgfbfpcbnnbibfphagcjmgjfjmojfa/', | |
344 setting: 'block', | |
345 source: 'preference', | |
346 }, | |
347 ] | |
348 } | |
349 }; | |
350 | |
351 function registerTests() { | |
352 suite('SiteList', function() { | |
353 /** | |
354 * A site list element created before each test. | |
355 * @type {SiteList} | |
356 */ | |
357 var testElement; | |
358 | |
359 /** | |
360 * The mock proxy object to use during test. | |
361 * @type {TestSiteSettingsPrefsBrowserProxy} | |
362 */ | |
363 var browserProxy = null; | |
364 | |
365 | |
366 suiteSetup(function() { | |
367 CrSettingsPrefs.setInitialized(); | |
368 }); | |
369 | |
370 suiteTeardown(function() { | |
371 CrSettingsPrefs.resetForTesting(); | |
372 }); | |
373 | |
374 // Initialize a site-list before each test. | |
375 setup(function() { | |
376 browserProxy = new TestSiteSettingsPrefsBrowserProxy(); | |
377 settings.SiteSettingsPrefsBrowserProxyImpl.instance_ = browserProxy; | |
378 PolymerTest.clearBody(); | |
379 testElement = document.createElement('site-list'); | |
380 document.body.appendChild(testElement); | |
381 }); | |
382 | |
383 teardown(function() { | |
384 closeActionMenu(); | |
385 // The code being tested changes the Route. Reset so that state is not | |
386 // leaked across tests. | |
387 settings.resetRouteForTesting(); | |
388 }); | |
389 | |
390 /** | |
391 * Opens the action menu for a particular element in the list. | |
392 * @param {number} index The index of the child element (which site) to | |
393 * open the action menu for. | |
394 */ | |
395 function openActionMenu(index) { | |
396 var item = testElement.$.listContainer.children[index]; | |
397 var dots = item.querySelector('#actionMenuButton'); | |
398 MockInteractions.tap(dots); | |
399 Polymer.dom.flush(); | |
400 } | |
401 | |
402 /** Closes the action menu. */ | |
403 function closeActionMenu() { | |
404 var menu = testElement.$$('dialog[is=cr-action-menu]'); | |
405 if (menu.open) | |
406 menu.close(); | |
407 } | |
408 | |
409 /** | |
410 * Asserts the menu looks as expected. | |
411 * @param {Array<string>} items The items expected to show in the menu. | |
412 */ | |
413 function assertMenu(items) { | |
414 var menu = testElement.$$('dialog[is=cr-action-menu]'); | |
415 assertTrue(!!menu); | |
416 var menuItems = menu.querySelectorAll('button:not([hidden])'); | |
417 assertEquals(items.length, menuItems.length); | |
418 for (var i = 0; i < items.length; i++) | |
419 assertEquals(items[i], menuItems[i].textContent.trim()); | |
420 } | |
421 | |
422 /** | |
423 * @param {HTMLElement} listContainer Node with the exceptions listed. | |
424 * @return {boolean} Whether the entry is incognito only. | |
425 */ | |
426 function hasAnIncognito(listContainer) { | |
427 var descriptions = listContainer.querySelectorAll('#siteDescription'); | |
428 for (var i = 0; i < descriptions.length; ++i) { | |
429 if (descriptions[i].textContent == 'Current incognito session') | |
430 return true; | |
431 } | |
432 return false; | |
433 } | |
434 | |
435 /** | |
436 * Configures the test element for a particular category. | |
437 * @param {settings.ContentSettingsTypes} category The category to set up. | |
438 * @param {settings.PermissionValues} subtype Type of list to use. | |
439 * @param {Array<dictionary>} prefs The prefs to use. | |
440 */ | |
441 function setUpCategory(category, subtype, prefs) { | |
442 browserProxy.setPrefs(prefs); | |
443 if (category == settings.ALL_SITES) { | |
444 testElement.categorySubtype = settings.INVALID_CATEGORY_SUBTYPE; | |
445 testElement.allSites = true; | |
446 } else { | |
447 testElement.categorySubtype = subtype; | |
448 testElement.allSites = false; | |
449 } | |
450 // Some route is needed, but the actual route doesn't matter. | |
451 testElement.currentRoute = { | |
452 page: 'dummy', | |
453 section: 'privacy', | |
454 subpage: ['site-settings', 'site-settings-category-location'], | |
455 }; | |
456 testElement.category = category; | |
457 } | |
458 | |
459 test('read-only attribute', function() { | |
460 setUpCategory( | |
461 settings.ContentSettingsTypes.GEOLOCATION, | |
462 settings.PermissionValues.ALLOW, prefsVarious); | |
463 return browserProxy.whenCalled('getExceptionList') | |
464 .then(function(contentType) { | |
465 // Flush to be sure list container is populated. | |
466 Polymer.dom.flush(); | |
467 var dotsMenu = testElement.$.listContainer.querySelector( | |
468 '#actionMenuButton'); | |
469 assertFalse(dotsMenu.hidden); | |
470 testElement.setAttribute('read-only-list', true); | |
471 Polymer.dom.flush(); | |
472 assertTrue(dotsMenu.hidden); | |
473 testElement.removeAttribute('read-only-list'); | |
474 Polymer.dom.flush(); | |
475 assertFalse(dotsMenu.hidden); | |
476 }); | |
477 }); | |
478 | |
479 test('getExceptionList API used', function() { | |
480 setUpCategory(settings.ContentSettingsTypes.GEOLOCATION, | |
481 settings.PermissionValues.ALLOW, prefsEmpty); | |
482 return browserProxy.whenCalled('getExceptionList').then( | |
483 function(contentType) { | |
484 assertEquals( | |
485 settings.ContentSettingsTypes.GEOLOCATION, contentType); | |
486 }); | |
487 }); | |
488 | |
489 test('Empty list', function() { | |
490 setUpCategory(settings.ContentSettingsTypes.GEOLOCATION, | |
491 settings.PermissionValues.ALLOW, prefsEmpty); | |
492 return browserProxy.whenCalled('getExceptionList').then( | |
493 function(contentType) { | |
494 assertEquals( | |
495 settings.ContentSettingsTypes.GEOLOCATION, contentType); | |
496 | |
497 assertEquals(0, testElement.sites.length); | |
498 | |
499 assertEquals( | |
500 settings.PermissionValues.ALLOW, testElement.categorySubtype); | |
501 | |
502 assertFalse(testElement.$.category.hidden); | |
503 }); | |
504 }); | |
505 | |
506 test('initial ALLOW state is correct', function() { | |
507 setUpCategory(settings.ContentSettingsTypes.GEOLOCATION, | |
508 settings.PermissionValues.ALLOW, prefs); | |
509 return browserProxy.whenCalled('getExceptionList').then( | |
510 function(contentType) { | |
511 assertEquals( | |
512 settings.ContentSettingsTypes.GEOLOCATION, contentType); | |
513 | |
514 assertEquals(2, testElement.sites.length); | |
515 assertEquals(prefs.exceptions.geolocation[0].origin, | |
516 testElement.sites[0].origin); | |
517 assertEquals(prefs.exceptions.geolocation[1].origin, | |
518 testElement.sites[1].origin); | |
519 assertEquals( | |
520 settings.PermissionValues.ALLOW, testElement.categorySubtype); | |
521 Polymer.dom.flush(); // Populates action menu. | |
522 openActionMenu(0); | |
523 assertMenu(['Block', 'Edit', 'Remove'], testElement); | |
524 | |
525 assertFalse(testElement.$.category.hidden); | |
526 }); | |
527 }); | |
528 | |
529 test('action menu closes when list changes', function() { | |
530 setUpCategory(settings.ContentSettingsTypes.GEOLOCATION, | |
531 settings.PermissionValues.ALLOW, prefs); | |
532 var actionMenu = testElement.$$('dialog[is=cr-action-menu]'); | |
533 return browserProxy.whenCalled('getExceptionList').then( | |
534 function(contentType) { | |
535 Polymer.dom.flush(); // Populates action menu. | |
536 openActionMenu(0); | |
537 assertTrue(actionMenu.open); | |
538 | |
539 browserProxy.resetResolver('getExceptionList'); | |
540 // Simulate a change in the underlying model. | |
541 cr.webUIListenerCallback( | |
542 'contentSettingSitePermissionChanged', | |
543 settings.ContentSettingsTypes.GEOLOCATION); | |
544 return browserProxy.whenCalled('getExceptionList'); | |
545 }).then(function() { | |
546 // Check that the action menu was closed. | |
547 assertFalse(actionMenu.open); | |
548 }); | |
549 }); | |
550 | |
551 test('exceptions are not reordered in non-ALL_SITES', function() { | |
552 setUpCategory(settings.ContentSettingsTypes.GEOLOCATION, | |
553 settings.PermissionValues.BLOCK, prefsMixedProvider); | |
554 return browserProxy.whenCalled('getExceptionList') | |
555 .then(function(contentType) { | |
556 assertEquals( | |
557 settings.ContentSettingsTypes.GEOLOCATION, contentType); | |
558 | |
559 assertEquals(3, testElement.sites.length); | |
560 for(var i = 0; i < 3; i++) { | |
561 assertEquals( | |
562 prefsMixedProvider.exceptions.geolocation[0].origin, | |
563 testElement.sites[0].origin); | |
564 assertEquals( | |
565 kControlledByLookup | |
566 [prefsMixedProvider.exceptions.geolocation[0].source], | |
567 testElement.sites[0].controlledBy); | |
568 } | |
569 }); | |
570 }); | |
571 | |
572 test('initial BLOCK state is correct', function() { | |
573 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
574 var categorySubtype = settings.PermissionValues.BLOCK; | |
575 setUpCategory(contentType, categorySubtype, prefs); | |
576 return browserProxy.whenCalled('getExceptionList').then( | |
577 function(actualContentType) { | |
578 assertEquals(contentType, actualContentType); | |
579 assertEquals(categorySubtype, testElement.categorySubtype); | |
580 | |
581 assertEquals(2, testElement.sites.length); | |
582 assertEquals( | |
583 prefs.exceptions.geolocation[2].origin, | |
584 testElement.sites[0].origin); | |
585 assertEquals( | |
586 prefs.exceptions.geolocation[3].origin, | |
587 testElement.sites[1].origin); | |
588 Polymer.dom.flush(); // Populates action menu. | |
589 openActionMenu(0); | |
590 assertMenu(['Allow', 'Edit', 'Remove'], testElement); | |
591 | |
592 assertFalse(testElement.$.category.hidden); | |
593 }); | |
594 }); | |
595 | |
596 test('initial SESSION ONLY state is correct', function() { | |
597 var contentType = settings.ContentSettingsTypes.COOKIES; | |
598 var categorySubtype = settings.PermissionValues.SESSION_ONLY; | |
599 setUpCategory(contentType, categorySubtype, prefsSessionOnly); | |
600 return browserProxy.whenCalled('getExceptionList').then( | |
601 function(actualContentType) { | |
602 assertEquals(contentType, actualContentType); | |
603 assertEquals(categorySubtype, testElement.categorySubtype); | |
604 | |
605 assertEquals(1, testElement.sites.length); | |
606 assertEquals( | |
607 prefsSessionOnly.exceptions.cookies[2].origin, | |
608 testElement.sites[0].origin); | |
609 | |
610 Polymer.dom.flush(); // Populates action menu. | |
611 openActionMenu(0); | |
612 assertMenu(['Allow', 'Block', 'Edit', 'Remove'], testElement); | |
613 | |
614 assertFalse(testElement.$.category.hidden); | |
615 }); | |
616 }); | |
617 | |
618 test('update lists for incognito', function() { | |
619 var contentType = settings.ContentSettingsTypes.PLUGINS; | |
620 var categorySubtype = settings.PermissionValues.BLOCK; | |
621 setUpCategory(contentType, categorySubtype, prefsControlled); | |
622 var list = testElement.$.listContainer; | |
623 return browserProxy.whenCalled('getExceptionList') | |
624 .then(function(actualContentType) { | |
625 Polymer.dom.flush(); | |
626 assertEquals(1, list.querySelectorAll('.list-item').length); | |
627 assertFalse(hasAnIncognito(list)); | |
628 browserProxy.resetResolver('getExceptionList'); | |
629 browserProxy.setIncognito(true); | |
630 return browserProxy.whenCalled('getExceptionList'); | |
631 }) | |
632 .then(function() { | |
633 Polymer.dom.flush(); | |
634 assertEquals(2, list.querySelectorAll('.list-item').length); | |
635 assertTrue(hasAnIncognito(list)); | |
636 browserProxy.resetResolver('getExceptionList'); | |
637 browserProxy.setIncognito(false); | |
638 return browserProxy.whenCalled('getExceptionList'); | |
639 }) | |
640 .then(function() { | |
641 Polymer.dom.flush(); | |
642 assertEquals(1, list.querySelectorAll('.list-item').length); | |
643 assertFalse(hasAnIncognito(list)); | |
644 browserProxy.resetResolver('getExceptionList'); | |
645 browserProxy.setIncognito(true); | |
646 return browserProxy.whenCalled('getExceptionList'); | |
647 }) | |
648 .then(function() { | |
649 Polymer.dom.flush(); | |
650 assertEquals(2, list.querySelectorAll('.list-item').length); | |
651 assertTrue(hasAnIncognito(list)); | |
652 }); | |
653 }); | |
654 | |
655 test('initial INCOGNITO BLOCK state is correct', function() { | |
656 var contentType = settings.ContentSettingsTypes.COOKIES; | |
657 var categorySubtype = settings.PermissionValues.BLOCK; | |
658 setUpCategory(contentType, categorySubtype, prefsIncognito); | |
659 return browserProxy.whenCalled('getExceptionList').then( | |
660 function(actualContentType) { | |
661 assertEquals(contentType, actualContentType); | |
662 assertEquals(categorySubtype, testElement.categorySubtype); | |
663 | |
664 assertEquals(1, testElement.sites.length); | |
665 assertEquals( | |
666 prefsIncognito.exceptions.cookies[0].origin, | |
667 testElement.sites[0].origin); | |
668 | |
669 Polymer.dom.flush(); // Populates action menu. | |
670 openActionMenu(0); | |
671 // 'Clear on exit' is visible as this is not an incognito item. | |
672 assertMenu( | |
673 ['Allow', 'Clear on exit', 'Edit', 'Remove'], testElement); | |
674 | |
675 // Select 'Remove' from menu. | |
676 var remove = testElement.$.reset; | |
677 assertTrue(!!remove); | |
678 MockInteractions.tap(remove); | |
679 return browserProxy.whenCalled( | |
680 'resetCategoryPermissionForOrigin'); | |
681 }).then(function(args) { | |
682 assertEquals('http://foo.com', args[0]); | |
683 assertEquals('http://foo.com', args[1]); | |
684 assertEquals(contentType, args[2]); | |
685 assertFalse(args[3]); // Incognito. | |
686 }); | |
687 }); | |
688 | |
689 test('initial INCOGNITO ALLOW state is correct', function() { | |
690 var contentType = settings.ContentSettingsTypes.COOKIES; | |
691 var categorySubtype = settings.PermissionValues.ALLOW; | |
692 setUpCategory(contentType, categorySubtype, prefsIncognito); | |
693 return browserProxy.whenCalled('getExceptionList').then( | |
694 function(actualContentType) { | |
695 assertEquals(contentType, actualContentType); | |
696 assertEquals(categorySubtype, testElement.categorySubtype); | |
697 | |
698 assertEquals(2, testElement.sites.length); | |
699 assertEquals( | |
700 prefsIncognito.exceptions.cookies[1].origin, | |
701 testElement.sites[0].origin); | |
702 assertEquals( | |
703 prefsIncognito.exceptions.cookies[2].origin, | |
704 testElement.sites[1].origin); | |
705 | |
706 Polymer.dom.flush(); // Populates action menu. | |
707 openActionMenu(0); | |
708 // 'Clear on exit' is hidden for incognito items. | |
709 assertMenu(['Block', 'Edit', 'Remove'], testElement); | |
710 closeActionMenu(); | |
711 | |
712 // Select 'Remove' from menu on 'foo.com'. | |
713 openActionMenu(1); | |
714 var remove = testElement.$.reset; | |
715 assertTrue(!!remove); | |
716 MockInteractions.tap(remove); | |
717 return browserProxy.whenCalled( | |
718 'resetCategoryPermissionForOrigin'); | |
719 }).then(function(args) { | |
720 assertEquals('http://foo.com', args[0]); | |
721 assertEquals('http://foo.com', args[1]); | |
722 assertEquals(contentType, args[2]); | |
723 assertTrue(args[3]); // Incognito. | |
724 }); | |
725 }); | |
726 | |
727 test('reset button works for read-only content types', function() { | |
728 testElement.readOnlyList = true; | |
729 Polymer.dom.flush(); | |
730 | |
731 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
732 var categorySubtype = settings.PermissionValues.ALLOW; | |
733 setUpCategory(contentType, categorySubtype, prefsOneEnabled); | |
734 return browserProxy.whenCalled('getExceptionList') | |
735 .then(function(actualContentType) { | |
736 assertEquals(contentType, actualContentType); | |
737 assertEquals(categorySubtype, testElement.categorySubtype); | |
738 | |
739 assertEquals(1, testElement.sites.length); | |
740 assertEquals( | |
741 prefsOneEnabled.exceptions.geolocation[0].origin, | |
742 testElement.sites[0].origin); | |
743 | |
744 Polymer.dom.flush(); | |
745 | |
746 var item = testElement.$.listContainer.children[0]; | |
747 | |
748 // Assert action button is hidden. | |
749 var dots = item.querySelector('#actionMenuButton'); | |
750 assertTrue(!!dots); | |
751 assertTrue(dots.hidden); | |
752 | |
753 // Assert reset button is visible. | |
754 var resetButton = item.querySelector('#resetSite'); | |
755 assertTrue(!!resetButton); | |
756 assertFalse(resetButton.hidden); | |
757 | |
758 MockInteractions.tap(resetButton); | |
759 return browserProxy.whenCalled( | |
760 'resetCategoryPermissionForOrigin'); | |
761 }) | |
762 .then(function(args) { | |
763 assertEquals('https://foo-allow.com:443', args[0]); | |
764 assertEquals('https://foo-allow.com:443', args[1]); | |
765 assertEquals(contentType, args[2]); | |
766 }); | |
767 }); | |
768 | |
769 test('edit action menu opens edit exception dialog', function() { | |
770 setUpCategory( | |
771 settings.ContentSettingsTypes.COOKIES, | |
772 settings.PermissionValues.SESSION_ONLY, | |
773 prefsSessionOnly); | |
774 | |
775 return browserProxy.whenCalled('getExceptionList').then(function() { | |
776 Polymer.dom.flush(); // Populates action menu. | 523 Polymer.dom.flush(); // Populates action menu. |
777 | 524 openActionMenu(0); |
525 assertMenu(['Block', 'Edit', 'Remove'], testElement); | |
526 | |
527 assertFalse(testElement.$.category.hidden); | |
528 }); | |
529 }); | |
530 | |
531 test('action menu closes when list changes', function() { | |
532 setUpCategory( | |
533 settings.ContentSettingsTypes.GEOLOCATION, | |
534 settings.PermissionValues.ALLOW, prefs); | |
535 var actionMenu = testElement.$$('dialog[is=cr-action-menu]'); | |
536 return browserProxy.whenCalled('getExceptionList') | |
537 .then(function(contentType) { | |
538 Polymer.dom.flush(); // Populates action menu. | |
539 openActionMenu(0); | |
540 assertTrue(actionMenu.open); | |
541 | |
542 browserProxy.resetResolver('getExceptionList'); | |
543 // Simulate a change in the underlying model. | |
544 cr.webUIListenerCallback( | |
545 'contentSettingSitePermissionChanged', | |
546 settings.ContentSettingsTypes.GEOLOCATION); | |
547 return browserProxy.whenCalled('getExceptionList'); | |
548 }) | |
549 .then(function() { | |
550 // Check that the action menu was closed. | |
551 assertFalse(actionMenu.open); | |
552 }); | |
553 }); | |
554 | |
555 test('exceptions are not reordered in non-ALL_SITES', function() { | |
556 setUpCategory( | |
557 settings.ContentSettingsTypes.GEOLOCATION, | |
558 settings.PermissionValues.BLOCK, prefsMixedProvider); | |
559 return browserProxy.whenCalled('getExceptionList') | |
560 .then(function(contentType) { | |
561 assertEquals(settings.ContentSettingsTypes.GEOLOCATION, contentType); | |
562 | |
563 assertEquals(3, testElement.sites.length); | |
564 for (var i = 0; i < 3; i++) { | |
565 assertEquals( | |
566 prefsMixedProvider.exceptions.geolocation[0].origin, | |
567 testElement.sites[0].origin); | |
568 assertEquals( | |
569 kControlledByLookup[prefsMixedProvider.exceptions.geolocation[0] | |
570 .source], | |
571 testElement.sites[0].controlledBy); | |
572 } | |
573 }); | |
574 }); | |
575 | |
576 test('initial BLOCK state is correct', function() { | |
577 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
578 var categorySubtype = settings.PermissionValues.BLOCK; | |
579 setUpCategory(contentType, categorySubtype, prefs); | |
580 return browserProxy.whenCalled('getExceptionList') | |
581 .then(function(actualContentType) { | |
582 assertEquals(contentType, actualContentType); | |
583 assertEquals(categorySubtype, testElement.categorySubtype); | |
584 | |
585 assertEquals(2, testElement.sites.length); | |
586 assertEquals( | |
587 prefs.exceptions.geolocation[2].origin, | |
588 testElement.sites[0].origin); | |
589 assertEquals( | |
590 prefs.exceptions.geolocation[3].origin, | |
591 testElement.sites[1].origin); | |
592 Polymer.dom.flush(); // Populates action menu. | |
593 openActionMenu(0); | |
594 assertMenu(['Allow', 'Edit', 'Remove'], testElement); | |
595 | |
596 assertFalse(testElement.$.category.hidden); | |
597 }); | |
598 }); | |
599 | |
600 test('initial SESSION ONLY state is correct', function() { | |
601 var contentType = settings.ContentSettingsTypes.COOKIES; | |
602 var categorySubtype = settings.PermissionValues.SESSION_ONLY; | |
603 setUpCategory(contentType, categorySubtype, prefsSessionOnly); | |
604 return browserProxy.whenCalled('getExceptionList') | |
605 .then(function(actualContentType) { | |
606 assertEquals(contentType, actualContentType); | |
607 assertEquals(categorySubtype, testElement.categorySubtype); | |
608 | |
609 assertEquals(1, testElement.sites.length); | |
610 assertEquals( | |
611 prefsSessionOnly.exceptions.cookies[2].origin, | |
612 testElement.sites[0].origin); | |
613 | |
614 Polymer.dom.flush(); // Populates action menu. | |
778 openActionMenu(0); | 615 openActionMenu(0); |
779 assertMenu(['Allow', 'Block', 'Edit', 'Remove'], testElement); | 616 assertMenu(['Allow', 'Block', 'Edit', 'Remove'], testElement); |
780 var menu = testElement.$$('dialog[is=cr-action-menu]'); | 617 |
781 assertTrue(menu.open); | 618 assertFalse(testElement.$.category.hidden); |
782 var edit = testElement.$.edit; | 619 }); |
783 assertTrue(!!edit); | 620 }); |
784 MockInteractions.tap(edit); | 621 |
622 test('update lists for incognito', function() { | |
623 var contentType = settings.ContentSettingsTypes.PLUGINS; | |
624 var categorySubtype = settings.PermissionValues.BLOCK; | |
625 setUpCategory(contentType, categorySubtype, prefsControlled); | |
626 var list = testElement.$.listContainer; | |
627 return browserProxy.whenCalled('getExceptionList') | |
628 .then(function(actualContentType) { | |
785 Polymer.dom.flush(); | 629 Polymer.dom.flush(); |
786 assertFalse(menu.open); | 630 assertEquals(1, list.querySelectorAll('.list-item').length); |
787 | 631 assertFalse(hasAnIncognito(list)); |
788 assertTrue(!!testElement.$$('settings-edit-exception-dialog')); | 632 browserProxy.resetResolver('getExceptionList'); |
789 }); | 633 browserProxy.setIncognito(true); |
790 }); | 634 return browserProxy.whenCalled('getExceptionList'); |
791 | 635 }) |
792 test('list items shown and clickable when data is present', function() { | 636 .then(function() { |
793 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | 637 Polymer.dom.flush(); |
794 setUpCategory(contentType, settings.PermissionValues.ALLOW, prefs); | 638 assertEquals(2, list.querySelectorAll('.list-item').length); |
795 return browserProxy.whenCalled('getExceptionList').then( | 639 assertTrue(hasAnIncognito(list)); |
796 function(actualContentType) { | 640 browserProxy.resetResolver('getExceptionList'); |
797 assertEquals(contentType, actualContentType); | 641 browserProxy.setIncognito(false); |
798 | 642 return browserProxy.whenCalled('getExceptionList'); |
799 // Required for firstItem to be found below. | 643 }) |
800 Polymer.dom.flush(); | 644 .then(function() { |
801 | 645 Polymer.dom.flush(); |
802 // Validate that the sites gets populated from pre-canned prefs. | 646 assertEquals(1, list.querySelectorAll('.list-item').length); |
803 assertEquals(2, testElement.sites.length); | 647 assertFalse(hasAnIncognito(list)); |
648 browserProxy.resetResolver('getExceptionList'); | |
649 browserProxy.setIncognito(true); | |
650 return browserProxy.whenCalled('getExceptionList'); | |
651 }) | |
652 .then(function() { | |
653 Polymer.dom.flush(); | |
654 assertEquals(2, list.querySelectorAll('.list-item').length); | |
655 assertTrue(hasAnIncognito(list)); | |
656 }); | |
657 }); | |
658 | |
659 test('initial INCOGNITO BLOCK state is correct', function() { | |
660 var contentType = settings.ContentSettingsTypes.COOKIES; | |
661 var categorySubtype = settings.PermissionValues.BLOCK; | |
662 setUpCategory(contentType, categorySubtype, prefsIncognito); | |
663 return browserProxy.whenCalled('getExceptionList') | |
664 .then(function(actualContentType) { | |
665 assertEquals(contentType, actualContentType); | |
666 assertEquals(categorySubtype, testElement.categorySubtype); | |
667 | |
668 assertEquals(1, testElement.sites.length); | |
669 assertEquals( | |
670 prefsIncognito.exceptions.cookies[0].origin, | |
671 testElement.sites[0].origin); | |
672 | |
673 Polymer.dom.flush(); // Populates action menu. | |
674 openActionMenu(0); | |
675 // 'Clear on exit' is visible as this is not an incognito item. | |
676 assertMenu(['Allow', 'Clear on exit', 'Edit', 'Remove'], testElement); | |
677 | |
678 // Select 'Remove' from menu. | |
679 var remove = testElement.$.reset; | |
680 assertTrue(!!remove); | |
681 MockInteractions.tap(remove); | |
682 return browserProxy.whenCalled('resetCategoryPermissionForOrigin'); | |
683 }) | |
684 .then(function(args) { | |
685 assertEquals('http://foo.com', args[0]); | |
686 assertEquals('http://foo.com', args[1]); | |
687 assertEquals(contentType, args[2]); | |
688 assertFalse(args[3]); // Incognito. | |
689 }); | |
690 }); | |
691 | |
692 test('initial INCOGNITO ALLOW state is correct', function() { | |
693 var contentType = settings.ContentSettingsTypes.COOKIES; | |
694 var categorySubtype = settings.PermissionValues.ALLOW; | |
695 setUpCategory(contentType, categorySubtype, prefsIncognito); | |
696 return browserProxy.whenCalled('getExceptionList') | |
697 .then(function(actualContentType) { | |
698 assertEquals(contentType, actualContentType); | |
699 assertEquals(categorySubtype, testElement.categorySubtype); | |
700 | |
701 assertEquals(2, testElement.sites.length); | |
702 assertEquals( | |
703 prefsIncognito.exceptions.cookies[1].origin, | |
704 testElement.sites[0].origin); | |
705 assertEquals( | |
706 prefsIncognito.exceptions.cookies[2].origin, | |
707 testElement.sites[1].origin); | |
708 | |
709 Polymer.dom.flush(); // Populates action menu. | |
710 openActionMenu(0); | |
711 // 'Clear on exit' is hidden for incognito items. | |
712 assertMenu(['Block', 'Edit', 'Remove'], testElement); | |
713 closeActionMenu(); | |
714 | |
715 // Select 'Remove' from menu on 'foo.com'. | |
716 openActionMenu(1); | |
717 var remove = testElement.$.reset; | |
718 assertTrue(!!remove); | |
719 MockInteractions.tap(remove); | |
720 return browserProxy.whenCalled('resetCategoryPermissionForOrigin'); | |
721 }) | |
722 .then(function(args) { | |
723 assertEquals('http://foo.com', args[0]); | |
724 assertEquals('http://foo.com', args[1]); | |
725 assertEquals(contentType, args[2]); | |
726 assertTrue(args[3]); // Incognito. | |
727 }); | |
728 }); | |
729 | |
730 test('reset button works for read-only content types', function() { | |
731 testElement.readOnlyList = true; | |
732 Polymer.dom.flush(); | |
733 | |
734 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
735 var categorySubtype = settings.PermissionValues.ALLOW; | |
736 setUpCategory(contentType, categorySubtype, prefsOneEnabled); | |
737 return browserProxy.whenCalled('getExceptionList') | |
738 .then(function(actualContentType) { | |
739 assertEquals(contentType, actualContentType); | |
740 assertEquals(categorySubtype, testElement.categorySubtype); | |
741 | |
742 assertEquals(1, testElement.sites.length); | |
743 assertEquals( | |
744 prefsOneEnabled.exceptions.geolocation[0].origin, | |
745 testElement.sites[0].origin); | |
746 | |
747 Polymer.dom.flush(); | |
748 | |
749 var item = testElement.$.listContainer.children[0]; | |
750 | |
751 // Assert action button is hidden. | |
752 var dots = item.querySelector('#actionMenuButton'); | |
753 assertTrue(!!dots); | |
754 assertTrue(dots.hidden); | |
755 | |
756 // Assert reset button is visible. | |
757 var resetButton = item.querySelector('#resetSite'); | |
758 assertTrue(!!resetButton); | |
759 assertFalse(resetButton.hidden); | |
760 | |
761 MockInteractions.tap(resetButton); | |
762 return browserProxy.whenCalled('resetCategoryPermissionForOrigin'); | |
763 }) | |
764 .then(function(args) { | |
765 assertEquals('https://foo-allow.com:443', args[0]); | |
766 assertEquals('https://foo-allow.com:443', args[1]); | |
767 assertEquals(contentType, args[2]); | |
768 }); | |
769 }); | |
770 | |
771 test('edit action menu opens edit exception dialog', function() { | |
772 setUpCategory( | |
773 settings.ContentSettingsTypes.COOKIES, | |
774 settings.PermissionValues.SESSION_ONLY, prefsSessionOnly); | |
775 | |
776 return browserProxy.whenCalled('getExceptionList').then(function() { | |
777 Polymer.dom.flush(); // Populates action menu. | |
778 | |
779 openActionMenu(0); | |
780 assertMenu(['Allow', 'Block', 'Edit', 'Remove'], testElement); | |
781 var menu = testElement.$$('dialog[is=cr-action-menu]'); | |
782 assertTrue(menu.open); | |
783 var edit = testElement.$.edit; | |
784 assertTrue(!!edit); | |
785 MockInteractions.tap(edit); | |
786 Polymer.dom.flush(); | |
787 assertFalse(menu.open); | |
788 | |
789 assertTrue(!!testElement.$$('settings-edit-exception-dialog')); | |
790 }); | |
791 }); | |
792 | |
793 test('list items shown and clickable when data is present', function() { | |
794 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
795 setUpCategory(contentType, settings.PermissionValues.ALLOW, prefs); | |
796 return browserProxy.whenCalled('getExceptionList') | |
797 .then(function(actualContentType) { | |
798 assertEquals(contentType, actualContentType); | |
799 | |
800 // Required for firstItem to be found below. | |
801 Polymer.dom.flush(); | |
802 | |
803 // Validate that the sites gets populated from pre-canned prefs. | |
804 assertEquals(2, testElement.sites.length); | |
805 assertEquals( | |
806 prefs.exceptions.geolocation[0].origin, | |
807 testElement.sites[0].origin); | |
808 assertEquals( | |
809 prefs.exceptions.geolocation[1].origin, | |
810 testElement.sites[1].origin); | |
811 assertFalse(!!testElement.selectedOrigin); | |
812 | |
813 // Validate that the sites are shown in UI and can be selected. | |
814 var firstItem = testElement.$.listContainer.children[0]; | |
815 var clickable = firstItem.querySelector('.middle'); | |
816 assertTrue(!!clickable); | |
817 MockInteractions.tap(clickable); | |
818 assertEquals( | |
819 prefs.exceptions.geolocation[0].origin, | |
820 settings.getQueryParameters().get('site')); | |
821 }); | |
822 }); | |
823 | |
824 test('Block list open when Allow list is empty', function() { | |
825 // Prefs: One item in Block list, nothing in Allow list. | |
826 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
827 setUpCategory( | |
828 contentType, settings.PermissionValues.BLOCK, prefsOneDisabled); | |
829 return browserProxy.whenCalled('getExceptionList') | |
830 .then(function(actualContentType) { | |
831 assertEquals(contentType, actualContentType); | |
832 assertFalse(testElement.$.category.hidden); | |
833 }) | |
834 .then(function() { | |
835 assertNotEquals(0, testElement.$.listContainer.offsetHeight); | |
836 }); | |
837 }); | |
838 | |
839 test('Block list closed when Allow list is not empty', function() { | |
840 // Prefs: Items in both Block and Allow list. | |
841 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
842 setUpCategory(contentType, settings.PermissionValues.BLOCK, prefs); | |
843 return browserProxy.whenCalled('getExceptionList') | |
844 .then(function(actualContentType) { | |
845 assertEquals(contentType, actualContentType); | |
846 assertFalse(testElement.$.category.hidden); | |
847 assertEquals(0, testElement.$.listContainer.offsetHeight); | |
848 }); | |
849 }); | |
850 | |
851 test('Allow list is always open (Block list empty)', function() { | |
852 // Prefs: One item in Allow list, nothing in Block list. | |
853 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
854 setUpCategory( | |
855 contentType, settings.PermissionValues.ALLOW, prefsOneEnabled); | |
856 return browserProxy.whenCalled('getExceptionList') | |
857 .then(function(actualContentType) { | |
858 assertEquals(contentType, actualContentType); | |
859 assertFalse(testElement.$.category.hidden); | |
860 }) | |
861 .then(function() { | |
862 assertNotEquals(0, testElement.$.listContainer.offsetHeight); | |
863 }); | |
864 }); | |
865 | |
866 test('Allow list is always open (Block list non-empty)', function() { | |
867 // Prefs: Items in both Block and Allow list. | |
868 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
869 setUpCategory(contentType, settings.PermissionValues.ALLOW, prefs); | |
870 return browserProxy.whenCalled('getExceptionList') | |
871 .then(function(actualContentType) { | |
872 assertEquals(contentType, actualContentType); | |
873 assertFalse(testElement.$.category.hidden); | |
874 }) | |
875 .then(function() { | |
876 assertNotEquals(0, testElement.$.listContainer.offsetHeight); | |
877 }); | |
878 }); | |
879 | |
880 test('Block list not hidden when empty', function() { | |
881 // Prefs: One item in Allow list, nothing in Block list. | |
882 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
883 setUpCategory( | |
884 contentType, settings.PermissionValues.BLOCK, prefsOneEnabled); | |
885 return browserProxy.whenCalled('getExceptionList') | |
886 .then(function(actualContentType) { | |
887 assertEquals(contentType, actualContentType); | |
888 assertFalse(testElement.$.category.hidden); | |
889 }); | |
890 }); | |
891 | |
892 test('Allow list not hidden when empty', function() { | |
893 // Prefs: One item in Block list, nothing in Allow list. | |
894 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
895 setUpCategory( | |
896 contentType, settings.PermissionValues.ALLOW, prefsOneDisabled); | |
897 return browserProxy.whenCalled('getExceptionList') | |
898 .then(function(actualContentType) { | |
899 assertEquals(contentType, actualContentType); | |
900 assertFalse(testElement.$.category.hidden); | |
901 }); | |
902 }); | |
903 | |
904 test('All sites category no action menu', function() { | |
905 setUpCategory(settings.ALL_SITES, '', prefsVarious); | |
906 return browserProxy.whenCalled('getExceptionList') | |
907 .then(function(contentType) { | |
908 // Use resolver to ensure that the list container is populated. | |
909 var resolver = new PromiseResolver(); | |
910 testElement.async(resolver.resolve); | |
911 return resolver.promise.then(function() { | |
912 var item = testElement.$.listContainer.children[0]; | |
913 var dots = item.querySelector('#actionMenuButton'); | |
914 assertTrue(!!dots); | |
915 assertTrue(dots.hidden); | |
916 }); | |
917 }); | |
918 }); | |
919 | |
920 test('All sites category', function() { | |
921 // Prefs: Multiple and overlapping sites. | |
922 setUpCategory(settings.ALL_SITES, '', prefsVarious); | |
923 | |
924 return browserProxy.whenCalled('getExceptionList') | |
925 .then(function(contentType) { | |
926 // Use resolver to ensure asserts bubble up to the framework with | |
927 // meaningful errors. | |
928 var resolver = new PromiseResolver(); | |
929 testElement.async(resolver.resolve); | |
930 return resolver.promise.then(function() { | |
931 // All Sites calls getExceptionList for all categories, starting | |
932 // with Cookies. | |
933 assertEquals(settings.ContentSettingsTypes.COOKIES, contentType); | |
934 | |
935 // Required for firstItem to be found below. | |
936 Polymer.dom.flush(); | |
937 | |
938 assertFalse(testElement.$.category.hidden); | |
939 // Validate that the sites gets populated from pre-canned prefs. | |
940 assertEquals( | |
941 3, testElement.sites.length, | |
942 'If this fails with 5 instead of the expected 3, then ' + | |
943 'the de-duping of sites is not working for site_list'); | |
944 assertEquals( | |
945 prefsVarious.exceptions.geolocation[1].origin, | |
946 testElement.sites[0].origin); | |
947 assertEquals( | |
948 prefsVarious.exceptions.geolocation[0].origin, | |
949 testElement.sites[1].origin); | |
950 assertEquals( | |
951 prefsVarious.exceptions.notifications[0].origin, | |
952 testElement.sites[2].origin); | |
953 assertEquals(undefined, testElement.selectedOrigin); | |
954 | |
955 // Validate that the sites are shown in UI and can be selected. | |
956 var firstItem = testElement.$.listContainer.children[1]; | |
957 var clickable = firstItem.querySelector('.middle'); | |
958 assertNotEquals(undefined, clickable); | |
959 MockInteractions.tap(clickable); | |
960 assertEquals( | |
961 prefsVarious.exceptions.geolocation[0].origin, | |
962 settings.getQueryParameters().get('site')); | |
963 }); | |
964 }); | |
965 }); | |
966 | |
967 test('All sites mixed pattern and origin', function() { | |
968 // Prefs: One site, represented as origin and pattern. | |
969 setUpCategory(settings.ALL_SITES, '', prefsMixedOriginAndPattern); | |
970 | |
971 return browserProxy.whenCalled('getExceptionList') | |
972 .then(function(contentType) { | |
973 // Use resolver to ensure asserts bubble up to the framework with | |
974 // meaningful errors. | |
975 var resolver = new PromiseResolver(); | |
976 testElement.async(resolver.resolve); | |
977 return resolver.promise.then(function() { | |
978 // All Sites calls getExceptionList for all categories, starting | |
979 // with Cookies. | |
980 assertEquals(settings.ContentSettingsTypes.COOKIES, contentType); | |
981 | |
982 // Required for firstItem to be found below. | |
983 Polymer.dom.flush(); | |
984 | |
985 assertFalse(testElement.$.category.hidden); | |
986 // Validate that the sites gets populated from pre-canned prefs. | |
987 // TODO(dschuyler): de-duping of sites is under discussion, so | |
988 // it is currently disabled. It should be enabled again or this | |
989 // code should be removed. | |
990 assertEquals( | |
991 2, testElement.sites.length, | |
992 'If this fails with 1 instead of the expected 2, then ' + | |
993 'the de-duping of sites has been enabled for site_list.'); | |
994 if (testElement.sites.length == 1) { | |
804 assertEquals( | 995 assertEquals( |
805 prefs.exceptions.geolocation[0].origin, | 996 prefsMixedOriginAndPattern.exceptions.geolocation[0].origin, |
806 testElement.sites[0].origin); | 997 testElement.sites[0].displayName); |
998 } | |
999 | |
1000 assertEquals(undefined, testElement.selectedOrigin); | |
1001 // Validate that the sites are shown in UI and can be selected. | |
1002 var firstItem = testElement.$.listContainer.children[0]; | |
1003 var clickable = firstItem.querySelector('.middle'); | |
1004 assertNotEquals(undefined, clickable); | |
1005 MockInteractions.tap(clickable); | |
1006 if (testElement.sites.length == 1) { | |
807 assertEquals( | 1007 assertEquals( |
808 prefs.exceptions.geolocation[1].origin, | 1008 prefsMixedOriginAndPattern.exceptions.geolocation[0].origin, |
809 testElement.sites[1].origin); | 1009 testElement.sites[0].displayName); |
810 assertFalse(!!testElement.selectedOrigin); | 1010 } |
811 | 1011 }); |
812 // Validate that the sites are shown in UI and can be selected. | 1012 }); |
813 var firstItem = testElement.$.listContainer.children[0]; | 1013 }); |
814 var clickable = firstItem.querySelector('.middle'); | 1014 |
815 assertTrue(!!clickable); | 1015 test('Mixed schemes (present and absent)', function() { |
816 MockInteractions.tap(clickable); | 1016 // Prefs: One item with scheme and one without. |
817 assertEquals( | 1017 setUpCategory( |
818 prefs.exceptions.geolocation[0].origin, | 1018 settings.ContentSettingsTypes.GEOLOCATION, |
819 settings.getQueryParameters().get('site')); | 1019 settings.PermissionValues.ALLOW, prefsMixedSchemes); |
820 }); | 1020 return browserProxy.whenCalled('getExceptionList') |
821 }); | 1021 .then(function(contentType) { |
822 | 1022 // No further checks needed. If this fails, it will hang the test. |
823 test('Block list open when Allow list is empty', function() { | 1023 }); |
824 // Prefs: One item in Block list, nothing in Allow list. | 1024 }); |
825 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | 1025 |
826 setUpCategory( | 1026 test('Select menu item', function() { |
827 contentType, settings.PermissionValues.BLOCK, prefsOneDisabled); | 1027 // Test for error: "Cannot read property 'origin' of undefined". |
828 return browserProxy.whenCalled('getExceptionList').then( | 1028 setUpCategory( |
829 function(actualContentType) { | 1029 settings.ContentSettingsTypes.GEOLOCATION, |
830 assertEquals(contentType, actualContentType); | 1030 settings.PermissionValues.ALLOW, prefs); |
831 assertFalse(testElement.$.category.hidden); | 1031 return browserProxy.whenCalled('getExceptionList') |
832 }).then(function() { | 1032 .then(function(contentType) { |
833 assertNotEquals(0, testElement.$.listContainer.offsetHeight); | |
834 }); | |
835 }); | |
836 | |
837 test('Block list closed when Allow list is not empty', function() { | |
838 // Prefs: Items in both Block and Allow list. | |
839 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
840 setUpCategory(contentType, settings.PermissionValues.BLOCK, prefs); | |
841 return browserProxy.whenCalled('getExceptionList').then( | |
842 function(actualContentType) { | |
843 assertEquals(contentType, actualContentType); | |
844 assertFalse(testElement.$.category.hidden); | |
845 assertEquals(0, testElement.$.listContainer.offsetHeight); | |
846 }); | |
847 }); | |
848 | |
849 test('Allow list is always open (Block list empty)', function() { | |
850 // Prefs: One item in Allow list, nothing in Block list. | |
851 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
852 setUpCategory( | |
853 contentType, settings.PermissionValues.ALLOW, prefsOneEnabled); | |
854 return browserProxy.whenCalled('getExceptionList').then( | |
855 function(actualContentType) { | |
856 assertEquals(contentType, actualContentType); | |
857 assertFalse(testElement.$.category.hidden); | |
858 }).then(function() { | |
859 assertNotEquals(0, testElement.$.listContainer.offsetHeight); | |
860 }); | |
861 }); | |
862 | |
863 test('Allow list is always open (Block list non-empty)', function() { | |
864 // Prefs: Items in both Block and Allow list. | |
865 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
866 setUpCategory(contentType, settings.PermissionValues.ALLOW, prefs); | |
867 return browserProxy.whenCalled('getExceptionList').then( | |
868 function(actualContentType) { | |
869 assertEquals(contentType, actualContentType); | |
870 assertFalse(testElement.$.category.hidden); | |
871 }).then(function() { | |
872 assertNotEquals(0, testElement.$.listContainer.offsetHeight); | |
873 }); | |
874 }); | |
875 | |
876 test('Block list not hidden when empty', function() { | |
877 // Prefs: One item in Allow list, nothing in Block list. | |
878 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
879 setUpCategory( | |
880 contentType, settings.PermissionValues.BLOCK, prefsOneEnabled); | |
881 return browserProxy.whenCalled('getExceptionList').then( | |
882 function(actualContentType) { | |
883 assertEquals(contentType, actualContentType); | |
884 assertFalse(testElement.$.category.hidden); | |
885 }); | |
886 }); | |
887 | |
888 test('Allow list not hidden when empty', function() { | |
889 // Prefs: One item in Block list, nothing in Allow list. | |
890 var contentType = settings.ContentSettingsTypes.GEOLOCATION; | |
891 setUpCategory( | |
892 contentType, settings.PermissionValues.ALLOW, prefsOneDisabled); | |
893 return browserProxy.whenCalled('getExceptionList').then( | |
894 function(actualContentType) { | |
895 assertEquals(contentType, actualContentType); | |
896 assertFalse(testElement.$.category.hidden); | |
897 }); | |
898 }); | |
899 | |
900 test('All sites category no action menu', function() { | |
901 setUpCategory(settings.ALL_SITES, '', prefsVarious); | |
902 return browserProxy.whenCalled('getExceptionList').then( | |
903 function(contentType) { | |
904 // Use resolver to ensure that the list container is populated. | |
905 var resolver = new PromiseResolver(); | |
906 testElement.async(resolver.resolve); | |
907 return resolver.promise.then(function() { | |
908 var item = testElement.$.listContainer.children[0]; | |
909 var dots = item.querySelector('#actionMenuButton'); | |
910 assertTrue(!!dots); | |
911 assertTrue(dots.hidden); | |
912 }); | |
913 }); | |
914 }); | |
915 | |
916 test('All sites category', function() { | |
917 // Prefs: Multiple and overlapping sites. | |
918 setUpCategory(settings.ALL_SITES, '', prefsVarious); | |
919 | |
920 return browserProxy.whenCalled('getExceptionList').then( | |
921 function(contentType) { | |
922 // Use resolver to ensure asserts bubble up to the framework with | |
923 // meaningful errors. | |
924 var resolver = new PromiseResolver(); | |
925 testElement.async(resolver.resolve); | |
926 return resolver.promise.then(function() { | |
927 // All Sites calls getExceptionList for all categories, starting | |
928 // with Cookies. | |
929 assertEquals( | |
930 settings.ContentSettingsTypes.COOKIES, contentType); | |
931 | |
932 // Required for firstItem to be found below. | |
933 Polymer.dom.flush(); | |
934 | |
935 assertFalse(testElement.$.category.hidden); | |
936 // Validate that the sites gets populated from pre-canned prefs. | |
937 assertEquals(3, testElement.sites.length, | |
938 'If this fails with 5 instead of the expected 3, then ' + | |
939 'the de-duping of sites is not working for site_list'); | |
940 assertEquals(prefsVarious.exceptions.geolocation[1].origin, | |
941 testElement.sites[0].origin); | |
942 assertEquals(prefsVarious.exceptions.geolocation[0].origin, | |
943 testElement.sites[1].origin); | |
944 assertEquals(prefsVarious.exceptions.notifications[0].origin, | |
945 testElement.sites[2].origin); | |
946 assertEquals(undefined, testElement.selectedOrigin); | |
947 | |
948 // Validate that the sites are shown in UI and can be selected. | |
949 var firstItem = testElement.$.listContainer.children[1]; | |
950 var clickable = firstItem.querySelector('.middle'); | |
951 assertNotEquals(undefined, clickable); | |
952 MockInteractions.tap(clickable); | |
953 assertEquals(prefsVarious.exceptions.geolocation[0].origin, | |
954 settings.getQueryParameters().get('site')); | |
955 }); | |
956 }); | |
957 }); | |
958 | |
959 test('All sites mixed pattern and origin', function() { | |
960 // Prefs: One site, represented as origin and pattern. | |
961 setUpCategory(settings.ALL_SITES, '', prefsMixedOriginAndPattern); | |
962 | |
963 return browserProxy.whenCalled('getExceptionList').then( | |
964 function(contentType) { | |
965 // Use resolver to ensure asserts bubble up to the framework with | |
966 // meaningful errors. | |
967 var resolver = new PromiseResolver(); | |
968 testElement.async(resolver.resolve); | |
969 return resolver.promise.then(function() { | |
970 // All Sites calls getExceptionList for all categories, starting | |
971 // with Cookies. | |
972 assertEquals( | |
973 settings.ContentSettingsTypes.COOKIES, contentType); | |
974 | |
975 // Required for firstItem to be found below. | |
976 Polymer.dom.flush(); | |
977 | |
978 assertFalse(testElement.$.category.hidden); | |
979 // Validate that the sites gets populated from pre-canned prefs. | |
980 // TODO(dschuyler): de-duping of sites is under discussion, so | |
981 // it is currently disabled. It should be enabled again or this | |
982 // code should be removed. | |
983 assertEquals(2, testElement.sites.length, | |
984 'If this fails with 1 instead of the expected 2, then ' + | |
985 'the de-duping of sites has been enabled for site_list.'); | |
986 if (testElement.sites.length == 1) { | |
987 assertEquals( | |
988 prefsMixedOriginAndPattern.exceptions. | |
989 geolocation[0]. | |
990 origin, | |
991 testElement.sites[0].displayName); | |
992 } | |
993 | |
994 assertEquals(undefined, testElement.selectedOrigin); | |
995 // Validate that the sites are shown in UI and can be selected. | |
996 var firstItem = testElement.$.listContainer.children[0]; | |
997 var clickable = firstItem.querySelector('.middle'); | |
998 assertNotEquals(undefined, clickable); | |
999 MockInteractions.tap(clickable); | |
1000 if (testElement.sites.length == 1) { | |
1001 assertEquals( | |
1002 prefsMixedOriginAndPattern.exceptions. | |
1003 geolocation[0]. | |
1004 origin, | |
1005 testElement.sites[0].displayName); | |
1006 } | |
1007 }); | |
1008 }); | |
1009 }); | |
1010 | |
1011 test('Mixed schemes (present and absent)', function() { | |
1012 // Prefs: One item with scheme and one without. | |
1013 setUpCategory(settings.ContentSettingsTypes.GEOLOCATION, | |
1014 settings.PermissionValues.ALLOW, prefsMixedSchemes); | |
1015 return browserProxy.whenCalled('getExceptionList').then( | |
1016 function(contentType) { | |
1017 // No further checks needed. If this fails, it will hang the test. | |
1018 }); | |
1019 }); | |
1020 | |
1021 test('Select menu item', function() { | |
1022 // Test for error: "Cannot read property 'origin' of undefined". | |
1023 setUpCategory(settings.ContentSettingsTypes.GEOLOCATION, | |
1024 settings.PermissionValues.ALLOW, prefs); | |
1025 return browserProxy.whenCalled('getExceptionList').then(function( | |
1026 contentType) { | |
1027 Polymer.dom.flush(); | 1033 Polymer.dom.flush(); |
1028 openActionMenu(0); | 1034 openActionMenu(0); |
1029 var allow = testElement.$.allow; | 1035 var allow = testElement.$.allow; |
1030 assertTrue(!!allow); | 1036 assertTrue(!!allow); |
1031 MockInteractions.tap(allow); | 1037 MockInteractions.tap(allow); |
1032 return browserProxy.whenCalled('setCategoryPermissionForOrigin'); | 1038 return browserProxy.whenCalled('setCategoryPermissionForOrigin'); |
1033 }); | 1039 }); |
1034 }); | 1040 }); |
1035 | 1041 |
1036 test('Chrome Extension scheme', function() { | 1042 test('Chrome Extension scheme', function() { |
1037 setUpCategory(settings.ContentSettingsTypes.JAVASCRIPT, | 1043 setUpCategory( |
1038 settings.PermissionValues.BLOCK, prefsChromeExtension); | 1044 settings.ContentSettingsTypes.JAVASCRIPT, |
1039 return browserProxy.whenCalled('getExceptionList').then(function( | 1045 settings.PermissionValues.BLOCK, prefsChromeExtension); |
1040 contentType) { | 1046 return browserProxy.whenCalled('getExceptionList') |
1047 .then(function(contentType) { | |
1041 Polymer.dom.flush(); | 1048 Polymer.dom.flush(); |
1042 openActionMenu(0); | 1049 openActionMenu(0); |
1043 assertMenu(['Allow', 'Edit', 'Remove'], testElement); | 1050 assertMenu(['Allow', 'Edit', 'Remove'], testElement); |
1044 | 1051 |
1045 var allow = testElement.$.allow; | 1052 var allow = testElement.$.allow; |
1046 assertTrue(!!allow); | 1053 assertTrue(!!allow); |
1047 MockInteractions.tap(allow); | 1054 MockInteractions.tap(allow); |
1048 return browserProxy.whenCalled('setCategoryPermissionForOrigin'); | 1055 return browserProxy.whenCalled('setCategoryPermissionForOrigin'); |
1049 }).then(function(args) { | 1056 }) |
1050 assertEquals('chrome-extension://cfhgfbfpcbnnbibfphagcjmgjfjmojfa/', | 1057 .then(function(args) { |
1051 args[0]); | 1058 assertEquals( |
1059 'chrome-extension://cfhgfbfpcbnnbibfphagcjmgjfjmojfa/', args[0]); | |
1052 assertEquals('', args[1]); | 1060 assertEquals('', args[1]); |
1053 assertEquals(settings.ContentSettingsTypes.JAVASCRIPT, args[2]); | 1061 assertEquals(settings.ContentSettingsTypes.JAVASCRIPT, args[2]); |
1054 assertEquals('allow', args[3]); | 1062 assertEquals('allow', args[3]); |
1055 }); | 1063 }); |
1056 }); | 1064 }); |
1057 }); | 1065 }); |
1058 } | |
1059 | 1066 |
1060 suite('EditExceptionDialog', function() { | 1067 suite('EditExceptionDialog', function() { |
1061 /** @type {SettingsEditExceptionDialogElement} */ var dialog; | 1068 /** @type {SettingsEditExceptionDialogElement} */ var dialog; |
1062 | 1069 |
1063 /** | 1070 /** |
1064 * The dialog tests don't call |getExceptionList| so the exception needs to | 1071 * The dialog tests don't call |getExceptionList| so the exception needs to |
1065 * be processes as a |SiteSettingsPref|. | 1072 * be processes as a |SiteSettingsPref|. |
1066 * @type {SiteSettingsPref} | 1073 * @type {SiteSettingsPref} |
1067 */ | 1074 */ |
1068 var cookieException = { | 1075 var cookieException = { |
1069 category: 'cookies', | 1076 category: 'cookies', |
1070 embeddingOrigin: 'http://foo.com', | 1077 embeddingOrigin: 'http://foo.com', |
1071 incognito: false, | 1078 incognito: false, |
1072 origin: 'http://foo.com', | 1079 origin: 'http://foo.com', |
1073 setting: 'block', | 1080 setting: 'block', |
1074 enforcement: '', | 1081 enforcement: '', |
1075 controlledBy: 'USER_POLICY', | 1082 controlledBy: 'USER_POLICY', |
1076 }; | 1083 }; |
1077 | 1084 |
1078 setup(function() { | 1085 setup(function() { |
1079 browserProxy = new TestSiteSettingsPrefsBrowserProxy(); | 1086 browserProxy = new TestSiteSettingsPrefsBrowserProxy(); |
1080 settings.SiteSettingsPrefsBrowserProxyImpl.instance_ = browserProxy; | 1087 settings.SiteSettingsPrefsBrowserProxyImpl.instance_ = browserProxy; |
1081 PolymerTest.clearBody(); | 1088 PolymerTest.clearBody(); |
1082 dialog = document.createElement('settings-edit-exception-dialog'); | 1089 dialog = document.createElement('settings-edit-exception-dialog'); |
1083 dialog.model = cookieException; | 1090 dialog.model = cookieException; |
1084 document.body.appendChild(dialog); | 1091 document.body.appendChild(dialog); |
1085 }); | 1092 }); |
1086 | 1093 |
1087 teardown(function() { | 1094 teardown(function() { |
1088 dialog.remove(); | 1095 dialog.remove(); |
1089 }); | 1096 }); |
1090 | 1097 |
1091 test('invalid input', function() { | 1098 test('invalid input', function() { |
1092 var input = dialog.$$('paper-input'); | 1099 var input = dialog.$$('paper-input'); |
1093 assertTrue(!!input); | 1100 assertTrue(!!input); |
1094 assertFalse(input.invalid); | 1101 assertFalse(input.invalid); |
1095 | 1102 |
1096 var actionButton = dialog.$.actionButton; | 1103 var actionButton = dialog.$.actionButton; |
1097 assertTrue(!!actionButton); | 1104 assertTrue(!!actionButton); |
1098 assertFalse(actionButton.disabled); | 1105 assertFalse(actionButton.disabled); |
1099 | 1106 |
1100 // Simulate user input of whitespace only text. | 1107 // Simulate user input of whitespace only text. |
1101 input.value = ' '; | 1108 input.value = ' '; |
1102 input.fire('input'); | 1109 input.fire('input'); |
1103 Polymer.dom.flush(); | 1110 Polymer.dom.flush(); |
1111 assertTrue(actionButton.disabled); | |
1112 assertTrue(input.invalid); | |
1113 | |
1114 // Simulate user input of invalid text. | |
1115 browserProxy.setIsPatternValid(false); | |
1116 var expectedPattern = 'foobarbaz'; | |
1117 input.value = expectedPattern; | |
1118 input.fire('input'); | |
1119 | |
1120 return browserProxy.whenCalled('isPatternValid').then(function(pattern) { | |
1121 assertEquals(expectedPattern, pattern); | |
1104 assertTrue(actionButton.disabled); | 1122 assertTrue(actionButton.disabled); |
1105 assertTrue(input.invalid); | 1123 assertTrue(input.invalid); |
1106 | |
1107 // Simulate user input of invalid text. | |
1108 browserProxy.setIsPatternValid(false); | |
1109 var expectedPattern = 'foobarbaz'; | |
1110 input.value = expectedPattern; | |
1111 input.fire('input'); | |
1112 | |
1113 return browserProxy.whenCalled('isPatternValid').then(function(pattern) { | |
1114 assertEquals(expectedPattern, pattern); | |
1115 assertTrue(actionButton.disabled); | |
1116 assertTrue(input.invalid); | |
1117 }); | |
1118 }); | |
1119 | |
1120 test('action button calls proxy', function() { | |
1121 var input = dialog.$$('paper-input'); | |
1122 assertTrue(!!input); | |
1123 // Simulate user edit. | |
1124 var newValue = input.value + ':1234'; | |
1125 input.value = newValue; | |
1126 | |
1127 var actionButton = dialog.$.actionButton; | |
1128 assertTrue(!!actionButton); | |
1129 assertFalse(actionButton.disabled); | |
1130 | |
1131 MockInteractions.tap(actionButton); | |
1132 return browserProxy.whenCalled('resetCategoryPermissionForOrigin') | |
1133 .then(function(args) { | |
1134 assertEquals(cookieException.origin, args[0]); | |
1135 assertEquals(cookieException.embeddingOrigin, args[1]); | |
1136 assertEquals(settings.ContentSettingsTypes.COOKIES, args[2]); | |
1137 assertEquals(cookieException.incognito, args[3]); | |
1138 | |
1139 return browserProxy.whenCalled('setCategoryPermissionForOrigin'); | |
1140 }) | |
1141 .then(function(args) { | |
1142 assertEquals(newValue, args[0]); | |
1143 assertEquals(newValue, args[1]); | |
1144 assertEquals(settings.ContentSettingsTypes.COOKIES, args[2]); | |
1145 assertEquals(cookieException.setting, args[3]); | |
1146 assertEquals(cookieException.incognito, args[4]); | |
1147 | |
1148 assertFalse(dialog.$.dialog.open); | |
1149 }); | |
1150 }); | 1124 }); |
1151 }); | 1125 }); |
1152 | 1126 |
1153 suite('AddExceptionDialog', function() { | 1127 test('action button calls proxy', function() { |
1154 /** @type {AddSiteDialogElement} */ var dialog; | 1128 var input = dialog.$$('paper-input'); |
1129 assertTrue(!!input); | |
1130 // Simulate user edit. | |
1131 var newValue = input.value + ':1234'; | |
1132 input.value = newValue; | |
1155 | 1133 |
1156 setup(function() { | 1134 var actionButton = dialog.$.actionButton; |
1157 browserProxy = new TestSiteSettingsPrefsBrowserProxy(); | 1135 assertTrue(!!actionButton); |
1158 settings.SiteSettingsPrefsBrowserProxyImpl.instance_ = browserProxy; | 1136 assertFalse(actionButton.disabled); |
1159 PolymerTest.clearBody(); | |
1160 dialog = document.createElement('add-site-dialog'); | |
1161 dialog.category = settings.ContentSettingsTypes.GEOLOCATION; | |
1162 dialog.contentSetting = settings.PermissionValues.ALLOW; | |
1163 document.body.appendChild(dialog); | |
1164 dialog.open(); | |
1165 }); | |
1166 | 1137 |
1167 teardown(function() { | 1138 MockInteractions.tap(actionButton); |
1168 dialog.remove(); | 1139 return browserProxy.whenCalled('resetCategoryPermissionForOrigin') |
1169 }); | 1140 .then(function(args) { |
1141 assertEquals(cookieException.origin, args[0]); | |
1142 assertEquals(cookieException.embeddingOrigin, args[1]); | |
1143 assertEquals(settings.ContentSettingsTypes.COOKIES, args[2]); | |
1144 assertEquals(cookieException.incognito, args[3]); | |
1170 | 1145 |
1171 test('incognito', function() { | 1146 return browserProxy.whenCalled('setCategoryPermissionForOrigin'); |
1172 cr.webUIListenerCallback( | 1147 }) |
1173 'onIncognitoStatusChanged', | 1148 .then(function(args) { |
1174 /*hasIncognito=*/true); | 1149 assertEquals(newValue, args[0]); |
1175 assertFalse(dialog.$.incognito.checked); | 1150 assertEquals(newValue, args[1]); |
1176 dialog.$.incognito.checked = true; | 1151 assertEquals(settings.ContentSettingsTypes.COOKIES, args[2]); |
1177 // Changing the incognito status will reset the checkbox. | 1152 assertEquals(cookieException.setting, args[3]); |
1178 cr.webUIListenerCallback( | 1153 assertEquals(cookieException.incognito, args[4]); |
1179 'onIncognitoStatusChanged', | |
1180 /*hasIncognito=*/false); | |
1181 assertFalse(dialog.$.incognito.checked); | |
1182 }); | |
1183 | 1154 |
1184 test('invalid input', function() { | 1155 assertFalse(dialog.$.dialog.open); |
1185 // Initially the action button should be disabled, but the error warning | 1156 }); |
1186 // should not be shown for an empty input. | 1157 }); |
1187 var input = dialog.$$('paper-input'); | 1158 }); |
1188 assertTrue(!!input); | |
1189 assertFalse(input.invalid); | |
1190 | 1159 |
1191 var actionButton = dialog.$.add; | 1160 suite('AddExceptionDialog', function() { |
1192 assertTrue(!!actionButton); | 1161 /** @type {AddSiteDialogElement} */ var dialog; |
1162 | |
1163 setup(function() { | |
1164 browserProxy = new TestSiteSettingsPrefsBrowserProxy(); | |
1165 settings.SiteSettingsPrefsBrowserProxyImpl.instance_ = browserProxy; | |
1166 PolymerTest.clearBody(); | |
1167 dialog = document.createElement('add-site-dialog'); | |
1168 dialog.category = settings.ContentSettingsTypes.GEOLOCATION; | |
1169 dialog.contentSetting = settings.PermissionValues.ALLOW; | |
1170 document.body.appendChild(dialog); | |
1171 dialog.open(); | |
1172 }); | |
1173 | |
1174 teardown(function() { | |
1175 dialog.remove(); | |
1176 }); | |
1177 | |
1178 test('incognito', function() { | |
1179 cr.webUIListenerCallback( | |
1180 'onIncognitoStatusChanged', | |
1181 /*hasIncognito=*/true); | |
1182 assertFalse(dialog.$.incognito.checked); | |
1183 dialog.$.incognito.checked = true; | |
1184 // Changing the incognito status will reset the checkbox. | |
1185 cr.webUIListenerCallback( | |
1186 'onIncognitoStatusChanged', | |
1187 /*hasIncognito=*/false); | |
1188 assertFalse(dialog.$.incognito.checked); | |
1189 }); | |
1190 | |
1191 test('invalid input', function() { | |
1192 // Initially the action button should be disabled, but the error warning | |
1193 // should not be shown for an empty input. | |
1194 var input = dialog.$$('paper-input'); | |
1195 assertTrue(!!input); | |
1196 assertFalse(input.invalid); | |
1197 | |
1198 var actionButton = dialog.$.add; | |
1199 assertTrue(!!actionButton); | |
1200 assertTrue(actionButton.disabled); | |
1201 | |
1202 // Simulate user input of invalid text. | |
1203 browserProxy.setIsPatternValid(false); | |
1204 var expectedPattern = 'foobarbaz'; | |
1205 input.value = expectedPattern; | |
1206 input.fire('input'); | |
1207 | |
1208 return browserProxy.whenCalled('isPatternValid').then(function(pattern) { | |
1209 assertEquals(expectedPattern, pattern); | |
1193 assertTrue(actionButton.disabled); | 1210 assertTrue(actionButton.disabled); |
1194 | 1211 assertTrue(input.invalid); |
1195 // Simulate user input of invalid text. | |
1196 browserProxy.setIsPatternValid(false); | |
1197 var expectedPattern = 'foobarbaz'; | |
1198 input.value = expectedPattern; | |
1199 input.fire('input'); | |
1200 | |
1201 return browserProxy.whenCalled('isPatternValid').then(function(pattern) { | |
1202 assertEquals(expectedPattern, pattern); | |
1203 assertTrue(actionButton.disabled); | |
1204 assertTrue(input.invalid); | |
1205 }); | |
1206 }); | 1212 }); |
1207 }); | 1213 }); |
1208 | |
1209 return { | |
1210 registerTests: registerTests, | |
1211 }; | |
1212 }); | 1214 }); |
OLD | NEW |