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

Side by Side Diff: chrome/browser/extensions/api/notifications/notifications_api.cc

Issue 1135213004: Returning error when NotificationConversionHelper::NotificationBitmapToGfxImage() get failed in not… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changes as per review comments. Created 5 years, 6 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 unified diff | Download patch
« no previous file with comments | « no previous file | chrome/browser/notifications/notification_conversion_helper.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/notifications/notifications_api.h" 5 #include "chrome/browser/extensions/api/notifications/notifications_api.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/guid.h" 8 #include "base/guid.h"
9 #include "base/rand_util.h" 9 #include "base/rand_util.h"
10 #include "base/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 float image_scale = 250 float image_scale =
251 ui::GetScaleForScaleFactor(ui::GetSupportedScaleFactors().back()); 251 ui::GetScaleForScaleFactor(ui::GetSupportedScaleFactors().back());
252 252
253 // Extract required fields: type, title, message, and icon. 253 // Extract required fields: type, title, message, and icon.
254 message_center::NotificationType type = 254 message_center::NotificationType type =
255 MapApiTemplateTypeToType(options->type); 255 MapApiTemplateTypeToType(options->type);
256 const base::string16 title(base::UTF8ToUTF16(*options->title)); 256 const base::string16 title(base::UTF8ToUTF16(*options->title));
257 const base::string16 message(base::UTF8ToUTF16(*options->message)); 257 const base::string16 message(base::UTF8ToUTF16(*options->message));
258 gfx::Image icon; 258 gfx::Image icon;
259 259
260 if (!NotificationConversionHelper::NotificationBitmapToGfxImage( 260 if (!options->icon_bitmap.get() ||
261 image_scale, 261 !NotificationConversionHelper::NotificationBitmapToGfxImage(
262 bitmap_sizes.icon_size, 262 image_scale, bitmap_sizes.icon_size, *options->icon_bitmap, &icon)) {
263 options->icon_bitmap.get(),
264 &icon)) {
265 SetError(kUnableToDecodeIconError); 263 SetError(kUnableToDecodeIconError);
266 return false; 264 return false;
267 } 265 }
268 266
269 // Then, handle any optional data that's been provided. 267 // Then, handle any optional data that's been provided.
270 message_center::RichNotificationData optional_fields; 268 message_center::RichNotificationData optional_fields;
271 if (options->app_icon_mask_url.get()) { 269 if (options->app_icon_mask_url.get()) {
272 gfx::Image small_icon_mask; 270 gfx::Image small_icon_mask;
273 if (!NotificationConversionHelper::NotificationBitmapToGfxImage( 271 if (!NotificationConversionHelper::NotificationBitmapToGfxImage(
274 image_scale, bitmap_sizes.app_icon_mask_size, 272 image_scale, bitmap_sizes.app_icon_mask_size,
275 options->app_icon_mask_bitmap.get(), &small_icon_mask)) { 273 *options->app_icon_mask_bitmap, &small_icon_mask)) {
276 SetError(kUnableToDecodeIconError); 274 SetError(kUnableToDecodeIconError);
277 return false; 275 return false;
278 } 276 }
279 optional_fields.small_image = 277 optional_fields.small_image =
280 GetMaskedSmallImage(small_icon_mask.AsImageSkia()); 278 GetMaskedSmallImage(small_icon_mask.AsImageSkia());
281 } 279 }
282 280
283 if (options->priority.get()) 281 if (options->priority.get())
284 optional_fields.priority = *options->priority; 282 optional_fields.priority = *options->priority;
285 283
286 if (options->event_time.get()) 284 if (options->event_time.get())
287 optional_fields.timestamp = base::Time::FromJsTime(*options->event_time); 285 optional_fields.timestamp = base::Time::FromJsTime(*options->event_time);
288 286
289 if (options->buttons.get()) { 287 if (options->buttons.get()) {
290 // Currently we allow up to 2 buttons. 288 // Currently we allow up to 2 buttons.
291 size_t number_of_buttons = options->buttons->size(); 289 size_t number_of_buttons = options->buttons->size();
292 number_of_buttons = number_of_buttons > 2 ? 2 : number_of_buttons; 290 number_of_buttons = number_of_buttons > 2 ? 2 : number_of_buttons;
293 291
294 for (size_t i = 0; i < number_of_buttons; i++) { 292 for (size_t i = 0; i < number_of_buttons; i++) {
295 message_center::ButtonInfo info( 293 message_center::ButtonInfo info(
296 base::UTF8ToUTF16((*options->buttons)[i]->title)); 294 base::UTF8ToUTF16((*options->buttons)[i]->title));
297 NotificationConversionHelper::NotificationBitmapToGfxImage( 295 extensions::api::notifications::NotificationBitmap* icon_bitmap_ptr =
298 image_scale, 296 (*options->buttons)[i]->icon_bitmap.get();
299 bitmap_sizes.button_icon_size, 297 if (icon_bitmap_ptr) {
300 (*options->buttons)[i]->icon_bitmap.get(), 298 NotificationConversionHelper::NotificationBitmapToGfxImage(
301 &info.icon); 299 image_scale, bitmap_sizes.button_icon_size, *icon_bitmap_ptr,
302 optional_fields.buttons.push_back(info); 300 &info.icon);
301 optional_fields.buttons.push_back(info);
302 }
303 } 303 }
304 } 304 }
305 305
306 if (options->context_message) { 306 if (options->context_message) {
307 optional_fields.context_message = 307 optional_fields.context_message =
308 base::UTF8ToUTF16(*options->context_message); 308 base::UTF8ToUTF16(*options->context_message);
309 } 309 }
310 310
311 bool has_image = NotificationConversionHelper::NotificationBitmapToGfxImage( 311 bool has_image = options->image_bitmap.get() &&
312 image_scale, 312 NotificationConversionHelper::NotificationBitmapToGfxImage(
313 bitmap_sizes.image_size, 313 image_scale, bitmap_sizes.image_size,
314 options->image_bitmap.get(), 314 *options->image_bitmap, &optional_fields.image);
315 &optional_fields.image); 315
316 // We should have an image if and only if the type is an image type. 316 // We should have an image if and only if the type is an image type.
317 if (has_image != (type == message_center::NOTIFICATION_TYPE_IMAGE)) { 317 if (has_image != (type == message_center::NOTIFICATION_TYPE_IMAGE)) {
318 SetError(kExtraImageProvided); 318 SetError(kExtraImageProvided);
319 return false; 319 return false;
320 } 320 }
321 321
322 // We should have list items if and only if the type is a multiple type. 322 // We should have list items if and only if the type is a multiple type.
323 bool has_list_items = options->items.get() && options->items->size() > 0; 323 bool has_list_items = options->items.get() && options->items->size() > 0;
324 if (has_list_items != (type == message_center::NOTIFICATION_TYPE_MULTIPLE)) { 324 if (has_list_items != (type == message_center::NOTIFICATION_TYPE_MULTIPLE)) {
325 SetError(kExtraListItemsProvided); 325 SetError(kExtraListItemsProvided);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 ui::GetScaleForScaleFactor(ui::GetSupportedScaleFactors().back()); 383 ui::GetScaleForScaleFactor(ui::GetSupportedScaleFactors().back());
384 384
385 // Update optional fields if provided. 385 // Update optional fields if provided.
386 if (options->type != api::notifications::TEMPLATE_TYPE_NONE) 386 if (options->type != api::notifications::TEMPLATE_TYPE_NONE)
387 notification->set_type(MapApiTemplateTypeToType(options->type)); 387 notification->set_type(MapApiTemplateTypeToType(options->type));
388 if (options->title) 388 if (options->title)
389 notification->set_title(base::UTF8ToUTF16(*options->title)); 389 notification->set_title(base::UTF8ToUTF16(*options->title));
390 if (options->message) 390 if (options->message)
391 notification->set_message(base::UTF8ToUTF16(*options->message)); 391 notification->set_message(base::UTF8ToUTF16(*options->message));
392 392
393 // TODO(dewittj): Return error if this fails. 393 if (options->icon_bitmap.get()) {
394 if (options->icon_bitmap) {
395 gfx::Image icon; 394 gfx::Image icon;
396 NotificationConversionHelper::NotificationBitmapToGfxImage( 395 if (!NotificationConversionHelper::NotificationBitmapToGfxImage(
397 image_scale, bitmap_sizes.icon_size, options->icon_bitmap.get(), &icon); 396 image_scale, bitmap_sizes.icon_size, *options->icon_bitmap,
397 &icon)) {
398 SetError(kUnableToDecodeIconError);
399 return false;
400 }
398 notification->set_icon(icon); 401 notification->set_icon(icon);
399 } 402 }
400 403
401 gfx::Image app_icon_mask; 404 if (options->app_icon_mask_bitmap.get()) {
402 if (NotificationConversionHelper::NotificationBitmapToGfxImage( 405 gfx::Image app_icon_mask;
403 image_scale, 406 if (!NotificationConversionHelper::NotificationBitmapToGfxImage(
404 bitmap_sizes.app_icon_mask_size, 407 image_scale, bitmap_sizes.app_icon_mask_size,
405 options->app_icon_mask_bitmap.get(), 408 *options->app_icon_mask_bitmap, &app_icon_mask)) {
406 &app_icon_mask)) { 409 SetError(kUnableToDecodeIconError);
410 return false;
411 }
407 notification->set_small_image( 412 notification->set_small_image(
408 GetMaskedSmallImage(app_icon_mask.AsImageSkia())); 413 GetMaskedSmallImage(app_icon_mask.AsImageSkia()));
409 } 414 }
410 415
411 if (options->priority) 416 if (options->priority)
412 notification->set_priority(*options->priority); 417 notification->set_priority(*options->priority);
413 418
414 if (options->event_time) 419 if (options->event_time)
415 notification->set_timestamp(base::Time::FromJsTime(*options->event_time)); 420 notification->set_timestamp(base::Time::FromJsTime(*options->event_time));
416 421
417 if (options->buttons) { 422 if (options->buttons) {
418 // Currently we allow up to 2 buttons. 423 // Currently we allow up to 2 buttons.
419 size_t number_of_buttons = options->buttons->size(); 424 size_t number_of_buttons = options->buttons->size();
420 number_of_buttons = number_of_buttons > 2 ? 2 : number_of_buttons; 425 number_of_buttons = number_of_buttons > 2 ? 2 : number_of_buttons;
421 426
422 std::vector<message_center::ButtonInfo> buttons; 427 std::vector<message_center::ButtonInfo> buttons;
423 for (size_t i = 0; i < number_of_buttons; i++) { 428 for (size_t i = 0; i < number_of_buttons; i++) {
424 message_center::ButtonInfo button( 429 message_center::ButtonInfo button(
425 base::UTF8ToUTF16((*options->buttons)[i]->title)); 430 base::UTF8ToUTF16((*options->buttons)[i]->title));
426 NotificationConversionHelper::NotificationBitmapToGfxImage( 431 extensions::api::notifications::NotificationBitmap* icon_bitmap_ptr =
427 image_scale, 432 (*options->buttons)[i]->icon_bitmap.get();
428 bitmap_sizes.button_icon_size, 433 if (icon_bitmap_ptr) {
429 (*options->buttons)[i]->icon_bitmap.get(), 434 NotificationConversionHelper::NotificationBitmapToGfxImage(
430 &button.icon); 435 image_scale, bitmap_sizes.button_icon_size, *icon_bitmap_ptr,
431 buttons.push_back(button); 436 &button.icon);
437 buttons.push_back(button);
438 }
432 } 439 }
433 notification->set_buttons(buttons); 440 notification->set_buttons(buttons);
434 } 441 }
435 442
436 if (options->context_message) { 443 if (options->context_message) {
437 notification->set_context_message( 444 notification->set_context_message(
438 base::UTF8ToUTF16(*options->context_message)); 445 base::UTF8ToUTF16(*options->context_message));
439 } 446 }
440 447
441 gfx::Image image; 448 gfx::Image image;
442 bool has_image = NotificationConversionHelper::NotificationBitmapToGfxImage( 449 bool has_image =
443 image_scale, 450 options->image_bitmap.get() &&
444 bitmap_sizes.image_size, 451 NotificationConversionHelper::NotificationBitmapToGfxImage(
445 options->image_bitmap.get(), 452 image_scale, bitmap_sizes.image_size, *options->image_bitmap, &image);
446 &image); 453
447 if (has_image) { 454 if (has_image) {
448 // We should have an image if and only if the type is an image type. 455 // We should have an image if and only if the type is an image type.
449 if (notification->type() != message_center::NOTIFICATION_TYPE_IMAGE) { 456 if (notification->type() != message_center::NOTIFICATION_TYPE_IMAGE) {
450 SetError(kExtraImageProvided); 457 SetError(kExtraImageProvided);
451 return false; 458 return false;
452 } 459 }
453 notification->set_image(image); 460 notification->set_image(image);
454 } 461 }
455 462
456 if (options->progress) { 463 if (options->progress) {
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 ? api::notifications::PERMISSION_LEVEL_GRANTED 683 ? api::notifications::PERMISSION_LEVEL_GRANTED
677 : api::notifications::PERMISSION_LEVEL_DENIED; 684 : api::notifications::PERMISSION_LEVEL_DENIED;
678 685
679 SetResult(new base::StringValue(api::notifications::ToString(result))); 686 SetResult(new base::StringValue(api::notifications::ToString(result)));
680 SendResponse(true); 687 SendResponse(true);
681 688
682 return true; 689 return true;
683 } 690 }
684 691
685 } // namespace extensions 692 } // namespace extensions
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/notifications/notification_conversion_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698