12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_service.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/history/top_sites.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/instant_io_context.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/search/instant_service_observer.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/search/local_ntp_source.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/search/most_visited_iframe_source.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/search/search.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/search/suggestions/suggestions_source.h" 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/search_engines/ui_thread_search_terms_data.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/themes/theme_properties.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/themes/theme_service.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/themes/theme_service_factory.h" 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/thumbnails/thumbnail_list_source.h" 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/ui/search/instant_search_prerenderer.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/favicon_source.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/ntp/thumbnail_source.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/webui/theme_source.h" 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/render_messages.h" 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/url_data_source.h" 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/theme_resources.h" 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/color_utils.h" 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/image/image_skia.h" 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/sys_color_change_listener.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace { 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int kSectionBorderAlphaTransparency = 80; 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Converts SkColor to RGBAColor 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochRGBAColor SkColorToRGBAColor(const SkColor& sKColor) { 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RGBAColor color; 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch color.r = SkColorGetR(sKColor); 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch color.g = SkColorGetG(sKColor); 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch color.b = SkColorGetB(sKColor); 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch color.a = SkColorGetA(sKColor); 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return color; 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InstantService::InstantService(Profile* profile) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : profile_(profile), 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) template_url_service_(TemplateURLServiceFactory::GetForProfile(profile_)), 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) omnibox_start_margin_(chrome::kDisableStartMargin), 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) weak_ptr_factory_(this) { 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The initialization below depends on a typical set of browser threads. Skip 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // it if we are running in a unit test without the full suite. 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // This depends on the existence of the typical browser threads. Therefore it 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // is only instantiated here (after the check for a UI thread above). 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) instant_io_context_ = new InstantIOContext(); 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) previous_google_base_url_ = 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL(UIThreadSearchTermsData(profile).GoogleBaseURLValue()); 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TemplateURLService is NULL by default in tests. 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (template_url_service_) { 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) template_url_service_->AddObserver(this); 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const TemplateURL* default_search_provider = 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) template_url_service_->GetDefaultSearchProvider(); 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (default_search_provider) { 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) previous_default_search_provider_.reset( 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) new TemplateURLData(default_search_provider->data())); 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResetInstantSearchPrerenderer(); 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(this, 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::NOTIFICATION_RENDERER_PROCESS_CREATED, 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::NotificationService::AllSources()); 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) registrar_.Add(this, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::AllSources()); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) history::TopSites* top_sites = profile_->GetTopSites(); 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (top_sites) { 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) registrar_.Add(this, 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) chrome::NOTIFICATION_TOP_SITES_CHANGED, 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::Source<history::TopSites>(top_sites)); 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile_ && profile_->GetResourceContext()) { 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::BrowserThread::PostTask( 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::BrowserThread::IO, FROM_HERE, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&InstantIOContext::SetUserDataOnIO, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetResourceContext(), instant_io_context_)); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set up the data sources that Instant uses on the NTP. 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_THEMES) 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Listen for theme installation. 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::Source<ThemeService>( 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ThemeServiceFactory::GetForProfile(profile_))); 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::URLDataSource::Add(profile_, new ThemeSource(profile_)); 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(ENABLE_THEMES) 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // TODO(aurimas) remove this #if once instant_service.cc is no longer compiled 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // on Android. 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if !defined(OS_ANDROID) 12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::URLDataSource::Add(profile_, new ThumbnailSource(profile_, false)); 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::URLDataSource::Add(profile_, new ThumbnailSource(profile_, true)); 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::URLDataSource::Add(profile_, new ThumbnailListSource(profile_)); 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif // !defined(OS_ANDROID) 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::URLDataSource::Add( 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) profile_, new FaviconSource(profile_, FaviconSource::FAVICON)); 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::URLDataSource::Add(profile_, new LocalNtpSource(profile_)); 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::URLDataSource::Add(profile_, new MostVisitedIframeSource()); 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::URLDataSource::Add( 130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) profile_, new suggestions::SuggestionsSource(profile_)); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InstantService::~InstantService() { 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (template_url_service_) 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) template_url_service_->RemoveObserver(this); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstantService::AddInstantProcess(int process_id) { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) process_ids_.insert(process_id); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (instant_io_context_.get()) { 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::BrowserThread::PostTask( 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::BrowserThread::IO, FROM_HERE, 144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&InstantIOContext::AddInstantProcessOnIO, 145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) instant_io_context_, process_id)); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool InstantService::IsInstantProcess(int process_id) const { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return process_ids_.find(process_id) != process_ids_.end(); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::AddObserver(InstantServiceObserver* observer) { 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch observers_.AddObserver(observer); 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::RemoveObserver(InstantServiceObserver* observer) { 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch observers_.RemoveObserver(observer); 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void InstantService::DeleteMostVisitedItem(const GURL& url) { 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) history::TopSites* top_sites = profile_->GetTopSites(); 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!top_sites) 164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) top_sites->AddBlacklistedURL(url); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void InstantService::UndoMostVisitedDeletion(const GURL& url) { 170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) history::TopSites* top_sites = profile_->GetTopSites(); 171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!top_sites) 172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) top_sites->RemoveBlacklistedURL(url); 175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void InstantService::UndoAllMostVisitedDeletions() { 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) history::TopSites* top_sites = profile_->GetTopSites(); 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!top_sites) 180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) top_sites->ClearBlacklistedURLs(); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::UpdateThemeInfo() { 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Update theme background info. 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Initialize |theme_info| if necessary. 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!theme_info_) 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnThemeChanged(ThemeServiceFactory::GetForProfile(profile_)); 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnThemeChanged(NULL); 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::UpdateMostVisitedItemsInfo() { 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NotifyAboutMostVisitedItems(); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstantService::Shutdown() { 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) process_ids_.clear(); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (instant_io_context_.get()) { 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::BrowserThread::PostTask( 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::BrowserThread::IO, FROM_HERE, 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&InstantIOContext::ClearInstantProcessesOnIO, 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_io_context_)); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_io_context_ = NULL; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstantService::Observe(int type, 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) { 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (type) { 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case content::NOTIFICATION_RENDERER_PROCESS_CREATED: 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SendSearchURLsToRenderer( 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::Source<content::RenderProcessHost>(source).ptr()); 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: 2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OnRendererProcessTerminated( 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::Source<content::RenderProcessHost>(source)->GetID()); 221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case chrome::NOTIFICATION_TOP_SITES_CHANGED: { 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) history::TopSites* top_sites = profile_->GetTopSites(); 224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (top_sites) { 225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) top_sites->GetMostVisitedURLs( 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&InstantService::OnMostVisitedItemsReceived, 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr()), false); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(ENABLE_THEMES) 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: { 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnThemeChanged(content::Source<ThemeService>(source).ptr()); 234eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(ENABLE_THEMES) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unexpected notification type in InstantService."; 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void InstantService::SendSearchURLsToRenderer(content::RenderProcessHost* rph) { 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) rph->Send(new ChromeViewMsg_SetSearchURLs( 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) chrome::GetSearchURLs(profile_), chrome::GetNewTabPageURL(profile_))); 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InstantService::OnOmniboxStartMarginChanged(int start_margin) { 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) omnibox_start_margin_ = start_margin; 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FOR_EACH_OBSERVER(InstantServiceObserver, observers_, 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OmniboxStartMarginChanged(omnibox_start_margin_)); 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void InstantService::OnRendererProcessTerminated(int process_id) { 2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) process_ids_.erase(process_id); 2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (instant_io_context_.get()) { 257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::BrowserThread::PostTask( 258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::BrowserThread::IO, FROM_HERE, 2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&InstantIOContext::RemoveInstantProcessOnIO, 260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) instant_io_context_, process_id)); 2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void InstantService::OnMostVisitedItemsReceived( 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const history::MostVisitedURLList& data) { 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) history::MostVisitedURLList reordered_data(data); 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<InstantMostVisitedItem> new_most_visited_items; 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (size_t i = 0; i < reordered_data.size(); i++) { 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const history::MostVisitedURL& url = reordered_data[i]; 270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) InstantMostVisitedItem item; 271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.url = url.url; 272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) item.title = url.title; 273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new_most_visited_items.push_back(item); 274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch most_visited_items_ = new_most_visited_items; 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NotifyAboutMostVisitedItems(); 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::NotifyAboutMostVisitedItems() { 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FOR_EACH_OBSERVER(InstantServiceObserver, observers_, 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MostVisitedItemsChanged(most_visited_items_)); 283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid InstantService::OnThemeChanged(ThemeService* theme_service) { 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!theme_service) { 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(theme_info_.get()); 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FOR_EACH_OBSERVER(InstantServiceObserver, observers_, 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ThemeInfoChanged(*theme_info_)); 290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Get theme information from theme service. 294eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_.reset(new ThemeBackgroundInfo()); 295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Get if the current theme is the default theme. 2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch theme_info_->using_default_theme = theme_service->UsingDefaultTheme(); 2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Get theme colors. 300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SkColor background_color = 301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_service->GetColor(ThemeProperties::COLOR_NTP_BACKGROUND); 3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor text_color = 3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch theme_service->GetColor(ThemeProperties::COLOR_NTP_TEXT); 3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor link_color = 3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch theme_service->GetColor(ThemeProperties::COLOR_NTP_LINK); 3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor text_color_light = 3077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch theme_service->GetColor(ThemeProperties::COLOR_NTP_TEXT_LIGHT); 3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor header_color = 3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch theme_service->GetColor(ThemeProperties::COLOR_NTP_HEADER); 3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Generate section border color from the header color. 3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColor section_border_color = 3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColorSetARGB(kSectionBorderAlphaTransparency, 3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColorGetR(header_color), 3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColorGetG(header_color), 3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkColorGetB(header_color)); 3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Invert colors if needed. 3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (gfx::IsInvertedColorScheme()) { 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch background_color = color_utils::InvertColor(background_color); 3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text_color = color_utils::InvertColor(text_color); 3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch link_color = color_utils::InvertColor(link_color); 3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch text_color_light = color_utils::InvertColor(text_color_light); 3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch header_color = color_utils::InvertColor(header_color); 3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch section_border_color = color_utils::InvertColor(section_border_color); 3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Set colors. 3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch theme_info_->background_color = SkColorToRGBAColor(background_color); 3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch theme_info_->text_color = SkColorToRGBAColor(text_color); 3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch theme_info_->link_color = SkColorToRGBAColor(link_color); 3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch theme_info_->text_color_light = SkColorToRGBAColor(text_color_light); 3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch theme_info_->header_color = SkColorToRGBAColor(header_color); 3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch theme_info_->section_border_color = SkColorToRGBAColor(section_border_color); 3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 335424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int logo_alternate = theme_service->GetDisplayProperty( 336424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ThemeProperties::NTP_LOGO_ALTERNATE); 337424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) theme_info_->logo_alternate = logo_alternate == 1; 338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (theme_service->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) { 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set theme id for theme background image url. 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->theme_id = theme_service->GetThemeID(); 342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set theme background image horizontal alignment. 344424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int alignment = theme_service->GetDisplayProperty( 345424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ThemeProperties::NTP_BACKGROUND_ALIGNMENT); 346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (alignment & ThemeProperties::ALIGN_LEFT) 347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_LEFT; 348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else if (alignment & ThemeProperties::ALIGN_RIGHT) 349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_RIGHT; 350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->image_horizontal_alignment = THEME_BKGRND_IMAGE_ALIGN_CENTER; 352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set theme background image vertical alignment. 354eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (alignment & ThemeProperties::ALIGN_TOP) 355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_TOP; 356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else if (alignment & ThemeProperties::ALIGN_BOTTOM) 357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_BOTTOM; 358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->image_vertical_alignment = THEME_BKGRND_IMAGE_ALIGN_CENTER; 360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set theme backgorund image tiling. 362424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) int tiling = theme_service->GetDisplayProperty( 363424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ThemeProperties::NTP_BACKGROUND_TILING); 364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (tiling) { 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case ThemeProperties::NO_REPEAT: 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->image_tiling = THEME_BKGRND_IMAGE_NO_REPEAT; 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case ThemeProperties::REPEAT_X: 369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->image_tiling = THEME_BKGRND_IMAGE_REPEAT_X; 370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case ThemeProperties::REPEAT_Y: 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->image_tiling = THEME_BKGRND_IMAGE_REPEAT_Y; 373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case ThemeProperties::REPEAT: 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->image_tiling = THEME_BKGRND_IMAGE_REPEAT; 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch break; 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Set theme background image height. 380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::ImageSkia* image = theme_service->GetImageSkiaNamed( 381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IDR_THEME_NTP_BACKGROUND); 382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(image); 383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->image_height = image->height(); 384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_info_->has_attribution = 386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch theme_service->HasCustomImage(IDR_THEME_NTP_ATTRIBUTION); 387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FOR_EACH_OBSERVER(InstantServiceObserver, observers_, 390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ThemeInfoChanged(*theme_info_)); 391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 392ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void InstantService::OnTemplateURLServiceChanged() { 394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check whether the default search provider was changed. 395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const TemplateURL* template_url = 396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) template_url_service_->GetDefaultSearchProvider(); 397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool default_search_provider_changed = !TemplateURL::MatchesData( 398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) template_url, previous_default_search_provider_.get(), 399f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UIThreadSearchTermsData(profile_)); 400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (default_search_provider_changed) { 401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) previous_default_search_provider_.reset( 402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) template_url ? new TemplateURLData(template_url->data()) : NULL); 40368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Note that, even if the TemplateURL for the Default Search Provider has not 406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // changed, the effective URLs might change if they reference the Google base 407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // URL. The TemplateURLService will notify us when the effective URL changes 408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // in this way but it's up to us to do the work to check both. 409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL google_base_url(UIThreadSearchTermsData(profile_).GoogleBaseURLValue()); 410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (google_base_url != previous_google_base_url_) { 411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) previous_google_base_url_ = google_base_url; 412f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (template_url && template_url->HasGoogleBaseURLs( 413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) UIThreadSearchTermsData(profile_))) 414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) default_search_provider_changed = true; 415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (default_search_provider_changed) { 418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ResetInstantSearchPrerenderer(); 419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FOR_EACH_OBSERVER(InstantServiceObserver, observers_, 420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DefaultSearchProviderChanged()); 421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 42268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 42368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void InstantService::ResetInstantSearchPrerenderer() { 425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!chrome::ShouldPrefetchSearchResults()) 426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GURL url(chrome::GetSearchResultPrefetchBaseURL(profile_)); 429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) instant_prerenderer_.reset( 430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url.is_valid() ? new InstantSearchPrerenderer(profile_, url) : NULL); 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 432