summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authoravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-10 16:16:40 +0000
committeravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-10 16:16:40 +0000
commit9567f9cc4114c1f004aa57a5cb166f07e9c86693 (patch)
tree7473450b0322cf354b21ef8061f426efaceaeb87 /chrome
parentbed56af283f2f3426cb6c9549518393032cebd84 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/extensions/active_tab_unittest.cc4
-rw-r--r--chrome/browser/extensions/api/extension_action/extension_actions_api.cc5
-rw-r--r--chrome/browser/extensions/api/extension_action/extension_page_actions_api.cc3
-rw-r--r--chrome/browser/extensions/api/extension_action/script_badge_apitest.cc5
-rw-r--r--chrome/browser/extensions/api/omnibox/omnibox_api.cc4
-rw-r--r--chrome/browser/extensions/api/tabs/execute_code_in_tab_function.cc17
-rw-r--r--chrome/browser/extensions/api/tabs/tabs.cc23
-rw-r--r--chrome/browser/extensions/extension_toolbar_model.cc4
-rw-r--r--chrome/browser/extensions/menu_manager.cc11
-rw-r--r--chrome/browser/extensions/page_action_controller.cc7
-rw-r--r--chrome/browser/extensions/script_badge_controller.cc6
-rw-r--r--chrome/browser/extensions/script_badge_controller_unittest.cc2
-rw-r--r--chrome/browser/extensions/tab_helper.cc82
-rw-r--r--chrome/browser/extensions/tab_helper.h20
-rw-r--r--chrome/browser/sessions/session_service.cc24
-rw-r--r--chrome/browser/sessions/tab_restore_service.cc3
-rw-r--r--chrome/browser/sync/glue/session_change_processor.cc8
-rw-r--r--chrome/browser/tab_contents/web_contents_user_data.h7
-rw-r--r--chrome/browser/ui/ash/launcher/browser_launcher_item_controller.cc8
-rw-r--r--chrome/browser/ui/browser_browsertest.cc22
-rw-r--r--chrome/browser/ui/browser_commands.cc4
-rw-r--r--chrome/browser/ui/browser_navigator.cc18
-rw-r--r--chrome/browser/ui/browser_tabrestore.cc6
-rw-r--r--chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.mm4
-rw-r--r--chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm3
-rw-r--r--chrome/browser/ui/cocoa/tabpose_window.mm6
-rw-r--r--chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm6
-rw-r--r--chrome/browser/ui/extensions/application_launch.cc3
-rw-r--r--chrome/browser/ui/gtk/location_bar_view_gtk.cc11
-rw-r--r--chrome/browser/ui/gtk/tabs/dragged_view_gtk.cc7
-rw-r--r--chrome/browser/ui/gtk/tabs/tab_renderer_gtk.cc2
-rw-r--r--chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc7
-rw-r--r--chrome/browser/ui/tab_contents/tab_contents.cc10
-rw-r--r--chrome/browser/ui/tab_contents/tab_contents.h10
-rw-r--r--chrome/browser/ui/tabs/pinned_tab_codec.cc18
-rw-r--r--chrome/browser/ui/tabs/tab_strip_model.cc12
-rw-r--r--chrome/browser/ui/tabs/tab_strip_model_unittest.cc6
-rw-r--r--chrome/browser/ui/views/create_application_shortcut_view.cc10
-rw-r--r--chrome/browser/ui/views/frame/browser_view.cc8
-rw-r--r--chrome/browser/ui/views/location_bar/location_bar_view.cc9
-rw-r--r--chrome/browser/ui/views/location_bar/page_action_image_view.cc4
-rw-r--r--chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc2
-rw-r--r--chrome/browser/ui/web_applications/web_app_ui.cc13
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;