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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/sync/glue/search_engine_data_type_controller.h" 6 7 #include "base/metrics/histogram.h" 8 #include "chrome/browser/profiles/profile.h" 9 #include "chrome/browser/search_engines/template_url_service_factory.h" 10 #include "chrome/browser/sync/glue/chrome_report_unrecoverable_error.h" 11 #include "chrome/browser/sync/profile_sync_service.h" 12 #include "content/public/browser/browser_thread.h" 13 #include "sync/api/syncable_service.h" 14 15 using content::BrowserThread; 16 17 namespace browser_sync { 18 SearchEngineDataTypeController(sync_driver::SyncApiComponentFactory * sync_factory,Profile * profile)19SearchEngineDataTypeController::SearchEngineDataTypeController( 20 sync_driver::SyncApiComponentFactory* sync_factory, 21 Profile* profile) 22 : UIDataTypeController( 23 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), 24 base::Bind(&ChromeReportUnrecoverableError), 25 syncer::SEARCH_ENGINES, 26 sync_factory), 27 profile_(profile) { 28 } 29 30 TemplateURLService::Subscription* GetSubscriptionForTesting()31SearchEngineDataTypeController::GetSubscriptionForTesting() { 32 return template_url_subscription_.get(); 33 } 34 ~SearchEngineDataTypeController()35SearchEngineDataTypeController::~SearchEngineDataTypeController() {} 36 37 // We want to start the TemplateURLService before we begin associating. StartModels()38bool SearchEngineDataTypeController::StartModels() { 39 // If the TemplateURLService is loaded, continue with association. We force 40 // a load here to prevent the rest of Sync from waiting on 41 // TemplateURLService's lazy load. 42 TemplateURLService* turl_service = 43 TemplateURLServiceFactory::GetForProfile(profile_); 44 DCHECK(turl_service); 45 turl_service->Load(); 46 if (turl_service->loaded()) { 47 return true; // Continue to Associate(). 48 } 49 50 // Register a callback and continue when the TemplateURLService is loaded. 51 template_url_subscription_ = turl_service->RegisterOnLoadedCallback( 52 base::Bind(&SearchEngineDataTypeController::OnTemplateURLServiceLoaded, 53 this)); 54 55 return false; // Don't continue Start. 56 } 57 StopModels()58void SearchEngineDataTypeController::StopModels() { 59 template_url_subscription_.reset(); 60 } 61 OnTemplateURLServiceLoaded()62void SearchEngineDataTypeController::OnTemplateURLServiceLoaded() { 63 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 64 DCHECK_EQ(state_, MODEL_STARTING); 65 template_url_subscription_.reset(); 66 OnModelLoaded(); 67 } 68 69 } // namespace browser_sync 70