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

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 comments, fixed to not set theme fields if no theme 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
« no previous file with comments | « chrome/browser/ui/browser_instant_controller.h ('k') | chrome/browser/ui/views/frame/browser_view.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 f8fd4f5cc36a119230041402b6cfec1fa90d45d4..96c2755ec3a3003e50fb3ac3ef52e17807a39cb1 100644
--- a/chrome/browser/ui/browser_instant_controller.cc
+++ b/chrome/browser/ui/browser_instant_controller.cc
@@ -8,6 +8,8 @@
#include "chrome/browser/extensions/extension_service.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 chrome {
@@ -32,11 +38,20 @@ BrowserInstantController::BrowserInstantController(Browser* browser)
: browser_(browser),
instant_(ALLOW_THIS_IN_INITIALIZER_LIST(this),
chrome::search::IsInstantExtendedAPIEnabled(browser->profile())),
- 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);
instant_.SetInstantEnabled(IsInstantEnabled(browser_->profile()));
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 @@ void BrowserInstantController::ActiveTabChanged() {
instant_.ActiveTabChanged();
}
+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:
@@ -133,7 +162,118 @@ void BrowserInstantController::OnPreferenceChanged(
void BrowserInstantController::ModeChanged(const search::Mode& old_mode,
const search::Mode& new_mode) {
+ // If mode is now |NTP|, send theme-related information to instant.
+ if (new_mode.is_ntp())
+ UpdateThemeInfoForPreview();
+
instant_.SearchModeChanged(old_mode, new_mode);
}
+////////////////////////////////////////////////////////////////////////////////
+// BrowserInstantController, content::NotificationObserver implementation:
+
+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::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 horizontal alignment.
+ int alignment = 0;
+ theme_service->GetDisplayProperty(ThemeService::NTP_BACKGROUND_ALIGNMENT,
+ &alignment);
+ if (alignment & ThemeService::ALIGN_LEFT) {
+ theme_info_.image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_LEFT;
+ } else if (alignment & ThemeService::ALIGN_RIGHT) {
+ theme_info_.image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_RIGHT;
+ } else { // ALIGN_CENTER
+ theme_info_.image_horizontal_alignment =
+ THEME_BKGRND_IMAGE_ALIGN_CENTER;
+ }
+
+ // Set theme background image vertical alignment.
+ if (alignment & ThemeService::ALIGN_TOP)
+ theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_TOP;
+ else if (alignment & ThemeService::ALIGN_BOTTOM)
+ theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_BOTTOM;
+ else // ALIGN_CENTER
+ theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_CENTER;
+
+ // Set theme background image tiling.
+ int tiling = 0;
+ theme_service->GetDisplayProperty(ThemeService::NTP_BACKGROUND_TILING,
+ &tiling);
+ switch (tiling) {
+ case ThemeService::NO_REPEAT:
+ theme_info_.image_tiling = THEME_BKGRND_IMAGE_NO_REPEAT;
+ break;
+ case ThemeService::REPEAT_X:
+ theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT_X;
+ break;
+ case ThemeService::REPEAT_Y:
+ theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT_Y;
+ break;
+ case ThemeService::REPEAT:
+ theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT;
+ break;
+ }
+
+ // 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 (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 (!browser_->search_model()->mode().is_ntp() ||
+ theme_info_.theme_id.empty() ||
+ theme_info_.image_vertical_alignment == THEME_BKGRND_IMAGE_ALIGN_TOP) {
+ return;
+ }
+ instant_.ThemeAreaHeightChanged(theme_area_height_);
+}
+
} // namespace chrome
« no previous file with comments | « chrome/browser/ui/browser_instant_controller.h ('k') | chrome/browser/ui/views/frame/browser_view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698