⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webbasepluginpackage.mm

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 MM
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1.  Redistributions of source code must retain the above copyright *     notice, this list of conditions and the following disclaimer.  * 2.  Redistributions in binary form must reproduce the above copyright *     notice, this list of conditions and the following disclaimer in the *     documentation and/or other materials provided with the distribution.  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of *     its contributors may be used to endorse or promote products derived *     from this software without specific prior written permission.  * * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#import <WebKit/WebBasePluginPackage.h>#import <WebKit/WebKitNSStringExtras.h>#import <WebKit/WebNetscapePluginPackage.h>#import <WebKit/WebNSObjectExtras.h>#import <WebKit/WebPluginPackage.h>#import <WebCore/WebCoreObjCExtras.h>#import <runtime/InitializeThreading.h>#import <wtf/Assertions.h>#import <wtf/Vector.h>#import <WebKitSystemInterface.h>#import "WebKitLogging.h"#import "WebTypesInternal.h"#import <mach-o/arch.h>#import <mach-o/fat.h>#import <mach-o/loader.h>#define JavaCocoaPluginIdentifier   @"com.apple.JavaPluginCocoa"#define JavaCarbonPluginIdentifier  @"com.apple.JavaAppletPlugin"#define JavaCFMPluginFilename       @"Java Applet Plugin Enabler"#define QuickTimeCarbonPluginIdentifier       @"com.apple.QuickTime Plugin.plugin"#define QuickTimeCocoaPluginIdentifier        @"com.apple.quicktime.webplugin"@interface NSArray (WebPluginExtensions)- (NSArray *)_web_lowercaseStrings;@end;@implementation WebBasePluginPackage+ (void)initialize{    JSC::initializeThreading();#ifndef BUILDING_ON_TIGER    WebCoreObjCFinalizeOnMainThread(self);#endif}+ (WebBasePluginPackage *)pluginWithPath:(NSString *)pluginPath{        WebBasePluginPackage *pluginPackage = [[WebPluginPackage alloc] initWithPath:pluginPath];    if (!pluginPackage) {#if ENABLE(NETSCAPE_PLUGIN_API)        pluginPackage = [[WebNetscapePluginPackage alloc] initWithPath:pluginPath];#else        return nil;#endif    }    return [pluginPackage autorelease];}+ (NSString *)preferredLocalizationName{    return WebCFAutorelease(WKCopyCFLocalizationPreferredName(NULL));}- (NSString *)pathByResolvingSymlinksAndAliasesInPath:(NSString *)thePath{    NSString *newPath = [thePath stringByResolvingSymlinksInPath];    FSRef fref;    OSStatus err;    err = FSPathMakeRef((const UInt8 *)[thePath fileSystemRepresentation], &fref, NULL);    if (err != noErr)        return newPath;    Boolean targetIsFolder;    Boolean wasAliased;    err = FSResolveAliasFileWithMountFlags(&fref, TRUE, &targetIsFolder, &wasAliased, kResolveAliasFileNoUI);    if (err != noErr)        return newPath;    if (wasAliased) {        CFURLRef URL = CFURLCreateFromFSRef(kCFAllocatorDefault, &fref);        newPath = [(NSURL *)URL path];        CFRelease(URL);    }    return newPath;}- (id)initWithPath:(NSString *)pluginPath{    if (!(self = [super init]))        return nil;            path = [[self pathByResolvingSymlinksAndAliasesInPath:pluginPath] retain];    bundle = [[NSBundle alloc] initWithPath:path];#ifndef __ppc__    // 32-bit PowerPC is the only platform where non-bundled CFM plugins are supported    if (!bundle) {        [self release];        return nil;    }#endif    cfBundle = CFBundleCreate(NULL, (CFURLRef)[NSURL fileURLWithPath:path]);    extensionToMIME = [[NSMutableDictionary alloc] init];        return self;}- (BOOL)getPluginInfoFromBundleAndMIMEDictionary:(NSDictionary *)MIMETypes{    if (!bundle)        return NO;        if (!MIMETypes) {        MIMETypes = [bundle objectForInfoDictionaryKey:WebPluginMIMETypesKey];        if (!MIMETypes)            return NO;    }    NSMutableDictionary *MIMEToExtensionsDictionary = [NSMutableDictionary dictionary];    NSMutableDictionary *MIMEToDescriptionDictionary = [NSMutableDictionary dictionary];    NSEnumerator *keyEnumerator = [MIMETypes keyEnumerator];    NSDictionary *MIMEDictionary;    NSString *MIME, *description;    NSArray *extensions;    while ((MIME = [keyEnumerator nextObject]) != nil) {        MIMEDictionary = [MIMETypes objectForKey:MIME];                // FIXME: Consider storing disabled MIME types.        NSNumber *isEnabled = [MIMEDictionary objectForKey:WebPluginTypeEnabledKey];        if (isEnabled && [isEnabled boolValue] == NO)            continue;        extensions = [[MIMEDictionary objectForKey:WebPluginExtensionsKey] _web_lowercaseStrings];        if ([extensions count] == 0)            extensions = [NSArray arrayWithObject:@""];        MIME = [MIME lowercaseString];        [MIMEToExtensionsDictionary setObject:extensions forKey:MIME];        description = [MIMEDictionary objectForKey:WebPluginTypeDescriptionKey];        if (!description)            description = @"";        [MIMEToDescriptionDictionary setObject:description forKey:MIME];    }    [self setMIMEToExtensionsDictionary:MIMEToExtensionsDictionary];    [self setMIMEToDescriptionDictionary:MIMEToDescriptionDictionary];    NSString *filename = [self filename];    NSString *theName = [bundle objectForInfoDictionaryKey:WebPluginNameKey];    if (!theName)        theName = filename;    [self setName:theName];    description = [bundle objectForInfoDictionaryKey:WebPluginDescriptionKey];    if (!description)        description = filename;    [self setPluginDescription:description];    return YES;}- (void)unload{}- (void)createPropertyListFile{    if ([self load] && BP_CreatePluginMIMETypesPreferences) {        BP_CreatePluginMIMETypesPreferences();        [self unload];    }}- (NSDictionary *)pListForPath:(NSString *)pListPath createFile:(BOOL)createFile{    if (createFile)        [self createPropertyListFile];        NSDictionary *pList = nil;    NSData *data = [NSData dataWithContentsOfFile:pListPath];    if (data) {        pList = [NSPropertyListSerialization propertyListFromData:data                                                 mutabilityOption:NSPropertyListImmutable                                                           format:nil                                                 errorDescription:nil];    }        return pList;}- (BOOL)getPluginInfoFromPLists{    if (!bundle)        return NO;        NSDictionary *MIMETypes = nil;    NSString *pListFilename = [bundle objectForInfoDictionaryKey:WebPluginMIMETypesFilenameKey];        // Check if the MIME types are claimed in a plist in the user's preferences directory.    if (pListFilename) {        NSString *pListPath = [NSString stringWithFormat:@"%@/Library/Preferences/%@", NSHomeDirectory(), pListFilename];        NSDictionary *pList = [self pListForPath:pListPath createFile:NO];        if (pList) {            // If the plist isn't localized, have the plug-in recreate it in the preferred language.            NSString *localizationName = [pList objectForKey:WebPluginLocalizationNameKey];            if (![localizationName isEqualToString:[[self class] preferredLocalizationName]])                pList = [self pListForPath:pListPath createFile:YES];            MIMETypes = [pList objectForKey:WebPluginMIMETypesKey];        } else            // Plist doesn't exist, ask the plug-in to create it.            MIMETypes = [[self pListForPath:pListPath createFile:YES] objectForKey:WebPluginMIMETypesKey];    }        // Pass the MIME dictionary to the superclass to parse it.    return [self getPluginInfoFromBundleAndMIMEDictionary:MIMETypes];}- (BOOL)load{    if (bundle && !BP_CreatePluginMIMETypesPreferences)        BP_CreatePluginMIMETypesPreferences = (BP_CreatePluginMIMETypesPreferencesFuncPtr)CFBundleGetFunctionPointerForName(cfBundle, CFSTR("BP_CreatePluginMIMETypesPreferences"));        return YES;}- (void)dealloc{    ASSERT(!pluginDatabases || [pluginDatabases count] == 0);    [pluginDatabases release];        [name release];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -