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
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)if (chrome.downloads.setShelfEnabled)
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  chrome.downloads.setShelfEnabled(false);
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochvar colors = {
9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  progressColor: '#0d0',
10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  arrow: '#555',
11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  danger: 'red',
12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  complete: 'green',
13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  paused: 'grey',
14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  background: 'white',
15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction drawLine(ctx, x1, y1, x2, y2) {
18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.beginPath();
19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.moveTo(x1, y1);
20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(x2, y2);
21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.stroke();
22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)Math.TAU = 2 * Math.PI;  // http://tauday.com/tau-manifesto
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)function drawProgressArc(ctx, startAngle, endAngle) {
27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var center = ctx.canvas.width/2;
28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineWidth = Math.round(ctx.canvas.width*0.1);
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ctx.beginPath();
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ctx.moveTo(center, center);
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ctx.arc(center, center, center * 0.9, startAngle, endAngle, false);
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ctx.fill();
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ctx.stroke();
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)function drawUnknownProgressSpinner(ctx) {
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  var center = ctx.canvas.width/2;
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const segments = 16;
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  var segArc = Math.TAU / segments;
40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  for (var seg = 0; seg < segments; ++seg) {
41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    ctx.fillStyle = ctx.strokeStyle = (
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      ((seg % 2) == 0) ? colors.progressColor : colors.background);
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    drawProgressArc(ctx, (seg-4)*segArc, (seg-3)*segArc);
44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)function drawProgressSpinner(ctx, stage) {
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ctx.fillStyle = ctx.strokeStyle = colors.progressColor;
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  var clocktop = -Math.TAU/4;
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  drawProgressArc(ctx, clocktop, clocktop + (stage * Math.TAU));
51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction drawArrow(ctx) {
54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.beginPath();
55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineWidth = Math.round(ctx.canvas.width*0.1);
56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineJoin = 'round';
57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.strokeStyle = ctx.fillStyle = colors.arrow;
58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var center = ctx.canvas.width/2;
59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var minw2 = center*0.2;
60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var maxw2 = center*0.60;
61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var height2 = maxw2;
62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.moveTo(center-minw2, center-height2);
63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(center+minw2, center-height2);
64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(center+minw2, center);
65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(center+maxw2, center);
66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(center, center+height2);
67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(center-maxw2, center);
68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(center-minw2, center);
69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(center-minw2, center-height2);
70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(center+minw2, center-height2);
71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.stroke();
72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.fill();
73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction drawDangerBadge(ctx) {
76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var s = ctx.canvas.width/100;
77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.fillStyle = colors.danger;
78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.strokeStyle = colors.background;
79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineWidth = Math.round(s*5);
80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var edge = ctx.canvas.width-ctx.lineWidth;
81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.beginPath();
82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.moveTo(s*75, s*55);
83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(edge, edge);
84d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(s*55, edge);
85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(s*75, s*55);
86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineTo(edge, edge);
87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.fill();
88d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.stroke();
89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
90d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
91d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction drawPausedBadge(ctx) {
92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var s = ctx.canvas.width/100;
93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.beginPath();
94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.strokeStyle = colors.background;
95d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineWidth = Math.round(s*5);
96d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.rect(s*55, s*55, s*15, s*35);
97d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.fillStyle = colors.paused;
98d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.fill();
99d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.stroke();
100d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.rect(s*75, s*55, s*15, s*35);
101d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.fill();
102d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.stroke();
103d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
104d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
105d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction drawCompleteBadge(ctx) {
106d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var s = ctx.canvas.width/100;
107d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.beginPath();
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ctx.arc(s*75, s*75, s*15, 0, Math.TAU, false);
109d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.fillStyle = colors.complete;
110d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.fill();
111d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.strokeStyle = colors.background;
112d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.lineWidth = Math.round(s*5);
113d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ctx.stroke();
114d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
115d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)function drawIcon(side, options) {
117d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var canvas = document.createElement('canvas');
118d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  canvas.width = canvas.height = side;
119d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  document.body.appendChild(canvas);
120d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var ctx = canvas.getContext('2d');
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (options.anyInProgress) {
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (options.anyMissingTotalBytes) {
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      drawUnknownProgressSpinner(ctx);
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    } else {
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      drawProgressSpinner(ctx, (options.totalBytesReceived /
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                options.totalTotalBytes));
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
128d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
129d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  drawArrow(ctx);
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (options.anyDangerous) {
131d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    drawDangerBadge(ctx);
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (options.anyPaused) {
133d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    drawPausedBadge(ctx);
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else if (options.anyRecentlyCompleted) {
135d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    drawCompleteBadge(ctx);
136d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
137d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return canvas;
138d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
139d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
140d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction maybeOpen(id) {
141d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var openWhenComplete = [];
142d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  try {
143d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    openWhenComplete = JSON.parse(localStorage.openWhenComplete);
144d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  } catch (e) {
145d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    localStorage.openWhenComplete = JSON.stringify(openWhenComplete);
146d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
147d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var openNowIndex = openWhenComplete.indexOf(id);
148d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (openNowIndex >= 0) {
149d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    chrome.downloads.open(id);
150d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    openWhenComplete.splice(openNowIndex, 1);
151d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    localStorage.openWhenComplete = JSON.stringify(openWhenComplete);
152d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
153d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
154d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)function setBrowserActionIcon(options) {
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  var canvas1 = drawIcon(19, options);
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  var canvas2 = drawIcon(38, options);
158d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var imageData = {};
159d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  imageData['' + canvas1.width] = canvas1.getContext('2d').getImageData(
160d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        0, 0, canvas1.width, canvas1.height);
161d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  imageData['' + canvas2.width] = canvas2.getContext('2d').getImageData(
162d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        0, 0, canvas2.width, canvas2.height);
163d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.browserAction.setIcon({imageData:imageData});
164d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  canvas1.parentNode.removeChild(canvas1);
165d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  canvas2.parentNode.removeChild(canvas2);
166d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
167d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
168d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction pollProgress() {
169d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  pollProgress.tid = -1;
170d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  chrome.downloads.search({}, function(items) {
171d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    var popupLastOpened = parseInt(localStorage.popupLastOpened);
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var options = {anyMissingTotalBytes: false,
1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   anyInProgress: false,
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   anyRecentlyCompleted: false,
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   anyPaused: false,
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   anyDangerous: false,
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   totalBytesReceived: 0,
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   totalTotalBytes: 0};
179d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    items.forEach(function(item) {
180d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      if (item.state == 'in_progress') {
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        options.anyInProgress = true;
182d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        if (item.totalBytes) {
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          options.totalTotalBytes += item.totalBytes;
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          options.totalBytesReceived += item.bytesReceived;
185d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        } else {
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          options.anyMissingTotalBytes = true;
187d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        }
188d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        var dangerous = ((item.danger != 'safe') &&
189d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                         (item.danger != 'accepted'));
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        options.anyDangerous = options.anyDangerous || dangerous;
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        options.anyPaused = options.anyPaused || item.paused;
192d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      } else if ((item.state == 'complete') && item.endTime && !item.error) {
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        options.anyRecentlyCompleted = (
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          options.anyRecentlyCompleted ||
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          ((new Date(item.endTime)).getTime() >= popupLastOpened));
196d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        maybeOpen(item.id);
197d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      }
198d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    });
199d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    var targetIcon = JSON.stringify(options);
201d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (sessionStorage.currentIcon != targetIcon) {
2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      setBrowserActionIcon(options);
203d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      sessionStorage.currentIcon = targetIcon;
204d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
205d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (options.anyInProgress &&
207d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        (pollProgress.tid < 0)) {
208d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      pollProgress.start();
209d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
210d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  });
211d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
212d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochpollProgress.tid = -1;
213d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochpollProgress.MS = 200;
214d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
215d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochpollProgress.start = function() {
216d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (pollProgress.tid < 0) {
217d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    pollProgress.tid = setTimeout(pollProgress, pollProgress.MS);
218d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
219d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
220d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
221d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction isNumber(n) {
222d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return !isNaN(parseFloat(n)) && isFinite(n);
223d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
224d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
225d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochif (!isNumber(localStorage.popupLastOpened)) {
226d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  localStorage.popupLastOpened = '' + (new Date()).getTime();
227d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
228d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
229d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochchrome.downloads.onCreated.addListener(function(item) {
230d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  pollProgress();
231d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch});
232d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
233d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochpollProgress();
234d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
235d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochfunction openWhenComplete(downloadId) {
236d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  var ids = [];
237d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  try {
238d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    ids = JSON.parse(localStorage.openWhenComplete);
239d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  } catch (e) {
240d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    localStorage.openWhenComplete = JSON.stringify(ids);
241d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
242d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  pollProgress.start();
243d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (ids.indexOf(downloadId) >= 0) {
244d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return;
245d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
246d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  ids.push(downloadId);
247d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  localStorage.openWhenComplete = JSON.stringify(ids);
248d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
249d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
250d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochchrome.runtime.onMessage.addListener(function(request) {
251d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (request == 'poll') {
252d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    pollProgress.start();
253d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
254d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (request == 'icons') {
255d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    [16, 19, 38, 128].forEach(function(s) {
2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      var canvas = drawIcon(s);
257d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      chrome.downloads.download({
258d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        url: canvas.toDataURL('image/png', 1.0),
259d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        filename: 'icon' + s + '.png',
260d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      });
261d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      canvas.parentNode.removeChild(canvas);
262d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    });
263d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
264d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (isNumber(request.openWhenComplete)) {
265d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    openWhenComplete(request.openWhenComplete);
266d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
267d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch});
268