summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-04 15:49:08 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-04 15:49:08 +0000
commit36fb2c7c17069ad7b6d767e4c40b8ee29b762cf8 (patch)
tree2e87bed9b96d30210008b64fde9e90fe7d6a399d /chrome/browser
parent2bd51de1a5ffc4514a11c3f18c7e2e5f1b92d728 (diff)
downloadchromium_src-36fb2c7c17069ad7b6d767e4c40b8ee29b762cf8.zip
chromium_src-36fb2c7c17069ad7b6d767e4c40b8ee29b762cf8.tar.gz
chromium_src-36fb2c7c17069ad7b6d767e4c40b8ee29b762cf8.tar.bz2
Get rid of extensions dependency from content\browser.
BUG=76789 Review URL: http://codereview.chromium.org/6693054 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80315 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/browser_browsertest.cc11
-rw-r--r--chrome/browser/chrome_content_browser_client.cc19
-rw-r--r--chrome/browser/chrome_content_browser_client.h1
-rw-r--r--chrome/browser/extensions/extension_host.cc9
-rw-r--r--chrome/browser/extensions/extension_host.h1
-rw-r--r--chrome/browser/extensions/extension_page_actions_module.cc19
-rw-r--r--chrome/browser/extensions/extension_page_actions_module.h4
-rw-r--r--chrome/browser/extensions/extension_startup_browsertest.cc2
-rw-r--r--chrome/browser/extensions/extension_tab_helper.cc144
-rw-r--r--chrome/browser/extensions/extension_tab_helper.h93
-rw-r--r--chrome/browser/sessions/session_service.cc29
-rw-r--r--chrome/browser/sessions/tab_restore_service.cc15
-rw-r--r--chrome/browser/sync/glue/session_change_processor.cc11
-rw-r--r--chrome/browser/sync/glue/session_model_associator.cc11
-rw-r--r--chrome/browser/tab_contents/background_contents.cc20
-rw-r--r--chrome/browser/tab_contents/background_contents.h3
-rw-r--r--chrome/browser/tabs/pinned_tab_codec.cc4
-rw-r--r--chrome/browser/tabs/tab_strip_model.cc8
-rw-r--r--chrome/browser/tabs/tab_strip_model.h4
-rw-r--r--chrome/browser/tabs/tab_strip_model_unittest.cc5
-rw-r--r--chrome/browser/ui/browser.cc5
-rw-r--r--chrome/browser/ui/browser_navigator.cc7
-rw-r--r--chrome/browser/ui/cocoa/extensions/extension_infobar_controller.mm1
-rw-r--r--chrome/browser/ui/cocoa/tabpose_window.mm5
-rw-r--r--chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm7
-rw-r--r--chrome/browser/ui/gtk/tabs/dragged_tab_gtk.cc6
-rw-r--r--chrome/browser/ui/gtk/tabs/tab_renderer_gtk.cc5
-rw-r--r--chrome/browser/ui/tab_contents/tab_contents_wrapper.cc5
-rw-r--r--chrome/browser/ui/tab_contents/tab_contents_wrapper.h17
-rw-r--r--chrome/browser/ui/tab_contents/test_tab_contents_wrapper.cc1
-rw-r--r--chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc7
31 files changed, 412 insertions, 67 deletions
diff --git a/chrome/browser/browser_browsertest.cc b/chrome/browser/browser_browsertest.cc
index eef69ef..4b1c38c 100644
--- a/chrome/browser/browser_browsertest.cc
+++ b/chrome/browser/browser_browsertest.cc
@@ -12,6 +12,7 @@
#include "chrome/browser/defaults.h"
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tabs/pinned_tab_codec.h"
#include "chrome/browser/tabs/tab_strip_model.h"
@@ -490,7 +491,7 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, TabClosingWhenRemovingExtension) {
TabContentsWrapper* app_contents =
Browser::TabContentsFactory(browser()->profile(), NULL,
MSG_ROUTING_NONE, NULL, NULL);
- app_contents->tab_contents()->SetExtensionApp(extension_app);
+ app_contents->extension_tab_helper()->SetExtensionApp(extension_app);
model->AddTabContents(app_contents, 0, 0, TabStripModel::ADD_NONE);
model->SetTabPinned(0, true);
@@ -611,7 +612,7 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, RestorePinnedTabs) {
TabContentsWrapper* app_contents =
Browser::TabContentsFactory(browser()->profile(), NULL,
MSG_ROUTING_NONE, NULL, NULL);
- app_contents->tab_contents()->SetExtensionApp(extension_app);
+ app_contents->extension_tab_helper()->SetExtensionApp(extension_app);
model->AddTabContents(app_contents, 0, 0, TabStripModel::ADD_NONE);
model->SetTabPinned(0, true);
ui_test_utils::NavigateToURL(browser(), url);
@@ -664,7 +665,7 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, RestorePinnedTabs) {
new_model->GetTabContentsAt(2)->tab_contents()->GetURL());
EXPECT_TRUE(
- new_model->GetTabContentsAt(0)->tab_contents()->extension_app() ==
+ new_model->GetTabContentsAt(0)->extension_tab_helper()->extension_app() ==
extension_app);
}
#endif // !defined(OS_CHROMEOS)
@@ -696,7 +697,9 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, OpenAppWindowLikeNtp) {
// Apps launched in a window from the NTP do not have extension_app set in
// tab contents.
- EXPECT_FALSE(app_window->extension_app());
+ TabContentsWrapper* wrapper =
+ TabContentsWrapper::GetCurrentWrapperForContents(app_window);
+ EXPECT_FALSE(wrapper->extension_tab_helper()->extension_app());
EXPECT_EQ(extension_app->GetFullLaunchURL(), app_window->GetURL());
// The launch should have created a new browser.
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 58a63a5..00ac1c9 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -32,4 +32,23 @@ content::WebUIFactory* ChromeContentBrowserClient::GetWebUIFactory() {
return ChromeWebUIFactory::GetInstance();
}
+GURL ChromeContentBrowserClient::GetEffectiveURL(Profile* profile,
+ const GURL& url) {
+ // Get the effective URL for the given actual URL. If the URL is part of an
+ // installed app, the effective URL is an extension URL with the ID of that
+ // extension as the host. This has the effect of grouping apps together in
+ // a common SiteInstance.
+ if (!profile || !profile->GetExtensionService())
+ return url;
+
+ const Extension* extension =
+ profile->GetExtensionService()->GetExtensionByWebExtent(url);
+ if (!extension)
+ return url;
+
+ // If the URL is part of an extension's web extent, convert it to an
+ // extension URL.
+ return extension->GetResourceURL(url.path());
+}
+
} // namespace chrome
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index dd71656..c55fbae 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -16,6 +16,7 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
Profile* profile,
const GURL& url);
virtual content::WebUIFactory* GetWebUIFactory();
+ virtual GURL GetEffectiveURL(Profile* profile, const GURL& url);
};
} // namespace chrome
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index 1b05b26..a663fdb 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -32,6 +32,7 @@
#include "chrome/common/bindings_policy.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_constants.h"
+#include "chrome/common/extensions/extension_messages.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/url_constants.h"
#include "chrome/common/view_types.h"
@@ -793,6 +794,7 @@ bool ExtensionHost::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(ExtensionHost, message)
IPC_MESSAGE_HANDLER(ViewHostMsg_RunFileChooser, OnRunFileChooser)
+ IPC_MESSAGE_HANDLER(ExtensionHostMsg_PostMessage, OnPostMessage)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
@@ -849,3 +851,10 @@ void ExtensionHost::OnRunFileChooser(
file_select_helper_.reset(new FileSelectHelper(profile()));
file_select_helper_->RunFileChooser(render_view_host_, params);
}
+
+void ExtensionHost::OnPostMessage(int port_id, const std::string& message) {
+ if (profile()->GetExtensionMessageService()) {
+ profile()->GetExtensionMessageService()->PostMessageFromRenderer(
+ port_id, message);
+ }
+}
diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h
index e08885c..1601a8c 100644
--- a/chrome/browser/extensions/extension_host.h
+++ b/chrome/browser/extensions/extension_host.h
@@ -232,6 +232,7 @@ class ExtensionHost : public RenderViewHostDelegate,
// Message handlers.
void OnRunFileChooser(const ViewHostMsg_RunFileChooser_Params& params);
+ void OnPostMessage(int port_id, const std::string& message);
// Handles keyboard events that were not handled by HandleKeyboardEvent().
// Platform specific implementation may override this method to handle the
diff --git a/chrome/browser/extensions/extension_page_actions_module.cc b/chrome/browser/extensions/extension_page_actions_module.cc
index 2750c18..efdad78 100644
--- a/chrome/browser/extensions/extension_page_actions_module.cc
+++ b/chrome/browser/extensions/extension_page_actions_module.cc
@@ -9,6 +9,7 @@
#include "base/string_number_conversions.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/extensions/extension_page_actions_module_constants.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/extensions/extension_tabs_module.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
@@ -89,7 +90,7 @@ bool PageActionFunction::SetPageActionEnabled(bool enable) {
page_action->SetIsVisible(tab_id, enable);
page_action->SetTitle(tab_id, title);
page_action->SetIconIndex(tab_id, icon_id);
- contents->tab_contents()->PageActionStateChanged();
+ contents->extension_tab_helper()->PageActionStateChanged();
return true;
}
@@ -111,7 +112,7 @@ bool PageActionFunction::InitCommon(int tab_id) {
kNoTabError, base::IntToString(tab_id));
return false;
}
- contents_ = wrapper->tab_contents();
+ contents_ = wrapper;
return true;
}
@@ -123,7 +124,7 @@ bool PageActionFunction::SetVisible(bool visible) {
return false;
page_action_->SetIsVisible(tab_id, visible);
- contents_->PageActionStateChanged();
+ contents_->extension_tab_helper()->PageActionStateChanged();
return true;
}
@@ -175,7 +176,7 @@ bool PageActionSetIconFunction::RunImpl() {
EXTENSION_FUNCTION_VALIDATE(false);
}
- contents_->PageActionStateChanged();
+ contents_->extension_tab_helper()->PageActionStateChanged();
return true;
}
@@ -192,7 +193,7 @@ bool PageActionSetTitleFunction::RunImpl() {
EXTENSION_FUNCTION_VALIDATE(args->GetString("title", &title));
page_action_->SetTitle(tab_id, title);
- contents_->PageActionStateChanged();
+ contents_->extension_tab_helper()->PageActionStateChanged();
return true;
}
@@ -215,7 +216,7 @@ bool PageActionSetPopupFunction::RunImpl() {
popup_url = GetExtension()->GetResourceURL(popup_string);
page_action_->SetPopupUrl(tab_id, popup_url);
- contents_->PageActionStateChanged();
+ contents_->extension_tab_helper()->PageActionStateChanged();
return true;
}
@@ -241,7 +242,7 @@ bool PageActionSetBadgeBackgroundColorFunction::RunImpl() {
SkColor color = SkColorSetARGB(color_array[3], color_array[0], color_array[1],
color_array[2]);
page_action_->SetBadgeBackgroundColor(tab_id, color);
- contents_->PageActionStateChanged();
+ contents_->extension_tab_helper()->PageActionStateChanged();
return true;
}
@@ -267,7 +268,7 @@ bool PageActionSetBadgeTextColorFunction::RunImpl() {
SkColor color = SkColorSetARGB(color_array[3], color_array[0], color_array[1],
color_array[2]);
page_action_->SetBadgeTextColor(tab_id, color);
- contents_->PageActionStateChanged();
+ contents_->extension_tab_helper()->PageActionStateChanged();
return true;
}
@@ -286,6 +287,6 @@ bool PageActionSetBadgeTextFunction::RunImpl() {
EXTENSION_FUNCTION_VALIDATE(args->GetString("text", &text));
page_action_->SetBadgeText(tab_id, text);
- contents_->PageActionStateChanged();
+ contents_->extension_tab_helper()->PageActionStateChanged();
return true;
}
diff --git a/chrome/browser/extensions/extension_page_actions_module.h b/chrome/browser/extensions/extension_page_actions_module.h
index dfbda0a..ee99906 100644
--- a/chrome/browser/extensions/extension_page_actions_module.h
+++ b/chrome/browser/extensions/extension_page_actions_module.h
@@ -8,7 +8,7 @@
#include "chrome/browser/extensions/extension_function.h"
-class TabContents;
+class TabContentsWrapper;
class ExtensionAction;
// Base class for page action APIs.
@@ -21,7 +21,7 @@ class PageActionFunction : public SyncExtensionFunction {
bool SetVisible(bool visible);
ExtensionAction* page_action_;
- TabContents* contents_;
+ TabContentsWrapper* contents_;
};
// Implement chrome.pageActions.enableForTab().
diff --git a/chrome/browser/extensions/extension_startup_browsertest.cc b/chrome/browser/extensions/extension_startup_browsertest.cc
index 129e184..e139365 100644
--- a/chrome/browser/extensions/extension_startup_browsertest.cc
+++ b/chrome/browser/extensions/extension_startup_browsertest.cc
@@ -78,6 +78,8 @@ class ExtensionStartupTestBase : public InProcessBrowserTest {
// TODO(phajdan.jr): Check return values of the functions below, carefully.
file_util::Delete(user_scripts_dir_, true);
file_util::Delete(extensions_dir_, true);
+
+ InProcessBrowserTest::TearDown();
}
void WaitForServicesToStart(int num_expected_extensions,
diff --git a/chrome/browser/extensions/extension_tab_helper.cc b/chrome/browser/extensions/extension_tab_helper.cc
new file mode 100644
index 0000000..16c3534
--- /dev/null
+++ b/chrome/browser/extensions/extension_tab_helper.cc
@@ -0,0 +1,144 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/extension_tab_helper.h"
+
+#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/extensions/extension_action.h"
+#include "chrome/common/extensions/extension_icon_set.h"
+#include "chrome/common/extensions/extension_messages.h"
+#include "chrome/common/extensions/extension_resource.h"
+#include "content/browser/tab_contents/tab_contents.h"
+#include "content/browser/tab_contents/navigation_controller.h"
+#include "content/common/notification_service.h"
+
+ExtensionTabHelper::ExtensionTabHelper(TabContents* tab_contents)
+ : TabContentsObserver(tab_contents),
+ extension_app_(NULL) {
+}
+
+ExtensionTabHelper::~ExtensionTabHelper() {
+}
+
+void ExtensionTabHelper::CopyStateFrom(const ExtensionTabHelper& source) {
+ SetExtensionApp(source.extension_app());
+ extension_app_icon_ = source.extension_app_icon_;
+}
+
+void ExtensionTabHelper::PageActionStateChanged() {
+ tab_contents()->NotifyNavigationStateChanged(
+ TabContents::INVALIDATE_PAGE_ACTIONS);
+}
+
+void ExtensionTabHelper::SetExtensionApp(const Extension* extension) {
+ DCHECK(!extension || extension->GetFullLaunchURL().is_valid());
+ extension_app_ = extension;
+
+ UpdateExtensionAppIcon(extension_app_);
+
+ NotificationService::current()->Notify(
+ NotificationType::TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED,
+ Source<ExtensionTabHelper>(this),
+ NotificationService::NoDetails());
+}
+
+void ExtensionTabHelper::SetExtensionAppById(
+ const std::string& extension_app_id) {
+ if (extension_app_id.empty())
+ return;
+
+ ExtensionService* extension_service =
+ tab_contents()->profile()->GetExtensionService();
+ if (!extension_service || !extension_service->is_ready())
+ return;
+
+ const Extension* extension =
+ extension_service->GetExtensionById(extension_app_id, false);
+ if (extension)
+ SetExtensionApp(extension);
+}
+
+SkBitmap* ExtensionTabHelper::GetExtensionAppIcon() {
+ if (extension_app_icon_.empty())
+ return NULL;
+
+ return &extension_app_icon_;
+}
+
+void ExtensionTabHelper::DidNavigateMainFramePostCommit(
+ const NavigationController::LoadCommittedDetails& details,
+ const ViewHostMsg_FrameNavigate_Params& params) {
+ if (details.is_in_page)
+ return;
+
+ ExtensionService* service = tab_contents()->profile()->GetExtensionService();
+ if (!service)
+ return;
+
+ for (size_t i = 0; i < service->extensions()->size(); ++i) {
+ ExtensionAction* browser_action =
+ service->extensions()->at(i)->browser_action();
+ if (browser_action) {
+ browser_action->ClearAllValuesForTab(
+ tab_contents()->controller().session_id().id());
+ NotificationService::current()->Notify(
+ NotificationType::EXTENSION_BROWSER_ACTION_UPDATED,
+ Source<ExtensionAction>(browser_action),
+ NotificationService::NoDetails());
+ }
+
+ ExtensionAction* page_action =
+ service->extensions()->at(i)->page_action();
+ if (page_action) {
+ page_action->ClearAllValuesForTab(
+ tab_contents()->controller().session_id().id());
+ PageActionStateChanged();
+ }
+ }
+}
+
+bool ExtensionTabHelper::OnMessageReceived(const IPC::Message& message) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(ExtensionTabHelper, message)
+ IPC_MESSAGE_HANDLER(ExtensionHostMsg_PostMessage, OnPostMessage)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
+void ExtensionTabHelper::UpdateExtensionAppIcon(const Extension* extension) {
+ extension_app_icon_.reset();
+
+ if (extension) {
+ extension_app_image_loader_.reset(new ImageLoadingTracker(this));
+ extension_app_image_loader_->LoadImage(
+ extension,
+ extension->GetIconResource(Extension::EXTENSION_ICON_SMALLISH,
+ ExtensionIconSet::MATCH_EXACTLY),
+ gfx::Size(Extension::EXTENSION_ICON_SMALLISH,
+ Extension::EXTENSION_ICON_SMALLISH),
+ ImageLoadingTracker::CACHE);
+ } else {
+ extension_app_image_loader_.reset(NULL);
+ }
+}
+
+void ExtensionTabHelper::OnImageLoaded(SkBitmap* image,
+ const ExtensionResource& resource,
+ int index) {
+ if (image) {
+ extension_app_icon_ = *image;
+ tab_contents()->NotifyNavigationStateChanged(TabContents::INVALIDATE_TAB);
+ }
+}
+
+void ExtensionTabHelper::OnPostMessage(int port_id,
+ const std::string& message) {
+ if (tab_contents()->profile()->GetExtensionMessageService()) {
+ tab_contents()->profile()->GetExtensionMessageService()->
+ PostMessageFromRenderer(port_id, message);
+ }
+}
diff --git a/chrome/browser/extensions/extension_tab_helper.h b/chrome/browser/extensions/extension_tab_helper.h
new file mode 100644
index 0000000..5b9c60a
--- /dev/null
+++ b/chrome/browser/extensions/extension_tab_helper.h
@@ -0,0 +1,93 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSOIN_TAB_HELPER_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTENSOIN_TAB_HELPER_H_
+#pragma once
+
+#include "content/browser/tab_contents/tab_contents_observer.h"
+#include "chrome/browser/extensions/image_loading_tracker.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+
+class Extension;
+
+// Per-tab extension helper.
+class ExtensionTabHelper : public TabContentsObserver,
+ public ImageLoadingTracker::Observer {
+ public:
+ explicit ExtensionTabHelper(TabContents* tab_contents);
+ virtual ~ExtensionTabHelper();
+
+ // Copies the internal state from another ExtensionTabHelper.
+ void CopyStateFrom(const ExtensionTabHelper& source);
+
+ // Call this after updating a page action to notify clients about the changes.
+ void PageActionStateChanged();
+
+ // App extensions ------------------------------------------------------------
+
+ // Sets the extension denoting this as an app. If |extension| is non-null this
+ // tab becomes an app-tab. TabContents does not listen for unload events for
+ // the extension. It's up to consumers of TabContents to do that.
+ //
+ // NOTE: this should only be manipulated before the tab is added to a browser.
+ // TODO(sky): resolve if this is the right way to identify an app tab. If it
+ // is, than this should be passed in the constructor.
+ void SetExtensionApp(const Extension* extension);
+
+ // Convenience for setting the app extension by id. This does nothing if
+ // |extension_app_id| is empty, or an extension can't be found given the
+ // specified id.
+ void SetExtensionAppById(const std::string& extension_app_id);
+
+ const Extension* extension_app() const { return extension_app_; }
+ bool is_app() const { return extension_app_ != NULL; }
+
+ // If an app extension has been explicitly set for this TabContents its icon
+ // is returned.
+ //
+ // NOTE: the returned icon is larger than 16x16 (its size is
+ // Extension::EXTENSION_ICON_SMALLISH).
+ SkBitmap* GetExtensionAppIcon();
+
+ TabContents* tab_contents() const {
+ return TabContentsObserver::tab_contents();
+ }
+
+ private:
+ // TabContentsObserver overrides.
+ virtual void DidNavigateMainFramePostCommit(
+ const NavigationController::LoadCommittedDetails& details,
+ const ViewHostMsg_FrameNavigate_Params& params) OVERRIDE;
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+
+ // App extensions related methods:
+
+ // Resets app_icon_ and if |extension| is non-null creates a new
+ // ImageLoadingTracker to load the extension's image.
+ void UpdateExtensionAppIcon(const Extension* extension);
+
+ // ImageLoadingTracker::Observer.
+ virtual void OnImageLoaded(SkBitmap* image, const ExtensionResource& resource,
+ int index);
+
+ // Message handlers.
+ void OnPostMessage(int port_id, const std::string& message);
+
+ // Data for app extensions ---------------------------------------------------
+
+ // If non-null this tab is an app tab and this is the extension the tab was
+ // created for.
+ const Extension* extension_app_;
+
+ // Icon for extension_app_ (if non-null) or extension_for_current_page_.
+ SkBitmap extension_app_icon_;
+
+ // Used for loading extension_app_icon_.
+ scoped_ptr<ImageLoadingTracker> extension_app_image_loader_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExtensionTabHelper);
+};
+
+#endif // CHROME_BROWSER_EXTENSIONS_EXTENSOIN_TAB_HELPER_H_
diff --git a/chrome/browser/sessions/session_service.cc b/chrome/browser/sessions/session_service.cc
index 2431086..fa9ecae 100644
--- a/chrome/browser/sessions/session_service.cc
+++ b/chrome/browser/sessions/session_service.cc
@@ -17,6 +17,7 @@
#include "base/threading/thread.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/browser_window.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sessions/session_backend.h"
@@ -25,6 +26,7 @@
#include "chrome/browser/sessions/session_types.h"
#include "chrome/browser/tabs/tab_strip_model.h"
#include "chrome/browser/ui/browser_init.h"
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/common/extensions/extension.h"
#include "content/browser/tab_contents/navigation_controller.h"
#include "content/browser/tab_contents/navigation_entry.h"
@@ -518,11 +520,14 @@ void SessionService::Observe(NotificationType type,
NavigationController* controller =
Source<NavigationController>(source).ptr();
SetTabWindow(controller->window_id(), controller->session_id());
- if (controller->tab_contents()->extension_app()) {
+ TabContentsWrapper* wrapper =
+ TabContentsWrapper::GetCurrentWrapperForContents(
+ controller->tab_contents());
+ if (wrapper->extension_tab_helper()->extension_app()) {
SetTabExtensionAppID(
controller->window_id(),
controller->session_id(),
- controller->tab_contents()->extension_app()->id());
+ wrapper->extension_tab_helper()->extension_app()->id());
}
break;
}
@@ -584,12 +589,13 @@ void SessionService::Observe(NotificationType type,
}
case NotificationType::TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED: {
- TabContents* tab_contents = Source<TabContents>(source).ptr();
- DCHECK(tab_contents);
- if (tab_contents->extension_app()) {
- SetTabExtensionAppID(tab_contents->controller().window_id(),
- tab_contents->controller().session_id(),
- tab_contents->extension_app()->id());
+ ExtensionTabHelper* extension_tab_helper =
+ Source<ExtensionTabHelper>(source).ptr();
+ if (extension_tab_helper->extension_app()) {
+ SetTabExtensionAppID(
+ extension_tab_helper->tab_contents()->controller().window_id(),
+ extension_tab_helper->tab_contents()->controller().session_id(),
+ extension_tab_helper->extension_app()->id());
}
break;
}
@@ -1072,12 +1078,15 @@ void SessionService::BuildCommandsForTab(
commands->push_back(
CreatePinnedStateCommand(controller->session_id(), true));
}
- if (controller->tab_contents()->extension_app()) {
+ TabContentsWrapper* wrapper =
+ TabContentsWrapper::GetCurrentWrapperForContents(
+ controller->tab_contents());
+ if (wrapper->extension_tab_helper()->extension_app()) {
commands->push_back(
CreateSetTabExtensionAppIDCommand(
kCommandSetExtensionAppID,
controller->session_id().id(),
- controller->tab_contents()->extension_app()->id()));
+ wrapper->extension_tab_helper()->extension_app()->id()));
}
for (int i = min_index; i < max_index; ++i) {
const NavigationEntry* entry = (i == pending_index) ?
diff --git a/chrome/browser/sessions/tab_restore_service.cc b/chrome/browser/sessions/tab_restore_service.cc
index b819697..1e81bb1 100644
--- a/chrome/browser/sessions/tab_restore_service.cc
+++ b/chrome/browser/sessions/tab_restore_service.cc
@@ -13,12 +13,14 @@
#include "base/metrics/histogram.h"
#include "base/stl_util-inl.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sessions/session_service.h"
#include "chrome/browser/sessions/session_command.h"
#include "chrome/browser/sessions/session_types.h"
#include "chrome/browser/sessions/tab_restore_service_delegate.h"
#include "chrome/browser/sessions/tab_restore_service_observer.h"
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_constants.h"
#include "content/browser/tab_contents/navigation_controller.h"
@@ -492,9 +494,16 @@ void TabRestoreService::PopulateTab(Tab* tab,
tab->current_navigation_index = 0;
tab->tabstrip_index = index;
- const Extension* extension = controller->tab_contents()->extension_app();
- if (extension)
- tab->extension_app_id = extension->id();
+ TabContentsWrapper* wrapper =
+ TabContentsWrapper::GetCurrentWrapperForContents(
+ controller->tab_contents());
+ // wrapper is NULL in some browser tests.
+ if (wrapper) {
+ const Extension* extension =
+ wrapper->extension_tab_helper()->extension_app();
+ if (extension)
+ tab->extension_app_id = extension->id();
+ }
tab->session_storage_namespace = controller->session_storage_namespace();
diff --git a/chrome/browser/sync/glue/session_change_processor.cc b/chrome/browser/sync/glue/session_change_processor.cc
index d7d33d6..8c8a452 100644
--- a/chrome/browser/sync/glue/session_change_processor.cc
+++ b/chrome/browser/sync/glue/session_change_processor.cc
@@ -10,6 +10,7 @@
#include "base/logging.h"
#include "base/memory/scoped_vector.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sync/engine/syncapi.h"
#include "chrome/browser/sync/glue/session_model_associator.h"
@@ -125,13 +126,13 @@ void SessionChangeProcessor::Observe(NotificationType type,
}
case NotificationType::TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED: {
- TabContents* tab_contents = Source<TabContents>(source).ptr();
- DCHECK(tab_contents);
- if (tab_contents->profile() != profile_) {
+ ExtensionTabHelper* extension_tab_helper =
+ Source<ExtensionTabHelper>(source).ptr();
+ if (extension_tab_helper->tab_contents()->profile() != profile_) {
return;
}
- if (tab_contents->extension_app()) {
- modified_tabs.push_back(tab_contents);
+ if (extension_tab_helper->extension_app()) {
+ modified_tabs.push_back(extension_tab_helper->tab_contents());
}
break;
}
diff --git a/chrome/browser/sync/glue/session_model_associator.cc b/chrome/browser/sync/glue/session_model_associator.cc
index e02b4a2..28ed7c5 100644
--- a/chrome/browser/sync/glue/session_model_associator.cc
+++ b/chrome/browser/sync/glue/session_model_associator.cc
@@ -10,6 +10,7 @@
#include "base/logging.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/browser_window.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sync/profile_sync_service.h"
#include "chrome/browser/sync/syncable/syncable.h"
@@ -18,6 +19,7 @@
#include "chrome/common/url_constants.h"
#include "content/browser/tab_contents/navigation_controller.h"
#include "content/browser/tab_contents/navigation_entry.h"
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "content/common/notification_details.h"
#include "content/common/notification_service.h"
@@ -268,8 +270,13 @@ bool SessionModelAssociator::WriteTabContentsToSyncModel(
int index_in_window = browser.tabstrip_model()->GetWrapperIndex(&tab);
DCHECK(index_in_window != TabStripModel::kNoTab);
tab_s->set_pinned(browser.tabstrip_model()->IsTabPinned(index_in_window));
- if (tab.extension_app())
- tab_s->set_extension_app_id(tab.extension_app()->id());
+ TabContentsWrapper* wrapper =
+ TabContentsWrapper::GetCurrentWrapperForContents(
+ const_cast<TabContents*>(&tab));
+ if (wrapper->extension_tab_helper()->extension_app()) {
+ tab_s->set_extension_app_id(
+ wrapper->extension_tab_helper()->extension_app()->id());
+ }
for (int i = min_index; i < max_index; ++i) {
const NavigationEntry* entry = (i == pending_index) ?
tab.controller().pending_entry() : tab.controller().GetEntryAtIndex(i);
diff --git a/chrome/browser/tab_contents/background_contents.cc b/chrome/browser/tab_contents/background_contents.cc
index 933d2da..648aeb2 100644
--- a/chrome/browser/tab_contents/background_contents.cc
+++ b/chrome/browser/tab_contents/background_contents.cc
@@ -6,6 +6,7 @@
#include "chrome/browser/background_contents_service.h"
#include "chrome/browser/desktop_notification_handler.h"
+#include "chrome/browser/extensions/extension_message_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/renderer_preferences_util.h"
#include "chrome/browser/ui/webui/chrome_web_ui_factory.h"
@@ -197,9 +198,17 @@ void BackgroundContents::RenderViewGone(RenderViewHost* rvh,
}
bool BackgroundContents::OnMessageReceived(const IPC::Message& message) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP(BackgroundContents, message)
+ IPC_MESSAGE_HANDLER(ExtensionHostMsg_PostMessage, OnPostMessage)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+
// Forward desktop notification IPCs if any to the
// DesktopNotificationHandler.
- return desktop_notification_handler_->OnMessageReceived(message);
+ if (!handled)
+ handled = desktop_notification_handler_->OnMessageReceived(message);
+ return handled;
}
RendererPreferences BackgroundContents::GetRendererPrefs(
@@ -276,3 +285,12 @@ BackgroundContents::GetBackgroundContentsByID(int render_process_id,
return render_view_host->delegate()->GetAsBackgroundContents();
}
+
+void BackgroundContents::OnPostMessage(int port_id,
+ const std::string& message) {
+ Profile* profile = render_view_host_->process()->profile();
+ if (profile->GetExtensionMessageService()) {
+ profile->GetExtensionMessageService()->PostMessageFromRenderer(
+ port_id, message);
+ }
+}
diff --git a/chrome/browser/tab_contents/background_contents.h b/chrome/browser/tab_contents/background_contents.h
index e8a1847..3db1bfc 100644
--- a/chrome/browser/tab_contents/background_contents.h
+++ b/chrome/browser/tab_contents/background_contents.h
@@ -153,6 +153,9 @@ class BackgroundContents : public RenderViewHostDelegate,
BackgroundContents();
private:
+ // Message handlers.
+ void OnPostMessage(int port_id, const std::string& message);
+
// The delegate for this BackgroundContents.
Delegate* delegate_;
diff --git a/chrome/browser/tabs/pinned_tab_codec.cc b/chrome/browser/tabs/pinned_tab_codec.cc
index 7b89949..6680d82 100644
--- a/chrome/browser/tabs/pinned_tab_codec.cc
+++ b/chrome/browser/tabs/pinned_tab_codec.cc
@@ -6,6 +6,7 @@
#include "base/values.h"
#include "chrome/browser/browser_list.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tabs/tab_strip_model.h"
@@ -43,7 +44,8 @@ static void EncodePinnedTab(TabStripModel* model,
TabContentsWrapper* tab_contents = model->GetTabContentsAt(index);
if (model->IsAppTab(index)) {
- const Extension* extension = tab_contents->extension_app();
+ const Extension* extension =
+ tab_contents->extension_tab_helper()->extension_app();
DCHECK(extension);
value->SetString(kAppID, extension->id());
// For apps we use the launch url. We do this for the following reason:
diff --git a/chrome/browser/tabs/tab_strip_model.cc b/chrome/browser/tabs/tab_strip_model.cc
index 407bb00..7e31c30 100644
--- a/chrome/browser/tabs/tab_strip_model.cc
+++ b/chrome/browser/tabs/tab_strip_model.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/browser_shutdown.h"
#include "chrome/browser/defaults.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/metrics/user_metrics.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sessions/tab_restore_service.h"
@@ -117,7 +118,8 @@ void TabStripModel::InsertTabContentsAt(int index,
int add_types) {
bool foreground = add_types & ADD_SELECTED;
// Force app tabs to be pinned.
- bool pin = contents->is_app() || add_types & ADD_PINNED;
+ bool pin =
+ contents->extension_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
@@ -545,7 +547,7 @@ bool TabStripModel::IsMiniTab(int index) const {
bool TabStripModel::IsAppTab(int index) const {
TabContentsWrapper* contents = GetTabContentsAt(index);
- return contents && contents->is_app();
+ return contents && contents->extension_tab_helper()->is_app();
}
bool TabStripModel::IsTabBlocked(int index) const {
@@ -997,7 +999,7 @@ void TabStripModel::Observe(NotificationType type,
// Iterate backwards as we may remove items while iterating.
for (int i = count() - 1; i >= 0; i--) {
TabContentsWrapper* contents = GetTabContentsAt(i);
- if (contents->extension_app() == extension) {
+ if (contents->extension_tab_helper()->extension_app() == extension) {
// The extension an app tab was created from has been nuked. Delete
// the TabContents. Deleting a TabContents results in a notification
// of type TAB_CONTENTS_DESTROYED; we do the necessary cleanup in
diff --git a/chrome/browser/tabs/tab_strip_model.h b/chrome/browser/tabs/tab_strip_model.h
index df0c545..42489b4 100644
--- a/chrome/browser/tabs/tab_strip_model.h
+++ b/chrome/browser/tabs/tab_strip_model.h
@@ -41,8 +41,8 @@ class TabStripModelOrderController;
// You'll notice there is no explcit api for making a tab a mini-tab, rather
// there are two tab types that are implicitly mini-tabs:
// . App. Corresponds to an extension that wants an app tab. App tabs are
-// identified by TabContents::is_app(). App tabs are always pinneded (you
-// can't unpin them).
+// identified by TabContentsWrapper::extension_tab_helper()::is_app().
+// App tabs are always pinneded (you can't unpin them).
// . Pinned. Any tab can be pinned. Non-app tabs whose pinned state is changed
// are moved to be with other mini-tabs or non-mini tabs.
//
diff --git a/chrome/browser/tabs/tab_strip_model_unittest.cc b/chrome/browser/tabs/tab_strip_model_unittest.cc
index aac26a9..993f409 100644
--- a/chrome/browser/tabs/tab_strip_model_unittest.cc
+++ b/chrome/browser/tabs/tab_strip_model_unittest.cc
@@ -15,6 +15,7 @@
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/defaults.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/tabs/tab_strip_model.h"
@@ -1759,9 +1760,9 @@ TEST_F(TabStripModelTest, Apps) {
Extension::INVALID));
extension_app->launch_web_url_ = "http://www.google.com";
TabContentsWrapper* contents1 = CreateTabContents();
- contents1->tab_contents()->SetExtensionApp(extension_app);
+ contents1->extension_tab_helper()->SetExtensionApp(extension_app);
TabContentsWrapper* contents2 = CreateTabContents();
- contents2->tab_contents()->SetExtensionApp(extension_app);
+ contents2->extension_tab_helper()->SetExtensionApp(extension_app);
TabContentsWrapper* contents3 = CreateTabContents();
SetID(contents1->tab_contents(), 1);
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 2289b93..57e3f8b 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -47,6 +47,7 @@
#include "chrome/browser/extensions/extension_host.h"
#include "chrome/browser/extensions/extension_prefs.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/extensions/extension_tabs_module.h"
#include "chrome/browser/first_run/first_run.h"
#include "chrome/browser/google/google_url_tracker.h"
@@ -1054,7 +1055,7 @@ TabContents* Browser::AddRestoredTab(
GetSelectedTabContents(),
session_storage_namespace);
TabContents* new_tab = wrapper->tab_contents();
- new_tab->SetExtensionAppById(extension_app_id);
+ wrapper->extension_tab_helper()->SetExtensionAppById(extension_app_id);
new_tab->controller().RestoreFromState(navigations, selected_navigation,
from_last_session);
@@ -1096,8 +1097,8 @@ void Browser::ReplaceRestoredTab(
MSG_ROUTING_NONE,
GetSelectedTabContents(),
session_storage_namespace);
+ wrapper->extension_tab_helper()->SetExtensionAppById(extension_app_id);
TabContents* replacement = wrapper->tab_contents();
- replacement->SetExtensionAppById(extension_app_id);
replacement->controller().RestoreFromState(navigations, selected_navigation,
from_last_session);
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc
index 86754f2..11aca6c 100644
--- a/chrome/browser/ui/browser_navigator.cc
+++ b/chrome/browser/ui/browser_navigator.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/browser_list.h"
#include "chrome/browser/browser_url_handler.h"
#include "chrome/browser/browser_window.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tabs/tab_strip_model.h"
#include "chrome/browser/ui/browser.h"
@@ -182,7 +183,8 @@ Browser* GetBrowserForDisposition(browser::NavigateParams* params) {
// |source| represents an app.
Browser::Type type = Browser::TYPE_POPUP;
if ((params->browser && (params->browser->type() & Browser::TYPE_APP)) ||
- (params->source_contents && params->source_contents->is_app())) {
+ (params->source_contents &&
+ params->source_contents->extension_tab_helper()->is_app())) {
type = Browser::TYPE_APP_POPUP;
}
if (profile) {
@@ -424,7 +426,8 @@ 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->SetExtensionAppById(params->extension_app_id);
+ params->target_contents->extension_tab_helper()->
+ 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/cocoa/extensions/extension_infobar_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_infobar_controller.mm
index 2b63b2a..982b1d7 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_infobar_controller.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_infobar_controller.mm
@@ -8,6 +8,7 @@
#include "chrome/browser/extensions/extension_host.h"
#include "chrome/browser/extensions/extension_infobar_delegate.h"
+#include "chrome/browser/extensions/image_loading_tracker.h"
#import "chrome/browser/ui/cocoa/animatable_view.h"
#import "chrome/browser/ui/cocoa/extensions/extension_action_context_menu.h"
#import "chrome/browser/ui/cocoa/menu_button.h"
diff --git a/chrome/browser/ui/cocoa/tabpose_window.mm b/chrome/browser/ui/cocoa/tabpose_window.mm
index 967767f..4349089 100644
--- a/chrome/browser/ui/cocoa/tabpose_window.mm
+++ b/chrome/browser/ui/cocoa/tabpose_window.mm
@@ -15,6 +15,7 @@
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/browser_process.h"
#import "chrome/browser/debugger/devtools_window.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/renderer_host/render_widget_host_view_mac.h"
@@ -497,8 +498,8 @@ NSRect Tile::GetFaviconStartRectRelativeTo(const Tile& tile) const {
}
SkBitmap Tile::favicon() const {
- if (contents_->is_app()) {
- SkBitmap* icon = contents_->tab_contents()->GetExtensionAppIcon();
+ if (contents_->extension_tab_helper()->is_app()) {
+ SkBitmap* icon = contents_->extension_tab_helper()->GetExtensionAppIcon();
if (icon)
return *icon;
}
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
index b80e6a2..b822232 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
@@ -17,6 +17,7 @@
#include "chrome/browser/autocomplete/autocomplete.h"
#include "chrome/browser/autocomplete/autocomplete_classifier.h"
#include "chrome/browser/autocomplete/autocomplete_match.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/metrics/user_metrics.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
@@ -1327,13 +1328,15 @@ class NotificationBridge : public NotificationObserver {
// A helper routine for creating an NSImageView to hold the favicon or app icon
// for |contents|.
- (NSImageView*)iconImageViewForContents:(TabContents*)contents {
- BOOL isApp = contents->is_app();
+ TabContentsWrapper* wrapper =
+ TabContentsWrapper::GetCurrentWrapperForContents(contents);
+ BOOL isApp = wrapper->extension_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->GetExtensionAppIcon();
+ SkBitmap* icon = wrapper->extension_tab_helper()->GetExtensionAppIcon();
if (icon)
image = gfx::SkBitmapToNSImageWithColorSpace(*icon, colorSpace);
} else {
diff --git a/chrome/browser/ui/gtk/tabs/dragged_tab_gtk.cc b/chrome/browser/ui/gtk/tabs/dragged_tab_gtk.cc
index f3ff218..016b091 100644
--- a/chrome/browser/ui/gtk/tabs/dragged_tab_gtk.cc
+++ b/chrome/browser/ui/gtk/tabs/dragged_tab_gtk.cc
@@ -9,12 +9,14 @@
#include <algorithm>
#include "base/i18n/rtl.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tabs/tab_strip_model.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/browser/ui/gtk/gtk_util.h"
#include "chrome/browser/ui/gtk/tabs/tab_renderer_gtk.h"
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "content/browser/renderer_host/backing_store_x.h"
#include "content/browser/renderer_host/render_view_host.h"
#include "content/browser/tab_contents/tab_contents.h"
@@ -56,8 +58,10 @@ DraggedTabGtk::DraggedTabGtk(TabContents* datasource,
attached_tab_size_(TabRendererGtk::GetMinimumSelectedSize()),
contents_size_(contents_size),
close_animation_(this) {
+ TabContentsWrapper* wrapper =
+ TabContentsWrapper::GetCurrentWrapperForContents(datasource);
renderer_->UpdateData(datasource,
- datasource->is_app(),
+ wrapper->extension_tab_helper()->is_app(),
false); // loading_only
renderer_->set_mini(mini);
diff --git a/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.cc b/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.cc
index a57d44b..a3f792a 100644
--- a/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.cc
+++ b/chrome/browser/ui/gtk/tabs/tab_renderer_gtk.cc
@@ -9,6 +9,7 @@
#include "base/utf_string_conversions.h"
#include "chrome/browser/defaults.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/gtk/bookmarks/bookmark_utils_gtk.h"
@@ -292,7 +293,9 @@ void TabRendererGtk::UpdateData(TabContents* contents,
data_.incognito = contents->profile()->IsOffTheRecord();
data_.crashed = contents->is_crashed();
- SkBitmap* app_icon = contents->GetExtensionAppIcon();
+ SkBitmap* app_icon =
+ TabContentsWrapper::GetCurrentWrapperForContents(contents)->
+ extension_tab_helper()->GetExtensionAppIcon();
if (app_icon)
data_.favicon = *app_icon;
else
diff --git a/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc b/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc
index 1a27f92..39a0c74 100644
--- a/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc
+++ b/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
#include "chrome/browser/custom_handlers/register_protocol_handler_infobar_delegate.h"
#include "chrome/browser/debugger/devtools_handler.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/file_select_helper.h"
#include "chrome/browser/history/top_sites.h"
#include "chrome/browser/password_manager/password_manager.h"
@@ -53,6 +54,7 @@ TabContentsWrapper::TabContentsWrapper(TabContents* contents)
// Create the tab helpers.
autocomplete_history_manager_.reset(new AutocompleteHistoryManager(contents));
autofill_manager_.reset(new AutofillManager(contents));
+ extension_tab_helper_.reset(new ExtensionTabHelper(contents));
find_tab_helper_.reset(new FindTabHelper(contents));
password_manager_delegate_.reset(new PasswordManagerDelegateImpl(contents));
password_manager_.reset(
@@ -186,6 +188,9 @@ string16 TabContentsWrapper::GetStatusText() const {
TabContentsWrapper* TabContentsWrapper::Clone() {
TabContents* new_contents = tab_contents()->Clone();
TabContentsWrapper* new_wrapper = new TabContentsWrapper(new_contents);
+
+ new_wrapper->extension_tab_helper()->CopyStateFrom(
+ *extension_tab_helper_.get());
return new_wrapper;
}
diff --git a/chrome/browser/ui/tab_contents/tab_contents_wrapper.h b/chrome/browser/ui/tab_contents/tab_contents_wrapper.h
index 3a45f87..38ee4f9 100644
--- a/chrome/browser/ui/tab_contents/tab_contents_wrapper.h
+++ b/chrome/browser/ui/tab_contents/tab_contents_wrapper.h
@@ -28,6 +28,7 @@ class AutocompleteHistoryManager;
class AutofillManager;
class DevToolsObserver;
class Extension;
+class ExtensionTabHelper;
class FileSelectObserver;
class FindTabHelper;
class NavigationController;
@@ -87,16 +88,6 @@ class TabContentsWrapper : public NotificationObserver,
return tab_contents()->render_view_host();
}
Profile* profile() const { return tab_contents()->profile(); }
-
- // Convenience methods until extensions are removed from TabContents.
- void SetExtensionAppById(const std::string& extension_app_id) {
- tab_contents()->SetExtensionAppById(extension_app_id);
- }
- const Extension* extension_app() const {
- return tab_contents()->extension_app();
- }
- bool is_app() const { return tab_contents()->is_app(); }
-
bool is_starred() const { return is_starred_; }
// Tab Helpers ---------------------------------------------------------------
@@ -107,6 +98,10 @@ class TabContentsWrapper : public NotificationObserver,
AutofillManager* autofill_manager() { return autofill_manager_.get(); }
+ ExtensionTabHelper* extension_tab_helper() {
+ return extension_tab_helper_.get();
+ }
+
FindTabHelper* find_tab_helper() { return find_tab_helper_.get(); }
PasswordManager* password_manager() { return password_manager_.get(); }
@@ -171,6 +166,8 @@ class TabContentsWrapper : public NotificationObserver,
scoped_ptr<AutofillManager> autofill_manager_;
+ scoped_ptr<ExtensionTabHelper> extension_tab_helper_;
+
scoped_ptr<FindTabHelper> find_tab_helper_;
// PasswordManager and its delegate. The delegate must outlive the manager,
diff --git a/chrome/browser/ui/tab_contents/test_tab_contents_wrapper.cc b/chrome/browser/ui/tab_contents/test_tab_contents_wrapper.cc
index 46eac9f..28aa5a4 100644
--- a/chrome/browser/ui/tab_contents/test_tab_contents_wrapper.cc
+++ b/chrome/browser/ui/tab_contents/test_tab_contents_wrapper.cc
@@ -24,7 +24,6 @@ TabContentsWrapper* TabContentsWrapperTestHarness::contents_wrapper() {
}
void TabContentsWrapperTestHarness::SetUp() {
- content::GetContentClient()->set_browser(&browser_client_);
contents_wrapper_.reset(new TabContentsWrapper(CreateTestTabContents()));
}
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 5c976fe..b5ec363 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -6,6 +6,7 @@
#include "base/auto_reset.h"
#include "base/command_line.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
#include "chrome/browser/metrics/user_metrics.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tabs/tab_strip_model.h"
@@ -388,11 +389,13 @@ void BrowserTabStripController::SetTabRendererDataFromModel(
int model_index,
TabRendererData* data) {
SkBitmap* app_icon = NULL;
+ TabContentsWrapper* wrapper =
+ TabContentsWrapper::GetCurrentWrapperForContents(contents);
// Extension App icons are slightly larger than favicons, so only allow
// them if permitted by the model.
if (model_->delegate()->LargeIconsPermitted())
- app_icon = contents->GetExtensionAppIcon();
+ app_icon = wrapper->extension_tab_helper()->GetExtensionAppIcon();
if (app_icon)
data->favicon = *app_icon;
@@ -406,7 +409,7 @@ void BrowserTabStripController::SetTabRendererDataFromModel(
data->show_icon = contents->ShouldDisplayFavicon();
data->mini = model_->IsMiniTab(model_index);
data->blocked = model_->IsTabBlocked(model_index);
- data->app = contents->is_app();
+ data->app = wrapper->extension_tab_helper()->is_app();
}
void BrowserTabStripController::StartHighlightTabsForCommand(