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) 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/logging.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/string_util.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/active_script_controller.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_log.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/api/declarative_content/chrome_content_rules_registry.h" 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/extensions/api/extension_action/extension_action_api.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/extensions/api/webstore/webstore_api.h" 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/extensions/bookmark_app_helper.h" 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/error_console/error_console.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_util.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/location_bar_controller.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/webstore_inline_installer.h" 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/extensions/webstore_inline_installer_factory.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/shell_integration.h" 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h" 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_applications/web_app.h" 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/extensions/chrome_extension_messages.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_launch_info.h" 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/render_messages.h" 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/url_constants.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/invalidate_type.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/frame_navigate_params.h" 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/declarative/rules_registry_service.h" 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "extensions/browser/extension_error.h" 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_registry.h" 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "extensions/browser/image_loader.h" 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/common/constants.h" 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_icon_set.h" 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/common/extension_messages.h" 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/extension_resource.h" 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "extensions/common/extension_urls.h" 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h" 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/manifest_handlers/icons_handler.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN) 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/web_applications/web_app_win.h" 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DEFINE_WEB_CONTENTS_USER_DATA_KEY(extensions::TabHelper); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::TabHelper(content::WebContents* web_contents) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : content::WebContentsObserver(web_contents), 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_(NULL), 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extension_function_dispatcher_( 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Profile::FromBrowserContext(web_contents->GetBrowserContext()), 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_web_app_action_(NONE), 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch last_committed_page_id_(-1), 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch update_shortcut_on_load_complete_(false), 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch script_executor_( 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new ScriptExecutor(web_contents, &script_execution_observers_)), 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) location_bar_controller_(new LocationBarController(web_contents)), 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci active_script_controller_(new ActiveScriptController(web_contents)), 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci webstore_inline_installer_factory_(new WebstoreInlineInstallerFactory()), 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci image_loader_ptr_factory_(this) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The ActiveTabPermissionManager requires a session ID; ensure this 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents has one. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper::CreateForWebContents(web_contents); 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (web_contents->GetRenderViewHost()) 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetTabId(web_contents->GetRenderViewHost()); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_tab_permission_granter_.reset(new ActiveTabPermissionGranter( 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents, 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SessionTabHelper::IdForTab(web_contents), 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()))); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If more classes need to listen to global content script activity, then 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a separate routing class with an observer interface should be written. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_ = Profile::FromBrowserContext(web_contents->GetBrowserContext()); 10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddScriptExecutionObserver(ActivityLog::GetInstance(profile_)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_contents->GetController())); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::~TabHelper() { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveScriptExecutionObserver(ActivityLog::GetInstance(profile_)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::CreateApplicationShortcuts() { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CanCreateApplicationShortcuts()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start fetching web app info for CreateApplicationShortcut dialog and show 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the dialog when the data is available in OnDidGetApplicationInfo. 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetApplicationInfo(CREATE_SHORTCUT); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TabHelper::CreateHostedAppFromWebContents() { 128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(CanCreateBookmarkApp()); 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Start fetching web app info for CreateApplicationShortcut dialog and show 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the dialog when the data is available in OnDidGetApplicationInfo. 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetApplicationInfo(CREATE_HOSTED_APP); 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabHelper::CanCreateApplicationShortcuts() const { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_app::IsValidUrl(web_contents()->GetURL()) && 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_web_app_action_ == NONE; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool TabHelper::CanCreateBookmarkApp() const { 144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_MACOSX) 145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else 147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return IsValidBookmarkAppUrl(web_contents()->GetURL()) && 148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch pending_web_app_action_ == NONE; 149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TabHelper::AddScriptExecutionObserver(ScriptExecutionObserver* observer) { 1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) script_execution_observers_.AddObserver(observer); 1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TabHelper::RemoveScriptExecutionObserver( 1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ScriptExecutionObserver* observer) { 1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) script_execution_observers_.RemoveObserver(observer); 1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionApp(const Extension* extension) { 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!extension || AppLaunchInfo::GetFullLaunchURL(extension).is_valid()); 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extension_app_ == extension) 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_ = extension; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtensionAppIcon(extension_app_); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<TabHelper>(this), 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionAppById(const std::string& extension_app_id) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetExtension(extension_app_id); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExtensionApp(extension); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionAppIconById(const std::string& extension_app_id) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetExtension(extension_app_id); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtensionAppIcon(extension); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap* TabHelper::GetExtensionAppIcon() { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_app_icon_.empty()) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &extension_app_icon_; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TabHelper::FinishCreateBookmarkApp( 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Extension* extension, 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const WebApplicationInfo& web_app_info) { 198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pending_web_app_action_ = NONE; 199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // There was an error with downloading the icons or installing the app. 201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!extension) 202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_CHROMEOS) 205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ChromeLauncherController::instance()->PinAppWithID(extension->id()); 206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (browser) { 210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch browser->window()->ShowBookmarkAppBubble(web_app_info, extension->id()); 211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::RenderViewCreated(RenderViewHost* render_view_host) { 21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetTabId(render_view_host); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::DidNavigateMainFrame( 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::LoadCommittedDetails& details, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::FrameNavigateParams& params) { 221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ExtensionSystem::Get(profile_)->extension_service() && 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)) { 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)->content_rules_registry()-> 224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DidNavigateMainFrame(web_contents(), details, params); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::BrowserContext* context = web_contents()->GetBrowserContext(); 228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExtensionRegistry* registry = ExtensionRegistry::Get(context); 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const ExtensionSet& enabled_extensions = registry->enabled_extensions(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (util::IsStreamlinedHostedAppsEnabled()) { 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (browser && browser->is_app()) { 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SetExtensionApp(registry->GetExtensionById( 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch web_app::GetExtensionIdFromApplicationName(browser->app_name()), 236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExtensionRegistry::EVERYTHING)); 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UpdateExtensionAppIcon( 239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch enabled_extensions.GetExtensionOrAppByURL(params.url)); 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UpdateExtensionAppIcon( 243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch enabled_extensions.GetExtensionOrAppByURL(params.url)); 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!details.is_in_page) 24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ExtensionActionAPI::Get(context)->ClearAllValuesForTab(web_contents()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabHelper::OnMessageReceived(const IPC::Message& message) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(TabHelper, message) 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DidGetWebApplicationInfo, 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnDidGetWebApplicationInfo) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_InlineWebstoreInstall, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInlineWebstoreInstall) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_GetAppInstallState, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetAppInstallState); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_ContentScriptsExecuting, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentScriptsExecuting) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_OnWatchedPageChange, 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnWatchedPageChange) 26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IPC_END_MESSAGE_MAP() 26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return handled; 26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool TabHelper::OnMessageReceived(const IPC::Message& message, 27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::RenderFrameHost* render_frame_host) { 27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool handled = true; 27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(TabHelper, message) 27303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_DetailedConsoleMessageAdded, 27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OnDetailedConsoleMessageAdded) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::DidCloneToNewWebContents(WebContents* old_web_contents, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_web_contents) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the WebContents that this is attached to is cloned, give the new clone 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a TabHelper and copy state over. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateForWebContents(new_web_contents); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabHelper* new_helper = FromWebContents(new_web_contents); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_helper->SetExtensionApp(extension_app()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_helper->extension_app_icon_ = extension_app_icon_; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TabHelper::OnDidGetWebApplicationInfo(const WebApplicationInfo& info) { 292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if !defined(OS_MACOSX) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_app_info_ = info; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetController().GetLastCommittedEntry(); 297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!entry || last_committed_page_id_ != entry->GetPageID()) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch last_committed_page_id_ = -1; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (pending_web_app_action_) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CREATE_SHORTCUT: { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowCreateWebAppShortcutsDialog( 304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_contents()->GetTopLevelNativeWindow(), 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case CREATE_HOSTED_APP: { 309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (web_app_info_.app_url.is_empty()) 310effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch web_app_info_.app_url = web_contents()->GetURL(); 311effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 312effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (web_app_info_.title.empty()) 313effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch web_app_info_.title = web_contents()->GetTitle(); 314effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (web_app_info_.title.empty()) 315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch web_app_info_.title = base::UTF8ToUTF16(web_app_info_.app_url.spec()); 316effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 317effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bookmark_app_helper_.reset(new BookmarkAppHelper( 318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionSystem::Get(profile_)->extension_service(), 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_app_info_, web_contents())); 320effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bookmark_app_helper_->Create(base::Bind( 321effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &TabHelper::FinishCreateBookmarkApp, base::Unretained(this))); 322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UPDATE_SHORTCUT: { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_app::UpdateShortcutForTabContents(web_contents()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The hosted app action will be cleared once the installation completes or 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // fails. 335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (pending_web_app_action_ != CREATE_HOSTED_APP) 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pending_web_app_action_ = NONE; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TabHelper::OnInlineWebstoreInstall(int install_id, 341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int return_route_id, 342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& webstore_item_id, 343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const GURL& requestor_url, 344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int listeners_mask) { 345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Check that the listener is reasonable. We should never get anything other 346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // than an install stage listener, a download listener, or both. 347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if ((listeners_mask & ~(api::webstore::INSTALL_STAGE_LISTENER | 348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch api::webstore::DOWNLOAD_PROGRESS_LISTENER)) != 0) { 349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NOTREACHED(); 350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Inform the Webstore API that an inline install is happening, in case the 353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // page requested status updates. 354effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Profile* profile = 355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 356effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch WebstoreAPI::Get(profile)->OnInlineInstallStart( 357effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return_route_id, this, webstore_item_id, listeners_mask); 358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebstoreStandaloneInstaller::Callback callback = 3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&TabHelper::OnInlineInstallComplete, 3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this), 3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) install_id, 3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return_route_id); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<WebstoreInlineInstaller> installer( 3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webstore_inline_installer_factory_->CreateInstaller( 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents(), 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webstore_item_id, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requestor_url, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback)); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer->BeginInstall(); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnGetAppInstallState(const GURL& requestor_url, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int return_route_id, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int callback_id) { 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionRegistry* registry = 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionRegistry::Get(web_contents()->GetBrowserContext()); 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ExtensionSet& extensions = registry->enabled_extensions(); 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ExtensionSet& disabled_extensions = registry->disabled_extensions(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string state; 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extensions.GetHostedAppByURL(requestor_url)) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateInstalled; 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (disabled_extensions.GetHostedAppByURL(requestor_url)) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateDisabled; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateNotInstalled; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ExtensionMsg_GetAppInstallStateResponse( 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return_route_id, state, callback_id)); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnRequest(const ExtensionHostMsg_Request_Params& request) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_dispatcher_.Dispatch(request, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetRenderViewHost()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnContentScriptsExecuting( 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScriptExecutionObserver::ExecutingScriptsMap& executing_scripts_map, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& on_url) { 4016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FOR_EACH_OBSERVER( 4026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ScriptExecutionObserver, 4036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) script_execution_observers_, 4046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) OnScriptsExecuted(web_contents(), executing_scripts_map, on_url)); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TabHelper::OnWatchedPageChange( 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& css_selectors) { 409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ExtensionSystem::Get(profile_)->extension_service() && 410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)) { 411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)->content_rules_registry()->Apply( 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents(), css_selectors); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TabHelper::OnDetailedConsoleMessageAdded( 41758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& message, 41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& source, 41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const StackTrace& stack_trace, 42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int32 severity_level) { 42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (IsSourceFromAnExtension(source)) { 4220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); 42358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ErrorConsole::Get(profile_)->ReportError( 42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<ExtensionError>(new RuntimeError( 425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extension_app_ ? extension_app_->id() : std::string(), 42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile_->IsOffTheRecord(), 42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) source, 42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) message, 42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) stack_trace, 43058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) web_contents() ? 43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) web_contents()->GetLastCommittedURL() : GURL::EmptyGURL(), 4320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) static_cast<logging::LogSeverity>(severity_level), 4330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) rvh->GetRoutingID(), 4340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) rvh->GetProcess()->GetID()))); 43558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 43658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Extension* TabHelper::GetExtension(const std::string& extension_app_id) { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_app_id.empty()) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* context = web_contents()->GetBrowserContext(); 443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ExtensionRegistry::Get(context)->enabled_extensions().GetByID( 444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extension_app_id); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::UpdateExtensionAppIcon(const Extension* extension) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_.reset(); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure previously enqueued callbacks are ignored. 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_loader_ptr_factory_.InvalidateWeakPtrs(); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enqueue OnImageLoaded callback. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) { 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ImageLoader* loader = ImageLoader::Get(profile); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loader->LoadImageAsync( 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension, 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IconsInfo::GetIconResource(extension, 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::EXTENSION_ICON_SMALL, 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionIconSet::MATCH_BIGGER), 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(extension_misc::EXTENSION_ICON_SMALL, 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::EXTENSION_ICON_SMALL), 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&TabHelper::OnImageLoaded, 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_loader_ptr_factory_.GetWeakPtr())); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetAppIcon(const SkBitmap& app_icon) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_ = app_icon; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->NotifyNavigationStateChanged(content::INVALIDATE_TYPE_TITLE); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TabHelper::SetWebstoreInlineInstallerFactoryForTests( 4754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebstoreInlineInstallerFactory* factory) { 4764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webstore_inline_installer_factory_.reset(factory); 4774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 4784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TabHelper::OnImageLoaded(const gfx::Image& image) { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!image.IsEmpty()) { 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_ = *image.ToSkBitmap(); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->NotifyNavigationStateChanged(content::INVALIDATE_TYPE_TAB); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowController* TabHelper::GetExtensionWindowController() const { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ExtensionTabUtil::GetWindowControllerOfTab(web_contents()); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnInlineInstallComplete(int install_id, 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int return_route_id, 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& error, 4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) webstore_install::Result result) { 4957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Send(new ExtensionMsg_InlineWebstoreInstallResponse( 4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return_route_id, 4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) install_id, 4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) success, 4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) success ? std::string() : error, 5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result)); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* TabHelper::GetAssociatedWebContents() const { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_contents(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 507116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid TabHelper::GetApplicationInfo(WebAppAction action) { 508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NavigationEntry* entry = 509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents()->GetController().GetLastCommittedEntry(); 510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!entry) 511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_web_app_action_ = action; 514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch last_committed_page_id_ = entry->GetPageID(); 515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Send(new ChromeViewMsg_GetWebApplicationInfo(routing_id())); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::Observe(int type, 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_EQ(content::NOTIFICATION_LOAD_STOP, type); 523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const NavigationController& controller = 524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *content::Source<NavigationController>(source).ptr(); 525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_EQ(controller.GetWebContents(), web_contents()); 526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (update_shortcut_on_load_complete_) { 528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch update_shortcut_on_load_complete_ = false; 529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Schedule a shortcut update when web application info is available if 530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // last committed entry is not NULL. Last committed entry could be NULL 531116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // when an interstitial page is injected (e.g. bad https certificate, 532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // malware site etc). When this happens, we abort the shortcut update. 533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (controller.GetLastCommittedEntry()) 534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetApplicationInfo(UPDATE_SHORTCUT); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TabHelper::SetTabId(RenderViewHost* render_view_host) { 53990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) render_view_host->Send( 54090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new ExtensionMsg_SetTabId(render_view_host->GetRoutingID(), 54103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SessionTabHelper::IdForTab(web_contents()))); 54290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 54390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 545