| Index: chrome/browser/resources/chromeos/active_downloads.js
|
| diff --git a/chrome/browser/resources/chromeos/active_downloads.js b/chrome/browser/resources/chromeos/active_downloads.js
|
| deleted file mode 100644
|
| index 6b9d16c89f5d2cae80ac3caa026632ad1c30b053..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/resources/chromeos/active_downloads.js
|
| +++ /dev/null
|
| @@ -1,635 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -/**
|
| - * Wrapper for chrome.send.
|
| - */
|
| -function chromeSend(func, arg) {
|
| - if (arg == undefined)
|
| - arg = '';
|
| -
|
| - // Convert to string.
|
| - if (typeof arg == 'number')
|
| - arg = '' + arg;
|
| -
|
| - chrome.send(func, [arg]);
|
| -};
|
| -
|
| -/**
|
| - * Create a child element.
|
| - *
|
| - * @param {string} type The type - div, span, etc.
|
| - * @param {string} className The class name
|
| - * @param {HTMLElement} parent Parent to append this child to.
|
| - * @param {string} textContent optional text content of child.
|
| - * @param {function(*)} onclick onclick function of child.
|
| - */
|
| -function createChild(type, className, parent, textContent, onclick) {
|
| - var elem = document.createElement(type);
|
| - elem.className = className;
|
| - if (textContent !== undefined)
|
| - elem.textContent = textContent;
|
| - elem.onclick = onclick;
|
| - parent.appendChild(elem);
|
| - return elem;
|
| -};
|
| -
|
| -var localStrings;
|
| -var downloadRowList;
|
| -
|
| -function init() {
|
| - localStrings = new LocalStrings();
|
| - initTestHarness();
|
| -
|
| - window.onkeydown = function(e) {
|
| - if (e.keyCode == 27) // Escape.
|
| - menu.clear();
|
| - e.preventDefault(); // Suppress browser shortcuts.
|
| - };
|
| -
|
| - document.body.addEventListener("blur", menu.clear);
|
| - document.body.addEventListener("click", menu.clear);
|
| - document.body.addEventListener("contextmenu", function (e) {
|
| - e.preventDefault(); });
|
| - document.body.addEventListener("selectstart", function (e) {
|
| - e.preventDefault(); });
|
| -
|
| - var sadt = $('showallfilestext');
|
| - sadt.textContent = localStrings.getString('showallfiles');
|
| - sadt.addEventListener("click", showAllFiles);
|
| -
|
| - downloadRowList = new DownloadRowList();
|
| - chromeSend('getDownloads');
|
| -}
|
| -
|
| -/**
|
| - * Testing. Allow this page to be loaded in a browser.
|
| - * Create stubs for localStrings and chrome.send.
|
| - */
|
| -function initTestHarness() {
|
| - if (location.protocol != 'file:')
|
| - return;
|
| -
|
| - // Enable right click for dom inspector.
|
| - document.body.oncontextmenu = '';
|
| -
|
| - // Fix localStrings.
|
| - localStrings = {
|
| - getString: function(name) {
|
| - if (name == 'showallfiles')
|
| - return 'Show all files';
|
| - if (name == 'dangerousextension')
|
| - return 'Extensions, apps, and themes can harm your computer.' +
|
| - ' Are you sure you want to continue?'
|
| - if (name == 'continue')
|
| - return 'Continue';
|
| - if (name == 'discard')
|
| - return 'Discard';
|
| - return name;
|
| - },
|
| - getStringF: function(name, path) {
|
| - return path + ' - Unknown file type.';
|
| - },
|
| - };
|
| -
|
| - // Log chrome.send calls.
|
| - chrome.send = function(name, ary) {
|
| - console.log('chrome.send ' + name + ' ' + ary);
|
| - if (name == 'getDownloads' ||
|
| - (name == 'openNewFullWindow' &&
|
| - ary[0] == 'chrome://downloads'))
|
| - sendTestResults();
|
| - };
|
| -
|
| - // Fix resource images.
|
| - var cssRules = document.styleSheets[0].cssRules;
|
| - for (var i = 0; i < cssRules.length; i++) {
|
| - var cssRule = cssRules[i];
|
| - if (cssRule.selectorText.match(/^div\.icon|^\.menuicon/)) {
|
| - cssRule.style.backgroundImage =
|
| - cssRule.style.backgroundImage.replace('chrome://resources', 'shared');
|
| - }
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * Create a results array with test data and call downloadsList.
|
| - */
|
| -var testElement;
|
| -var testId = 0;
|
| -var testResults = [];
|
| -function sendTestResults() {
|
| - var testState = (testId % 3 == 0 ? 'IN_PROGRESS' :
|
| - (testId % 3 == 1 ? 'DANGEROUS' : 'COMPLETE'));
|
| - state1 = (testId % 3 == 0);
|
| - testResults.push({
|
| - state: testState,
|
| - percent: (testId % 3 == 0 ? 90 : 100),
|
| - id: testId,
|
| - file_name: ' Test' + testId + '.pdf',
|
| - file_path: '/home/achuith/Downloads/Test' + testId + '.pdf',
|
| - progress_status_text : '107 MB/s - 108 MB of 672 MB, 5 secs left',
|
| - });
|
| - testId++;
|
| - downloadsList(testResults);
|
| -}
|
| -
|
| -/**
|
| - * Current Menu.
|
| - */
|
| -var menu = {
|
| - current_: null,
|
| -
|
| - /**
|
| - * Close the current menu.
|
| - */
|
| - clear: function() {
|
| - var current = this.current_;
|
| - if (current) {
|
| - current.firstChild.style.display = 'none';
|
| - current.style.opacity = '';
|
| - this.current_ = null;
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * If it's a second click on an open menu, close the menu.
|
| - * Otherwise, close any other open menu and open the clicked menu.
|
| - */
|
| - clicked: function(row) {
|
| - var menuicon = row.menuicon;
|
| - if (this.current_ === menuicon) {
|
| - this.clear();
|
| - return;
|
| - }
|
| - this.clear();
|
| - if (menuicon.firstChild.style.display != 'block') {
|
| - menuicon.firstChild.style.display = 'block';
|
| - menuicon.style.opacity = '1';
|
| - menuicon.scrollIntoView();
|
| - this.current_ = menuicon;
|
| - }
|
| - window.event.stopPropagation();
|
| - },
|
| -};
|
| -
|
| -function DiscardResult(result) {
|
| - return (result.state == 'CANCELLED' ||
|
| - result.state == 'INTERRUPTED' ||
|
| - result.state == 'REMOVING');
|
| -};
|
| -
|
| -/**
|
| - * C++ api calls.
|
| - */
|
| -function downloadsList(results) {
|
| - downloadRowList.list(results);
|
| -}
|
| -
|
| -function downloadUpdated(result) {
|
| - downloadRowList.update(result);
|
| -}
|
| -
|
| -function showAllFiles() {
|
| - chromeSend('showAllFiles');
|
| -}
|
| -
|
| -/**
|
| - * DownloadRow contains all the elements that go into a row of the downloads
|
| - * list. It represents a single DownloadItem.
|
| - *
|
| - * @param {DownloadRowList} list Global DownloadRowList.
|
| - * @param {Object} result JSON representation of DownloadItem.
|
| - * @constructor
|
| - */
|
| -function DownloadRow(list, result) {
|
| - this.path = result.file_path;
|
| - this.name = result.file_name;
|
| - this.fileUrl = result.file_url;
|
| - this.list = list;
|
| - this.id = result.id;
|
| -
|
| - this.createRow_(list);
|
| - this.createMenu_();
|
| - this.createRowButton_();
|
| - this.setMenuHidden_(true);
|
| -}
|
| -
|
| -DownloadRow.prototype = {
|
| - /**
|
| - * Create the row html element and book-keeping for the row.
|
| - * @param {DownloadRowList} list global DownloadRowList instance.
|
| - * @private
|
| - */
|
| - createRow_: function(list) {
|
| - var elem = document.createElement('li');
|
| - elem.className = 'downloadrow';
|
| - elem.id = this.path;
|
| - elem.row = this;
|
| - this.element = elem;
|
| -
|
| - list.append(this);
|
| - },
|
| -
|
| - setDangerousIcon_: function(warning) {
|
| - var escapedPath = encodeURIComponent(this.path).replace(/'/g,'%27');
|
| - this.icon.className = warning ? 'iconwarning' : 'icon';
|
| - this.icon.style.background = warning ? '' :
|
| - 'url(\'chrome://fileicon/' + escapedPath +
|
| - '?iconsize=small\') no-repeat';
|
| - },
|
| -
|
| - /**
|
| - * Create the row button for the left of the row.
|
| - * This contains the icon, filename and error elements.
|
| - * @private
|
| - */
|
| - createRowButton_: function () {
|
| - this.rowbutton = createChild('div', 'rowbutton rowbg', this.element);
|
| -
|
| - // Icon.
|
| - this.icon = createChild('div', 'icon', this.rowbutton);
|
| - this.setDangerousIcon_(false);
|
| -
|
| - // Filename.
|
| - this.filename = createChild('span', 'title', this.rowbutton, this.name);
|
| - },
|
| -
|
| - setMenuHidden_: function(hidden) {
|
| - this.menubutton.hidden = hidden;
|
| - if (hidden) {
|
| - this.rowbutton.style.width = '238px';
|
| - } else {
|
| - this.rowbutton.style.width = '';
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Create the menu button on the right of the row.
|
| - * This contains the menuicon. The menuicon contains the menu, which
|
| - * contains items for Pause/Resume and Cancel.
|
| - * @private
|
| - */
|
| - createMenu_: function() {
|
| - var self = this;
|
| - this.menubutton = createChild('div', 'menubutton rowbg', this.element, '',
|
| - function() {
|
| - menu.clicked(self);
|
| - });
|
| -
|
| - this.menuicon = createChild('div', 'menuicon', this.menubutton);
|
| -
|
| - var menudiv = createChild('div', 'menu', this.menuicon);
|
| -
|
| - this.pause = createChild('div', 'menuitem', menudiv,
|
| - localStrings.getString('pause'), function() {
|
| - self.pauseToggleDownload_();
|
| - });
|
| -
|
| - this.cancel = createChild('div', 'menuitem', menudiv,
|
| - localStrings.getString('cancel'), function() {
|
| - self.cancelDownload_();
|
| - });
|
| - },
|
| -
|
| - allowDownload_: function() {
|
| - chromeSend('allowDownload', this.id);
|
| - },
|
| -
|
| - cancelDownload_: function() {
|
| - chromeSend('cancelDownload', this.id);
|
| - },
|
| -
|
| - pauseToggleDownload_: function() {
|
| - this.pause.textContent =
|
| - (this.pause.textContent == localStrings.getString('pause')) ?
|
| - localStrings.getString('resume') :
|
| - localStrings.getString('pause');
|
| -
|
| - chromeSend('pauseToggleDownload', this.id);
|
| - },
|
| -
|
| - changeElemHeight_: function(elem, x) {
|
| - elem.style.height = elem.clientHeight + x + 'px';
|
| - },
|
| -
|
| - changeRowHeight_: function(x) {
|
| - this.list.rowsHeight += x;
|
| - this.changeElemHeight_(this.element, x);
|
| - // rowbutton has 5px padding.
|
| - this.changeElemHeight_(this.rowbutton, x - 5);
|
| - this.list.resize();
|
| - },
|
| -
|
| - DANGEROUS_HEIGHT: 60,
|
| - createDangerousPrompt_: function(dangerType) {
|
| - if (this.dangerous)
|
| - return;
|
| -
|
| - this.dangerous = createChild('div', 'dangerousprompt', this.rowbutton);
|
| -
|
| - // Handle dangerous files, extensions and dangerous urls.
|
| - var dangerText;
|
| - if (dangerType == 'DANGEROUS_URL') {
|
| - dangerText = localStrings.getString('dangerousurl');
|
| - } else if (dangerType == 'DANGEROUS_CONTENT') {
|
| - dangerText = localStrings.getStringF('dangerouscontent', this.name);
|
| - } else if (dangerType == 'UNCOMMON_CONTENT') {
|
| - dangerText = localStrings.getStringF('uncommoncontent', this.name);
|
| - } else if (dangerType == 'DANGEROUS_FILE' && this.path.match(/\.crx$/)) {
|
| - dangerText = localStrings.getString('dangerousextension');
|
| - } else {
|
| - dangerText = localStrings.getStringF('dangerousfile', this.name);
|
| - }
|
| - createChild('span', 'dangerousprompttext', this.dangerous, dangerText);
|
| -
|
| - var self = this;
|
| - createChild('span', 'confirm', this.dangerous,
|
| - localStrings.getString('discard'),
|
| - function() {
|
| - self.cancelDownload_();
|
| - });
|
| - createChild('span', 'confirm', this.dangerous,
|
| - localStrings.getString('continue'),
|
| - function() {
|
| - self.allowDownload_();
|
| - });
|
| -
|
| - this.changeRowHeight_(this.DANGEROUS_HEIGHT);
|
| - this.setDangerousIcon_(true);
|
| - },
|
| -
|
| - removeDangerousPrompt_: function() {
|
| - if (!this.dangerous)
|
| - return;
|
| -
|
| - this.rowbutton.removeChild(this.dangerous);
|
| - this.dangerous = null;
|
| -
|
| - this.changeRowHeight_(-this.DANGEROUS_HEIGHT);
|
| - this.setDangerousIcon_(false);
|
| - },
|
| -
|
| - PROGRESS_HEIGHT: 8,
|
| - createProgress_: function() {
|
| - if (this.progress)
|
| - return;
|
| -
|
| - this.progress = createChild('div', 'progress', this.rowbutton);
|
| -
|
| - this.setMenuHidden_(false);
|
| - this.changeRowHeight_(this.PROGRESS_HEIGHT);
|
| - },
|
| -
|
| - removeProgress_: function() {
|
| - if (!this.progress)
|
| - return;
|
| -
|
| - this.rowbutton.removeChild(this.progress);
|
| - this.progress = null;
|
| -
|
| - this.changeRowHeight_(-this.PROGRESS_HEIGHT);
|
| - this.setMenuHidden_(true);
|
| - },
|
| -
|
| - updatePause_: function(result) {
|
| - var pause = this.pause;
|
| - var pauseStr = localStrings.getString('pause');
|
| - var resumeStr = localStrings.getString('resume');
|
| -
|
| - if (pause &&
|
| - result.state == 'PAUSED' &&
|
| - pause.textContent != resumeStr) {
|
| - pause.textContent = resumeStr;
|
| - } else if (pause &&
|
| - result.state == 'IN_PROGRESS' &&
|
| - pause.textContent != pauseStr) {
|
| - pause.textContent = pauseStr;
|
| - }
|
| - },
|
| -
|
| - progressStatusText_: function(progress) {
|
| - if (!progress)
|
| - return progress;
|
| -
|
| - /* m looks like this:
|
| - ["107 MB/s - 108 MB of 672 MB, 5 secs left",
|
| - "107 MB/s", "108", "MB", "672", "MB", "5 secs left"]
|
| - We want to return progress text like this:
|
| - "108 / 672 MB, 5 secs left"
|
| - or
|
| - "108 kB / 672 MB, 5 secs left"
|
| - */
|
| - var m = progress.match(
|
| - /([^-]*) - ([0-9\.]*) ([a-zA-Z]*) of ([0-9\.]*) ([a-zA-Z]*), (.*)/);
|
| - if (!m || m.length != 7)
|
| - return progress;
|
| -
|
| - return m[2] + (m[3] == m[5] ? '' : ' ' + m[3]) +
|
| - ' / ' + m[4] + ' ' + m[5] + ', ' + m[6];
|
| - },
|
| -
|
| - updateProgress_: function(result) {
|
| - this.removeDangerousPrompt_();
|
| - this.createProgress_();
|
| - this.progress.textContent =
|
| - this.progressStatusText_(result.progress_status_text);
|
| - this.updatePause_(result);
|
| - },
|
| -
|
| - /**
|
| - * Called when the item has finished downloading. Switch the menu
|
| - * and remove the progress bar.
|
| - * @private
|
| - */
|
| - finishedDownloading_: function() {
|
| - // Make rowbutton clickable.
|
| - var self = this;
|
| - this.rowbutton.onclick = function() {
|
| - chromeSend('viewFile', self.path);
|
| - };
|
| -
|
| - this.rowbutton.style.cursor = 'pointer';
|
| -
|
| - // Make rowbutton draggable.
|
| - this.rowbutton.setAttribute('draggable', 'true');
|
| - var self = this;
|
| - this.rowbutton.addEventListener('dragstart', function(e) {
|
| - e.dataTransfer.effectAllowed = 'copy';
|
| - e.dataTransfer.setData('Text', self.path);
|
| - e.dataTransfer.setData('URL', self.fileUrl);
|
| - }, false);
|
| -
|
| - this.removeDangerousPrompt_();
|
| - this.removeProgress_();
|
| - },
|
| -
|
| - /**
|
| - * One of the DownloadItem we are observing has updated.
|
| - * @param {Object} result JSON representation of DownloadItem.
|
| - */
|
| - update: function(result) {
|
| - this.filename.textContent = result.file_name;
|
| - this.id = result.id;
|
| -
|
| - if (result.state != 'COMPLETE') {
|
| - this.rowbutton.onclick = '';
|
| - this.rowbutton.style.cursor = '';
|
| - }
|
| -
|
| - if (DiscardResult(result)) {
|
| - this.list.remove(this);
|
| - } else if (result.state == 'DANGEROUS') {
|
| - this.createDangerousPrompt_(result.danger_type);
|
| - } else if (result.percent < 100) {
|
| - this.updateProgress_(result);
|
| - } else if (result.state == 'COMPLETE') {
|
| - this.finishedDownloading_();
|
| - }
|
| - },
|
| -};
|
| -
|
| -/**
|
| - * DownloadRowList is a container for DownloadRows.
|
| - */
|
| -function DownloadRowList() {
|
| - this.element = createChild('ul', 'downloadlist', $('main'));
|
| -
|
| - document.title = localStrings.getString('downloadpath').
|
| - split('/').pop();
|
| -}
|
| -
|
| -DownloadRowList.prototype = {
|
| -
|
| - /**
|
| - * numRows is the current number of rows.
|
| - * rowsHeight is the sum of the heights of all rows.
|
| - * rowListHeight is the height of the container containing the rows.
|
| - * rows is the list of DownloadRows.
|
| - */
|
| - numRows: 0,
|
| - rowsHeight: 0,
|
| - rowListHeight: 72,
|
| - rows: [],
|
| -
|
| - /**
|
| - * Resize the panel to accomodate all rows.
|
| - */
|
| - resize: function() {
|
| - var diff = this.rowsHeight - this.rowListHeight;
|
| - if (diff != 0 && (this.rowListHeight + diff > 72)) {
|
| - window.resizeBy(0, diff);
|
| - this.rowListHeight += diff;
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Remove a row from the list, as when a download is canceled, or
|
| - * the the number of rows has exceeded the max allowed.
|
| - *
|
| - * @param {DownloadRow} row Row to be removed.
|
| - * @private
|
| - */
|
| - remove: function(row) {
|
| - this.rows.splice(this.rows.indexOf(row), 1);
|
| -
|
| - this.numRows--;
|
| - this.rowsHeight -= row.element.offsetHeight;
|
| - this.resize();
|
| -
|
| - this.element.removeChild(row.element);
|
| - row.element.row = null;
|
| - },
|
| -
|
| - removeList: function(rows) {
|
| - for (i = 0; i < rows.length; i++) {
|
| - this.remove(rows[i]);
|
| - }
|
| - },
|
| -
|
| - updateList: function(results) {
|
| - for (var i = 0; i < results.length; i++) {
|
| - this.update(results[i]);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Append a new row to the list, removing the last row if we exceed the
|
| - * maximum allowed.
|
| - * @param {DownloadRow} row Row to be removed.
|
| - */
|
| - append: function(row) {
|
| - this.rows.push(row);
|
| -
|
| - var elem = row.element;
|
| - var list = this.element;
|
| - if (list.firstChild) {
|
| - list.insertBefore(elem, list.firstChild);
|
| - } else {
|
| - list.appendChild(elem);
|
| - }
|
| -
|
| - this.rowsHeight += elem.offsetHeight;
|
| -
|
| - this.numRows++;
|
| - // We display no more than 5 elements.
|
| - if (this.numRows > 5)
|
| - this.remove(list.lastChild.row);
|
| -
|
| - this.resize();
|
| - },
|
| -
|
| - getRow: function(path) {
|
| - for (var i = 0; i < this.rows.length; i++) {
|
| - if (this.rows[i].path == path)
|
| - return this.rows[i];
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Returns the list of rows that are not in the results array.
|
| - * @param {Array} results Array of JSONified DownloadItems.
|
| - */
|
| - findMissing: function(results) {
|
| - var removeList = [];
|
| -
|
| - for (var i = 0; i < this.rows.length; i++) {
|
| - var row = this.rows[i];
|
| - var found = false;
|
| - for (var j = 0; j < results.length; j++) {
|
| - if (row.path == results[j].file_path) {
|
| - found = true;
|
| - break;
|
| - }
|
| - }
|
| - if (!found)
|
| - removeList.push(row);
|
| - }
|
| - return removeList;
|
| - },
|
| -
|
| - /**
|
| - * Handle list callback with list of DownloadItems.
|
| - * @param {Array} results Array of JSONified DownloadItems.
|
| - */
|
| - list: function(results) {
|
| - var rows = this.findMissing(results);
|
| - this.updateList(results);
|
| - this.removeList(rows);
|
| - },
|
| -
|
| - /**
|
| - * Handle update of a DownloadItem we're observing.
|
| - * @param {Object} result JSON representation of DownloadItem.
|
| - */
|
| - update: function(result) {
|
| - var row = this.getRow(result.file_path);
|
| - if (!row && !DiscardResult(result))
|
| - row = new DownloadRow(this, result);
|
| -
|
| - row && row.update(result);
|
| - },
|
| -};
|
| -
|
| -document.addEventListener('DOMContentLoaded', init);
|
|
|