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

📄 objcplugin.m

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 M
字号:
/* * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved. * Copyright (C) 2006 James G. Speth (speth@end.com) * * 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. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR OR * 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 "ObjCPlugin.h"#import <objc/objc-runtime.h>#import <WebKit/WebKit.h>// === NSObject category to expose almost everything to JavaScript ===// Warning: this class introduces huge security weaknesses, and should only be used// for testing inside of DumpRenderTree, and only with trusted code.  By default, it has// the same restrictive behavior as the standard WebKit setup.  However, scripts can use the// plugin's removeBridgeRestrictions: method to open up almost total access to the Cocoa// frameworks.static BOOL _allowsScriptsFullAccess = NO;@interface NSObject (ObjCScriptAccess)+ (void)setAllowsScriptsFullAccess:(BOOL)value;+ (BOOL)allowsScriptsFullAccess;@end@implementation NSObject (ObjCScriptAccess)+ (void)setAllowsScriptsFullAccess:(BOOL)value{    _allowsScriptsFullAccess = value;}+ (BOOL)allowsScriptsFullAccess{    return _allowsScriptsFullAccess;}+ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector{    return !_allowsScriptsFullAccess;}+ (NSString *)webScriptNameForSelector:(SEL)selector{    return nil;}@end@interface JSObjC : NSObject {}// expose some useful objc functions to the scripting environment- (id)lookUpClass:(NSString *)name;- (void)log:(NSString *)message;- (id)retainObject:(id)obj;- (id)classOfObject:(id)obj;- (NSString *)classNameOfObject:(id)obj;@end@implementation JSObjC+ (BOOL)isSelectorExcludedFromWebScript:(SEL)selector{    return NO;}+ (NSString *)webScriptNameForSelector:(SEL)selector{    return nil;}- (id)invokeDefaultMethodWithArguments:(NSArray *)args{    // this is a useful shortcut for accessing objective-c classes from the scripting    // environment, e.g. 'var myObject = objc("NSObject").alloc().init();'    if ([args count] == 1)        return [self lookUpClass:[args objectAtIndex:0]];    return nil;}- (id)lookUpClass:(NSString *)name{    return NSClassFromString(name);}- (void)log:(NSString *)message{    NSLog(@"%@", message);}- (id)retainObject:(id)obj{    return [obj retain];}- (id)classOfObject:(id)obj{    return (id)[obj class];}- (NSString *)classNameOfObject:(id)obj{    return [obj className];}@end@implementation ObjCPlugin+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector{    if (aSelector == @selector(removeBridgeRestrictions:))        return NO;    if (aSelector == @selector(echo:))        return NO;    if (aSelector == @selector(throwIfArgumentIsNotHello:))      return NO;    return YES;}+ (NSString *)webScriptNameForSelector:(SEL)aSelector{    if (aSelector == @selector(echo:))        return @"echo";    if (aSelector == @selector(throwIfArgumentIsNotHello:))      return @"throwIfArgumentIsNotHello";    return nil;}+ (NSString *)webScriptNameForKey:(const char *)key {    if (strcmp(key, "throwOnDealloc") == 0)      return @"throwOnDealloc";        return nil;}+ (BOOL)isKeyExcludedFromWebScript:(const char *)key {    if (strcmp(key, "throwOnDealloc") == 0)      return NO;        return YES;}- (void)removeBridgeRestrictions:(id)container{    // let scripts invoke any selector    [NSObject setAllowsScriptsFullAccess:YES];        // store a JSObjC instance into the provided container    JSObjC *objc = [[JSObjC alloc] init];    [container setValue:objc forKey:@"objc"];    [objc release];}- (id)echo:(id)obj{    return obj;}- (void)throwIfArgumentIsNotHello:(NSString *)str {    if (![str isEqualToString:@"Hello"])         [WebScriptObject throwException:[NSString stringWithFormat:@"%@ != Hello", str]];}- (void)dealloc{    if (throwOnDealloc)        [WebScriptObject throwException:@"Throwing exception on dealloc of ObjCPlugin"];        [super dealloc];}@end

⌨️ 快捷键说明

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