Diff
Modified: branches/safari-604-branch/Source/WebKit/ChangeLog (219937 => 219938)
--- branches/safari-604-branch/Source/WebKit/ChangeLog 2017-07-26 09:52:30 UTC (rev 219937)
+++ branches/safari-604-branch/Source/WebKit/ChangeLog 2017-07-26 09:52:33 UTC (rev 219938)
@@ -1,5 +1,56 @@
2017-07-26 Jason Marcell <[email protected]>
+ Cherry-pick r219764. rdar://problem/33523878
+
+ 2017-07-22 Chris Dumez <[email protected]>
+
+ REGRESSION(r204565): WKObject is broken
+ https://bugs.webkit.org/show_bug.cgi?id=174736
+ <rdar://problem/33246169>
+
+ Reviewed by Dan Bernstein.
+
+ Revert r204565 as making WKObject a root class caused unexpected crashes.
+ Instead, we now have WKObject inherit from NSProxy (instead of previously
+ NSObject) and we forward calls to the target.
+
+ We also need to provide an implementation for private methods such as
+ isNSString__ to address the issue with NSStrings that r204565 was trying
+ to fix.
+
+ * Shared/Cocoa/APIObject.mm:
+ (API::Object::unwrap):
+ * Shared/Cocoa/WKObject.h:
+ * Shared/Cocoa/WKObject.mm:
+ (-[WKObject dealloc]):
+ (-[WKObject hash]):
+ (-[WKObject isKindOfClass:]):
+ (-[WKObject isMemberOfClass:]):
+ (-[WKObject respondsToSelector:]):
+ (-[WKObject conformsToProtocol:]):
+ (-[WKObject forwardingTargetForSelector:]):
+ (-[WKObject description]):
+ (-[WKObject debugDescription]):
+ (-[WKObject classForCoder]):
+ (-[WKObject classForKeyedArchiver]):
+ (-[WKObject _web_createTarget]):
+ (-[WKObject forwardInvocation:]):
+ (-[WKObject methodSignatureForSelector:]):
+ (-[WKObject isNSObject__]):
+ (-[WKObject isNSArray__]):
+ (-[WKObject isNSCFConstantString__]):
+ (-[WKObject isNSData__]):
+ (-[WKObject isNSDate__]):
+ (-[WKObject isNSDictionary__]):
+ (-[WKObject isNSNumber__]):
+ (-[WKObject isNSOrderedSet__]):
+ (-[WKObject isNSSet__]):
+ (-[WKObject isNSString__]):
+ (-[WKObject isNSTimeZone__]):
+ (-[WKObject isNSValue__]):
+
+2017-07-26 Jason Marcell <[email protected]>
+
Cherry-pick r219739. rdar://problem/33523884
2017-07-21 Chris Dumez <[email protected]>
Modified: branches/safari-604-branch/Source/WebKit/Shared/Cocoa/APIObject.mm (219937 => 219938)
--- branches/safari-604-branch/Source/WebKit/Shared/Cocoa/APIObject.mm 2017-07-26 09:52:30 UTC (rev 219937)
+++ branches/safari-604-branch/Source/WebKit/Shared/Cocoa/APIObject.mm 2017-07-26 09:52:33 UTC (rev 219938)
@@ -334,9 +334,6 @@
if (!object)
return nullptr;
- ASSERT([(id)object conformsToProtocol:@protocol(WKObject)]);
- ASSERT([(id)object respondsToSelector:@selector(_apiObject)]);
-
return &static_cast<id <WKObject>>(object)._apiObject;
}
Modified: branches/safari-604-branch/Source/WebKit/Shared/Cocoa/WKObject.h (219937 => 219938)
--- branches/safari-604-branch/Source/WebKit/Shared/Cocoa/WKObject.h 2017-07-26 09:52:30 UTC (rev 219937)
+++ branches/safari-604-branch/Source/WebKit/Shared/Cocoa/WKObject.h 2017-07-26 09:52:33 UTC (rev 219938)
@@ -52,8 +52,7 @@
@end
-NS_ROOT_CLASS
-@interface WKObject <WKObject>
+@interface WKObject : NSProxy <WKObject>
- (NSObject *)_web_createTarget NS_RETURNS_RETAINED;
Modified: branches/safari-604-branch/Source/WebKit/Shared/Cocoa/WKObject.mm (219937 => 219938)
--- branches/safari-604-branch/Source/WebKit/Shared/Cocoa/WKObject.mm 2017-07-26 09:52:30 UTC (rev 219937)
+++ branches/safari-604-branch/Source/WebKit/Shared/Cocoa/WKObject.mm 2017-07-26 09:52:33 UTC (rev 219938)
@@ -29,18 +29,33 @@
#if WK_API_ENABLED
#import "APIObject.h"
-#import "objcSPI.h"
-#import <wtf/ObjcRuntimeExtras.h>
+@interface NSObject ()
+- (BOOL)isNSArray__;
+- (BOOL)isNSCFConstantString__;
+- (BOOL)isNSData__;
+- (BOOL)isNSDate__;
+- (BOOL)isNSDictionary__;
+- (BOOL)isNSObject__;
+- (BOOL)isNSOrderedSet__;
+- (BOOL)isNSNumber__;
+- (BOOL)isNSSet__;
+- (BOOL)isNSString__;
+- (BOOL)isNSTimeZone__;
+- (BOOL)isNSValue__;
+@end
+
@implementation WKObject {
- Class _isa;
BOOL _hasInitializedTarget;
NSObject *_target;
}
-+ (Class)class
+- (void)dealloc
{
- return self;
+ static_cast<API::Object*>(object_getIndexedIvars(self))->~Object();
+ [_target release];
+
+ [super dealloc];
}
static inline void initializeTargetIfNeeded(WKObject *self)
@@ -52,184 +67,190 @@
self->_target = [self _web_createTarget];
}
-// MARK: Methods used by the Objective-C runtime
+- (BOOL)isEqual:(id)object
+{
+ if (object == self)
+ return YES;
-- (id)forwardingTargetForSelector:(SEL)selector
-{
+ if (!object)
+ return NO;
+
initializeTargetIfNeeded(self);
- return _target;
+ return [_target isEqual:object];
}
-- (BOOL)allowsWeakReference
+- (NSUInteger)hash
{
- return !_objc_rootIsDeallocating(self);
+ initializeTargetIfNeeded(self);
+
+ return _target ? [_target hash] : [super hash];
}
-- (BOOL)retainWeakReference
+- (BOOL)isKindOfClass:(Class)aClass
{
- return _objc_rootTryRetain(self);
+ initializeTargetIfNeeded(self);
+
+ return [_target isKindOfClass:aClass];
}
-// MARK: NSObject protocol implementation
-
-- (BOOL)isEqual:(id)object
+- (BOOL)isMemberOfClass:(Class)aClass
{
- if (object == self)
- return YES;
+ initializeTargetIfNeeded(self);
- if (!object)
- return NO;
+ return [_target isMemberOfClass:aClass];
+}
+- (BOOL)respondsToSelector:(SEL)selector
+{
initializeTargetIfNeeded(self);
- return [_target isEqual:object];
+ return [_target respondsToSelector:selector] || [super respondsToSelector:selector];
}
-- (NSUInteger)hash
+- (BOOL)conformsToProtocol:(Protocol *)protocol
{
initializeTargetIfNeeded(self);
- return _target ? [_target hash] : reinterpret_cast<NSUInteger>(self);
+ return [_target conformsToProtocol:protocol] || [super conformsToProtocol:protocol];
}
-- (Class)superclass
+- (id)forwardingTargetForSelector:(SEL)selector
{
initializeTargetIfNeeded(self);
- return _target ? [_target superclass] : class_getSuperclass(object_getClass(self));
+ return _target;
}
-- (Class)class
+- (NSString *)description
{
initializeTargetIfNeeded(self);
- return _target ? [_target class] : object_getClass(self);
+ return _target ? [_target description] : [super description];
}
-- (instancetype)self
+- (NSString *)debugDescription
{
- return self;
+ initializeTargetIfNeeded(self);
+
+ return _target ? [_target debugDescription] : [self description];
}
-- (id)performSelector:(SEL)selector
+- (Class)classForCoder
{
- return selector ? wtfObjcMsgSend<id>(self, selector) : nil;
+ initializeTargetIfNeeded(self);
+
+ return [_target classForCoder];
}
-- (id)performSelector:(SEL)selector withObject:(id)object
+- (Class)classForKeyedArchiver
{
- return selector ? wtfObjcMsgSend<id>(self, selector, object) : nil;
+ initializeTargetIfNeeded(self);
+
+ return [_target classForKeyedArchiver];
}
-- (id)performSelector:(SEL)selector withObject:(id)object1 withObject:(id)object2
+- (NSObject *)_web_createTarget
{
- return selector ? wtfObjcMsgSend<id>(self, selector, object1, object2) : nil;
+ return nil;
}
-- (BOOL)isProxy
+- (void)forwardInvocation:(NSInvocation *)invocation
{
- return NO;
+ initializeTargetIfNeeded(self);
+
+ [invocation invokeWithTarget:_target];
}
-- (BOOL)isKindOfClass:(Class)aClass
+- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
initializeTargetIfNeeded(self);
- return [_target isKindOfClass:aClass];
+ return [_target methodSignatureForSelector:sel];
}
-- (BOOL)isMemberOfClass:(Class)aClass
+- (BOOL)isNSObject__
{
initializeTargetIfNeeded(self);
- return [_target isMemberOfClass:aClass];
+ return [_target isNSObject__];
}
-- (BOOL)respondsToSelector:(SEL)selector
+- (BOOL)isNSArray__
{
initializeTargetIfNeeded(self);
- return [_target respondsToSelector:selector] || (selector && class_respondsToSelector(object_getClass(self), selector));
+ return [_target isNSArray__];
}
-+ (BOOL)conformsToProtocol:(Protocol *)protocol
+- (BOOL)isNSCFConstantString__
{
- if (!protocol)
- return NO;
+ initializeTargetIfNeeded(self);
- for (Class cls = self; cls; cls = class_getSuperclass(cls)) {
- if (class_conformsToProtocol(cls, protocol))
- return YES;
- }
-
- return NO;
+ return [_target isNSCFConstantString__];
}
-- (BOOL)conformsToProtocol:(Protocol *)protocol
+- (BOOL)isNSData__
{
initializeTargetIfNeeded(self);
- if ([_target conformsToProtocol:protocol])
- return YES;
+ return [_target isNSData__];
+}
- if (!protocol)
- return NO;
+- (BOOL)isNSDate__
+{
+ initializeTargetIfNeeded(self);
- for (Class cls = object_getClass(self); cls; cls = class_getSuperclass(cls)) {
- if (class_conformsToProtocol(cls, protocol))
- return YES;
- }
-
- return NO;
+ return [_target isNSDate__];
}
-- (NSString *)description
+- (BOOL)isNSDictionary__
{
initializeTargetIfNeeded(self);
- return _target ? [_target description] : [NSString stringWithFormat:@"<%s %p>", class_getName(object_getClass(self)), self];
+ return [_target isNSDictionary__];
}
-- (NSString *)debugDescription
+- (BOOL)isNSNumber__
{
initializeTargetIfNeeded(self);
- return _target ? [_target debugDescription] : [self description];
+ return [_target isNSNumber__];
}
-- (instancetype)retain
+- (BOOL)isNSOrderedSet__
{
- return _objc_rootRetain(self);
+ initializeTargetIfNeeded(self);
+
+ return [_target isNSOrderedSet__];
}
-- (oneway void)release
+- (BOOL)isNSSet__
{
- if (_objc_rootReleaseWasZero(self)) {
- static_cast<API::Object*>(object_getIndexedIvars(self))->~Object();
- [_target release];
- _objc_rootDealloc(self);
- }
+ initializeTargetIfNeeded(self);
+
+ return [_target isNSSet__];
}
-- (instancetype)autorelease
+- (BOOL)isNSString__
{
- return _objc_rootAutorelease(self);
+ initializeTargetIfNeeded(self);
+
+ return [_target isNSString__];
}
-- (NSUInteger)retainCount
+- (BOOL)isNSTimeZone__
{
- return _objc_rootRetainCount(self);
+ initializeTargetIfNeeded(self);
+
+ return [_target isNSTimeZone__];
}
-- (NSZone *)zone
+- (BOOL)isNSValue__
{
- return NSDefaultMallocZone();
-}
+ initializeTargetIfNeeded(self);
-- (NSObject *)_web_createTarget
-{
- return nil;
+ return [_target isNSValue__];
}
#pragma mark WKObject protocol implementation
Modified: branches/safari-604-branch/Tools/ChangeLog (219937 => 219938)
--- branches/safari-604-branch/Tools/ChangeLog 2017-07-26 09:52:30 UTC (rev 219937)
+++ branches/safari-604-branch/Tools/ChangeLog 2017-07-26 09:52:33 UTC (rev 219938)
@@ -1,5 +1,22 @@
2017-07-26 Jason Marcell <[email protected]>
+ Cherry-pick r219764. rdar://problem/33523878
+
+ 2017-07-22 Chris Dumez <[email protected]>
+
+ REGRESSION(r204565): WKObject is broken
+ https://bugs.webkit.org/show_bug.cgi?id=174736
+ <rdar://problem/33246169>
+
+ Reviewed by Dan Bernstein.
+
+ Add API test that used to crash.
+
+ * TestWebKitAPI/Tests/WebKit2Cocoa/WKObject.mm:
+ (TestWebKitAPI::TEST):
+
+2017-07-26 Jason Marcell <[email protected]>
+
Cherry-pick r219836. rdar://problem/33523818
2017-07-24 Wenson Hsieh <[email protected]>
Modified: branches/safari-604-branch/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WKObject.mm (219937 => 219938)
--- branches/safari-604-branch/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WKObject.mm 2017-07-26 09:52:30 UTC (rev 219937)
+++ branches/safari-604-branch/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WKObject.mm 2017-07-26 09:52:33 UTC (rev 219938)
@@ -31,6 +31,7 @@
#import <WebKit/WKString.h>
#import <objc/runtime.h>
+#import <wtf/RetainPtr.h>
namespace TestWebKitAPI {
@@ -57,6 +58,16 @@
ASSERT_TRUE([wkObjectClass conformsToProtocol:@protocol(NSObject)]);
}
+TEST(WebKit2, WKObject_classInDictionary)
+{
+ Class wkObjectClass = NSClassFromString(@"WKObject");
+ ASSERT_NE((Class)0, wkObjectClass);
+
+ auto map = adoptNS([[NSMapTable alloc] initWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableWeakMemory capacity:0]);
+ [map setObject:@"test" forKey:wkObjectClass];
+ ASSERT_TRUE([@"test" isEqualToString:(NSString *)[map objectForKey: wkObjectClass]]);
+}
+
} // namespace TestWebKitAPI
#endif