| Index: chrome/browser/extensions/extension_service.cc | 
| diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc | 
| index 2cfc14495d5feff32ae24d9208049e49ab16d2bc..b4bfde998af0ab8f78bf2f361192d6436859fb82 100644 | 
| --- a/chrome/browser/extensions/extension_service.cc | 
| +++ b/chrome/browser/extensions/extension_service.cc | 
| @@ -350,7 +350,6 @@ ExtensionService::ExtensionService(Profile* profile, | 
| extensions_enabled_(extensions_enabled), | 
| show_extensions_prompts_(true), | 
| install_updates_when_idle_(true), | 
| -      ready_(false), | 
| toolbar_model_(this), | 
| menu_manager_(profile), | 
| event_routers_initialized_(false), | 
| @@ -562,7 +561,7 @@ const Extension* ExtensionService::GetExtensionById( | 
| void ExtensionService::Init() { | 
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
|  | 
| -  DCHECK(!ready_);  // Can't redo init. | 
| +  DCHECK(!ready_.has_happened());  // Can't redo init. | 
| DCHECK_EQ(extensions_.size(), 0u); | 
|  | 
| const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | 
| @@ -585,12 +584,13 @@ void ExtensionService::Init() { | 
| // import process. | 
|  | 
| extensions::InstalledLoader(this).LoadAllExtensions(); | 
| +      SetReadyAndNotifyListeners(); | 
| RegisterForImportFinished(); | 
| } else { | 
| -      // In this case, LoadAllExtensions() calls OnLoadedInstalledExtensions(), | 
| -      // which calls SetReadyAndNotifyListeners(). | 
| +      // In this case, LoadAllExtensions() calls OnLoadedInstalledExtensions(). | 
| component_loader_->LoadAll(); | 
| extensions::InstalledLoader(this).LoadAllExtensions(); | 
| +      SetReadyAndNotifyListeners(); | 
|  | 
| // TODO(erikkay) this should probably be deferred to a future point | 
| // rather than running immediately at startup. | 
| @@ -1234,10 +1234,6 @@ extensions::ContentSettingsStore* ExtensionService::GetContentSettingsStore() { | 
| return extension_prefs()->content_settings_store(); | 
| } | 
|  | 
| -bool ExtensionService::is_ready() { | 
| -  return ready_; | 
| -} | 
| - | 
| base::SequencedTaskRunner* ExtensionService::GetFileTaskRunner() { | 
| if (file_task_runner_) | 
| return file_task_runner_; | 
| @@ -1959,6 +1955,8 @@ void ExtensionService::ReloadExtensions() { | 
| UnloadAllExtensions(); | 
| component_loader_->LoadAll(); | 
| extensions::InstalledLoader(this).LoadAllExtensions(); | 
| +  // Don't call SetReadyAndNotifyListeners() since tests call this multiple | 
| +  // times. | 
| } | 
|  | 
| void ExtensionService::GarbageCollectExtensions() { | 
| @@ -2017,7 +2015,7 @@ void ExtensionService::SyncExtensionChangeIfNeeded(const Extension& extension) { | 
| } | 
|  | 
| void ExtensionService::SetReadyAndNotifyListeners() { | 
| -  ready_ = true; | 
| +  ready_.MarkHappened(); | 
| content::NotificationService::current()->Notify( | 
| chrome::NOTIFICATION_EXTENSIONS_READY, | 
| content::Source<Profile>(profile_), | 
| @@ -2029,8 +2027,6 @@ void ExtensionService::OnLoadedInstalledExtensions() { | 
| updater_->Start(); | 
|  | 
| OnBlacklistUpdated(); | 
| - | 
| -  SetReadyAndNotifyListeners(); | 
| } | 
|  | 
| void ExtensionService::AddExtension(const Extension* extension) { | 
|  |