summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/automation/testing_automation_provider.cc6
-rw-r--r--chrome/browser/debugger/devtools_window.cc5
-rw-r--r--chrome/browser/extensions/extension_install_ui.cc4
-rw-r--r--chrome/browser/extensions/extension_install_ui_browsertest.cc21
-rw-r--r--chrome/browser/extensions/extension_service.cc3
-rw-r--r--chrome/browser/extensions/gtk_theme_installed_infobar_delegate.cc6
-rw-r--r--chrome/browser/extensions/theme_installed_infobar_delegate.cc10
-rw-r--r--chrome/browser/extensions/theme_installed_infobar_delegate.h4
-rw-r--r--chrome/browser/profiles/profile.cc24
-rw-r--r--chrome/browser/profiles/profile.h19
-rw-r--r--chrome/browser/profiles/profile_impl.cc58
-rw-r--r--chrome/browser/profiles/profile_impl.h8
-rw-r--r--chrome/browser/sync/glue/theme_change_processor.cc14
-rw-r--r--chrome/browser/sync/glue/theme_util.cc19
-rw-r--r--chrome/browser/sync/glue/theme_util_unittest.cc38
-rw-r--r--chrome/browser/themes/browser_theme_provider.h4
-rw-r--r--chrome/browser/themes/theme_service.cc109
-rw-r--r--chrome/browser/themes/theme_service.h59
-rw-r--r--chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm3
-rw-r--r--chrome/browser/ui/cocoa/browser_window_controller.mm3
-rw-r--r--chrome/browser/ui/cocoa/download/download_shelf_controller.mm5
-rw-r--r--chrome/browser/ui/gtk/gtk_theme_provider.cc4
-rw-r--r--chrome/browser/ui/gtk/gtk_theme_provider_unittest.cc1
-rw-r--r--chrome/browser/ui/gtk/tabs/dragged_tab_gtk.cc4
-rw-r--r--chrome/browser/ui/views/frame/browser_frame_gtk.cc4
-rw-r--r--chrome/browser/ui/views/frame/browser_frame_win.cc4
-rw-r--r--chrome/browser/ui/views/theme_background.cc4
-rw-r--r--chrome/browser/ui/webui/new_tab_ui.cc3
-rw-r--r--chrome/browser/ui/webui/ntp_resource_cache.cc8
-rw-r--r--chrome/browser/ui/webui/options/personal_options_handler.cc8
-rw-r--r--chrome/browser/ui/webui/theme_source.cc3
-rw-r--r--chrome/browser/ui/webui/theme_source_unittest.cc1
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/test/live_sync/live_themes_sync_test.cc23
-rw-r--r--chrome/test/live_sync/live_themes_sync_test.h8
-rw-r--r--chrome/test/live_sync/single_client_live_themes_sync_test.cc8
-rw-r--r--chrome/test/live_sync/two_client_live_themes_sync_test.cc16
-rw-r--r--chrome/test/testing_profile.cc31
-rw-r--r--chrome/test/testing_profile.h10
-rw-r--r--content/browser/webui/web_ui.cc3
40 files changed, 326 insertions, 241 deletions
diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc
index 30149aa3..81c0294 100644
--- a/chrome/browser/automation/testing_automation_provider.cc
+++ b/chrome/browser/automation/testing_automation_provider.cc
@@ -59,6 +59,8 @@
#include "chrome/browser/search_engines/template_url_model.h"
#include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
#include "chrome/browser/tab_contents/link_infobar_delegate.h"
+#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/translate/translate_infobar_delegate.h"
#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h"
@@ -3801,7 +3803,7 @@ void TestingAutomationProvider::GetThemeInfo(
DictionaryValue* args,
IPC::Message* reply_message) {
scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
- const Extension* theme = browser->profile()->GetTheme();
+ const Extension* theme = ThemeServiceFactory::GetThemeForProfile(profile());
if (theme) {
return_value->SetString("name", theme->name());
return_value->Set("images", theme->GetThemeImages()->DeepCopy());
@@ -5140,7 +5142,7 @@ void TestingAutomationProvider::LoadBlockedPlugins(int tab_handle,
}
void TestingAutomationProvider::ResetToDefaultTheme() {
- profile_->ClearTheme();
+ ThemeServiceFactory::GetForProfile(profile_)->UseDefaultTheme();
}
void TestingAutomationProvider::WaitForProcessLauncherThreadToGoIdle(
diff --git a/chrome/browser/debugger/devtools_window.cc b/chrome/browser/debugger/devtools_window.cc
index 5e4b324..0cabc18 100644
--- a/chrome/browser/debugger/devtools_window.cc
+++ b/chrome/browser/debugger/devtools_window.cc
@@ -18,6 +18,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tabs/tab_strip_model.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/common/bindings_policy.h"
@@ -377,7 +378,7 @@ std::string SkColorToRGBAString(SkColor color) {
}
GURL DevToolsWindow::GetDevToolsUrl() {
- BrowserThemeProvider* tp = profile_->GetThemeProvider();
+ BrowserThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_);
CHECK(tp);
SkColor color_toolbar =
@@ -395,7 +396,7 @@ GURL DevToolsWindow::GetDevToolsUrl() {
}
void DevToolsWindow::UpdateTheme() {
- BrowserThemeProvider* tp = profile_->GetThemeProvider();
+ BrowserThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_);
CHECK(tp);
SkColor color_toolbar =
diff --git a/chrome/browser/extensions/extension_install_ui.cc b/chrome/browser/extensions/extension_install_ui.cc
index f309429..cfe4925 100644
--- a/chrome/browser/extensions/extension_install_ui.cc
+++ b/chrome/browser/extensions/extension_install_ui.cc
@@ -19,6 +19,7 @@
#include "chrome/browser/platform_util.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/ui/browser.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/common/extensions/extension.h"
@@ -103,7 +104,8 @@ ExtensionInstallUI::ExtensionInstallUI(Profile* profile)
ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)) {
// Remember the current theme in case the user presses undo.
if (profile_) {
- const Extension* previous_theme = profile_->GetTheme();
+ const Extension* previous_theme =
+ ThemeServiceFactory::GetThemeForProfile(profile_);
if (previous_theme)
previous_theme_id_ = previous_theme->id();
#if defined(TOOLKIT_GTK)
diff --git a/chrome/browser/extensions/extension_install_ui_browsertest.cc b/chrome/browser/extensions/extension_install_ui_browsertest.cc
index 05eebdf..f353bb9 100644
--- a/chrome/browser/extensions/extension_install_ui_browsertest.cc
+++ b/chrome/browser/extensions/extension_install_ui_browsertest.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/extensions/theme_installed_infobar_delegate.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/test/ui_test_utils.h"
#include "content/browser/tab_contents/tab_contents.h"
@@ -29,6 +30,10 @@ class ExtensionInstallUIBrowserTest : public ExtensionBrowserTest {
delegate->Cancel();
ASSERT_EQ(0U, tab_contents->infobar_count());
}
+
+ const Extension* GetTheme() const {
+ return ThemeServiceFactory::GetThemeForProfile(browser()->profile());
+ }
};
IN_PROC_BROWSER_TEST_F(ExtensionInstallUIBrowserTest,
@@ -36,26 +41,26 @@ IN_PROC_BROWSER_TEST_F(ExtensionInstallUIBrowserTest,
// Install theme once and undo to verify we go back to default theme.
FilePath theme_crx = PackExtension(test_data_dir_.AppendASCII("theme"));
ASSERT_TRUE(InstallExtensionWithUI(theme_crx, 1));
- const Extension* theme = browser()->profile()->GetTheme();
+ const Extension* theme = GetTheme();
ASSERT_TRUE(theme);
std::string theme_id = theme->id();
VerifyThemeInfoBarAndUndoInstall();
- ASSERT_EQ(NULL, browser()->profile()->GetTheme());
+ ASSERT_EQ(NULL, GetTheme());
// Set the same theme twice and undo to verify we go back to default theme.
// We set the |expected_change| to zero in these 'InstallExtensionWithUI'
// calls since the theme has already been installed above and this is an
// overinstall to set the active theme.
ASSERT_TRUE(InstallExtensionWithUI(theme_crx, 0));
- theme = browser()->profile()->GetTheme();
+ theme = GetTheme();
ASSERT_TRUE(theme);
ASSERT_EQ(theme_id, theme->id());
ASSERT_TRUE(InstallExtensionWithUI(theme_crx, 0));
- theme = browser()->profile()->GetTheme();
+ theme = GetTheme();
ASSERT_TRUE(theme);
ASSERT_EQ(theme_id, theme->id());
VerifyThemeInfoBarAndUndoInstall();
- ASSERT_EQ(NULL, browser()->profile()->GetTheme());
+ ASSERT_EQ(NULL, GetTheme());
}
IN_PROC_BROWSER_TEST_F(ExtensionInstallUIBrowserTest,
@@ -63,20 +68,20 @@ IN_PROC_BROWSER_TEST_F(ExtensionInstallUIBrowserTest,
// Install first theme.
FilePath theme_path = test_data_dir_.AppendASCII("theme");
ASSERT_TRUE(InstallExtensionWithUI(theme_path, 1));
- const Extension* theme = browser()->profile()->GetTheme();
+ const Extension* theme = GetTheme();
ASSERT_TRUE(theme);
std::string theme_id = theme->id();
// Then install second theme.
FilePath theme_path2 = test_data_dir_.AppendASCII("theme2");
ASSERT_TRUE(InstallExtensionWithUI(theme_path2, 1));
- const Extension* theme2 = browser()->profile()->GetTheme();
+ const Extension* theme2 = GetTheme();
ASSERT_TRUE(theme2);
EXPECT_FALSE(theme_id == theme2->id());
// Undo second theme will revert to first theme.
VerifyThemeInfoBarAndUndoInstall();
- EXPECT_EQ(theme, browser()->profile()->GetTheme());
+ EXPECT_EQ(theme, GetTheme());
}
IN_PROC_BROWSER_TEST_F(ExtensionInstallUIBrowserTest,
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 4b19b42..aebbcad 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -48,6 +48,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search_engines/template_url_model.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/webui/shown_sections_handler.h"
#include "chrome/common/child_process_logging.h"
#include "chrome/common/chrome_switches.h"
@@ -1350,7 +1351,7 @@ void ExtensionService::GarbageCollectExtensions() {
// defensive; in the future, we may call GarbageCollectExtensions()
// from somewhere other than Init() (e.g., in a timer).
if (profile_) {
- profile_->GetThemeProvider()->RemoveUnusedThemes();
+ ThemeServiceFactory::GetForProfile(profile_)->RemoveUnusedThemes();
}
}
diff --git a/chrome/browser/extensions/gtk_theme_installed_infobar_delegate.cc b/chrome/browser/extensions/gtk_theme_installed_infobar_delegate.cc
index cd2f123..79f2d64 100644
--- a/chrome/browser/extensions/gtk_theme_installed_infobar_delegate.cc
+++ b/chrome/browser/extensions/gtk_theme_installed_infobar_delegate.cc
@@ -1,10 +1,10 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// 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/gtk_theme_installed_infobar_delegate.h"
-#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/themes/browser_theme_provider.h"
GtkThemeInstalledInfoBarDelegate::GtkThemeInstalledInfoBarDelegate(
TabContents* tab_contents,
@@ -17,7 +17,7 @@ GtkThemeInstalledInfoBarDelegate::GtkThemeInstalledInfoBarDelegate(
bool GtkThemeInstalledInfoBarDelegate::Cancel() {
if (previous_use_gtk_theme_) {
- profile()->SetNativeTheme();
+ provider()->SetNativeTheme();
return true;
} else {
return ThemeInstalledInfoBarDelegate::Cancel();
diff --git a/chrome/browser/extensions/theme_installed_infobar_delegate.cc b/chrome/browser/extensions/theme_installed_infobar_delegate.cc
index ea27cd9..c76f494 100644
--- a/chrome/browser/extensions/theme_installed_infobar_delegate.cc
+++ b/chrome/browser/extensions/theme_installed_infobar_delegate.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/common/extensions/extension.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "content/common/notification_service.h"
@@ -24,11 +25,12 @@ ThemeInstalledInfoBarDelegate::ThemeInstalledInfoBarDelegate(
const std::string& previous_theme_id)
: ConfirmInfoBarDelegate(tab_contents),
profile_(tab_contents->profile()),
+ provider_(ThemeServiceFactory::GetForProfile(profile_)),
name_(new_theme->name()),
theme_id_(new_theme->id()),
previous_theme_id_(previous_theme_id),
tab_contents_(tab_contents) {
- profile_->GetThemeProvider()->OnInfobarDisplayed();
+ provider_->OnInfobarDisplayed();
registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED,
NotificationService::AllSources());
}
@@ -41,7 +43,7 @@ ThemeInstalledInfoBarDelegate::~ThemeInstalledInfoBarDelegate() {
// We don't want any notifications while we're running our destructor.
registrar_.RemoveAll();
- profile_->GetThemeProvider()->OnInfobarDestroyed();
+ provider_->OnInfobarDestroyed();
}
bool ThemeInstalledInfoBarDelegate::Cancel() {
@@ -51,13 +53,13 @@ bool ThemeInstalledInfoBarDelegate::Cancel() {
const Extension* previous_theme =
service->GetExtensionById(previous_theme_id_, true);
if (previous_theme) {
- profile_->SetTheme(previous_theme);
+ provider_->SetTheme(previous_theme);
return true;
}
}
}
- profile_->ClearTheme();
+ provider_->UseDefaultTheme();
return true;
}
diff --git a/chrome/browser/extensions/theme_installed_infobar_delegate.h b/chrome/browser/extensions/theme_installed_infobar_delegate.h
index d3eaeb6..1288a55 100644
--- a/chrome/browser/extensions/theme_installed_infobar_delegate.h
+++ b/chrome/browser/extensions/theme_installed_infobar_delegate.h
@@ -9,6 +9,7 @@
#include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
#include "content/common/notification_registrar.h"
+class BrowserThemeProvider;
class Extension;
class SkBitmap;
class TabContents;
@@ -29,7 +30,7 @@ class ThemeInstalledInfoBarDelegate : public ConfirmInfoBarDelegate,
protected:
virtual ~ThemeInstalledInfoBarDelegate();
- Profile* profile() { return profile_; }
+ BrowserThemeProvider* provider() { return provider_; }
// ConfirmInfoBarDelegate:
virtual bool Cancel();
@@ -49,6 +50,7 @@ class ThemeInstalledInfoBarDelegate : public ConfirmInfoBarDelegate,
const NotificationDetails& details);
Profile* profile_;
+ BrowserThemeProvider* provider_;
// Name of theme that's just been installed.
std::string name_;
diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profile.cc
index 2902aad..74c4222 100644
--- a/chrome/browser/profiles/profile.cc
+++ b/chrome/browser/profiles/profile.cc
@@ -397,30 +397,6 @@ class OffTheRecordProfileImpl : public Profile,
return file_system_context_.get();
}
- virtual void InitThemes() {
- profile_->InitThemes();
- }
-
- virtual void SetTheme(const Extension* extension) {
- profile_->SetTheme(extension);
- }
-
- virtual void SetNativeTheme() {
- profile_->SetNativeTheme();
- }
-
- virtual void ClearTheme() {
- profile_->ClearTheme();
- }
-
- virtual const Extension* GetTheme() {
- return profile_->GetTheme();
- }
-
- virtual BrowserThemeProvider* GetThemeProvider() {
- return profile_->GetThemeProvider();
- }
-
virtual URLRequestContextGetter* GetRequestContext() {
return io_data_.GetMainRequestContextGetter();
}
diff --git a/chrome/browser/profiles/profile.h b/chrome/browser/profiles/profile.h
index 236e0e5..35f8e5488 100644
--- a/chrome/browser/profiles/profile.h
+++ b/chrome/browser/profiles/profile.h
@@ -315,25 +315,6 @@ class Profile {
// Returns the BrowserSignin object assigned to this profile.
virtual BrowserSignin* GetBrowserSignin() = 0;
- // Init our themes system.
- virtual void InitThemes() = 0;
-
- // Set the theme to the specified extension.
- virtual void SetTheme(const Extension* extension) = 0;
-
- // Set the theme to the machine's native theme.
- virtual void SetNativeTheme() = 0;
-
- // Clear the theme and reset it to default.
- virtual void ClearTheme() = 0;
-
- // Gets the theme that was last set. Returns NULL if the theme is no longer
- // installed, if there is no installed theme, or the theme was cleared.
- virtual const Extension* GetTheme() = 0;
-
- // Returns or creates the ThemeProvider associated with this profile
- virtual BrowserThemeProvider* GetThemeProvider() = 0;
-
// Returns the request context information associated with this profile. Call
// this only on the UI thread, since it can send notifications that should
// happen on the UI thread.
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index e052ecd..28eb99a 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -100,10 +100,6 @@
#include "ui/base/resource/resource_bundle.h"
#include "webkit/database/database_tracker.h"
-#if defined(TOOLKIT_USES_GTK)
-#include "chrome/browser/ui/gtk/gtk_theme_provider.h"
-#endif
-
#if defined(OS_WIN)
#include "chrome/browser/instant/promo_counter.h"
#include "chrome/browser/password_manager/password_store_win.h"
@@ -256,7 +252,6 @@ ProfileImpl::ProfileImpl(const FilePath& path)
created_web_data_service_(false),
created_password_store_(false),
created_download_manager_(false),
- created_theme_provider_(false),
start_time_(Time::Now()),
spellcheck_host_(NULL),
spellcheck_host_ready_(false),
@@ -283,10 +278,6 @@ ProfileImpl::ProfileImpl(const FilePath& path)
chrome::GetUserCacheDirectory(path_, &base_cache_path_);
file_util::CreateDirectory(base_cache_path_);
- // Listen for theme installations from our original profile.
- registrar_.Add(this, NotificationType::THEME_INSTALLED,
- Source<Profile>(GetOriginalProfile()));
-
#if !defined(OS_CHROMEOS)
// Listen for bookmark model load, to bootstrap the sync service.
// On CrOS sync service will be initialized after sign in.
@@ -553,9 +544,6 @@ ProfileImpl::~ProfileImpl() {
download_manager_ = NULL;
}
- // The theme provider provides bitmaps to whoever wants them.
- theme_provider_.reset();
-
// Remove pref observers
pref_change_registrar_.RemoveAll();
@@ -1104,48 +1092,6 @@ fileapi::FileSystemContext* ProfileImpl::GetFileSystemContext() {
return file_system_context_.get();
}
-void ProfileImpl::InitThemes() {
- if (!created_theme_provider_) {
-#if defined(TOOLKIT_USES_GTK)
- theme_provider_.reset(new GtkThemeProvider);
-#else
- theme_provider_.reset(new BrowserThemeProvider);
-#endif
- theme_provider_->Init(this);
- created_theme_provider_ = true;
- }
-}
-
-void ProfileImpl::SetTheme(const Extension* extension) {
- InitThemes();
- theme_provider_.get()->SetTheme(extension);
-}
-
-void ProfileImpl::SetNativeTheme() {
- InitThemes();
- theme_provider_.get()->SetNativeTheme();
-}
-
-void ProfileImpl::ClearTheme() {
- InitThemes();
- theme_provider_.get()->UseDefaultTheme();
-}
-
-const Extension* ProfileImpl::GetTheme() {
- InitThemes();
-
- std::string id = theme_provider_.get()->GetThemeID();
- if (id == BrowserThemeProvider::kDefaultThemeID)
- return NULL;
-
- return extensions_service_->GetExtensionById(id, false);
-}
-
-BrowserThemeProvider* ProfileImpl::GetThemeProvider() {
- InitThemes();
- return theme_provider_.get();
-}
-
SessionService* ProfileImpl::GetSessionService() {
if (!session_service_.get() && !shutdown_session_service_) {
session_service_ = new SessionService(this);
@@ -1327,10 +1273,6 @@ void ProfileImpl::Observe(NotificationType type,
clear_local_state_on_exit_);
}
}
- } else if (NotificationType::THEME_INSTALLED == type) {
- DCHECK_EQ(Source<Profile>(source).ptr(), GetOriginalProfile());
- const Extension* extension = Details<const Extension>(details).ptr();
- SetTheme(extension);
} else if (NotificationType::BOOKMARK_MODEL_LOADED == type) {
GetProfileSyncService(); // Causes lazy-load if sync is enabled.
registrar_.Remove(this, NotificationType::BOOKMARK_MODEL_LOADED,
diff --git a/chrome/browser/profiles/profile_impl.h b/chrome/browser/profiles/profile_impl.h
index 9f6914d..4a88d4f 100644
--- a/chrome/browser/profiles/profile_impl.h
+++ b/chrome/browser/profiles/profile_impl.h
@@ -79,12 +79,6 @@ class ProfileImpl : public Profile,
virtual DownloadManager* GetDownloadManager();
virtual PersonalDataManager* GetPersonalDataManager();
virtual fileapi::FileSystemContext* GetFileSystemContext();
- virtual void InitThemes();
- virtual void SetTheme(const Extension* extension);
- virtual void SetNativeTheme();
- virtual void ClearTheme();
- virtual const Extension* GetTheme();
- virtual BrowserThemeProvider* GetThemeProvider();
virtual bool HasCreatedDownloadManager() const;
virtual URLRequestContextGetter* GetRequestContext();
virtual URLRequestContextGetter* GetRequestContextForPossibleApp(
@@ -246,7 +240,6 @@ class ProfileImpl : public Profile,
scoped_refptr<WebDataService> web_data_service_;
scoped_refptr<PasswordStore> password_store_;
scoped_refptr<SessionService> session_service_;
- scoped_ptr<BrowserThemeProvider> theme_provider_;
scoped_refptr<WebKitContext> webkit_context_;
scoped_ptr<DesktopNotificationService> desktop_notification_service_;
scoped_ptr<BackgroundContentsService> background_contents_service_;
@@ -261,7 +254,6 @@ class ProfileImpl : public Profile,
bool created_web_data_service_;
bool created_password_store_;
bool created_download_manager_;
- bool created_theme_provider_;
bool clear_local_state_on_exit_;
// Whether or not the last session exited cleanly. This is set only once.
bool last_session_exited_cleanly_;
diff --git a/chrome/browser/sync/glue/theme_change_processor.cc b/chrome/browser/sync/glue/theme_change_processor.cc
index 4f4013e..53b20c7 100644
--- a/chrome/browser/sync/glue/theme_change_processor.cc
+++ b/chrome/browser/sync/glue/theme_change_processor.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/sync/glue/theme_util.h"
#include "chrome/browser/sync/protocol/theme_specifics.pb.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/common/extensions/extension.h"
#include "content/common/notification_details.h"
#include "content/common/notification_source.h"
@@ -45,9 +46,11 @@ void ThemeChangeProcessor::Observe(NotificationType type,
} else {
extension = Details<const Extension>(details).ptr();
}
- std::string current_or_future_theme_id =
- profile_->GetThemeProvider()->GetThemeID();
- const Extension* current_theme = profile_->GetTheme();
+ BrowserThemeProvider* theme_provider =
+ ThemeServiceFactory::GetForProfile(profile_);
+ std::string current_or_future_theme_id = theme_provider->GetThemeID();
+ const Extension* current_theme =
+ ThemeServiceFactory::GetThemeForProfile(profile_);
switch (type.value) {
case NotificationType::BROWSER_THEME_CHANGED:
// We pay attention to this notification only when it signifies
@@ -59,7 +62,7 @@ void ThemeChangeProcessor::Observe(NotificationType type,
VLOG(1) << "Got BROWSER_THEME_CHANGED notification for theme "
<< GetThemeId(extension);
DCHECK_EQ(Source<BrowserThemeProvider>(source).ptr(),
- profile_->GetThemeProvider());
+ theme_provider);
if (extension != NULL) {
DCHECK(extension->is_theme());
DCHECK_EQ(extension->id(), current_or_future_theme_id);
@@ -202,7 +205,8 @@ void ThemeChangeProcessor::StartObserving() {
"EXTENSION_UNLOADED";
notification_registrar_.Add(
this, NotificationType::BROWSER_THEME_CHANGED,
- Source<BrowserThemeProvider>(profile_->GetThemeProvider()));
+ Source<BrowserThemeProvider>(
+ ThemeServiceFactory::GetForProfile(profile_)));
notification_registrar_.Add(
this, NotificationType::EXTENSION_LOADED,
Source<Profile>(profile_));
diff --git a/chrome/browser/sync/glue/theme_util.cc b/chrome/browser/sync/glue/theme_util.cc
index 2e91f02..306c9a7 100644
--- a/chrome/browser/sync/glue/theme_util.cc
+++ b/chrome/browser/sync/glue/theme_util.cc
@@ -16,6 +16,8 @@
#endif
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sync/protocol/theme_specifics.pb.h"
+#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_constants.h"
#include "googleurl/src/gurl.h"
@@ -113,7 +115,8 @@ void SetCurrentThemeFromThemeSpecifics(
// Get previous theme info before we set the new theme.
std::string previous_theme_id;
{
- const Extension* current_theme = profile->GetTheme();
+ const Extension* current_theme =
+ ThemeServiceFactory::GetThemeForProfile(profile);
if (current_theme) {
DCHECK(current_theme->is_theme());
previous_theme_id = current_theme->id();
@@ -122,7 +125,7 @@ void SetCurrentThemeFromThemeSpecifics(
bool previous_use_system_theme = UseSystemTheme(profile);
// An enabled theme extension with the given id was found, so
// just set the current theme to it.
- profile->SetTheme(extension);
+ ThemeServiceFactory::GetForProfile(profile)->SetTheme(extension);
// Pretend the theme was just installed.
ExtensionInstallUI::ShowThemeInfoBar(
previous_theme_id, previous_use_system_theme,
@@ -151,17 +154,18 @@ void SetCurrentThemeFromThemeSpecifics(
extension_updater->CheckNow();
}
} else if (theme_specifics.use_system_theme_by_default()) {
- profile->SetNativeTheme();
+ ThemeServiceFactory::GetForProfile(profile)->SetNativeTheme();
} else {
- profile->ClearTheme();
+ ThemeServiceFactory::GetForProfile(profile)->UseDefaultTheme();
}
}
bool UpdateThemeSpecificsOrSetCurrentThemeIfNecessary(
Profile* profile, sync_pb::ThemeSpecifics* theme_specifics) {
if (!theme_specifics->use_custom_theme() &&
- (profile->GetTheme() || (UseSystemTheme(profile) &&
- IsSystemThemeDistinctFromDefaultTheme()))) {
+ (ThemeServiceFactory::GetThemeForProfile(profile) ||
+ (UseSystemTheme(profile) &&
+ IsSystemThemeDistinctFromDefaultTheme()))) {
GetThemeSpecificsFromCurrentTheme(profile, theme_specifics);
return true;
} else {
@@ -174,7 +178,8 @@ void GetThemeSpecificsFromCurrentTheme(
Profile* profile,
sync_pb::ThemeSpecifics* theme_specifics) {
DCHECK(profile);
- const Extension* current_theme = profile->GetTheme();
+ const Extension* current_theme =
+ ThemeServiceFactory::GetThemeForProfile(profile);
if (current_theme) {
DCHECK(current_theme->is_theme());
}
diff --git a/chrome/browser/sync/glue/theme_util_unittest.cc b/chrome/browser/sync/glue/theme_util_unittest.cc
index dfa3ea3..119c4ba 100644
--- a/chrome/browser/sync/glue/theme_util_unittest.cc
+++ b/chrome/browser/sync/glue/theme_util_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// 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.
@@ -8,6 +8,8 @@
#include "base/values.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sync/protocol/theme_specifics.pb.h"
+#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_constants.h"
#include "chrome/test/testing_profile.h"
@@ -88,30 +90,35 @@ TEST_F(ThemeUtilTest, AreThemeSpecificsEqualHelper) {
EXPECT_TRUE(AreThemeSpecificsEqualHelper(a, b, true));
}
-class MockProfile : public TestingProfile {
+class MockBrowserThemeProvider : public BrowserThemeProvider {
public:
MOCK_METHOD0(SetNativeTheme, void());
- MOCK_METHOD0(ClearTheme, void());
- MOCK_METHOD0(GetTheme, Extension*());
+ MOCK_METHOD0(UseDefaultTheme, void());
+ MOCK_CONST_METHOD0(GetThemeID, std::string());
};
TEST_F(ThemeUtilTest, SetCurrentThemeDefaultTheme) {
sync_pb::ThemeSpecifics theme_specifics;
+ TestingProfile profile;
+ MockBrowserThemeProvider* mock_provider = new MockBrowserThemeProvider;
+ ThemeServiceFactory::ForceAssociationBetween(&profile, mock_provider);
- MockProfile mock_profile;
- EXPECT_CALL(mock_profile, ClearTheme()).Times(1);
+ EXPECT_CALL(*mock_provider, UseDefaultTheme()).Times(1);
- SetCurrentThemeFromThemeSpecifics(theme_specifics, &mock_profile);
+ SetCurrentThemeFromThemeSpecifics(theme_specifics, &profile);
}
TEST_F(ThemeUtilTest, SetCurrentThemeSystemTheme) {
sync_pb::ThemeSpecifics theme_specifics;
theme_specifics.set_use_system_theme_by_default(true);
- MockProfile mock_profile;
- EXPECT_CALL(mock_profile, SetNativeTheme()).Times(1);
+ TestingProfile profile;
+ MockBrowserThemeProvider* mock_provider = new MockBrowserThemeProvider;
+ ThemeServiceFactory::ForceAssociationBetween(&profile, mock_provider);
- SetCurrentThemeFromThemeSpecifics(theme_specifics, &mock_profile);
+ EXPECT_CALL(*mock_provider, SetNativeTheme()).Times(1);
+
+ SetCurrentThemeFromThemeSpecifics(theme_specifics, &profile);
}
// TODO(akalin): Make ExtensionService/ExtensionUpdater testable
@@ -205,15 +212,18 @@ TEST_F(ThemeUtilTest, GetThemeSpecificsHelperCustomThemeDistinct) {
}
TEST_F(ThemeUtilTest, SetCurrentThemeIfNecessaryDefaultThemeNotNecessary) {
- MockProfile mock_profile;
- Extension* extension = NULL;
- EXPECT_CALL(mock_profile, GetTheme()).WillOnce(Return(extension));
+ TestingProfile profile;
+ MockBrowserThemeProvider* mock_provider = new MockBrowserThemeProvider;
+ ThemeServiceFactory::ForceAssociationBetween(&profile, mock_provider);
+
+ EXPECT_CALL(*mock_provider, GetThemeID()).WillRepeatedly(Return(
+ BrowserThemeProvider::kDefaultThemeID));
// TODO(akalin): Mock out call to GetPrefs() under TOOLKIT_USES_GTK.
sync_pb::ThemeSpecifics theme_specifics;
SetCurrentThemeFromThemeSpecificsIfNecessary(theme_specifics,
- &mock_profile);
+ &profile);
}
} // namespace
diff --git a/chrome/browser/themes/browser_theme_provider.h b/chrome/browser/themes/browser_theme_provider.h
index fe65a7d..92a5c57 100644
--- a/chrome/browser/themes/browser_theme_provider.h
+++ b/chrome/browser/themes/browser_theme_provider.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// 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.
@@ -171,7 +171,7 @@ class BrowserThemeProvider : public base::NonThreadSafe,
// Gets the id of the last installed theme. (The theme may have been further
// locally customized.)
- std::string GetThemeID() const;
+ virtual std::string GetThemeID() const;
// This class needs to keep track of the number of theme infobars so that we
// clean up unused themes.
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc
new file mode 100644
index 0000000..eae2b76
--- /dev/null
+++ b/chrome/browser/themes/theme_service.cc
@@ -0,0 +1,109 @@
+// 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/themes/theme_service.h"
+
+#include "base/logging.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/themes/browser_theme_provider.h"
+#include "content/common/notification_service.h"
+
+#if defined(TOOLKIT_USES_GTK)
+#include "chrome/browser/ui/gtk/gtk_theme_provider.h"
+#endif
+
+// static
+BrowserThemeProvider* ThemeServiceFactory::GetForProfile(Profile* top_profile) {
+ // We may be asked for the Theme of an incognito profile. Make sure we're
+ // operating on the real profile.
+ Profile* profile = top_profile->GetOriginalProfile();
+
+ ThemeServiceFactory* service = GetInstance();
+
+ std::map<Profile*, BrowserThemeProvider*>::const_iterator it =
+ service->mapping_.find(profile);
+ if (it != service->mapping_.end())
+ return it->second;
+
+ BrowserThemeProvider* provider = NULL;
+#if defined(TOOLKIT_USES_GTK)
+ provider = new GtkThemeProvider;
+#else
+ provider = new BrowserThemeProvider;
+#endif
+ provider->Init(profile);
+
+ service->Associate(profile, provider);
+ return provider;
+}
+
+const Extension* ThemeServiceFactory::GetThemeForProfile(Profile* profile) {
+ std::string id = GetForProfile(profile)->GetThemeID();
+ if (id == BrowserThemeProvider::kDefaultThemeID)
+ return NULL;
+
+ return profile->GetExtensionService()->GetExtensionById(id, false);
+}
+
+void ThemeServiceFactory::ForceAssociationBetween(Profile* top_profile,
+ BrowserThemeProvider* provider) {
+ ThemeServiceFactory* service = GetInstance();
+ Profile* profile = top_profile->GetOriginalProfile();
+
+ service->Associate(profile, provider);
+}
+
+ThemeServiceFactory* ThemeServiceFactory::GetInstance() {
+ return Singleton<ThemeServiceFactory>::get();
+}
+
+ThemeServiceFactory::ThemeServiceFactory() {}
+
+ThemeServiceFactory::~ThemeServiceFactory() {
+ DCHECK(mapping_.empty());
+}
+
+void ThemeServiceFactory::Associate(Profile* profile,
+ BrowserThemeProvider* provider) {
+ DCHECK(mapping_.find(profile) == mapping_.end());
+ mapping_.insert(std::make_pair(profile, provider));
+
+ registrar_.Add(this,
+ NotificationType::PROFILE_DESTROYED,
+ Source<Profile>(profile));
+ registrar_.Add(this,
+ NotificationType::THEME_INSTALLED,
+ Source<Profile>(profile));
+}
+
+void ThemeServiceFactory::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ std::map<Profile*, BrowserThemeProvider*>::iterator it =
+ mapping_.find(Source<Profile>(source).ptr());
+ DCHECK(it != mapping_.end());
+
+ if (NotificationType::PROFILE_DESTROYED == type) {
+ delete it->second;
+ mapping_.erase(it);
+
+ // Remove ourselves from listening to all notifications because the source
+ // profile has been deleted. We have to do this because several unit tests
+ // are set up so a Profile is on the same place on the stack multiple
+ // times, so while they are different instances, they have the same
+ // addresses.
+ registrar_.Remove(this,
+ NotificationType::PROFILE_DESTROYED,
+ source);
+ registrar_.Remove(this,
+ NotificationType::THEME_INSTALLED,
+ source);
+ } else if (NotificationType::THEME_INSTALLED == type) {
+ const Extension* extension = Details<const Extension>(details).ptr();
+ it->second->SetTheme(extension);
+ } else {
+ NOTREACHED();
+ }
+}
diff --git a/chrome/browser/themes/theme_service.h b/chrome/browser/themes/theme_service.h
new file mode 100644
index 0000000..44abcc2
--- /dev/null
+++ b/chrome/browser/themes/theme_service.h
@@ -0,0 +1,59 @@
+// 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_THEMES_THEME_SERVICE_H_
+#define CHROME_BROWSER_THEMES_THEME_SERVICE_H_
+
+#include <map>
+
+#include "base/singleton.h"
+#include "content/common/notification_observer.h"
+#include "content/common/notification_registrar.h"
+
+class BrowserThemeProvider;
+class Extension;
+class Profile;
+
+// Singleton that owns all BrowserThemeProviders and associates them with
+// Profiles. Listens for the Profile's destruction notification and cleans up
+// the associated BrowserThemeProvider.
+class ThemeServiceFactory : public NotificationObserver {
+ public:
+ // Returns the BrowserThemeProvider that provides theming resources for
+ // |profile|. Note that even if a Profile doesn't have a theme installed, it
+ // still needs a BrowserThemeProvider to hand back the default theme images.
+ static BrowserThemeProvider* GetForProfile(Profile* profile);
+
+ // Returns the Extension that implements the theme associated with
+ // |profile|. Returns NULL if the theme is no longer installed, if there is
+ // no installed theme, or the theme was cleared.
+ static const Extension* GetThemeForProfile(Profile* profile);
+
+ // Forces an association between |profile| and |provider|. Used in unit tests
+ // where we need to mock BrowserThemeProvider.
+ static void ForceAssociationBetween(Profile* profile,
+ BrowserThemeProvider* provider);
+
+ static ThemeServiceFactory* GetInstance();
+
+ private:
+ friend struct DefaultSingletonTraits<ThemeServiceFactory>;
+
+ ThemeServiceFactory();
+ ~ThemeServiceFactory();
+
+ // Maps |profile| to |provider| and listens for notifications relating to
+ // either.
+ void Associate(Profile* profile, BrowserThemeProvider* provider);
+
+ // NotificationObserver:
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details);
+
+ NotificationRegistrar registrar_;
+ std::map<Profile*, BrowserThemeProvider*> mapping_;
+};
+
+#endif // CHROME_BROWSER_THEMES_THEME_SERVICE_H_
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
index 787e8fc..594a8bf 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm
@@ -15,6 +15,7 @@
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#import "chrome/browser/themes/browser_theme_provider.h"
+#import "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
#import "chrome/browser/ui/cocoa/background_gradient_view.h"
@@ -2065,7 +2066,7 @@ static BOOL ValueInRangeInclusive(CGFloat low, CGFloat value, CGFloat high) {
}
- (ui::ThemeProvider*)themeProvider {
- return browser_->profile()->GetThemeProvider();
+ return ThemeServiceFactory::GetForProfile(browser_->profile());
}
#pragma mark BookmarkButtonDelegate Protocol
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.mm b/chrome/browser/ui/cocoa/browser_window_controller.mm
index c851c17..f01a883 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller.mm
@@ -20,6 +20,7 @@
#include "chrome/browser/tab_contents/tab_contents_view_mac.h"
#include "chrome/browser/tabs/tab_strip_model.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
#import "chrome/browser/ui/cocoa/background_gradient_view.h"
@@ -1525,7 +1526,7 @@ enum {
}
- (ui::ThemeProvider*)themeProvider {
- return browser_->profile()->GetThemeProvider();
+ return ThemeServiceFactory::GetForProfile(browser_->profile());
}
- (ThemedWindowStyle)themedWindowStyle {
diff --git a/chrome/browser/ui/cocoa/download/download_shelf_controller.mm b/chrome/browser/ui/cocoa/download/download_shelf_controller.mm
index 26d00fc..2c82d67 100644
--- a/chrome/browser/ui/cocoa/download/download_shelf_controller.mm
+++ b/chrome/browser/ui/cocoa/download/download_shelf_controller.mm
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// 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.
@@ -10,6 +10,7 @@
#include "chrome/browser/download/download_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/browser.h"
#import "chrome/browser/ui/cocoa/animatable_view.h"
#include "chrome/browser/ui/cocoa/browser_window_cocoa.h"
@@ -163,7 +164,7 @@ const NSTimeInterval kAutoCloseDelaySeconds = 5;
if (bridge_.get() && bridge_->browser() && bridge_->browser()->profile()) {
ui::ThemeProvider* provider =
- bridge_->browser()->profile()->GetThemeProvider();
+ ThemeServiceFactory::GetForProfile(bridge_->browser()->profile());
color =
provider->GetNSColor(BrowserThemeProvider::COLOR_BOOKMARK_TEXT, false);
diff --git a/chrome/browser/ui/gtk/gtk_theme_provider.cc b/chrome/browser/ui/gtk/gtk_theme_provider.cc
index 88394db..7247515 100644
--- a/chrome/browser/ui/gtk/gtk_theme_provider.cc
+++ b/chrome/browser/ui/gtk/gtk_theme_provider.cc
@@ -17,6 +17,7 @@
#include "chrome/browser/metrics/user_metrics.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/gtk/cairo_cached_surface.h"
#include "chrome/browser/ui/gtk/chrome_gtk_frame.h"
#include "chrome/browser/ui/gtk/gtk_chrome_button.h"
@@ -247,7 +248,8 @@ GdkPixbuf* GtkThemeProvider::default_bookmark_icon_ = NULL;
// static
GtkThemeProvider* GtkThemeProvider::GetFrom(Profile* profile) {
- return static_cast<GtkThemeProvider*>(profile->GetThemeProvider());
+ return static_cast<GtkThemeProvider*>(
+ ThemeServiceFactory::GetForProfile(profile));
}
GtkThemeProvider::GtkThemeProvider()
diff --git a/chrome/browser/ui/gtk/gtk_theme_provider_unittest.cc b/chrome/browser/ui/gtk/gtk_theme_provider_unittest.cc
index 30ad5ff..28d2fab 100644
--- a/chrome/browser/ui/gtk/gtk_theme_provider_unittest.cc
+++ b/chrome/browser/ui/gtk/gtk_theme_provider_unittest.cc
@@ -32,7 +32,6 @@ class GtkThemeProviderTest : public testing::Test {
}
void BuildProvider() {
- profile_.InitThemes();
provider_ = GtkThemeProvider::GetFrom(&profile_);
}
diff --git a/chrome/browser/ui/gtk/tabs/dragged_tab_gtk.cc b/chrome/browser/ui/gtk/tabs/dragged_tab_gtk.cc
index 9b50a43..a557fe3 100644
--- a/chrome/browser/ui/gtk/tabs/dragged_tab_gtk.cc
+++ b/chrome/browser/ui/gtk/tabs/dragged_tab_gtk.cc
@@ -12,6 +12,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tabs/tab_strip_model.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/gtk/gtk_util.h"
#include "chrome/browser/ui/gtk/tabs/tab_renderer_gtk.h"
#include "content/browser/renderer_host/backing_store_x.h"
@@ -48,7 +49,8 @@ DraggedTabGtk::DraggedTabGtk(TabContents* datasource,
const gfx::Size& contents_size,
bool mini)
: data_source_(datasource),
- renderer_(new TabRendererGtk(datasource->profile()->GetThemeProvider())),
+ renderer_(new TabRendererGtk(ThemeServiceFactory::GetForProfile(
+ datasource->profile()))),
attached_(false),
mouse_tab_offset_(mouse_tab_offset),
attached_tab_size_(TabRendererGtk::GetMinimumSelectedSize()),
diff --git a/chrome/browser/ui/views/frame/browser_frame_gtk.cc b/chrome/browser/ui/views/frame/browser_frame_gtk.cc
index c56e0fc..a742cc8 100644
--- a/chrome/browser/ui/views/frame/browser_frame_gtk.cc
+++ b/chrome/browser/ui/views/frame/browser_frame_gtk.cc
@@ -7,6 +7,7 @@
#include "base/logging.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/status_bubble.h"
#include "chrome/browser/ui/views/frame/app_panel_browser_frame_view.h"
#include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
@@ -92,7 +93,8 @@ void BrowserFrameGtk::TabStripDisplayModeChanged() {
// BrowserFrameGtk, WindowGtk overrides :
ThemeProvider* BrowserFrameGtk::GetThemeProvider() const {
- return browser_view_->browser()->profile()->GetThemeProvider();
+ return ThemeServiceFactory::GetForProfile(
+ browser_view_->browser()->profile());
}
void BrowserFrameGtk::SetInitialFocus() {
diff --git a/chrome/browser/ui/views/frame/browser_frame_win.cc b/chrome/browser/ui/views/frame/browser_frame_win.cc
index 831a9c3..2bb3e75 100644
--- a/chrome/browser/ui/views/frame/browser_frame_win.cc
+++ b/chrome/browser/ui/views/frame/browser_frame_win.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/frame/glass_browser_frame_view.h"
@@ -133,7 +134,8 @@ void BrowserFrameWin::OnWindowPosChanged(WINDOWPOS* window_pos) {
}
ThemeProvider* BrowserFrameWin::GetThemeProvider() const {
- return browser_view_->browser()->profile()->GetThemeProvider();
+ return ThemeServiceFactory::GetForProfile(
+ browser_view_->browser()->profile());
}
void BrowserFrameWin::OnScreenReaderDetected() {
diff --git a/chrome/browser/ui/views/theme_background.cc b/chrome/browser/ui/views/theme_background.cc
index dabd9ae..e3eb665 100644
--- a/chrome/browser/ui/views/theme_background.cc
+++ b/chrome/browser/ui/views/theme_background.cc
@@ -6,6 +6,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "grit/app_resources.h"
#include "grit/generated_resources.h"
@@ -30,7 +31,8 @@ void ThemeBackground::Paint(gfx::Canvas* canvas, views::View* view) const {
background = rb.GetBitmapNamed(IDR_THEME_FRAME_INACTIVE);
} else {
Profile* profile = browser_view_->browser()->profile();
- ui::ThemeProvider* theme = profile->GetThemeProvider();
+ ui::ThemeProvider* theme = ThemeServiceFactory::GetForProfile(profile);
+
if (browser_view_->IsActive()) {
background = theme->GetBitmapNamed(
profile->IsOffTheRecord() ?
diff --git a/chrome/browser/ui/webui/new_tab_ui.cc b/chrome/browser/ui/webui/new_tab_ui.cc
index 7beaf3c..9389ab6 100644
--- a/chrome/browser/ui/webui/new_tab_ui.cc
+++ b/chrome/browser/ui/webui/new_tab_ui.cc
@@ -25,6 +25,7 @@
#include "chrome/browser/sessions/tab_restore_service_observer.h"
#include "chrome/browser/sync/profile_sync_service.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/webui/app_launcher_handler.h"
#include "chrome/browser/ui/webui/foreign_session_handler.h"
@@ -396,7 +397,7 @@ void NewTabUI::Observe(NotificationType type,
InitializeCSSCaches();
ListValue args;
args.Append(Value::CreateStringValue(
- GetProfile()->GetThemeProvider()->HasCustomImage(
+ ThemeServiceFactory::GetForProfile(GetProfile())->HasCustomImage(
IDR_THEME_NTP_ATTRIBUTION) ?
"true" : "false"));
CallJavascriptFunction("themeChanged", args);
diff --git a/chrome/browser/ui/webui/ntp_resource_cache.cc b/chrome/browser/ui/webui/ntp_resource_cache.cc
index 0afa746..e634668 100644
--- a/chrome/browser/ui/webui/ntp_resource_cache.cc
+++ b/chrome/browser/ui/webui/ntp_resource_cache.cc
@@ -20,6 +20,7 @@
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
#include "chrome/browser/ui/webui/shown_sections_handler.h"
#include "chrome/browser/web_resource/promo_resource_service.h"
@@ -264,7 +265,8 @@ void NTPResourceCache::CreateNewTabHTML() {
profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar) ?
"true" : "false");
localized_strings.SetString("hasattribution",
- profile_->GetThemeProvider()->HasCustomImage(IDR_THEME_NTP_ATTRIBUTION) ?
+ ThemeServiceFactory::GetForProfile(profile_)->HasCustomImage(
+ IDR_THEME_NTP_ATTRIBUTION) ?
"true" : "false");
localized_strings.SetString("apps", apps);
localized_strings.SetString("title", title);
@@ -432,7 +434,7 @@ void NTPResourceCache::CreateNewTabHTML() {
}
void NTPResourceCache::CreateNewTabIncognitoCSS() {
- ui::ThemeProvider* tp = profile_->GetThemeProvider();
+ ui::ThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_);
DCHECK(tp);
// Get our theme colors
@@ -468,7 +470,7 @@ void NTPResourceCache::CreateNewTabIncognitoCSS() {
}
void NTPResourceCache::CreateNewTabCSS() {
- ui::ThemeProvider* tp = profile_->GetThemeProvider();
+ ui::ThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_);
DCHECK(tp);
// Get our theme colors
diff --git a/chrome/browser/ui/webui/options/personal_options_handler.cc b/chrome/browser/ui/webui/options/personal_options_handler.cc
index 5680af6..c554201 100644
--- a/chrome/browser/ui/webui/options/personal_options_handler.cc
+++ b/chrome/browser/ui/webui/options/personal_options_handler.cc
@@ -23,6 +23,7 @@
#include "chrome/browser/sync/sync_setup_flow.h"
#include "chrome/browser/sync/sync_ui_util.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/options/options_page_base.h"
#include "chrome/browser/ui/options/options_window.h"
#include "chrome/browser/ui/webui/options/options_managed_banner_handler.h"
@@ -336,8 +337,7 @@ void PersonalOptionsHandler::ObserveThemeChanged() {
web_ui_->CallJavascriptFunction(
"options.PersonalOptions.setGtkThemeButtonEnabled", gtk_enabled);
#else
- BrowserThemeProvider* provider =
- reinterpret_cast<BrowserThemeProvider*>(profile->GetThemeProvider());
+ BrowserThemeProvider* provider = ThemeServiceFactory::GetForProfile(profile);
bool is_gtk_theme = false;
#endif
@@ -418,13 +418,13 @@ void PersonalOptionsHandler::ShowCustomizeSyncDialog(const ListValue* args) {
void PersonalOptionsHandler::ThemesReset(const ListValue* args) {
UserMetricsRecordAction(UserMetricsAction("Options_ThemesReset"));
- web_ui_->GetProfile()->ClearTheme();
+ ThemeServiceFactory::GetForProfile(web_ui_->GetProfile())->UseDefaultTheme();
}
#if defined(TOOLKIT_GTK)
void PersonalOptionsHandler::ThemesSetGTK(const ListValue* args) {
UserMetricsRecordAction(UserMetricsAction("Options_GtkThemeSet"));
- web_ui_->GetProfile()->SetNativeTheme();
+ ThemeServiceFactory::GetForProfile(web_ui_->GetProfile())->SetNativeTheme();
}
#endif
diff --git a/chrome/browser/ui/webui/theme_source.cc b/chrome/browser/ui/webui/theme_source.cc
index 9c87ce9..3c686e7 100644
--- a/chrome/browser/ui/webui/theme_source.cc
+++ b/chrome/browser/ui/webui/theme_source.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/resources_util.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/webui/ntp_resource_cache.h"
#include "chrome/common/url_constants.h"
#include "content/browser/browser_thread.h"
@@ -106,7 +107,7 @@ bool ThemeSource::ShouldReplaceExistingSource() const {
void ThemeSource::SendThemeBitmap(int request_id, int resource_id) {
if (BrowserThemeProvider::IsThemeableImage(resource_id)) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- ui::ThemeProvider* tp = profile_->GetThemeProvider();
+ ui::ThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_);
DCHECK(tp);
scoped_refptr<RefCountedMemory> image_data(tp->GetRawData(resource_id));
diff --git a/chrome/browser/ui/webui/theme_source_unittest.cc b/chrome/browser/ui/webui/theme_source_unittest.cc
index 959decd..59511c3 100644
--- a/chrome/browser/ui/webui/theme_source_unittest.cc
+++ b/chrome/browser/ui/webui/theme_source_unittest.cc
@@ -42,7 +42,6 @@ class WebUISourcesTest : public testing::Test {
private:
virtual void SetUp() {
profile_.reset(new TestingProfile());
- profile_->InitThemes();
theme_source_ = new MockThemeSource(profile_.get());
}
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 21789e6..2ea19f0 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -2025,6 +2025,8 @@
'browser/themes/browser_theme_provider.h',
'browser/themes/browser_theme_provider_gtk.cc',
'browser/themes/browser_theme_provider_mac.mm',
+ 'browser/themes/theme_service.cc',
+ 'browser/themes/theme_service.h',
'browser/translate/languages_menu_model.cc',
'browser/translate/languages_menu_model.h',
'browser/translate/options_menu_model.cc',
diff --git a/chrome/test/live_sync/live_themes_sync_test.cc b/chrome/test/live_sync/live_themes_sync_test.cc
index de7d7c3..3c65359 100644
--- a/chrome/test/live_sync/live_themes_sync_test.cc
+++ b/chrome/test/live_sync/live_themes_sync_test.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// 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.
@@ -10,6 +10,7 @@
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/common/extensions/extension.h"
LiveThemesSyncTest::LiveThemesSyncTest(TestType test_type)
@@ -23,15 +24,22 @@ void LiveThemesSyncTest::SetTheme(
InstallExtension(profile, theme);
}
+void LiveThemesSyncTest::SetNativeTheme(Profile* profile) {
+ ThemeServiceFactory::GetForProfile(profile)->SetNativeTheme();
+}
+
+void LiveThemesSyncTest::UseDefaultTheme(Profile* profile) {
+ ThemeServiceFactory::GetForProfile(profile)->UseDefaultTheme();
+}
+
const Extension* LiveThemesSyncTest::GetCustomTheme(
Profile* profile) {
- return profile->GetTheme();
+ return ThemeServiceFactory::GetThemeForProfile(profile);
}
bool LiveThemesSyncTest::UsingDefaultTheme(Profile* profile) {
- return
- !profile->GetTheme() &&
- profile->GetThemeProvider()->UsingDefaultTheme();
+ return !ThemeServiceFactory::GetThemeForProfile(profile) &&
+ ThemeServiceFactory::GetForProfile(profile)->UsingDefaultTheme();
}
bool LiveThemesSyncTest::UsingNativeTheme(Profile* profile) {
@@ -44,10 +52,9 @@ bool LiveThemesSyncTest::UsingNativeTheme(Profile* profile) {
// Return true if we're not using a custom theme and we don't make a
// distinction between the default and the system theme, or we do
// and we're not using the default theme.
- return
- !profile->GetTheme() &&
+ return !ThemeServiceFactory::GetThemeForProfile(profile) &&
(!kHasDistinctNativeTheme ||
- !profile->GetThemeProvider()->UsingDefaultTheme());
+ !ThemeServiceFactory::GetForProfile(profile)->UsingDefaultTheme());
}
bool LiveThemesSyncTest::ExtensionIsPendingInstall(
diff --git a/chrome/test/live_sync/live_themes_sync_test.h b/chrome/test/live_sync/live_themes_sync_test.h
index c98e3e4..ad960b2 100644
--- a/chrome/test/live_sync/live_themes_sync_test.h
+++ b/chrome/test/live_sync/live_themes_sync_test.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// 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.
@@ -27,6 +27,12 @@ class LiveThemesSyncTest : public LiveExtensionsSyncTestBase {
// given theme extension.
static void SetTheme(Profile* profile, scoped_refptr<Extension> theme);
+ // Sets |profile| so that it uses the native theme.
+ void SetNativeTheme(Profile* profile);
+
+ // Sets |profile| to the default theme.
+ void UseDefaultTheme(Profile* profile);
+
// Gets the custom theme of the given profile, or NULL if the given
// profile doesn't have one.
const Extension* GetCustomTheme(Profile* profile) WARN_UNUSED_RESULT;
diff --git a/chrome/test/live_sync/single_client_live_themes_sync_test.cc b/chrome/test/live_sync/single_client_live_themes_sync_test.cc
index c901947..8ae2c3b 100644
--- a/chrome/test/live_sync/single_client_live_themes_sync_test.cc
+++ b/chrome/test/live_sync/single_client_live_themes_sync_test.cc
@@ -50,8 +50,8 @@ IN_PROC_BROWSER_TEST_F(SingleClientLiveThemesSyncTest, NativeTheme) {
ASSERT_TRUE(GetClient(0)->AwaitSyncCycleCompletion(
"Waiting for custom themes change."));
- GetProfile(0)->SetNativeTheme();
- verifier()->SetNativeTheme();
+ SetNativeTheme(GetProfile(0));
+ SetNativeTheme(verifier());
ASSERT_TRUE(UsingNativeTheme(GetProfile(0)));
ASSERT_TRUE(UsingNativeTheme(verifier()));
@@ -73,8 +73,8 @@ IN_PROC_BROWSER_TEST_F(SingleClientLiveThemesSyncTest, DefaultTheme) {
ASSERT_TRUE(GetClient(0)->AwaitSyncCycleCompletion(
"Waiting for custom themes change."));
- GetProfile(0)->ClearTheme();
- verifier()->ClearTheme();
+ UseDefaultTheme(GetProfile(0));
+ UseDefaultTheme(verifier());
ASSERT_TRUE(UsingDefaultTheme(GetProfile(0)));
ASSERT_TRUE(UsingDefaultTheme(verifier()));
diff --git a/chrome/test/live_sync/two_client_live_themes_sync_test.cc b/chrome/test/live_sync/two_client_live_themes_sync_test.cc
index 29ba596..da5545d 100644
--- a/chrome/test/live_sync/two_client_live_themes_sync_test.cc
+++ b/chrome/test/live_sync/two_client_live_themes_sync_test.cc
@@ -53,8 +53,8 @@ IN_PROC_BROWSER_TEST_F(TwoClientLiveThemesSyncTest, NativeTheme) {
ASSERT_TRUE(AwaitQuiescence());
- GetProfile(0)->SetNativeTheme();
- verifier()->SetNativeTheme();
+ SetNativeTheme(GetProfile(0));
+ SetNativeTheme(verifier());
ASSERT_TRUE(UsingNativeTheme(GetProfile(0)));
ASSERT_FALSE(UsingNativeTheme(GetProfile(1)));
ASSERT_TRUE(UsingNativeTheme(verifier()));
@@ -75,8 +75,8 @@ IN_PROC_BROWSER_TEST_F(TwoClientLiveThemesSyncTest, DefaultTheme) {
ASSERT_TRUE(AwaitQuiescence());
- GetProfile(0)->ClearTheme();
- verifier()->ClearTheme();
+ UseDefaultTheme(GetProfile(0));
+ UseDefaultTheme(verifier());
ASSERT_TRUE(UsingDefaultTheme(GetProfile(0)));
ASSERT_FALSE(UsingDefaultTheme(GetProfile(1)));
ASSERT_TRUE(UsingDefaultTheme(verifier()));
@@ -91,8 +91,8 @@ IN_PROC_BROWSER_TEST_F(TwoClientLiveThemesSyncTest, DefaultTheme) {
IN_PROC_BROWSER_TEST_F(TwoClientLiveThemesSyncTest, NativeDefaultRace) {
ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
- GetProfile(0)->SetNativeTheme();
- GetProfile(1)->ClearTheme();
+ SetNativeTheme(GetProfile(0));
+ UseDefaultTheme(GetProfile(1));
ASSERT_TRUE(UsingNativeTheme(GetProfile(0)));
ASSERT_TRUE(UsingDefaultTheme(GetProfile(1)));
@@ -111,7 +111,7 @@ IN_PROC_BROWSER_TEST_F(TwoClientLiveThemesSyncTest, CustomNativeRace) {
ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
SetTheme(GetProfile(0), GetTheme(0));
- GetProfile(1)->SetNativeTheme();
+ SetNativeTheme(GetProfile(1));
ASSERT_EQ(GetTheme(0), GetCustomTheme(GetProfile(0)));
ASSERT_TRUE(UsingNativeTheme(GetProfile(1)));
@@ -128,7 +128,7 @@ IN_PROC_BROWSER_TEST_F(TwoClientLiveThemesSyncTest, CustomDefaultRace) {
ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
SetTheme(GetProfile(0), GetTheme(0));
- GetProfile(1)->ClearTheme();
+ UseDefaultTheme(GetProfile(1));
ASSERT_EQ(GetTheme(0), GetCustomTheme(GetProfile(0)));
ASSERT_TRUE(UsingDefaultTheme(GetProfile(1)));
diff --git a/chrome/test/testing_profile.cc b/chrome/test/testing_profile.cc
index a348337..26e452c 100644
--- a/chrome/test/testing_profile.cc
+++ b/chrome/test/testing_profile.cc
@@ -34,7 +34,6 @@
#include "chrome/browser/search_engines/template_url_model.h"
#include "chrome/browser/sessions/session_service.h"
#include "chrome/browser/sync/profile_sync_service_mock.h"
-#include "chrome/browser/themes/browser_theme_provider.h"
#include "chrome/browser/ui/find_bar/find_bar_state.h"
#include "chrome/browser/ui/webui/chrome_url_data_manager.h"
#include "chrome/browser/ui/webui/ntp_resource_cache.h"
@@ -54,10 +53,6 @@
#include "testing/gmock/include/gmock/gmock.h"
#include "webkit/database/database_tracker.h"
-#if defined(OS_LINUX) && !defined(TOOLKIT_VIEWS)
-#include "chrome/browser/ui/gtk/gtk_theme_provider.h"
-#endif
-
using base::Time;
using testing::NiceMock;
using testing::Return;
@@ -149,7 +144,6 @@ class TestExtensionURLRequestContextGetter : public URLRequestContextGetter {
TestingProfile::TestingProfile()
: start_time_(Time::Now()),
testing_prefs_(NULL),
- created_theme_provider_(false),
has_history_service_(false),
off_the_record_(false),
last_session_exited_cleanly_(true) {
@@ -330,9 +324,7 @@ void TestingProfile::SetTemplateURLModel(TemplateURLModel* model) {
}
void TestingProfile::UseThemeProvider(BrowserThemeProvider* theme_provider) {
- theme_provider->Init(this);
- created_theme_provider_ = true;
- theme_provider_.reset(theme_provider);
+ NOTREACHED() << "This needs to go away for a different testing interface.";
}
ExtensionService* TestingProfile::CreateExtensionService(
@@ -482,27 +474,6 @@ PasswordStore* TestingProfile::GetPasswordStore(ServiceAccessType access) {
return NULL;
}
-void TestingProfile::InitThemes() {
- if (!created_theme_provider_) {
-#if defined(OS_LINUX) && !defined(TOOLKIT_VIEWS)
- theme_provider_.reset(new GtkThemeProvider);
-#else
- theme_provider_.reset(new BrowserThemeProvider);
-#endif
- theme_provider_->Init(this);
- created_theme_provider_ = true;
- }
-}
-
-const Extension* TestingProfile::GetTheme() {
- return NULL;
-}
-
-BrowserThemeProvider* TestingProfile::GetThemeProvider() {
- InitThemes();
- return theme_provider_.get();
-}
-
void TestingProfile::SetPrefService(PrefService* prefs) {
DCHECK(!prefs_.get());
prefs_.reset(prefs);
diff --git a/chrome/test/testing_profile.h b/chrome/test/testing_profile.h
index 7c3ae2bb..befc5a6 100644
--- a/chrome/test/testing_profile.h
+++ b/chrome/test/testing_profile.h
@@ -185,12 +185,6 @@ class TestingProfile : public Profile {
virtual fileapi::FileSystemContext* GetFileSystemContext();
virtual BrowserSignin* GetBrowserSignin();
virtual bool HasCreatedDownloadManager() const;
- virtual void InitThemes();
- virtual void SetTheme(const Extension* extension) {}
- virtual void SetNativeTheme() {}
- virtual void ClearTheme() {}
- virtual const Extension* GetTheme();
- virtual BrowserThemeProvider* GetThemeProvider();
// Returns a testing ContextGetter (if one has been created via
// CreateRequestContext) or NULL. This is not done on-demand for two reasons:
@@ -345,10 +339,6 @@ class TestingProfile : public Profile {
// The SessionService. Defaults to NULL, but can be set using the setter.
scoped_refptr<SessionService> session_service_;
- // The theme provider. Created lazily by GetThemeProvider()/InitThemes().
- scoped_ptr<BrowserThemeProvider> theme_provider_;
- bool created_theme_provider_;
-
// Internally, this is a TestURLRequestContextGetter that creates a dummy
// request context. Currently, only the CookieMonster is hooked up.
scoped_refptr<URLRequestContextGetter> request_context_;
diff --git a/content/browser/webui/web_ui.cc b/content/browser/webui/web_ui.cc
index e1f5fbd..6d7ca77 100644
--- a/content/browser/webui/web_ui.cc
+++ b/content/browser/webui/web_ui.cc
@@ -12,6 +12,7 @@
#include "base/values.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/browser_theme_provider.h"
+#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/webui/generic_handler.h"
#include "chrome/common/bindings_policy.h"
#include "chrome/common/render_messages.h"
@@ -129,7 +130,7 @@ void WebUI::CallJavascriptFunction(
}
ui::ThemeProvider* WebUI::GetThemeProvider() const {
- return GetProfile()->GetThemeProvider();
+ return ThemeServiceFactory::GetForProfile(GetProfile());
}
void WebUI::RegisterMessageCallback(const std::string &message,