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

Side by Side Diff: chrome/browser/ui/views/create_application_shortcut_view.cc

Issue 1038573002: Fixed thread-unsafe use of gfx::Image in app shortcut creation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move expressions out of argument lists (fix unspecified behaviour). Created 5 years, 9 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
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/ui/views/create_application_shortcut_view.h" 5 #include "chrome/browser/ui/views/create_application_shortcut_view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 } 245 }
246 246
247 } // namespace chrome 247 } // namespace chrome
248 248
249 CreateApplicationShortcutView::CreateApplicationShortcutView(Profile* profile) 249 CreateApplicationShortcutView::CreateApplicationShortcutView(Profile* profile)
250 : profile_(profile), 250 : profile_(profile),
251 app_info_(NULL), 251 app_info_(NULL),
252 create_shortcuts_label_(NULL), 252 create_shortcuts_label_(NULL),
253 desktop_check_box_(NULL), 253 desktop_check_box_(NULL),
254 menu_check_box_(NULL), 254 menu_check_box_(NULL),
255 quick_launch_check_box_(NULL) {} 255 quick_launch_check_box_(NULL),
256 shortcut_info_(new web_app::ShortcutInfo) {
257 }
256 258
257 CreateApplicationShortcutView::~CreateApplicationShortcutView() {} 259 CreateApplicationShortcutView::~CreateApplicationShortcutView() {}
258 260
259 void CreateApplicationShortcutView::InitControls(DialogLayout dialog_layout) { 261 void CreateApplicationShortcutView::InitControls(DialogLayout dialog_layout) {
260 if (dialog_layout == DIALOG_LAYOUT_URL_SHORTCUT) { 262 if (dialog_layout == DIALOG_LAYOUT_URL_SHORTCUT) {
261 app_info_ = new AppInfoView(shortcut_info_.title, 263 app_info_ = new AppInfoView(shortcut_info_->title,
262 shortcut_info_.description, 264 shortcut_info_->description,
263 shortcut_info_.favicon); 265 shortcut_info_->favicon);
264 } 266 }
265 create_shortcuts_label_ = new views::Label( 267 create_shortcuts_label_ = new views::Label(
266 l10n_util::GetStringUTF16(IDS_CREATE_SHORTCUTS_LABEL)); 268 l10n_util::GetStringUTF16(IDS_CREATE_SHORTCUTS_LABEL));
267 create_shortcuts_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 269 create_shortcuts_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
268 270
269 desktop_check_box_ = AddCheckbox( 271 desktop_check_box_ = AddCheckbox(
270 l10n_util::GetStringUTF16(IDS_CREATE_SHORTCUTS_DESKTOP_CHKBOX), 272 l10n_util::GetStringUTF16(IDS_CREATE_SHORTCUTS_DESKTOP_CHKBOX),
271 profile_->GetPrefs()->GetBoolean(prefs::kWebAppCreateOnDesktop)); 273 profile_->GetPrefs()->GetBoolean(prefs::kWebAppCreateOnDesktop));
272 274
273 menu_check_box_ = NULL; 275 menu_check_box_ = NULL;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 creation_locations.in_quick_launch_bar = quick_launch_check_box_ == NULL ? 388 creation_locations.in_quick_launch_bar = quick_launch_check_box_ == NULL ?
387 NULL : quick_launch_check_box_->checked(); 389 NULL : quick_launch_check_box_->checked();
388 #elif defined(OS_POSIX) 390 #elif defined(OS_POSIX)
389 // Create shortcut in Mac dock or as Linux (gnome/kde) application launcher 391 // Create shortcut in Mac dock or as Linux (gnome/kde) application launcher
390 // are not implemented yet. 392 // are not implemented yet.
391 creation_locations.in_quick_launch_bar = false; 393 creation_locations.in_quick_launch_bar = false;
392 #endif 394 #endif
393 395
394 web_app::CreateShortcutsWithInfo(web_app::SHORTCUT_CREATION_BY_USER, 396 web_app::CreateShortcutsWithInfo(web_app::SHORTCUT_CREATION_BY_USER,
395 creation_locations, 397 creation_locations,
396 shortcut_info_, 398 shortcut_info_.Pass(),
397 file_handlers_info_); 399 file_handlers_info_);
400 // CreateShortcutsWithInfo stole ownership of |shortcut_info_|, so create a
401 // new blank one (to satisfy the non-null constraint).
402 shortcut_info_.reset(new web_app::ShortcutInfo);
benwells 2015/03/26 05:28:51 Why do this? Put another way, why is there a const
Matt Giuca 2015/03/27 08:14:46 Partly laziness :) It would mean having to introd
398 return true; 403 return true;
399 } 404 }
400 405
401 views::Checkbox* CreateApplicationShortcutView::AddCheckbox( 406 views::Checkbox* CreateApplicationShortcutView::AddCheckbox(
402 const base::string16& text, bool checked) { 407 const base::string16& text, bool checked) {
403 views::Checkbox* checkbox = new views::Checkbox(text); 408 views::Checkbox* checkbox = new views::Checkbox(text);
404 checkbox->SetChecked(checked); 409 checkbox->SetChecked(checked);
405 checkbox->set_listener(this); 410 checkbox->set_listener(this);
406 return checkbox; 411 return checkbox;
407 } 412 }
(...skipping 15 matching lines...) Expand all
423 GetDialogClientView()->UpdateDialogButtons(); 428 GetDialogClientView()->UpdateDialogButtons();
424 } 429 }
425 430
426 CreateUrlApplicationShortcutView::CreateUrlApplicationShortcutView( 431 CreateUrlApplicationShortcutView::CreateUrlApplicationShortcutView(
427 content::WebContents* web_contents) 432 content::WebContents* web_contents)
428 : CreateApplicationShortcutView( 433 : CreateApplicationShortcutView(
429 Profile::FromBrowserContext(web_contents->GetBrowserContext())), 434 Profile::FromBrowserContext(web_contents->GetBrowserContext())),
430 web_contents_(web_contents), 435 web_contents_(web_contents),
431 pending_download_id_(-1), 436 pending_download_id_(-1),
432 weak_ptr_factory_(this) { 437 weak_ptr_factory_(this) {
433 web_app::GetShortcutInfoForTab(web_contents_, &shortcut_info_); 438 web_app::GetShortcutInfoForTab(web_contents_, shortcut_info_.get());
434 const WebApplicationInfo& app_info = 439 const WebApplicationInfo& app_info =
435 extensions::TabHelper::FromWebContents(web_contents_)->web_app_info(); 440 extensions::TabHelper::FromWebContents(web_contents_)->web_app_info();
436 if (!app_info.icons.empty()) { 441 if (!app_info.icons.empty()) {
437 web_app::GetIconsInfo(app_info, &unprocessed_icons_); 442 web_app::GetIconsInfo(app_info, &unprocessed_icons_);
438 FetchIcon(); 443 FetchIcon();
439 } 444 }
440 445
441 // Create URL app shortcuts in the top-level menu. 446 // Create URL app shortcuts in the top-level menu.
442 create_in_chrome_apps_subdir_ = false; 447 create_in_chrome_apps_subdir_ = false;
443 448
444 InitControls(DIALOG_LAYOUT_URL_SHORTCUT); 449 InitControls(DIALOG_LAYOUT_URL_SHORTCUT);
445 } 450 }
446 451
447 CreateUrlApplicationShortcutView::~CreateUrlApplicationShortcutView() { 452 CreateUrlApplicationShortcutView::~CreateUrlApplicationShortcutView() {
448 } 453 }
449 454
450 bool CreateUrlApplicationShortcutView::Accept() { 455 bool CreateUrlApplicationShortcutView::Accept() {
451 if (!CreateApplicationShortcutView::Accept()) 456 if (!CreateApplicationShortcutView::Accept())
452 return false; 457 return false;
453 458
454 // Get the smallest icon in the icon family (should have only 1). 459 // Get the smallest icon in the icon family (should have only 1).
455 const gfx::Image* icon = shortcut_info_.favicon.GetBest(0, 0); 460 const gfx::Image* icon = shortcut_info_->favicon.GetBest(0, 0);
456 SkBitmap bitmap = icon ? icon->AsBitmap() : SkBitmap(); 461 SkBitmap bitmap = icon ? icon->AsBitmap() : SkBitmap();
457 extensions::TabHelper::FromWebContents(web_contents_)->SetAppIcon(bitmap); 462 extensions::TabHelper::FromWebContents(web_contents_)->SetAppIcon(bitmap);
458 Browser* browser = chrome::FindBrowserWithWebContents(web_contents_); 463 Browser* browser = chrome::FindBrowserWithWebContents(web_contents_);
459 if (browser) 464 if (browser)
460 chrome::ConvertTabToAppWindow(browser, web_contents_); 465 chrome::ConvertTabToAppWindow(browser, web_contents_);
461 return true; 466 return true;
462 } 467 }
463 468
464 void CreateUrlApplicationShortcutView::FetchIcon() { 469 void CreateUrlApplicationShortcutView::FetchIcon() {
465 // There should only be fetch job at a time. 470 // There should only be fetch job at a time.
(...skipping 25 matching lines...) Expand all
491 if (id != pending_download_id_) 496 if (id != pending_download_id_)
492 return; 497 return;
493 pending_download_id_ = -1; 498 pending_download_id_ = -1;
494 499
495 gfx::ImageSkia image_skia = CreateFaviconImageSkia( 500 gfx::ImageSkia image_skia = CreateFaviconImageSkia(
496 bitmaps, 501 bitmaps,
497 original_bitmap_sizes, 502 original_bitmap_sizes,
498 requested_size, 503 requested_size,
499 NULL); 504 NULL);
500 if (!image_skia.isNull()) { 505 if (!image_skia.isNull()) {
501 shortcut_info_.favicon.Add(image_skia); 506 shortcut_info_->favicon.Add(image_skia);
502 static_cast<AppInfoView*>(app_info_)->UpdateIcon(shortcut_info_.favicon); 507 static_cast<AppInfoView*>(app_info_)->UpdateIcon(shortcut_info_->favicon);
503 } else { 508 } else {
504 FetchIcon(); 509 FetchIcon();
505 } 510 }
506 } 511 }
507 512
508 CreateChromeApplicationShortcutView::CreateChromeApplicationShortcutView( 513 CreateChromeApplicationShortcutView::CreateChromeApplicationShortcutView(
509 Profile* profile, 514 Profile* profile,
510 const extensions::Extension* app, 515 const extensions::Extension* app,
511 const base::Callback<void(bool)>& close_callback) 516 const base::Callback<void(bool)>& close_callback)
512 : CreateApplicationShortcutView(profile), 517 : CreateApplicationShortcutView(profile),
(...skipping 21 matching lines...) Expand all
534 return CreateApplicationShortcutView::Accept(); 539 return CreateApplicationShortcutView::Accept();
535 } 540 }
536 541
537 bool CreateChromeApplicationShortcutView::Cancel() { 542 bool CreateChromeApplicationShortcutView::Cancel() {
538 if (!close_callback_.is_null()) 543 if (!close_callback_.is_null())
539 close_callback_.Run(false); 544 close_callback_.Run(false);
540 return CreateApplicationShortcutView::Cancel(); 545 return CreateApplicationShortcutView::Cancel();
541 } 546 }
542 547
543 void CreateChromeApplicationShortcutView::OnAppInfoLoaded( 548 void CreateChromeApplicationShortcutView::OnAppInfoLoaded(
544 const web_app::ShortcutInfo& shortcut_info, 549 scoped_ptr<web_app::ShortcutInfo> shortcut_info,
545 const extensions::FileHandlersInfo& file_handlers_info) { 550 const extensions::FileHandlersInfo& file_handlers_info) {
546 shortcut_info_ = shortcut_info; 551 shortcut_info_ = shortcut_info.Pass();
547 file_handlers_info_ = file_handlers_info; 552 file_handlers_info_ = file_handlers_info;
548 } 553 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/views/create_application_shortcut_view.h ('k') | chrome/browser/web_applications/web_app.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698