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