172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/theme_installed_infobar_delegate.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h" 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/themes/theme_service.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/themes/theme_service_factory.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h" 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochThemeInstalledInfoBarDelegate::ThemeInstalledInfoBarDelegate( 234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch TabContents* tab_contents, 244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const Extension* new_theme, 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& previous_theme_id) 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : ConfirmInfoBarDelegate(tab_contents), 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_(tab_contents->profile()), 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen theme_service_(ThemeServiceFactory::GetForProfile(profile_)), 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch name_(new_theme->name()), 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch theme_id_(new_theme->id()), 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch previous_theme_id_(previous_theme_id), 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tab_contents_(tab_contents) { 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen theme_service_->OnInfobarDisplayed(); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED, 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::AllSources()); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool ThemeInstalledInfoBarDelegate::MatchesTheme(const Extension* theme) const { 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return theme && (theme->id() == theme_id_); 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochThemeInstalledInfoBarDelegate::~ThemeInstalledInfoBarDelegate() { 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We don't want any notifications while we're running our destructor. 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.RemoveAll(); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen theme_service_->OnInfobarDestroyed(); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool ThemeInstalledInfoBarDelegate::Cancel() { 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!previous_theme_id_.empty()) { 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionService* service = profile_->GetExtensionService(); 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (service) { 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const Extension* previous_theme = 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen service->GetExtensionById(previous_theme_id_, true); 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (previous_theme) { 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen theme_service_->SetTheme(previous_theme); 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return true; 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen theme_service_->UseDefaultTheme(); 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return true; 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ThemeInstalledInfoBarDelegate::InfoBarClosed() { 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen delete this; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSkBitmap* ThemeInstalledInfoBarDelegate::GetIcon() const { 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(aa): Reply with the theme's icon, but this requires reading it 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // asynchronously from disk. 734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_INFOBAR_THEME); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochThemeInstalledInfoBarDelegate* 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ThemeInstalledInfoBarDelegate::AsThemePreviewInfobarDelegate() { 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return this; 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 ThemeInstalledInfoBarDelegate::GetMessageText() const { 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return l10n_util::GetStringFUTF16(IDS_THEME_INSTALL_INFOBAR_LABEL, 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UTF8ToUTF16(name_)); 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint ThemeInstalledInfoBarDelegate::GetButtons() const { 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return BUTTON_CANCEL; 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstring16 ThemeInstalledInfoBarDelegate::GetButtonLabel( 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InfoBarButton button) const { 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK_EQ(BUTTON_CANCEL, button); 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return l10n_util::GetStringUTF16(IDS_THEME_INSTALL_INFOBAR_UNDO_BUTTON); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ThemeInstalledInfoBarDelegate::Observe( 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType type, 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationSource& source, 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationDetails& details) { 1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK_EQ(NotificationType::BROWSER_THEME_CHANGED, type.value); 1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // If the new theme is different from what this info bar is associated 1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // with, close this info bar since it is no longer relevant. 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (theme_id_ != theme_service_->GetThemeID()) { 104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch if (tab_contents_ && !tab_contents_->is_being_destroyed()) { 105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tab_contents_->RemoveInfoBar(this); 106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The infobar is gone so there is no reason for this delegate to keep 107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // a pointer to the TabContents (the TabContents has deleted its 108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // reference to this delegate and a new delegate will be created if 109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // a new infobar is created). 110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch tab_contents_ = NULL; 111201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Although it's not being used anymore, this delegate is never deleted. 112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // It can not be deleted now because it is still needed if we 113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // "undo" the theme change that triggered this notification 114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // (when InfoBar::OnBackgroundExpose() is called). This will likely 115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // be fixed when infobar delegate deletion is cleaned up for 116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // http://crbug.com/62154. 117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 120