Source/WebKit/Shared/Cocoa/WKObject.h

@@void* wrap(API::Object*);
5252
5353@end
5454
55 NS_ROOT_CLASS
56 @interface WKObject <WKObject>
 55@interface WKObject : NSProxy <WKObject>
5756
5857- (NSObject *)_web_createTarget NS_RETURNS_RETAINED;
5958

Source/WebKit/Shared/Cocoa/WKObject.mm

2929#if WK_API_ENABLED
3030
3131#import "APIObject.h"
32 #import "objcSPI.h"
33 #import <wtf/ObjcRuntimeExtras.h>
 32
 33@interface NSObject ()
 34- (CFTypeID)_cfTypeID;
 35
 36- (BOOL)isNSArray__;
 37- (BOOL)isNSCFConstantString__;
 38- (BOOL)isNSData__;
 39- (BOOL)isNSDate__;
 40- (BOOL)isNSDictionary__;
 41- (BOOL)isNSObject__;
 42- (BOOL)isNSOrderedSet__;
 43- (BOOL)isNSNumber__;
 44- (BOOL)isNSSet__;
 45- (BOOL)isNSString__;
 46- (BOOL)isNSTimeZone__;
 47- (BOOL)isNSValue__;
 48@end
 49
 50@interface NSProxy ()
 51- (CFTypeID)_cfTypeID;
 52
 53- (BOOL)isNSArray__;
 54- (BOOL)isNSCFConstantString__;
 55- (BOOL)isNSData__;
 56- (BOOL)isNSDate__;
 57- (BOOL)isNSDictionary__;
 58- (BOOL)isNSObject__;
 59- (BOOL)isNSOrderedSet__;
 60- (BOOL)isNSNumber__;
 61- (BOOL)isNSSet__;
 62- (BOOL)isNSString__;
 63- (BOOL)isNSTimeZone__;
 64- (BOOL)isNSValue__;
 65@end
3466
3567@implementation WKObject {
36  Class _isa;
3768 BOOL _hasInitializedTarget;
3869 NSObject *_target;
3970}
4071
41 + (Class)class
 72- (void)dealloc
4273{
43  return self;
 74 static_cast<API::Object*>(object_getIndexedIvars(self))->~Object();
 75 [_target release];
 76
 77 [super dealloc];
4478}
4579
4680static inline void initializeTargetIfNeeded(WKObject *self)

