// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. GEN('#include "chrome/browser/ui/webui/downloads_ui_browsertest.h"'); /** @const */ var TOTAL_RESULT_COUNT = 25; /** * Test C++ fixture for downloads WebUI testing. * @constructor * @extends {testing.Test} */ function DownloadsUIBrowserTest() {} /** * Base fixture for Downloads WebUI testing. * @extends {testing.Test} * @constructor */ function BaseDownloadsWebUITest() {} BaseDownloadsWebUITest.prototype = { __proto__: testing.Test.prototype, /** * Browse to the downloads page & call our preLoad(). */ browsePreload: 'chrome://downloads', /** @override */ typedefCppFixture: 'DownloadsUIBrowserTest', /** @override */ testGenPreamble: function() { GEN(' SetDeleteAllowed(true);'); }, /** * Sends TOTAL_RESULT_COUNT fake downloads to the page. This can't be called * in the preLoad, because it requires the global Download object to have * been created by the page. * @override */ setUp: function() { // The entries will begin at 1:00 AM on Sept 2, 2008, and will be spaced // two minutes apart. var timestamp = new Date(2008, 9, 2, 1, 0).getTime(); for (var i = 0; i < TOTAL_RESULT_COUNT; ++i) { downloads.updated(this.createDownload_(i, timestamp)); timestamp += 2 * 60 * 1000; // Next visit is two minutes later. } expectEquals(downloads.size(), TOTAL_RESULT_COUNT); }, /** * Creates a download object to be passed to the page, following the expected * backend format (see downloads_dom_handler.cc). * @param {number} A unique ID for the download. * @param {number} The time the download purportedly started. * @return {!Object} A fake download object. * @private */ createDownload_: function(id, timestamp) { return { id: id, started: timestamp, otr: false, state: Download.States.COMPLETE, retry: false, file_path: '/path/to/file', file_url: 'http://google.com/' + timestamp, file_name: 'download_' + timestamp, url: 'http://google.com/' + timestamp, file_externally_removed: false, danger_type: Download.DangerType.NOT_DANGEROUS, last_reason_text: '', since_string: 'today', date_string: 'today', percent: 100, progress_status_text: 'done', received: 128, }; }, /** * Asserts the correctness of the state of the UI elements * that delete the download history. * @param {boolean} allowDelete True if download history deletion is * allowed and false otherwise. * @param {boolean} expectControlsHidden True if the controls to delete * download history are expected to be hidden and false otherwise. */ testHelper: function(allowDelete, expectControlsHidden) { var clearAllElements = document.getElementsByClassName('clear-all-link'); var disabledElements = document.getElementsByClassName('disabled-link'); var removeLinkElements = document.getElementsByClassName('control-remove-link'); // "Clear all" should be a link only when deletions are allowed. expectEquals(allowDelete ? 1 : 0, clearAllElements.length); // There should be no disabled links when deletions are allowed. // On the other hand, when deletions are not allowed, "Clear All" // and all "Remove from list" links should be disabled. expectEquals(allowDelete ? 0 : TOTAL_RESULT_COUNT + 1, disabledElements.length); // All "Remove from list" items should be links when deletions are allowed. // On the other hand, when deletions are not allowed, all // "Remove from list" items should be text. expectEquals(allowDelete ? TOTAL_RESULT_COUNT : 0, removeLinkElements.length); if (allowDelete) { // "Clear all" should not be hidden. expectFalse(clearAllElements[0].hidden); // No "Remove from list" items should be hidden. expectFalse(removeLinkElements[0].hidden); } else { expectEquals(expectControlsHidden, disabledElements[0].hidden); } // The model is updated synchronously, even though the actual // back-end removal (tested elsewhere) is asynchronous. clearAll(); expectEquals(allowDelete ? 0 : TOTAL_RESULT_COUNT, downloads.size()); }, }; // Test UI when removing entries is allowed. TEST_F('BaseDownloadsWebUITest', 'DeleteAllowed', function() { this.testHelper(true, false); // TODO(pamg): Mock out the back-end calls, so we can also test removing a // single item. testDone(); }); /** * Fixture for Downloads WebUI testing when deletions are prohibited. * @extends {BaseDownloadsWebUITest} * @constructor */ function DownloadsWebUIDeleteProhibitedTest() {} DownloadsWebUIDeleteProhibitedTest.prototype = { __proto__: BaseDownloadsWebUITest.prototype, /** @override */ testGenPreamble: function() { GEN(' SetDeleteAllowed(false);'); }, }; // Test UI when removing entries is prohibited. TEST_F('DownloadsWebUIDeleteProhibitedTest', 'DeleteProhibited', function() { this.testHelper(false, false); // TODO(pamg): Mock out the back-end calls, so we can also test removing a // single item. testDone(); }); /** * Fixture for Downloads WebUI testing for a supervised user. * @extends {BaseDownloadsWebUITest} * @constructor */ function DownloadsWebUIForSupervisedUsersTest() {} DownloadsWebUIForSupervisedUsersTest.prototype = { __proto__: BaseDownloadsWebUITest.prototype, /** @override */ typedefCppFixture: 'DownloadsWebUIForSupervisedUsersTest', }; // Test UI for supervised users, removing entries should be disabled // and removal controls should be hidden. TEST_F('DownloadsWebUIForSupervisedUsersTest', 'SupervisedUsers', function() { this.testHelper(false, true); testDone(); });