diff options
author | dewittj@chromium.org <dewittj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-13 06:36:59 +0000 |
---|---|---|
committer | dewittj@chromium.org <dewittj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-13 06:36:59 +0000 |
commit | acf883a85d1bafb447d4c4ebae4687da988bf1cc (patch) | |
tree | db1a3581153dad897217b0a47ff0594ff922a71b /chrome/renderer | |
parent | a6d0eaab927118f866c1418ac038aecf5337b826 (diff) | |
download | chromium_src-acf883a85d1bafb447d4c4ebae4687da988bf1cc.zip chromium_src-acf883a85d1bafb447d4c4ebae4687da988bf1cc.tar.gz chromium_src-acf883a85d1bafb447d4c4ebae4687da988bf1cc.tar.bz2 |
Make notifications API send bitmaps instead of data URLs to the browser.
Currently we encode the image data downloaded from the net as a data
URL, which still needs to be sent back to a renderer to be converted
into a bitmap. This patch sends over an ImageData object which is
ready to be put into an SkBitmap (with a RGBA->ARGB conversion).
TBR=sky@chromium.org - Changes for ash/ tests with notifications
BUG=238823,232288,168943
Review URL: https://chromiumcodereview.appspot.com/15927043
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@206009 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/resources/extensions/image_util.js | 16 | ||||
-rw-r--r-- | chrome/renderer/resources/extensions/notifications_custom_bindings.js | 31 |
2 files changed, 17 insertions, 30 deletions
diff --git a/chrome/renderer/resources/extensions/image_util.js b/chrome/renderer/resources/extensions/image_util.js index c9a3994..7075c94 100644 --- a/chrome/renderer/resources/extensions/image_util.js +++ b/chrome/renderer/resources/extensions/image_util.js @@ -6,7 +6,7 @@ // corresponding to the internet URL to be translated - and optionally // |width| and |height| which are the maximum dimensions to be used when // converting the image. -function loadDataUrl(imageSpec, callbacks) { +function loadImageData(imageSpec, callbacks) { var path = imageSpec.path; var img = new Image(); if (typeof callbacks.onerror === 'function') { @@ -39,9 +39,11 @@ function loadDataUrl(imageSpec, callbacks) { canvas_context.clearRect(0, 0, canvas.width, canvas.height); canvas_context.drawImage(img, 0, 0, canvas.width, canvas.height); try { - var dataUrl = canvas.toDataURL(); + var imageData = canvas_context.getImageData( + 0, 0, canvas.width, canvas.height); if (typeof callbacks.oncomplete === 'function') { - callbacks.oncomplete(dataUrl); + callbacks.oncomplete( + imageData.width, imageData.height, imageData.data.buffer); } } catch (e) { if (typeof callbacks.onerror === 'function') { @@ -53,9 +55,9 @@ function loadDataUrl(imageSpec, callbacks) { } function on_complete_index(index, err, loading, finished, callbacks) { - return function(imageData) { + return function(width, height, imageData) { delete loading[index]; - finished[index] = imageData; + finished[index] = { width: width, height: height, data: imageData }; if (err) callbacks.onerror(index); if (Object.keys(loading).length == 0) @@ -69,12 +71,12 @@ function loadAllImages(imageSpecs, callbacks) { for (var index = 0; index < imageSpecs.length; index++) { loading[index] = imageSpecs[index]; - loadDataUrl(imageSpecs[index], { + loadImageData(imageSpecs[index], { oncomplete: on_complete_index(index, false, loading, finished, callbacks), onerror: on_complete_index(index, true, loading, finished, callbacks) }); } } -exports.loadDataUrl = loadDataUrl; +exports.loadImageData = loadImageData; exports.loadAllImages = loadAllImages; diff --git a/chrome/renderer/resources/extensions/notifications_custom_bindings.js b/chrome/renderer/resources/extensions/notifications_custom_bindings.js index 7c0aba3..0a5d13d 100644 --- a/chrome/renderer/resources/extensions/notifications_custom_bindings.js +++ b/chrome/renderer/resources/extensions/notifications_custom_bindings.js @@ -9,14 +9,7 @@ var sendRequest = require('sendRequest').sendRequest; var imageUtil = require('imageUtil'); var lastError = require('lastError'); -function url_getter(context, key) { - var f = function() { - return this[key]; - }; - return f.bind(context); -} - -function url_setter(context, key) { +function image_data_setter(context, key) { var f = function(val) { this[key] = val; }; @@ -26,36 +19,28 @@ function url_setter(context, key) { function replaceNotificationOptionURLs(notification_details, callback) { // A URL Spec is an object with the following keys: // path: The resource to be downloaded. + // width: (optional) The maximum width of the image to be downloaded. + // height: (optional) The maximum height of the image to be downloaded. // callback: A function to be called when the URL is complete. It // should accept an ImageData object and set the appropriate // field in the output of create. - // TODO(dewittj): Try to remove hard-coding. + // TODO(dewittj): Try to remove hard-coding of image sizes. // |iconUrl| is required. var url_specs = [{ path: notification_details.iconUrl, width: 80, height: 80, - callback: url_setter(notification_details, 'iconUrl') + callback: image_data_setter(notification_details, 'iconBitmap') }]; - // |secondIconUrl| is optional. - if (notification_details.secondIconUrl) { - url_specs.push({ - path: notification_details.secondIconUrl, - width: 80, - height: 80, - callback: url_setter(notification_details, 'secondIconUrl') - }); - } - // |imageUrl| is optional. if (notification_details.imageUrl) { url_specs.push({ path: notification_details.imageUrl, width: 360, height: 540, - callback: url_setter(notification_details, 'imageUrl') + callback: image_data_setter(notification_details, 'imageBitmap') }); } @@ -69,7 +54,7 @@ function replaceNotificationOptionURLs(notification_details, callback) { path: button_list[i].iconUrl, width: 16, height: 16, - callback: url_setter(button_list[i], 'iconUrl') + callback: image_data_setter(button_list[i], 'iconBitmap') }); } } @@ -125,7 +110,7 @@ var handleUpdate = genHandle('notifications.update', var notificationsCustomHook = function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('create', handleCreate); - apiFunctions.setHandleRequest('update', handleCreate); + apiFunctions.setHandleRequest('update', handleUpdate); }; binding.registerCustomHook(notificationsCustomHook); |