| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |  | 
| 2 // Use of this source code is governed by a BSD-style license that can be |  | 
| 3 // found in the LICENSE file. |  | 
| 4 |  | 
| 5 var SetIconCommon = requireNative('setIcon').SetIconCommon; |  | 
| 6 var sendRequest = require('sendRequest').sendRequest; |  | 
| 7 |  | 
| 8 function loadImagePath(path, iconSize, actionType, callback) { |  | 
| 9   var img = new Image(); |  | 
| 10   img.onerror = function() { |  | 
| 11     console.error('Could not load ' + actionType + ' icon \'' + |  | 
| 12                   path + '\'.'); |  | 
| 13   }; |  | 
| 14   img.onload = function() { |  | 
| 15     var canvas = document.createElement('canvas'); |  | 
| 16     canvas.width = img.width > iconSize ? iconSize : img.width; |  | 
| 17     canvas.height = img.height > iconSize ? iconSize : img.height; |  | 
| 18 |  | 
| 19     var canvas_context = canvas.getContext('2d'); |  | 
| 20     canvas_context.clearRect(0, 0, canvas.width, canvas.height); |  | 
| 21     canvas_context.drawImage(img, 0, 0, canvas.width, canvas.height); |  | 
| 22     var imageData = canvas_context.getImageData(0, 0, canvas.width, |  | 
| 23                                                 canvas.height); |  | 
| 24     callback(imageData); |  | 
| 25   }; |  | 
| 26   img.src = path; |  | 
| 27 } |  | 
| 28 |  | 
| 29 function verifyImageData(imageData, iconSize) { |  | 
| 30   // Verify that this at least looks like an ImageData element. |  | 
| 31   // Unfortunately, we cannot use instanceof because the ImageData |  | 
| 32   // constructor is not public. |  | 
| 33   // |  | 
| 34   // We do this manually instead of using JSONSchema to avoid having these |  | 
| 35   // properties show up in the doc. |  | 
| 36   if (!('width' in imageData) || |  | 
| 37       !('height' in imageData) || |  | 
| 38       !('data' in imageData)) { |  | 
| 39     throw new Error( |  | 
| 40         'The imageData property must contain an ImageData object or' + |  | 
| 41         ' dictionary of ImageData objects.'); |  | 
| 42   } |  | 
| 43 |  | 
| 44   if (imageData.width > iconSize || |  | 
| 45       imageData.height > iconSize) { |  | 
| 46     throw new Error( |  | 
| 47         'The imageData property must contain an ImageData object that ' + |  | 
| 48         'is no larger than ' + iconSize + ' pixels square.'); |  | 
| 49   } |  | 
| 50 } |  | 
| 51 |  | 
| 52 function setIcon(details, callback, name, parameters, actionType) { |  | 
| 53   var iconSizes = [19, 38]; |  | 
| 54   if ('iconIndex' in details) { |  | 
| 55     sendRequest(name, [details, callback], parameters); |  | 
| 56   } else if ('imageData' in details) { |  | 
| 57     if (typeof details.imageData == 'object') { |  | 
| 58       var isEmpty = true; |  | 
| 59       for (var i = 0; i < iconSizes.length; i++) { |  | 
| 60         var sizeKey = iconSizes[i].toString(); |  | 
| 61         if (sizeKey in details.imageData) { |  | 
| 62           verifyImageData(details.imageData[sizeKey], iconSizes[i]); |  | 
| 63           isEmpty =false; |  | 
| 64         } |  | 
| 65       } |  | 
| 66 |  | 
| 67       if (!isEmpty) { |  | 
| 68         sendRequest(name, [details, callback], parameters, |  | 
| 69                     {nativeFunction: SetIconCommon}); |  | 
| 70       } else { |  | 
| 71         // If details.imageData is not dictionary with keys in set {'19', '38'}, |  | 
| 72         // it must be an ImageData object. |  | 
| 73         var sizeKey = iconSizes[0].toString(); |  | 
| 74         var imageData = details.imageData; |  | 
| 75         details.imageData = {}; |  | 
| 76         details.imageData[sizeKey] = imageData; |  | 
| 77         verifyImageData(details.imageData[sizeKey], iconSizes[0]); |  | 
| 78         sendRequest(name, [details, callback], parameters, |  | 
| 79                     {nativeFunction: SetIconCommon}); |  | 
| 80      } |  | 
| 81     } else { |  | 
| 82       throw new Error('imageData property has unexpected type.'); |  | 
| 83     } |  | 
| 84   } else if ('path' in details) { |  | 
| 85     if (typeof details.path == 'object') { |  | 
| 86       details.imageData = {}; |  | 
| 87       var isEmpty = true; |  | 
| 88       var processIconSize = function(index) { |  | 
| 89         if (index == iconSizes.length) { |  | 
| 90           delete details.path; |  | 
| 91           if (isEmpty) |  | 
| 92             throw new Error('The path property must not be empty.'); |  | 
| 93           sendRequest(name, [details, callback], parameters, |  | 
| 94                       {nativeFunction: SetIconCommon}); |  | 
| 95           return; |  | 
| 96         } |  | 
| 97         var sizeKey = iconSizes[index].toString(); |  | 
| 98         if (!(sizeKey in details.path)) { |  | 
| 99           processIconSize(index + 1); |  | 
| 100           return; |  | 
| 101         } |  | 
| 102         isEmpty = false; |  | 
| 103         loadImagePath(details.path[sizeKey], iconSizes[index], actionType, |  | 
| 104           function(imageData) { |  | 
| 105             details.imageData[sizeKey] = imageData; |  | 
| 106             processIconSize(index + 1); |  | 
| 107           }); |  | 
| 108       } |  | 
| 109 |  | 
| 110       processIconSize(0); |  | 
| 111     } else if (typeof details.path == 'string') { |  | 
| 112       var sizeKey = iconSizes[0].toString(); |  | 
| 113       details.imageData = {}; |  | 
| 114       loadImagePath(details.path, iconSizes[0], actionType, |  | 
| 115           function(imageData) { |  | 
| 116             details.imageData[sizeKey] = imageData; |  | 
| 117             delete details.path; |  | 
| 118             sendRequest(name, [details, callback], parameters, |  | 
| 119                         {nativeFunction: SetIconCommon}); |  | 
| 120       }); |  | 
| 121     } else { |  | 
| 122       throw new Error('The path property should contain either string or ' + |  | 
| 123                       'dictionary of strings.'); |  | 
| 124     } |  | 
| 125   } else { |  | 
| 126     throw new Error( |  | 
| 127         'Either the path or imageData property must be specified.'); |  | 
| 128   } |  | 
| 129 } |  | 
| 130 |  | 
| 131 exports.setIcon = setIcon; |  | 
| OLD | NEW | 
|---|