@@static inline void initializeTargetIfNeeded(WKObject *self)
5286 self->_target = [self _web_createTarget];
5387}
5488
55 // MARK: Methods used by the Objective-C runtime
56 
57 - (id)forwardingTargetForSelector:(SEL)selector
58 {
59  initializeTargetIfNeeded(self);
60 
61  return _target;
62 }
63 
64 - (BOOL)allowsWeakReference
65 {
66  return !_objc_rootIsDeallocating(self);
67 }
68 
69 - (BOOL)retainWeakReference
70 {
71  return _objc_rootTryRetain(self);
72 }
73 
74 // MARK: NSObject protocol implementation
75 
7689- (BOOL)isEqual:(id)object
7790{
7891 if (object == self)

@@static inline void initializeTargetIfNeeded(WKObject *self)
90103{
91104 initializeTargetIfNeeded(self);
92105
93  return _target ? [_target hash] : reinterpret_cast<NSUInteger>(self);
 106 return _target ? [_target hash] : [super hash];
94107}
95108
96 - (Class)superclass
 109- (BOOL)isKindOfClass:(Class)aClass
97110{
98111 initializeTargetIfNeeded(self);
99112
100  return _target ? [_target superclass] : class_getSuperclass(object_getClass(self));
 113 return [_target isKindOfClass:aClass];
101114}
102115
103 - (Class)class
 116- (BOOL)isMemberOfClass:(Class)aClass
104117{
105118 initializeTargetIfNeeded(self);
106119
107  return _target ? [_target class] : object_getClass(self);
 120 return [_target isMemberOfClass:aClass];
108121}
109122
110 - (instancetype)self
 123- (BOOL)respondsToSelector:(SEL)selector
111124{
112  return self;
113 }
 125 initializeTargetIfNeeded(self);
114126
115 - (id)performSelector:(SEL)selector
116 {
117  return selector ? wtfObjcMsgSend<id>(self, selector) : nil;
 127 return [_target respondsToSelector:selector] || [super respondsToSelector:selector];
118128}
119129
120 - (id)performSelector:(SEL)selector withObject:(id)object
 130- (BOOL)conformsToProtocol:(Protocol *)protocol
121131{
122  return selector ? wtfObjcMsgSend<id>(self, selector, object) : nil;
123 }
 132 initializeTargetIfNeeded(self);
124133
125 - (id)performSelector:(SEL)selector withObject:(id)object1 withObject:(id)object2
126 {
127  return selector ? wtfObjcMsgSend<id>(self, selector, object1, object2) : nil;
 134 return [_target conformsToProtocol:protocol] || [super conformsToProtocol:protocol];
128135}
129136
130 - (BOOL)isProxy
 137- (id)forwardingTargetForSelector:(SEL)selector
131138{
132  return NO;
 139 initializeTargetIfNeeded(self);
 140
 141 return _target;
133142}
134143
135 - (BOOL)isKindOfClass:(Class)aClass
 144- (NSString *)description
136145{
137146 initializeTargetIfNeeded(self);
138147
139  return [_target isKindOfClass:aClass];
 148 return _target ? [_target description] : [super description];
140149}
141150
142 - (BOOL)isMemberOfClass:(Class)aClass
 151- (NSString *)debugDescription
143152{
144153 initializeTargetIfNeeded(self);
145154
146  return [_target isMemberOfClass:aClass];
 155 return _target ? [_target debugDescription] : [self description];
147156}
148157
149 - (BOOL)respondsToSelector:(SEL)selector
 158- (Class)classForCoder
150159{
151160 initializeTargetIfNeeded(self);
152161
153  return [_target respondsToSelector:selector] || (selector && class_respondsToSelector(object_getClass(self), selector));
 162 return [_target classForCoder];
154163}
155164
156 + (BOOL)conformsToProtocol:(Protocol *)protocol
 165- (Class)classForKeyedArchiver
157166{
158  if (!protocol)
159  return NO;
160 
161  for (Class cls = self; cls; cls = class_getSuperclass(cls)) {
162  if (class_conformsToProtocol(cls, protocol))
163  return YES;
164  }
 167 initializeTargetIfNeeded(self);
165168
166  return NO;
 169 return [_target classForKeyedArchiver];
167170}
168171
169 - (BOOL)conformsToProtocol:(Protocol *)protocol
 172- (CFTypeID)_cfTypeID
170173{
171  initializeTargetIfNeeded(self);
172 
173  if ([_target conformsToProtocol:protocol])
174  return YES;
 174 return _target ? [_target _cfTypeID] : [super _cfTypeID];
 175}
175176
176  if (!protocol)
177  return NO;
 177- (NSObject *)_web_createTarget
 178{
 179 return nil;
 180}
178181
179  for (Class cls = object_getClass(self); cls; cls = class_getSuperclass(cls)) {
180  if (class_conformsToProtocol(cls, protocol))
181  return YES;
182  }
 182- (BOOL)isNSObject__
 183{
 184 return _target ? [_target isNSObject__] : [super isNSObject__];
 185}
183186
184  return NO;
 187- (BOOL)isNSArray__
 188{
 189 return _target ? [_target isNSArray__] : [super isNSArray__];
185190}
186191
187 - (NSString *)description
 192- (BOOL)isNSCFConstantString__
188193{
189  initializeTargetIfNeeded(self);
 194 return _target ? [_target isNSCFConstantString__] : [super isNSCFConstantString__];
 195}
190196
191  return _target ? [_target description] : [NSString stringWithFormat:@"<%s %p>", class_getName(object_getClass(self)), self];
 197- (BOOL)isNSData__
 198{
 199 return _target ? [_target isNSData__] : [super isNSData__];
192200}
193201
194 - (NSString *)debugDescription
 202- (BOOL)isNSDate__
195203{
196  initializeTargetIfNeeded(self);
 204 return _target ? [_target isNSDate__] : [super isNSDate__];
 205}
197206
198  return _target ? [_target debugDescription] : [self description];
 207- (BOOL)isNSDictionary__
 208{
 209 return _target ? [_target isNSDictionary__] : [super isNSDictionary__];
199210}
200211
201 - (instancetype)retain
 212- (BOOL)isNSNumber__
202213{
203  return _objc_rootRetain(self);
 214 return _target ? [_target isNSNumber__] : [super isNSNumber__];
204215}
205216
206 - (oneway void)release
 217- (BOOL)isNSOrderedSet__
207218{
208  if (_objc_rootReleaseWasZero(self)) {
209  static_cast<API::Object*>(object_getIndexedIvars(self))->~Object();
210  [_target release];
211  _objc_rootDealloc(self);
212  }
 219 return _target ? [_target isNSOrderedSet__] : [super isNSOrderedSet__];
213220}
214221
215 - (instancetype)autorelease
 222- (BOOL)isNSSet__
216223{
217  return _objc_rootAutorelease(self);
 224 return _target ? [_target isNSSet__] : [super isNSSet__];
218225}
219226
220 - (NSUInteger)retainCount
 227- (BOOL)isNSString__
221228{
222  return _objc_rootRetainCount(self);
 229 return _target ? [_target isNSString__] : [super isNSString__];
223230}
224231
225 - (NSZone *)zone
 232- (BOOL)isNSTimeZone__
226233{
227  return NSDefaultMallocZone();
 234 return _target ? [_target isNSTimeZone__] : [super isNSTimeZone__];
228235}
229236
230 - (NSObject *)_web_createTarget
 237- (BOOL)isNSValue__
231238{
232  return nil;
 239 return _target ? [_target isNSValue__] : [super isNSValue__];
233240}
234241
235242#pragma mark WKObject protocol implementation