| 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_lib.h" | 5 #include "webkit/glue/plugins/plugin_lib.h" |
| 6 | 6 |
| 7 #include <dlfcn.h> | 7 #include <dlfcn.h> |
| 8 #if defined(OS_OPENBSD) | 8 #if defined(OS_OPENBSD) |
| 9 #include <sys/exec_elf.h> | 9 #include <sys/exec_elf.h> |
| 10 #else | 10 #else |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 LOG(WARNING) << path.value() << " is nspluginwrapper wrapping a " | 111 LOG(WARNING) << path.value() << " is nspluginwrapper wrapping a " |
| 112 << "plugin for a different architecture; it will " | 112 << "plugin for a different architecture; it will " |
| 113 << "work better if you instead use a native plugin."; | 113 << "work better if you instead use a native plugin."; |
| 114 return; | 114 return; |
| 115 } | 115 } |
| 116 | 116 |
| 117 void* newdl = base::LoadNativeLibrary(path); | 117 void* newdl = base::LoadNativeLibrary(path); |
| 118 if (!newdl) { | 118 if (!newdl) { |
| 119 // We couldn't load the unwrapped plugin for some reason, despite | 119 // We couldn't load the unwrapped plugin for some reason, despite |
| 120 // being able to load the wrapped one. Just use the wrapped one. | 120 // being able to load the wrapped one. Just use the wrapped one. |
| 121 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 121 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 122 << "Could not use unwrapped nspluginwrapper plugin " | 122 << "Could not use unwrapped nspluginwrapper plugin " |
| 123 << unwrapped_path->value() << ", using the wrapped one."; | 123 << unwrapped_path->value() << ", using the wrapped one."; |
| 124 return; | 124 return; |
| 125 } | 125 } |
| 126 | 126 |
| 127 // Unload the wrapped plugin, and use the wrapped plugin instead. | 127 // Unload the wrapped plugin, and use the wrapped plugin instead. |
| 128 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 128 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 129 << "Using unwrapped version " << unwrapped_path->value() | 129 << "Using unwrapped version " << unwrapped_path->value() |
| 130 << " of nspluginwrapper-wrapped plugin."; | 130 << " of nspluginwrapper-wrapped plugin."; |
| 131 base::UnloadNativeLibrary(*dl); | 131 base::UnloadNativeLibrary(*dl); |
| 132 *dl = newdl; | 132 *dl = newdl; |
| 133 *unwrapped_path = path; | 133 *unwrapped_path = path; |
| 134 } | 134 } |
| 135 | 135 |
| 136 } // anonymous namespace | 136 } // anonymous namespace |
| 137 | 137 |
| 138 namespace NPAPI { | 138 namespace NPAPI { |
| 139 | 139 |
| 140 bool PluginLib::ReadWebPluginInfo(const FilePath& filename, | 140 bool PluginLib::ReadWebPluginInfo(const FilePath& filename, |
| 141 WebPluginInfo* info) { | 141 WebPluginInfo* info) { |
| 142 // The file to reference is: | 142 // The file to reference is: |
| 143 // http://mxr.mozilla.org/firefox/source/modules/plugin/base/src/nsPluginsDirU
nix.cpp | 143 // http://mxr.mozilla.org/firefox/source/modules/plugin/base/src/nsPluginsDirU
nix.cpp |
| 144 | 144 |
| 145 // Skip files that aren't appropriate for our architecture. | 145 // Skip files that aren't appropriate for our architecture. |
| 146 if (!ELFMatchesCurrentArchitecture(filename)) { | 146 if (!ELFMatchesCurrentArchitecture(filename)) { |
| 147 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 147 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 148 << "Skipping plugin " << filename.value() | 148 << "Skipping plugin " << filename.value() |
| 149 << " because it doesn't match the current architecture."; | 149 << " because it doesn't match the current architecture."; |
| 150 return false; | 150 return false; |
| 151 } | 151 } |
| 152 | 152 |
| 153 void* dl = base::LoadNativeLibrary(filename); | 153 void* dl = base::LoadNativeLibrary(filename); |
| 154 if (!dl) { | 154 if (!dl) { |
| 155 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 155 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 156 << "While reading plugin info, unable to load library " | 156 << "While reading plugin info, unable to load library " |
| 157 << filename.value() << ", skipping."; | 157 << filename.value() << ", skipping."; |
| 158 return false; | 158 return false; |
| 159 } | 159 } |
| 160 | 160 |
| 161 info->path = filename; | 161 info->path = filename; |
| 162 info->enabled = true; | 162 info->enabled = true; |
| 163 | 163 |
| 164 // Attempt to swap in the wrapped plugin if this is nspluginwrapper. | 164 // Attempt to swap in the wrapped plugin if this is nspluginwrapper. |
| 165 UnwrapNSPluginWrapper(&dl, &info->path); | 165 UnwrapNSPluginWrapper(&dl, &info->path); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 186 const char* name = NULL; | 186 const char* name = NULL; |
| 187 NP_GetValue(NULL, nsPluginVariable_NameString, &name); | 187 NP_GetValue(NULL, nsPluginVariable_NameString, &name); |
| 188 if (name) | 188 if (name) |
| 189 info->name = UTF8ToUTF16(name); | 189 info->name = UTF8ToUTF16(name); |
| 190 | 190 |
| 191 const char* description = NULL; | 191 const char* description = NULL; |
| 192 NP_GetValue(NULL, nsPluginVariable_DescriptionString, &description); | 192 NP_GetValue(NULL, nsPluginVariable_DescriptionString, &description); |
| 193 if (description) | 193 if (description) |
| 194 info->desc = UTF8ToUTF16(description); | 194 info->desc = UTF8ToUTF16(description); |
| 195 | 195 |
| 196 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 196 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 197 << "Got info for plugin " << filename.value() | 197 << "Got info for plugin " << filename.value() |
| 198 << " Name = \"" << UTF16ToUTF8(info->name) | 198 << " Name = \"" << UTF16ToUTF8(info->name) |
| 199 << "\", Description = \"" << UTF16ToUTF8(info->desc) << "\"."; | 199 << "\", Description = \"" << UTF16ToUTF8(info->desc) << "\"."; |
| 200 } else { | 200 } else { |
| 201 LOG_IF(INFO, PluginList::DebugPluginLoading()) | 201 LOG_IF(ERROR, PluginList::DebugPluginLoading()) |
| 202 << "Plugin " << filename.value() | 202 << "Plugin " << filename.value() |
| 203 << " has no GetValue() and probably won't work."; | 203 << " has no GetValue() and probably won't work."; |
| 204 } | 204 } |
| 205 | 205 |
| 206 // Intentionally not unloading the plugin here, it can lead to crashes. | 206 // Intentionally not unloading the plugin here, it can lead to crashes. |
| 207 | 207 |
| 208 return true; | 208 return true; |
| 209 } | 209 } |
| 210 | 210 |
| 211 // static | 211 // static |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 mime_type.description = UTF8ToUTF16(description.substr(ofs)); | 246 mime_type.description = UTF8ToUTF16(description.substr(ofs)); |
| 247 } | 247 } |
| 248 mime_types->push_back(mime_type); | 248 mime_types->push_back(mime_type); |
| 249 if (end == std::string::npos) | 249 if (end == std::string::npos) |
| 250 break; | 250 break; |
| 251 ofs = end + 1; | 251 ofs = end + 1; |
| 252 } | 252 } |
| 253 } | 253 } |
| 254 | 254 |
| 255 } // namespace NPAPI | 255 } // namespace NPAPI |
| OLD | NEW |