| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/glue/plugins/plugin_list.h" | 5 #include "webkit/glue/plugins/plugin_list.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/path_service.h" | 8 #include "base/path_service.h" |
| 9 #include "base/sha1.h" | 9 #include "base/sha1.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 // Skip over Mozilla .xpt files. | 176 // Skip over Mozilla .xpt files. |
| 177 if (path.MatchesExtension(FILE_PATH_LITERAL(".xpt"))) | 177 if (path.MatchesExtension(FILE_PATH_LITERAL(".xpt"))) |
| 178 continue; | 178 continue; |
| 179 | 179 |
| 180 // Java doesn't like being loaded through a symlink, since it uses | 180 // Java doesn't like being loaded through a symlink, since it uses |
| 181 // its path to find dependent data files. | 181 // its path to find dependent data files. |
| 182 // file_util::AbsolutePath calls through to realpath(), which resolves | 182 // file_util::AbsolutePath calls through to realpath(), which resolves |
| 183 // symlinks. | 183 // symlinks. |
| 184 FilePath orig_path = path; | 184 FilePath orig_path = path; |
| 185 file_util::AbsolutePath(&path); | 185 file_util::AbsolutePath(&path); |
| 186 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 186 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 187 << "Resolved " << orig_path.value() << " -> " << path.value(); | 187 << "Resolved " << orig_path.value() << " -> " << path.value(); |
| 188 | 188 |
| 189 if (visited_plugins->find(path) != visited_plugins->end()) { | 189 if (visited_plugins->find(path) != visited_plugins->end()) { |
| 190 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 190 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 191 << "Skipping duplicate instance of " << path.value(); | 191 << "Skipping duplicate instance of " << path.value(); |
| 192 continue; | 192 continue; |
| 193 } | 193 } |
| 194 visited_plugins->insert(path); | 194 visited_plugins->insert(path); |
| 195 | 195 |
| 196 if (IsBlacklistedPlugin(path)) { | 196 if (IsBlacklistedPlugin(path)) { |
| 197 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 197 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 198 << "Skipping blacklisted plugin " << path.value(); | 198 << "Skipping blacklisted plugin " << path.value(); |
| 199 continue; | 199 continue; |
| 200 } | 200 } |
| 201 | 201 |
| 202 // Flash stops working if the containing directory involves 'netscape'. | 202 // Flash stops working if the containing directory involves 'netscape'. |
| 203 // No joke. So use the other path if it's better. | 203 // No joke. So use the other path if it's better. |
| 204 static const char kFlashPlayerFilename[] = "libflashplayer.so"; | 204 static const char kFlashPlayerFilename[] = "libflashplayer.so"; |
| 205 static const char kNetscapeInPath[] = "/netscape/"; | 205 static const char kNetscapeInPath[] = "/netscape/"; |
| 206 if (path.BaseName().value() == kFlashPlayerFilename && | 206 if (path.BaseName().value() == kFlashPlayerFilename && |
| 207 path.value().find(kNetscapeInPath) != std::string::npos) { | 207 path.value().find(kNetscapeInPath) != std::string::npos) { |
| 208 if (orig_path.value().find(kNetscapeInPath) == std::string::npos) { | 208 if (orig_path.value().find(kNetscapeInPath) == std::string::npos) { |
| 209 // Go back to the old path. | 209 // Go back to the old path. |
| 210 path = orig_path; | 210 path = orig_path; |
| 211 } else { | 211 } else { |
| 212 LOG(ERROR) << "Flash misbehaves when used from a directory containing " | 212 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 213 << kNetscapeInPath << ", so skipping " << orig_path.value(); | 213 << "Flash misbehaves when used from a directory containing " |
| 214 << kNetscapeInPath << ", so skipping " << orig_path.value(); |
| 214 continue; | 215 continue; |
| 215 } | 216 } |
| 216 } | 217 } |
| 217 | 218 |
| 218 // Get mtime. | 219 // Get mtime. |
| 219 file_util::FileInfo info; | 220 file_util::FileInfo info; |
| 220 if (!file_util::GetFileInfo(path, &info)) | 221 if (!file_util::GetFileInfo(path, &info)) |
| 221 continue; | 222 continue; |
| 222 | 223 |
| 223 files.push_back(std::make_pair(path, info.last_modified)); | 224 files.push_back(std::make_pair(path, info.last_modified)); |
| 224 } | 225 } |
| 225 | 226 |
| 226 // Sort the file list by time (and filename). | 227 // Sort the file list by time (and filename). |
| 227 std::sort(files.begin(), files.end(), CompareTime); | 228 std::sort(files.begin(), files.end(), CompareTime); |
| 228 | 229 |
| 229 // Load the files in order. | 230 // Load the files in order. |
| 230 for (FileTimeList::const_iterator i = files.begin(); i != files.end(); ++i) { | 231 for (FileTimeList::const_iterator i = files.begin(); i != files.end(); ++i) { |
| 231 LoadPlugin(i->first, plugins); | 232 LoadPlugin(i->first, plugins); |
| 232 } | 233 } |
| 233 } | 234 } |
| 234 | 235 |
| 235 | |
| 236 bool PluginList::ShouldLoadPlugin(const WebPluginInfo& info, | 236 bool PluginList::ShouldLoadPlugin(const WebPluginInfo& info, |
| 237 std::vector<WebPluginInfo>* plugins) { | 237 std::vector<WebPluginInfo>* plugins) { |
| 238 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 238 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 239 << "Considering " << info.path.value() << " (" << info.name << ")"; | 239 << "Considering " << info.path.value() << " (" << info.name << ")"; |
| 240 | 240 |
| 241 if (IsUndesirablePlugin(info)) { | 241 if (IsUndesirablePlugin(info)) { |
| 242 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 242 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 243 << info.path.value() << " is undesirable."; | 243 << info.path.value() << " is undesirable."; |
| 244 | 244 |
| 245 // See if we have a better version of this plugin. | 245 // See if we have a better version of this plugin. |
| 246 for (size_t i = 0; i < plugins->size(); ++i) { | 246 for (size_t i = 0; i < plugins->size(); ++i) { |
| 247 if (plugins->at(i).name == info.name && | 247 if (plugins->at(i).name == info.name && |
| 248 !IsUndesirablePlugin(plugins->at(i))) { | 248 !IsUndesirablePlugin(plugins->at(i))) { |
| 249 // Skip the current undesirable one so we can use the better one | 249 // Skip the current undesirable one so we can use the better one |
| 250 // we just found. | 250 // we just found. |
| 251 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 251 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 252 << "Skipping " << info.path.value() << ", preferring " | 252 << "Skipping " << info.path.value() << ", preferring " |
| 253 << plugins->at(i).path.value(); | 253 << plugins->at(i).path.value(); |
| 254 return false; | 254 return false; |
| 255 } | 255 } |
| 256 } | 256 } |
| 257 } | 257 } |
| 258 | 258 |
| 259 // TODO(evanm): prefer the newest version of flash, etc. here? | 259 // TODO(evanm): prefer the newest version of flash, etc. here? |
| 260 | 260 |
| 261 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 261 LOG_IF(INFO, PluginList::DebugPluginLoading()) |
| 262 << "Using " << info.path.value(); | 262 << "Using " << info.path.value(); |
| 263 | 263 |
| 264 return true; | 264 return true; |
| 265 } | 265 } |
| 266 | 266 |
| 267 } // namespace NPAPI | 267 } // namespace NPAPI |
| OLD | NEW |