Title: [219938] branches/safari-604-branch

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
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to