diff options
Diffstat (limited to 'src/core/extensions/extension_system_qt.cpp')
-rw-r--r-- | src/core/extensions/extension_system_qt.cpp | 100 |
1 files changed, 31 insertions, 69 deletions
diff --git a/src/core/extensions/extension_system_qt.cpp b/src/core/extensions/extension_system_qt.cpp index 0f44b8db3..b9f11646d 100644 --- a/src/core/extensions/extension_system_qt.cpp +++ b/src/core/extensions/extension_system_qt.cpp @@ -11,7 +11,7 @@ #include "base/base_paths.h" #include "base/base_switches.h" -#include "base/bind.h" +#include "base/functional/bind.h" #include "base/command_line.h" #include "base/files/file_path.h" #include "base/files/file_util.h" @@ -43,11 +43,10 @@ #include "extensions/browser/extension_pref_value_map_factory.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" -#include "extensions/browser/info_map.h" -#include "extensions/browser/notification_types.h" #include "extensions/browser/quota_service.h" #include "extensions/browser/renderer_startup_helper.h" #include "extensions/browser/service_worker_manager.h" +#include "extensions/browser/task_queue_util.h" #include "extensions/browser/user_script_manager.h" #include "extensions/common/constants.h" #include "extensions/common/manifest_constants.h" @@ -69,28 +68,28 @@ namespace extensions { namespace { -std::string GenerateId(const base::DictionaryValue *manifest, const base::FilePath &path) +std::string GenerateId(const base::Value::Dict &manifest, const base::FilePath &path) { - std::string raw_key; + const std::string *raw_key; std::string id_input; - CHECK(manifest->GetString(manifest_keys::kPublicKey, &raw_key)); - CHECK(Extension::ParsePEMKeyBytes(raw_key, &id_input)); + CHECK(raw_key = manifest.FindString(manifest_keys::kPublicKey)); + CHECK(Extension::ParsePEMKeyBytes(*raw_key, &id_input)); std::string id = crx_file::id_util::GenerateId(id_input); return id; } // Implementation based on ComponentLoader::ParseManifest. -std::unique_ptr<base::DictionaryValue> ParseManifest(const std::string &manifest_contents) +absl::optional<base::Value::Dict> ParseManifest(base::StringPiece manifest_contents) { JSONStringValueDeserializer deserializer(manifest_contents); - std::unique_ptr<base::Value> manifest(deserializer.Deserialize(NULL, NULL)); + std::unique_ptr<base::Value> manifest = deserializer.Deserialize(nullptr, nullptr); if (!manifest.get() || !manifest->is_dict()) { LOG(ERROR) << "Failed to parse extension manifest."; - return NULL; + return absl::nullopt; } - // Transfer ownership to the caller. - return base::DictionaryValue::From(std::move(manifest)); + + return std::move(*manifest).TakeDict(); } } // namespace @@ -129,38 +128,25 @@ public: void Shutdown() override {} }; -void ExtensionSystemQt::LoadExtension(std::string extension_id, std::unique_ptr<base::DictionaryValue> manifest, const base::FilePath &directory) +void ExtensionSystemQt::LoadExtension(std::string extension_id, const base::Value::Dict &manifest, const base::FilePath &directory) { int flags = Extension::REQUIRE_KEY; std::string error; + scoped_refptr<const Extension> extension = Extension::Create( directory, mojom::ManifestLocation::kComponent, - *manifest, + manifest, flags, &error); if (!extension.get()) LOG(ERROR) << error; - content::GetIOThreadTaskRunner({})->PostTask(FROM_HERE, - base::BindOnce(&InfoMap::AddExtension, - base::Unretained(info_map()), - base::RetainedRef(extension), - base::Time::Now(), - true, - false)); extension_registry_->AddEnabled(extension.get()); NotifyExtensionLoaded(extension.get()); } -void ExtensionSystemQt::OnExtensionRegisteredWithRequestContexts(scoped_refptr<const extensions::Extension> extension) -{ - extension_registry_->AddReady(extension); - if (extension_registry_->enabled_extensions().Contains(extension->id())) - extension_registry_->TriggerOnReady(extension.get()); -} - // Implementation based on ExtensionService::NotifyExtensionLoaded. void ExtensionSystemQt::NotifyExtensionLoaded(const Extension *extension) { @@ -170,11 +156,7 @@ void ExtensionSystemQt::NotifyExtensionLoaded(const Extension *extension) // that the request context doesn't yet know about. The profile is responsible // for ensuring its URLRequestContexts appropriately discover the loaded // extension. - RegisterExtensionWithRequestContexts( - extension, - base::BindRepeating(&ExtensionSystemQt::OnExtensionRegisteredWithRequestContexts, - weak_ptr_factory_.GetWeakPtr(), - base::WrapRefCounted(extension))); + ActivateTaskQueueForExtension(browser_context_, extension); // Tell renderers about the loaded extension. renderer_helper_->OnExtensionLoaded(*extension); @@ -191,8 +173,10 @@ void ExtensionSystemQt::NotifyExtensionLoaded(const Extension *extension) #if BUILDFLAG(ENABLE_PLUGINS) // Register plugins included with the extension. // Implementation based on PluginManager::OnExtensionLoaded. + bool plugins_changed = false; const MimeTypesHandler *handler = MimeTypesHandler::GetHandler(extension); if (handler && handler->HasPlugin()) { + plugins_changed = true; content::WebPluginInfo info; info.type = content::WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN; info.name = base::UTF8ToUTF16(extension->name()); @@ -214,7 +198,13 @@ void ExtensionSystemQt::NotifyExtensionLoaded(const Extension *extension) plugin_service->RefreshPlugins(); plugin_service->RegisterInternalPlugin(info, true); } + if (plugins_changed) + content::PluginService::GetInstance()->PurgePluginListCache(browser_context_, false); #endif // BUILDFLAG(ENABLE_PLUGINS) + + extension_registry_->AddReady(extension); + if (extension_registry_->enabled_extensions().Contains(extension->id())) + extension_registry_->TriggerOnReady(extension); } bool ExtensionSystemQt::FinishDelayedInstallationIfReady(const std::string &extension_id, bool install_immediately) @@ -269,13 +259,6 @@ scoped_refptr<value_store::ValueStoreFactory> ExtensionSystemQt::store_factory() return store_factory_; } -InfoMap *ExtensionSystemQt::info_map() -{ - if (!info_map_.get()) - info_map_ = new InfoMap; - return info_map_.get(); -} - QuotaService *ExtensionSystemQt::quota_service() { return quota_service_.get(); @@ -331,24 +314,26 @@ void ExtensionSystemQt::Init(bool extensions_enabled) std::string pdf_manifest = ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(IDR_PDF_MANIFEST); base::ReplaceFirstSubstringAfterOffset(&pdf_manifest, 0, "<NAME>", "chromium-pdf"); - std::unique_ptr<base::DictionaryValue> pdfManifestDict = ParseManifest(pdf_manifest); + auto pdfManifestDict = ParseManifest(pdf_manifest); + CHECK(pdfManifestDict); base::FilePath path; base::PathService::Get(base::DIR_QT_LIBRARY_DATA, &path); path = path.Append(base::FilePath(FILE_PATH_LITERAL("pdf"))); - std::string id = GenerateId(pdfManifestDict.get(), path); - LoadExtension(id, std::move(pdfManifestDict), path); + std::string id = GenerateId(pdfManifestDict.value(), path); + LoadExtension(id, pdfManifestDict.value(), path); } #endif // BUILDFLAG(ENABLE_PDF) #if BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) { std::string hangout_manifest = ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(IDR_HANGOUT_SERVICES_MANIFEST); - std::unique_ptr<base::DictionaryValue> hangoutManifestDict = ParseManifest(hangout_manifest); + auto hangoutManifestDict = ParseManifest(hangout_manifest); + CHECK(hangoutManifestDict); base::FilePath path; base::PathService::Get(base::DIR_QT_LIBRARY_DATA, &path); path = path.Append(base::FilePath(FILE_PATH_LITERAL("hangout_services"))); - std::string id = GenerateId(hangoutManifestDict.get(), path); - LoadExtension(id, std::move(hangoutManifestDict), path); + std::string id = GenerateId(hangoutManifestDict.value(), path); + LoadExtension(id, hangoutManifestDict.value(), path); } #endif // BUILDFLAG(ENABLE_HANGOUT_SERVICES_EXTENSION) } @@ -358,8 +343,6 @@ void ExtensionSystemQt::InitForRegularProfile(bool extensions_enabled) { if (initialized_) return; // Already initialized. - // The InfoMap needs to be created before the ProcessManager. - info_map(); Init(extensions_enabled); } @@ -369,27 +352,6 @@ std::unique_ptr<ExtensionSet> ExtensionSystemQt::GetDependentExtensions(const Ex return base::WrapUnique(new ExtensionSet()); } -void ExtensionSystemQt::RegisterExtensionWithRequestContexts(const Extension *extension, - base::OnceClosure callback) -{ - base::Time install_time = base::Time::Now(); - - bool incognito_enabled = false; - bool notifications_disabled = false; - - content::GetIOThreadTaskRunner({})->PostTaskAndReply(FROM_HERE, - base::BindOnce(&InfoMap::AddExtension, info_map(), - base::RetainedRef(extension), install_time, incognito_enabled, - notifications_disabled), - std::move(callback)); -} - -void ExtensionSystemQt::UnregisterExtensionWithRequestContexts(const std::string &extension_id) -{ - content::GetIOThreadTaskRunner({})->PostTask(FROM_HERE, - base::BindOnce(&InfoMap::RemoveExtension, info_map(), extension_id)); -} - bool ExtensionSystemQt::is_ready() const { return ready_.is_signaled(); |