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

Side by Side 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: rebased to resolve conflicts 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/browser_instant_controller.h" 5 #include "chrome/browser/ui/browser_instant_controller.h"
6 6
7 #include "chrome/browser/browser_shutdown.h" 7 #include "chrome/browser/browser_shutdown.h"
8 #include "chrome/browser/extensions/extension_service.h" 8 #include "chrome/browser/extensions/extension_service.h"
9 #include "chrome/browser/prefs/pref_service.h" 9 #include "chrome/browser/prefs/pref_service.h"
10 #include "chrome/browser/profiles/profile.h" 10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/themes/theme_service.h"
12 #include "chrome/browser/themes/theme_service_factory.h"
11 #include "chrome/browser/ui/browser.h" 13 #include "chrome/browser/ui/browser.h"
12 #include "chrome/browser/ui/browser_tabstrip.h" 14 #include "chrome/browser/ui/browser_tabstrip.h"
13 #include "chrome/browser/ui/browser_window.h" 15 #include "chrome/browser/ui/browser_window.h"
14 #include "chrome/browser/ui/omnibox/location_bar.h" 16 #include "chrome/browser/ui/omnibox/location_bar.h"
15 #include "chrome/browser/ui/search/search.h" 17 #include "chrome/browser/ui/search/search.h"
16 #include "chrome/browser/ui/search/search_model.h" 18 #include "chrome/browser/ui/search/search_model.h"
17 #include "chrome/browser/ui/search/search_tab_helper.h" 19 #include "chrome/browser/ui/search/search_tab_helper.h"
18 #include "chrome/browser/ui/tab_contents/tab_contents.h" 20 #include "chrome/browser/ui/tab_contents/tab_contents.h"
19 #include "chrome/browser/ui/tabs/tab_strip_model.h" 21 #include "chrome/browser/ui/tabs/tab_strip_model.h"
20 #include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" 22 #include "chrome/browser/ui/webui/ntp/app_launcher_handler.h"
21 #include "chrome/common/chrome_notification_types.h" 23 #include "chrome/common/chrome_notification_types.h"
22 #include "chrome/common/pref_names.h" 24 #include "chrome/common/pref_names.h"
23 #include "content/public/browser/notification_service.h" 25 #include "content/public/browser/notification_service.h"
24 #include "content/public/browser/web_contents.h" 26 #include "content/public/browser/web_contents.h"
27 #include "grit/theme_resources.h"
28 #include "ui/gfx/color_utils.h"
29 #include "ui/gfx/sys_color_change_listener.h"
30
25 31
26 namespace chrome { 32 namespace chrome {
27 33
28 //////////////////////////////////////////////////////////////////////////////// 34 ////////////////////////////////////////////////////////////////////////////////
29 // BrowserInstantController, public: 35 // BrowserInstantController, public:
30 36
31 BrowserInstantController::BrowserInstantController(Browser* browser) 37 BrowserInstantController::BrowserInstantController(Browser* browser)
32 : browser_(browser), 38 : browser_(browser),
33 instant_(ALLOW_THIS_IN_INITIALIZER_LIST(this), 39 instant_(ALLOW_THIS_IN_INITIALIZER_LIST(this),
34 chrome::search::IsInstantExtendedAPIEnabled(browser->profile())), 40 chrome::search::IsInstantExtendedAPIEnabled(browser->profile())),
35 instant_unload_handler_(browser) { 41 instant_unload_handler_(browser),
42 initialized_theme_info_(false),
43 theme_area_height_(0) {
36 profile_pref_registrar_.Init(browser_->profile()->GetPrefs()); 44 profile_pref_registrar_.Init(browser_->profile()->GetPrefs());
37 profile_pref_registrar_.Add(prefs::kInstantEnabled, this); 45 profile_pref_registrar_.Add(prefs::kInstantEnabled, this);
38 instant_.SetInstantEnabled(IsInstantEnabled(browser_->profile())); 46 instant_.SetInstantEnabled(IsInstantEnabled(browser_->profile()));
39 browser_->search_model()->AddObserver(this); 47 browser_->search_model()->AddObserver(this);
48
49 #if defined(ENABLE_THEMES)
50 // Listen for theme installation.
51 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
52 content::Source<ThemeService>(
53 ThemeServiceFactory::GetForProfile(browser_->profile())));
54 #endif // defined(ENABLE_THEMES)
40 } 55 }
41 56
42 BrowserInstantController::~BrowserInstantController() { 57 BrowserInstantController::~BrowserInstantController() {
43 browser_->search_model()->RemoveObserver(this); 58 browser_->search_model()->RemoveObserver(this);
44 } 59 }
45 60
46 bool BrowserInstantController::IsInstantEnabled(Profile* profile) { 61 bool BrowserInstantController::IsInstantEnabled(Profile* profile) {
47 return profile && !profile->IsOffTheRecord() && profile->GetPrefs() && 62 return profile && !profile->IsOffTheRecord() && profile->GetPrefs() &&
48 profile->GetPrefs()->GetBoolean(prefs::kInstantEnabled); 63 profile->GetPrefs()->GetBoolean(prefs::kInstantEnabled);
49 } 64 }
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 } 127 }
113 128
114 TabContents* BrowserInstantController::GetActiveTabContents() const { 129 TabContents* BrowserInstantController::GetActiveTabContents() const {
115 return browser_->tab_strip_model()->GetActiveTabContents(); 130 return browser_->tab_strip_model()->GetActiveTabContents();
116 } 131 }
117 132
118 void BrowserInstantController::ActiveTabChanged() { 133 void BrowserInstantController::ActiveTabChanged() {
119 instant_.ActiveTabChanged(); 134 instant_.ActiveTabChanged();
120 } 135 }
121 136
137 void BrowserInstantController::SetContentHeight(int height) {
138 OnThemeAreaHeightChanged(height);
139 }
140
141 void BrowserInstantController::UpdateThemeInfoForPreview() {
142 // Update theme background info and theme area height.
143 // Initialize |theme_info| if necessary.
144 // |OnThemeChanged| also updates theme area height if necessary.
145 if (!initialized_theme_info_)
146 OnThemeChanged(ThemeServiceFactory::GetForProfile(browser_->profile()));
147 else
148 OnThemeChanged(NULL);
149 }
150
122 //////////////////////////////////////////////////////////////////////////////// 151 ////////////////////////////////////////////////////////////////////////////////
123 // BrowserInstantController, PrefObserver implementation: 152 // BrowserInstantController, PrefObserver implementation:
124 153
125 void BrowserInstantController::OnPreferenceChanged( 154 void BrowserInstantController::OnPreferenceChanged(
126 PrefServiceBase* service, 155 PrefServiceBase* service,
127 const std::string& pref_name) { 156 const std::string& pref_name) {
128 instant_.SetInstantEnabled(IsInstantEnabled(browser_->profile())); 157 instant_.SetInstantEnabled(IsInstantEnabled(browser_->profile()));
129 } 158 }
130 159
131 //////////////////////////////////////////////////////////////////////////////// 160 ////////////////////////////////////////////////////////////////////////////////
132 // BrowserInstantController, search::SearchModelObserver implementation: 161 // BrowserInstantController, search::SearchModelObserver implementation:
133 162
134 void BrowserInstantController::ModeChanged(const search::Mode& old_mode, 163 void BrowserInstantController::ModeChanged(const search::Mode& old_mode,
135 const search::Mode& new_mode) { 164 const search::Mode& new_mode) {
136 instant_.SearchModeChanged(old_mode, new_mode); 165 instant_.SearchModeChanged(old_mode, new_mode);
166
167 // If mode is now |NTP|, send theme-related information to instant.
168 if (new_mode.is_ntp())
169 UpdateThemeInfoForPreview();
sreeram 2012/11/20 17:37:58 Wait, why do we need to send the theme info the pr
kuan 2012/11/20 17:52:24 i don't send the theme-related info when the mode
sreeram 2012/11/20 17:55:11 I think that's wasteful. The common case will not
kuan 2012/11/20 18:07:36 the structure i'm sending over consists of 4 short
sreeram 2012/11/20 18:16:29 Ok, never mind then. (I thought incorrectly that y
kuan 2012/11/20 18:50:48 Done.
170 }
171
172 ////////////////////////////////////////////////////////////////////////////////
173 // BrowserInstantController, content::NotificationObserver implementation:
174
175 void BrowserInstantController::Observe(
176 int type,
177 const content::NotificationSource& source,
178 const content::NotificationDetails& details) {
179 #if defined(ENABLE_THEMES)
180 DCHECK_EQ(chrome::NOTIFICATION_BROWSER_THEME_CHANGED, type);
181 OnThemeChanged(content::Source<ThemeService>(source).ptr());
182 #endif // defined(ENABLE_THEMES)
183 }
184
185 void BrowserInstantController::OnThemeChanged(ThemeService* theme_service) {
186 if (theme_service) { // Get theme information from theme service.
187 theme_info_ = ThemeBackgroundInfo();
188
189 // Set theme background color.
190 SkColor background_color =
191 theme_service->GetColor(ThemeService::COLOR_NTP_BACKGROUND);
192 if (gfx::IsInvertedColorScheme())
193 background_color = color_utils::InvertColor(background_color);
194 theme_info_.color_r = SkColorGetR(background_color);
195 theme_info_.color_g = SkColorGetG(background_color);
196 theme_info_.color_b = SkColorGetB(background_color);
197 theme_info_.color_a = SkColorGetA(background_color);
198
199 if (theme_service->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) {
200 // Set theme id for theme background image url.
201 theme_info_.theme_id = theme_service->GetThemeID();
202
203 // Set theme background image horizontal alignment.
204 int alignment = 0;
205 theme_service->GetDisplayProperty(ThemeService::NTP_BACKGROUND_ALIGNMENT,
206 &alignment);
207 if (alignment & ThemeService::ALIGN_LEFT) {
208 theme_info_.image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_LEFT;
209 } else if (alignment & ThemeService::ALIGN_RIGHT) {
210 theme_info_.image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_RIGHT;
211 } else { // ALIGN_CENTER
212 theme_info_.image_horizontal_alignment =
213 THEME_BKGRND_IMAGE_ALIGN_CENTER;
214 }
215
216 // Set theme background image vertical alignment.
217 if (alignment & ThemeService::ALIGN_TOP)
218 theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_TOP;
219 else if (alignment & ThemeService::ALIGN_BOTTOM)
220 theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_BOTTOM;
221 else // ALIGN_CENTER
222 theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_CENTER;
223
224 // Set theme background image tiling.
225 int tiling = 0;
226 theme_service->GetDisplayProperty(ThemeService::NTP_BACKGROUND_TILING,
227 &tiling);
228 switch (tiling) {
229 case ThemeService::NO_REPEAT:
230 theme_info_.image_tiling = THEME_BKGRND_IMAGE_NO_REPEAT;
231 break;
232 case ThemeService::REPEAT_X:
233 theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT_X;
234 break;
235 case ThemeService::REPEAT_Y:
236 theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT_Y;
237 break;
238 case ThemeService::REPEAT:
239 theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT;
240 break;
241 }
242
243 // Set theme background image height.
244 gfx::ImageSkia* image = theme_service->GetImageSkiaNamed(
245 IDR_THEME_NTP_BACKGROUND);
246 DCHECK(image);
247 theme_info_.image_height = image->height();
248 }
249
250 initialized_theme_info_ = true;
251 }
252
253 DCHECK(initialized_theme_info_);
254
255 if (browser_->search_model()->mode().is_ntp()) {
256 instant_.ThemeChanged(theme_info_);
257
258 // Theme area height is only sent to preview for non-top-aligned images;
259 // new theme may have a different alignment that requires preview to know
260 // theme area height.
261 OnThemeAreaHeightChanged(theme_area_height_);
262 }
263 }
264
265 void BrowserInstantController::OnThemeAreaHeightChanged(int height) {
266 theme_area_height_ = height;
267
268 // Notify preview only if mode is |NTP| and theme background image is not top-
269 // aligned; top-aligned images don't need theme area height to determine which
270 // part of the image overlay should draw, 'cos the origin is top-left.
271 if (!browser_->search_model()->mode().is_ntp() ||
272 theme_info_.theme_id.empty() ||
273 theme_info_.image_vertical_alignment == THEME_BKGRND_IMAGE_ALIGN_TOP) {
274 return;
275 }
276 instant_.ThemeAreaHeightChanged(theme_area_height_);
137 } 277 }
138 278
139 } // namespace chrome 279 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698