| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "webkit/plugins/npapi/plugin_list.h" | 5 #include "webkit/plugins/npapi/plugin_list.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 // On my Ubuntu system, /usr/lib64 is a symlink to /usr/lib. | 157 // On my Ubuntu system, /usr/lib64 is a symlink to /usr/lib. |
| 158 // But a user reported on their Fedora system they are separate. | 158 // But a user reported on their Fedora system they are separate. |
| 159 plugin_dirs->push_back(FilePath("/usr/lib64/browser-plugins")); | 159 plugin_dirs->push_back(FilePath("/usr/lib64/browser-plugins")); |
| 160 plugin_dirs->push_back(FilePath("/usr/lib64/mozilla/plugins")); | 160 plugin_dirs->push_back(FilePath("/usr/lib64/mozilla/plugins")); |
| 161 plugin_dirs->push_back(FilePath("/usr/lib64/firefox/plugins")); | 161 plugin_dirs->push_back(FilePath("/usr/lib64/firefox/plugins")); |
| 162 plugin_dirs->push_back(FilePath("/usr/lib64/xulrunner-addons/plugins")); | 162 plugin_dirs->push_back(FilePath("/usr/lib64/xulrunner-addons/plugins")); |
| 163 #endif // defined(ARCH_CPU_64_BITS) | 163 #endif // defined(ARCH_CPU_64_BITS) |
| 164 #endif // !defined(OS_CHROMEOS) | 164 #endif // !defined(OS_CHROMEOS) |
| 165 } | 165 } |
| 166 | 166 |
| 167 void PluginList::LoadPluginsFromDir(const FilePath& dir_path, | 167 void PluginList::GetPluginsInDir( |
| 168 ScopedVector<PluginGroup>* plugin_groups, | 168 const FilePath& dir_path, std::vector<FilePath>* plugins) { |
| 169 std::set<FilePath>* visited_plugins) { | |
| 170 // See ScanPluginsDirectory near | 169 // See ScanPluginsDirectory near |
| 171 // http://mxr.mozilla.org/firefox/source/modules/plugin/base/src/nsPluginHostI
mpl.cpp#5052 | 170 // http://mxr.mozilla.org/firefox/source/modules/plugin/base/src/nsPluginHostI
mpl.cpp#5052 |
| 172 | 171 |
| 173 // Construct and stat a list of all filenames under consideration, for | 172 // Construct and stat a list of all filenames under consideration, for |
| 174 // later sorting by mtime. | 173 // later sorting by mtime. |
| 175 FileTimeList files; | 174 FileTimeList files; |
| 176 file_util::FileEnumerator enumerator(dir_path, | 175 file_util::FileEnumerator enumerator(dir_path, |
| 177 false, // not recursive | 176 false, // not recursive |
| 178 file_util::FileEnumerator::FILES); | 177 file_util::FileEnumerator::FILES); |
| 179 for (FilePath path = enumerator.Next(); !path.value().empty(); | 178 for (FilePath path = enumerator.Next(); !path.value().empty(); |
| 180 path = enumerator.Next()) { | 179 path = enumerator.Next()) { |
| 181 // Skip over Mozilla .xpt files. | 180 // Skip over Mozilla .xpt files. |
| 182 if (path.MatchesExtension(FILE_PATH_LITERAL(".xpt"))) | 181 if (path.MatchesExtension(FILE_PATH_LITERAL(".xpt"))) |
| 183 continue; | 182 continue; |
| 184 | 183 |
| 185 // Java doesn't like being loaded through a symlink, since it uses | 184 // Java doesn't like being loaded through a symlink, since it uses |
| 186 // its path to find dependent data files. | 185 // its path to find dependent data files. |
| 187 // file_util::AbsolutePath calls through to realpath(), which resolves | 186 // file_util::AbsolutePath calls through to realpath(), which resolves |
| 188 // symlinks. | 187 // symlinks. |
| 189 FilePath orig_path = path; | 188 FilePath orig_path = path; |
| 190 file_util::AbsolutePath(&path); | 189 file_util::AbsolutePath(&path); |
| 191 LOG_IF(ERROR, PluginList::DebugPluginLoading()) | 190 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 192 << "Resolved " << orig_path.value() << " -> " << path.value(); | 191 << "Resolved " << orig_path.value() << " -> " << path.value(); |
| 193 | 192 |
| 194 if (visited_plugins->find(path) != visited_plugins->end()) { | 193 if (std::find(plugins->begin(), plugins->end(), path) != plugins->end()) { |
| 195 LOG_IF(ERROR, PluginList::DebugPluginLoading()) | 194 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 196 << "Skipping duplicate instance of " << path.value(); | 195 << "Skipping duplicate instance of " << path.value(); |
| 197 continue; | 196 continue; |
| 198 } | 197 } |
| 199 visited_plugins->insert(path); | |
| 200 | 198 |
| 201 if (IsBlacklistedPlugin(path)) { | 199 if (IsBlacklistedPlugin(path)) { |
| 202 LOG_IF(ERROR, PluginList::DebugPluginLoading()) | 200 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 203 << "Skipping blacklisted plugin " << path.value(); | 201 << "Skipping blacklisted plugin " << path.value(); |
| 204 continue; | 202 continue; |
| 205 } | 203 } |
| 206 | 204 |
| 207 // Flash stops working if the containing directory involves 'netscape'. | 205 // Flash stops working if the containing directory involves 'netscape'. |
| 208 // No joke. So use the other path if it's better. | 206 // No joke. So use the other path if it's better. |
| 209 static const char kFlashPlayerFilename[] = "libflashplayer.so"; | 207 static const char kFlashPlayerFilename[] = "libflashplayer.so"; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 227 continue; | 225 continue; |
| 228 | 226 |
| 229 files.push_back(std::make_pair(path, info.last_modified)); | 227 files.push_back(std::make_pair(path, info.last_modified)); |
| 230 } | 228 } |
| 231 | 229 |
| 232 // Sort the file list by time (and filename). | 230 // Sort the file list by time (and filename). |
| 233 std::sort(files.begin(), files.end(), CompareTime); | 231 std::sort(files.begin(), files.end(), CompareTime); |
| 234 | 232 |
| 235 // Load the files in order. | 233 // Load the files in order. |
| 236 for (FileTimeList::const_iterator i = files.begin(); i != files.end(); ++i) { | 234 for (FileTimeList::const_iterator i = files.begin(); i != files.end(); ++i) { |
| 237 LoadPlugin(i->first, plugin_groups); | 235 plugins->push_back(i->first); |
| 238 } | 236 } |
| 239 } | 237 } |
| 240 | 238 |
| 241 bool PluginList::ShouldLoadPlugin(const WebPluginInfo& info, | 239 bool PluginList::ShouldLoadPlugin(const WebPluginInfo& info, |
| 242 ScopedVector<PluginGroup>* plugin_groups) { | 240 ScopedVector<PluginGroup>* plugin_groups) { |
| 243 LOG_IF(ERROR, PluginList::DebugPluginLoading()) | 241 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 244 << "Considering " << info.path.value() << " (" << info.name << ")"; | 242 << "Considering " << info.path.value() << " (" << info.name << ")"; |
| 245 | 243 |
| 246 if (IsUndesirablePlugin(info)) { | 244 if (IsUndesirablePlugin(info)) { |
| 247 LOG_IF(ERROR, PluginList::DebugPluginLoading()) | 245 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| (...skipping 19 matching lines...) Expand all Loading... |
| 267 | 265 |
| 268 // TODO(evanm): prefer the newest version of flash, etc. here? | 266 // TODO(evanm): prefer the newest version of flash, etc. here? |
| 269 | 267 |
| 270 VLOG_IF(1, PluginList::DebugPluginLoading()) << "Using " << info.path.value(); | 268 VLOG_IF(1, PluginList::DebugPluginLoading()) << "Using " << info.path.value(); |
| 271 | 269 |
| 272 return true; | 270 return true; |
| 273 } | 271 } |
| 274 | 272 |
| 275 } // namespace npapi | 273 } // namespace npapi |
| 276 } // namespace webkit | 274 } // namespace webkit |
| OLD | NEW |