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

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: 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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/instant/instant_controller.h" 9 #include "chrome/browser/instant/instant_controller.h"
10 #include "chrome/browser/prefs/pref_service.h" 10 #include "chrome/browser/prefs/pref_service.h"
11 #include "chrome/browser/profiles/profile.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"
12 #include "chrome/browser/ui/browser.h" 14 #include "chrome/browser/ui/browser.h"
13 #include "chrome/browser/ui/browser_tabstrip.h" 15 #include "chrome/browser/ui/browser_tabstrip.h"
14 #include "chrome/browser/ui/browser_window.h" 16 #include "chrome/browser/ui/browser_window.h"
15 #include "chrome/browser/ui/omnibox/location_bar.h" 17 #include "chrome/browser/ui/omnibox/location_bar.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/tabs/tab_strip_model.h" 20 #include "chrome/browser/ui/tabs/tab_strip_model.h"
19 #include "chrome/browser/ui/tab_contents/tab_contents.h" 21 #include "chrome/browser/ui/tab_contents/tab_contents.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 { 32 namespace {
27 33
28 // Returns true iff the search model for |tab| is in an NTP state, that is, a 34 // Returns true iff the search model for |tab| is in an NTP state, that is, a
29 // state in which the Instant overlay may be showing custom NTP content in 35 // state in which the Instant overlay may be showing custom NTP content in
30 // EXTENDED mode. 36 // EXTENDED mode.
31 bool IsSearchModelNTP(content::WebContents* tab) { 37 bool IsSearchModelNTP(content::WebContents* tab) {
32 if (!tab) 38 if (!tab)
33 return false; 39 return false;
34 chrome::search::SearchModel* model = 40 chrome::search::SearchModel* model =
35 chrome::search::SearchTabHelper::FromWebContents(tab)->model(); 41 chrome::search::SearchTabHelper::FromWebContents(tab)->model();
36 return model && model->mode().is_ntp(); 42 return model && model->mode().is_ntp();
37 } 43 }
38 44
39 } // namespace 45 } // namespace
40 46
41 namespace chrome { 47 namespace chrome {
42 48
43 //////////////////////////////////////////////////////////////////////////////// 49 ////////////////////////////////////////////////////////////////////////////////
44 // BrowserInstantController, public: 50 // BrowserInstantController, public:
45 51
46 BrowserInstantController::BrowserInstantController(Browser* browser) 52 BrowserInstantController::BrowserInstantController(Browser* browser)
47 : browser_(browser), 53 : browser_(browser),
48 instant_unload_handler_(browser) { 54 instant_unload_handler_(browser),
55 initialized_theme_info_(false),
56 theme_area_height_(0) {
49 profile_pref_registrar_.Init(browser_->profile()->GetPrefs()); 57 profile_pref_registrar_.Init(browser_->profile()->GetPrefs());
50 profile_pref_registrar_.Add(prefs::kInstantEnabled, this); 58 profile_pref_registrar_.Add(prefs::kInstantEnabled, this);
51 ResetInstant(); 59 ResetInstant();
52 browser_->tab_strip_model()->AddObserver(this); 60 browser_->tab_strip_model()->AddObserver(this);
53 browser_->search_model()->AddObserver(this); 61 browser_->search_model()->AddObserver(this);
62
63 #if defined(ENABLE_THEMES)
64 // Listen for theme installation.
65 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
66 content::Source<ThemeService>(
67 ThemeServiceFactory::GetForProfile(browser_->profile())));
68 #endif // defined(ENABLE_THEMES)
54 } 69 }
55 70
56 BrowserInstantController::~BrowserInstantController() { 71 BrowserInstantController::~BrowserInstantController() {
57 browser_->tab_strip_model()->RemoveObserver(this); 72 browser_->tab_strip_model()->RemoveObserver(this);
58 browser_->search_model()->RemoveObserver(this); 73 browser_->search_model()->RemoveObserver(this);
59 } 74 }
60 75
61 bool BrowserInstantController::OpenInstant(WindowOpenDisposition disposition) { 76 bool BrowserInstantController::OpenInstant(WindowOpenDisposition disposition) {
62 // NEW_BACKGROUND_TAB results in leaving the omnibox open, so we don't attempt 77 // NEW_BACKGROUND_TAB results in leaving the omnibox open, so we don't attempt
63 // to use the Instant preview. 78 // to use the Instant preview.
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 void BrowserInstantController::InstantPreviewFocused() { 127 void BrowserInstantController::InstantPreviewFocused() {
113 // NOTE: This is only invoked on aura. 128 // NOTE: This is only invoked on aura.
114 browser_->window()->WebContentsFocused( 129 browser_->window()->WebContentsFocused(
115 instant_->GetPreviewContents()->web_contents()); 130 instant_->GetPreviewContents()->web_contents());
116 } 131 }
117 132
118 TabContents* BrowserInstantController::GetActiveTabContents() const { 133 TabContents* BrowserInstantController::GetActiveTabContents() const {
119 return chrome::GetActiveTabContents(browser_); 134 return chrome::GetActiveTabContents(browser_);
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 DCHECK_EQ(std::string(prefs::kInstantEnabled), pref_name); 157 DCHECK_EQ(std::string(prefs::kInstantEnabled), pref_name);
129 ResetInstant(); 158 ResetInstant();
130 } 159 }
131 160
(...skipping 17 matching lines...) Expand all
149 178
150 void BrowserInstantController::TabStripEmpty() { 179 void BrowserInstantController::TabStripEmpty() {
151 instant_.reset(); 180 instant_.reset();
152 } 181 }
153 182
154 //////////////////////////////////////////////////////////////////////////////// 183 ////////////////////////////////////////////////////////////////////////////////
155 // BrowserInstantController, search::SearchModelObserver implementation: 184 // BrowserInstantController, search::SearchModelObserver implementation:
156 185
157 void BrowserInstantController::ModeChanged(const search::Mode& old_mode, 186 void BrowserInstantController::ModeChanged(const search::Mode& old_mode,
158 const search::Mode& new_mode) { 187 const search::Mode& new_mode) {
159 if (instant()) 188 if (instant()) {
160 instant_->OnActiveTabModeChanged(new_mode); 189 instant_->OnActiveTabModeChanged(new_mode);
190
191 // If mode is now |NTP|, send theme-related information to instant.
192 if (new_mode.is_ntp())
193 UpdateThemeInfoForPreview();
194 }
161 } 195 }
162 196
163 //////////////////////////////////////////////////////////////////////////////// 197 ////////////////////////////////////////////////////////////////////////////////
164 // BrowserInstantController, private: 198 // BrowserInstantController, private:
165 199
200 void BrowserInstantController::Observe(
201 int type,
202 const content::NotificationSource& source,
203 const content::NotificationDetails& details) {
204 #if defined(ENABLE_THEMES)
205 DCHECK_EQ(chrome::NOTIFICATION_BROWSER_THEME_CHANGED, type);
206 OnThemeChanged(content::Source<ThemeService>(source).ptr());
207 #endif // defined(ENABLE_THEMES)
208 }
209
166 void BrowserInstantController::ResetInstant() { 210 void BrowserInstantController::ResetInstant() {
167 instant_.reset( 211 instant_.reset(
168 !browser_shutdown::ShuttingDownWithoutClosingBrowsers() && 212 !browser_shutdown::ShuttingDownWithoutClosingBrowsers() &&
169 browser_->is_type_tabbed() ? 213 browser_->is_type_tabbed() ?
170 InstantController::CreateInstant(browser_->profile(), this) : NULL); 214 InstantController::CreateInstant(browser_->profile(), this) : NULL);
171 215
172 // Notify any observers that they need to reset. 216 // Notify any observers that they need to reset.
173 content::NotificationService::current()->Notify( 217 content::NotificationService::current()->Notify(
174 chrome::NOTIFICATION_BROWSER_INSTANT_RESET, 218 chrome::NOTIFICATION_BROWSER_INSTANT_RESET,
175 content::Source<BrowserInstantController>(this), 219 content::Source<BrowserInstantController>(this),
176 content::NotificationService::NoDetails()); 220 content::NotificationService::NoDetails());
177 } 221 }
178 222
223 void BrowserInstantController::OnThemeChanged(ThemeService* theme_service) {
224 if (theme_service) { // Get theme information from theme service.
225 theme_info_ = ThemeBackgroundInfo();
226
227 // Set theme background color.
228 SkColor background_color =
229 theme_service->GetColor(ThemeService::COLOR_NTP_BACKGROUND);
230 if (gfx::IsInvertedColorScheme())
231 background_color = color_utils::InvertColor(background_color);
232 theme_info_.color_r = SkColorGetR(background_color);
233 theme_info_.color_g = SkColorGetG(background_color);
234 theme_info_.color_b = SkColorGetB(background_color);
235 theme_info_.color_a = SkColorGetA(background_color);
236
237 if (theme_service->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) {
238 // Set theme id for theme background image url.
239 theme_info_.theme_id = theme_service->GetThemeID();
240
241 // Set theme background image alignment.
242 theme_service->GetDisplayProperty(ThemeService::NTP_BACKGROUND_ALIGNMENT,
243 &theme_info_.image_alignment);
244
245 // Set theme background image tiling.
246 theme_service->GetDisplayProperty(ThemeService::NTP_BACKGROUND_TILING,
247 &theme_info_.image_tiling);
248
249 // Set theme background image height.
250 gfx::ImageSkia* image = theme_service->GetImageSkiaNamed(
251 IDR_THEME_NTP_BACKGROUND);
252 DCHECK(image);
253 theme_info_.image_height = image->height();
254 }
255
256 initialized_theme_info_ = true;
257 }
258
259 DCHECK(initialized_theme_info_);
260
261 if (instant() && browser_->search_model()->mode().is_ntp()) {
262 instant_->ThemeChanged(theme_info_);
263
264 // Theme area height is only sent to preview for non-top-aligned images;
265 // new theme may have a different alignment that requires preview to know
266 // theme area height.
267 OnThemeAreaHeightChanged(theme_area_height_);
268 }
269 }
270
271 void BrowserInstantController::OnThemeAreaHeightChanged(int height) {
272 theme_area_height_ = height;
273
274 // Notify preview only if mode is |NTP| and theme background image is not top-
275 // aligned; top-aligned images don't need theme area height to determine which
276 // part of the image overlay should draw, 'cos the origin is top-left.
277 if (!instant() || !browser_->search_model()->mode().is_ntp() ||
278 theme_info_.theme_id.empty() ||
279 theme_info_.image_alignment & ThemeService::ALIGN_TOP) {
280 return;
281 }
282 instant_->ThemeAreaHeightChanged(theme_area_height_);
283 }
284
179 } // namespace chrome 285 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698