Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Unified Diff: chrome/browser/extensions/api/notifications/notifications_api.cc

Issue 2659533003: Remove the notificationProvider extension API (Closed)
Patch Set: Remove the notificationProvider extension API Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/notifications/notifications_api.cc
diff --git a/chrome/browser/extensions/api/notifications/notifications_api.cc b/chrome/browser/extensions/api/notifications/notifications_api.cc
index 72bdeaeeadcfb1420db3556aec9c43887ebc4b82..4cfd3ce517da92fa0455e0f8d5cbc9df84a06e2c 100644
--- a/chrome/browser/extensions/api/notifications/notifications_api.cc
+++ b/chrome/browser/extensions/api/notifications/notifications_api.cc
@@ -21,7 +21,6 @@
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/notifications/notification.h"
-#include "chrome/browser/notifications/notification_conversion_helper.h"
#include "chrome/browser/notifications/notification_ui_manager.h"
#include "chrome/browser/notifications/notifier_state_tracker.h"
#include "chrome/browser/notifications/notifier_state_tracker_factory.h"
@@ -46,6 +45,7 @@
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/image/image_skia_operations.h"
#include "ui/gfx/image/image_skia_rep.h"
+#include "ui/gfx/skia_util.h"
#include "ui/message_center/message_center_style.h"
#include "ui/message_center/notifier_settings.h"
#include "url/gurl.h"
@@ -125,6 +125,65 @@ const gfx::Image GetMaskedSmallImage(const gfx::ImageSkia& small_image) {
background, masked_small_image));
}
+// Converts the |notification_bitmap| (in RGBA format) to the |*return_image|
+// (which is in ARGB format).
+bool NotificationBitmapToGfxImage(
+ float max_scale,
+ const gfx::Size& target_size_dips,
+ const notifications::NotificationBitmap& notification_bitmap,
+ gfx::Image* return_image) {
+ const int max_device_pixel_width = target_size_dips.width() * max_scale;
+ const int max_device_pixel_height = target_size_dips.height() * max_scale;
+
+ const int kBytesPerPixel = 4;
+
+ const int width = notification_bitmap.width;
+ const int height = notification_bitmap.height;
+
+ if (width < 0 || height < 0 || width > max_device_pixel_width ||
+ height > max_device_pixel_height)
+ return false;
+
+ // Ensure we have rgba data.
+ std::vector<char>* rgba_data = notification_bitmap.data.get();
+ if (!rgba_data)
+ return false;
+
+ const size_t rgba_data_length = rgba_data->size();
+ const size_t rgba_area = width * height;
+
+ if (rgba_data_length != rgba_area * kBytesPerPixel)
+ return false;
+
+ SkBitmap bitmap;
+ // Allocate the actual backing store with the sanitized dimensions.
+ if (!bitmap.tryAllocN32Pixels(width, height))
+ return false;
+
+ // Ensure that our bitmap and our data now refer to the same number of pixels.
+ if (rgba_data_length != bitmap.getSafeSize())
+ return false;
+
+ uint32_t* pixels = bitmap.getAddr32(0, 0);
+ const char* c_rgba_data = rgba_data->data();
+
+ for (size_t t = 0; t < rgba_area; ++t) {
+ // |c_rgba_data| is RGBA, pixels is ARGB.
+ size_t rgba_index = t * kBytesPerPixel;
+ pixels[t] =
+ SkPreMultiplyColor(((c_rgba_data[rgba_index + 3] & 0xFF) << 24) |
+ ((c_rgba_data[rgba_index + 0] & 0xFF) << 16) |
+ ((c_rgba_data[rgba_index + 1] & 0xFF) << 8) |
+ ((c_rgba_data[rgba_index + 2] & 0xFF) << 0));
+ }
+
+ // TODO(dewittj): Handle HiDPI images with more than one scale factor
+ // representation.
+ gfx::ImageSkia skia(gfx::ImageSkiaRep(bitmap, 1.0f));
+ *return_image = gfx::Image(skia);
+ return true;
+}
+
class ShutdownNotifierFactory
: public BrowserContextKeyedServiceShutdownNotifierFactory {
public:
@@ -322,7 +381,7 @@ bool NotificationsApiFunction::CreateNotification(
gfx::Image icon;
if (!options->icon_bitmap.get() ||
- !NotificationConversionHelper::NotificationBitmapToGfxImage(
+ !NotificationBitmapToGfxImage(
image_scale, bitmap_sizes.icon_size, *options->icon_bitmap, &icon)) {
SetError(kUnableToDecodeIconError);
return false;
@@ -332,7 +391,7 @@ bool NotificationsApiFunction::CreateNotification(
message_center::RichNotificationData optional_fields;
if (options->app_icon_mask_url.get()) {
gfx::Image small_icon_mask;
- if (!NotificationConversionHelper::NotificationBitmapToGfxImage(
+ if (!NotificationBitmapToGfxImage(
image_scale, bitmap_sizes.app_icon_mask_size,
*options->app_icon_mask_bitmap, &small_icon_mask)) {
SetError(kUnableToDecodeIconError);
@@ -366,7 +425,7 @@ bool NotificationsApiFunction::CreateNotification(
extensions::api::notifications::NotificationBitmap* icon_bitmap_ptr =
(*options->buttons)[i].icon_bitmap.get();
if (icon_bitmap_ptr) {
- NotificationConversionHelper::NotificationBitmapToGfxImage(
+ NotificationBitmapToGfxImage(
image_scale, bitmap_sizes.button_icon_size, *icon_bitmap_ptr,
&info.icon);
}
@@ -380,7 +439,7 @@ bool NotificationsApiFunction::CreateNotification(
}
bool has_image = options->image_bitmap.get() &&
- NotificationConversionHelper::NotificationBitmapToGfxImage(
+ NotificationBitmapToGfxImage(
image_scale, bitmap_sizes.image_size,
*options->image_bitmap, &optional_fields.image);
@@ -467,7 +526,7 @@ bool NotificationsApiFunction::UpdateNotification(
if (options->icon_bitmap.get()) {
gfx::Image icon;
- if (!NotificationConversionHelper::NotificationBitmapToGfxImage(
+ if (!NotificationBitmapToGfxImage(
image_scale, bitmap_sizes.icon_size, *options->icon_bitmap,
&icon)) {
SetError(kUnableToDecodeIconError);
@@ -478,7 +537,7 @@ bool NotificationsApiFunction::UpdateNotification(
if (options->app_icon_mask_bitmap.get()) {
gfx::Image app_icon_mask;
- if (!NotificationConversionHelper::NotificationBitmapToGfxImage(
+ if (!NotificationBitmapToGfxImage(
image_scale, bitmap_sizes.app_icon_mask_size,
*options->app_icon_mask_bitmap, &app_icon_mask)) {
SetError(kUnableToDecodeIconError);
@@ -506,7 +565,7 @@ bool NotificationsApiFunction::UpdateNotification(
extensions::api::notifications::NotificationBitmap* icon_bitmap_ptr =
(*options->buttons)[i].icon_bitmap.get();
if (icon_bitmap_ptr) {
- NotificationConversionHelper::NotificationBitmapToGfxImage(
+ NotificationBitmapToGfxImage(
image_scale, bitmap_sizes.button_icon_size, *icon_bitmap_ptr,
&button.icon);
}
@@ -523,7 +582,7 @@ bool NotificationsApiFunction::UpdateNotification(
gfx::Image image;
bool has_image =
options->image_bitmap.get() &&
- NotificationConversionHelper::NotificationBitmapToGfxImage(
+ NotificationBitmapToGfxImage(
image_scale, bitmap_sizes.image_size, *options->image_bitmap, &image);
if (has_image) {

Powered by Google App Engine
This is Rietveld 408576698