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