Index: webkit/glue/plugins/plugin_list_linux.cc |
diff --git a/webkit/glue/plugins/plugin_list_linux.cc b/webkit/glue/plugins/plugin_list_linux.cc |
index 2a92bbd374c54e251a417e047be54cf175157de2..661c1426b21be13ce90486a9666b3a0aacea10ac 100644 |
--- a/webkit/glue/plugins/plugin_list_linux.cc |
+++ b/webkit/glue/plugins/plugin_list_linux.cc |
@@ -7,6 +7,25 @@ |
#include "base/file_util.h" |
#include "base/path_service.h" |
+namespace { |
+ |
+// We build up a list of files and mtimes so we can sort them. |
+typedef std::pair<FilePath, base::Time> FileAndTime; |
+typedef std::vector<FileAndTime> FileTimeList; |
+ |
+// Comparator used to sort by descending mtime then ascending filename. |
+bool CompareTime(const FileAndTime& a, const FileAndTime& b) { |
+ if (a.second == b.second) { |
+ // Fall back on filename sorting, just to make the predicate valid. |
+ return a.first < b.first; |
+ } |
+ |
+ // Sort by mtime, descending. |
+ return a.second > b.second; |
+} |
+ |
+} |
+ |
namespace NPAPI { |
void PluginList::PlatformInit() { |
@@ -38,33 +57,68 @@ void PluginList::GetPluginDirectories(std::vector<FilePath>* plugin_dirs) { |
plugin_dirs->push_back(dir.Append("plugins")); |
// 4) NS_SYSTEM_PLUGINS_DIR: |
- // TODO(evanm): when we support 64-bit platforms, we'll need to fix this |
- // to be conditional. |
- COMPILE_ASSERT(sizeof(int)==4, fix_system_lib_path); |
+ // This varies across different versions of Firefox, so check 'em all. |
plugin_dirs->push_back(FilePath("/usr/lib/mozilla/plugins")); |
+ plugin_dirs->push_back(FilePath("/usr/lib/firefox/plugins")); |
+ plugin_dirs->push_back(FilePath("/usr/lib/xulrunner-addons/plugins")); |
} |
void PluginList::LoadPluginsFromDir(const FilePath& path, |
std::vector<WebPluginInfo>* plugins) { |
+ // See ScanPluginsDirectory near |
+ // http://mxr.mozilla.org/firefox/source/modules/plugin/base/src/nsPluginHostImpl.cpp#5052 |
+ |
+ // Construct and stat a list of all filenames under consideration, for |
+ // later sorting by mtime. |
+ FileTimeList files; |
file_util::FileEnumerator enumerator(path, |
false, // not recursive |
file_util::FileEnumerator::FILES); |
for (FilePath path = enumerator.Next(); !path.value().empty(); |
path = enumerator.Next()) { |
// Skip over Mozilla .xpt files. |
- if (!path.MatchesExtension(FILE_PATH_LITERAL(".xpt"))) |
- LoadPlugin(path, plugins); |
+ if (path.MatchesExtension(FILE_PATH_LITERAL(".xpt"))) |
+ continue; |
+ |
+ // Java doesn't like being loaded through a symlink, since it uses |
+ // its path to find dependent data files. |
+ // file_util::AbsolutePath calls through to realpath(), which resolves |
+ // symlinks. |
+ file_util::AbsolutePath(&path); |
+ |
+ // Get mtime. |
+ file_util::FileInfo info; |
+ if (!file_util::GetFileInfo(path, &info)) |
+ continue; |
+ |
+ // Skip duplicates of the same file in our list. |
+ bool skip = false; |
+ for (size_t i = 0; i < plugins->size(); ++i) { |
+ if (plugins->at(i).path == path) { |
+ skip = true; |
+ break; |
+ } |
+ } |
+ if (skip) |
+ continue; |
+ |
+ files.push_back(std::make_pair(path, info.last_modified)); |
+ } |
+ |
+ // Sort the file list by time (and filename). |
+ std::sort(files.begin(), files.end(), CompareTime); |
+ |
+ // Load the files in order. |
+ for (FileTimeList::const_iterator i = files.begin(); i != files.end(); ++i) { |
+ LoadPlugin(i->first, plugins); |
} |
} |
bool PluginList::ShouldLoadPlugin(const WebPluginInfo& info, |
std::vector<WebPluginInfo>* plugins) { |
- // The equivalent Windows code verifies we haven't loaded a newer version |
- // of the same plugin, and then blacklists some known bad plugins. |
- // The equivalent Mac code verifies that plugins encountered first in the |
- // plugin list clobber later entries. |
- // TODO(evanm): figure out which behavior is appropriate for Linux. |
- // We don't need either yet as I'm just testing with Flash for now. |
+ // TODO(evanm): blacklist nspluginwrapper here? |
+ // TODO(evanm): prefer the newest version of flash here? |
+ |
return true; |
} |