| Index: chrome/browser/component_updater/npapi_flash_component_installer.cc
|
| diff --git a/chrome/browser/component_updater/npapi_flash_component_installer.cc b/chrome/browser/component_updater/npapi_flash_component_installer.cc
|
| deleted file mode 100644
|
| index d07838061d0d617c77306cf69d21d160be892864..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/component_updater/npapi_flash_component_installer.cc
|
| +++ /dev/null
|
| @@ -1,224 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/component_updater/flash_component_installer.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/base_paths.h"
|
| -#include "base/bind.h"
|
| -#include "base/compiler_specific.h"
|
| -#include "base/file_path.h"
|
| -#include "base/file_util.h"
|
| -#include "base/logging.h"
|
| -#include "base/path_service.h"
|
| -#include "base/string_util.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/component_updater/component_updater_service.h"
|
| -#include "chrome/browser/plugins/plugin_prefs.h"
|
| -#include "chrome/common/chrome_paths.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/plugin_service.h"
|
| -#include "webkit/plugins/webplugininfo.h"
|
| -
|
| -using content::BrowserThread;
|
| -using content::PluginService;
|
| -
|
| -namespace {
|
| -
|
| -// CRX hash. The extension id is: immdilkhigodmjbnngapbehchmihabbg.
|
| -const uint8 sha2_hash[] = {0x8c, 0xc3, 0x8b, 0xa7, 0x86, 0xe3, 0xc9, 0x1d,
|
| - 0xd6, 0x0f, 0x14, 0x72, 0x7c, 0x87, 0x01, 0x16,
|
| - 0xe2, 0x00, 0x6c, 0x98, 0xbc, 0xfb, 0x14, 0x1b,
|
| - 0x5c, 0xcd, 0xff, 0x3d, 0xa3, 0x2e, 0x2c, 0x49};
|
| -
|
| -// File name of the internal Flash plugin on different platforms.
|
| -const FilePath::CharType kFlashPluginFileName[] =
|
| -#if defined(OS_MACOSX)
|
| - FILE_PATH_LITERAL("Flash Player Plugin for Chrome.plugin");
|
| -#elif defined(OS_WIN)
|
| - FILE_PATH_LITERAL("gcswf32.dll");
|
| -#else // OS_LINUX, etc.
|
| - FILE_PATH_LITERAL("libgcflashplayer.so");
|
| -#endif
|
| -
|
| -const char kNPAPIFlashManifestName[] = "NPAPIFlash";
|
| -
|
| -// The NPAPI flash plugins are in a directory with this name.
|
| -const FilePath::CharType kNPAPIFlashBaseDirectory[] =
|
| - FILE_PATH_LITERAL("NPAPIFlash");
|
| -
|
| -// The base directory on windows looks like:
|
| -// <profile>\AppData\Local\Google\Chrome\User Data\NPAPIFlash\.
|
| -FilePath GetNPAPIFlashBaseDirectory() {
|
| - FilePath result;
|
| - PathService::Get(chrome::DIR_USER_DATA, &result);
|
| - return result.Append(kNPAPIFlashBaseDirectory);
|
| -}
|
| -
|
| -std::string NormalizeVersion(const string16& version) {
|
| - std::string ascii_ver = UTF16ToASCII(version);
|
| - std::replace(ascii_ver.begin(), ascii_ver.end(), ',', '.');
|
| - return ascii_ver;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -class NPAPIFlashComponentInstaller : public ComponentInstaller {
|
| - public:
|
| - explicit NPAPIFlashComponentInstaller(const Version& version);
|
| -
|
| - virtual ~NPAPIFlashComponentInstaller() {}
|
| -
|
| - virtual void OnUpdateError(int error) OVERRIDE;
|
| -
|
| - virtual bool Install(base::DictionaryValue* manifest,
|
| - const FilePath& unpack_path) OVERRIDE;
|
| -
|
| - private:
|
| - Version current_version_;
|
| -};
|
| -
|
| -NPAPIFlashComponentInstaller::NPAPIFlashComponentInstaller(
|
| - const Version& version) : current_version_(version) {
|
| - DCHECK(version.IsValid());
|
| -}
|
| -
|
| -void NPAPIFlashComponentInstaller::OnUpdateError(int error) {
|
| - NOTREACHED() << "NPAPI flash update error: " << error;
|
| -}
|
| -
|
| -bool NPAPIFlashComponentInstaller::Install(base::DictionaryValue* manifest,
|
| - const FilePath& unpack_path) {
|
| - std::string name;
|
| - manifest->GetStringASCII("name", &name);
|
| - if (name != kNPAPIFlashManifestName)
|
| - return false;
|
| - std::string proposed_version;
|
| - manifest->GetStringASCII("version", &proposed_version);
|
| - Version version(proposed_version.c_str());
|
| - if (!version.IsValid())
|
| - return false;
|
| - if (current_version_.CompareTo(version) >= 0)
|
| - return false;
|
| - if (!file_util::PathExists(unpack_path.Append(kFlashPluginFileName)))
|
| - return false;
|
| - // Passed the basic tests. Time to install it.
|
| - if (!file_util::Move(unpack_path, GetNPAPIFlashBaseDirectory()))
|
| - return false;
|
| - // Installation is done. Now tell the rest of chrome.
|
| - current_version_ = version;
|
| - PluginService::GetInstance()->RefreshPlugins();
|
| - return true;
|
| -}
|
| -
|
| -void FinishFlashUpdateRegistration(ComponentUpdateService* cus,
|
| - const webkit::WebPluginInfo& info) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - // todo(cpu): Add PluginPrefs code here to determine if what we update
|
| - // is actually going to be used.
|
| -
|
| - Version version(NormalizeVersion(info.version));
|
| - if (!version.IsValid()) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - CrxComponent flash;
|
| - flash.name = "npapi_flash";
|
| - flash.installer = new NPAPIFlashComponentInstaller(version);
|
| - flash.version = version;
|
| - flash.pk_hash.assign(sha2_hash, &sha2_hash[sizeof(sha2_hash)]);
|
| - if (cus->RegisterComponent(flash) != ComponentUpdateService::kOk) {
|
| - NOTREACHED() << "Flash component registration fail";
|
| - }
|
| -}
|
| -
|
| -// The code in this function is only concerned about learning what flash plugin
|
| -// chrome is using and what is its version. This will determine if we register
|
| -// for component update or not. Read the comments on RegisterNPAPIFlashComponent
|
| -// for more background.
|
| -void StartFlashUpdateRegistration(ComponentUpdateService* cus,
|
| - const std::vector<webkit::WebPluginInfo>&) {
|
| - FilePath builtin_plugin_path;
|
| - if (!PathService::Get(chrome::FILE_FLASH_PLUGIN_EXISTING,
|
| - &builtin_plugin_path))
|
| - return;
|
| -
|
| - FilePath updated_plugin_path =
|
| - GetNPAPIFlashBaseDirectory().Append(kFlashPluginFileName);
|
| -
|
| - PluginService* plugins = PluginService::GetInstance();
|
| - webkit::WebPluginInfo plugin_info;
|
| -
|
| - if (plugins->GetPluginInfoByPath(updated_plugin_path, &plugin_info)) {
|
| - // The updated plugin is newer. Since flash is used by pretty much every
|
| - // webpage out there, odds are it is going to be loaded, which means
|
| - // receiving an update is pointless since we can't swap them. You might
|
| - // find this pessimistic. The way we get out of this situation is when
|
| - // we update the whole product.
|
| - DLOG(INFO) << "updated plugin overriding built-in flash";
|
| - return;
|
| - } else if (plugins->GetPluginInfoByPath(builtin_plugin_path, &plugin_info)) {
|
| - // The built plugin is newer. Delete the updated plugin and register for
|
| - // updates. This should be the normal case.
|
| - file_util::Delete(GetNPAPIFlashBaseDirectory(), true);
|
| - } else {
|
| - // Strange installation. Log and abort registration.
|
| - DLOG(WARNING) << "Strange flash npapi configuration";
|
| - return;
|
| - }
|
| -
|
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&FinishFlashUpdateRegistration, cus, plugin_info));
|
| -}
|
| -
|
| -// Here is the general plan of action: we are going to update flash and we have
|
| -// the following cases:
|
| -// 1- The active flash is not the built-in flash (user override).
|
| -// 2- The active flash is the built-in flash.
|
| -// 3- The active flash is the one from the component updater.
|
| -// In case 1 we do nothing. In cases 2 and 3 we need to compare versions
|
| -// and if the higher version is:
|
| -// case 2: remove the component update flash, register with component updater.
|
| -// case 3: register with component updater.
|
| -//
|
| -// In practice, it's complicated. First off, to learn the version of the plugin
|
| -// we have to do file IO, which PluginList will do for us but we have to be
|
| -// careful not to trigger this on the UI thread: AddExtraPluginPath and
|
| -// RefreshPlugins don't trigger file IO, but most of the others calls do.
|
| -//
|
| -// Secondly, we can do this in a delayed task. Right now we just need to
|
| -// register the right plugin before chrome loads the first flash-ladden page.
|
| -//
|
| -// Interestingly, if PluginList finds two plugins with the same filename and
|
| -// same mimetypes, it will only keep the one with the higher version. This is
|
| -// our case in the sense that a component updated flash is very much the same
|
| -// thing as built-in flash: sometimes newer or sometimes older. That is why
|
| -// you don't see version comparison in this code.
|
| -//
|
| -// So to kick off the magic we add the updated flash path here, even though
|
| -// there might not be a flash player in that location. If there is and it is
|
| -// newer, it will take its place then we fire StartFlashUpdateRegistration
|
| -// on the IO thread to learn which one won. Since we do it in a delayed task
|
| -// probably somebody (unknowingly) will pay for the file IO, so usually get
|
| -// the information for free.
|
| -void RegisterNPAPIFlashComponent(ComponentUpdateService* cus) {
|
| -#if !defined(OS_CHROMEOS)
|
| - FilePath path = GetNPAPIFlashBaseDirectory().Append(kFlashPluginFileName);
|
| - PluginService::GetInstance()->AddExtraPluginPath(path);
|
| - PluginService::GetInstance()->RefreshPlugins();
|
| -
|
| - // Post the task to the FILE thread because IO may be done once the plugins
|
| - // are loaded.
|
| - BrowserThread::PostDelayedTask(
|
| - BrowserThread::FILE,
|
| - FROM_HERE,
|
| - base::Bind(&PluginService::GetPlugins,
|
| - base::Unretained(PluginService::GetInstance()),
|
| - base::Bind(&StartFlashUpdateRegistration, cus)),
|
| - base::TimeDelta::FromSeconds(8));
|
| -#endif
|
| -}
|
|
|