Index: chrome/common/chrome_content_client.cc |
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc |
index 9854e9261278c37f957c650756f96adb80958ee6..51aa96c930b07f24c52230ae0896bdc16123ce9e 100644 |
--- a/chrome/common/chrome_content_client.cc |
+++ b/chrome/common/chrome_content_client.cc |
@@ -7,6 +7,7 @@ |
#include <stdint.h> |
#include <memory> |
+#include <tuple> |
#include "base/command_line.h" |
#include "base/debug/crash_logging.h" |
@@ -51,7 +52,6 @@ |
#endif // defined(OS_LINUX) |
#if defined(OS_WIN) |
-#include "base/win/registry.h" |
#include "base/win/windows_version.h" |
#endif |
@@ -198,16 +198,31 @@ void ComputeBuiltInPlugins(std::vector<content::PepperPluginInfo>* plugins) { |
// !defined(WIDEVINE_CDM_IS_COMPONENT) |
} |
+// Creates a PepperPluginInfo for the specified plugin. |
+// |path| is the full path to the plugin. |
+// |version| is a string representation of the plugin version. |
+// |is_debug| is whether the plugin is the debug version or not. |
+// |is_external| is whether the plugin is supplied external to Chrome e.g. a |
+// system installation of Adobe Flash. |
+// |is_bundled| distinguishes between component updated plugin and a bundled |
+// plugin. |
content::PepperPluginInfo CreatePepperFlashInfo(const base::FilePath& path, |
const std::string& version, |
- bool is_debug) { |
+ bool is_debug, |
+ bool is_external, |
+ bool is_bundled) { |
content::PepperPluginInfo plugin; |
plugin.is_out_of_process = true; |
plugin.name = content::kFlashPluginName; |
plugin.path = path; |
+#if defined(OS_WIN) |
+ plugin.is_on_local_drive = !base::IsOnNetworkDrive(path); |
+#endif |
plugin.permissions = chrome::kPepperFlashPermissions; |
plugin.is_debug = is_debug; |
+ plugin.is_external = is_external; |
+ plugin.is_bundled = is_bundled; |
std::vector<std::string> flash_version_numbers = base::SplitString( |
version, ".", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); |
@@ -250,7 +265,8 @@ void AddPepperFlashFromCommandLine( |
switches::kPpapiFlashVersion); |
plugins->push_back( |
- CreatePepperFlashInfo(base::FilePath(flash_path), flash_version, false)); |
+ CreatePepperFlashInfo(base::FilePath(flash_path), |
+ flash_version, false, true, false)); |
} |
#if defined(OS_LINUX) |
@@ -284,7 +300,7 @@ bool GetComponentUpdatedPepperFlash(content::PepperPluginInfo* plugin) { |
"bundled or system plugin."; |
return false; |
} |
- *plugin = CreatePepperFlashInfo(flash_path, version, false); |
+ *plugin = CreatePepperFlashInfo(flash_path, version, false, false, false); |
return true; |
} |
LOG(ERROR) |
@@ -313,45 +329,16 @@ bool GetBundledPepperFlash(content::PepperPluginInfo* plugin) { |
if (!PathService::Get(chrome::FILE_PEPPER_FLASH_PLUGIN, &flash_path)) |
return false; |
- *plugin = CreatePepperFlashInfo(flash_path, FLAPPER_VERSION_STRING, false); |
+ *plugin = CreatePepperFlashInfo(flash_path, FLAPPER_VERSION_STRING, false, |
+ false, true); |
return true; |
#else |
return false; |
#endif // FLAPPER_AVAILABLE |
} |
-bool IsSystemFlashScriptDebuggerPresent() { |
-#if defined(OS_WIN) |
- const wchar_t kFlashRegistryRoot[] = |
- L"SOFTWARE\\Macromedia\\FlashPlayerPepper"; |
- const wchar_t kIsDebuggerValueName[] = L"isScriptDebugger"; |
- |
- base::win::RegKey path_key(HKEY_LOCAL_MACHINE, kFlashRegistryRoot, KEY_READ); |
- DWORD debug_value; |
- if (path_key.ReadValueDW(kIsDebuggerValueName, &debug_value) != ERROR_SUCCESS) |
- return false; |
- |
- return (debug_value == 1); |
-#else |
- // TODO(wfh): implement this on OS X and Linux. crbug.com/497996. |
- return false; |
-#endif |
-} |
- |
bool GetSystemPepperFlash(content::PepperPluginInfo* plugin) { |
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
- bool system_flash_is_debug = IsSystemFlashScriptDebuggerPresent(); |
- |
-#if defined(FLAPPER_AVAILABLE) |
- // If flapper is available, only try the system plugin if either: |
- // --disable-bundled-ppapi-flash is specified, or the system debugger is the |
- // Flash Script Debugger. |
- if (!(command_line->HasSwitch(switches::kDisableBundledPpapiFlash) || |
- system_flash_is_debug)) { |
- return false; |
- } |
-#endif // defined(FLAPPER_AVAILABLE) |
- |
// Do not try and find System Pepper Flash if there is a specific path on |
// the commmand-line. |
if (command_line->HasSwitch(switches::kPpapiFlashPath)) |
@@ -383,8 +370,11 @@ bool GetSystemPepperFlash(content::PepperPluginInfo* plugin) { |
if (!chrome::CheckPepperFlashManifest(*manifest, &version)) |
return false; |
- *plugin = CreatePepperFlashInfo(flash_filename, version.GetString(), |
- system_flash_is_debug); |
+ *plugin = CreatePepperFlashInfo(flash_filename, |
+ version.GetString(), |
+ chrome::IsSystemFlashScriptDebuggerPresent(), |
+ true, |
+ false); |
return true; |
} |
#endif // defined(ENABLE_PLUGINS) |
@@ -464,17 +454,22 @@ void ChromeContentClient::SetGpuInfo(const gpu::GPUInfo& gpu_info) { |
// static |
content::PepperPluginInfo* ChromeContentClient::FindMostRecentPlugin( |
const std::vector<content::PepperPluginInfo*>& plugins) { |
- auto it = std::max_element( |
- plugins.begin(), plugins.end(), |
- [](content::PepperPluginInfo* x, content::PepperPluginInfo* y) { |
- Version version_x(x->version); |
- Version version_y(y->version); |
- DCHECK(version_x.IsValid() && version_y.IsValid()); |
- if (version_x == version_y) |
- return !x->is_debug && y->is_debug; |
- return version_x < version_y; |
- }); |
- return it != plugins.end() ? *it : nullptr; |
+ if (plugins.empty()) |
+ return nullptr; |
+ |
+ using PluginSortKey = std::tuple<base::Version, bool, bool, bool, bool>; |
+ |
+ std::map<PluginSortKey, content::PepperPluginInfo*> plugin_map; |
+ |
+ for (const auto& plugin : plugins) { |
+ Version version(plugin->version); |
+ DCHECK(version.IsValid()); |
+ plugin_map[PluginSortKey(version, plugin->is_debug, |
+ plugin->is_bundled, plugin->is_on_local_drive, |
+ !plugin->is_external)] = plugin; |
+ } |
+ |
+ return plugin_map.rbegin()->second; |
} |
#endif // defined(ENABLE_PLUGINS) |