tab_helper.cc revision 116680a4aac90f2aa7413d9095a592090648e557
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/logging.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/string_util.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/active_script_controller.h" 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_log.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative/rules_registry_service.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/declarative_content/content_rules_registry.h" 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/extensions/api/webstore/webstore_api.h" 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/extensions/bookmark_app_helper.h" 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/error_console/error_console.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action_manager.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h" 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/location_bar_controller.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/script_executor.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/webstore_inline_installer.h" 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/extensions/webstore_inline_installer_factory.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_id.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h" 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/shell_integration.h" 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h" 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_applications/web_app.h" 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/extensions/chrome_extension_messages.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_launch_info.h" 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/render_messages.h" 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/url_constants.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/frame_navigate_params.h" 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "extensions/browser/extension_error.h" 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h" 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "extensions/browser/image_loader.h" 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/common/constants.h" 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_icon_set.h" 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/common/extension_messages.h" 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h" 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "extensions/common/extension_urls.h" 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h" 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/manifest_handlers/icons_handler.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN) 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/web_applications/web_app_win.h" 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DEFINE_WEB_CONTENTS_USER_DATA_KEY(extensions::TabHelper); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::ScriptExecutionObserver::ScriptExecutionObserver( 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabHelper* tab_helper) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : tab_helper_(tab_helper) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper_->AddScriptExecutionObserver(this); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::ScriptExecutionObserver::ScriptExecutionObserver() 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : tab_helper_(NULL) { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::ScriptExecutionObserver::~ScriptExecutionObserver() { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tab_helper_) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_helper_->RemoveScriptExecutionObserver(this); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::TabHelper(content::WebContents* web_contents) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : content::WebContentsObserver(web_contents), 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_(NULL), 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_function_dispatcher_( 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Profile::FromBrowserContext(web_contents->GetBrowserContext()), 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_web_app_action_(NONE), 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch last_committed_page_id_(-1), 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch update_shortcut_on_load_complete_(false), 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch script_executor_( 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new ScriptExecutor(web_contents, &script_execution_observers_)), 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) location_bar_controller_(new LocationBarController(web_contents)), 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) image_loader_ptr_factory_(this), 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webstore_inline_installer_factory_(new WebstoreInlineInstallerFactory()) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The ActiveTabPermissionManager requires a session ID; ensure this 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents has one. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper::CreateForWebContents(web_contents); 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (web_contents->GetRenderViewHost()) 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetTabId(web_contents->GetRenderViewHost()); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_tab_permission_granter_.reset(new ActiveTabPermissionGranter( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionID::IdForTab(web_contents), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()))); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If more classes need to listen to global content script activity, then 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a separate routing class with an observer interface should be written. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_ = Profile::FromBrowserContext(web_contents->GetBrowserContext()); 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddScriptExecutionObserver(ActivityLog::GetInstance(profile_)); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_contents->GetController())); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::~TabHelper() { 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveScriptExecutionObserver(ActivityLog::GetInstance(profile_)); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::CreateApplicationShortcuts() { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CanCreateApplicationShortcuts()); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start fetching web app info for CreateApplicationShortcut dialog and show 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the dialog when the data is available in OnDidGetApplicationInfo. 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetApplicationInfo(CREATE_SHORTCUT); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TabHelper::CreateHostedAppFromWebContents() { 148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(CanCreateBookmarkApp()); 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Start fetching web app info for CreateApplicationShortcut dialog and show 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the dialog when the data is available in OnDidGetApplicationInfo. 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetApplicationInfo(CREATE_HOSTED_APP); 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabHelper::CanCreateApplicationShortcuts() const { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_app::IsValidUrl(web_contents()->GetURL()) && 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_web_app_action_ == NONE; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool TabHelper::CanCreateBookmarkApp() const { 164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_MACOSX) 165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else 167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return IsValidBookmarkAppUrl(web_contents()->GetURL()) && 168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch pending_web_app_action_ == NONE; 169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionApp(const Extension* extension) { 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!extension || AppLaunchInfo::GetFullLaunchURL(extension).is_valid()); 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extension_app_ == extension) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_ = extension; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtensionAppIcon(extension_app_); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<TabHelper>(this), 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionAppById(const std::string& extension_app_id) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetExtension(extension_app_id); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExtensionApp(extension); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionAppIconById(const std::string& extension_app_id) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetExtension(extension_app_id); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtensionAppIcon(extension); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap* TabHelper::GetExtensionAppIcon() { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_app_icon_.empty()) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &extension_app_icon_; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TabHelper::FinishCreateBookmarkApp( 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Extension* extension, 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const WebApplicationInfo& web_app_info) { 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pending_web_app_action_ = NONE; 210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // There was an error with downloading the icons or installing the app. 212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!extension) 213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_CHROMEOS) 216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ChromeLauncherController::instance()->PinAppWithID(extension->id()); 217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (browser) { 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch browser->window()->ShowBookmarkAppBubble(web_app_info, extension->id()); 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::RenderViewCreated(RenderViewHost* render_view_host) { 22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetTabId(render_view_host); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::DidNavigateMainFrame( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::LoadCommittedDetails& details, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::FrameNavigateParams& params) { 232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ExtensionSystem::Get(profile_)->extension_service() && 233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)) { 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)->content_rules_registry()-> 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DidNavigateMainFrame(web_contents(), details, params); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::BrowserContext* context = web_contents()->GetBrowserContext(); 239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExtensionRegistry* registry = ExtensionRegistry::Get(context); 240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const ExtensionSet& enabled_extensions = registry->enabled_extensions(); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switches::kEnableStreamlinedHostedApps)) { 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (browser && browser->is_app()) { 246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SetExtensionApp(registry->GetExtensionById( 247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch web_app::GetExtensionIdFromApplicationName(browser->app_name()), 248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExtensionRegistry::EVERYTHING)); 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UpdateExtensionAppIcon( 251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch enabled_extensions.GetExtensionOrAppByURL(params.url)); 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UpdateExtensionAppIcon( 255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch enabled_extensions.GetExtensionOrAppByURL(params.url)); 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (details.is_in_page) 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionActionManager* extension_action_manager = 262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExtensionActionManager::Get(Profile::FromBrowserContext(context)); 263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (ExtensionSet::const_iterator it = enabled_extensions.begin(); 264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch it != enabled_extensions.end(); 265c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ++it) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAction* browser_action = 2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension_action_manager->GetBrowserAction(*it->get()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_action) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_action->ClearAllValuesForTab(SessionID::IdForTab(web_contents())); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<ExtensionAction>(browser_action), 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabHelper::OnMessageReceived(const IPC::Message& message) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(TabHelper, message) 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeExtensionHostMsg_DidGetApplicationInfo, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidGetApplicationInfo) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_InlineWebstoreInstall, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInlineWebstoreInstall) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_GetAppInstallState, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetAppInstallState); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_ContentScriptsExecuting, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentScriptsExecuting) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_OnWatchedPageChange, 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnWatchedPageChange) 29246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 29346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IPC_END_MESSAGE_MAP() 29446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return handled; 29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 29646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool TabHelper::OnMessageReceived(const IPC::Message& message, 29846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::RenderFrameHost* render_frame_host) { 29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool handled = true; 30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(TabHelper, message) 30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DetailedConsoleMessageAdded, 30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OnDetailedConsoleMessageAdded) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::DidCloneToNewWebContents(WebContents* old_web_contents, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_web_contents) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the WebContents that this is attached to is cloned, give the new clone 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a TabHelper and copy state over. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateForWebContents(new_web_contents); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabHelper* new_helper = FromWebContents(new_web_contents); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_helper->SetExtensionApp(extension_app()); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_helper->extension_app_icon_ = extension_app_icon_; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TabHelper::OnDidGetApplicationInfo(const WebApplicationInfo& info) { 320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if !defined(OS_MACOSX) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_app_info_ = info; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetController().GetLastCommittedEntry(); 325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!entry || last_committed_page_id_ != entry->GetPageID()) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch last_committed_page_id_ = -1; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (pending_web_app_action_) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CREATE_SHORTCUT: { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowCreateWebAppShortcutsDialog( 332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_contents()->GetTopLevelNativeWindow(), 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case CREATE_HOSTED_APP: { 337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (web_app_info_.app_url.is_empty()) 338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch web_app_info_.app_url = web_contents()->GetURL(); 339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (web_app_info_.title.empty()) 341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch web_app_info_.title = web_contents()->GetTitle(); 342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (web_app_info_.title.empty()) 343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch web_app_info_.title = base::UTF8ToUTF16(web_app_info_.app_url.spec()); 344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bookmark_app_helper_.reset(new BookmarkAppHelper( 346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionSystem::Get(profile_)->extension_service(), 347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_app_info_, web_contents())); 348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bookmark_app_helper_->Create(base::Bind( 349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &TabHelper::FinishCreateBookmarkApp, base::Unretained(this))); 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UPDATE_SHORTCUT: { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_app::UpdateShortcutForTabContents(web_contents()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The hosted app action will be cleared once the installation completes or 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // fails. 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (pending_web_app_action_ != CREATE_HOSTED_APP) 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pending_web_app_action_ = NONE; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TabHelper::OnInlineWebstoreInstall(int install_id, 369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int return_route_id, 370effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& webstore_item_id, 371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const GURL& requestor_url, 372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int listeners_mask) { 373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Check that the listener is reasonable. We should never get anything other 374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // than an install stage listener, a download listener, or both. 375effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if ((listeners_mask & ~(api::webstore::INSTALL_STAGE_LISTENER | 376effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch api::webstore::DOWNLOAD_PROGRESS_LISTENER)) != 0) { 377effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NOTREACHED(); 378effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Inform the Webstore API that an inline install is happening, in case the 381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // page requested status updates. 382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Profile* profile = 383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch WebstoreAPI::Get(profile)->OnInlineInstallStart( 385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return_route_id, this, webstore_item_id, listeners_mask); 386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebstoreStandaloneInstaller::Callback callback = 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabHelper::OnInlineInstallComplete, base::Unretained(this), 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_id, return_route_id); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<WebstoreInlineInstaller> installer( 3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webstore_inline_installer_factory_->CreateInstaller( 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents(), 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webstore_item_id, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requestor_url, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback)); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer->BeginInstall(); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnGetAppInstallState(const GURL& requestor_url, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int return_route_id, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int callback_id) { 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionRegistry* registry = 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionRegistry::Get(web_contents()->GetBrowserContext()); 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ExtensionSet& extensions = registry->enabled_extensions(); 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ExtensionSet& disabled_extensions = registry->disabled_extensions(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string state; 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extensions.GetHostedAppByURL(requestor_url)) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateInstalled; 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (disabled_extensions.GetHostedAppByURL(requestor_url)) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateDisabled; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateNotInstalled; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ExtensionMsg_GetAppInstallStateResponse( 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return_route_id, state, callback_id)); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnRequest(const ExtensionHostMsg_Request_Params& request) { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_dispatcher_.Dispatch(request, 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetRenderViewHost()); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnContentScriptsExecuting( 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScriptExecutionObserver::ExecutingScriptsMap& executing_scripts_map, 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& on_url) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(ScriptExecutionObserver, script_execution_observers_, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnScriptsExecuted(web_contents(), 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) executing_scripts_map, 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_url)); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TabHelper::OnWatchedPageChange( 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& css_selectors) { 435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ExtensionSystem::Get(profile_)->extension_service() && 436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)) { 437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)->content_rules_registry()->Apply( 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents(), css_selectors); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TabHelper::OnDetailedConsoleMessageAdded( 44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& message, 44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& source, 44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const StackTrace& stack_trace, 44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int32 severity_level) { 44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (IsSourceFromAnExtension(source)) { 4480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); 44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ErrorConsole::Get(profile_)->ReportError( 45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<ExtensionError>(new RuntimeError( 451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extension_app_ ? extension_app_->id() : std::string(), 45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile_->IsOffTheRecord(), 45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) source, 45458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) message, 45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) stack_trace, 45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) web_contents() ? 45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) web_contents()->GetLastCommittedURL() : GURL::EmptyGURL(), 4580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) static_cast<logging::LogSeverity>(severity_level), 4590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) rvh->GetRoutingID(), 4600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) rvh->GetProcess()->GetID()))); 46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Extension* TabHelper::GetExtension(const std::string& extension_app_id) { 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_app_id.empty()) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* context = web_contents()->GetBrowserContext(); 469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ExtensionRegistry::Get(context)->enabled_extensions().GetByID( 470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extension_app_id); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::UpdateExtensionAppIcon(const Extension* extension) { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_.reset(); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure previously enqueued callbacks are ignored. 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_loader_ptr_factory_.InvalidateWeakPtrs(); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enqueue OnImageLoaded callback. 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) { 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ImageLoader* loader = ImageLoader::Get(profile); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loader->LoadImageAsync( 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension, 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IconsInfo::GetIconResource(extension, 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::EXTENSION_ICON_SMALL, 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionIconSet::MATCH_BIGGER), 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(extension_misc::EXTENSION_ICON_SMALL, 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::EXTENSION_ICON_SMALL), 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&TabHelper::OnImageLoaded, 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_loader_ptr_factory_.GetWeakPtr())); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetAppIcon(const SkBitmap& app_icon) { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_ = app_icon; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->NotifyNavigationStateChanged(content::INVALIDATE_TYPE_TITLE); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TabHelper::SetWebstoreInlineInstallerFactoryForTests( 5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebstoreInlineInstallerFactory* factory) { 5024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webstore_inline_installer_factory_.reset(factory); 5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TabHelper::OnImageLoaded(const gfx::Image& image) { 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!image.IsEmpty()) { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_ = *image.ToSkBitmap(); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->NotifyNavigationStateChanged(content::INVALIDATE_TYPE_TAB); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowController* TabHelper::GetExtensionWindowController() const { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ExtensionTabUtil::GetWindowControllerOfTab(web_contents()); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnInlineInstallComplete(int install_id, 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int return_route_id, 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& error) { 5207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Send(new ExtensionMsg_InlineWebstoreInstallResponse( 5217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return_route_id, install_id, success, success ? std::string() : error)); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* TabHelper::GetAssociatedWebContents() const { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_contents(); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 528116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TabHelper::GetApplicationInfo(WebAppAction action) { 529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NavigationEntry* entry = 530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents()->GetController().GetLastCommittedEntry(); 531116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!entry) 532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_web_app_action_ = action; 535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch last_committed_page_id_ = entry->GetPageID(); 536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 537116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Send(new ChromeExtensionMsg_GetApplicationInfo(routing_id())); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::Observe(int type, 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 543116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_EQ(content::NOTIFICATION_LOAD_STOP, type); 544116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const NavigationController& controller = 545116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *content::Source<NavigationController>(source).ptr(); 546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_EQ(controller.GetWebContents(), web_contents()); 547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (update_shortcut_on_load_complete_) { 549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch update_shortcut_on_load_complete_ = false; 550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Schedule a shortcut update when web application info is available if 551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // last committed entry is not NULL. Last committed entry could be NULL 552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // when an interstitial page is injected (e.g. bad https certificate, 553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // malware site etc). When this happens, we abort the shortcut update. 554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (controller.GetLastCommittedEntry()) 555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetApplicationInfo(UPDATE_SHORTCUT); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TabHelper::SetTabId(RenderViewHost* render_view_host) { 56090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) render_view_host->Send( 56190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new ExtensionMsg_SetTabId(render_view_host->GetRoutingID(), 56290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SessionID::IdForTab(web_contents()))); 56390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 56490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 566