tab_helper.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
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_( 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()), this), 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_web_app_action_(NONE), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) script_executor_(new ScriptExecutor(web_contents, 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &script_execution_observers_)), 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) location_bar_controller_(new LocationBarController(web_contents)), 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) image_loader_ptr_factory_(this), 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webstore_inline_installer_factory_(new WebstoreInlineInstallerFactory()) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The ActiveTabPermissionManager requires a session ID; ensure this 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebContents has one. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionTabHelper::CreateForWebContents(web_contents); 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (web_contents->GetRenderViewHost()) 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetTabId(web_contents->GetRenderViewHost()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_tab_permission_granter_.reset(new ActiveTabPermissionGranter( 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SessionID::IdForTab(web_contents), 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()))); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If more classes need to listen to global content script activity, then 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a separate routing class with an observer interface should be written. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_ = Profile::FromBrowserContext(web_contents->GetBrowserContext()); 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddScriptExecutionObserver(ActivityLog::GetInstance(profile_)); 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<NavigationController>( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_contents->GetController())); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabHelper::~TabHelper() { 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveScriptExecutionObserver(ActivityLog::GetInstance(profile_)); 13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::CreateApplicationShortcuts() { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(CanCreateApplicationShortcuts()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetController().GetLastCommittedEntry(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_web_app_action_ = CREATE_SHORTCUT; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start fetching web app info for CreateApplicationShortcut dialog and show 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the dialog when the data is available in OnDidGetApplicationInfo. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetApplicationInfo(entry->GetPageID()); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void TabHelper::CreateHostedAppFromWebContents() { 156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(CanCreateBookmarkApp()); 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigationEntry* entry = 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_contents()->GetController().GetLastCommittedEntry(); 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!entry) 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pending_web_app_action_ = CREATE_HOSTED_APP; 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Start fetching web app info for CreateApplicationShortcut dialog and show 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the dialog when the data is available in OnDidGetApplicationInfo. 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetApplicationInfo(entry->GetPageID()); 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabHelper::CanCreateApplicationShortcuts() const { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_app::IsValidUrl(web_contents()->GetURL()) && 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_web_app_action_ == NONE; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool TabHelper::CanCreateBookmarkApp() const { 179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_MACOSX) 180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return IsValidBookmarkAppUrl(web_contents()->GetURL()) && 183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch pending_web_app_action_ == NONE; 184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionApp(const Extension* extension) { 188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!extension || AppLaunchInfo::GetFullLaunchURL(extension).is_valid()); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extension_app_ == extension) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_ = extension; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtensionAppIcon(extension_app_); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<TabHelper>(this), 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionAppById(const std::string& extension_app_id) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetExtension(extension_app_id); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExtensionApp(extension); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetExtensionAppIconById(const std::string& extension_app_id) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = GetExtension(extension_app_id); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateExtensionAppIcon(extension); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap* TabHelper::GetExtensionAppIcon() { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_app_icon_.empty()) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &extension_app_icon_; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TabHelper::FinishCreateBookmarkApp( 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const extensions::Extension* extension, 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const WebApplicationInfo& web_app_info) { 224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch pending_web_app_action_ = NONE; 225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // There was an error with downloading the icons or installing the app. 227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!extension) 228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_CHROMEOS) 231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ChromeLauncherController::instance()->PinAppWithID(extension->id()); 232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Android does not implement browser_finder.cc. 235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(OS_ANDROID) 236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); 237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (browser) { 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch browser->window()->ShowBookmarkAppBubble(web_app_info, extension->id()); 239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::RenderViewCreated(RenderViewHost* render_view_host) { 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetTabId(render_view_host); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::DidNavigateMainFrame( 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::LoadCommittedDetails& details, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::FrameNavigateParams& params) { 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ExtensionSystem::Get(profile_)->extension_service() && 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)) { 253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)->content_rules_registry()-> 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DidNavigateMainFrame(web_contents(), details, params); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(ENABLE_EXTENSIONS) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::BrowserContext* context = web_contents()->GetBrowserContext(); 259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExtensionRegistry* registry = ExtensionRegistry::Get(context); 260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const ExtensionSet& enabled_extensions = registry->enabled_extensions(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switches::kEnableStreamlinedHostedApps)) { 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_ANDROID) 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (browser && browser->is_app()) { 267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SetExtensionApp(registry->GetExtensionById( 268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch web_app::GetExtensionIdFromApplicationName(browser->app_name()), 269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExtensionRegistry::EVERYTHING)); 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UpdateExtensionAppIcon( 272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch enabled_extensions.GetExtensionOrAppByURL(params.url)); 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UpdateExtensionAppIcon( 277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch enabled_extensions.GetExtensionOrAppByURL(params.url)); 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (details.is_in_page) 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionActionManager* extension_action_manager = 284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ExtensionActionManager::Get(Profile::FromBrowserContext(context)); 285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch for (ExtensionSet::const_iterator it = enabled_extensions.begin(); 286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch it != enabled_extensions.end(); 287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ++it) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAction* browser_action = 2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) extension_action_manager->GetBrowserAction(*it->get()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (browser_action) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_action->ClearAllValuesForTab(SessionID::IdForTab(web_contents())); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<ExtensionAction>(browser_action), 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabHelper::OnMessageReceived(const IPC::Message& message) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(TabHelper, message) 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeExtensionHostMsg_DidGetApplicationInfo, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDidGetApplicationInfo) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_InlineWebstoreInstall, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnInlineWebstoreInstall) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_GetAppInstallState, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetAppInstallState); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnRequest) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_ContentScriptsExecuting, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentScriptsExecuting) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ExtensionHostMsg_OnWatchedPageChange, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnWatchedPageChange) 31446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 31546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IPC_END_MESSAGE_MAP() 31646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return handled; 31746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 31846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 31946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool TabHelper::OnMessageReceived(const IPC::Message& message, 32046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::RenderFrameHost* render_frame_host) { 321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 32246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool handled = true; 32346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(TabHelper, message) 32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_DetailedConsoleMessageAdded, 32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OnDetailedConsoleMessageAdded) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else 329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool handled = false; 330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::DidCloneToNewWebContents(WebContents* old_web_contents, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents* new_web_contents) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the WebContents that this is attached to is cloned, give the new clone 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a TabHelper and copy state over. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateForWebContents(new_web_contents); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabHelper* new_helper = FromWebContents(new_web_contents); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_helper->SetExtensionApp(extension_app()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_helper->extension_app_icon_ = extension_app_icon_; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnDidGetApplicationInfo(int32 page_id, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebApplicationInfo& info) { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Android does not implement BrowserWindow. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) && !defined(OS_ANDROID) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_app_info_ = info; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetController().GetLastCommittedEntry(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!entry || (entry->GetPageID() != page_id)) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (pending_web_app_action_) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CREATE_SHORTCUT: { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::ShowCreateWebAppShortcutsDialog( 359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) web_contents()->GetTopLevelNativeWindow(), 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case CREATE_HOSTED_APP: { 364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (web_app_info_.app_url.is_empty()) 365effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch web_app_info_.app_url = web_contents()->GetURL(); 366effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (web_app_info_.title.empty()) 368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch web_app_info_.title = web_contents()->GetTitle(); 369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (web_app_info_.title.empty()) 370effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch web_app_info_.title = base::UTF8ToUTF16(web_app_info_.app_url.spec()); 371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bookmark_app_helper_.reset(new BookmarkAppHelper( 373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch profile_->GetExtensionService(), web_app_info_, web_contents())); 374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bookmark_app_helper_->Create(base::Bind( 375effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &TabHelper::FinishCreateBookmarkApp, base::Unretained(this))); 376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UPDATE_SHORTCUT: { 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_app::UpdateShortcutForTabContents(web_contents()); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The hosted app action will be cleared once the installation completes or 388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // fails. 389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (pending_web_app_action_ != CREATE_HOSTED_APP) 390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pending_web_app_action_ = NONE; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid TabHelper::OnInlineWebstoreInstall(int install_id, 395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int return_route_id, 396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& webstore_item_id, 397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const GURL& requestor_url, 398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int listeners_mask) { 399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(ENABLE_EXTENSIONS) 400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Check that the listener is reasonable. We should never get anything other 401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // than an install stage listener, a download listener, or both. 402effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if ((listeners_mask & ~(api::webstore::INSTALL_STAGE_LISTENER | 403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch api::webstore::DOWNLOAD_PROGRESS_LISTENER)) != 0) { 404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NOTREACHED(); 405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return; 406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Inform the Webstore API that an inline install is happening, in case the 408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // page requested status updates. 409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Profile* profile = 410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch WebstoreAPI::Get(profile)->OnInlineInstallStart( 412effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return_route_id, this, webstore_item_id, listeners_mask); 413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebstoreStandaloneInstaller::Callback callback = 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&TabHelper::OnInlineInstallComplete, base::Unretained(this), 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_id, return_route_id); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<WebstoreInlineInstaller> installer( 4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webstore_inline_installer_factory_->CreateInstaller( 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents(), 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webstore_item_id, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requestor_url, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback)); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) installer->BeginInstall(); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnGetAppInstallState(const GURL& requestor_url, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int return_route_id, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int callback_id) { 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionRegistry* registry = 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionRegistry::Get(web_contents()->GetBrowserContext()); 4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ExtensionSet& extensions = registry->enabled_extensions(); 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ExtensionSet& disabled_extensions = registry->disabled_extensions(); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string state; 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (extensions.GetHostedAppByURL(requestor_url)) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateInstalled; 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (disabled_extensions.GetHostedAppByURL(requestor_url)) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateDisabled; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = extension_misc::kAppStateNotInstalled; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ExtensionMsg_GetAppInstallStateResponse( 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return_route_id, state, callback_id)); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnRequest(const ExtensionHostMsg_Request_Params& request) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_function_dispatcher_.Dispatch(request, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->GetRenderViewHost()); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnContentScriptsExecuting( 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ScriptExecutionObserver::ExecutingScriptsMap& executing_scripts_map, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 on_page_id, 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& on_url) { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(ScriptExecutionObserver, script_execution_observers_, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnScriptsExecuted(web_contents(), 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) executing_scripts_map, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_page_id, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_url)); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TabHelper::OnWatchedPageChange( 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& css_selectors) { 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 466868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (ExtensionSystem::Get(profile_)->extension_service() && 467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)) { 468868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RulesRegistryService::Get(profile_)->content_rules_registry()->Apply( 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents(), css_selectors); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(ENABLE_EXTENSIONS) 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TabHelper::OnDetailedConsoleMessageAdded( 47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& message, 47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::string16& source, 47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const StackTrace& stack_trace, 47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int32 severity_level) { 479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (IsSourceFromAnExtension(source)) { 4810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); 48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ErrorConsole::Get(profile_)->ReportError( 48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<ExtensionError>(new RuntimeError( 484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extension_app_ ? extension_app_->id() : std::string(), 48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile_->IsOffTheRecord(), 48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) source, 48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) message, 48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) stack_trace, 48958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) web_contents() ? 49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) web_contents()->GetLastCommittedURL() : GURL::EmptyGURL(), 4910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) static_cast<logging::LogSeverity>(severity_level), 4920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) rvh->GetRoutingID(), 4930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) rvh->GetProcess()->GetID()))); 49458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Extension* TabHelper::GetExtension(const std::string& extension_app_id) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension_app_id.empty()) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionService* extension_service = profile->GetExtensionService(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!extension_service || !extension_service->is_ready()) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_service->GetExtensionById(extension_app_id, false); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::UpdateExtensionAppIcon(const Extension* extension) { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_.reset(); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure previously enqueued callbacks are ignored. 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_loader_ptr_factory_.InvalidateWeakPtrs(); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enqueue OnImageLoaded callback. 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) { 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ImageLoader* loader = extensions::ImageLoader::Get(profile); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loader->LoadImageAsync( 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension, 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IconsInfo::GetIconResource(extension, 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::EXTENSION_ICON_SMALL, 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtensionIconSet::MATCH_BIGGER), 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Size(extension_misc::EXTENSION_ICON_SMALL, 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extension_misc::EXTENSION_ICON_SMALL), 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&TabHelper::OnImageLoaded, 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) image_loader_ptr_factory_.GetWeakPtr())); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::SetAppIcon(const SkBitmap& app_icon) { 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_ = app_icon; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->NotifyNavigationStateChanged(content::INVALIDATE_TYPE_TITLE); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TabHelper::SetWebstoreInlineInstallerFactoryForTests( 5414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebstoreInlineInstallerFactory* factory) { 5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) webstore_inline_installer_factory_.reset(factory); 5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TabHelper::OnImageLoaded(const gfx::Image& image) { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!image.IsEmpty()) { 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_app_icon_ = *image.ToSkBitmap(); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents()->NotifyNavigationStateChanged(content::INVALIDATE_TYPE_TAB); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowController* TabHelper::GetExtensionWindowController() const { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ExtensionTabUtil::GetWindowControllerOfTab(web_contents()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::OnInlineInstallComplete(int install_id, 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int return_route_id, 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& error) { 5607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Send(new ExtensionMsg_InlineWebstoreInstallResponse( 5617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return_route_id, install_id, success, success ? std::string() : error)); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContents* TabHelper::GetAssociatedWebContents() const { 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_contents(); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::GetApplicationInfo(int32 page_id) { 569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new ChromeExtensionMsg_GetApplicationInfo(routing_id(), page_id)); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabHelper::Observe(int type, 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (type) { 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case content::NOTIFICATION_LOAD_STOP: { 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NavigationController& controller = 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *content::Source<NavigationController>(source).ptr(); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(controller.GetWebContents(), web_contents()); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_web_app_action_ == UPDATE_SHORTCUT) { 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Schedule a shortcut update when web application info is available if 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // last committed entry is not NULL. Last committed entry could be NULL 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when an interstitial page is injected (e.g. bad https certificate, 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // malware site etc). When this happens, we abort the shortcut update. 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationEntry* entry = controller.GetLastCommittedEntry(); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (entry) 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetApplicationInfo(entry->GetPageID()); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_web_app_action_ = NONE; 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void TabHelper::SetTabId(RenderViewHost* render_view_host) { 59890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) render_view_host->Send( 59990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new ExtensionMsg_SetTabId(render_view_host->GetRoutingID(), 60090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SessionID::IdForTab(web_contents()))); 60190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 60290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 604