| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/views/create_application_shortcut_view.h" | 5 #include "chrome/browser/views/create_application_shortcut_view.h" |
| 6 | 6 |
| 7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 8 #include "app/resource_bundle.h" | 8 #include "app/resource_bundle.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| 11 #include "base/win/windows_version.h" | 11 #include "base/win/windows_version.h" |
| 12 #include "chrome/browser/prefs/pref_service.h" | 12 #include "chrome/browser/prefs/pref_service.h" |
| 13 #include "chrome/browser/profile.h" | 13 #include "chrome/browser/profile.h" |
| 14 #include "chrome/browser/tab_contents/tab_contents.h" | 14 #include "chrome/browser/tab_contents/tab_contents.h" |
| 15 #include "chrome/browser/tab_contents/tab_contents_delegate.h" | 15 #include "chrome/browser/tab_contents/tab_contents_delegate.h" |
| 16 #include "chrome/common/chrome_constants.h" | 16 #include "chrome/common/chrome_constants.h" |
| 17 #include "chrome/common/extensions/extension.h" |
| 18 #include "chrome/common/extensions/extension_resource.h" |
| 17 #include "chrome/common/pref_names.h" | 19 #include "chrome/common/pref_names.h" |
| 18 #include "gfx/canvas_skia.h" | 20 #include "gfx/canvas_skia.h" |
| 19 #include "gfx/codec/png_codec.h" | 21 #include "gfx/codec/png_codec.h" |
| 20 #include "grit/generated_resources.h" | 22 #include "grit/generated_resources.h" |
| 21 #include "grit/locale_settings.h" | 23 #include "grit/locale_settings.h" |
| 22 #include "net/base/load_flags.h" | 24 #include "net/base/load_flags.h" |
| 23 #include "net/url_request/url_request.h" | 25 #include "net/url_request/url_request.h" |
| 24 #include "third_party/skia/include/core/SkRect.h" | 26 #include "third_party/skia/include/core/SkRect.h" |
| 25 #include "third_party/skia/include/core/SkPaint.h" | 27 #include "third_party/skia/include/core/SkPaint.h" |
| 26 #include "views/controls/button/checkbox.h" | 28 #include "views/controls/button/checkbox.h" |
| 27 #include "views/controls/image_view.h" | 29 #include "views/controls/image_view.h" |
| 28 #include "views/controls/label.h" | 30 #include "views/controls/label.h" |
| 29 #include "views/grid_layout.h" | 31 #include "views/grid_layout.h" |
| 30 #include "views/standard_layout.h" | 32 #include "views/standard_layout.h" |
| 31 #include "views/window/window.h" | 33 #include "views/window/window.h" |
| 32 | 34 |
| 35 |
| 33 #if defined(OS_WIN) | 36 #if defined(OS_WIN) |
| 34 #include "base/win_util.h" | 37 #include "base/win_util.h" |
| 35 #endif // defined(OS_WIN) | 38 #endif // defined(OS_WIN) |
| 36 | 39 |
| 37 namespace { | 40 namespace { |
| 38 | 41 |
| 39 const int kAppIconSize = 32; | 42 const int kAppIconSize = 32; |
| 40 | 43 |
| 41 // AppInfoView shows the application icon and title. | 44 // AppInfoView shows the application icon and title. |
| 42 class AppInfoView : public views::View { | 45 class AppInfoView : public views::View { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 border_rect.fBottom - SkDoubleToScalar(0.5), | 184 border_rect.fBottom - SkDoubleToScalar(0.5), |
| 182 }; | 185 }; |
| 183 | 186 |
| 184 SkPaint inner_paint; | 187 SkPaint inner_paint; |
| 185 inner_paint.setAntiAlias(true); | 188 inner_paint.setAntiAlias(true); |
| 186 inner_paint.setARGB(0xFF, 0xF8, 0xF8, 0xF8); | 189 inner_paint.setARGB(0xFF, 0xF8, 0xF8, 0xF8); |
| 187 canvas->AsCanvasSkia()->drawRoundRect( | 190 canvas->AsCanvasSkia()->drawRoundRect( |
| 188 inner_rect, SkIntToScalar(1.5), SkIntToScalar(1.5), inner_paint); | 191 inner_rect, SkIntToScalar(1.5), SkIntToScalar(1.5), inner_paint); |
| 189 } | 192 } |
| 190 | 193 |
| 191 }; // namespace | 194 } // namespace |
| 192 | 195 |
| 193 namespace browser { | 196 namespace browser { |
| 194 | 197 |
| 195 void ShowCreateShortcutsDialog(gfx::NativeWindow parent_window, | 198 void ShowCreateWebAppShortcutsDialog(gfx::NativeWindow parent_window, |
| 196 TabContents* tab_contents) { | 199 TabContents* tab_contents) { |
| 197 views::Window::CreateChromeWindow(parent_window, gfx::Rect(), | 200 views::Window::CreateChromeWindow(parent_window, gfx::Rect(), |
| 198 new CreateApplicationShortcutView(tab_contents))->Show(); | 201 new CreateUrlApplicationShortcutView(tab_contents))->Show(); |
| 199 } | 202 } |
| 200 | 203 |
| 201 }; // namespace browser | 204 void ShowCreateChromeAppShortcutsDialog(gfx::NativeWindow parent_window, |
| 205 Profile* profile, |
| 206 const Extension* app) { |
| 207 views::Window::CreateChromeWindow(parent_window, gfx::Rect(), |
| 208 new CreateChromeApplicationShortcutView(profile, app))->Show(); |
| 209 } |
| 202 | 210 |
| 203 class CreateApplicationShortcutView::IconDownloadCallbackFunctor { | 211 } // namespace browser |
| 212 |
| 213 class CreateUrlApplicationShortcutView::IconDownloadCallbackFunctor { |
| 204 public: | 214 public: |
| 205 explicit IconDownloadCallbackFunctor(CreateApplicationShortcutView* owner) | 215 explicit IconDownloadCallbackFunctor(CreateUrlApplicationShortcutView* owner) |
| 206 : owner_(owner) { | 216 : owner_(owner) { |
| 207 } | 217 } |
| 208 | 218 |
| 209 void Run(int download_id, bool errored, const SkBitmap& image) { | 219 void Run(int download_id, bool errored, const SkBitmap& image) { |
| 210 if (owner_) | 220 if (owner_) |
| 211 owner_->OnIconDownloaded(errored, image); | 221 owner_->OnIconDownloaded(errored, image); |
| 212 delete this; | 222 delete this; |
| 213 } | 223 } |
| 214 | 224 |
| 215 void Cancel() { | 225 void Cancel() { |
| 216 owner_ = NULL; | 226 owner_ = NULL; |
| 217 } | 227 } |
| 218 | 228 |
| 219 private: | 229 private: |
| 220 CreateApplicationShortcutView* owner_; | 230 CreateUrlApplicationShortcutView* owner_; |
| 221 }; | 231 }; |
| 222 | 232 |
| 223 CreateApplicationShortcutView::CreateApplicationShortcutView( | 233 CreateApplicationShortcutView::CreateApplicationShortcutView(Profile* profile) |
| 224 TabContents* tab_contents) | 234 : profile_(profile) {} |
| 225 : tab_contents_(tab_contents), | |
| 226 pending_download_(NULL) { | |
| 227 Init(); | |
| 228 } | |
| 229 | 235 |
| 230 CreateApplicationShortcutView::~CreateApplicationShortcutView() { | 236 CreateApplicationShortcutView::~CreateApplicationShortcutView() {} |
| 231 if (pending_download_) | |
| 232 pending_download_->Cancel(); | |
| 233 } | |
| 234 | 237 |
| 235 void CreateApplicationShortcutView::Init() { | 238 void CreateApplicationShortcutView::InitControls() { |
| 236 // Prepare data | |
| 237 web_app::GetShortcutInfoForTab(tab_contents_, &shortcut_info_); | |
| 238 | |
| 239 const WebApplicationInfo& app_info = tab_contents_->web_app_info(); | |
| 240 if (!app_info.icons.empty()) { | |
| 241 web_app::GetIconsInfo(app_info, &unprocessed_icons_); | |
| 242 FetchIcon(); | |
| 243 } | |
| 244 | |
| 245 // Create controls | 239 // Create controls |
| 246 app_info_ = new AppInfoView(shortcut_info_.title, shortcut_info_.description, | 240 app_info_ = new AppInfoView(shortcut_info_.title, shortcut_info_.description, |
| 247 shortcut_info_.favicon); | 241 shortcut_info_.favicon); |
| 248 create_shortcuts_label_ = new views::Label( | 242 create_shortcuts_label_ = new views::Label( |
| 249 l10n_util::GetString(IDS_CREATE_SHORTCUTS_LABEL)); | 243 l10n_util::GetString(IDS_CREATE_SHORTCUTS_LABEL)); |
| 250 create_shortcuts_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); | 244 create_shortcuts_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); |
| 251 | 245 |
| 252 Profile* profile = tab_contents_->profile(); | |
| 253 | |
| 254 desktop_check_box_ = AddCheckbox( | 246 desktop_check_box_ = AddCheckbox( |
| 255 l10n_util::GetString(IDS_CREATE_SHORTCUTS_DESKTOP_CHKBOX), | 247 l10n_util::GetString(IDS_CREATE_SHORTCUTS_DESKTOP_CHKBOX), |
| 256 profile->GetPrefs()->GetBoolean(prefs::kWebAppCreateOnDesktop)); | 248 profile_->GetPrefs()->GetBoolean(prefs::kWebAppCreateOnDesktop)); |
| 257 | 249 |
| 258 menu_check_box_ = NULL; | 250 menu_check_box_ = NULL; |
| 259 quick_launch_check_box_ = NULL; | 251 quick_launch_check_box_ = NULL; |
| 260 | 252 |
| 261 #if defined(OS_WIN) | 253 #if defined(OS_WIN) |
| 262 menu_check_box_ = AddCheckbox( | 254 menu_check_box_ = AddCheckbox( |
| 263 l10n_util::GetString(IDS_CREATE_SHORTCUTS_START_MENU_CHKBOX), | 255 l10n_util::GetString(IDS_CREATE_SHORTCUTS_START_MENU_CHKBOX), |
| 264 profile->GetPrefs()->GetBoolean(prefs::kWebAppCreateInAppsMenu)); | 256 profile_->GetPrefs()->GetBoolean(prefs::kWebAppCreateInAppsMenu)); |
| 265 | 257 |
| 266 quick_launch_check_box_ = AddCheckbox( | 258 quick_launch_check_box_ = AddCheckbox( |
| 267 (base::win::GetVersion() >= base::win::VERSION_WIN7) ? | 259 (base::win::GetVersion() >= base::win::VERSION_WIN7) ? |
| 268 l10n_util::GetString(IDS_PIN_TO_TASKBAR_CHKBOX) : | 260 l10n_util::GetString(IDS_PIN_TO_TASKBAR_CHKBOX) : |
| 269 l10n_util::GetString(IDS_CREATE_SHORTCUTS_QUICK_LAUNCH_BAR_CHKBOX), | 261 l10n_util::GetString(IDS_CREATE_SHORTCUTS_QUICK_LAUNCH_BAR_CHKBOX), |
| 270 profile->GetPrefs()->GetBoolean(prefs::kWebAppCreateInQuickLaunchBar)); | 262 profile_->GetPrefs()->GetBoolean(prefs::kWebAppCreateInQuickLaunchBar)); |
| 271 #elif defined(OS_LINUX) | 263 #elif defined(OS_LINUX) |
| 272 menu_check_box_ = AddCheckbox( | 264 menu_check_box_ = AddCheckbox( |
| 273 l10n_util::GetString(IDS_CREATE_SHORTCUTS_MENU_CHKBOX), | 265 l10n_util::GetString(IDS_CREATE_SHORTCUTS_MENU_CHKBOX), |
| 274 profile->GetPrefs()->GetBoolean(prefs::kWebAppCreateInAppsMenu)); | 266 profile_->GetPrefs()->GetBoolean(prefs::kWebAppCreateInAppsMenu)); |
| 275 #endif | 267 #endif |
| 276 | 268 |
| 277 // Layout controls | 269 // Layout controls |
| 278 views::GridLayout* layout = CreatePanelGridLayout(this); | 270 views::GridLayout* layout = CreatePanelGridLayout(this); |
| 279 SetLayoutManager(layout); | 271 SetLayoutManager(layout); |
| 280 | 272 |
| 281 static const int kHeaderColumnSetId = 0; | 273 static const int kHeaderColumnSetId = 0; |
| 282 views::ColumnSet* column_set = layout->AddColumnSet(kHeaderColumnSetId); | 274 views::ColumnSet* column_set = layout->AddColumnSet(kHeaderColumnSetId); |
| 283 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, | 275 column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, |
| 284 100.0f, views::GridLayout::FIXED, 0, 0); | 276 100.0f, views::GridLayout::FIXED, 0, 0); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 | 352 |
| 361 bool CreateApplicationShortcutView::IsModal() const { | 353 bool CreateApplicationShortcutView::IsModal() const { |
| 362 return true; | 354 return true; |
| 363 } | 355 } |
| 364 | 356 |
| 365 std::wstring CreateApplicationShortcutView::GetWindowTitle() const { | 357 std::wstring CreateApplicationShortcutView::GetWindowTitle() const { |
| 366 return l10n_util::GetString(IDS_CREATE_SHORTCUTS_TITLE); | 358 return l10n_util::GetString(IDS_CREATE_SHORTCUTS_TITLE); |
| 367 } | 359 } |
| 368 | 360 |
| 369 bool CreateApplicationShortcutView::Accept() { | 361 bool CreateApplicationShortcutView::Accept() { |
| 370 if (!IsDialogButtonEnabled(MessageBoxFlags::DIALOGBUTTON_OK)) { | 362 if (!IsDialogButtonEnabled(MessageBoxFlags::DIALOGBUTTON_OK)) |
| 371 return false; | 363 return false; |
| 372 } | |
| 373 | 364 |
| 374 shortcut_info_.create_on_desktop = desktop_check_box_->checked(); | 365 shortcut_info_.create_on_desktop = desktop_check_box_->checked(); |
| 375 shortcut_info_.create_in_applications_menu = menu_check_box_ == NULL ? false : | 366 shortcut_info_.create_in_applications_menu = menu_check_box_ == NULL ? false : |
| 376 menu_check_box_->checked(); | 367 menu_check_box_->checked(); |
| 377 | 368 |
| 378 #if defined(OS_WIN) | 369 #if defined(OS_WIN) |
| 379 shortcut_info_.create_in_quick_launch_bar = quick_launch_check_box_ == NULL ? | 370 shortcut_info_.create_in_quick_launch_bar = quick_launch_check_box_ == NULL ? |
| 380 NULL : quick_launch_check_box_->checked(); | 371 NULL : quick_launch_check_box_->checked(); |
| 381 #elif defined(OS_POSIX) | 372 #elif defined(OS_POSIX) |
| 382 // Create shortcut in Mac dock or as Linux (gnome/kde) application launcher | 373 // Create shortcut in Mac dock or as Linux (gnome/kde) application launcher |
| 383 // are not implemented yet. | 374 // are not implemented yet. |
| 384 shortcut_info_.create_in_quick_launch_bar = false; | 375 shortcut_info_.create_in_quick_launch_bar = false; |
| 385 #endif | 376 #endif |
| 386 | 377 |
| 387 web_app::CreateShortcut(tab_contents_->profile()->GetPath(), | 378 web_app::CreateShortcut(profile_->GetPath(), |
| 388 shortcut_info_, | 379 shortcut_info_, |
| 389 NULL); | 380 NULL); |
| 390 | |
| 391 tab_contents_->SetAppIcon(shortcut_info_.favicon); | |
| 392 if (tab_contents_->delegate()) | |
| 393 tab_contents_->delegate()->ConvertContentsToApplication(tab_contents_); | |
| 394 return true; | 381 return true; |
| 395 } | 382 } |
| 396 | 383 |
| 384 |
| 397 views::View* CreateApplicationShortcutView::GetContentsView() { | 385 views::View* CreateApplicationShortcutView::GetContentsView() { |
| 398 return this; | 386 return this; |
| 399 } | 387 } |
| 400 | 388 |
| 401 views::Checkbox* CreateApplicationShortcutView::AddCheckbox( | 389 views::Checkbox* CreateApplicationShortcutView::AddCheckbox( |
| 402 const std::wstring& text, bool checked) { | 390 const std::wstring& text, bool checked) { |
| 403 views::Checkbox* checkbox = new views::Checkbox(text); | 391 views::Checkbox* checkbox = new views::Checkbox(text); |
| 404 checkbox->SetChecked(checked); | 392 checkbox->SetChecked(checked); |
| 405 checkbox->set_listener(this); | 393 checkbox->set_listener(this); |
| 406 return checkbox; | 394 return checkbox; |
| 407 } | 395 } |
| 408 | 396 |
| 409 void CreateApplicationShortcutView::FetchIcon() { | 397 void CreateApplicationShortcutView::ButtonPressed(views::Button* sender, |
| 398 const views::Event& event) { |
| 399 if (sender == desktop_check_box_) |
| 400 profile_->GetPrefs()->SetBoolean(prefs::kWebAppCreateOnDesktop, |
| 401 desktop_check_box_->checked() ? true : false); |
| 402 else if (sender == menu_check_box_) |
| 403 profile_->GetPrefs()->SetBoolean(prefs::kWebAppCreateInAppsMenu, |
| 404 menu_check_box_->checked() ? true : false); |
| 405 else if (sender == quick_launch_check_box_) |
| 406 profile_->GetPrefs()->SetBoolean(prefs::kWebAppCreateInQuickLaunchBar, |
| 407 quick_launch_check_box_->checked() ? true : false); |
| 408 |
| 409 // When no checkbox is checked we should not have the action button enabled. |
| 410 GetDialogClientView()->UpdateDialogButtons(); |
| 411 } |
| 412 |
| 413 CreateUrlApplicationShortcutView::CreateUrlApplicationShortcutView( |
| 414 TabContents* tab_contents) |
| 415 : CreateApplicationShortcutView(tab_contents->profile()), |
| 416 tab_contents_(tab_contents), |
| 417 pending_download_(NULL) { |
| 418 |
| 419 web_app::GetShortcutInfoForTab(tab_contents_, &shortcut_info_); |
| 420 const WebApplicationInfo& app_info = tab_contents_->web_app_info(); |
| 421 if (!app_info.icons.empty()) { |
| 422 web_app::GetIconsInfo(app_info, &unprocessed_icons_); |
| 423 FetchIcon(); |
| 424 } |
| 425 |
| 426 InitControls(); |
| 427 } |
| 428 |
| 429 CreateUrlApplicationShortcutView::~CreateUrlApplicationShortcutView() { |
| 430 if (pending_download_) |
| 431 pending_download_->Cancel(); |
| 432 } |
| 433 |
| 434 bool CreateUrlApplicationShortcutView::Accept() { |
| 435 if (!CreateApplicationShortcutView::Accept()) |
| 436 return false; |
| 437 |
| 438 tab_contents_->SetAppIcon(shortcut_info_.favicon); |
| 439 if (tab_contents_->delegate()) |
| 440 tab_contents_->delegate()->ConvertContentsToApplication(tab_contents_); |
| 441 return true; |
| 442 } |
| 443 |
| 444 void CreateUrlApplicationShortcutView::FetchIcon() { |
| 410 // There should only be fetch job at a time. | 445 // There should only be fetch job at a time. |
| 411 DCHECK(pending_download_ == NULL); | 446 DCHECK(pending_download_ == NULL); |
| 412 | 447 |
| 413 if (unprocessed_icons_.empty()) { | 448 if (unprocessed_icons_.empty()) // No icons to fetch. |
| 414 // No icons to fetch. | |
| 415 return; | 449 return; |
| 416 } | |
| 417 | 450 |
| 418 pending_download_ = new IconDownloadCallbackFunctor(this); | 451 pending_download_ = new IconDownloadCallbackFunctor(this); |
| 419 DCHECK(pending_download_); | 452 DCHECK(pending_download_); |
| 420 | 453 |
| 421 tab_contents_->fav_icon_helper().DownloadImage( | 454 tab_contents_->fav_icon_helper().DownloadImage( |
| 422 unprocessed_icons_.back().url, | 455 unprocessed_icons_.back().url, |
| 423 std::max(unprocessed_icons_.back().width, | 456 std::max(unprocessed_icons_.back().width, |
| 424 unprocessed_icons_.back().height), | 457 unprocessed_icons_.back().height), |
| 425 NewCallback(pending_download_, &IconDownloadCallbackFunctor::Run)); | 458 NewCallback(pending_download_, &IconDownloadCallbackFunctor::Run)); |
| 426 | 459 |
| 427 unprocessed_icons_.pop_back(); | 460 unprocessed_icons_.pop_back(); |
| 428 } | 461 } |
| 429 | 462 |
| 430 void CreateApplicationShortcutView::ButtonPressed(views::Button* sender, | 463 void CreateUrlApplicationShortcutView::OnIconDownloaded(bool errored, |
| 431 const views::Event& event) { | 464 const SkBitmap& image) { |
| 432 Profile* profile = tab_contents_->profile(); | |
| 433 if (sender == desktop_check_box_) | |
| 434 profile->GetPrefs()->SetBoolean(prefs::kWebAppCreateOnDesktop, | |
| 435 desktop_check_box_->checked() ? true : false); | |
| 436 else if (sender == menu_check_box_) | |
| 437 profile->GetPrefs()->SetBoolean(prefs::kWebAppCreateInAppsMenu, | |
| 438 menu_check_box_->checked() ? true : false); | |
| 439 else if (sender == quick_launch_check_box_) | |
| 440 profile->GetPrefs()->SetBoolean(prefs::kWebAppCreateInQuickLaunchBar, | |
| 441 quick_launch_check_box_->checked() ? true : false); | |
| 442 | |
| 443 // When no checkbox is checked we should not have the action button enabled. | |
| 444 GetDialogClientView()->UpdateDialogButtons(); | |
| 445 } | |
| 446 | |
| 447 void CreateApplicationShortcutView::OnIconDownloaded(bool errored, | |
| 448 const SkBitmap& image) { | |
| 449 pending_download_ = NULL; | 465 pending_download_ = NULL; |
| 450 | 466 |
| 451 if (!errored && !image.isNull()) { | 467 if (!errored && !image.isNull()) { |
| 452 shortcut_info_.favicon = image; | 468 shortcut_info_.favicon = image; |
| 453 static_cast<AppInfoView*>(app_info_)->UpdateIcon(shortcut_info_.favicon); | 469 static_cast<AppInfoView*>(app_info_)->UpdateIcon(shortcut_info_.favicon); |
| 454 } else { | 470 } else { |
| 455 FetchIcon(); | 471 FetchIcon(); |
| 456 } | 472 } |
| 457 } | 473 } |
| 474 |
| 475 CreateChromeApplicationShortcutView::CreateChromeApplicationShortcutView( |
| 476 Profile* profile, |
| 477 const Extension* app) : |
| 478 CreateApplicationShortcutView(profile), |
| 479 app_(app), |
| 480 ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)) { |
| 481 |
| 482 shortcut_info_.extension_id = UTF8ToUTF16(app_->id()); |
| 483 shortcut_info_.url = GURL(app_->launch_web_url()); |
| 484 shortcut_info_.title = UTF8ToUTF16(app_->name()); |
| 485 shortcut_info_.description = UTF8ToUTF16(app_->description()); |
| 486 |
| 487 // The icon will be resized to |max_size|. |
| 488 const gfx::Size max_size(kAppIconSize, kAppIconSize); |
| 489 |
| 490 // Look for an icon. If there is no icon at the ideal size, |
| 491 // we will resize whatever we can get. Making a large icon smaller |
| 492 // is prefered to making a small icon larger, so look for a larger |
| 493 // icon first: |
| 494 ExtensionResource icon_resource = app_->GetIconResource( |
| 495 kAppIconSize, |
| 496 ExtensionIconSet::MATCH_BIGGER); |
| 497 |
| 498 // If no icon exists that is the desired size or larger, get the |
| 499 // largest icon available: |
| 500 if (icon_resource.empty()) { |
| 501 icon_resource = app_->GetIconResource( |
| 502 kAppIconSize, |
| 503 ExtensionIconSet::MATCH_SMALLER); |
| 504 } |
| 505 |
| 506 tracker_.LoadImage(app_, |
| 507 icon_resource, |
| 508 max_size, |
| 509 ImageLoadingTracker::DONT_CACHE); |
| 510 |
| 511 InitControls(); |
| 512 } |
| 513 |
| 514 CreateChromeApplicationShortcutView::~CreateChromeApplicationShortcutView() {} |
| 515 |
| 516 // Called by tracker_ when the app's icon is loaded. |
| 517 void CreateChromeApplicationShortcutView::OnImageLoaded( |
| 518 SkBitmap* image, ExtensionResource resource, int index) { |
| 519 if (image->isNull()) { |
| 520 NOTREACHED() << "Corrupt image in profile?"; |
| 521 return; |
| 522 } |
| 523 shortcut_info_.favicon = *image; |
| 524 static_cast<AppInfoView*>(app_info_)->UpdateIcon(shortcut_info_.favicon); |
| 525 } |
| 526 |
| OLD | NEW |