• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/extensions/theme_installed_infobar_delegate.h"
6 
7 #include <string>
8 
9 #include "base/utf_string_conversions.h"
10 #include "chrome/browser/extensions/extension_service.h"
11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/themes/theme_service.h"
13 #include "chrome/browser/themes/theme_service_factory.h"
14 #include "chrome/common/extensions/extension.h"
15 #include "content/browser/tab_contents/tab_contents.h"
16 #include "content/common/notification_service.h"
17 #include "grit/generated_resources.h"
18 #include "grit/theme_resources.h"
19 #include "ui/base/l10n/l10n_util.h"
20 #include "ui/base/resource/resource_bundle.h"
21 
ThemeInstalledInfoBarDelegate(TabContents * tab_contents,const Extension * new_theme,const std::string & previous_theme_id)22 ThemeInstalledInfoBarDelegate::ThemeInstalledInfoBarDelegate(
23     TabContents* tab_contents,
24     const Extension* new_theme,
25     const std::string& previous_theme_id)
26     : ConfirmInfoBarDelegate(tab_contents),
27       profile_(tab_contents->profile()),
28       theme_service_(ThemeServiceFactory::GetForProfile(profile_)),
29       name_(new_theme->name()),
30       theme_id_(new_theme->id()),
31       previous_theme_id_(previous_theme_id),
32       tab_contents_(tab_contents) {
33   theme_service_->OnInfobarDisplayed();
34   registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED,
35                  NotificationService::AllSources());
36 }
37 
MatchesTheme(const Extension * theme) const38 bool ThemeInstalledInfoBarDelegate::MatchesTheme(const Extension* theme) const {
39   return theme && (theme->id() == theme_id_);
40 }
41 
~ThemeInstalledInfoBarDelegate()42 ThemeInstalledInfoBarDelegate::~ThemeInstalledInfoBarDelegate() {
43   // We don't want any notifications while we're running our destructor.
44   registrar_.RemoveAll();
45 
46   theme_service_->OnInfobarDestroyed();
47 }
48 
Cancel()49 bool ThemeInstalledInfoBarDelegate::Cancel() {
50   if (!previous_theme_id_.empty()) {
51     ExtensionService* service = profile_->GetExtensionService();
52     if (service) {
53       const Extension* previous_theme =
54           service->GetExtensionById(previous_theme_id_, true);
55       if (previous_theme) {
56         theme_service_->SetTheme(previous_theme);
57         return true;
58       }
59     }
60   }
61 
62   theme_service_->UseDefaultTheme();
63   return true;
64 }
65 
InfoBarClosed()66 void ThemeInstalledInfoBarDelegate::InfoBarClosed() {
67   delete this;
68 }
69 
GetIcon() const70 SkBitmap* ThemeInstalledInfoBarDelegate::GetIcon() const {
71   // TODO(aa): Reply with the theme's icon, but this requires reading it
72   // asynchronously from disk.
73   return ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_INFOBAR_THEME);
74 }
75 
76 ThemeInstalledInfoBarDelegate*
AsThemePreviewInfobarDelegate()77     ThemeInstalledInfoBarDelegate::AsThemePreviewInfobarDelegate() {
78   return this;
79 }
80 
GetMessageText() const81 string16 ThemeInstalledInfoBarDelegate::GetMessageText() const {
82   return l10n_util::GetStringFUTF16(IDS_THEME_INSTALL_INFOBAR_LABEL,
83                                     UTF8ToUTF16(name_));
84 }
85 
GetButtons() const86 int ThemeInstalledInfoBarDelegate::GetButtons() const {
87   return BUTTON_CANCEL;
88 }
89 
GetButtonLabel(InfoBarButton button) const90 string16 ThemeInstalledInfoBarDelegate::GetButtonLabel(
91     InfoBarButton button) const {
92   DCHECK_EQ(BUTTON_CANCEL, button);
93   return l10n_util::GetStringUTF16(IDS_THEME_INSTALL_INFOBAR_UNDO_BUTTON);
94 }
95 
Observe(NotificationType type,const NotificationSource & source,const NotificationDetails & details)96 void ThemeInstalledInfoBarDelegate::Observe(
97     NotificationType type,
98     const NotificationSource& source,
99     const NotificationDetails& details) {
100   DCHECK_EQ(NotificationType::BROWSER_THEME_CHANGED, type.value);
101   // If the new theme is different from what this info bar is associated
102   // with, close this info bar since it is no longer relevant.
103   if (theme_id_ != theme_service_->GetThemeID()) {
104     if (tab_contents_ && !tab_contents_->is_being_destroyed()) {
105       tab_contents_->RemoveInfoBar(this);
106       // The infobar is gone so there is no reason for this delegate to keep
107       // a pointer to the TabContents (the TabContents has deleted its
108       // reference to this delegate and a new delegate will be created if
109       // a new infobar is created).
110       tab_contents_ = NULL;
111       // Although it's not being used anymore, this delegate is never deleted.
112       // It can not be deleted now because it is still needed if we
113       // "undo" the theme change that triggered this notification
114       // (when InfoBar::OnBackgroundExpose() is called). This will likely
115       // be fixed when infobar delegate deletion is cleaned up for
116       // http://crbug.com/62154.
117     }
118   }
119 }
120