diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-04 15:49:08 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-04 15:49:08 +0000 |
commit | 36fb2c7c17069ad7b6d767e4c40b8ee29b762cf8 (patch) | |
tree | 2e87bed9b96d30210008b64fde9e90fe7d6a399d | |
parent | 2bd51de1a5ffc4514a11c3f18c7e2e5f1b92d728 (diff) | |
download | chromium_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
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 |