diff options
author | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-10 16:16:40 +0000 |
---|---|---|
committer | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-10 16:16:40 +0000 |
commit | 9567f9cc4114c1f004aa57a5cb166f07e9c86693 (patch) | |
tree | 7473450b0322cf354b21ef8061f426efaceaeb87 /chrome | |
parent | bed56af283f2f3426cb6c9549518393032cebd84 (diff) | |
download | chromium_src-9567f9cc4114c1f004aa57a5cb166f07e9c86693.zip chromium_src-9567f9cc4114c1f004aa57a5cb166f07e9c86693.tar.gz chromium_src-9567f9cc4114c1f004aa57a5cb166f07e9c86693.tar.bz2 |
Switch Extensions::TabHelper to use WebContents, WebContentsUserData.
BUG=107201
TEST=no visible change
TBR=ben@chromium.org
Review URL: https://chromiumcodereview.appspot.com/10917026
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@155743 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
43 files changed, 245 insertions, 199 deletions
diff --git a/chrome/browser/extensions/active_tab_unittest.cc b/chrome/browser/extensions/active_tab_unittest.cc index d757124..c38a8e2 100644 --- a/chrome/browser/extensions/active_tab_unittest.cc +++ b/chrome/browser/extensions/active_tab_unittest.cc @@ -67,8 +67,8 @@ class ActiveTabTest : public TabContentsTestHarness { } ActiveTabPermissionManager* active_tab_permission_manager() { - return tab_contents()->extension_tab_helper()-> - active_tab_permission_manager(); + return extensions::TabHelper::FromWebContents(web_contents())-> + active_tab_permission_manager(); } bool IsAllowed(const scoped_refptr<const Extension>& extension, diff --git a/chrome/browser/extensions/api/extension_action/extension_actions_api.cc b/chrome/browser/extensions/api/extension_action/extension_actions_api.cc index 7b4cd1f..3fb1c97 100644 --- a/chrome/browser/extensions/api/extension_action/extension_actions_api.cc +++ b/chrome/browser/extensions/api/extension_action/extension_actions_api.cc @@ -341,7 +341,8 @@ void ExtensionActionFunction::NotifyBrowserActionChange() { } void ExtensionActionFunction::NotifyLocationBarChange() { - contents_->extension_tab_helper()->location_bar_controller()->NotifyChange(); + extensions::TabHelper::FromWebContents(contents_->web_contents())-> + location_bar_controller()->NotifyChange(); } // static @@ -390,7 +391,7 @@ bool ExtensionActionFunction::SetVisible(bool visible) { extensions::TabHelper& ExtensionActionFunction::tab_helper() const { CHECK(contents_); - return *contents_->extension_tab_helper(); + return *extensions::TabHelper::FromWebContents(contents_->web_contents()); } bool ExtensionActionShowFunction::RunExtensionAction() { diff --git a/chrome/browser/extensions/api/extension_action/extension_page_actions_api.cc b/chrome/browser/extensions/api/extension_action/extension_page_actions_api.cc index eff7b16..55cba75 100644 --- a/chrome/browser/extensions/api/extension_action/extension_page_actions_api.cc +++ b/chrome/browser/extensions/api/extension_action/extension_page_actions_api.cc @@ -99,7 +99,8 @@ bool PageActionsFunction::SetPageActionEnabled(bool enable) { tab_id, enable ? ExtensionAction::ACTIVE : ExtensionAction::INVISIBLE); page_action->SetTitle(tab_id, title); page_action->SetIconIndex(tab_id, icon_id); - contents->extension_tab_helper()->location_bar_controller()->NotifyChange(); + extensions::TabHelper::FromWebContents(contents->web_contents())-> + location_bar_controller()->NotifyChange(); return true; } diff --git a/chrome/browser/extensions/api/extension_action/script_badge_apitest.cc b/chrome/browser/extensions/api/extension_action/script_badge_apitest.cc index 8e9a3c1..ca0f1f1 100644 --- a/chrome/browser/extensions/api/extension_action/script_badge_apitest.cc +++ b/chrome/browser/extensions/api/extension_action/script_badge_apitest.cc @@ -38,8 +38,9 @@ IN_PROC_BROWSER_TEST_F(ScriptBadgeApiTest, Basics) { ExtensionAction* script_badge = extension->script_badge(); ASSERT_TRUE(script_badge); const extensions::LocationBarController* location_bar_controller = - chrome::GetActiveTabContents(browser())->extension_tab_helper()-> - location_bar_controller(); + extensions::TabHelper::FromWebContents( + chrome::GetActiveWebContents(browser()))-> + location_bar_controller(); const int tab_id = SessionID::IdForTab( chrome::GetActiveTabContents(browser())); diff --git a/chrome/browser/extensions/api/omnibox/omnibox_api.cc b/chrome/browser/extensions/api/omnibox/omnibox_api.cc index 85b352b..efe9f07 100644 --- a/chrome/browser/extensions/api/omnibox/omnibox_api.cc +++ b/chrome/browser/extensions/api/omnibox/omnibox_api.cc @@ -84,8 +84,8 @@ void ExtensionOmniboxEventRouter::OnInputEntered( ExtensionSystem::Get(profile)->extension_service()->extensions()-> GetByID(extension_id); CHECK(extension); - tab_contents->extension_tab_helper()->active_tab_permission_manager()-> - GrantIfRequested(extension); + extensions::TabHelper::FromWebContents(tab_contents->web_contents())-> + active_tab_permission_manager()->GrantIfRequested(extension); scoped_ptr<ListValue> args(new ListValue()); args->Set(0, Value::CreateStringValue(input)); diff --git a/chrome/browser/extensions/api/tabs/execute_code_in_tab_function.cc b/chrome/browser/extensions/api/tabs/execute_code_in_tab_function.cc index 43da953..5b76613 100644 --- a/chrome/browser/extensions/api/tabs/execute_code_in_tab_function.cc +++ b/chrome/browser/extensions/api/tabs/execute_code_in_tab_function.cc @@ -265,13 +265,14 @@ bool ExecuteCodeInTabFunction::Execute(const std::string& code_string) { } CHECK_NE(UserScript::UNDEFINED, run_at); - contents->extension_tab_helper()->script_executor()->ExecuteScript( - extension->id(), - script_type, - code_string, - frame_scope, - run_at, - ScriptExecutor::ISOLATED_WORLD, - base::Bind(&ExecuteCodeInTabFunction::OnExecuteCodeFinished, this)); + extensions::TabHelper::FromWebContents(contents->web_contents())-> + script_executor()->ExecuteScript( + extension->id(), + script_type, + code_string, + frame_scope, + run_at, + ScriptExecutor::ISOLATED_WORLD, + base::Bind(&ExecuteCodeInTabFunction::OnExecuteCodeFinished, this)); return true; } diff --git a/chrome/browser/extensions/api/tabs/tabs.cc b/chrome/browser/extensions/api/tabs/tabs.cc index 1156651..d93d3d9 100644 --- a/chrome/browser/extensions/api/tabs/tabs.cc +++ b/chrome/browser/extensions/api/tabs/tabs.cc @@ -618,8 +618,10 @@ bool CreateWindowFunction::RunImpl() { for (std::vector<GURL>::iterator i = urls.begin(); i != urls.end(); ++i) { TabContents* tab = chrome::AddSelectedTabWithURL( new_window, *i, content::PAGE_TRANSITION_LINK); - if (window_type == Browser::TYPE_PANEL) - tab->extension_tab_helper()->SetExtensionAppIconById(extension_id); + if (window_type == Browser::TYPE_PANEL) { + extensions::TabHelper::FromWebContents(tab->web_contents())-> + SetExtensionAppIconById(extension_id); + } } if (contents) { TabStripModel* target_tab_strip = new_window->tab_strip_model(); @@ -1349,14 +1351,15 @@ bool UpdateTabFunction::UpdateURLIfPresent(DictionaryValue* update_props, return false; } - tab_contents_->extension_tab_helper()->script_executor()->ExecuteScript( - extension_id(), - ScriptExecutor::JAVASCRIPT, - url.path(), - ScriptExecutor::TOP_FRAME, - extensions::UserScript::DOCUMENT_IDLE, - ScriptExecutor::MAIN_WORLD, - base::Bind(&UpdateTabFunction::OnExecuteCodeFinished, this)); + extensions::TabHelper::FromWebContents(tab_contents_->web_contents())-> + script_executor()->ExecuteScript( + extension_id(), + ScriptExecutor::JAVASCRIPT, + url.path(), + ScriptExecutor::TOP_FRAME, + extensions::UserScript::DOCUMENT_IDLE, + ScriptExecutor::MAIN_WORLD, + base::Bind(&UpdateTabFunction::OnExecuteCodeFinished, this)); *is_async = true; return true; diff --git a/chrome/browser/extensions/extension_toolbar_model.cc b/chrome/browser/extensions/extension_toolbar_model.cc index 13c5e3f..a7b5b27 100644 --- a/chrome/browser/extensions/extension_toolbar_model.cc +++ b/chrome/browser/extensions/extension_toolbar_model.cc @@ -121,8 +121,8 @@ ExtensionToolbarModel::Action ExtensionToolbarModel::ExecuteBrowserAction( if (!browser_action->GetIsVisible(tab_id)) return ACTION_NONE; - tab_contents->extension_tab_helper()->active_tab_permission_manager()-> - GrantIfRequested(extension); + extensions::TabHelper::FromWebContents(tab_contents->web_contents())-> + active_tab_permission_manager()->GrantIfRequested(extension); if (browser_action->HasPopup(tab_id)) { if (popup_url_out) diff --git a/chrome/browser/extensions/menu_manager.cc b/chrome/browser/extensions/menu_manager.cc index e8d3689..bd2e0eb 100644 --- a/chrome/browser/extensions/menu_manager.cc +++ b/chrome/browser/extensions/menu_manager.cc @@ -642,7 +642,7 @@ void MenuManager::ExecuteCommand(Profile* profile, // Add the tab info to the argument list. // No tab info in a platform app. if (!extension || !extension->is_platform_app()) { - // Note: web_contents only NULL in unit tests :( + // Note: web_contents are NULL in unit tests :( if (web_contents) args->Append(ExtensionTabUtil::CreateTabValue(web_contents, extension)); else @@ -666,11 +666,10 @@ void MenuManager::ExecuteCommand(Profile* profile, WriteToStorage(extension); } - TabContents* tab_contents = web_contents ? - TabContents::FromWebContents(web_contents) : NULL; - if (tab_contents && extension) { - tab_contents->extension_tab_helper()->active_tab_permission_manager()-> - GrantIfRequested(extension); + // Note: web_contents are NULL in unit tests :( + if (web_contents && extensions::TabHelper::FromWebContents(web_contents)) { + extensions::TabHelper::FromWebContents(web_contents)-> + active_tab_permission_manager()->GrantIfRequested(extension); } event_router->DispatchEventToExtension( diff --git a/chrome/browser/extensions/page_action_controller.cc b/chrome/browser/extensions/page_action_controller.cc index 0a706c2..e6ba8dc 100644 --- a/chrome/browser/extensions/page_action_controller.cc +++ b/chrome/browser/extensions/page_action_controller.cc @@ -53,9 +53,8 @@ LocationBarController::Action PageActionController::OnClicked( CHECK(page_action); int tab_id = ExtensionTabUtil::GetTabId(web_contents()); - TabContents* tab_contents = TabContents::FromWebContents(web_contents()); - tab_contents->extension_tab_helper()->active_tab_permission_manager()-> - GrantIfRequested(extension); + extensions::TabHelper::FromWebContents(web_contents())-> + active_tab_permission_manager()->GrantIfRequested(extension); switch (mouse_button) { case 1: // left @@ -64,7 +63,7 @@ LocationBarController::Action PageActionController::OnClicked( return ACTION_SHOW_POPUP; GetExtensionService()->browser_event_router()->PageActionExecuted( - tab_contents->profile(), + Profile::FromBrowserContext(web_contents()->GetBrowserContext()), *page_action, tab_id, web_contents()->GetURL().spec(), diff --git a/chrome/browser/extensions/script_badge_controller.cc b/chrome/browser/extensions/script_badge_controller.cc index 5b8cbba..db573ab 100644 --- a/chrome/browser/extensions/script_badge_controller.cc +++ b/chrome/browser/extensions/script_badge_controller.cc @@ -76,10 +76,10 @@ LocationBarController::Action ScriptBadgeController::OnClicked( switch (mouse_button) { case 1: // left case 2: { // middle - TabContents* tab_contents = TabContents::FromWebContents(web_contents()); - tab_contents->extension_tab_helper()->active_tab_permission_manager()-> - GrantIfRequested(extension); + extensions::TabHelper::FromWebContents(web_contents())-> + active_tab_permission_manager()->GrantIfRequested(extension); + TabContents* tab_contents = TabContents::FromWebContents(web_contents()); // Even if clicking the badge doesn't immediately cause the extension to // run script on the page, we want to help users associate clicking with // the extension having permission to modify the page, so we make the icon diff --git a/chrome/browser/extensions/script_badge_controller_unittest.cc b/chrome/browser/extensions/script_badge_controller_unittest.cc index 0ebd81c..760d104 100644 --- a/chrome/browser/extensions/script_badge_controller_unittest.cc +++ b/chrome/browser/extensions/script_badge_controller_unittest.cc @@ -43,7 +43,7 @@ class ScriptBadgeControllerTest : public TabContentsTestHarness { virtual void SetUp() OVERRIDE { // Note that this sets a PageActionController into the - // extension_tab_helper()->location_bar_controller() field. Do + // extensions::TabHelper's location_bar_controller field. Do // not use that for testing. TabContentsTestHarness::SetUp(); diff --git a/chrome/browser/extensions/tab_helper.cc b/chrome/browser/extensions/tab_helper.cc index 52b7656a..bfe97b8 100644 --- a/chrome/browser/extensions/tab_helper.cc +++ b/chrome/browser/extensions/tab_helper.cc @@ -4,8 +4,8 @@ #include "chrome/browser/extensions/tab_helper.h" -#include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/app_notify_channel_ui.h" +#include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/extensions/page_action_controller.h" @@ -15,7 +15,6 @@ #include "chrome/browser/sessions/session_id.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/tab_contents/tab_contents.h" -#include "chrome/browser/ui/tab_contents/tab_contents_iterator.h" #include "chrome/browser/ui/web_applications/web_app_ui.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/common/chrome_notification_types.h" @@ -52,43 +51,41 @@ const char kPermissionError[] = "permission_error"; namespace extensions { -TabHelper::TabHelper(TabContents* tab_contents) - : content::WebContentsObserver(tab_contents->web_contents()), +int TabHelper::kUserDataKey; + +TabHelper::TabHelper(content::WebContents* web_contents) + : content::WebContentsObserver(web_contents), extension_app_(NULL), ALLOW_THIS_IN_INITIALIZER_LIST( - extension_function_dispatcher_(tab_contents->profile(), this)), + extension_function_dispatcher_( + Profile::FromBrowserContext(web_contents->GetBrowserContext()), + this)), pending_web_app_action_(NONE), - tab_contents_(tab_contents), - script_executor_(tab_contents->web_contents()), + script_executor_(web_contents), active_tab_permission_manager_( - tab_contents->web_contents(), - SessionID::IdForTab(tab_contents), - tab_contents->profile()) { + web_contents, + SessionID::IdForTab(TabContents::FromWebContents(web_contents)), + Profile::FromBrowserContext(web_contents->GetBrowserContext())) { if (switch_utils::AreScriptBadgesEnabled()) { - location_bar_controller_.reset(new ScriptBadgeController( - tab_contents->web_contents(), &script_executor_)); + location_bar_controller_.reset( + new ScriptBadgeController(web_contents, &script_executor_)); } else { location_bar_controller_.reset( - new PageActionController(tab_contents->web_contents())); + new PageActionController(web_contents)); } registrar_.Add(this, content::NOTIFICATION_LOAD_STOP, content::Source<NavigationController>( - &tab_contents->web_contents()->GetController())); + &web_contents->GetController())); } TabHelper::~TabHelper() { } -void TabHelper::CopyStateFrom(const TabHelper& source) { - SetExtensionApp(source.extension_app()); - extension_app_icon_ = source.extension_app_icon_; -} - void TabHelper::CreateApplicationShortcuts() { DCHECK(CanCreateApplicationShortcuts()); NavigationEntry* entry = - tab_contents_->web_contents()->GetController().GetLastCommittedEntry(); + web_contents()->GetController().GetLastCommittedEntry(); if (!entry) return; @@ -103,7 +100,7 @@ bool TabHelper::CanCreateApplicationShortcuts() const { #if defined(OS_MACOSX) return false; #else - return web_app::IsValidUrl(tab_contents_->web_contents()->GetURL()) && + return web_app::IsValidUrl(web_contents()->GetURL()) && pending_web_app_action_ == NONE; #endif } @@ -140,9 +137,10 @@ SkBitmap* TabHelper::GetExtensionAppIcon() { } void TabHelper::RenderViewCreated(RenderViewHost* render_view_host) { + TabContents* tab_contents = TabContents::FromWebContents(web_contents()); render_view_host->Send( new ExtensionMsg_SetTabId(render_view_host->GetRoutingID(), - SessionID::IdForTab(tab_contents_))); + SessionID::IdForTab(tab_contents))); } void TabHelper::DidNavigateMainFrame( @@ -157,11 +155,12 @@ void TabHelper::DidNavigateMainFrame( if (!service) return; + TabContents* tab_contents = TabContents::FromWebContents(web_contents()); for (ExtensionSet::const_iterator it = service->extensions()->begin(); it != service->extensions()->end(); ++it) { ExtensionAction* browser_action = (*it)->browser_action(); if (browser_action) { - browser_action->ClearAllValuesForTab(SessionID::IdForTab(tab_contents_)); + browser_action->ClearAllValuesForTab(SessionID::IdForTab(tab_contents)); content::NotificationService::current()->Notify( chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED, content::Source<ExtensionAction>(browser_action), @@ -189,6 +188,18 @@ bool TabHelper::OnMessageReceived(const IPC::Message& message) { return handled; } +void TabHelper::DidCloneToNewWebContents(WebContents* old_web_contents, + WebContents* new_web_contents) { + // When the WebContents that this is attached to is cloned, give the new clone + // a TabHelper and copy state over. + CreateForWebContents(new_web_contents); + TabHelper* new_helper = FromWebContents(new_web_contents); + + new_helper->SetExtensionApp(extension_app()); + new_helper->extension_app_icon_ = extension_app_icon_; +} + + void TabHelper::OnDidGetApplicationInfo(int32 page_id, const WebApplicationInfo& info) { // Android does not implement BrowserWindow. @@ -196,19 +207,20 @@ void TabHelper::OnDidGetApplicationInfo(int32 page_id, web_app_info_ = info; NavigationEntry* entry = - tab_contents_->web_contents()->GetController().GetLastCommittedEntry(); + web_contents()->GetController().GetLastCommittedEntry(); if (!entry || (entry->GetPageID() != page_id)) return; + TabContents* tab_contents = TabContents::FromWebContents(web_contents()); switch (pending_web_app_action_) { case CREATE_SHORTCUT: { chrome::ShowCreateWebAppShortcutsDialog( - tab_contents_->web_contents()->GetView()->GetTopLevelNativeWindow(), - tab_contents_); + web_contents()->GetView()->GetTopLevelNativeWindow(), + tab_contents); break; } case UPDATE_SHORTCUT: { - web_app::UpdateShortcutForTabContents(tab_contents_); + web_app::UpdateShortcutForTabContents(tab_contents); break; } default: @@ -230,10 +242,10 @@ void TabHelper::OnInstallApplication(const WebApplicationInfo& info) { ExtensionInstallPrompt* prompt = NULL; if (extension_service->show_extensions_prompts()) { gfx::NativeWindow parent = - tab_contents_->web_contents()->GetView()->GetTopLevelNativeWindow(); - prompt = new ExtensionInstallPrompt(parent, - tab_contents_->web_contents(), - tab_contents_->profile()); + web_contents()->GetView()->GetTopLevelNativeWindow(); + Profile* profile = + Profile::FromBrowserContext(web_contents()->GetBrowserContext()); + prompt = new ExtensionInstallPrompt(parent, web_contents(), profile); } scoped_refptr<CrxInstaller> installer( CrxInstaller::Create(extension_service, prompt)); @@ -264,8 +276,7 @@ void TabHelper::OnGetAppNotifyChannel(const GURL& requestor_url, Profile::FromBrowserContext(web_contents()->GetBrowserContext()); ExtensionService* extension_service = profile->GetExtensionService(); ProcessMap* process_map = extension_service->process_map(); - content::RenderProcessHost* process = - tab_contents()->web_contents()->GetRenderProcessHost(); + content::RenderProcessHost* process = web_contents()->GetRenderProcessHost(); const Extension* extension = extension_service->GetInstalledApp(requestor_url); @@ -287,8 +298,9 @@ void TabHelper::OnGetAppNotifyChannel(const GURL& requestor_url, return; } + TabContents* tab_contents = TabContents::FromWebContents(web_contents()); AppNotifyChannelUI* ui = AppNotifyChannelUI::Create( - profile, tab_contents(), extension->name(), + profile, tab_contents, extension->name(), AppNotifyChannelUI::NOTIFICATION_INFOBAR); scoped_refptr<AppNotifyChannelSetup> channel_setup( @@ -427,7 +439,7 @@ void TabHelper::Observe(int type, DCHECK(type == content::NOTIFICATION_LOAD_STOP); const NavigationController& controller = *content::Source<NavigationController>(source).ptr(); - DCHECK_EQ(controller.GetWebContents(), tab_contents_->web_contents()); + DCHECK_EQ(controller.GetWebContents(), web_contents()); if (pending_web_app_action_ == UPDATE_SHORTCUT) { // Schedule a shortcut update when web application info is available if diff --git a/chrome/browser/extensions/tab_helper.h b/chrome/browser/extensions/tab_helper.h index 1703122..f988f83 100644 --- a/chrome/browser/extensions/tab_helper.h +++ b/chrome/browser/extensions/tab_helper.h @@ -14,13 +14,13 @@ #include "chrome/browser/extensions/image_loading_tracker.h" #include "chrome/browser/extensions/script_executor.h" #include "chrome/browser/extensions/webstore_inline_installer.h" +#include "chrome/browser/tab_contents/web_contents_user_data.h" #include "chrome/common/web_apps.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "content/public/browser/web_contents_observer.h" #include "third_party/skia/include/core/SkBitmap.h" -class TabContents; struct WebApplicationInfo; namespace content { @@ -40,7 +40,8 @@ class TabHelper : public content::WebContentsObserver, public WebstoreInlineInstaller::Delegate, public AppNotifyChannelSetup::Delegate, public base::SupportsWeakPtr<TabHelper>, - public content::NotificationObserver { + public content::NotificationObserver, + public WebContentsUserData<TabHelper> { public: // Different types of action when web app info is available. // OnDidGetApplicationInfo uses this to dispatch calls. @@ -50,11 +51,9 @@ class TabHelper : public content::WebContentsObserver, UPDATE_SHORTCUT // Update icon for app shortcut. }; - explicit TabHelper(TabContents* tab_contents); + explicit TabHelper(content::WebContents* web_contents); virtual ~TabHelper(); - - // Copies the internal state from another TabHelper. - void CopyStateFrom(const TabHelper& source); + static int kUserDataKey; void CreateApplicationShortcuts(); bool CanCreateApplicationShortcuts() const; @@ -95,10 +94,6 @@ class TabHelper : public content::WebContentsObserver, // Extension::EXTENSION_ICON_SMALLISH). SkBitmap* GetExtensionAppIcon(); - TabContents* tab_contents() { - return tab_contents_; - } - content::WebContents* web_contents() const { return content::WebContentsObserver::web_contents(); } @@ -127,6 +122,9 @@ class TabHelper : public content::WebContentsObserver, const content::LoadCommittedDetails& details, const content::FrameNavigateParams& params) OVERRIDE; virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; + virtual void DidCloneToNewWebContents( + content::WebContents* old_web_contents, + content::WebContents* new_web_contents) OVERRIDE; // ExtensionFunctionDispatcher::Delegate overrides. virtual extensions::WindowController* GetExtensionWindowController() @@ -215,8 +213,6 @@ class TabHelper : public content::WebContentsObserver, content::NotificationRegistrar registrar_; - TabContents* tab_contents_; - ScriptExecutor script_executor_; scoped_ptr<LocationBarController> location_bar_controller_; diff --git a/chrome/browser/sessions/session_service.cc b/chrome/browser/sessions/session_service.cc index aeb341c..2076bfb 100644 --- a/chrome/browser/sessions/session_service.cc +++ b/chrome/browser/sessions/session_service.cc @@ -606,10 +606,12 @@ void SessionService::Observe(int type, return; SetTabWindow(tab->session_tab_helper()->window_id(), tab->session_tab_helper()->session_id()); - if (tab->extension_tab_helper()->extension_app()) { + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(tab->web_contents()); + if (extensions_tab_helper->extension_app()) { SetTabExtensionAppID(tab->session_tab_helper()->window_id(), tab->session_tab_helper()->session_id(), - tab->extension_tab_helper()->extension_app()->id()); + extensions_tab_helper->extension_app()->id()); } // Record the association between the SessionStorageNamespace and the @@ -706,12 +708,16 @@ void SessionService::Observe(int type, case chrome::NOTIFICATION_TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED: { extensions::TabHelper* extension_tab_helper = content::Source<extensions::TabHelper>(source).ptr(); - if (extension_tab_helper->tab_contents()->profile() != profile()) + if (extension_tab_helper->web_contents()->GetBrowserContext() != + profile()) { return; + } if (extension_tab_helper->extension_app()) { - SessionTabHelper* helper = - extension_tab_helper->tab_contents()->session_tab_helper(); - SetTabExtensionAppID(helper->window_id(), helper->session_id(), + TabContents* tab_contents = + TabContents::FromWebContents(extension_tab_helper->web_contents()); + SessionTabHelper* helper = tab_contents->session_tab_helper(); + SetTabExtensionAppID(helper->window_id(), + helper->session_id(), extension_tab_helper->extension_app()->id()); } break; @@ -1304,11 +1310,13 @@ void SessionService::BuildCommandsForTab( commands->push_back(CreatePinnedStateCommand(session_id, true)); } - if (tab->extension_tab_helper()->extension_app()) { + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(tab->web_contents()); + if (extensions_tab_helper->extension_app()) { commands->push_back( CreateSetTabExtensionAppIDCommand( kCommandSetExtensionAppID, session_id.id(), - tab->extension_tab_helper()->extension_app()->id())); + extensions_tab_helper->extension_app()->id())); } const std::string& ua_override = tab->web_contents()->GetUserAgentOverride(); diff --git a/chrome/browser/sessions/tab_restore_service.cc b/chrome/browser/sessions/tab_restore_service.cc index d66cc8c..19f5ada 100644 --- a/chrome/browser/sessions/tab_restore_service.cc +++ b/chrome/browser/sessions/tab_restore_service.cc @@ -542,7 +542,8 @@ void TabRestoreService::PopulateTab(Tab* tab, // tab_contents is NULL in some browser tests. if (tab_contents) { const extensions::Extension* extension = - tab_contents->extension_tab_helper()->extension_app(); + extensions::TabHelper::FromWebContents(controller->GetWebContents())-> + extension_app(); if (extension) tab->extension_app_id = extension->id(); } diff --git a/chrome/browser/sync/glue/session_change_processor.cc b/chrome/browser/sync/glue/session_change_processor.cc index 815220e..2b98f68 100644 --- a/chrome/browser/sync/glue/session_change_processor.cc +++ b/chrome/browser/sync/glue/session_change_processor.cc @@ -181,14 +181,14 @@ void SessionChangeProcessor::Observe( case chrome::NOTIFICATION_TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED: { extensions::TabHelper* extension_tab_helper = content::Source<extensions::TabHelper>(source).ptr(); - if (!extension_tab_helper || - extension_tab_helper->web_contents()->GetBrowserContext() != + if (extension_tab_helper->web_contents()->GetBrowserContext() != profile_) { return; } if (extension_tab_helper->extension_app()) { - modified_tabs.push_back(extension_tab_helper->tab_contents()-> - synced_tab_delegate()); + TabContents* tab_contents = + TabContents::FromWebContents(extension_tab_helper->web_contents()); + modified_tabs.push_back(tab_contents->synced_tab_delegate()); } DVLOG(1) << "Received TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED " << "for profile " << profile_; diff --git a/chrome/browser/tab_contents/web_contents_user_data.h b/chrome/browser/tab_contents/web_contents_user_data.h index 3fe60c2..ba300a9 100644 --- a/chrome/browser/tab_contents/web_contents_user_data.h +++ b/chrome/browser/tab_contents/web_contents_user_data.h @@ -38,6 +38,13 @@ class WebContentsUserData : public base::SupportsUserData::Data { static T* FromWebContents(content::WebContents* contents) { return static_cast<T*>(contents->GetUserData(&T::kUserDataKey)); } + + // Retrieves the instance of type T that was attached to the specified + // WebContents (via CreateForWebContents above) and returns it. If no instance + // of the type was attached, returns NULL. + static const T* FromWebContents(const content::WebContents* contents) { + return static_cast<const T*>(contents->GetUserData(&T::kUserDataKey)); + } }; #endif // CHROME_BROWSER_TAB_CONTENTS_WEB_CONTENTS_USER_DATA_H_ diff --git a/chrome/browser/ui/ash/launcher/browser_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/browser_launcher_item_controller.cc index 3ffda1c..5e3e64c 100644 --- a/chrome/browser/ui/ash/launcher/browser_launcher_item_controller.cc +++ b/chrome/browser/ui/ash/launcher/browser_launcher_item_controller.cc @@ -251,11 +251,11 @@ void BrowserLauncherItemController::UpdateLauncher(TabContents* tab) { new LauncherFaviconLoader(this, tab->web_contents())); } // Update the icon for extension panels. + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(tab->web_contents()); SkBitmap new_image = favicon_loader_->GetFavicon(); - if (new_image.isNull() && - tab->extension_tab_helper()->GetExtensionAppIcon()) { - new_image = *tab->extension_tab_helper()->GetExtensionAppIcon(); - } + if (new_image.isNull() && extensions_tab_helper->GetExtensionAppIcon()) + new_image = *extensions_tab_helper->GetExtensionAppIcon(); // Only update the icon if we have a new image, or none has been set yet. // This avoids flickering to an empty image when a pinned app is opened. if (!new_image.isNull()) diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc index c0f6a9f..d44901a 100644 --- a/chrome/browser/ui/browser_browsertest.cc +++ b/chrome/browser/ui/browser_browsertest.cc @@ -800,7 +800,9 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, TabClosingWhenRemovingExtension) { TabContents* app_contents = chrome::TabContentsFactory( browser()->profile(), NULL, MSG_ROUTING_NONE, NULL); - app_contents->extension_tab_helper()->SetExtensionApp(extension_app); + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(app_contents->web_contents()); + extensions_tab_helper->SetExtensionApp(extension_app); model->AddTabContents(app_contents, 0, content::PageTransitionFromInt(0), TabStripModel::ADD_NONE); @@ -919,7 +921,9 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, RestorePinnedTabs) { ui_test_utils::NavigateToURL(browser(), url); TabContents* app_contents = chrome::TabContentsFactory( browser()->profile(), NULL, MSG_ROUTING_NONE, NULL); - app_contents->extension_tab_helper()->SetExtensionApp(extension_app); + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(app_contents->web_contents()); + extensions_tab_helper->SetExtensionApp(extension_app); model->AddTabContents(app_contents, 0, content::PageTransitionFromInt(0), TabStripModel::ADD_NONE); model->SetTabPinned(0, true); @@ -975,8 +979,9 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, RestorePinnedTabs) { new_model->GetTabContentsAt(2)->web_contents()->GetURL()); EXPECT_TRUE( - new_model->GetTabContentsAt(0)->extension_tab_helper()->extension_app() == - extension_app); + extensions::TabHelper::FromWebContents( + new_model->GetTabContentsAt(0)->web_contents())-> + extension_app() == extension_app); } #endif // !defined(OS_CHROMEOS) @@ -1007,10 +1012,11 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, OpenAppWindowLikeNtp) { NEW_WINDOW)); ASSERT_TRUE(app_window); - // Apps launched in a window from the NTP do not have extension_app set in - // tab contents. - TabContents* tab_contents = TabContents::FromWebContents(app_window); - EXPECT_FALSE(tab_contents->extension_tab_helper()->extension_app()); + // Apps launched in a window from the NTP have an extensions tab helper but + // do not have extension_app set in it. + ASSERT_TRUE(extensions::TabHelper::FromWebContents(app_window)); + EXPECT_FALSE( + extensions::TabHelper::FromWebContents(app_window)->extension_app()); EXPECT_EQ(extension_app->GetFullLaunchURL(), app_window->GetURL()); // The launch should have created a new browser. diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc index 3d88794..4ebcfdd 100644 --- a/chrome/browser/ui/browser_commands.cc +++ b/chrome/browser/ui/browser_commands.cc @@ -972,12 +972,12 @@ bool CanViewSource(const Browser* browser) { void CreateApplicationShortcuts(Browser* browser) { content::RecordAction(UserMetricsAction("CreateShortcut")); - GetActiveTabContents(browser)->extension_tab_helper()-> + extensions::TabHelper::FromWebContents(GetActiveWebContents(browser))-> CreateApplicationShortcuts(); } bool CanCreateApplicationShortcuts(const Browser* browser) { - return GetActiveTabContents(browser)->extension_tab_helper()-> + return extensions::TabHelper::FromWebContents(GetActiveWebContents(browser))-> CanCreateApplicationShortcuts(); } diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc index 6049b93..efaadee 100644 --- a/chrome/browser/ui/browser_navigator.cc +++ b/chrome/browser/ui/browser_navigator.cc @@ -132,11 +132,14 @@ Browser* GetBrowserForDisposition(chrome::NavigateParams* params) { params->extension_app_id); } else if (!params->browser->app_name().empty()) { app_name = params->browser->app_name(); - } else if (params->source_contents && - params->source_contents->extension_tab_helper()->is_app()) { - app_name = web_app::GenerateApplicationNameFromExtensionId( - params->source_contents->extension_tab_helper()-> - extension_app()->id()); + } else if (params->source_contents) { + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents( + params->source_contents->web_contents()); + if (extensions_tab_helper->is_app()) { + app_name = web_app::GenerateApplicationNameFromExtensionId( + extensions_tab_helper->extension_app()->id()); + } } if (app_name.empty()) { Browser::CreateParams browser_params(Browser::TYPE_POPUP, profile); @@ -494,8 +497,9 @@ void Navigate(NavigateParams* params) { // This function takes ownership of |params->target_contents| until it // is added to a TabStripModel. target_contents_owner.TakeOwnership(); - params->target_contents->extension_tab_helper()-> - SetExtensionAppById(params->extension_app_id); + extensions::TabHelper::FromWebContents( + params->target_contents->web_contents())-> + SetExtensionAppById(params->extension_app_id); // TODO(sky): figure out why this is needed. Without it we seem to get // failures in startup tests. // By default, content believes it is not hidden. When adding contents diff --git a/chrome/browser/ui/browser_tabrestore.cc b/chrome/browser/ui/browser_tabrestore.cc index 566cb86..4443305 100644 --- a/chrome/browser/ui/browser_tabrestore.cc +++ b/chrome/browser/ui/browser_tabrestore.cc @@ -57,7 +57,8 @@ content::WebContents* AddRestoredTab( chrome::GetActiveWebContents(browser), session_storage_namespace_map); WebContents* new_tab = tab_contents->web_contents(); - tab_contents->extension_tab_helper()->SetExtensionAppById(extension_app_id); + extensions::TabHelper::FromWebContents(new_tab)-> + SetExtensionAppById(extension_app_id); std::vector<NavigationEntry*> entries; TabNavigation::CreateNavigationEntriesFromTabNavigations( browser->profile(), navigations, &entries); @@ -118,8 +119,9 @@ void ReplaceRestoredTab( MSG_ROUTING_NONE, GetActiveWebContents(browser), session_storage_namespace_map); - tab_contents->extension_tab_helper()->SetExtensionAppById(extension_app_id); WebContents* replacement = tab_contents->web_contents(); + extensions::TabHelper::FromWebContents(replacement)-> + SetExtensionAppById(extension_app_id); replacement->SetUserAgentOverride(user_agent_override); std::vector<NavigationEntry*> entries; TabNavigation::CreateNavigationEntriesFromTabNavigations( diff --git a/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm b/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm index 92309f5..bfa7929 100644 --- a/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm +++ b/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm @@ -624,8 +624,8 @@ void LocationBarViewMac::RefreshPageActionDecorations() { } std::vector<ExtensionAction*> new_page_actions = - tab_contents->extension_tab_helper()->location_bar_controller()-> - GetCurrentActions(); + extensions::TabHelper::FromWebContents(tab_contents->web_contents())-> + location_bar_controller()->GetCurrentActions(); if (new_page_actions != page_actions_) { page_actions_.swap(new_page_actions); diff --git a/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm b/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm index 689687d..7f86cde 100644 --- a/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm +++ b/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm @@ -113,7 +113,8 @@ bool PageActionDecoration::ActivatePageAction(NSRect frame) { } LocationBarController* controller = - tab_contents->extension_tab_helper()->location_bar_controller(); + extensions::TabHelper::FromWebContents(tab_contents->web_contents())-> + location_bar_controller(); // 1 is left click. switch (controller->OnClicked(page_action_->extension_id(), 1)) { diff --git a/chrome/browser/ui/cocoa/tabpose_window.mm b/chrome/browser/ui/cocoa/tabpose_window.mm index 056519a..7bd20f1 100644 --- a/chrome/browser/ui/cocoa/tabpose_window.mm +++ b/chrome/browser/ui/cocoa/tabpose_window.mm @@ -457,8 +457,10 @@ NSRect Tile::GetFaviconStartRectRelativeTo(const Tile& tile) const { } NSImage* Tile::favicon() const { - if (contents_->extension_tab_helper()->is_app()) { - SkBitmap* bitmap = contents_->extension_tab_helper()->GetExtensionAppIcon(); + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(contents_->web_contents()); + if (extensions_tab_helper->is_app()) { + SkBitmap* bitmap = extensions_tab_helper->GetExtensionAppIcon(); if (bitmap) return gfx::SkBitmapToNSImage(*bitmap); } diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm index 2c1c908..b41d4c6 100644 --- a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm +++ b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm @@ -1418,13 +1418,15 @@ private: // A helper routine for creating an NSImageView to hold the favicon or app icon // for |contents|. - (NSImageView*)iconImageViewForContents:(TabContents*)contents { - BOOL isApp = contents->extension_tab_helper()->is_app(); + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(contents->web_contents()); + BOOL isApp = extensions_tab_helper->is_app(); NSImage* image = nil; // Favicons come from the renderer, and the renderer draws everything in the // system color space. CGColorSpaceRef colorSpace = base::mac::GetSystemColorSpace(); if (isApp) { - SkBitmap* icon = contents->extension_tab_helper()->GetExtensionAppIcon(); + SkBitmap* icon = extensions_tab_helper->GetExtensionAppIcon(); if (icon) image = gfx::SkBitmapToNSImageWithColorSpace(*icon, colorSpace); } else { diff --git a/chrome/browser/ui/extensions/application_launch.cc b/chrome/browser/ui/extensions/application_launch.cc index 9af96e0..0e1e4e9 100644 --- a/chrome/browser/ui/extensions/application_launch.cc +++ b/chrome/browser/ui/extensions/application_launch.cc @@ -282,14 +282,13 @@ WebContents* OpenAppShortcutWindow(Profile* profile, if (!tab) return NULL; - TabContents* tab_contents = TabContents::FromWebContents(tab); // Set UPDATE_SHORTCUT as the pending web app action. This action is picked // up in LoadingStateChanged to schedule a GetApplicationInfo. And when // the web app info is available, extensions::TabHelper notifies Browser via // OnDidGetApplicationInfo, which calls // web_app::UpdateShortcutForTabContents when it sees UPDATE_SHORTCUT as // pending web app action. - tab_contents->extension_tab_helper()->set_pending_web_app_action( + extensions::TabHelper::FromWebContents(tab)->set_pending_web_app_action( extensions::TabHelper::UPDATE_SHORTCUT); return tab; diff --git a/chrome/browser/ui/gtk/location_bar_view_gtk.cc b/chrome/browser/ui/gtk/location_bar_view_gtk.cc index bb99898..24b7f33 100644 --- a/chrome/browser/ui/gtk/location_bar_view_gtk.cc +++ b/chrome/browser/ui/gtk/location_bar_view_gtk.cc @@ -955,10 +955,11 @@ void LocationBarViewGtk::UpdateContentSettingsIcons() { void LocationBarViewGtk::UpdatePageActions() { std::vector<ExtensionAction*> new_page_actions; - TabContents* tab_contents = GetTabContents(); - if (tab_contents) { + WebContents* contents = GetWebContents(); + if (contents) { LocationBarController* location_bar_controller = - tab_contents->extension_tab_helper()->location_bar_controller(); + extensions::TabHelper::FromWebContents(contents)-> + location_bar_controller(); new_page_actions = location_bar_controller->GetCurrentActions(); } @@ -980,7 +981,6 @@ void LocationBarViewGtk::UpdatePageActions() { content::NotificationService::NoDetails()); } - WebContents* contents = GetWebContents(); if (!page_action_views_.empty() && contents) { GURL url = chrome::GetActiveWebContents(browser())->GetURL(); @@ -2031,7 +2031,8 @@ gboolean LocationBarViewGtk::PageActionViewGtk::OnButtonPressed( return TRUE; LocationBarController* controller = - tab_contents->extension_tab_helper()->location_bar_controller(); + extensions::TabHelper::FromWebContents(tab_contents->web_contents())-> + location_bar_controller(); switch (controller->OnClicked(extension->id(), event->button)) { case LocationBarController::ACTION_NONE: diff --git a/chrome/browser/ui/gtk/tabs/dragged_view_gtk.cc b/chrome/browser/ui/gtk/tabs/dragged_view_gtk.cc index dc69869..5a31b22 100644 --- a/chrome/browser/ui/gtk/tabs/dragged_view_gtk.cc +++ b/chrome/browser/ui/gtk/tabs/dragged_view_gtk.cc @@ -71,11 +71,10 @@ DraggedViewGtk::DraggedViewGtk(DragData* drag_data, } for (size_t i = 0; i < drag_data_->size(); i++) { - TabContents* tab_contents = TabContents::FromWebContents( - drag_data_->get(i)->contents_->web_contents()); + WebContents* web_contents = drag_data_->get(i)->contents_->web_contents(); renderers_[i]->UpdateData( - drag_data_->get(i)->contents_->web_contents(), - tab_contents->extension_tab_helper()->is_app(), + web_contents, + extensions::TabHelper::FromWebContents(web_contents)->is_app(), false); // loading_only renderers_[i]->set_is_active( static_cast<int>(i) == drag_data_->source_tab_index()); diff --git a/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.cc b/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.cc index 7b9dcbd..0b201ae 100644 --- a/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.cc +++ b/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.cc @@ -333,7 +333,7 @@ void TabRendererGtk::UpdateData(WebContents* contents, data_.crashed = contents->IsCrashed(); SkBitmap* app_icon = - tab_contents->extension_tab_helper()->GetExtensionAppIcon(); + extensions::TabHelper::FromWebContents(contents)->GetExtensionAppIcon(); if (app_icon) { data_.favicon = *app_icon; } else { diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc index 59474bf..400c5b2 100644 --- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc +++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc @@ -37,14 +37,15 @@ Profile* TabContentsSyncedTabDelegate::profile() const { } bool TabContentsSyncedTabDelegate::HasExtensionAppId() const { - return (tab_contents_->extension_tab_helper() && - tab_contents_->extension_tab_helper()->extension_app()); + return !!(extensions::TabHelper::FromWebContents( + tab_contents_->web_contents())->extension_app()); } const std::string& TabContentsSyncedTabDelegate::GetExtensionAppId() const { DCHECK(HasExtensionAppId()); - return tab_contents_->extension_tab_helper()->extension_app()->id(); + return extensions::TabHelper::FromWebContents(tab_contents_->web_contents())-> + extension_app()->id(); } int TabContentsSyncedTabDelegate::GetCurrentEntryIndex() const { diff --git a/chrome/browser/ui/tab_contents/tab_contents.cc b/chrome/browser/ui/tab_contents/tab_contents.cc index 539eba3..f74d387 100644 --- a/chrome/browser/ui/tab_contents/tab_contents.cc +++ b/chrome/browser/ui/tab_contents/tab_contents.cc @@ -134,7 +134,7 @@ TabContents::TabContents(WebContents* contents) #endif constrained_window_tab_helper_.reset(new ConstrainedWindowTabHelper(this)); core_tab_helper_.reset(new CoreTabHelper(contents)); - extension_tab_helper_.reset(new extensions::TabHelper(this)); + extensions::TabHelper::CreateForWebContents(contents); favicon_tab_helper_.reset(new FaviconTabHelper(contents)); find_tab_helper_.reset(new FindTabHelper(contents)); history_tab_helper_.reset(new HistoryTabHelper(contents)); @@ -218,13 +218,7 @@ TabContents::~TabContents() { TabContents* TabContents::Clone() { WebContents* new_web_contents = web_contents()->Clone(); - TabContents* new_tab_contents = new TabContents(new_web_contents); - - // TODO(avi): Can we generalize this so that knowledge of the functionings of - // the tab helpers isn't required here? - new_tab_contents->extension_tab_helper()->CopyStateFrom( - *extension_tab_helper_.get()); - return new_tab_contents; + return new TabContents(new_web_contents); } // static diff --git a/chrome/browser/ui/tab_contents/tab_contents.h b/chrome/browser/ui/tab_contents/tab_contents.h index 4c5b5a0..2cf02d1 100644 --- a/chrome/browser/ui/tab_contents/tab_contents.h +++ b/chrome/browser/ui/tab_contents/tab_contents.h @@ -106,7 +106,6 @@ class WebUILoginView; } namespace extensions { -class TabHelper; class WebAuthFlow; class WebNavigationTabObserver; } @@ -239,14 +238,6 @@ class TabContents : public content::WebContentsObserver { CoreTabHelper* core_tab_helper() { return core_tab_helper_.get(); } - extensions::TabHelper* extension_tab_helper() { - return extension_tab_helper_.get(); - } - - const extensions::TabHelper* extension_tab_helper() const { - return extension_tab_helper_.get(); - } - FaviconTabHelper* favicon_tab_helper() { return favicon_tab_helper_.get(); } FindTabHelper* find_tab_helper() { return find_tab_helper_.get(); } HistoryTabHelper* history_tab_helper() { return history_tab_helper_.get(); } @@ -355,7 +346,6 @@ class TabContents : public content::WebContentsObserver { #endif scoped_ptr<ConstrainedWindowTabHelper> constrained_window_tab_helper_; scoped_ptr<CoreTabHelper> core_tab_helper_; - scoped_ptr<extensions::TabHelper> extension_tab_helper_; scoped_ptr<FaviconTabHelper> favicon_tab_helper_; scoped_ptr<FindTabHelper> find_tab_helper_; scoped_ptr<HistoryTabHelper> history_tab_helper_; diff --git a/chrome/browser/ui/tabs/pinned_tab_codec.cc b/chrome/browser/ui/tabs/pinned_tab_codec.cc index 3ff361dc..45895213 100644 --- a/chrome/browser/ui/tabs/pinned_tab_codec.cc +++ b/chrome/browser/ui/tabs/pinned_tab_codec.cc @@ -52,22 +52,22 @@ static void EncodePinnedTab(TabStripModel* model, ListValue* values) { scoped_ptr<DictionaryValue> value(new DictionaryValue()); - TabContents* tab_contents = model->GetTabContentsAt(index); + content::WebContents* web_contents = + model->GetTabContentsAt(index)->web_contents(); if (model->IsAppTab(index)) { const extensions::Extension* extension = - tab_contents->extension_tab_helper()->extension_app(); + extensions::TabHelper::FromWebContents(web_contents)->extension_app(); DCHECK(extension); value->SetString(kAppID, extension->id()); - // For apps we use the launch url. We do this for the following reason: - // . the user is effectively restarting the app, so that returning them to - // the app's launch page seems closest to what they expect. + // For apps we use the launch url. We do this because the user is + // effectively restarting the app, so returning them to the app's launch + // page seems closest to what they expect. value->SetString(kURL, extension->GetFullLaunchURL().spec()); values->Append(value.release()); } else { - NavigationEntry* entry = - tab_contents->web_contents()->GetController().GetActiveEntry(); - if (!entry && tab_contents->web_contents()->GetController().GetEntryCount()) - entry = tab_contents->web_contents()->GetController().GetEntryAtIndex(0); + NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); + if (!entry && web_contents->GetController().GetEntryCount()) + entry = web_contents->GetController().GetEntryAtIndex(0); if (entry) { value->SetString(kURL, entry->GetURL().spec()); values->Append(value.release()); diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc index 3885ee8..c622f87 100644 --- a/chrome/browser/ui/tabs/tab_strip_model.cc +++ b/chrome/browser/ui/tabs/tab_strip_model.cc @@ -120,8 +120,9 @@ void TabStripModel::InsertTabContentsAt(int index, int add_types) { bool active = add_types & ADD_ACTIVE; // Force app tabs to be pinned. - bool pin = - contents->extension_tab_helper()->is_app() || add_types & ADD_PINNED; + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(contents->web_contents()); + bool pin = extensions_tab_helper->is_app() || add_types & ADD_PINNED; index = ConstrainInsertionIndex(index, pin); // In tab dragging situations, if the last tab in the window was detached @@ -565,8 +566,8 @@ bool TabStripModel::IsMiniTab(int index) const { } bool TabStripModel::IsAppTab(int index) const { - TabContents* contents = GetTabContentsAt(index); - return contents && contents->extension_tab_helper()->is_app(); + WebContents* contents = GetTabContentsAt(index)->web_contents(); + return contents && extensions::TabHelper::FromWebContents(contents)->is_app(); } bool TabStripModel::IsTabBlocked(int index) const { @@ -999,7 +1000,8 @@ void TabStripModel::Observe(int type, // Iterate backwards as we may remove items while iterating. for (int i = count() - 1; i >= 0; i--) { TabContents* contents = GetTabContentsAt(i); - if (contents->extension_tab_helper()->extension_app() == extension) { + if (extensions::TabHelper::FromWebContents(contents->web_contents())-> + extension_app() == extension) { // The extension an app tab was created from has been nuked. Delete // the WebContents. Deleting a WebContents results in a notification // of type NOTIFICATION_WEB_CONTENTS_DESTROYED; we do the necessary diff --git a/chrome/browser/ui/tabs/tab_strip_model_unittest.cc b/chrome/browser/ui/tabs/tab_strip_model_unittest.cc index e5e9b83..17b1b1d 100644 --- a/chrome/browser/ui/tabs/tab_strip_model_unittest.cc +++ b/chrome/browser/ui/tabs/tab_strip_model_unittest.cc @@ -1832,9 +1832,11 @@ TEST_F(TabStripModelTest, Apps) { &error)); extension_app->launch_web_url_ = "http://www.google.com"; TabContents* contents1 = CreateTabContents(); - contents1->extension_tab_helper()->SetExtensionApp(extension_app); + extensions::TabHelper::FromWebContents(contents1->web_contents())-> + SetExtensionApp(extension_app); TabContents* contents2 = CreateTabContents(); - contents2->extension_tab_helper()->SetExtensionApp(extension_app); + extensions::TabHelper::FromWebContents(contents2->web_contents())-> + SetExtensionApp(extension_app); TabContents* contents3 = CreateTabContents(); SetID(contents1->web_contents(), 1); diff --git a/chrome/browser/ui/views/create_application_shortcut_view.cc b/chrome/browser/ui/views/create_application_shortcut_view.cc index 8c2b8d6..1642c5e 100644 --- a/chrome/browser/ui/views/create_application_shortcut_view.cc +++ b/chrome/browser/ui/views/create_application_shortcut_view.cc @@ -422,7 +422,8 @@ CreateUrlApplicationShortcutView::CreateUrlApplicationShortcutView( web_app::GetShortcutInfoForTab(tab_contents_, &shortcut_info_); const WebApplicationInfo& app_info = - tab_contents_->extension_tab_helper()->web_app_info(); + extensions::TabHelper::FromWebContents(tab_contents_->web_contents())-> + web_app_info(); if (!app_info.icons.empty()) { web_app::GetIconsInfo(app_info, &unprocessed_icons_); FetchIcon(); @@ -440,9 +441,10 @@ bool CreateUrlApplicationShortcutView::Accept() { if (!CreateApplicationShortcutView::Accept()) return false; - tab_contents_->extension_tab_helper()->SetAppIcon( - shortcut_info_.favicon.IsEmpty() ? SkBitmap() : - *shortcut_info_.favicon.ToSkBitmap()); + extensions::TabHelper::FromWebContents(tab_contents_->web_contents())-> + SetAppIcon(shortcut_info_.favicon.IsEmpty() + ? SkBitmap() + : *shortcut_info_.favicon.ToSkBitmap()); Browser* browser = browser::FindBrowserWithWebContents(tab_contents_->web_contents()); if (browser) diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index b10999d..4a09035 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc @@ -1535,9 +1535,11 @@ bool BrowserView::ShouldShowWindowTitle() const { gfx::ImageSkia BrowserView::GetWindowAppIcon() { if (browser_->is_app()) { - TabContents* contents = chrome::GetActiveTabContents(browser_.get()); - if (contents && contents->extension_tab_helper()->GetExtensionAppIcon()) - return *contents->extension_tab_helper()->GetExtensionAppIcon(); + WebContents* contents = chrome::GetActiveWebContents(browser_.get()); + extensions::TabHelper* extensions_tab_helper = + contents ? extensions::TabHelper::FromWebContents(contents) : NULL; + if (extensions_tab_helper && extensions_tab_helper->GetExtensionAppIcon()) + return *extensions_tab_helper->GetExtensionAppIcon(); } return GetWindowIcon(); diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc index 0422245..b38697c 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc @@ -1149,10 +1149,12 @@ void LocationBarView::RefreshPageActionViews() { std::vector<ExtensionAction*> new_page_actions; - TabContents* tab_contents = GetTabContents(); - if (tab_contents) { + WebContents* contents = GetWebContentsFromDelegate(delegate_); + if (contents) { + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(contents); extensions::LocationBarController* controller = - tab_contents->extension_tab_helper()->location_bar_controller(); + extensions_tab_helper->location_bar_controller(); new_page_actions = controller->GetCurrentActions(); } @@ -1178,7 +1180,6 @@ void LocationBarView::RefreshPageActionViews() { } } - WebContents* contents = GetWebContentsFromDelegate(delegate_); if (!page_action_views_.empty() && contents) { Browser* browser = browser::FindBrowserWithWebContents(contents); GURL url = chrome::GetActiveWebContents(browser)->GetURL(); diff --git a/chrome/browser/ui/views/location_bar/page_action_image_view.cc b/chrome/browser/ui/views/location_bar/page_action_image_view.cc index 3b5278f..3e5fdbb 100644 --- a/chrome/browser/ui/views/location_bar/page_action_image_view.cc +++ b/chrome/browser/ui/views/location_bar/page_action_image_view.cc @@ -131,8 +131,10 @@ void PageActionImageView::ExecuteAction(int button) { if (!tab_contents) return; + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(tab_contents->web_contents()); LocationBarController* controller = - tab_contents->extension_tab_helper()->location_bar_controller(); + extensions_tab_helper->location_bar_controller(); // 1 is left click. switch (controller->OnClicked(page_action_->extension_id(), 1)) { diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc index 7a82d373..d51d48a 100644 --- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc +++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc @@ -526,7 +526,7 @@ void BrowserTabStripController::SetTabRendererDataFromModel( data->show_icon = tab_contents->favicon_tab_helper()->ShouldDisplayFavicon(); data->mini = model_->IsMiniTab(model_index); data->blocked = model_->IsTabBlocked(model_index); - data->app = tab_contents->extension_tab_helper()->is_app(); + data->app = extensions::TabHelper::FromWebContents(contents)->is_app(); data->mode = browser_->search_model()->mode().mode; // Get current gradient background animation to paint. data->gradient_background_opacity = browser_->search_delegate()-> diff --git a/chrome/browser/ui/web_applications/web_app_ui.cc b/chrome/browser/ui/web_applications/web_app_ui.cc index 85285d3..a3ce59e 100644 --- a/chrome/browser/ui/web_applications/web_app_ui.cc +++ b/chrome/browser/ui/web_applications/web_app_ui.cc @@ -98,8 +98,10 @@ class UpdateShortcutWorker : public content::NotificationObserver { UpdateShortcutWorker::UpdateShortcutWorker(TabContents* tab_contents) : tab_contents_(tab_contents), profile_path_(tab_contents->profile()->GetPath()) { + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(tab_contents->web_contents()); web_app::GetShortcutInfoForTab(tab_contents_, &shortcut_info_); - web_app::GetIconsInfo(tab_contents_->extension_tab_helper()->web_app_info(), + web_app::GetIconsInfo(extensions_tab_helper->web_app_info(), &unprocessed_icons_); file_name_ = web_app::internals::GetSanitizedFileName(shortcut_info_.title); @@ -164,7 +166,9 @@ void UpdateShortcutWorker::OnIconDownloaded(int download_id, if (!errored && !image.isNull()) { // Update icon with download image and update shortcut. shortcut_info_.favicon = gfx::Image(image); - tab_contents_->extension_tab_helper()->SetAppIcon(image); + extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(tab_contents_->web_contents()); + extensions_tab_helper->SetAppIcon(image); UpdateShortcuts(); } else { // Try the next icon otherwise. @@ -303,8 +307,9 @@ void GetShortcutInfoForTab(TabContents* tab_contents, DCHECK(info); // Must provide a valid info. const WebContents* web_contents = tab_contents->web_contents(); - const WebApplicationInfo& app_info = - tab_contents->extension_tab_helper()->web_app_info(); + const extensions::TabHelper* extensions_tab_helper = + extensions::TabHelper::FromWebContents(web_contents); + const WebApplicationInfo& app_info = extensions_tab_helper->web_app_info(); info->url = app_info.app_url.is_empty() ? web_contents->GetURL() : app_info.app_url; |