Index: chrome/browser/component_updater/cros_component_installer.cc |
diff --git a/chrome/browser/component_updater/cros_component_installer.cc b/chrome/browser/component_updater/cros_component_installer.cc |
index f2ed8cf6ca8871d65a050bcc410508145f14cb9b..06710c3e86316886e1573b67bb17b2436ed671a6 100644 |
--- a/chrome/browser/component_updater/cros_component_installer.cc |
+++ b/chrome/browser/component_updater/cros_component_installer.cc |
@@ -11,11 +11,16 @@ |
#include "content/public/browser/browser_thread.h" |
#if defined(OS_CHROMEOS) |
-#include "chromeos/dbus/dbus_method_call_status.h" |
#include "chromeos/dbus/dbus_thread_manager.h" |
#include "chromeos/dbus/image_loader_client.h" |
#endif // defined(OS_CHROMEOS) |
+#define CONFIG_MAP_CONTENT \ |
+ {{"epson-inkjet-printer-escpr", \ |
+ {{"env_version", "2.1"}, \ |
+ {"sha2hashstr", \ |
+ "1913a5e0a6cad30b6f03e176177e0d7ed62c5d6700a9c66da556d7c3f5d6a47e"}}}}; |
+ |
using content::BrowserThread; |
namespace component_updater { |
@@ -81,7 +86,6 @@ update_client::CrxInstaller::Result |
CrOSComponentInstallerTraits::OnCustomInstall( |
const base::DictionaryValue& manifest, |
const base::FilePath& install_dir) { |
- DVLOG(1) << "[CrOSComponentInstallerTraits::OnCustomInstall]"; |
std::string version; |
if (!manifest.GetString("version", &version)) { |
return ToInstallerResult(update_client::InstallError::GENERIC_ERROR); |
@@ -96,7 +100,12 @@ void CrOSComponentInstallerTraits::ComponentReady( |
const base::Version& version, |
const base::FilePath& path, |
std::unique_ptr<base::DictionaryValue> manifest) { |
- g_browser_process->platform_part()->AddCompatibleCrOSComponent(GetName()); |
+ std::string min_env_version; |
+ if (manifest && manifest->GetString("min_env_version", &min_env_version)) { |
+ if (IsCompatible(env_version, min_env_version)) { |
+ g_browser_process->platform_part()->AddCompatibleCrOSComponent(GetName()); |
+ } |
+ } |
} |
bool CrOSComponentInstallerTraits::VerifyInstallation( |
@@ -129,89 +138,108 @@ std::vector<std::string> CrOSComponentInstallerTraits::GetMimeTypes() const { |
return mime_types; |
} |
-void CrOSComponent::RegisterCrOSComponentInternal( |
+bool CrOSComponentInstallerTraits::IsCompatible( |
+ const std::string& env_version_str, |
+ const std::string& min_env_version_str) { |
+ base::Version env_version(env_version_str); |
+ base::Version min_env_version(min_env_version_str); |
+ return env_version.IsValid() && min_env_version.IsValid() && |
+ env_version.components()[0] == min_env_version.components()[0] && |
+ env_version >= min_env_version; |
+} |
+ |
+// It returns load result passing the following as parameters in |
+// load_callback: call_status - dbus call status, result - component mount |
+// point. |
+static void LoadResult( |
+ const base::Callback<void(const std::string&)>& load_callback, |
+ chromeos::DBusMethodCallStatus call_status, |
+ const std::string& result) { |
+ PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ load_callback, |
+ call_status != chromeos::DBUS_METHOD_CALL_SUCCESS ? "" : result)); |
+} |
+ |
+// Internal function to load a component. |
+static void LoadComponentInternal( |
+ const std::string& name, |
+ const base::Callback<void(const std::string&)>& load_callback) { |
+ DCHECK(g_browser_process->platform_part()->IsCompatibleCrOSComponent(name)); |
+ chromeos::ImageLoaderClient* loader = |
+ chromeos::DBusThreadManager::Get()->GetImageLoaderClient(); |
+ if (loader) { |
+ loader->LoadComponent(name, base::Bind(&LoadResult, load_callback)); |
+ } else { |
+ base::PostTask(FROM_HERE, base::Bind(load_callback, "")); |
+ } |
+} |
+ |
+// It calls LoadComponentInternal to load the installed component. |
+static void InstallResult( |
+ const std::string& name, |
+ const base::Callback<void(const std::string&)>& load_callback, |
+ update_client::Error error) { |
+ LoadComponentInternal(name, load_callback); |
+} |
+ |
+// It calls OnDemandUpdate to install the component right after being |
+// registered. |
+void CrOSComponent::RegisterResult( |
ComponentUpdateService* cus, |
- const ComponentConfig& config, |
- const base::Closure& installcallback) { |
+ const std::string& id, |
+ const update_client::Callback& install_callback) { |
+ cus->GetOnDemandUpdater().OnDemandUpdate(id, install_callback); |
+} |
+ |
+// Register a component with a dedicated ComponentUpdateService instance. |
+static void RegisterComponent(ComponentUpdateService* cus, |
+ const ComponentConfig& config, |
+ const base::Closure& register_callback) { |
std::unique_ptr<ComponentInstallerTraits> traits( |
new CrOSComponentInstallerTraits(config)); |
// |cus| will take ownership of |installer| during |
// installer->Register(cus). |
DefaultComponentInstaller* installer = |
new DefaultComponentInstaller(std::move(traits)); |
- installer->Register(cus, installcallback); |
+ installer->Register(cus, register_callback); |
} |
-void CrOSComponent::InstallChromeOSComponent( |
+// Install a component with a dedicated ComponentUpdateService instance. |
+void CrOSComponent::InstallComponent( |
ComponentUpdateService* cus, |
- const std::string& id, |
- const update_client::Callback& install_callback) { |
- cus->GetOnDemandUpdater().OnDemandUpdate(id, install_callback); |
-} |
- |
-bool CrOSComponent::InstallCrOSComponent( |
const std::string& name, |
- const update_client::Callback& install_callback) { |
- auto* const cus = g_browser_process->component_updater(); |
- const ConfigMap components = { |
- {"epson-inkjet-printer-escpr", |
- {{"env_version", "0.0"}, |
- {"sha2hashstr", |
- "1913a5e0a6cad30b6f03e176177e0d7ed62c5d6700a9c66da556d7c3f5d6a47e"}}}}; |
- if (name.empty()) { |
- base::PostTask( |
- FROM_HERE, |
- base::Bind(install_callback, update_client::Error::INVALID_ARGUMENT)); |
- return false; |
- } |
+ const base::Callback<void(const std::string&)>& load_callback) { |
+ const ConfigMap components = CONFIG_MAP_CONTENT; |
const auto it = components.find(name); |
- if (it == components.end()) { |
- DVLOG(1) << "[RegisterCrOSComponents] component " << name |
- << " is not in configuration."; |
- base::PostTask( |
- FROM_HERE, |
- base::Bind(install_callback, update_client::Error::INVALID_ARGUMENT)); |
- return false; |
+ if (name.empty() || it == components.end()) { |
+ base::PostTask(FROM_HERE, base::Bind(load_callback, "")); |
+ return; |
} |
ComponentConfig config(it->first, it->second.find("env_version")->second, |
it->second.find("sha2hashstr")->second); |
- RegisterCrOSComponentInternal( |
- cus, config, |
- base::Bind(InstallChromeOSComponent, cus, |
- crx_file::id_util::GenerateIdFromHex( |
- it->second.find("sha2hashstr")->second) |
- .substr(0, 32), |
- install_callback)); |
- return true; |
-} |
- |
-void MountResult(const base::Callback<void(const std::string&)>& mount_callback, |
- chromeos::DBusMethodCallStatus call_status, |
- const std::string& result) { |
- if (call_status != chromeos::DBUS_METHOD_CALL_SUCCESS) { |
- DVLOG(1) << "Call to imageloader service failed."; |
- base::PostTask(FROM_HERE, base::Bind(mount_callback, "")); |
- return; |
- } |
- if (result.empty()) { |
- DVLOG(1) << "Component load failed"; |
- base::PostTask(FROM_HERE, base::Bind(mount_callback, "")); |
- return; |
- } |
- base::PostTask(FROM_HERE, base::Bind(mount_callback, result)); |
+ RegisterComponent(cus, config, |
+ base::Bind(RegisterResult, cus, |
+ crx_file::id_util::GenerateIdFromHex( |
+ it->second.find("sha2hashstr")->second) |
+ .substr(0, 32), |
+ base::Bind(InstallResult, name, load_callback))); |
} |
-void CrOSComponent::LoadCrOSComponent( |
+void CrOSComponent::LoadComponent( |
const std::string& name, |
- const base::Callback<void(const std::string&)>& mount_callback) { |
- chromeos::ImageLoaderClient* loader = |
- chromeos::DBusThreadManager::Get()->GetImageLoaderClient(); |
- if (loader) { |
- loader->LoadComponent(name, base::Bind(&MountResult, mount_callback)); |
+ const base::Callback<void(const std::string&)>& load_callback) { |
+ if (!g_browser_process->platform_part()->IsCompatibleCrOSComponent(name)) { |
+ // A compatible component is not installed, start installation process. |
+ auto* const cus = g_browser_process->component_updater(); |
+ InstallComponent(cus, name, load_callback); |
} else { |
- DVLOG(1) << "Failed to get ImageLoaderClient object."; |
+ // A compatible component is intalled, load it directly. |
+ LoadComponentInternal(name, load_callback); |
} |
} |
+ |
#endif // defined(OS_CHROMEOS |
} // namespace component_updater |