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.
5 var SetIconCommon
= requireNative('setIcon').SetIconCommon
;
6 var sendRequest
= require('sendRequest').sendRequest
;
8 function loadImagePath(path
, iconSize
, actionType
, callback
) {
10 img
.onerror = function() {
11 console
.error('Could not load ' + actionType
+ ' icon \'' +
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
;
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
,
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.
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
)) {
40 'The imageData property must contain an ImageData object or' +
41 ' dictionary of ImageData objects.');
44 if (imageData
.width
> iconSize
||
45 imageData
.height
> iconSize
) {
47 'The imageData property must contain an ImageData object that ' +
48 'is no larger than ' + iconSize
+ ' pixels square.');
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') {
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
]);
68 sendRequest(name
, [details
, callback
], parameters
,
69 {nativeFunction
: SetIconCommon
});
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
});
82 throw new Error('imageData property has unexpected type.');
84 } else if ('path' in details
) {
85 if (typeof details
.path
== 'object') {
86 details
.imageData
= {};
88 var processIconSize = function(index
) {
89 if (index
== iconSizes
.length
) {
92 throw new Error('The path property must not be empty.');
93 sendRequest(name
, [details
, callback
], parameters
,
94 {nativeFunction
: SetIconCommon
});
97 var sizeKey
= iconSizes
[index
].toString();
98 if (!(sizeKey
in details
.path
)) {
99 processIconSize(index
+ 1);
103 loadImagePath(details
.path
[sizeKey
], iconSizes
[index
], actionType
,
104 function(imageData
) {
105 details
.imageData
[sizeKey
] = imageData
;
106 processIconSize(index
+ 1);
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
;
118 sendRequest(name
, [details
, callback
], parameters
,
119 {nativeFunction
: SetIconCommon
});
122 throw new Error('The path property should contain either string or ' +
123 'dictionary of strings.');
127 'Either the path or imageData property must be specified.');
131 exports
.setIcon
= setIcon
;