1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file. 4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction pointInElement(p, elem) { 6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return ((p.x >= elem.offsetLeft) && 7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch (p.x <= (elem.offsetLeft + elem.offsetWidth)) && 8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch (p.y >= elem.offsetTop) && 9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch (p.y <= (elem.offsetTop + elem.offsetHeight))); 10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction setLastOpened() { 13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch localStorage.popupLastOpened = (new Date()).getTime(); 14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.runtime.sendMessage('poll'); 15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction loadI18nMessages() { 18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch function setProperty(selector, prop, msg) { 19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.querySelector(selector)[prop] = chrome.i18n.getMessage(msg); 20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('title', 'innerText', 'tabTitle'); 23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('#q', 'placeholder', 'searchPlaceholder'); 24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('#clear-all', 'title', 'clearAllTitle'); 25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('#open-folder', 'title', 'openDownloadsFolderTitle'); 26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('#empty', 'innerText', 'zeroItems'); 27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('#searching', 'innerText', 'searching'); 28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('#search-zero', 'innerText', 'zeroSearchResults'); 29bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch setProperty('#management-permission-info', 'innerText', 30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 'managementPermissionInfo'); 31bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch setProperty('#grant-management-permission', 'innerText', 32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 'grantManagementPermission'); 33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('#older', 'innerText', 'showOlderDownloads'); 34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('#loading-older', 'innerText', 'loadingOlderDownloads'); 35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('.pause', 'title', 'pauseTitle'); 36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('.resume', 'title', 'resumeTitle'); 37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('.cancel', 'title', 'cancelTitle'); 38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('.show-folder', 'title', 'showInFolderTitle'); 39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('.erase', 'title', 'eraseTitle'); 40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('.url', 'title', 'retryTitle'); 41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('.referrer', 'title', 'referrerTitle'); 42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('.open-filename', 'title', 'openTitle'); 43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('#bad-chrome-version', 'innerText', 'badChromeVersion'); 44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setProperty('.remove-file', 'title', 'removeFileTitle'); 45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.querySelector('.progress').style.minWidth = 47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch getTextWidth(formatBytes(1024 * 1024 * 1023.9) + '/' + 48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch formatBytes(1024 * 1024 * 1023.9)) + 'px'; 49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // This only covers {timeLeft,openWhenComplete}{Finishing,Days}. If 51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // ...Hours/Minutes/Seconds could be longer for any locale, then this should 52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // test them. 53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var max_time_left_width = 0; 54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch for (var i = 0; i < 4; ++i) { 55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch max_time_left_width = Math.max(max_time_left_width, getTextWidth( 56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch formatTimeLeft(0 == (i % 2), 57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch (i < 2) ? 0 : ((100 * 24) + 23) * 60 * 60 * 1000))); 58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.querySelector('body div.item span.time-left').style.minWidth = 60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch max_time_left_width + 'px'; 61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction getTextWidth(s) { 64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var probe = document.getElementById('text-width-probe'); 65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch probe.innerText = s; 66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return probe.offsetWidth; 67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction formatDateTime(date) { 70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var now = new Date(); 71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var zpad_mins = ':' + (date.getMinutes() < 10 ? '0' : '') + date.getMinutes(); 72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (date.getYear() != now.getYear()) { 73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return '' + (1900 + date.getYear()); 74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else if ((date.getMonth() != now.getMonth()) || 75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch (date.getDate() != now.getDate())) { 76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return date.getDate() + ' ' + chrome.i18n.getMessage( 77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 'month' + date.getMonth() + 'abbr'); 78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else if (date.getHours() == 12) { 79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return '12' + zpad_mins + 'pm'; 80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else if (date.getHours() > 12) { 81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return (date.getHours() - 12) + zpad_mins + 'pm'; 82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return date.getHours() + zpad_mins + 'am'; 84d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction formatBytes(n) { 87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (n < 1024) { 88d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return n + 'B'; 89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 90d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var prefixes = 'KMGTPEZY'; 91d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var mul = 1024; 92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch for (var i = 0; i < prefixes.length; ++i) { 93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (n < (1024 * mul)) { 94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return (parseInt(n / mul) + '.' + parseInt(10 * ((n / mul) % 1)) + 95d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch prefixes[i] + 'B'); 96d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 97d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch mul *= 1024; 98d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 99d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return '!!!'; 100d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 101d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 102d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction formatTimeLeft(openWhenComplete, ms) { 103d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var prefix = openWhenComplete ? 'openWhenComplete' : 'timeLeft'; 104d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (ms < 1000) { 105d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return chrome.i18n.getMessage(prefix + 'Finishing'); 106d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 107d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var days = parseInt(ms / (24 * 60 * 60 * 1000)); 108d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var hours = parseInt(ms / (60 * 60 * 1000)) % 24; 109d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (days) { 110d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return chrome.i18n.getMessage(prefix + 'Days', [days, hours]); 111d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 112d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var minutes = parseInt(ms / (60 * 1000)) % 60; 113d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (hours) { 114d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return chrome.i18n.getMessage(prefix + 'Hours', [hours, minutes]); 115d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 116d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var seconds = parseInt(ms / 1000) % 60; 117d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (minutes) { 118d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return chrome.i18n.getMessage(prefix + 'Minutes', [minutes, seconds]); 119d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 120d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return chrome.i18n.getMessage(prefix + 'Seconds', [seconds]); 121d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 122d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)function ratchetWidth(w) { 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var current = parseInt(document.body.style.minWidth) || 0; 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) document.body.style.minWidth = Math.max(w, current) + 'px'; 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)function ratchetHeight(h) { 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var current = parseInt(document.body.style.minHeight) || 0; 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) document.body.style.minHeight = Math.max(h, current) + 'px'; 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 133d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction binarySearch(array, target, cmp) { 134d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var low = 0, high = array.length - 1, i, comparison; 135d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch while (low <= high) { 136d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch i = (low + high) >> 1; 137d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch comparison = cmp(target, array[i]); 138d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (comparison < 0) { 139d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch low = i + 1; 140d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else if (comparison > 0) { 141d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch high = i - 1; 142d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else { 143d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return i; 144d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 145d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 146d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return i; 147d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 148d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 149d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction arrayFrom(seq) { 150d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return Array.prototype.slice.apply(seq); 151d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 152d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 153d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction DownloadItem(data) { 154d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var item = this; 155d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch for (var prop in data) { 156d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item[prop] = data[prop]; 157d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 158d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.startTime = new Date(item.startTime); 159d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.canResume == undefined) { 160d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadItem.canResumeHack = true; 161d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 162d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 163d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.div = document.querySelector('body>div.item').cloneNode(true); 164d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.div.id = 'item' + item.id; 165d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.div.item = item; 166d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 167d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var items_div = document.getElementById('items'); 168d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if ((items_div.childNodes.length == 0) || 169d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch (item.startTime.getTime() < items_div.childNodes[ 170d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch items_div.childNodes.length - 1].item.startTime.getTime())) { 171d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch items_div.appendChild(item.div); 172d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else if (item.startTime.getTime() > 173d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch items_div.childNodes[0].item.startTime.getTime()) { 174d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch items_div.insertBefore(item.div, items_div.childNodes[0]); 175d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else { 176d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var adjacent_div = items_div.childNodes[ 177d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch binarySearch(arrayFrom(items_div.childNodes), 178d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.startTime.getTime(), 179d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch function(target, other) { 180d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return target - other.item.startTime.getTime(); 181d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch })]; 182d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var adjacent_item = adjacent_div.item; 183d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (adjacent_item.startTime.getTime() < item.startTime.getTime()) { 184d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch items_div.insertBefore(item.div, adjacent_div); 185d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else { 186d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch items_div.insertBefore(item.div, adjacent_div.nextSibling); 187d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 188d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 189d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 190d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('referrer').onclick = function() { 191d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.tabs.create({url: item.referrer}); 192d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 193d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) item.getElement('by-ext').onclick = function() { 195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) chrome.tabs.create({url: 'chrome://extensions#' + item.byExtensionId}); 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 198d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('open-filename').onclick = function() { 199d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.open(); 200d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 201d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 202d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('open-filename').ondragstart = function() { 203d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.drag(); 204d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 205d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 206d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('pause').onclick = function() { 207d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.pause(); 208d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 209d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 210d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('cancel').onclick = function() { 211d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.cancel(); 212d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 213d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 214d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('resume').onclick = function() { 215d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.resume(); 216d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 217d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 218d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('show-folder').onclick = function() { 219d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.show(); 220d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 221d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 222d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('remove-file').onclick = function() { 223d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.removeFile(); 224d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 225d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 226d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('erase').onclick = function() { 227d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.erase(); 228d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 229d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 230d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 231d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.more_mousemove = function(evt) { 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) var mouse = {x:evt.x, y:evt.y+document.body.scrollTop}; 233d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.getElement('more') && 2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) (pointInElement(mouse, item.div) || 2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) pointInElement(mouse, item.getElement('more')))) { 236d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return; 237d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 238d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.getElement('more')) { 239d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('more').hidden = true; 240d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 241d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch window.removeEventListener('mousemove', item.more_mousemove); 242d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) [item.div, item.getElement('more')].concat( 244d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('more').children).forEach(function(elem) { 245d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch elem.onmouseover = function() { 246d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch arrayFrom(items_div.children).forEach(function(other) { 247d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (other.item != item) { 248d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch other.item.getElement('more').hidden = true; 249d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 250d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 251d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('more').hidden = false; 252d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('more').style.top = 253d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch (item.div.offsetTop + item.div.offsetHeight) + 'px'; 254d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('more').style.left = item.div.offsetLeft + 'px'; 255d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (window.innerHeight < (parseInt(item.getElement('more').style.top) + 256d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('more').offsetHeight)) { 257d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('more').style.top = ( 258d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.div.offsetTop - item.getElement('more').offsetHeight) + 'px'; 259d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 260d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch window.addEventListener('mousemove', item.more_mousemove); 261d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 262d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 263d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 264d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.referrer) { 265d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('referrer').href = item.referrer; 266d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else { 267d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('referrer').hidden = true; 268d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 269d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('url').href = item.url; 270d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('url').innerText = item.url; 271d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.render(); 272d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 273d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.canResumeHack = false; 274d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 275d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.getElement = function(name) { 276d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return document.querySelector('#item' + this.id + ' .' + name); 277d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 278d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 279d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.render = function() { 280d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var item = this; 281d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var now = new Date(); 282d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var in_progress = (item.state == 'in_progress') 283d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var openable = (item.state != 'interrupted') && item.exists && !item.deleted; 284d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 285d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.startTime = new Date(item.startTime); 286d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (DownloadItem.canResumeHack) { 287d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.canResume = in_progress && item.paused; 288d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 289d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.filename) { 290d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.basename = item.filename.substring(Math.max( 291d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.filename.lastIndexOf('\\'), 292d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.filename.lastIndexOf('/')) + 1); 293d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 294d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.estimatedEndTime) { 295d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.estimatedEndTime = new Date(item.estimatedEndTime); 296d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 297d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.endTime) { 298d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.endTime = new Date(item.endTime); 299d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 300d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 301d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.filename && !item.icon_url) { 302d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.getFileIcon( 303d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.id, 304d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch {'size': 32}, 305d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch function(icon_url) { 306d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('icon').hidden = !icon_url; 307d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (icon_url) { 308d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.icon_url = icon_url; 309d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('icon').src = icon_url; 310d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 311d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 312d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 313d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 314bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch item.getElement('removed').style.display = openable ? 'none' : 'inline'; 315d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('open-filename').style.display = ( 316bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch openable ? 'inline' : 'none'); 317d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('in-progress').hidden = !in_progress; 318d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('pause').style.display = ( 319d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch !in_progress || item.paused) ? 'none' : 'inline-block'; 320d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('resume').style.display = ( 321d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch !in_progress || !item.canResume) ? 'none' : 'inline-block'; 322d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('cancel').style.display = ( 323d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch !in_progress ? 'none' : 'inline-block'); 324d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('remove-file').hidden = ( 325d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch (item.state != 'complete') || 326d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch !item.exists || 327d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.deleted || 328d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch !chrome.downloads.removeFile); 329d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('erase').hidden = in_progress; 330d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 331d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var could_progress = in_progress || item.canResume; 332d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('progress').style.display = ( 333d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch could_progress ? 'inline-block' : 'none'); 334d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('meter').hidden = !could_progress || !item.totalBytes; 335d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 336d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('removed').innerText = item.basename; 337d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('open-filename').innerText = item.basename; 338d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 339bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch function setByExtension(show) { 340bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (show) { 341bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch item.getElement('by-ext').title = item.byExtensionName; 342bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch item.getElement('by-ext').href = 343bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 'chrome://extensions#' + item.byExtensionId; 344bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch item.getElement('by-ext img').src = 345bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 'chrome://extension-icon/' + item.byExtensionId + '/48/1'; 346bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } else { 347bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch item.getElement('by-ext').hidden = true; 348bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 349bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 350a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (item.byExtensionId && item.byExtensionName) { 351bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch chrome.permissions.contains({permissions: ['management']}, 352bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch function(result) { 353bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (result) { 354bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch setByExtension(true); 355bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } else { 356bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch setByExtension(false); 357bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (!localStorage.managementPermissionDenied) { 358bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch document.getElementById('request-management-permission').hidden = 359bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch false; 360bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch document.getElementById('grant-management-permission').onclick = 361bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch function() { 362bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch chrome.permissions.request({permissions: ['management']}, 363bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch function(granted) { 364bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch setByExtension(granted); 365bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch if (!granted) { 366bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch localStorage.managementPermissionDenied = true; 367bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 368bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch }); 369bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return false; 370bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch }; 371bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 372bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 373bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch }); 374a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 375bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch setByExtension(false); 376a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 377a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 378d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!item.getElement('error').hidden) { 379d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.error) { 380d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // TODO(benjhayden) When https://codereview.chromium.org/16924017/ is 381d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // released, set minimum_chrome_version and remove the error_N messages. 382d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('error').innerText = chrome.i18n.getMessage( 383d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 'error_' + item.error); 384d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!item.getElement('error').innerText) { 385d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('error').innerText = item.error; 386d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 387d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else if (!openable) { 388d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('error').innerText = chrome.i18n.getMessage( 389d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 'errorRemoved'); 390d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 391d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 392d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 393d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('complete-size').innerText = formatBytes( 394d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.bytesReceived); 395d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.totalBytes && (item.state != 'complete')) { 396d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('progress').innerText = ( 397d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('complete-size').innerText + '/' + 398d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch formatBytes(item.totalBytes)); 399d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('meter').children[0].style.width = parseInt( 400d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 100 * item.bytesReceived / item.totalBytes) + '%'; 401d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 402d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 403d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (in_progress) { 404d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.estimatedEndTime && !item.paused) { 405d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var openWhenComplete = false; 406d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch try { 407d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch openWhenComplete = JSON.parse(localStorage.openWhenComplete).indexOf( 408d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.id) >= 0; 409d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } catch (e) { 410d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 411d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('time-left').innerText = formatTimeLeft( 412d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch openWhenComplete, item.estimatedEndTime.getTime() - now.getTime()); 413d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else { 414d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('time-left').innerText = String.fromCharCode(160); 415d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 416d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 417d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 418d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item.startTime) { 419d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.getElement('start-time').innerText = formatDateTime( 420d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.startTime); 421d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 422d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 4233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ratchetWidth(item.getElement('icon').offsetWidth + 4243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) item.getElement('file-url').offsetWidth + 4253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) item.getElement('cancel').offsetWidth + 4263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) item.getElement('pause').offsetWidth + 4273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) item.getElement('resume').offsetWidth); 4283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ratchetWidth(item.getElement('more').offsetWidth); 4293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 430d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch this.maybeAccept(); 431d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 432d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 433d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.onChanged = function(delta) { 434d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch for (var key in delta) { 435d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (key != 'id') { 436d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch this[key] = delta[key].current; 437d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 438d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 439d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch this.render(); 440d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (delta.state) { 441d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setLastOpened(); 442d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 443d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if ((this.state == 'in_progress') && !this.paused) { 444d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.startPollingProgress(); 445d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 446d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 447d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 448d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.onErased = function() { 449d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch window.removeEventListener('mousemove', this.more_mousemove); 450d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('items').removeChild(this.div); 451d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 452d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 453d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.drag = function() { 454d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.drag(this.id); 455d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 456d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 457d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.show = function() { 458d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.show(this.id); 459d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 460d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 461d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.open = function() { 462d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (this.state == 'complete') { 463d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.open(this.id); 464d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return; 465d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 466d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.runtime.sendMessage({openWhenComplete:this.id}); 467d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 468d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 469d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.removeFile = function() { 470d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.removeFile(this.id); 471d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch this.deleted = true; 472d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch this.render(); 473d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 474d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 475d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.erase = function() { 476d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.erase({id: this.id}); 477d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 478d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 479d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.pause = function() { 480d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.pause(this.id); 481d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 482d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 483d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.resume = function() { 484d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.resume(this.id); 485d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 486d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 487d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.cancel = function() { 488d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.cancel(this.id); 489d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 490d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 491d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.maybeAccept = function() { 492d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // This function is safe to call at any time for any item, and it will always 493d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // do the right thing, which is to display the danger prompt only if the item 494d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // is in_progress and dangerous, and if the prompt is not already displayed. 495d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if ((this.state != 'in_progress') || 496d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch (this.danger == 'safe') || 497d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch (this.danger == 'accepted') || 498d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadItem.prototype.maybeAccept.accepting_danger) { 499d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return; 500d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 5013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ratchetWidth(400); 5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ratchetHeight(200); 503d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadItem.prototype.maybeAccept.accepting_danger = true; 504424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // On Mac, window.onload is run while the popup is animating in, before it is 505424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // considered "visible". Prompts will not be displayed over an invisible 506424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // window, so the popup will become stuck. Just wait a little bit for the 507424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // window to finish animating in. http://crbug.com/280107 5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This has been fixed, so this setTimeout can be removed when the fix has 5094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // been released to stable, and minimum_chrome_version can be set. 510424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) var id = this.id; 511424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) setTimeout(function() { 512424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) chrome.downloads.acceptDanger(id, function() { 513424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DownloadItem.prototype.maybeAccept.accepting_danger = false; 514424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) arrayFrom(document.getElementById('items').childNodes).forEach( 515424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) function(item_div) { item_div.item.maybeAccept(); }); 516424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) }); 517424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) }, 500); 518d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 519d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadItem.prototype.maybeAccept.accepting_danger = false; 520d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 521d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvar DownloadManager = {}; 522d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 523d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.showingOlder = false; 524d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 525d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.getItem = function(id) { 526d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var item_div = document.getElementById('item' + id); 527d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return item_div ? item_div.item : null; 528d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 529d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 530d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.getOrCreate = function(data) { 531d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var item = DownloadManager.getItem(data.id); 532d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return item ? item : new DownloadItem(data); 533d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 534d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 535d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.forEachItem = function(cb) { 536d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Calls cb(item, index) in the order that they are displayed, i.e. in order 537d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // of decreasing startTime. 538d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch arrayFrom(document.getElementById('items').childNodes).forEach( 539d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch function(item_div, index) { cb(item_div.item, index); }); 540d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 541d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 542d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.startPollingProgress = function() { 543d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (DownloadManager.startPollingProgress.tid < 0) { 544d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.startPollingProgress.tid = setTimeout( 545d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.startPollingProgress.pollProgress, 546d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.startPollingProgress.MS); 547d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 548d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 549d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.startPollingProgress.MS = 200; 550d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.startPollingProgress.tid = -1; 551d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.startPollingProgress.pollProgress = function() { 552d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.startPollingProgress.tid = -1; 553d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.search({state: 'in_progress', paused: false}, 554d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch function(results) { 555d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!results.length) 556d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return; 557d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch results.forEach(function(result) { 558d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var item = DownloadManager.getOrCreate(result); 559d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch for (var prop in result) { 560d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item[prop] = result[prop]; 561d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 562d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.render(); 563d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if ((item.state == 'in_progress') && !item.paused) { 564d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.startPollingProgress(); 565d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 566d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 567d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 568d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 569d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 570d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.showNew = function() { 571d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var any_items = (document.getElementById('items').childNodes.length > 0); 572d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('empty').style.display = 573d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch any_items ? 'none' : 'inline-block'; 574bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch document.getElementById('head').style.borderBottomWidth = 575bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch (any_items ? 1 : 0) + 'px'; 576d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('clear-all').hidden = !any_items; 577d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 578d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var query_search = document.getElementById('q'); 579d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch query_search.hidden = !any_items; 580d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 581d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!any_items) { 582d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return; 583d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 584d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var old_ms = (new Date()).getTime() - kOldMs; 585d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var any_hidden = false; 586d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var any_showing = false; 587d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // First show up to kShowNewMax items newer than kOldMs. If there aren't any 588d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // items newer than kOldMs, then show up to kShowNewMax items of any age. If 589d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // there are any hidden items, show the Show Older button. 590d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.forEachItem(function(item, index) { 591d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.div.hidden = !DownloadManager.showingOlder && ( 592d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch (item.startTime.getTime() < old_ms) || (index >= kShowNewMax)); 593d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch any_hidden = any_hidden || item.div.hidden; 594d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch any_showing = any_showing || !item.div.hidden; 595d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 596d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!any_showing) { 597d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch any_hidden = false; 598d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.forEachItem(function(item, index) { 599d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.div.hidden = !DownloadManager.showingOlder && (index >= kShowNewMax); 600d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch any_hidden = any_hidden || item.div.hidden; 601d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch any_showing = any_showing || !item.div.hidden; 602d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 603d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 604d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('older').hidden = !any_hidden; 605d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 606d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch query_search.focus(); 607d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 608d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 609d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.showOlder = function() { 610d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.showingOlder = true; 611d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var loading_older_span = document.getElementById('loading-older'); 612d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('older').hidden = true; 613d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch loading_older_span.hidden = false; 614d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.search({}, function(results) { 615d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch results.forEach(function(result) { 616d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var item = DownloadManager.getOrCreate(result); 617d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.div.hidden = false; 618d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 619d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch loading_older_span.hidden = true; 620d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 621d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 622d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 623d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.onSearch = function() { 624d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // split string by space, but ignore space in quotes 625d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // http://stackoverflow.com/questions/16261635 626d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var query = document.getElementById('q').value.match(/(?:[^\s"]+|"[^"]*")+/g); 627d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!query) { 628d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.showNew(); 629d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('search-zero').hidden = true; 630d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else { 631d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch query = query.map(function(term) { 632d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // strip quotes 633d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return (term.match(/\s/) && 634d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch term[0].match(/["']/) && 635d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch term[term.length - 1] == term[0]) ? 636d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch term.substr(1, term.length - 2) : term; 637d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 638d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var searching = document.getElementById('searching'); 639d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch searching.hidden = false; 640d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.search({query: query}, function(results) { 641d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('older').hidden = true; 642d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.forEachItem(function(item) { 643d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.div.hidden = true; 644d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 645d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch results.forEach(function(result) { 646d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.getOrCreate(result).div.hidden = false; 647d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 648d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch searching.hidden = true; 649d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('search-zero').hidden = (results.length != 0); 650d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 651d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 652d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 653d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 654d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.clearAll = function() { 655d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.forEachItem(function(item) { 656d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!item.div.hidden) { 657d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.erase(); 658d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // The onErased handler should circle back around to loadItems. 659d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 660d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 661d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 662d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 663d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvar kShowNewMax = 50; 664d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvar kOldMs = 1000 * 60 * 60 * 24 * 7; 665d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 666d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// These settings can be tuned by modifying localStorage in dev-tools. 667d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochif ('kShowNewMax' in localStorage) { 668d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch kShowNewMax = parseInt(localStorage.kShowNewMax); 669d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 670d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochif ('kOldMs' in localStorage) { 671d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch kOldMs = parseInt(localStorage.kOldMs); 672d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 673d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 674d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.loadItems = function() { 675d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Request up to kShowNewMax + 1, but only display kShowNewMax; the +1 is a 676d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // probe to see if there are any older downloads. 677d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // TODO(benjhayden) When https://codereview.chromium.org/16924017/ is 678d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // released, set minimum_chrome_version and remove this try/catch. 679d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch try { 680d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.search({ 681d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch orderBy: ['-startTime'], 682d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch limit: kShowNewMax + 1}, 683d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch function(results) { 684d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.loadItems.items = results; 685d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.loadItems.onLoaded(); 686d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 687d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } catch (exc) { 688d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.search({ 689d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch orderBy: '-startTime', 690d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch limit: kShowNewMax + 1}, 691d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch function(results) { 692d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.loadItems.items = results; 693d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.loadItems.onLoaded(); 694d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 695d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 696d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 697d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.loadItems.items = []; 698d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.loadItems.window_loaded = false; 699d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 700d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.loadItems.onLoaded = function() { 701d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!DownloadManager.loadItems.window_loaded) { 702d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return; 703d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 704d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.loadItems.items.forEach(function(item) { 705d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.getOrCreate(item); 706d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 707d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.loadItems.items = []; 708d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.showNew(); 709d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 710d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 711d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochDownloadManager.loadItems.onWindowLoaded = function() { 712d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.loadItems.window_loaded = true; 713d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.loadItems.onLoaded(); 714d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 715d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 716d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// If this extension is installed on a stable-channel chrome, where the 717d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// downloads API is not available, do not use the downloads API, and link to the 718d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// beta channel. 719d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochif (chrome.downloads) { 720d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Start searching ASAP, don't wait for onload. 721d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.loadItems(); 722d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 723d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.onCreated.addListener(function(item) { 724d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.getOrCreate(item); 725d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.showNew(); 726d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.startPollingProgress(); 727d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 728d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 729d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.onChanged.addListener(function(delta) { 730d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var item = DownloadManager.getItem(delta.id); 731d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (item) { 732d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.onChanged(delta); 733d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 734d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 735d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 736d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.onErased.addListener(function(id) { 737d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var item = DownloadManager.getItem(id); 738d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (!item) { 739d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return; 740d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 741d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch item.onErased(); 742d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.loadItems(); 743d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }); 744d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 745d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch window.onload = function() { 7463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ratchetWidth( 747bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch document.getElementById('q-outer').offsetWidth + 748d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('clear-all').offsetWidth + 7493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) document.getElementById('open-folder').offsetWidth); 750d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch setLastOpened(); 751d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch loadI18nMessages(); 752d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.loadItems.onWindowLoaded(); 753d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('older').onclick = function() { 754d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.showOlder(); 755d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 756d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 757d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('q').onsearch = function() { 758d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.onSearch(); 759d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 760d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('clear-all').onclick = function() { 761d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DownloadManager.clearAll(); 762d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 763d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 764d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (chrome.downloads.showDefaultFolder) { 765d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('open-folder').onclick = function() { 766d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.downloads.showDefaultFolder(); 767d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 768d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 769d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } else { 770d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('open-folder').hidden = true; 771d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 772d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 773d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} else { 774d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // The downloads API is not available. 775d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // TODO(benjhayden) Remove this when minimum_chrome_version is set. 776d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch window.onload = function() { 777d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch loadI18nMessages(); 778d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch var bad_version = document.getElementById('bad-chrome-version'); 779d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch bad_version.hidden = false; 780d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch bad_version.onclick = function() { 781d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch chrome.tabs.create({url: bad_version.href}); 782d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch return false; 783d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 784d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('empty').style.display = 'none'; 785d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('q').style.display = 'none'; 786d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('open-folder').style.display = 'none'; 787d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch document.getElementById('clear-all').style.display = 'none'; 788d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch }; 789d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 790