summaryrefslogtreecommitdiffstats
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
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
-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
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/test/browser_with_test_window_test.cc2
-rw-r--r--chrome/test/browser_with_test_window_test.h2
-rw-r--r--chrome/test/testing_profile.cc4
-rw-r--r--chrome/test/testing_profile.h9
-rw-r--r--chrome/test/unit/chrome_test_suite.cc1
-rw-r--r--chrome/test/unit/chrome_test_suite.h2
-rw-r--r--content/browser/DEPS4
-rw-r--r--content/browser/content_browser_client.cc5
-rw-r--r--content/browser/content_browser_client.h4
-rw-r--r--content/browser/in_process_webkit/webkit_context_unittest.cc16
-rw-r--r--content/browser/plugin_service.cc1
-rw-r--r--content/browser/renderer_host/render_view_host.cc10
-rw-r--r--content/browser/renderer_host/render_view_host.h1
-rw-r--r--content/browser/renderer_host/render_view_host_manager_browsertest.cc1
-rw-r--r--content/browser/renderer_host/test_render_view_host.cc3
-rw-r--r--content/browser/renderer_host/test_render_view_host.h2
-rw-r--r--content/browser/site_instance.cc14
-rw-r--r--content/browser/site_instance.h5
-rw-r--r--content/browser/site_instance_unittest.cc9
-rw-r--r--content/browser/tab_contents/tab_contents.cc104
-rw-r--r--content/browser/tab_contents/tab_contents.h56
-rw-r--r--content/browser/webui/web_ui_factory.cc1
-rw-r--r--content/common/notification_type.h2
55 files changed, 465 insertions, 274 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(
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 326d2fd..c9334ec 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -970,6 +970,8 @@
'browser/extensions/extension_special_storage_policy.h',
'browser/extensions/extension_tab_id_map.cc',
'browser/extensions/extension_tab_id_map.h',
+ 'browser/extensions/extension_tab_helper.cc',
+ 'browser/extensions/extension_tab_helper.h',
'browser/extensions/extension_tabs_module.cc',
'browser/extensions/extension_tabs_module.h',
'browser/extensions/extension_tabs_module_constants.cc',
diff --git a/chrome/test/browser_with_test_window_test.cc b/chrome/test/browser_with_test_window_test.cc
index df70a7e..c945bf0 100644
--- a/chrome/test/browser_with_test_window_test.cc
+++ b/chrome/test/browser_with_test_window_test.cc
@@ -16,7 +16,6 @@
#include "content/browser/tab_contents/navigation_controller.h"
#include "content/browser/tab_contents/navigation_entry.h"
#include "content/browser/tab_contents/tab_contents.h"
-#include "content/common/content_client.h"
#include "content/common/page_transition_types.h"
BrowserWithTestWindowTest::BrowserWithTestWindowTest()
@@ -33,7 +32,6 @@ void BrowserWithTestWindowTest::SetUp() {
TestingBrowserProcessTest::SetUp();
profile_.reset(CreateProfile());
- content::GetContentClient()->set_browser(&browser_client_);
browser_.reset(new Browser(Browser::TYPE_NORMAL, profile()));
window_.reset(new TestBrowserWindow(browser()));
browser_->set_window(window_.get());
diff --git a/chrome/test/browser_with_test_window_test.h b/chrome/test/browser_with_test_window_test.h
index 0cc4711..35be3ad 100644
--- a/chrome/test/browser_with_test_window_test.h
+++ b/chrome/test/browser_with_test_window_test.h
@@ -7,7 +7,6 @@
#pragma once
#include "base/message_loop.h"
-#include "chrome/browser/chrome_content_browser_client.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/test_browser_window.h"
#include "chrome/test/testing_browser_process_test.h"
@@ -102,7 +101,6 @@ class BrowserWithTestWindowTest : public TestingBrowserProcessTest {
BrowserThread file_thread_;
scoped_ptr<TestingProfile> profile_;
- chrome::ChromeContentBrowserClient browser_client_;
scoped_ptr<TestBrowserWindow> window_;
scoped_ptr<Browser> browser_;
diff --git a/chrome/test/testing_profile.cc b/chrome/test/testing_profile.cc
index 039cbb3..468c051 100644
--- a/chrome/test/testing_profile.cc
+++ b/chrome/test/testing_profile.cc
@@ -796,6 +796,10 @@ PrefService* TestingProfile::GetOffTheRecordPrefs() {
return NULL;
}
+quota::SpecialStoragePolicy* TestingProfile::GetSpecialStoragePolicy() {
+ return GetExtensionSpecialStoragePolicy();
+}
+
void TestingProfile::DestroyWebDataService() {
if (!web_data_service_.get())
return;
diff --git a/chrome/test/testing_profile.h b/chrome/test/testing_profile.h
index 3ac8d27..154294f 100644
--- a/chrome/test/testing_profile.h
+++ b/chrome/test/testing_profile.h
@@ -20,6 +20,10 @@ namespace net {
class CookieMonster;
}
+namespace quota {
+class SpecialStoragePolicy;
+}
+
class AutocompleteClassifier;
class BookmarkModel;
class CommandLine;
@@ -283,6 +287,11 @@ class TestingProfile : public Profile {
virtual prerender::PrerenderManager* GetPrerenderManager();
virtual PrefService* GetOffTheRecordPrefs();
+ // TODO(jam): remove me once webkit_context_unittest.cc doesn't use Profile
+ // and gets the quota::SpecialStoragePolicy* from whatever ends up replacing
+ // it in the content module.
+ quota::SpecialStoragePolicy* GetSpecialStoragePolicy();
+
protected:
base::Time start_time_;
scoped_ptr<PrefService> prefs_;
diff --git a/chrome/test/unit/chrome_test_suite.cc b/chrome/test/unit/chrome_test_suite.cc
index f8eaf48..ea42dce 100644
--- a/chrome/test/unit/chrome_test_suite.cc
+++ b/chrome/test/unit/chrome_test_suite.cc
@@ -99,6 +99,7 @@ void ChromeTestSuite::Initialize() {
// Initialize the content client which that code uses to talk to Chrome.
content::SetContentClient(&chrome_content_client_);
+ content::GetContentClient()->set_browser(&chrome_browser_content_client_);
chrome::RegisterChromeSchemes();
host_resolver_proc_ = new LocalHostResolverProc();
diff --git a/chrome/test/unit/chrome_test_suite.h b/chrome/test/unit/chrome_test_suite.h
index be0430c..a8d89e6 100644
--- a/chrome/test/unit/chrome_test_suite.h
+++ b/chrome/test/unit/chrome_test_suite.h
@@ -15,6 +15,7 @@
#include "base/path_service.h"
#include "base/test/test_suite.h"
#include "chrome/app/scoped_ole_initializer.h"
+#include "chrome/browser/chrome_content_browser_client.h"
#include "chrome/common/chrome_content_client.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "net/base/mock_host_resolver.h"
@@ -55,6 +56,7 @@ class ChromeTestSuite : public base::TestSuite {
// Client for embedding content in Chrome.
chrome::ChromeContentClient chrome_content_client_;
+ chrome::ChromeContentBrowserClient chrome_browser_content_client_;
base::StatsTable* stats_table_;
diff --git a/content/browser/DEPS b/content/browser/DEPS
index ed03eca..eb0e8c0 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -1,4 +1,8 @@
include_rules = [
+ # The following directories have been refactored, so no new dependencies
+ # should be added from these directories.
+ "-chrome/browser/extensions",
+
"+content/gpu", # For single-process mode.
]
diff --git a/content/browser/content_browser_client.cc b/content/browser/content_browser_client.cc
index b96b55e..5b763c2b 100644
--- a/content/browser/content_browser_client.cc
+++ b/content/browser/content_browser_client.cc
@@ -6,6 +6,7 @@
#include "base/memory/singleton.h"
#include "content/browser/webui/empty_web_ui_factory.h"
+#include "googleurl/src/gurl.h"
namespace content {
@@ -14,4 +15,8 @@ WebUIFactory* ContentBrowserClient::GetWebUIFactory() {
return EmptyWebUIFactory::Get();
}
+GURL ContentBrowserClient::GetEffectiveURL(Profile* profile, const GURL& url) {
+ return url;
+}
+
} // namespace content
diff --git a/content/browser/content_browser_client.h b/content/browser/content_browser_client.h
index c7218f8..e8350e6 100644
--- a/content/browser/content_browser_client.h
+++ b/content/browser/content_browser_client.h
@@ -26,6 +26,10 @@ class ContentBrowserClient {
// Gets the WebUIFactory which will be responsible for generating WebUIs.
virtual WebUIFactory* GetWebUIFactory();
+
+ // Get the effective URL for the given actual URL, to allow an embedder to
+ // group different url schemes in the same SiteInstance.
+ virtual GURL GetEffectiveURL(Profile* profile, const GURL& url);
};
} // namespace content
diff --git a/content/browser/in_process_webkit/webkit_context_unittest.cc b/content/browser/in_process_webkit/webkit_context_unittest.cc
index 09ce976..5232757 100644
--- a/content/browser/in_process_webkit/webkit_context_unittest.cc
+++ b/content/browser/in_process_webkit/webkit_context_unittest.cc
@@ -2,7 +2,6 @@
// 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_special_storage_policy.h"
#include "chrome/test/testing_profile.h"
#include "content/browser/browser_thread.h"
#include "content/browser/in_process_webkit/dom_storage_context.h"
@@ -11,8 +10,9 @@
class MockDOMStorageContext : public DOMStorageContext {
public:
- explicit MockDOMStorageContext(WebKitContext* webkit_context)
- : DOMStorageContext(webkit_context, new ExtensionSpecialStoragePolicy),
+ MockDOMStorageContext(WebKitContext* webkit_context,
+ quota::SpecialStoragePolicy* special_storage_policy)
+ : DOMStorageContext(webkit_context, special_storage_policy),
purge_count_(0) {
}
@@ -32,14 +32,14 @@ TEST(WebKitContextTest, Basic) {
TestingProfile profile;
scoped_refptr<WebKitContext> context1(new WebKitContext(
profile.IsOffTheRecord(), profile.GetPath(),
- profile.GetExtensionSpecialStoragePolicy(),
+ profile.GetSpecialStoragePolicy(),
false));
EXPECT_TRUE(profile.GetPath() == context1->data_path());
EXPECT_TRUE(profile.IsOffTheRecord() == context1->is_incognito());
scoped_refptr<WebKitContext> context2(new WebKitContext(
profile.IsOffTheRecord(), profile.GetPath(),
- profile.GetExtensionSpecialStoragePolicy(),
+ profile.GetSpecialStoragePolicy(),
false));
EXPECT_TRUE(context1->data_path() == context2->data_path());
EXPECT_TRUE(context1->is_incognito() == context2->is_incognito());
@@ -55,10 +55,10 @@ TEST(WebKitContextTest, PurgeMemory) {
TestingProfile profile;
scoped_refptr<WebKitContext> context(new WebKitContext(
profile.IsOffTheRecord(), profile.GetPath(),
- profile.GetExtensionSpecialStoragePolicy(),
+ profile.GetSpecialStoragePolicy(),
false));
- MockDOMStorageContext* mock_context =
- new MockDOMStorageContext(context.get());
+ MockDOMStorageContext* mock_context = new MockDOMStorageContext(
+ context.get(), profile.GetSpecialStoragePolicy());
context->set_dom_storage_context(mock_context); // Takes ownership.
// Ensure PurgeMemory() calls our mock object on the right thread.
diff --git a/content/browser/plugin_service.cc b/content/browser/plugin_service.cc
index c604040..7f96deb 100644
--- a/content/browser/plugin_service.cc
+++ b/content/browser/plugin_service.cc
@@ -15,7 +15,6 @@
#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
-#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/plugin_updater.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_paths.h"
diff --git a/content/browser/renderer_host/render_view_host.cc b/content/browser/renderer_host/render_view_host.cc
index b946cf8..461a9fd 100644
--- a/content/browser/renderer_host/render_view_host.cc
+++ b/content/browser/renderer_host/render_view_host.cc
@@ -16,7 +16,6 @@
#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/dom_operation_notification_details.h"
-#include "chrome/browser/extensions/extension_message_service.h"
#include "chrome/browser/metrics/user_metrics.h"
#include "chrome/browser/net/predictor_api.h"
#include "chrome/browser/profiles/profile.h"
@@ -772,7 +771,6 @@ bool RenderViewHost::OnMessageReceived(const IPC::Message& msg) {
IPC_MESSAGE_HANDLER(ViewHostMsg_ShouldClose_ACK, OnMsgShouldCloseACK)
IPC_MESSAGE_HANDLER(ExtensionHostMsg_Request, OnExtensionRequest)
IPC_MESSAGE_HANDLER(ViewHostMsg_SelectionChanged, OnMsgSelectionChanged)
- IPC_MESSAGE_HANDLER(ExtensionHostMsg_PostMessage, OnExtensionPostMessage)
IPC_MESSAGE_HANDLER(ViewHostMsg_AccessibilityNotifications,
OnAccessibilityNotifications)
IPC_MESSAGE_HANDLER(ViewHostMsg_OnCSSInserted, OnCSSInserted)
@@ -1501,14 +1499,6 @@ void RenderViewHost::JavaScriptStressTestControl(int cmd, int param) {
Send(new ViewMsg_JavaScriptStressTestControl(routing_id(), cmd, param));
}
-void RenderViewHost::OnExtensionPostMessage(
- int port_id, const std::string& message) {
- if (process()->profile()->GetExtensionMessageService()) {
- process()->profile()->GetExtensionMessageService()->
- PostMessageFromRenderer(port_id, message);
- }
-}
-
void RenderViewHost::OnAccessibilityNotifications(
const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params) {
if (view())
diff --git a/content/browser/renderer_host/render_view_host.h b/content/browser/renderer_host/render_view_host.h
index c53db07..ff675a0 100644
--- a/content/browser/renderer_host/render_view_host.h
+++ b/content/browser/renderer_host/render_view_host.h
@@ -594,7 +594,6 @@ class RenderViewHost : public RenderWidgetHost {
void OnMsgShouldCloseACK(bool proceed);
void OnExtensionRequest(const ExtensionHostMsg_DomMessage_Params& params);
- void OnExtensionPostMessage(int port_id, const std::string& message);
void OnAccessibilityNotifications(
const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params);
void OnCSSInserted();
diff --git a/content/browser/renderer_host/render_view_host_manager_browsertest.cc b/content/browser/renderer_host/render_view_host_manager_browsertest.cc
index d039454..059e6a3 100644
--- a/content/browser/renderer_host/render_view_host_manager_browsertest.cc
+++ b/content/browser/renderer_host/render_view_host_manager_browsertest.cc
@@ -6,7 +6,6 @@
#include "base/memory/ref_counted.h"
#include "base/path_service.h"
#include "chrome/browser/download/download_manager.h"
-#include "chrome/browser/extensions/extension_error_reporter.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/common/chrome_paths.h"
diff --git a/content/browser/renderer_host/test_render_view_host.cc b/content/browser/renderer_host/test_render_view_host.cc
index 003766f..b7842cf 100644
--- a/content/browser/renderer_host/test_render_view_host.cc
+++ b/content/browser/renderer_host/test_render_view_host.cc
@@ -338,9 +338,6 @@ void RenderViewHostTestHarness::Reload() {
}
void RenderViewHostTestHarness::SetUp() {
- // Initialize Chrome's ContentBrowserClient here, since we won't go through
- // BrowserMain.
- content::GetContentClient()->set_browser(&browser_client_);
contents_.reset(CreateTestTabContents());
}
diff --git a/content/browser/renderer_host/test_render_view_host.h b/content/browser/renderer_host/test_render_view_host.h
index c51296d..927af93 100644
--- a/content/browser/renderer_host/test_render_view_host.h
+++ b/content/browser/renderer_host/test_render_view_host.h
@@ -10,7 +10,6 @@
#include "base/gtest_prod_util.h"
#include "base/message_loop.h"
#include "build/build_config.h"
-#include "chrome/browser/chrome_content_browser_client.h"
#include "content/browser/renderer_host/mock_render_process_host.h"
#include "content/browser/renderer_host/render_view_host.h"
#include "content/browser/renderer_host/render_view_host_factory.h"
@@ -303,7 +302,6 @@ class RenderViewHostTestHarness : public testing::Test {
MockRenderProcessHostFactory rph_factory_;
TestRenderViewHostFactory rvh_factory_;
- chrome::ChromeContentBrowserClient browser_client_;
scoped_ptr<TestTabContents> contents_;
DISALLOW_COPY_AND_ASSIGN(RenderViewHostTestHarness);
diff --git a/content/browser/site_instance.cc b/content/browser/site_instance.cc
index 26565a1..3503eac 100644
--- a/content/browser/site_instance.cc
+++ b/content/browser/site_instance.cc
@@ -4,7 +4,6 @@
#include "content/browser/site_instance.h"
-#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/renderer_host/browser_render_process_host.h"
#include "chrome/common/url_constants.h"
#include "content/browser/browsing_instance.h"
@@ -190,18 +189,7 @@ bool SiteInstance::IsSameWebSite(Profile* profile,
/*static*/
GURL SiteInstance::GetEffectiveURL(Profile* profile, const GURL& url) {
- if (!profile || !profile->GetExtensionService())
- return url;
-
- const Extension* extension =
- profile->GetExtensionService()->GetExtensionByWebExtent(url);
- if (extension) {
- // If the URL is part of an extension's web extent, convert it to an
- // extension URL.
- return extension->GetResourceURL(url.path());
- } else {
- return url;
- }
+ return content::GetContentClient()->browser()->GetEffectiveURL(profile, url);
}
/*static*/
diff --git a/content/browser/site_instance.h b/content/browser/site_instance.h
index 1c41abd2..76f966e 100644
--- a/content/browser/site_instance.h
+++ b/content/browser/site_instance.h
@@ -149,10 +149,7 @@ class SiteInstance : public base::RefCounted<SiteInstance>,
// GetRelatedSiteInstance instead.
explicit SiteInstance(BrowsingInstance* browsing_instance);
- // 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.
+ // Get the effective URL for the given actual URL.
static GURL GetEffectiveURL(Profile* profile, const GURL& url);
// Returns the type of renderer process this instance belongs in, for grouping
diff --git a/content/browser/site_instance_unittest.cc b/content/browser/site_instance_unittest.cc
index 247dd13..5ba3919 100644
--- a/content/browser/site_instance_unittest.cc
+++ b/content/browser/site_instance_unittest.cc
@@ -50,14 +50,23 @@ class SiteInstanceTestBrowserClient : public content::ContentBrowserClient {
class SiteInstanceTest : public testing::Test {
public:
+ SiteInstanceTest() : old_browser_client_(NULL) {
+ }
+
virtual void SetUp() {
+ old_browser_client_ = content::GetContentClient()->browser();
content::GetContentClient()->set_browser(&browser_client_);
}
+ virtual void TearDown() {
+ content::GetContentClient()->set_browser(old_browser_client_);
+ }
+
private:
MessageLoopForUI message_loop_;
SiteInstanceTestBrowserClient browser_client_;
+ content::ContentBrowserClient* old_browser_client_;
};
class TestBrowsingInstance : public BrowsingInstance {
diff --git a/content/browser/tab_contents/tab_contents.cc b/content/browser/tab_contents/tab_contents.cc
index 9559db3..5940baf 100644
--- a/content/browser/tab_contents/tab_contents.cc
+++ b/content/browser/tab_contents/tab_contents.cc
@@ -7,6 +7,7 @@
#include <cmath>
#include "base/auto_reset.h"
+#include "base/command_line.h"
#include "base/metrics/histogram.h"
#include "base/metrics/stats_counters.h"
#include "base/string16.h"
@@ -26,7 +27,6 @@
#include "chrome/browser/download/download_item_model.h"
#include "chrome/browser/download/download_manager.h"
#include "chrome/browser/download/download_request_limiter.h"
-#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/external_protocol_handler.h"
#include "chrome/browser/favicon_service.h"
#include "chrome/browser/google/google_util.h"
@@ -40,6 +40,7 @@
#include "chrome/browser/pdf_unsupported_feature.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/plugin_observer.h"
+#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/renderer_host/web_cache_manager.h"
#include "chrome/browser/renderer_preferences_util.h"
@@ -56,10 +57,7 @@
#include "chrome/common/chrome_switches.h"
#include "chrome/common/content_restriction.h"
#include "chrome/common/extensions/extension.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 "chrome/common/extensions/url_pattern.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/render_messages.h"
@@ -243,7 +241,6 @@ TabContents::TabContents(Profile* profile,
all_contents_blocked_(false),
dont_notify_render_view_(false),
displayed_insecure_content_(false),
- extension_app_(NULL),
capturing_contents_(false),
is_being_destroyed_(false),
notify_disconnection_(false),
@@ -451,39 +448,6 @@ RenderProcessHost* TabContents::GetRenderProcessHost() const {
return render_manager_.current_host()->process();
}
-void TabContents::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<TabContents>(this),
- NotificationService::NoDetails());
-}
-
-void TabContents::SetExtensionAppById(const std::string& extension_app_id) {
- if (extension_app_id.empty())
- return;
-
- ExtensionService* extension_service = 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* TabContents::GetExtensionAppIcon() {
- if (extension_app_icon_.empty())
- return NULL;
-
- return &extension_app_icon_;
-}
-
const GURL& TabContents::GetURL() const {
// We may not have a navigation entry yet
NavigationEntry* entry = controller_.GetActiveEntry();
@@ -614,10 +578,6 @@ void TabContents::SetIsCrashed(base::TerminationStatus status, int error_code) {
NotifyNavigationStateChanged(INVALIDATE_TAB);
}
-void TabContents::PageActionStateChanged() {
- NotifyNavigationStateChanged(TabContents::INVALIDATE_PAGE_ACTIONS);
-}
-
void TabContents::NotifyNavigationStateChanged(unsigned changed_flags) {
if (delegate_)
delegate_->NavigationStateChanged(this, changed_flags);
@@ -782,8 +742,6 @@ TabContents* TabContents::Clone() {
SiteInstance::CreateSiteInstance(profile()),
MSG_ROUTING_NONE, this, NULL);
tc->controller().CopyStateFrom(controller_);
- tc->extension_app_ = extension_app_;
- tc->extension_app_icon_ = extension_app_icon_;
return tc;
}
@@ -1639,28 +1597,6 @@ void TabContents::DidNavigateMainFramePostCommit(
// Clear all page actions, blocked content notifications and browser actions
// for this tab, unless this is an in-page navigation.
if (!details.is_in_page) {
- ExtensionService* service = profile()->GetExtensionService();
- if (service) {
- 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(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(controller().session_id().id());
- PageActionStateChanged();
- }
- }
- }
-
// Close blocked popups.
if (blocked_contents_) {
AutoReset<bool> auto_reset(&dont_notify_render_view_, true);
@@ -2667,42 +2603,6 @@ void TabContents::Observe(NotificationType type,
}
}
-void TabContents::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);
- }
-}
-
-const Extension* TabContents::GetExtensionContaining(const GURL& url) {
- ExtensionService* extensions_service = profile()->GetExtensionService();
- if (!extensions_service)
- return NULL;
-
- const Extension* extension = extensions_service->GetExtensionByURL(url);
- return extension ?
- extension : extensions_service->GetExtensionByWebExtent(url);
-}
-
-void TabContents::OnImageLoaded(SkBitmap* image,
- const ExtensionResource& resource,
- int index) {
- if (image) {
- extension_app_icon_ = *image;
- NotifyNavigationStateChanged(INVALIDATE_TAB);
- }
-}
-
gfx::NativeWindow TabContents::GetMessageBoxRootWindow() {
return view_->GetTopLevelNativeWindow();
}
diff --git a/content/browser/tab_contents/tab_contents.h b/content/browser/tab_contents/tab_contents.h
index 9ec2b39..33ca959 100644
--- a/content/browser/tab_contents/tab_contents.h
+++ b/content/browser/tab_contents/tab_contents.h
@@ -16,7 +16,6 @@
#include "base/memory/scoped_ptr.h"
#include "base/string16.h"
#include "chrome/browser/download/save_package.h"
-#include "chrome/browser/extensions/image_loading_tracker.h"
#include "chrome/browser/favicon_helper.h"
#include "chrome/browser/prefs/pref_change_registrar.h"
#include "chrome/browser/tab_contents/tab_specific_content_settings.h"
@@ -92,7 +91,6 @@ class TabContents : public PageNavigator,
public RenderViewHostDelegate,
public RenderViewHostManager::Delegate,
public JavaScriptAppModalDialogDelegate,
- public ImageLoadingTracker::Observer,
public TabSpecificContentSettings::Delegate,
public net::NetworkChangeNotifier::OnlineStateObserver {
public:
@@ -179,32 +177,6 @@ class TabContents : public PageNavigator,
return *favicon_helper_.get();
}
- // 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();
-
// Tab navigation state ------------------------------------------------------
// Returns the current navigation properties, which if a navigation is
@@ -303,9 +275,6 @@ class TabContents : public PageNavigator,
int crashed_error_code() const { return crashed_error_code_; }
void SetIsCrashed(base::TerminationStatus status, int error_code);
- // Call this after updating a page action to notify clients about the changes.
- void PageActionStateChanged();
-
// Whether the tab is in the process of being destroyed.
// Added as a tentative work-around for focus related bug #4633. This allows
// us not to store focus when a tab is being closed.
@@ -979,19 +948,6 @@ class TabContents : public PageNavigator,
const NotificationSource& source,
const NotificationDetails& details);
- // App extensions related methods:
-
- // Returns the first extension whose extent contains |url|.
- const Extension* GetExtensionContaining(const GURL& url);
-
- // 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);
-
// NetworkChangeNotifier::OnlineStateObserver:
virtual void OnOnlineStateChanged(bool online);
@@ -1116,18 +1072,6 @@ class TabContents : public PageNavigator,
// Delegates for InfoBars associated with this TabContents.
std::vector<InfoBarDelegate*> infobar_delegates_;
- // 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_;
-
// Data for misc internal state ----------------------------------------------
// See capturing_contents() above.
diff --git a/content/browser/webui/web_ui_factory.cc b/content/browser/webui/web_ui_factory.cc
index 63a8c8e..230911b 100644
--- a/content/browser/webui/web_ui_factory.cc
+++ b/content/browser/webui/web_ui_factory.cc
@@ -5,7 +5,6 @@
#include "content/browser/webui/web_ui_factory.h"
#include "content/browser/content_browser_client.h"
-#include "content/common/content_client.h"
namespace content {
diff --git a/content/common/notification_type.h b/content/common/notification_type.h
index 20edba4..b7d7fd2 100644
--- a/content/common/notification_type.h
+++ b/content/common/notification_type.h
@@ -399,7 +399,7 @@ class NotificationType {
TAB_CONTENTS_DESTROYED,
// This notification is sent when TabContents::SetAppExtension is invoked.
- // The source is the TabContents SetAppExtension was invoked on.
+ // The source is the ExtensionTabHelper SetAppExtension was invoked on.
TAB_CONTENTS_APPLICATION_EXTENSION_CHANGED,
// A RenderViewHost was created for a TabContents. The source is the