Index: chrome/browser/component_updater/pepper_flash_component_installer.cc |
diff --git a/chrome/browser/component_updater/pepper_flash_component_installer.cc b/chrome/browser/component_updater/pepper_flash_component_installer.cc |
index cae975d5861e0411d1d0fe2877943522e0f8f803..068f54164994ab18fc168e1bdeff91b5fef6e756 100644 |
--- a/chrome/browser/component_updater/pepper_flash_component_installer.cc |
+++ b/chrome/browser/component_updater/pepper_flash_component_installer.cc |
@@ -32,6 +32,7 @@ |
#include "chrome/common/pepper_flash.h" |
#include "chrome/common/ppapi_utils.h" |
#include "components/component_updater/component_updater_service.h" |
+#include "components/component_updater/default_component_installer.h" |
#include "components/update_client/update_client.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/plugin_service.h" |
@@ -57,53 +58,9 @@ const uint8_t kSha2Hash[] = {0xc8, 0xce, 0x99, 0xba, 0xce, 0x89, 0xf8, 0x20, |
0xac, 0xd3, 0x7e, 0x86, 0x8c, 0x86, 0x2c, 0x11, |
0xb9, 0x40, 0xc5, 0x55, 0xaf, 0x08, 0x63, 0x70, |
0x54, 0xf9, 0x56, 0xd3, 0xe7, 0x88, 0xba, 0x8c}; |
- |
-// If we don't have a Pepper Flash component, this is the version we claim. |
-const char kNullVersion[] = "0.0.0.0"; |
- |
-// Pepper Flash plugins have the version encoded in the path itself |
-// so we need to enumerate the directories to find the full path. |
-// On success, |latest_dir| returns something like: |
-// <profile>\AppData\Local\Google\Chrome\User Data\PepperFlash\10.3.44.555\. |
-// |latest_version| returns the corresponding version number. |older_dirs| |
-// returns directories of all older versions. |
-bool GetPepperFlashDirectory(base::FilePath* latest_dir, |
- Version* latest_version, |
- std::vector<base::FilePath>* older_dirs) { |
- DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- base::FilePath base_dir; |
- if (!PathService::Get(chrome::DIR_COMPONENT_UPDATED_PEPPER_FLASH_PLUGIN, |
- &base_dir)) { |
- return false; |
- } |
- |
- bool found = false; |
- base::FileEnumerator file_enumerator( |
- base_dir, false, base::FileEnumerator::DIRECTORIES); |
- for (base::FilePath path = file_enumerator.Next(); !path.value().empty(); |
- path = file_enumerator.Next()) { |
- Version version(path.BaseName().MaybeAsASCII()); |
- if (!version.IsValid()) |
- continue; |
- if (found) { |
- if (version.CompareTo(*latest_version) > 0) { |
- older_dirs->push_back(*latest_dir); |
- *latest_dir = path; |
- *latest_version = version; |
- } else { |
- older_dirs->push_back(path); |
- } |
- } else { |
- *latest_dir = path; |
- *latest_version = version; |
- found = true; |
- } |
- } |
- return found; |
-} |
#endif // defined(GOOGLE_CHROME_BUILD) |
-#if !defined(OS_LINUX) || defined(GOOGLE_CHROME_BUILD) |
+#if !defined(OS_LINUX) && defined(GOOGLE_CHROME_BUILD) |
bool MakePepperFlashPluginInfo(const base::FilePath& flash_path, |
const Version& flash_version, |
bool out_of_process, |
@@ -205,193 +162,99 @@ void RegisterPepperFlashWithChrome(const base::FilePath& path, |
plugin_info.ToWebPluginInfo(), true); |
PluginService::GetInstance()->RefreshPlugins(); |
} |
-#endif // !defined(OS_LINUX) || defined(GOOGLE_CHROME_BUILD) |
+#endif // !defined(OS_LINUX) && defined(GOOGLE_CHROME_BUILD) |
-} // namespace |
- |
-class PepperFlashComponentInstaller : public update_client::CrxInstaller { |
+#if defined(GOOGLE_CHROME_BUILD) |
+class FlashComponentInstallerTraits : public ComponentInstallerTraits { |
public: |
- explicit PepperFlashComponentInstaller(const Version& version); |
- |
- // ComponentInstaller implementation: |
- void OnUpdateError(int error) override; |
- |
- bool Install(const base::DictionaryValue& manifest, |
- const base::FilePath& unpack_path) override; |
- |
- bool GetInstalledFile(const std::string& file, |
- base::FilePath* installed_file) override; |
- |
- bool Uninstall() override; |
+ FlashComponentInstallerTraits(); |
+ ~FlashComponentInstallerTraits() override {} |
private: |
- ~PepperFlashComponentInstaller() override {} |
- |
- Version current_version_; |
+ // The following methods override ComponentInstallerTraits. |
+ bool CanAutoUpdate() const override; |
+ bool RequiresNetworkEncryption() const override; |
+ bool OnCustomInstall(const base::DictionaryValue& manifest, |
+ const base::FilePath& install_dir) override; |
+ bool VerifyInstallation(const base::DictionaryValue& manifest, |
+ const base::FilePath& install_dir) const override; |
+ void ComponentReady(const base::Version& version, |
+ const base::FilePath& path, |
+ std::unique_ptr<base::DictionaryValue> manifest) override; |
+ base::FilePath GetRelativeInstallDir() const override; |
+ void GetHash(std::vector<uint8_t>* hash) const override; |
+ std::string GetName() const override; |
+ std::string GetAp() const override; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FlashComponentInstallerTraits); |
}; |
-PepperFlashComponentInstaller::PepperFlashComponentInstaller( |
- const Version& version) |
- : current_version_(version) { |
- DCHECK(version.IsValid()); |
+FlashComponentInstallerTraits::FlashComponentInstallerTraits() {} |
+ |
+bool FlashComponentInstallerTraits::CanAutoUpdate() const { |
+ return true; |
} |
-void PepperFlashComponentInstaller::OnUpdateError(int error) { |
- NOTREACHED() << "Pepper Flash update error: " << error; |
+bool FlashComponentInstallerTraits::RequiresNetworkEncryption() const { |
+ return false; |
} |
-bool PepperFlashComponentInstaller::Install( |
+bool FlashComponentInstallerTraits::OnCustomInstall( |
const base::DictionaryValue& manifest, |
- const base::FilePath& unpack_path) { |
- Version version; |
- if (!chrome::CheckPepperFlashManifest(manifest, &version)) |
- return false; |
- if (current_version_.CompareTo(version) > 0) |
- return false; |
- const base::FilePath unpacked_plugin = |
- unpack_path.Append(chrome::kPepperFlashPluginFilename); |
- if (!base::PathExists(unpacked_plugin)) |
- return false; |
- // Passed the basic tests. Time to install it. |
- base::FilePath path; |
- if (!PathService::Get(chrome::DIR_COMPONENT_UPDATED_PEPPER_FLASH_PLUGIN, |
- &path)) { |
- return false; |
- } |
- path = path.AppendASCII(version.GetString()); |
- if (base::PathExists(path)) |
- return false; |
- current_version_ = version; |
- |
- if (!base::Move(unpack_path, path)) |
- return false; |
+ const base::FilePath& install_dir) { |
#if defined(OS_LINUX) |
Greg K
2016/06/06 19:08:37
I notice it's no longer unpacking the plugin here.
waffles
2016/06/06 19:37:03
Yes, Install took the temp directory that the expl
Greg K
2016/06/06 20:43:06
That might be a problem on Chrome OS where the tem
|
const base::FilePath flash_path = |
- path.Append(chrome::kPepperFlashPluginFilename); |
+ install_dir.Append(chrome::kPepperFlashPluginFilename); |
// Populate the component updated flash hint file so that the zygote can |
// locate and preload the latest version of flash. |
+ std::string version; |
+ if (!manifest.GetString("version", &version)) |
+ return false; |
if (!component_flash_hint_file::RecordFlashUpdate(flash_path, flash_path, |
- version.GetString())) { |
- if (!base::DeleteFile(path, true)) |
- LOG(ERROR) << "Hint file creation failed, but unable to delete " |
- "installed flash plugin."; |
+ version)) { |
return false; |
} |
-#else |
+#endif // defined(OS_LINUX) |
+ return true; |
+} |
+ |
+void FlashComponentInstallerTraits::ComponentReady( |
+ const base::Version& version, |
+ const base::FilePath& path, |
+ std::unique_ptr<base::DictionaryValue> manifest) { |
+#if !defined(OS_LINUX) |
// Installation is done. Now tell the rest of chrome. Both the path service |
// and to the plugin service. On Linux, a restart is required to use the new |
// Flash version, so we do not do this. |
PathService::Override(chrome::DIR_PEPPER_FLASH_PLUGIN, path); |
path = path.Append(chrome::kPepperFlashPluginFilename); |
- BrowserThread::PostTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&RegisterPepperFlashWithChrome, path, version)); |
+ RegisterPepperFlashWithChrome(path, version); |
#endif // !defined(OS_LINUX) |
- return true; |
} |
-bool PepperFlashComponentInstaller::GetInstalledFile( |
- const std::string& file, |
- base::FilePath* installed_file) { |
- return false; |
+bool FlashComponentInstallerTraits::VerifyInstallation( |
+ const base::DictionaryValue& manifest, |
+ const base::FilePath& install_dir) const { |
+ Version unused; |
Sorin Jianu
2016/06/03 23:41:44
why is this variable named |unused| ?
waffles
2016/06/06 19:37:03
It's an outparam of CheckPepperFlashManifest, but
|
+ return chrome::CheckPepperFlashManifest(manifest, &unused); |
} |
-bool PepperFlashComponentInstaller::Uninstall() { |
- return false; |
+// The base directory on Windows looks like: |
+// <profile>\AppData\Local\Google\Chrome\User Data\PepperFlash\. |
+base::FilePath FlashComponentInstallerTraits::GetRelativeInstallDir() const { |
+ return base::FilePath(FILE_PATH_LITERAL("PepperFlash")); |
} |
- |
- |
-namespace { |
- |
-#if defined(GOOGLE_CHROME_BUILD) |
-void FinishPepperFlashUpdateRegistration(ComponentUpdateService* cus, |
- const Version& version) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- update_client::CrxComponent pepflash; |
- pepflash.name = "pepper_flash"; |
- pepflash.installer = new PepperFlashComponentInstaller(version); |
- pepflash.version = version; |
- pepflash.pk_hash.assign(kSha2Hash, &kSha2Hash[sizeof(kSha2Hash)]); |
- if (!cus->RegisterComponent(pepflash)) |
- NOTREACHED() << "Pepper Flash component registration failed."; |
+void FlashComponentInstallerTraits::GetHash(std::vector<uint8_t>* hash) const { |
+ hash->assign(kSha2Hash, kSha2Hash + arraysize(kSha2Hash)); |
} |
-bool ValidatePepperFlashManifest(const base::FilePath& path) { |
- base::FilePath manifest_path(path.DirName().AppendASCII("manifest.json")); |
- |
- std::string manifest_data; |
- if (!base::ReadFileToString(manifest_path, &manifest_data)) |
- return false; |
- std::unique_ptr<base::Value> manifest_value( |
- base::JSONReader::Read(manifest_data, base::JSON_ALLOW_TRAILING_COMMAS)); |
- if (!manifest_value.get()) |
- return false; |
- base::DictionaryValue* manifest = NULL; |
- if (!manifest_value->GetAsDictionary(&manifest)) |
- return false; |
- Version version; |
- if (!chrome::CheckPepperFlashManifest(*manifest, &version)) |
- return false; |
- return true; |
+std::string FlashComponentInstallerTraits::GetName() const { |
+ return "pepper_flash"; |
} |
-void StartPepperFlashUpdateRegistration(ComponentUpdateService* cus) { |
- DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- base::FilePath path; |
- if (!PathService::Get(chrome::DIR_COMPONENT_UPDATED_PEPPER_FLASH_PLUGIN, |
- &path)) { |
- return; |
- } |
- |
- if (!base::PathExists(path)) { |
- if (!base::CreateDirectory(path)) { |
- NOTREACHED() << "Could not create Pepper Flash directory."; |
- return; |
- } |
- } |
- |
- Version version(kNullVersion); |
- std::vector<base::FilePath> older_dirs; |
- if (GetPepperFlashDirectory(&path, &version, &older_dirs)) { |
- path = path.Append(chrome::kPepperFlashPluginFilename); |
- if (base::PathExists(path)) { |
- // Only register component pepper flash if it validates manifest check. |
- if (ValidatePepperFlashManifest(path)) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&RegisterPepperFlashWithChrome, path, version)); |
- } else { |
- // Queue this version to be deleted. |
- older_dirs.push_back(path.DirName()); |
- version = Version(kNullVersion); |
- } |
- } else { |
- version = Version(kNullVersion); |
- } |
- } |
- |
-#if defined(FLAPPER_AVAILABLE) |
- // If a version of Flash is bundled with Chrome, and it's a higher version |
- // than the version of the component, or the component has never been updated, |
- // then set the bundled version as the current version. |
- if (version.CompareTo(Version(FLAPPER_VERSION_STRING)) < 0) |
- version = Version(FLAPPER_VERSION_STRING); |
-#endif |
- |
- BrowserThread::PostTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&FinishPepperFlashUpdateRegistration, cus, version)); |
- |
- // Remove older versions of Pepper Flash. |
- for (std::vector<base::FilePath>::iterator iter = older_dirs.begin(); |
- iter != older_dirs.end(); |
- ++iter) { |
- base::DeleteFile(*iter, true); |
- } |
+std::string FlashComponentInstallerTraits::GetAp() const { |
+ return std::string(); |
} |
#endif // defined(GOOGLE_CHROME_BUILD) |
@@ -404,9 +267,12 @@ void RegisterPepperFlashComponent(ComponentUpdateService* cus) { |
base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); |
if (cmd_line->HasSwitch(switches::kDisableBundledPpapiFlash)) |
return; |
- BrowserThread::PostTask(BrowserThread::FILE, |
- FROM_HERE, |
- base::Bind(&StartPepperFlashUpdateRegistration, cus)); |
+ std::unique_ptr<ComponentInstallerTraits> traits( |
+ new FlashComponentInstallerTraits); |
+ // |cus| will take ownership of |installer| during installer->Register(cus). |
+ DefaultComponentInstaller* installer = |
+ new DefaultComponentInstaller(std::move(traits)); |
+ installer->Register(cus, base::Closure()); |
#endif // defined(GOOGLE_CHROME_BUILD) |
} |