Chromium Code Reviews| 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..23c26a24d22af1a0525c8f92768641a5a75e5d5f 100644 |
| --- a/chrome/common/chrome_content_client.cc |
| +++ b/chrome/common/chrome_content_client.cc |
| @@ -20,6 +20,7 @@ |
| #include "base/strings/string_util.h" |
| #include "base/strings/stringprintf.h" |
| #include "base/strings/utf_string_conversions.h" |
| +#include "base/tuple.h" |
| #include "build/build_config.h" |
| #include "chrome/common/child_process_logging.h" |
| #include "chrome/common/chrome_constants.h" |
| @@ -198,16 +199,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 +266,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 +301,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,7 +330,8 @@ 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; |
| @@ -340,18 +358,6 @@ bool IsSystemFlashScriptDebuggerPresent() { |
| 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 +389,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(), |
| + IsSystemFlashScriptDebuggerPresent(), |
| + true, |
| + false); |
| return true; |
| } |
| #endif // defined(ENABLE_PLUGINS) |
| @@ -464,17 +473,19 @@ 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 = base::Tuple<base::Version, bool, bool, bool, bool>; |
| + |
| + std::map<PluginSortKey, content::PepperPluginInfo*> plugin_map; |
| + |
| + for (const auto& plugin : plugins) |
| + plugin_map[PluginSortKey(Version(plugin->version), plugin->is_debug, |
| + plugin->is_bundled, plugin->is_on_local_drive, |
| + !plugin->is_external)] = plugin; |
| + |
| + return plugin_map.rbegin()->second; |
|
cpu_(ooo_6.6-7.5)
2016/04/20 19:23:14
mmm... clever but obscure, I don't know what the l
Will Harris
2016/04/20 23:50:21
yup less is implemented by "Compares lhs and rhs l
|
| } |
| #endif // defined(ENABLE_PLUGINS) |