OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 GEN('#include "chrome/test/data/webui/history_ui_browsertest.h"'); | |
6 | |
5 /** @const */ var TOTAL_RESULT_COUNT = 160; | 7 /** @const */ var TOTAL_RESULT_COUNT = 160; |
6 /** @const */ var WAIT_TIMEOUT = 200; | 8 /** @const */ var WAIT_TIMEOUT = 200; |
7 | 9 |
8 /** | 10 /** |
11 * Test fixture for history WebUI testing. | |
12 * @constructor | |
13 * @extends {testing.Test} | |
14 */ | |
15 function HistoryUIBrowserTest() {} | |
16 | |
17 /** | |
9 * Create a fake history result with the given timestamp. | 18 * Create a fake history result with the given timestamp. |
10 * @param {Number} timestamp Timestamp of the entry, in ms since the epoch. | 19 * @param {Number} timestamp Timestamp of the entry, in ms since the epoch. |
11 * @param {String} url The URL to set on this entry. | 20 * @param {String} url The URL to set on this entry. |
12 * @return {Object} An object representing a history entry. | 21 * @return {Object} An object representing a history entry. |
13 */ | 22 */ |
14 function createHistoryEntry(timestamp, url) { | 23 function createHistoryEntry(timestamp, url) { |
15 var d = new Date(timestamp); | 24 var d = new Date(timestamp); |
16 return { | 25 return { |
17 dateTimeOfDay: d.getHours() + ':' + d.getMinutes(), | 26 dateTimeOfDay: d.getHours() + ':' + d.getMinutes(), |
18 dateRelativeDay: d.toDateString(), | 27 dateRelativeDay: d.toDateString(), |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
120 function BaseHistoryWebUITest() {} | 129 function BaseHistoryWebUITest() {} |
121 | 130 |
122 BaseHistoryWebUITest.prototype = { | 131 BaseHistoryWebUITest.prototype = { |
123 __proto__: testing.Test.prototype, | 132 __proto__: testing.Test.prototype, |
124 | 133 |
125 /** | 134 /** |
126 * Browse to the history page & call our preLoad(). | 135 * Browse to the history page & call our preLoad(). |
127 */ | 136 */ |
128 browsePreload: 'chrome://history-frame', | 137 browsePreload: 'chrome://history-frame', |
129 | 138 |
139 /** @override */ | |
140 typedefCppFixture: 'HistoryUIBrowserTest', | |
Patrick Dubroy
2013/04/18 14:15:19
Sweeeet! Thanks for figuring out how to do this. T
| |
141 | |
130 isAsync: true, | 142 isAsync: true, |
131 | 143 |
132 /** | 144 /** |
133 * Register handlers to stub out calls to the history backend. | 145 * Register handlers to stub out calls to the history backend. |
134 * @override | 146 * @override |
135 */ | 147 */ |
136 preLoad: function() { | 148 preLoad: function() { |
137 this.registerMockHandler_( | 149 this.registerMockHandler_( |
138 'queryHistory', this.queryHistoryStub_.bind(this)); | 150 'queryHistory', this.queryHistoryStub_.bind(this)); |
139 }, | 151 }, |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
237 * @constructor | 249 * @constructor |
238 */ | 250 */ |
239 function HistoryWebUITest() {} | 251 function HistoryWebUITest() {} |
240 | 252 |
241 HistoryWebUITest.prototype = { | 253 HistoryWebUITest.prototype = { |
242 __proto__: BaseHistoryWebUITest.prototype, | 254 __proto__: BaseHistoryWebUITest.prototype, |
243 | 255 |
244 preLoad: function() { | 256 preLoad: function() { |
245 BaseHistoryWebUITest.prototype.preLoad.call(this); | 257 BaseHistoryWebUITest.prototype.preLoad.call(this); |
246 | 258 |
247 this.registerMockHandler_( | 259 this.registerRemoveVisitsStub_(); |
248 'removeVisits', this.removeVisitsStub_.bind(this)); | |
249 | 260 |
250 // Prepare a list of fake history results. The entries will begin at | 261 // Prepare a list of fake history results. The entries will begin at |
251 // 1:00 AM on Sept 2, 2008, and will be spaced two minutes apart. | 262 // 1:00 AM on Sept 2, 2008, and will be spaced two minutes apart. |
252 var timestamp = new Date(2008, 9, 2, 1, 0).getTime(); | 263 var timestamp = new Date(2008, 9, 2, 1, 0).getTime(); |
253 this.fakeHistory_ = []; | 264 this.fakeHistory_ = []; |
254 | 265 |
255 for (var i = 0; i < TOTAL_RESULT_COUNT; i++) { | 266 for (var i = 0; i < TOTAL_RESULT_COUNT; i++) { |
256 this.fakeHistory_.push( | 267 this.fakeHistory_.push( |
257 createHistoryEntry(timestamp, 'http://google.com/' + timestamp)); | 268 createHistoryEntry(timestamp, 'http://google.com/' + timestamp)); |
258 timestamp -= 2 * 60 * 1000; // Next visit is two minutes earlier. | 269 timestamp -= 2 * 60 * 1000; // Next visit is two minutes earlier. |
259 } | 270 } |
260 }, | 271 }, |
261 | 272 |
262 /** | 273 /** |
274 * Register a mock handler for the 'removeVisits' message. This is pulled out | |
275 * into a separate method so subclasses can override it. | |
276 */ | |
277 registerRemoveVisitsStub_: function() { | |
278 this.registerMockHandler_( | |
279 'removeVisits', this.removeVisitsStub_.bind(this)); | |
280 }, | |
281 | |
282 /** | |
263 * Stub for the 'queryHistory' message to the history backend. | 283 * Stub for the 'queryHistory' message to the history backend. |
264 * Simulates a history database using the fake history data that is | 284 * Simulates a history database using the fake history data that is |
265 * initialized in preLoad(). | 285 * initialized in preLoad(). |
266 * @param {Array} arguments The original arguments to queryHistory. | 286 * @param {Array} arguments The original arguments to queryHistory. |
267 */ | 287 */ |
268 queryHistoryStub_: function(args) { | 288 queryHistoryStub_: function(args) { |
269 var searchText = args[0]; | 289 var searchText = args[0]; |
270 var offset = args[1]; | 290 var offset = args[1]; |
271 var range = args[2]; | 291 var range = args[2]; |
272 var endTime = args[3] || Number.MAX_VALUE; | 292 var endTime = args[3] || Number.MAX_VALUE; |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
413 /** | 433 /** |
414 * Test deletion of history entries. | 434 * Test deletion of history entries. |
415 */ | 435 */ |
416 TEST_F('HistoryWebUITest', 'deletion', function() { | 436 TEST_F('HistoryWebUITest', 'deletion', function() { |
417 var checkboxes = document.querySelectorAll( | 437 var checkboxes = document.querySelectorAll( |
418 '#results-display input[type=checkbox]'); | 438 '#results-display input[type=checkbox]'); |
419 | 439 |
420 // Confirm all the things!!! | 440 // Confirm all the things!!! |
421 window.confirm = function() { return true; }; | 441 window.confirm = function() { return true; }; |
422 | 442 |
423 // The "remote" button should be initially selected. | 443 // The "remove" button should be initially disabled. |
Patrick Dubroy
2013/04/18 14:15:19
Haha, I don't know what happened here. Thanks for
| |
424 var removeButton = $('remove-selected'); | 444 var removeButton = $('remove-selected'); |
425 expectTrue(removeButton.disabled); | 445 expectTrue(removeButton.disabled); |
426 | 446 |
427 checkboxes[0].click(); | 447 checkboxes[0].click(); |
428 expectFalse(removeButton.disabled); | 448 expectFalse(removeButton.disabled); |
429 | 449 |
430 var firstEntry = document.querySelector('.title a').textContent; | 450 var firstEntry = document.querySelector('.title a').textContent; |
431 removeButton.click(); | 451 removeButton.click(); |
432 | 452 |
433 // After deletion, expect the results to be reloaded. | 453 // After deletion, expect the results to be reloaded. |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
703 | 723 |
704 waitForCallback('historyResult', function() { | 724 waitForCallback('historyResult', function() { |
705 // See if the correct number of days is shown. | 725 // See if the correct number of days is shown. |
706 var resultsDisplay = $('results-display'); | 726 var resultsDisplay = $('results-display'); |
707 assertEquals(0, resultsDisplay.querySelectorAll('.months-results').length); | 727 assertEquals(0, resultsDisplay.querySelectorAll('.months-results').length); |
708 assertEquals(1, resultsDisplay.querySelectorAll('div').length); | 728 assertEquals(1, resultsDisplay.querySelectorAll('div').length); |
709 | 729 |
710 testDone(); | 730 testDone(); |
711 }); | 731 }); |
712 }); | 732 }); |
733 | |
734 /** | |
735 * Fixture for History WebUI testing when deletions are prohibited. | |
736 * @extends {BaseHistoryWebUITest} | |
737 * @constructor | |
738 */ | |
739 function HistoryWebUIDeleteProhibitedTest() {} | |
740 | |
741 HistoryWebUIDeleteProhibitedTest.prototype = { | |
742 __proto__: HistoryWebUITest.prototype, | |
743 | |
744 /** | |
745 * Don't stub out the 'removeVisits' call in this class. | |
746 * @override | |
747 */ | |
748 registerRemoveVisitsStub_: function() {}, | |
749 | |
750 /** @override */ | |
751 testGenPreamble: function() { | |
752 GEN(' SetDeleteAllowed(false);'); | |
753 }, | |
754 }; | |
755 | |
756 // Test UI when removing entries is prohibited. | |
757 TEST_F('HistoryWebUIDeleteProhibitedTest', 'deleteProhibited', function() { | |
758 // No checkboxes should be created. | |
759 var checkboxes = document.querySelectorAll( | |
760 '#results-display input[type=checkbox]'); | |
761 expectEquals(0, checkboxes.length); | |
762 | |
763 // The "remove" button should be disabled. | |
764 var removeButton = $('remove-selected'); | |
765 expectTrue(removeButton.disabled); | |
766 | |
767 // The "Remove from history" drop-down item should be disabled. | |
768 var removeVisit = $('remove-visit'); | |
769 expectTrue(removeVisit.disabled); | |
770 | |
771 // Attempting to remove items anyway should fail. | |
772 waitForCallback('deleteFailed', testDone); | |
773 var model = new HistoryModel(); | |
Patrick Dubroy
2013/04/18 14:15:19
Why are you creating a new HistoryModel here? Why
| |
774 model.removeVisitsFromHistory(this.fakeHistory_.slice(0, 2), function () { | |
775 // The callback is only called on success. | |
776 throw new Error('Delete succeeded even though it was prohibited.'); | |
777 testDone(); | |
Patrick Dubroy
2013/04/18 14:15:19
Hmmm, won't the test hang on failure then?
Pam (message me for reviews)
2013/04/18 14:41:44
In principle (I thought), if it "succeeds" (which
Patrick Dubroy
2013/04/18 14:55:53
All of these tests are required to call testDone()
| |
778 }); | |
779 }); | |
OLD | NEW |