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

Unified Diff: chrome/browser/ui/browser_instant_controller.cc

Issue 11413018: alternate ntp: implement searchbox api for instant overlay to adopt themes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: addressed sreeram's and chris's comments Created 8 years, 1 month 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/ui/browser_instant_controller.cc
diff --git a/chrome/browser/ui/browser_instant_controller.cc b/chrome/browser/ui/browser_instant_controller.cc
index 89ae408be8f9084d72c09ad2ae08b4e70596a89a..c4ed8b200f23e3bea2ab8be0bf6bf8acbb70d556 100644
--- a/chrome/browser/ui/browser_instant_controller.cc
+++ b/chrome/browser/ui/browser_instant_controller.cc
@@ -9,6 +9,8 @@
#include "chrome/browser/instant/instant_controller.h"
#include "chrome/browser/prefs/pref_service.h"
#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.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/browser_window.h"
@@ -22,6 +24,10 @@
#include "chrome/common/pref_names.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/web_contents.h"
+#include "grit/theme_resources.h"
+#include "ui/gfx/color_utils.h"
+#include "ui/gfx/sys_color_change_listener.h"
+
namespace {
@@ -45,12 +51,21 @@ namespace chrome {
BrowserInstantController::BrowserInstantController(Browser* browser)
: browser_(browser),
- instant_unload_handler_(browser) {
+ instant_unload_handler_(browser),
+ initialized_theme_info_(false),
+ theme_area_height_(0) {
profile_pref_registrar_.Init(browser_->profile()->GetPrefs());
profile_pref_registrar_.Add(prefs::kInstantEnabled, this);
ResetInstant();
browser_->tab_strip_model()->AddObserver(this);
browser_->search_model()->AddObserver(this);
+
+#if defined(ENABLE_THEMES)
+ // Listen for theme installation.
+ registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
+ content::Source<ThemeService>(
+ ThemeServiceFactory::GetForProfile(browser_->profile())));
+#endif // defined(ENABLE_THEMES)
}
BrowserInstantController::~BrowserInstantController() {
@@ -119,6 +134,20 @@ TabContents* BrowserInstantController::GetActiveTabContents() const {
return chrome::GetActiveTabContents(browser_);
}
+void BrowserInstantController::SetContentHeight(int height) {
+ OnThemeAreaHeightChanged(height);
+}
+
+void BrowserInstantController::UpdateThemeInfoForPreview() {
+ // Update theme background info and theme area height.
+ // Initialize |theme_info| if necessary.
+ // |OnThemeChanged| also updates theme area height if necessary.
+ if (!initialized_theme_info_)
+ OnThemeChanged(ThemeServiceFactory::GetForProfile(browser_->profile()));
+ else
+ OnThemeChanged(NULL);
+}
+
////////////////////////////////////////////////////////////////////////////////
// BrowserInstantController, PrefObserver implementation:
@@ -156,13 +185,28 @@ void BrowserInstantController::TabStripEmpty() {
void BrowserInstantController::ModeChanged(const search::Mode& old_mode,
const search::Mode& new_mode) {
- if (instant())
+ if (instant()) {
instant_->OnActiveTabModeChanged(new_mode);
+
+ // If mode is now |NTP|, send theme-related information to instant.
+ if (new_mode.is_ntp())
+ UpdateThemeInfoForPreview();
+ }
}
////////////////////////////////////////////////////////////////////////////////
// BrowserInstantController, private:
+void BrowserInstantController::Observe(
+ int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+#if defined(ENABLE_THEMES)
+ DCHECK_EQ(chrome::NOTIFICATION_BROWSER_THEME_CHANGED, type);
+ OnThemeChanged(content::Source<ThemeService>(source).ptr());
+#endif // defined(ENABLE_THEMES)
+}
+
void BrowserInstantController::ResetInstant() {
instant_.reset(
!browser_shutdown::ShuttingDownWithoutClosingBrowsers() &&
@@ -176,4 +220,66 @@ void BrowserInstantController::ResetInstant() {
content::NotificationService::NoDetails());
}
+void BrowserInstantController::OnThemeChanged(ThemeService* theme_service) {
+ if (theme_service) { // Get theme information from theme service.
+ theme_info_ = ThemeBackgroundInfo();
+
+ // Set theme background color.
+ SkColor background_color =
+ theme_service->GetColor(ThemeService::COLOR_NTP_BACKGROUND);
+ if (gfx::IsInvertedColorScheme())
+ background_color = color_utils::InvertColor(background_color);
+ theme_info_.color_r = SkColorGetR(background_color);
+ theme_info_.color_g = SkColorGetG(background_color);
+ theme_info_.color_b = SkColorGetB(background_color);
+ theme_info_.color_a = SkColorGetA(background_color);
+
+ if (theme_service->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) {
+ // Set theme id for theme background image url.
+ theme_info_.theme_id = theme_service->GetThemeID();
+
+ // Set theme background image alignment.
+ theme_service->GetDisplayProperty(ThemeService::NTP_BACKGROUND_ALIGNMENT,
+ &theme_info_.image_alignment);
+
+ // Set theme background image tiling.
+ theme_service->GetDisplayProperty(ThemeService::NTP_BACKGROUND_TILING,
+ &theme_info_.image_tiling);
+
+ // Set theme background image height.
+ gfx::ImageSkia* image = theme_service->GetImageSkiaNamed(
+ IDR_THEME_NTP_BACKGROUND);
+ DCHECK(image);
+ theme_info_.image_height = image->height();
+ }
+
+ initialized_theme_info_ = true;
+ }
+
+ DCHECK(initialized_theme_info_);
+
+ if (instant() && browser_->search_model()->mode().is_ntp()) {
+ instant_->ThemeChanged(theme_info_);
+
+ // Theme area height is only sent to preview for non-top-aligned images;
+ // new theme may have a different alignment that requires preview to know
+ // theme area height.
+ OnThemeAreaHeightChanged(theme_area_height_);
+ }
+}
+
+void BrowserInstantController::OnThemeAreaHeightChanged(int height) {
+ theme_area_height_ = height;
+
+ // Notify preview only if mode is |NTP| and theme background image is not top-
+ // aligned; top-aligned images don't need theme area height to determine which
+ // part of the image overlay should draw, 'cos the origin is top-left.
+ if (!instant() || !browser_->search_model()->mode().is_ntp() ||
+ theme_info_.theme_id.empty() ||
+ theme_info_.image_alignment & ThemeService::ALIGN_TOP) {
+ return;
+ }
+ instant_->ThemeAreaHeightChanged(theme_area_height_);
+}
+
} // namespace chrome

Powered by Google App Engine
This is Rietveld 408576698