OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 #include <elf.h> | 8 #include <elf.h> |
9 | 9 |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 | 74 |
75 // See comments in plugin_lib_mac regarding this symbol. | 75 // See comments in plugin_lib_mac regarding this symbol. |
76 typedef const char* (*NP_GetMimeDescriptionType)(); | 76 typedef const char* (*NP_GetMimeDescriptionType)(); |
77 NP_GetMimeDescriptionType NP_GetMIMEDescription = | 77 NP_GetMimeDescriptionType NP_GetMIMEDescription = |
78 reinterpret_cast<NP_GetMimeDescriptionType>( | 78 reinterpret_cast<NP_GetMimeDescriptionType>( |
79 dlsym(dl, "NP_GetMIMEDescription")); | 79 dlsym(dl, "NP_GetMIMEDescription")); |
80 const char* mime_description = NULL; | 80 const char* mime_description = NULL; |
81 if (NP_GetMIMEDescription) | 81 if (NP_GetMIMEDescription) |
82 mime_description = NP_GetMIMEDescription(); | 82 mime_description = NP_GetMIMEDescription(); |
83 | 83 |
84 if (mime_description) { | 84 if (mime_description) |
85 if (!ParseMIMEDescription(mime_description, &info->mime_types)) { | 85 ParseMIMEDescription(mime_description, &info->mime_types); |
86 base::UnloadNativeLibrary(dl); | |
87 return false; | |
88 } | |
89 } | |
90 | 86 |
91 // The plugin name and description live behind NP_GetValue calls. | 87 // The plugin name and description live behind NP_GetValue calls. |
92 typedef NPError (*NP_GetValueType)(void* unused, | 88 typedef NPError (*NP_GetValueType)(void* unused, |
93 nsPluginVariable variable, | 89 nsPluginVariable variable, |
94 void* value_out); | 90 void* value_out); |
95 NP_GetValueType NP_GetValue = | 91 NP_GetValueType NP_GetValue = |
96 reinterpret_cast<NP_GetValueType>(dlsym(dl, "NP_GetValue")); | 92 reinterpret_cast<NP_GetValueType>(dlsym(dl, "NP_GetValue")); |
97 if (NP_GetValue) { | 93 if (NP_GetValue) { |
98 const char* name = NULL; | 94 const char* name = NULL; |
99 NP_GetValue(NULL, nsPluginVariable_NameString, &name); | 95 NP_GetValue(NULL, nsPluginVariable_NameString, &name); |
100 if (name) | 96 if (name) |
101 info->name = UTF8ToWide(name); | 97 info->name = UTF8ToWide(name); |
102 | 98 |
103 const char* description = NULL; | 99 const char* description = NULL; |
104 NP_GetValue(NULL, nsPluginVariable_DescriptionString, &description); | 100 NP_GetValue(NULL, nsPluginVariable_DescriptionString, &description); |
105 if (description) | 101 if (description) |
106 info->desc = UTF8ToWide(description); | 102 info->desc = UTF8ToWide(description); |
107 } | 103 } |
108 | 104 |
109 base::UnloadNativeLibrary(dl); | 105 base::UnloadNativeLibrary(dl); |
110 | 106 |
111 return true; | 107 return true; |
112 } | 108 } |
113 | 109 |
114 // static | 110 // static |
115 bool PluginLib::ParseMIMEDescription( | 111 void PluginLib::ParseMIMEDescription( |
116 const char* description, | 112 const std::string& description, |
117 std::vector<WebPluginMimeType>* mime_types) { | 113 std::vector<WebPluginMimeType>* mime_types) { |
118 // TODO(evanm): rewrite this to better match Firefox; see | 114 // We parse the description here into WebPluginMimeType structures. |
119 // ParsePluginMimeDescription near | 115 // Naively from the NPAPI docs you'd think you could use |
| 116 // string-splitting, but the Firefox parser turns out to do something |
| 117 // different: find the first colon, then the second, then a semi. |
| 118 // |
| 119 // See ParsePluginMimeDescription near |
120 // http://mxr.mozilla.org/firefox/source/modules/plugin/base/src/nsPluginsDirU
tils.h#53 | 120 // http://mxr.mozilla.org/firefox/source/modules/plugin/base/src/nsPluginsDirU
tils.h#53 |
121 | 121 |
122 // We parse the description here into WebPluginMimeType structures. | 122 std::string::size_type ofs = 0; |
123 // Description for Flash 10 looks like (all as one string): | 123 for (;;) { |
124 // "application/x-shockwave-flash:swf:Shockwave Flash;" | 124 WebPluginMimeType mime_type; |
125 // "application/futuresplash:spl:FutureSplash Player" | |
126 std::vector<std::string> descriptions; | |
127 SplitString(description, ';', &descriptions); | |
128 for (size_t i = 0; i < descriptions.size(); ++i) { | |
129 if (descriptions[i].empty()) | |
130 continue; // Don't warn if they have trailing semis. | |
131 | 125 |
132 std::vector<std::string> fields; | 126 std::string::size_type end = description.find(':', ofs); |
133 SplitString(descriptions[i], ':', &fields); | 127 if (end == std::string::npos) |
134 if (fields.size() != 3) { | 128 break; |
135 LOG(WARNING) << "Couldn't parse plugin info: " << description; | 129 mime_type.mime_type = description.substr(ofs, end - ofs); |
136 // This plugin's got something weird going on; abort. | 130 ofs = end + 1; |
137 return false; | 131 |
| 132 end = description.find(':', ofs); |
| 133 if (end == std::string::npos) |
| 134 break; |
| 135 const std::string extensions = description.substr(ofs, end - ofs); |
| 136 SplitString(extensions, ',', &mime_type.file_extensions); |
| 137 ofs = end + 1; |
| 138 |
| 139 end = description.find(';', ofs); |
| 140 // It's ok for end to run off the string here. If there's no |
| 141 // trailing semicolon we consume the remainder of the string. |
| 142 if (end != std::string::npos) { |
| 143 mime_type.description = UTF8ToWide(description.substr(ofs, end - ofs)); |
| 144 } else { |
| 145 mime_type.description = UTF8ToWide(description.substr(ofs)); |
138 } | 146 } |
139 | |
140 WebPluginMimeType mime_type; | |
141 mime_type.mime_type = fields[0]; | |
142 SplitString(fields[1], ',', &mime_type.file_extensions); | |
143 mime_type.description = UTF8ToWide(fields[2]); | |
144 mime_types->push_back(mime_type); | 147 mime_types->push_back(mime_type); |
| 148 if (end == std::string::npos) |
| 149 break; |
| 150 ofs = end + 1; |
145 } | 151 } |
146 | |
147 return true; | |
148 } | 152 } |
149 | 153 |
150 } // namespace NPAPI | 154 } // namespace NPAPI |
OLD | NEW |