18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005 Apple Computer, Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebBasePluginPackage.h> 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#import <algorithm> 3221939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <WebCore/WebCoreObjCExtras.h> 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebKitNSStringExtras.h> 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebNSObjectExtras.h> 3521939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <WebKit/WebNetscapePluginPackage.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebPluginPackage.h> 37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <runtime/InitializeThreading.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/Assertions.h> 3921939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <wtf/Threading.h> 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/Vector.h> 412bde8e466a4451c7319e3a072d118917957d6554Steve Block#import <wtf/text/CString.h> 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKitSystemInterface.h> 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitLogging.h" 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebTypesInternal.h" 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <mach-o/arch.h> 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <mach-o/fat.h> 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <mach-o/loader.h> 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#define JavaCocoaPluginIdentifier "com.apple.JavaPluginCocoa" 5306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#define JavaCarbonPluginIdentifier "com.apple.JavaAppletPlugin" 5406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#define JavaCFMPluginFilename "Java Applet Plugin Enabler" 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#define QuickTimeCarbonPluginIdentifier "com.apple.QuickTime Plugin.plugin" 5706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#define QuickTimeCocoaPluginIdentifier "com.apple.quicktime.webplugin" 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSArray (WebPluginExtensions) 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)_web_lowercaseStrings; 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end; 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenusing namespace std; 6406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenusing namespace WebCore; 6506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebBasePluginPackage 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)initialize 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JSC::initializeThreading(); 7121939df44de1705786c545cd1bf519d47250322dBen Murdoch WTF::initializeMainThreadToProcessMainThread(); 72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef BUILDING_ON_TIGER 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCoreObjCFinalizeOnMainThread(self); 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (WebBasePluginPackage *)pluginWithPath:(NSString *)pluginPath 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebBasePluginPackage *pluginPackage = [[WebPluginPackage alloc] initWithPath:pluginPath]; 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!pluginPackage) { 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API) 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pluginPackage = [[WebNetscapePluginPackage alloc] initWithPath:pluginPath]; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [pluginPackage autorelease]; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSString *)preferredLocalizationName 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return WebCFAutorelease(WKCopyCFLocalizationPreferredName(NULL)); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 9806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenstatic NSString *pathByResolvingSymlinksAndAliases(NSString *thePath) 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *newPath = [thePath stringByResolvingSymlinksInPath]; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FSRef fref; 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OSStatus err; 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project err = FSPathMakeRef((const UInt8 *)[thePath fileSystemRepresentation], &fref, NULL); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (err != noErr) 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return newPath; 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Boolean targetIsFolder; 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Boolean wasAliased; 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project err = FSResolveAliasFileWithMountFlags(&fref, TRUE, &targetIsFolder, &wasAliased, kResolveAliasFileNoUI); 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (err != noErr) 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return newPath; 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (wasAliased) { 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFURLRef URL = CFURLCreateFromFSRef(kCFAllocatorDefault, &fref); 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newPath = [(NSURL *)URL path]; 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(URL); 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return newPath; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithPath:(NSString *)pluginPath 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(self = [super init])) 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 12906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen path = pathByResolvingSymlinksAndAliases(pluginPath); 13006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen cfBundle.adoptCF(CFBundleCreate(kCFAllocatorDefault, (CFURLRef)[NSURL fileURLWithPath:path])); 13106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef __ppc__ 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // 32-bit PowerPC is the only platform where non-bundled CFM plugins are supported 13406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!cfBundle) { 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self release]; 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return self; 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)unload 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)createPropertyListFile 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 149563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if ([self load] && BP_CreatePluginMIMETypesPreferences) { 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BP_CreatePluginMIMETypesPreferences(); 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self unload]; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 153563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 154563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 155563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (NSDictionary *)pListForPath:(NSString *)pListPath createFile:(BOOL)createFile 156563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 157563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (createFile) 158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark [self createPropertyListFile]; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSDictionary *pList = nil; 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSData *data = [NSData dataWithContentsOfFile:pListPath]; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (data) { 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pList = [NSPropertyListSerialization propertyListFromData:data 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mutabilityOption:NSPropertyListImmutable 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project format:nil 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project errorDescription:nil]; 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return pList; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen- (id)_objectForInfoDictionaryKey:(NSString *)key 17306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 17406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen CFDictionaryRef bundleInfoDictionary = CFBundleGetInfoDictionary(cfBundle.get()); 17506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!bundleInfoDictionary) 17606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return nil; 17706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 17806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return (id)CFDictionaryGetValue(bundleInfoDictionary, key); 17906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 18006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)getPluginInfoFromPLists 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 18306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!cfBundle) 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NO; 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSDictionary *MIMETypes = nil; 18706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NSString *pListFilename = [self _objectForInfoDictionaryKey:WebPluginMIMETypesFilenameKey]; 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check if the MIME types are claimed in a plist in the user's preferences directory. 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pListFilename) { 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *pListPath = [NSString stringWithFormat:@"%@/Library/Preferences/%@", NSHomeDirectory(), pListFilename]; 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSDictionary *pList = [self pListForPath:pListPath createFile:NO]; 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (pList) { 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the plist isn't localized, have the plug-in recreate it in the preferred language. 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *localizationName = [pList objectForKey:WebPluginLocalizationNameKey]; 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (![localizationName isEqualToString:[[self class] preferredLocalizationName]]) 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pList = [self pListForPath:pListPath createFile:YES]; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MIMETypes = [pList objectForKey:WebPluginMIMETypesKey]; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Plist doesn't exist, ask the plug-in to create it. 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MIMETypes = [[self pListForPath:pListPath createFile:YES] objectForKey:WebPluginMIMETypesKey]; 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 20306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 20406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!MIMETypes) { 20506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen MIMETypes = [self _objectForInfoDictionaryKey:WebPluginMIMETypesKey]; 20606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!MIMETypes) 20706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return NO; 20806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 20906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 21006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NSEnumerator *keyEnumerator = [MIMETypes keyEnumerator]; 21106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NSDictionary *MIMEDictionary; 21206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NSString *MIME, *description; 21306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NSArray *extensions; 21406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 21506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen while ((MIME = [keyEnumerator nextObject]) != nil) { 21606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen MIMEDictionary = [MIMETypes objectForKey:MIME]; 21706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 21806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // FIXME: Consider storing disabled MIME types. 21906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NSNumber *isEnabled = [MIMEDictionary objectForKey:WebPluginTypeEnabledKey]; 22006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (isEnabled && [isEnabled boolValue] == NO) 22106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen continue; 22206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 22306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen MimeClassInfo mimeClassInfo; 22406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 22506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen extensions = [[MIMEDictionary objectForKey:WebPluginExtensionsKey] _web_lowercaseStrings]; 2262bde8e466a4451c7319e3a072d118917957d6554Steve Block for (NSUInteger i = 0; i < [extensions count]; ++i) { 2272bde8e466a4451c7319e3a072d118917957d6554Steve Block // The DivX plug-in lists multiple extensions in a comma separated string instead of using 2282bde8e466a4451c7319e3a072d118917957d6554Steve Block // multiple array elements in the property list. Work around this here by splitting the 2292bde8e466a4451c7319e3a072d118917957d6554Steve Block // extension string into components. 2302bde8e466a4451c7319e3a072d118917957d6554Steve Block NSArray *extensionComponents = [[extensions objectAtIndex:i] componentsSeparatedByString:@","]; 2312bde8e466a4451c7319e3a072d118917957d6554Steve Block 2322bde8e466a4451c7319e3a072d118917957d6554Steve Block for (NSString *extension in extensionComponents) 2332bde8e466a4451c7319e3a072d118917957d6554Steve Block mimeClassInfo.extensions.append(extension); 2342bde8e466a4451c7319e3a072d118917957d6554Steve Block } 23506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 23606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if ([extensions count] == 0) 23706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen extensions = [NSArray arrayWithObject:@""]; 23806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 23906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen mimeClassInfo.type = String(MIME).lower(); 24006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 24106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen description = [MIMEDictionary objectForKey:WebPluginTypeDescriptionKey]; 24206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen mimeClassInfo.desc = description; 24306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 24406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen pluginInfo.mimes.append(mimeClassInfo); 24506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!description) 24606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen description = @""; 24706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 24806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 24906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NSString *filename = [(NSString *)path lastPathComponent]; 25006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen pluginInfo.file = filename; 25106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 25206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen NSString *theName = [self _objectForInfoDictionaryKey:WebPluginNameKey]; 25306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!theName) 25406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen theName = filename; 25506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen pluginInfo.name = theName; 25606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 25706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen description = [self _objectForInfoDictionaryKey:WebPluginDescriptionKey]; 25806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (!description) 25906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen description = filename; 26006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen pluginInfo.desc = description; 26106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 26206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return YES; 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)load 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 26706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (cfBundle && !BP_CreatePluginMIMETypesPreferences) 26806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen BP_CreatePluginMIMETypesPreferences = (BP_CreatePluginMIMETypesPreferencesFuncPtr)CFBundleGetFunctionPointerForName(cfBundle.get(), CFSTR("BP_CreatePluginMIMETypesPreferences")); 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return YES; 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!pluginDatabases || [pluginDatabases count] == 0); 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [pluginDatabases release]; 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super dealloc]; 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)finalize 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_MAIN_THREAD(); 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!pluginDatabases || [pluginDatabases count] == 0); 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [pluginDatabases release]; 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super finalize]; 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen- (const String&)path 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return path; 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen- (const PluginInfo&)pluginInfo 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 29706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return pluginInfo; 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen- (BOOL)supportsExtension:(const String&)extension 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 30206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(extension.lower() == extension); 30306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 30406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen for (size_t i = 0; i < pluginInfo.mimes.size(); ++i) { 30506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen const Vector<String>& extensions = pluginInfo.mimes[i].extensions; 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (find(extensions.begin(), extensions.end(), extension) != extensions.end()) 30806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return YES; 30906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 31106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return NO; 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 314dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch- (BOOL)supportsMIMEType:(const WTF::String&)mimeType 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 31606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(mimeType.lower() == mimeType); 31706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 31806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen for (size_t i = 0; i < pluginInfo.mimes.size(); ++i) { 31906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (pluginInfo.mimes[i].type == mimeType) 32006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return YES; 32106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen } 32206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 32306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return NO; 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 32606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen- (NSString *)MIMETypeForExtension:(const String&)extension 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 32806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen ASSERT(extension.lower() == extension); 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen for (size_t i = 0; i < pluginInfo.mimes.size(); ++i) { 33106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen const MimeClassInfo& mimeClassInfo = pluginInfo.mimes[i]; 33206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen const Vector<String>& extensions = mimeClassInfo.extensions; 33306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 33406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (find(extensions.begin(), extensions.end(), extension) != extensions.end()) 33506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return mimeClassInfo.type; 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return nil; 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isQuickTimePlugIn 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 34306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen const String& bundleIdentifier = [self bundleIdentifier]; 34406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return bundleIdentifier == QuickTimeCocoaPluginIdentifier || bundleIdentifier == QuickTimeCocoaPluginIdentifier; 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isJavaPlugIn 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 34906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen const String& bundleIdentifier = [self bundleIdentifier]; 35006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return bundleIdentifier == JavaCocoaPluginIdentifier || bundleIdentifier == JavaCarbonPluginIdentifier || 35106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen equalIgnoringCase(pluginInfo.file, JavaCFMPluginFilename); 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 354f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic inline void swapIntsInHeader(uint32_t* rawData, size_t length) 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 356f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch for (size_t i = 0; i < length; ++i) 357f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch rawData[i] = OSSwapInt32(rawData[i]); 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isNativeLibraryData:(NSData *)data 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 362f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch NSUInteger sizeInBytes = [data length]; 363f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Vector<uint32_t, 128> rawData((sizeInBytes + 3) / 4); 364f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch memcpy(rawData.data(), [data bytes], sizeInBytes); 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned numArchs = 0; 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project struct fat_arch singleArch = { 0, 0, 0, 0, 0 }; 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project struct fat_arch* archs = 0; 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 370f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (sizeInBytes >= sizeof(struct mach_header_64)) { 371f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch uint32_t magic = *rawData.data(); 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (magic == MH_MAGIC || magic == MH_CIGAM) { 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We have a 32-bit thin binary 375f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch struct mach_header* header = (struct mach_header*)rawData.data(); 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check if we need to swap the bytes 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (magic == MH_CIGAM) 379f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch swapIntsInHeader(rawData.data(), rawData.size()); 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project singleArch.cputype = header->cputype; 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project singleArch.cpusubtype = header->cpusubtype; 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project archs = &singleArch; 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project numArchs = 1; 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (magic == MH_MAGIC_64 || magic == MH_CIGAM_64) { 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We have a 64-bit thin binary 388f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch struct mach_header_64* header = (struct mach_header_64*)rawData.data(); 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check if we need to swap the bytes 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (magic == MH_CIGAM_64) 392f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch swapIntsInHeader(rawData.data(), rawData.size()); 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project singleArch.cputype = header->cputype; 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project singleArch.cpusubtype = header->cpusubtype; 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project archs = &singleArch; 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project numArchs = 1; 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (magic == FAT_MAGIC || magic == FAT_CIGAM) { 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We have a fat (universal) binary 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check if we need to swap the bytes 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (magic == FAT_CIGAM) 404f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch swapIntsInHeader(rawData.data(), rawData.size()); 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch COMPILE_ASSERT(sizeof(struct fat_header) % sizeof(uint32_t) == 0, struct_fat_header_must_be_integral_size_of_uint32_t); 4072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch archs = reinterpret_cast<struct fat_arch*>(rawData.data() + sizeof(struct fat_header) / sizeof(uint32_t)); 4082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch numArchs = reinterpret_cast<struct fat_header*>(rawData.data())->nfat_arch; 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 410f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch unsigned maxArchs = (sizeInBytes - sizeof(struct fat_header)) / sizeof(struct fat_arch); 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (numArchs > maxArchs) 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project numArchs = maxArchs; 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!archs || !numArchs) 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NO; 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const NXArchInfo* localArch = NXGetLocalArchInfo(); 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!localArch) 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NO; 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cpu_type_t cputype = localArch->cputype; 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cpu_subtype_t cpusubtype = localArch->cpusubtype; 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef __x86_64__ 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NXGetLocalArchInfo returns CPU_TYPE_X86 even when running in 64-bit. 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // See <rdar://problem/4996965> for more information. 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cputype = CPU_TYPE_X86_64; 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NXFindBestFatArch(cputype, cpusubtype, archs, numArchs) != 0; 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (UInt32)versionNumber 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // CFBundleGetVersionNumber doesn't work with all possible versioning schemes, but we think for now it's good enough for us. 43806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return CFBundleGetVersionNumber(cfBundle.get()); 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)wasAddedToPluginDatabase:(WebPluginDatabase *)database 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!pluginDatabases) 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project pluginDatabases = [[NSMutableSet alloc] init]; 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(![pluginDatabases containsObject:database]); 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [pluginDatabases addObject:database]; 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)wasRemovedFromPluginDatabase:(WebPluginDatabase *)database 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(pluginDatabases); 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT([pluginDatabases containsObject:database]); 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [pluginDatabases removeObject:database]; 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch- (WTF::String)bundleIdentifier 45906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{ 46006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return CFBundleGetIdentifier(cfBundle.get()); 46106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen} 46206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation NSArray (WebPluginExtensions) 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)_web_lowercaseStrings 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableArray *lowercaseStrings = [NSMutableArray arrayWithCapacity:[self count]]; 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEnumerator *strings = [self objectEnumerator]; 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *string; 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((string = [strings nextObject]) != nil) { 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([string isKindOfClass:[NSString class]]) 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [lowercaseStrings addObject:[string lowercaseString]]; 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return lowercaseStrings; 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 482