Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(631)

Unified Diff: chrome/browser/extensions/theme_installed_infobar_delegate.cc

Issue 11644059: Change infobar creation to use a public static Create() method on the infobar delegate classes. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/theme_installed_infobar_delegate.cc
===================================================================
--- chrome/browser/extensions/theme_installed_infobar_delegate.cc (revision 175396)
+++ chrome/browser/extensions/theme_installed_infobar_delegate.cc (working copy)
@@ -12,6 +12,8 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h"
#include "content/public/browser/notification_source.h"
@@ -20,6 +22,79 @@
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
+
+// static
+void ThemeInstalledInfoBarDelegate::Create(
+ const extensions::Extension* new_theme,
+ Profile* profile,
+ const std::string& previous_theme_id,
+ bool previous_using_native_theme) {
+ if (!new_theme->is_theme())
+ return;
+
+ // Get last active tabbed browser of profile.
+ Browser* browser = browser::FindTabbedBrowser(profile,
+ true,
+ chrome::GetActiveDesktop());
+ if (!browser)
+ return;
+
+ content::WebContents* web_contents = chrome::GetActiveWebContents(browser);
+ if (!web_contents)
+ return;
+ InfoBarService* infobar_service =
+ InfoBarService::FromWebContents(web_contents);
+
+ // First find any previous theme preview infobars.
+ InfoBarDelegate* old_delegate = NULL;
+ for (size_t i = 0; i < infobar_service->GetInfoBarCount(); ++i) {
+ InfoBarDelegate* delegate = infobar_service->GetInfoBarDelegateAt(i);
+ ThemeInstalledInfoBarDelegate* theme_infobar =
+ delegate->AsThemePreviewInfobarDelegate();
+ if (theme_infobar) {
+ // If the user installed the same theme twice, ignore the second install
+ // and keep the first install info bar, so that they can easily undo to
+ // get back the previous theme.
+ if (theme_infobar->theme_id_ == new_theme->id())
+ return;
+ old_delegate = delegate;
+ break;
+ }
+ }
+
+ // Then either replace that old one or add a new one.
+ scoped_ptr<InfoBarDelegate> new_delegate(
+ new ThemeInstalledInfoBarDelegate(
+ infobar_service,
+ profile->GetExtensionService(),
+ ThemeServiceFactory::GetForProfile(profile),
+ new_theme,
+ previous_theme_id,
+ previous_using_native_theme));
+
+ if (old_delegate)
+ infobar_service->ReplaceInfoBar(old_delegate, new_delegate.Pass());
+ else
+ infobar_service->AddInfoBar(new_delegate.Pass());
+}
+
+bool ThemeInstalledInfoBarDelegate::Cancel() {
+ if (!previous_theme_id_.empty()) {
+ const extensions::Extension* previous_theme =
+ extension_service_->GetExtensionById(previous_theme_id_, true);
+ if (previous_theme) {
+ theme_service_->SetTheme(previous_theme);
+ return false; // The theme change will close us.
+ }
+ }
+
+ if (previous_using_native_theme_)
+ theme_service_->SetNativeTheme();
+ else
+ theme_service_->UseDefaultTheme();
+ return false; // The theme change will close us.
+}
+
ThemeInstalledInfoBarDelegate::ThemeInstalledInfoBarDelegate(
InfoBarService* infobar_service,
ExtensionService* extension_service,
@@ -39,11 +114,6 @@
content::Source<ThemeService>(theme_service_));
}
-bool ThemeInstalledInfoBarDelegate::MatchesTheme(
- const extensions::Extension* theme) const {
- return theme && (theme->id() == theme_id_);
-}
-
ThemeInstalledInfoBarDelegate::~ThemeInstalledInfoBarDelegate() {
// We don't want any notifications while we're running our destructor.
registrar_.RemoveAll();
@@ -51,23 +121,6 @@
theme_service_->OnInfobarDestroyed();
}
-bool ThemeInstalledInfoBarDelegate::Cancel() {
- if (!previous_theme_id_.empty()) {
- const extensions::Extension* previous_theme =
- extension_service_->GetExtensionById(previous_theme_id_, true);
- if (previous_theme) {
- theme_service_->SetTheme(previous_theme);
- return false; // The theme change will close us.
- }
- }
-
- if (previous_using_native_theme_)
- theme_service_->SetNativeTheme();
- else
- theme_service_->UseDefaultTheme();
- return false; // The theme change will close us.
-}
-
gfx::Image* ThemeInstalledInfoBarDelegate::GetIcon() const {
// TODO(aa): Reply with the theme's icon, but this requires reading it
// asynchronously from disk.

Powered by Google App Engine
This is Rietveld 408576698