summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-14 07:37:13 +0000
committerstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-14 07:37:13 +0000
commit9ab0ea353453e0f9a2e97132d86d415ea4192977 (patch)
tree0244fbb9de157e3cb4765da62c6e8a2614a69b83
parentd23cdced2fcfaf7c80bf2bad0cd45f289fd06de9 (diff)
downloadchromium_src-9ab0ea353453e0f9a2e97132d86d415ea4192977.zip
chromium_src-9ab0ea353453e0f9a2e97132d86d415ea4192977.tar.gz
chromium_src-9ab0ea353453e0f9a2e97132d86d415ea4192977.tar.bz2
Remove deprecated STR-resource-based Mac plugin info loading
This method of declaring resources has been deprecated for quite some time, and almost all plugins now support the new Info.plist approach. This code occasionally leads to browser crashes, so removing it should improve stability. BUG=96422 TEST=Most plugins should still show up in about:plugins on the Mac. A handful (see bug) will not. Review URL: http://codereview.chromium.org/7886008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@101036 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--webkit/plugins/npapi/plugin_lib_mac.mm156
1 files changed, 8 insertions, 148 deletions
diff --git a/webkit/plugins/npapi/plugin_lib_mac.mm b/webkit/plugins/npapi/plugin_lib_mac.mm
index e943736..fe11197 100644
--- a/webkit/plugins/npapi/plugin_lib_mac.mm
+++ b/webkit/plugins/npapi/plugin_lib_mac.mm
@@ -22,10 +22,6 @@ namespace npapi {
namespace {
-const short kSTRTypeDefinitionResourceID = 128;
-const short kSTRTypeDescriptionResourceID = 127;
-const short kSTRPluginDescriptionResourceID = 126;
-
NSDictionary* GetMIMETypes(CFBundleRef bundle) {
NSString* mime_filename =
(NSString*)CFBundleGetValueForInfoDictionaryKey(bundle,
@@ -134,133 +130,21 @@ bool ReadPlistPluginInfo(const FilePath& filename, CFBundleRef bundle,
return true;
}
-class ScopedBundleResourceFile {
- public:
- ScopedBundleResourceFile(CFBundleRef bundle) : bundle_(bundle) {
- old_ref_num_ = CurResFile();
- bundle_ref_num_ = CFBundleOpenBundleResourceMap(bundle);
- UseResFile(bundle_ref_num_);
- }
- ~ScopedBundleResourceFile() {
- UseResFile(old_ref_num_);
- CFBundleCloseBundleResourceMap(bundle_, bundle_ref_num_);
- }
-
- private:
- CFBundleRef bundle_;
- CFBundleRefNum bundle_ref_num_;
- ResFileRefNum old_ref_num_;
-};
-
-bool GetSTRResource(CFBundleRef bundle, short res_id,
- std::vector<std::string>* contents) {
- Handle res_handle = Get1Resource('STR#', res_id);
- if (!res_handle || !*res_handle)
- return false;
-
- char* pointer = *res_handle;
- short num_strings = *(short*)pointer;
- pointer += sizeof(short);
- for (short i = 0; i < num_strings; ++i) {
- // Despite being 8-bits wide, these are legacy encoded. Make a round trip.
- ScopedCFTypeRef<CFStringRef> str(CFStringCreateWithPascalStringNoCopy(
- kCFAllocatorDefault,
- (unsigned char*)pointer,
- GetApplicationTextEncoding(), // is this right?
- kCFAllocatorNull)); // perhaps CFStringGetSystemEncoding?
- if (!str.get())
- return false;
- contents->push_back(base::SysCFStringRefToUTF8(str.get()));
- pointer += 1+*reinterpret_cast<unsigned char*>(pointer);
- }
-
- return true;
-}
-
-bool ReadSTRPluginInfo(const FilePath& filename, CFBundleRef bundle,
- WebPluginInfo* info) {
- ScopedBundleResourceFile res_file(bundle);
-
- std::vector<std::string> type_strings;
- if (!GetSTRResource(bundle, kSTRTypeDefinitionResourceID, &type_strings))
- return false;
-
- std::vector<std::string> type_descs;
- bool have_type_descs = GetSTRResource(bundle,
- kSTRTypeDescriptionResourceID,
- &type_descs);
-
- std::vector<std::string> plugin_descs;
- bool have_plugin_descs = GetSTRResource(bundle,
- kSTRPluginDescriptionResourceID,
- &plugin_descs);
-
- size_t num_types = type_strings.size()/2;
-
- for (size_t i = 0; i < num_types; ++i) {
- WebPluginMimeType mime;
- mime.mime_type = StringToLowerASCII(type_strings[2*i]);
- if (have_type_descs && i < type_descs.size())
- mime.description = UTF8ToUTF16(type_descs[i]);
- base::SplitString(
- StringToLowerASCII(type_strings[2*i+1]), ',', &mime.file_extensions);
-
- info->mime_types.push_back(mime);
- }
-
- NSString* plugin_vers =
- (NSString*)CFBundleGetValueForInfoDictionaryKey(bundle,
- CFSTR("CFBundleShortVersionString"));
-
- if (have_plugin_descs && plugin_descs.size() > 1)
- info->name = UTF8ToUTF16(plugin_descs[1]);
- else
- info->name = UTF8ToUTF16(filename.BaseName().value());
- info->path = filename;
- if (plugin_vers)
- info->version = base::SysNSStringToUTF16(plugin_vers);
- if (have_plugin_descs && !plugin_descs.empty())
- info->desc = UTF8ToUTF16(plugin_descs[0]);
- else
- info->desc = UTF8ToUTF16(filename.BaseName().value());
- info->enabled = WebPluginInfo::USER_ENABLED;
-
- return true;
-}
-
} // anonymous namespace
bool PluginLib::ReadWebPluginInfo(const FilePath &filename,
WebPluginInfo* info) {
- // There are two ways to get information about plugin capabilities. One is an
- // Info.plist set of keys, documented at
+ // There are three ways to get information about plugin capabilities:
+ // 1) a set of Info.plist keys, documented at
// http://developer.apple.com/documentation/InternetWeb/Conceptual/WebKit_PluginProgTopic/Concepts/AboutPlugins.html .
- // The other is a set of STR# resources, documented at
+ // 2) a set of STR# resources, documented at
// https://developer.mozilla.org/En/Gecko_Plugin_API_Reference/Plug-in_Development_Overview .
+ // 3) a NP_GetMIMEDescription() entry point, documented at
+ // https://developer.mozilla.org/en/NP_GetMIMEDescription
//
- // Historically, the data was maintained in the STR# resources. Apple, with
- // the introduction of WebKit, noted the weaknesses of resources and moved the
- // information into the Info.plist. Mozilla had always supported a
- // NP_GetMIMEDescription() entry point for Unix plugins and also supports it
- // on the Mac to supplement the STR# format. WebKit does not support
- // NP_GetMIMEDescription() and neither do we. (That entry point is documented
- // at https://developer.mozilla.org/en/NP_GetMIMEDescription .) We prefer the
- // Info.plist format because it's more extensible and has a defined encoding,
- // but will fall back to the STR# format of the data if it is not present in
- // the Info.plist.
- //
- // The parsing of the data lives in the two functions ReadSTRPluginInfo() and
- // ReadPlistPluginInfo(), but a summary of the formats follows.
- //
- // Each data type handled by a plugin has several properties:
- // - <<type0mimetype>>
- // - <<type0fileextension0>>..<<type0fileextensionk>>
- // - <<type0description>>
- //
- // Each plugin may have any number of types defined. In addition, the plugin
- // itself has properties:
- // - <<plugindescription>>
- // - <<pluginname>>
+ // Mozilla supported (3), but WebKit never has, so no plugins rely on it. Most
+ // browsers supported (2) and then added support for (1); Chromium originally
+ // supported (2) and (1), but now supports only (1) as (2) is deprecated.
//
// For the Info.plist version, the data is formatted as follows (in text plist
// format):
@@ -289,27 +173,6 @@ bool PluginLib::ReadWebPluginInfo(const FilePath &filename,
// the WebPluginMIMETypes key. If the key is present but the file doesn't
// exist, we must load the plugin and call a specific function to have the
// plugin create the file.
- //
- // If we do not find those keys in the Info.plist, we fall back to the STR#
- // resources. In them, the data is formatted as follows:
- // STR# 128
- // (1) <<type0mimetype>>
- // (2) <<type0fileextension0>>,...,<<type0fileextensionk>>
- // (3) <<type1mimetype>>
- // (4) <<type1fileextension0>>,...,<<type1fileextensionk>>
- // (...)
- // (2n+1) <<typenmimetype>>
- // (2n+2) <<typenfileextension0>>,...,<<typenfileextensionk>>
- // STR# 127
- // (1) <<type0description>>
- // (2) <<type1description>>
- // (...)
- // (n+1) <<typendescription>>
- // STR# 126
- // (1) <<plugindescription>>
- // (2) <<pluginname>>
- //
- // Strictly speaking, only STR# 128 is required.
ScopedCFTypeRef<CFURLRef> bundle_url(CFURLCreateFromFileSystemRepresentation(
kCFAllocatorDefault, (const UInt8*)filename.value().c_str(),
@@ -338,9 +201,6 @@ bool PluginLib::ReadWebPluginInfo(const FilePath &filename,
if (ReadPlistPluginInfo(filename, bundle.get(), info))
return true;
- if (ReadSTRPluginInfo(filename, bundle.get(), info))
- return true;
-
// ... or not
return false;