Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/tab_helper.h" | 5 #include "chrome/browser/extensions/tab_helper.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
| 9 #include "base/strings/utf_string_conversions.h" | |
| 9 #include "chrome/browser/chrome_notification_types.h" | 10 #include "chrome/browser/chrome_notification_types.h" |
| 10 #include "chrome/browser/extensions/activity_log/activity_log.h" | 11 #include "chrome/browser/extensions/activity_log/activity_log.h" |
| 11 #include "chrome/browser/extensions/api/declarative/rules_registry_service.h" | 12 #include "chrome/browser/extensions/api/declarative/rules_registry_service.h" |
| 12 #include "chrome/browser/extensions/api/declarative_content/content_rules_regist ry.h" | 13 #include "chrome/browser/extensions/api/declarative_content/content_rules_regist ry.h" |
| 13 #include "chrome/browser/extensions/crx_installer.h" | 14 #include "chrome/browser/extensions/crx_installer.h" |
| 14 #include "chrome/browser/extensions/error_console/error_console.h" | 15 #include "chrome/browser/extensions/error_console/error_console.h" |
| 15 #include "chrome/browser/extensions/extension_action.h" | 16 #include "chrome/browser/extensions/extension_action.h" |
| 16 #include "chrome/browser/extensions/extension_action_manager.h" | 17 #include "chrome/browser/extensions/extension_action_manager.h" |
| 17 #include "chrome/browser/extensions/extension_service.h" | 18 #include "chrome/browser/extensions/extension_service.h" |
| 18 #include "chrome/browser/extensions/extension_system.h" | 19 #include "chrome/browser/extensions/extension_system.h" |
| 19 #include "chrome/browser/extensions/extension_tab_util.h" | 20 #include "chrome/browser/extensions/extension_tab_util.h" |
| 21 #include "chrome/browser/extensions/favicon_downloader.h" | |
| 20 #include "chrome/browser/extensions/image_loader.h" | 22 #include "chrome/browser/extensions/image_loader.h" |
| 21 #include "chrome/browser/extensions/page_action_controller.h" | 23 #include "chrome/browser/extensions/page_action_controller.h" |
| 22 #include "chrome/browser/extensions/script_badge_controller.h" | 24 #include "chrome/browser/extensions/script_badge_controller.h" |
| 23 #include "chrome/browser/extensions/script_bubble_controller.h" | 25 #include "chrome/browser/extensions/script_bubble_controller.h" |
| 24 #include "chrome/browser/extensions/script_executor.h" | 26 #include "chrome/browser/extensions/script_executor.h" |
| 25 #include "chrome/browser/extensions/webstore_inline_installer.h" | 27 #include "chrome/browser/extensions/webstore_inline_installer.h" |
| 26 #include "chrome/browser/extensions/webstore_inline_installer_factory.h" | 28 #include "chrome/browser/extensions/webstore_inline_installer_factory.h" |
| 27 #include "chrome/browser/profiles/profile.h" | 29 #include "chrome/browser/profiles/profile.h" |
| 28 #include "chrome/browser/sessions/session_id.h" | 30 #include "chrome/browser/sessions/session_id.h" |
| 29 #include "chrome/browser/sessions/session_tab_helper.h" | 31 #include "chrome/browser/sessions/session_tab_helper.h" |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 272 OnContentScriptsExecuting) | 274 OnContentScriptsExecuting) |
| 273 IPC_MESSAGE_HANDLER(ExtensionHostMsg_OnWatchedPageChange, | 275 IPC_MESSAGE_HANDLER(ExtensionHostMsg_OnWatchedPageChange, |
| 274 OnWatchedPageChange) | 276 OnWatchedPageChange) |
| 275 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DetailedConsoleMessageAdded, | 277 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DetailedConsoleMessageAdded, |
| 276 OnDetailedConsoleMessageAdded) | 278 OnDetailedConsoleMessageAdded) |
| 277 IPC_MESSAGE_UNHANDLED(handled = false) | 279 IPC_MESSAGE_UNHANDLED(handled = false) |
| 278 IPC_END_MESSAGE_MAP() | 280 IPC_END_MESSAGE_MAP() |
| 279 return handled; | 281 return handled; |
| 280 } | 282 } |
| 281 | 283 |
| 284 void TabHelper::CreateHostedApp() { | |
| 285 // Add urls from the WebApplicationInfo. | |
| 286 std::vector<GURL> web_app_info_icon_urls; | |
| 287 for (std::vector<WebApplicationInfo::IconInfo>::const_iterator it = | |
| 288 web_app_info_.icons.begin(); | |
| 289 it != web_app_info_.icons.end(); ++it) { | |
| 290 if (it->url.is_valid()) | |
| 291 web_app_info_icon_urls.push_back(it->url); | |
| 292 } | |
| 293 | |
| 294 favicon_downloader_.reset( | |
| 295 new FaviconDownloader(web_contents(), | |
| 296 web_app_info_icon_urls, | |
| 297 base::Bind(&TabHelper::FinishCreateHostedApp, | |
| 298 base::Unretained(this)))); | |
| 299 favicon_downloader_->Start(); | |
| 300 } | |
| 301 | |
| 302 void TabHelper::FinishCreateHostedApp( | |
| 303 bool success, | |
| 304 const std::map<GURL, std::vector<SkBitmap> >& bitmaps) { | |
| 305 // The tab has navigated away during the icon download. Cancel the hosted app | |
| 306 // creation. | |
| 307 if (!success) { | |
| 308 favicon_downloader_.reset(); | |
| 309 return; | |
| 310 } | |
| 311 | |
| 312 WebApplicationInfo install_info(web_app_info_); | |
| 313 if (install_info.app_url.is_empty()) | |
| 314 install_info.app_url = web_contents()->GetURL(); | |
| 315 | |
| 316 if (install_info.title.empty()) | |
| 317 install_info.title = web_contents()->GetTitle(); | |
| 318 if (install_info.title.empty()) | |
| 319 install_info.title = UTF8ToUTF16(install_info.app_url.spec()); | |
| 320 | |
| 321 install_info.urls.push_back(install_info.app_url); | |
| 322 install_info.is_bookmark_app = true; | |
| 323 | |
| 324 // Add the downloaded icons. | |
| 325 for (FaviconDownloader::FaviconMap::const_iterator map_it = bitmaps.begin(); | |
| 326 map_it != bitmaps.end(); ++map_it) { | |
| 327 for (std::vector<SkBitmap>::const_iterator bitmap_it = | |
| 328 map_it->second.begin(); | |
| 329 bitmap_it != map_it->second.end(); ++bitmap_it) { | |
| 330 if (!bitmap_it->empty()) { | |
| 331 WebApplicationInfo::IconInfo icon_info; | |
| 332 icon_info.data = *bitmap_it; | |
| 333 icon_info.width = icon_info.data.width(); | |
| 334 icon_info.height = icon_info.data.height(); | |
| 335 install_info.icons.push_back(icon_info); | |
| 336 } | |
| 337 } | |
| 338 } | |
| 339 | |
| 340 Profile* profile = | |
| 341 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); | |
| 342 scoped_refptr<extensions::CrxInstaller> installer( | |
| 343 extensions::CrxInstaller::CreateSilent(profile->GetExtensionService())); | |
| 344 installer->set_error_on_unsupported_requirements(true); | |
| 345 installer->InstallWebApp(install_info); | |
| 346 } | |
| 347 | |
| 282 void TabHelper::DidCloneToNewWebContents(WebContents* old_web_contents, | 348 void TabHelper::DidCloneToNewWebContents(WebContents* old_web_contents, |
| 283 WebContents* new_web_contents) { | 349 WebContents* new_web_contents) { |
| 284 // When the WebContents that this is attached to is cloned, give the new clone | 350 // When the WebContents that this is attached to is cloned, give the new clone |
| 285 // a TabHelper and copy state over. | 351 // a TabHelper and copy state over. |
| 286 CreateForWebContents(new_web_contents); | 352 CreateForWebContents(new_web_contents); |
| 287 TabHelper* new_helper = FromWebContents(new_web_contents); | 353 TabHelper* new_helper = FromWebContents(new_web_contents); |
| 288 | 354 |
| 289 new_helper->SetExtensionApp(extension_app()); | 355 new_helper->SetExtensionApp(extension_app()); |
| 290 new_helper->extension_app_icon_ = extension_app_icon_; | 356 new_helper->extension_app_icon_ = extension_app_icon_; |
| 291 } | 357 } |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 302 return; | 368 return; |
| 303 | 369 |
| 304 switch (pending_web_app_action_) { | 370 switch (pending_web_app_action_) { |
| 305 case CREATE_SHORTCUT: { | 371 case CREATE_SHORTCUT: { |
| 306 chrome::ShowCreateWebAppShortcutsDialog( | 372 chrome::ShowCreateWebAppShortcutsDialog( |
| 307 web_contents()->GetView()->GetTopLevelNativeWindow(), | 373 web_contents()->GetView()->GetTopLevelNativeWindow(), |
| 308 web_contents()); | 374 web_contents()); |
| 309 break; | 375 break; |
| 310 } | 376 } |
| 311 case CREATE_HOSTED_APP: { | 377 case CREATE_HOSTED_APP: { |
| 312 CreateHostedApp(info); | 378 CreateHostedApp(); |
| 313 break; | 379 break; |
| 314 } | 380 } |
| 315 case UPDATE_SHORTCUT: { | 381 case UPDATE_SHORTCUT: { |
| 316 web_app::UpdateShortcutForTabContents(web_contents()); | 382 web_app::UpdateShortcutForTabContents(web_contents()); |
| 317 break; | 383 break; |
| 318 } | 384 } |
| 319 default: | 385 default: |
| 320 NOTREACHED(); | 386 NOTREACHED(); |
| 321 break; | 387 break; |
| 322 } | 388 } |
| 323 | 389 |
| 324 // The hosted app action will be cleared once the installation completes or | 390 // The hosted app action will be cleared once the installation completes or |
| 325 // fails. | 391 // fails. |
| 326 if (pending_web_app_action_ != CREATE_HOSTED_APP) | 392 if (pending_web_app_action_ != CREATE_HOSTED_APP) |
| 327 pending_web_app_action_ = NONE; | 393 pending_web_app_action_ = NONE; |
| 328 #endif | 394 #endif |
| 329 } | 395 } |
| 330 | 396 |
| 331 void TabHelper::CreateHostedApp(const WebApplicationInfo& info) { | |
| 332 ShellIntegration::ShortcutInfo shortcut_info; | |
| 333 web_app::GetShortcutInfoForTab(web_contents(), &shortcut_info); | |
|
benwells
2013/12/12 21:17:57
Is GetShortcutInfoForTab still used?
calamity
2013/12/13 03:11:55
Yes, in the create applications shortcut dialog =(
| |
| 334 WebApplicationInfo web_app_info; | |
| 335 | |
| 336 web_app_info.is_bookmark_app = true; | |
| 337 web_app_info.app_url = shortcut_info.url; | |
| 338 web_app_info.title = shortcut_info.title; | |
| 339 web_app_info.urls.push_back(web_app_info.app_url); | |
| 340 | |
| 341 // TODO(calamity): this should attempt to download the best icon that it can | |
| 342 // from |info.icons| rather than just using the favicon as it scales up badly. | |
| 343 // Fix this once |info.icons| gets populated commonly. | |
| 344 | |
| 345 // Get the smallest icon in the icon family (should have only 1). | |
| 346 const gfx::Image* icon = shortcut_info.favicon.GetBest(0, 0); | |
| 347 SkBitmap bitmap = icon ? icon->AsBitmap() : SkBitmap(); | |
| 348 | |
| 349 if (!icon->IsEmpty()) { | |
| 350 WebApplicationInfo::IconInfo icon_info; | |
| 351 icon_info.data = bitmap; | |
| 352 icon_info.width = icon_info.data.width(); | |
| 353 icon_info.height = icon_info.data.height(); | |
| 354 web_app_info.icons.push_back(icon_info); | |
| 355 } | |
| 356 | |
| 357 ExtensionService* service = profile_->GetExtensionService(); | |
| 358 scoped_refptr<extensions::CrxInstaller> installer( | |
| 359 extensions::CrxInstaller::CreateSilent(service)); | |
| 360 installer->set_error_on_unsupported_requirements(true); | |
| 361 installer->InstallWebApp(web_app_info); | |
| 362 } | |
| 363 | |
| 364 void TabHelper::OnInlineWebstoreInstall( | 397 void TabHelper::OnInlineWebstoreInstall( |
| 365 int install_id, | 398 int install_id, |
| 366 int return_route_id, | 399 int return_route_id, |
| 367 const std::string& webstore_item_id, | 400 const std::string& webstore_item_id, |
| 368 const GURL& requestor_url) { | 401 const GURL& requestor_url) { |
| 369 WebstoreStandaloneInstaller::Callback callback = | 402 WebstoreStandaloneInstaller::Callback callback = |
| 370 base::Bind(&TabHelper::OnInlineInstallComplete, base::Unretained(this), | 403 base::Bind(&TabHelper::OnInlineInstallComplete, base::Unretained(this), |
| 371 install_id, return_route_id); | 404 install_id, return_route_id); |
| 372 scoped_refptr<WebstoreInlineInstaller> installer( | 405 scoped_refptr<WebstoreInlineInstaller> installer( |
| 373 webstore_inline_installer_factory_->CreateInstaller( | 406 webstore_inline_installer_factory_->CreateInstaller( |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 541 GetApplicationInfo(entry->GetPageID()); | 574 GetApplicationInfo(entry->GetPageID()); |
| 542 else | 575 else |
| 543 pending_web_app_action_ = NONE; | 576 pending_web_app_action_ = NONE; |
| 544 } | 577 } |
| 545 break; | 578 break; |
| 546 } | 579 } |
| 547 case chrome::NOTIFICATION_CRX_INSTALLER_DONE: { | 580 case chrome::NOTIFICATION_CRX_INSTALLER_DONE: { |
| 548 if (pending_web_app_action_ != CREATE_HOSTED_APP) | 581 if (pending_web_app_action_ != CREATE_HOSTED_APP) |
| 549 return; | 582 return; |
| 550 | 583 |
| 584 favicon_downloader_.reset(); | |
|
benwells
2013/12/12 21:17:57
Can the downloader be removed once it is finished,
calamity
2013/12/13 03:11:55
Done.
| |
| 551 pending_web_app_action_ = NONE; | 585 pending_web_app_action_ = NONE; |
| 552 | 586 |
| 553 const Extension* extension = | 587 const Extension* extension = |
| 554 content::Details<const Extension>(details).ptr(); | 588 content::Details<const Extension>(details).ptr(); |
| 555 if (!extension || !extension->from_bookmark()) | 589 if (!extension || !extension->from_bookmark()) |
| 556 return; | 590 return; |
| 557 | 591 |
| 558 // If enabled, launch the app launcher and highlight the new app. | 592 // If enabled, launch the app launcher and highlight the new app. |
| 559 // Otherwise, open the chrome://apps page in a new foreground tab. | 593 // Otherwise, open the chrome://apps page in a new foreground tab. |
| 560 if (IsAppLauncherEnabled()) { | 594 if (IsAppLauncherEnabled()) { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 577 browser->OpenURL( | 611 browser->OpenURL( |
| 578 content::OpenURLParams(GURL(chrome::kChromeUIAppsURL), | 612 content::OpenURLParams(GURL(chrome::kChromeUIAppsURL), |
| 579 content::Referrer(), | 613 content::Referrer(), |
| 580 NEW_FOREGROUND_TAB, | 614 NEW_FOREGROUND_TAB, |
| 581 content::PAGE_TRANSITION_LINK, | 615 content::PAGE_TRANSITION_LINK, |
| 582 false)); | 616 false)); |
| 583 } | 617 } |
| 584 #endif | 618 #endif |
| 585 } | 619 } |
| 586 case chrome::NOTIFICATION_EXTENSION_INSTALL_ERROR: { | 620 case chrome::NOTIFICATION_EXTENSION_INSTALL_ERROR: { |
| 587 if (pending_web_app_action_ == CREATE_HOSTED_APP) | 621 if (pending_web_app_action_ == CREATE_HOSTED_APP) { |
| 622 favicon_downloader_.reset(); | |
| 588 pending_web_app_action_ = NONE; | 623 pending_web_app_action_ = NONE; |
| 624 } | |
| 589 break; | 625 break; |
| 590 } | 626 } |
| 591 case chrome::NOTIFICATION_EXTENSION_UNLOADED: { | 627 case chrome::NOTIFICATION_EXTENSION_UNLOADED: { |
| 592 if (script_bubble_controller_) { | 628 if (script_bubble_controller_) { |
| 593 script_bubble_controller_->OnExtensionUnloaded( | 629 script_bubble_controller_->OnExtensionUnloaded( |
| 594 content::Details<extensions::UnloadedExtensionInfo>( | 630 content::Details<extensions::UnloadedExtensionInfo>( |
| 595 details)->extension->id()); | 631 details)->extension->id()); |
| 596 break; | 632 break; |
| 597 } | 633 } |
| 598 } | 634 } |
| 599 } | 635 } |
| 600 } | 636 } |
| 601 | 637 |
| 602 void TabHelper::SetTabId(RenderViewHost* render_view_host) { | 638 void TabHelper::SetTabId(RenderViewHost* render_view_host) { |
| 603 render_view_host->Send( | 639 render_view_host->Send( |
| 604 new ExtensionMsg_SetTabId(render_view_host->GetRoutingID(), | 640 new ExtensionMsg_SetTabId(render_view_host->GetRoutingID(), |
| 605 SessionID::IdForTab(web_contents()))); | 641 SessionID::IdForTab(web_contents()))); |
| 606 } | 642 } |
| 607 | 643 |
| 608 } // namespace extensions | 644 } // namespace extensions |
| OLD | NEW |