| OLD | NEW |
| 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 "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/prefs/pref_service.h" | 8 #include "base/prefs/pref_service.h" |
| 9 #include "chrome/browser/extensions/extension_service.h" | 9 #include "chrome/browser/extensions/extension_service.h" |
| 10 #include "chrome/browser/extensions/extension_web_ui.h" | 10 #include "chrome/browser/extensions/extension_web_ui.h" |
| 11 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
| 12 #include "chrome/browser/search/instant_service.h" | 12 #include "chrome/browser/search/instant_service.h" |
| 13 #include "chrome/browser/search/instant_service_factory.h" | 13 #include "chrome/browser/search/instant_service_factory.h" |
| 14 #include "chrome/browser/search/search.h" | 14 #include "chrome/browser/search/search.h" |
| 15 #include "chrome/browser/search_engines/template_url.h" | 15 #include "chrome/browser/search_engines/template_url.h" |
| 16 #include "chrome/browser/search_engines/template_url_service.h" | 16 #include "chrome/browser/search_engines/template_url_service.h" |
| 17 #include "chrome/browser/search_engines/template_url_service_factory.h" | 17 #include "chrome/browser/search_engines/template_url_service_factory.h" |
| 18 #include "chrome/browser/themes/theme_properties.h" | |
| 19 #include "chrome/browser/themes/theme_service.h" | |
| 20 #include "chrome/browser/themes/theme_service_factory.h" | |
| 21 #include "chrome/browser/ui/browser.h" | 18 #include "chrome/browser/ui/browser.h" |
| 22 #include "chrome/browser/ui/browser_window.h" | 19 #include "chrome/browser/ui/browser_window.h" |
| 23 #include "chrome/browser/ui/omnibox/location_bar.h" | 20 #include "chrome/browser/ui/omnibox/location_bar.h" |
| 24 #include "chrome/browser/ui/omnibox/omnibox_view.h" | 21 #include "chrome/browser/ui/omnibox/omnibox_view.h" |
| 25 #include "chrome/browser/ui/search/search_model.h" | 22 #include "chrome/browser/ui/search/search_model.h" |
| 26 #include "chrome/browser/ui/search/search_tab_helper.h" | 23 #include "chrome/browser/ui/search/search_tab_helper.h" |
| 27 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 24 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 28 #include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" | 25 #include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" |
| 29 #include "chrome/common/chrome_notification_types.h" | |
| 30 #include "chrome/common/pref_names.h" | 26 #include "chrome/common/pref_names.h" |
| 31 #include "chrome/common/url_constants.h" | 27 #include "chrome/common/url_constants.h" |
| 32 #include "components/user_prefs/pref_registry_syncable.h" | 28 #include "components/user_prefs/pref_registry_syncable.h" |
| 33 #include "content/public/browser/notification_service.h" | |
| 34 #include "content/public/browser/render_process_host.h" | 29 #include "content/public/browser/render_process_host.h" |
| 35 #include "content/public/browser/user_metrics.h" | 30 #include "content/public/browser/user_metrics.h" |
| 36 #include "content/public/browser/web_contents.h" | 31 #include "content/public/browser/web_contents.h" |
| 37 #include "grit/theme_resources.h" | |
| 38 #include "ui/gfx/color_utils.h" | |
| 39 #include "ui/gfx/sys_color_change_listener.h" | |
| 40 | 32 |
| 41 using content::UserMetricsAction; | 33 using content::UserMetricsAction; |
| 42 | 34 |
| 43 //////////////////////////////////////////////////////////////////////////////// | 35 //////////////////////////////////////////////////////////////////////////////// |
| 44 // BrowserInstantController, public: | 36 // BrowserInstantController, public: |
| 45 | 37 |
| 46 BrowserInstantController::BrowserInstantController(Browser* browser) | 38 BrowserInstantController::BrowserInstantController(Browser* browser) |
| 47 : browser_(browser), | 39 : browser_(browser), |
| 48 instant_(this, | 40 instant_(this, |
| 49 chrome::IsInstantExtendedAPIEnabled()), | 41 chrome::IsInstantExtendedAPIEnabled()), |
| 50 instant_unload_handler_(browser), | 42 instant_unload_handler_(browser) { |
| 51 initialized_theme_info_(false) { | |
| 52 | 43 |
| 53 // TODO(sreeram): Perhaps this can be removed, if field trial info is | 44 // TODO(sreeram): Perhaps this can be removed, if field trial info is |
| 54 // available before we need to register the pref. | 45 // available before we need to register the pref. |
| 55 chrome::SetInstantExtendedPrefDefault(profile()); | 46 chrome::SetInstantExtendedPrefDefault(profile()); |
| 56 | 47 |
| 57 profile_pref_registrar_.Init(profile()->GetPrefs()); | 48 profile_pref_registrar_.Init(profile()->GetPrefs()); |
| 58 profile_pref_registrar_.Add( | 49 profile_pref_registrar_.Add( |
| 59 prefs::kSearchInstantEnabled, | 50 prefs::kSearchInstantEnabled, |
| 60 base::Bind(&BrowserInstantController::ResetInstant, | 51 base::Bind(&BrowserInstantController::ResetInstant, |
| 61 base::Unretained(this))); | 52 base::Unretained(this))); |
| 62 profile_pref_registrar_.Add( | 53 profile_pref_registrar_.Add( |
| 63 prefs::kSearchSuggestEnabled, | 54 prefs::kSearchSuggestEnabled, |
| 64 base::Bind(&BrowserInstantController::ResetInstant, | 55 base::Bind(&BrowserInstantController::ResetInstant, |
| 65 base::Unretained(this))); | 56 base::Unretained(this))); |
| 66 profile_pref_registrar_.Add( | 57 profile_pref_registrar_.Add( |
| 67 prefs::kDefaultSearchProviderID, | 58 prefs::kDefaultSearchProviderID, |
| 68 base::Bind(&BrowserInstantController::OnDefaultSearchProviderChanged, | 59 base::Bind(&BrowserInstantController::OnDefaultSearchProviderChanged, |
| 69 base::Unretained(this))); | 60 base::Unretained(this))); |
| 70 ResetInstant(std::string()); | 61 ResetInstant(std::string()); |
| 71 browser_->search_model()->AddObserver(this); | 62 browser_->search_model()->AddObserver(this); |
| 72 | |
| 73 #if defined(ENABLE_THEMES) | |
| 74 // Listen for theme installation. | |
| 75 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | |
| 76 content::Source<ThemeService>( | |
| 77 ThemeServiceFactory::GetForProfile(profile()))); | |
| 78 #endif // defined(ENABLE_THEMES) | |
| 79 } | 63 } |
| 80 | 64 |
| 81 BrowserInstantController::~BrowserInstantController() { | 65 BrowserInstantController::~BrowserInstantController() { |
| 82 browser_->search_model()->RemoveObserver(this); | 66 browser_->search_model()->RemoveObserver(this); |
| 83 } | 67 } |
| 84 | 68 |
| 85 bool BrowserInstantController::MaybeSwapInInstantNTPContents( | 69 bool BrowserInstantController::MaybeSwapInInstantNTPContents( |
| 86 const GURL& url, | 70 const GURL& url, |
| 87 content::WebContents* source_contents, | 71 content::WebContents* source_contents, |
| 88 content::WebContents** target_contents) { | 72 content::WebContents** target_contents) { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 } | 211 } |
| 228 | 212 |
| 229 void BrowserInstantController::ActiveTabChanged() { | 213 void BrowserInstantController::ActiveTabChanged() { |
| 230 instant_.ActiveTabChanged(); | 214 instant_.ActiveTabChanged(); |
| 231 } | 215 } |
| 232 | 216 |
| 233 void BrowserInstantController::TabDeactivated(content::WebContents* contents) { | 217 void BrowserInstantController::TabDeactivated(content::WebContents* contents) { |
| 234 instant_.TabDeactivated(contents); | 218 instant_.TabDeactivated(contents); |
| 235 } | 219 } |
| 236 | 220 |
| 237 void BrowserInstantController::UpdateThemeInfo() { | |
| 238 // Update theme background info. | |
| 239 // Initialize |theme_info| if necessary. | |
| 240 if (!initialized_theme_info_) | |
| 241 OnThemeChanged(ThemeServiceFactory::GetForProfile(profile())); | |
| 242 else | |
| 243 OnThemeChanged(NULL); | |
| 244 } | |
| 245 | |
| 246 void BrowserInstantController::OpenURL( | 221 void BrowserInstantController::OpenURL( |
| 247 const GURL& url, | 222 const GURL& url, |
| 248 content::PageTransition transition, | 223 content::PageTransition transition, |
| 249 WindowOpenDisposition disposition) { | 224 WindowOpenDisposition disposition) { |
| 250 browser_->OpenURL(content::OpenURLParams(url, | 225 browser_->OpenURL(content::OpenURLParams(url, |
| 251 content::Referrer(), | 226 content::Referrer(), |
| 252 disposition, | 227 disposition, |
| 253 transition, | 228 transition, |
| 254 false)); | 229 false)); |
| 255 } | 230 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 282 if (chrome::IsInstantExtendedAPIEnabled()) { | 257 if (chrome::IsInstantExtendedAPIEnabled()) { |
| 283 // Record some actions corresponding to the mode change. Note that to get | 258 // Record some actions corresponding to the mode change. Note that to get |
| 284 // the full story, it's necessary to look at other UMA actions as well, | 259 // the full story, it's necessary to look at other UMA actions as well, |
| 285 // such as tab switches. | 260 // such as tab switches. |
| 286 if (new_mode.is_search_results()) | 261 if (new_mode.is_search_results()) |
| 287 content::RecordAction(UserMetricsAction("InstantExtended.ShowSRP")); | 262 content::RecordAction(UserMetricsAction("InstantExtended.ShowSRP")); |
| 288 else if (new_mode.is_ntp()) | 263 else if (new_mode.is_ntp()) |
| 289 content::RecordAction(UserMetricsAction("InstantExtended.ShowNTP")); | 264 content::RecordAction(UserMetricsAction("InstantExtended.ShowNTP")); |
| 290 } | 265 } |
| 291 | 266 |
| 292 // If mode is now |NTP|, send theme-related information to Instant. | |
| 293 if (new_mode.is_ntp()) | |
| 294 UpdateThemeInfo(); | |
| 295 | |
| 296 instant_.SearchModeChanged(old_state.mode, new_mode); | 267 instant_.SearchModeChanged(old_state.mode, new_mode); |
| 297 } | 268 } |
| 298 | 269 |
| 299 if (old_state.instant_support != new_state.instant_support) | 270 if (old_state.instant_support != new_state.instant_support) |
| 300 instant_.InstantSupportChanged(new_state.instant_support); | 271 instant_.InstantSupportChanged(new_state.instant_support); |
| 301 } | 272 } |
| 302 | 273 |
| 303 //////////////////////////////////////////////////////////////////////////////// | |
| 304 // BrowserInstantController, content::NotificationObserver implementation: | |
| 305 | |
| 306 void BrowserInstantController::Observe( | |
| 307 int type, | |
| 308 const content::NotificationSource& source, | |
| 309 const content::NotificationDetails& details) { | |
| 310 #if defined(ENABLE_THEMES) | |
| 311 DCHECK_EQ(chrome::NOTIFICATION_BROWSER_THEME_CHANGED, type); | |
| 312 OnThemeChanged(content::Source<ThemeService>(source).ptr()); | |
| 313 #endif // defined(ENABLE_THEMES) | |
| 314 } | |
| 315 | |
| 316 void BrowserInstantController::OnThemeChanged(ThemeService* theme_service) { | |
| 317 if (theme_service) { // Get theme information from theme service. | |
| 318 theme_info_ = ThemeBackgroundInfo(); | |
| 319 | |
| 320 // Set theme background color. | |
| 321 SkColor background_color = | |
| 322 theme_service->GetColor(ThemeProperties::COLOR_NTP_BACKGROUND); | |
| 323 if (gfx::IsInvertedColorScheme()) | |
| 324 background_color = color_utils::InvertColor(background_color); | |
| 325 theme_info_.color_r = SkColorGetR(background_color); | |
| 326 theme_info_.color_g = SkColorGetG(background_color); | |
| 327 theme_info_.color_b = SkColorGetB(background_color); | |
| 328 theme_info_.color_a = SkColorGetA(background_color); | |
| 329 | |
| 330 if (theme_service->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) { | |
| 331 // Set theme id for theme background image url. | |
| 332 theme_info_.theme_id = theme_service->GetThemeID(); | |
| 333 | |
| 334 // Set theme background image horizontal alignment. | |
| 335 int alignment = 0; | |
| 336 theme_service->GetDisplayProperty( | |
| 337 ThemeProperties::NTP_BACKGROUND_ALIGNMENT, &alignment); | |
| 338 if (alignment & ThemeProperties::ALIGN_LEFT) { | |
| 339 theme_info_.image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_LEFT; | |
| 340 } else if (alignment & ThemeProperties::ALIGN_RIGHT) { | |
| 341 theme_info_.image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_RIGHT; | |
| 342 } else { // ALIGN_CENTER | |
| 343 theme_info_.image_horizontal_alignment = | |
| 344 THEME_BKGRND_IMAGE_ALIGN_CENTER; | |
| 345 } | |
| 346 | |
| 347 // Set theme background image vertical alignment. | |
| 348 if (alignment & ThemeProperties::ALIGN_TOP) | |
| 349 theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_TOP; | |
| 350 else if (alignment & ThemeProperties::ALIGN_BOTTOM) | |
| 351 theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_BOTTOM; | |
| 352 else // ALIGN_CENTER | |
| 353 theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_CENTER; | |
| 354 | |
| 355 // Set theme background image tiling. | |
| 356 int tiling = 0; | |
| 357 theme_service->GetDisplayProperty(ThemeProperties::NTP_BACKGROUND_TILING, | |
| 358 &tiling); | |
| 359 switch (tiling) { | |
| 360 case ThemeProperties::NO_REPEAT: | |
| 361 theme_info_.image_tiling = THEME_BKGRND_IMAGE_NO_REPEAT; | |
| 362 break; | |
| 363 case ThemeProperties::REPEAT_X: | |
| 364 theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT_X; | |
| 365 break; | |
| 366 case ThemeProperties::REPEAT_Y: | |
| 367 theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT_Y; | |
| 368 break; | |
| 369 case ThemeProperties::REPEAT: | |
| 370 theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT; | |
| 371 break; | |
| 372 } | |
| 373 | |
| 374 // Set theme background image height. | |
| 375 gfx::ImageSkia* image = theme_service->GetImageSkiaNamed( | |
| 376 IDR_THEME_NTP_BACKGROUND); | |
| 377 DCHECK(image); | |
| 378 theme_info_.image_height = image->height(); | |
| 379 | |
| 380 theme_info_.has_attribution = | |
| 381 theme_service->HasCustomImage(IDR_THEME_NTP_ATTRIBUTION); | |
| 382 } | |
| 383 | |
| 384 initialized_theme_info_ = true; | |
| 385 } | |
| 386 | |
| 387 DCHECK(initialized_theme_info_); | |
| 388 | |
| 389 if (browser_->search_model()->mode().is_ntp()) | |
| 390 instant_.ThemeChanged(theme_info_); | |
| 391 } | |
| 392 | |
| 393 void BrowserInstantController::OnDefaultSearchProviderChanged( | 274 void BrowserInstantController::OnDefaultSearchProviderChanged( |
| 394 const std::string& pref_name) { | 275 const std::string& pref_name) { |
| 395 DCHECK_EQ(pref_name, std::string(prefs::kDefaultSearchProviderID)); | 276 DCHECK_EQ(pref_name, std::string(prefs::kDefaultSearchProviderID)); |
| 396 | 277 |
| 397 Profile* browser_profile = profile(); | 278 Profile* browser_profile = profile(); |
| 398 const TemplateURL* template_url = | 279 const TemplateURL* template_url = |
| 399 TemplateURLServiceFactory::GetForProfile(browser_profile)-> | 280 TemplateURLServiceFactory::GetForProfile(browser_profile)-> |
| 400 GetDefaultSearchProvider(); | 281 GetDefaultSearchProvider(); |
| 401 if (!template_url) { | 282 if (!template_url) { |
| 402 // A NULL |template_url| could mean either this notification is sent during | 283 // A NULL |template_url| could mean either this notification is sent during |
| (...skipping 28 matching lines...) Expand all Loading... |
| 431 if (!instant_service->IsInstantProcess( | 312 if (!instant_service->IsInstantProcess( |
| 432 contents->GetRenderProcessHost()->GetID())) | 313 contents->GetRenderProcessHost()->GetID())) |
| 433 continue; | 314 continue; |
| 434 | 315 |
| 435 // Reload the contents to ensure that it gets assigned to a non-priviledged | 316 // Reload the contents to ensure that it gets assigned to a non-priviledged |
| 436 // renderer. | 317 // renderer. |
| 437 contents->GetController().Reload(false); | 318 contents->GetController().Reload(false); |
| 438 } | 319 } |
| 439 instant_.OnDefaultSearchProviderChanged(); | 320 instant_.OnDefaultSearchProviderChanged(); |
| 440 } | 321 } |
| OLD | NEW |