Chromium Code Reviews| Index: chrome/browser/search/instant_service.cc |
| diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc |
| index ccf8c885a79f398e1e5b9fddd4c1820be384928f..abe855ca6cdf7c9d547d0b8ea587188b1017e83c 100644 |
| --- a/chrome/browser/search/instant_service.cc |
| +++ b/chrome/browser/search/instant_service.cc |
| @@ -14,10 +14,14 @@ |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/search/instant_io_context.h" |
| #include "chrome/browser/search/instant_service_factory.h" |
| +#include "chrome/browser/search/instant_service_observer.h" |
| #include "chrome/browser/search/local_ntp_source.h" |
| #include "chrome/browser/search/most_visited_iframe_source.h" |
| #include "chrome/browser/search/search.h" |
| #include "chrome/browser/search/suggestion_iframe_source.h" |
| +#include "chrome/browser/themes/theme_properties.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_instant_controller.h" |
| #include "chrome/browser/ui/browser_list.h" |
| @@ -33,7 +37,11 @@ |
| #include "content/public/browser/render_process_host.h" |
| #include "content/public/browser/url_data_source.h" |
| #include "googleurl/src/gurl.h" |
| +#include "grit/theme_resources.h" |
| #include "net/url_request/url_request.h" |
| +#include "ui/gfx/color_utils.h" |
| +#include "ui/gfx/image/image_skia.h" |
| +#include "ui/gfx/sys_color_change_listener.h" |
| using content::BrowserThread; |
| @@ -65,8 +73,14 @@ InstantService::InstantService(Profile* profile) |
| // Set up the data sources that Instant uses on the NTP. |
| #if defined(ENABLE_THEMES) |
| + // Listen for theme installation. |
| + registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
| + content::Source<ThemeService>( |
| + ThemeServiceFactory::GetForProfile(profile_))); |
| + |
| content::URLDataSource::Add(profile, new ThemeSource(profile)); |
| -#endif |
| +#endif // defined(ENABLE_THEMES) |
| + |
| content::URLDataSource::Add(profile, new ThumbnailSource(profile)); |
| content::URLDataSource::Add(profile, new FaviconSource( |
| profile, FaviconSource::FAVICON)); |
| @@ -94,6 +108,14 @@ bool InstantService::IsInstantProcess(int process_id) const { |
| return process_ids_.find(process_id) != process_ids_.end(); |
| } |
| +void InstantService::AddObserver(InstantServiceObserver* observer) { |
| + observers_.AddObserver(observer); |
| +} |
| + |
| +void InstantService::RemoveObserver(InstantServiceObserver* observer) { |
| + observers_.RemoveObserver(observer); |
| +} |
| + |
| void InstantService::DeleteMostVisitedItem(const GURL& url) { |
| history::TopSites* top_sites = profile_->GetTopSites(); |
| if (!top_sites) |
| @@ -123,6 +145,15 @@ void InstantService::GetCurrentMostVisitedItems( |
| *items = most_visited_items_; |
| } |
| +void InstantService::UpdateThemeInfo() { |
| + // Update theme background info. |
| + // Initialize |theme_info| if necessary. |
| + if (!theme_info_.IsValid()) |
|
samarth
2013/06/19 00:14:36
Instead of adding a IsValid here, just keep a bool
kmadhusu
2013/06/19 02:27:24
I want to invalidate ThemeBackgroundInfo in Search
samarth
2013/06/19 05:34:54
That makes sense but I'm still not a fan of having
kmadhusu
2013/06/19 17:43:30
Done. Used scoped_ptr.
|
| + OnThemeChanged(ThemeServiceFactory::GetForProfile(profile_)); |
| + else |
| + OnThemeChanged(NULL); |
| +} |
| + |
| void InstantService::Shutdown() { |
| process_ids_.clear(); |
| @@ -164,6 +195,12 @@ void InstantService::Observe(int type, |
| } |
| break; |
| } |
| +#if defined(ENABLE_THEMES) |
| + case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: { |
| + OnThemeChanged(content::Source<ThemeService>(source).ptr()); |
| + break; |
| + } |
| +#endif // defined(ENABLE_THEMES) |
| default: |
| NOTREACHED() << "Unexpected notification type in InstantService."; |
| } |
| @@ -208,3 +245,85 @@ void InstantService::OnMostVisitedItemsReceived( |
| } |
| #endif |
| } |
| + |
| +void InstantService::OnThemeChanged(ThemeService* theme_service) { |
| + if (!theme_service) { |
|
samarth
2013/06/19 00:14:36
I slightly preferred the way it was written in Bro
kmadhusu
2013/06/19 02:27:24
I would like to leave it as it is. I don't want to
|
| + DCHECK(theme_info_.IsValid()); |
| + FOR_EACH_OBSERVER(InstantServiceObserver, observers_, |
| + ThemeInfoChanged(theme_info_)); |
| + return; |
| + } |
| + |
| + // Get theme information from theme service. |
| + theme_info_ = ThemeBackgroundInfo(); |
| + theme_info_.Initialize(); |
| + |
| + // Set theme background color. |
| + SkColor background_color = |
| + theme_service->GetColor(ThemeProperties::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( |
| + ThemeProperties::NTP_BACKGROUND_ALIGNMENT, &alignment); |
| + if (alignment & ThemeProperties::ALIGN_LEFT) |
| + theme_info_.image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_LEFT; |
| + else if (alignment & ThemeProperties::ALIGN_RIGHT) |
| + theme_info_.image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_RIGHT; |
| + else |
| + theme_info_.image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_CENTER; |
| + |
| + // Set theme background image vertical alignment. |
| + if (alignment & ThemeProperties::ALIGN_TOP) |
| + theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_TOP; |
| + else if (alignment & ThemeProperties::ALIGN_BOTTOM) |
| + theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_BOTTOM; |
| + else |
| + theme_info_.image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_CENTER; |
| + |
| + // Set theme backgorund image tiling. |
| + int tiling = 0; |
| + theme_service->GetDisplayProperty(ThemeProperties::NTP_BACKGROUND_TILING, |
| + &tiling); |
| + switch (tiling) { |
| + case ThemeProperties::NO_REPEAT: |
| + theme_info_.image_tiling = THEME_BKGRND_IMAGE_NO_REPEAT; |
| + break; |
| + case ThemeProperties::REPEAT_X: |
| + theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT_X; |
| + break; |
| + case ThemeProperties::REPEAT_Y: |
| + theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT_Y; |
| + break; |
| + case ThemeProperties::REPEAT: |
| + theme_info_.image_tiling = THEME_BKGRND_IMAGE_REPEAT; |
| + break; |
| + default: |
|
samarth
2013/06/19 00:14:36
This is new. Why?
kmadhusu
2013/06/19 02:27:24
Good catch. Removed.
|
| + theme_info_.image_tiling = THEME_BKGRND_IMAGE_NO_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(); |
| + |
| + theme_info_.has_attribution = |
| + theme_service->HasCustomImage(IDR_THEME_NTP_ATTRIBUTION); |
| + } |
| + |
| + FOR_EACH_OBSERVER(InstantServiceObserver, observers_, |
| + ThemeInfoChanged(theme_info_)); |
| +} |