Chromium Code Reviews| Index: chrome/browser/extensions/external_provider_impl.cc |
| diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc |
| index 9b62f0f43c3d092d0295db9f60867bb8f8e6b31c..fd015c560d6a690ac44cf7a7b8d1d65bc3d78a2c 100644 |
| --- a/chrome/browser/extensions/external_provider_impl.cc |
| +++ b/chrome/browser/extensions/external_provider_impl.cc |
| @@ -119,7 +119,139 @@ void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) { |
| prefs_.reset(prefs); |
| ready_ = true; // Queries for extensions are allowed from this point. |
| + NotifyExtensionsFromPrefs(true); |
| + service_->OnExternalProviderReady(this); |
| +} |
| + |
| +void ExternalProviderImpl::UpdatePrefs(base::DictionaryValue* prefs) { |
|
Devlin
2016/01/21 00:14:26
This is a little hard to review - can you un-move
lazyboy
2016/01/21 21:02:12
Done.
|
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + // We only expect updates from windows registry. |
| + CHECK(crx_location_ == Manifest::EXTERNAL_REGISTRY); |
| + |
| + // Check if the service is still alive. It is possible that it went |
| + // away while |loader_| was working on the FILE thread. |
| + if (!service_) |
| + return; |
| + std::set<std::string> removed_extensions; |
| + // Find extensions that were removed by this ExternalProvider. |
| + for (base::DictionaryValue::Iterator i(*prefs_); !i.IsAtEnd(); i.Advance()) { |
| + const std::string& extension_id = i.key(); |
| + // Don't bother about invalid ids. |
| + if (!crx_file::id_util::IdIsValid(extension_id)) |
| + continue; |
| + if (!prefs->HasKey(extension_id)) |
| + removed_extensions.insert(extension_id); |
| + } |
| + |
| + prefs_.reset(prefs); |
| + |
| + // Notify ExtensionService about all the extension this provider has found |
| + // "updates" for. |
| + // For each update found, this will end up calling |
| + // OnExternalExtensionUpdateUrlFound() or OnExternalExtensionFileFound(). |
| + NotifyExtensionsFromPrefs(false); |
| + // Then notify about the completion of update, with list of extensions that |
| + // were removed. |
| + service_->OnExternalProviderUpdateComplete(this, removed_extensions); |
| +} |
| + |
| +void ExternalProviderImpl::ServiceShutdown() { |
| + service_ = NULL; |
| +} |
| + |
| +bool ExternalProviderImpl::IsReady() const { |
| + return ready_; |
| +} |
| + |
| +bool ExternalProviderImpl::HasExtension( |
| + const std::string& id) const { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + CHECK(prefs_.get()); |
| + CHECK(ready_); |
| + return prefs_->HasKey(id); |
| +} |
| + |
| +bool ExternalProviderImpl::GetExtensionDetails( |
| + const std::string& id, Manifest::Location* location, |
| + scoped_ptr<Version>* version) const { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + CHECK(prefs_.get()); |
| + CHECK(ready_); |
| + base::DictionaryValue* extension = NULL; |
| + if (!prefs_->GetDictionary(id, &extension)) |
| + return false; |
| + |
| + Manifest::Location loc = Manifest::INVALID_LOCATION; |
| + if (extension->HasKey(kExternalUpdateUrl)) { |
| + loc = download_location_; |
| + |
| + } else if (extension->HasKey(kExternalCrx)) { |
| + loc = crx_location_; |
| + |
| + std::string external_version; |
| + if (!extension->GetString(kExternalVersion, &external_version)) |
| + return false; |
| + |
| + if (version) |
| + version->reset(new Version(external_version)); |
| + |
| + } else { |
| + NOTREACHED(); // Chrome should not allow prefs to get into this state. |
| + return false; |
| + } |
| + |
| + if (location) |
| + *location = loc; |
| + |
| + return true; |
| +} |
| + |
| +bool ExternalProviderImpl::HandleMinProfileVersion( |
| + const base::DictionaryValue* extension, |
| + const std::string& extension_id, |
| + std::set<std::string>* unsupported_extensions) { |
| + std::string min_profile_created_by_version; |
| + if (profile_ && |
| + extension->GetString(kMinProfileCreatedByVersion, |
| + &min_profile_created_by_version)) { |
| + Version profile_version( |
| + profile_->GetPrefs()->GetString(prefs::kProfileCreatedByVersion)); |
| + Version min_version(min_profile_created_by_version); |
| + if (min_version.IsValid() && profile_version.CompareTo(min_version) < 0) { |
| + unsupported_extensions->insert(extension_id); |
| + VLOG(1) << "Skip installing (or uninstall) external extension: " |
| + << extension_id |
| + << " profile.created_by_version: " << profile_version.GetString() |
| + << " min_profile_created_by_version: " |
| + << min_profile_created_by_version; |
| + return false; |
| + } |
| + } |
| + return true; |
| +} |
| + |
| +bool ExternalProviderImpl::HandleDoNotInstallForEnterprise( |
| + const base::DictionaryValue* extension, |
| + const std::string& extension_id, |
| + std::set<std::string>* unsupported_extensions) { |
| + bool do_not_install_for_enterprise = false; |
| + if (extension->GetBoolean(kDoNotInstallForEnterprise, |
| + &do_not_install_for_enterprise) && |
| + do_not_install_for_enterprise) { |
| + const policy::ProfilePolicyConnector* const connector = |
| + policy::ProfilePolicyConnectorFactory::GetForBrowserContext(profile_); |
| + if (connector->IsManaged()) { |
| + unsupported_extensions->insert(extension_id); |
| + VLOG(1) << "Skip installing (or uninstall) external extension " |
| + << extension_id << " restricted for managed user"; |
| + return false; |
| + } |
| + } |
| + return true; |
| +} |
| + |
| +void ExternalProviderImpl::NotifyExtensionsFromPrefs(bool is_initial_load) { |
| // Set of unsupported extensions that need to be deleted from prefs_. |
| std::set<std::string> unsupported_extensions; |
| @@ -320,7 +452,8 @@ void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) { |
| update_url, |
| download_location_, |
| creation_flags, |
| - auto_acknowledge_); |
| + auto_acknowledge_, |
| + is_initial_load); |
| } |
| } |
| @@ -330,103 +463,6 @@ void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) { |
| // will be uninstalled later because provider doesn't provide it anymore. |
| prefs_->Remove(*it, NULL); |
| } |
| - |
| - service_->OnExternalProviderReady(this); |
| -} |
| - |
| -void ExternalProviderImpl::ServiceShutdown() { |
| - service_ = NULL; |
| -} |
| - |
| -bool ExternalProviderImpl::IsReady() const { |
| - return ready_; |
| -} |
| - |
| -bool ExternalProviderImpl::HasExtension( |
| - const std::string& id) const { |
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - CHECK(prefs_.get()); |
| - CHECK(ready_); |
| - return prefs_->HasKey(id); |
| -} |
| - |
| -bool ExternalProviderImpl::GetExtensionDetails( |
| - const std::string& id, Manifest::Location* location, |
| - scoped_ptr<Version>* version) const { |
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - CHECK(prefs_.get()); |
| - CHECK(ready_); |
| - base::DictionaryValue* extension = NULL; |
| - if (!prefs_->GetDictionary(id, &extension)) |
| - return false; |
| - |
| - Manifest::Location loc = Manifest::INVALID_LOCATION; |
| - if (extension->HasKey(kExternalUpdateUrl)) { |
| - loc = download_location_; |
| - |
| - } else if (extension->HasKey(kExternalCrx)) { |
| - loc = crx_location_; |
| - |
| - std::string external_version; |
| - if (!extension->GetString(kExternalVersion, &external_version)) |
| - return false; |
| - |
| - if (version) |
| - version->reset(new Version(external_version)); |
| - |
| - } else { |
| - NOTREACHED(); // Chrome should not allow prefs to get into this state. |
| - return false; |
| - } |
| - |
| - if (location) |
| - *location = loc; |
| - |
| - return true; |
| -} |
| - |
| -bool ExternalProviderImpl::HandleMinProfileVersion( |
| - const base::DictionaryValue* extension, |
| - const std::string& extension_id, |
| - std::set<std::string>* unsupported_extensions) { |
| - std::string min_profile_created_by_version; |
| - if (profile_ && |
| - extension->GetString(kMinProfileCreatedByVersion, |
| - &min_profile_created_by_version)) { |
| - Version profile_version( |
| - profile_->GetPrefs()->GetString(prefs::kProfileCreatedByVersion)); |
| - Version min_version(min_profile_created_by_version); |
| - if (min_version.IsValid() && profile_version.CompareTo(min_version) < 0) { |
| - unsupported_extensions->insert(extension_id); |
| - VLOG(1) << "Skip installing (or uninstall) external extension: " |
| - << extension_id |
| - << " profile.created_by_version: " << profile_version.GetString() |
| - << " min_profile_created_by_version: " |
| - << min_profile_created_by_version; |
| - return false; |
| - } |
| - } |
| - return true; |
| -} |
| - |
| -bool ExternalProviderImpl::HandleDoNotInstallForEnterprise( |
| - const base::DictionaryValue* extension, |
| - const std::string& extension_id, |
| - std::set<std::string>* unsupported_extensions) { |
| - bool do_not_install_for_enterprise = false; |
| - if (extension->GetBoolean(kDoNotInstallForEnterprise, |
| - &do_not_install_for_enterprise) && |
| - do_not_install_for_enterprise) { |
| - const policy::ProfilePolicyConnector* const connector = |
| - policy::ProfilePolicyConnectorFactory::GetForBrowserContext(profile_); |
| - if (connector->IsManaged()) { |
| - unsupported_extensions->insert(extension_id); |
| - VLOG(1) << "Skip installing (or uninstall) external extension " |
| - << extension_id << " restricted for managed user"; |
| - return false; |
| - } |
| - } |
| - return true; |
| } |
| // static |