Title: [283476] trunk
Revision
283476
Author
[email protected]
Date
2021-10-03 12:31:55 -0700 (Sun, 03 Oct 2021)

Log Message

WTF::RetainPtr<> allows assignment of two pointer types that are not assignable
<https://webkit.org/b/230406>
<rdar://problem/83241893>

Reviewed by Darin Adler.

Source/WebKit:

* Shared/API/Cocoa/WKRemoteObjectCoder.mm:
(transformTrustToData):
- Change return type to match object.
(encodeError):
- Use bridge_cast() to fix assignment.
(transformDataToTrust):
- Change return type to match object.
(decodeError):
- Use bridge_id_cast() to fix assignment.
* Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
(WebKit::RemoteLayerBackingStore::applyBackingStoreToLayer):
- Use bridge_id_cast() to fix assignment.

* UIProcess/mac/WebDataListSuggestionsDropdownMac.h:
- Use correct name of class that actually exists.

Source/WebKitLegacy/mac:

* Plugins/WebBasePluginPackage.mm:
(+[WebBasePluginPackage pluginWithPath:]):
- Use explicit type with RetainPtr<> to match return type.

Source/WTF:

* wtf/RetainPtr.h:
(WTF::RetainPtr::RetainPtr):
(WTF::RetainPtr::checkType): Add.
- Add type check for move constructor.

* wtf/cocoa/TypeCastsCocoa.h:
- Change #include to #import.
(WTF_CF_TO_NS_BRIDGE_TRANSFER): Add.
(WTF_CF_TO_NS_BRIDGE_TRANSFER): Add.
- Helper macros for bridge_cast() and bridge_id_cast().
(WTF_DECLARE_CF_NS_BRIDGE_CAST): Add.
- Macro used to define bridge_cast() functions for all known
  toll-free-bridged types.
(WTF::bridge_cast): Add.
- Helper macro for toll-free-bridge casting from a known CF type
  to and from their Objective-C NS type.  Prevents ref churn for
  rvale RetainPtr<> objects.
(WTF::bridge_id_cast): Add.
- Helper macro for casting from any CFTypeRef to id.  Prevents
  ref churn for rvalue RetainPtr<> objects.
(WTF::checked_objc_cast):
- Simplified to match dynamic_objc_cast<> implementation in
  RetainPtr.h.

* wtf/cocoa/VectorCocoa.h:
(WTF::createNSArray):
- Change return type to match object.

Tools:

* DumpRenderTree/mac/DumpRenderTree.mm:
(dump):
- Use bridge_cast() to fix assignment.
* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
- Add RetainPtrARC.mm and TypeCastsCocoaARC.mm to the project.
* TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoa.mm:
- Update for dual compilation with MRR and with ARC.  Change
  -retainCount methods to CFGetRetainCount().
- Add @autoreleasepool blocks around groups of tests to find
  over-released bugs sooner (for future changes).
- Add more CFGetRetainCount() to catch unexpected auto-released
  objects as well as leaks.
(TestWebKitAPI::helloWorldCStringLength): Add.
(TestWebKitAPI::TEST):
- Add tests for bridge_cast() and bridge_id_cast().
- Remove invalid tests after changing RetainPtr<> move
  constructor to check types.
* TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoaARC.mm: Add.
- Run tests in TypeCastsCocoa.mm with ARC enabled.
* TestWebKitAPI/Tests/WTF/ns/RetainPtr.mm:
(TestWebKitAPI::TEST):
- Update for dual compilation with MRR and with ARC.  Change
  -retainCount methods to CFGetRetainCount().
- Make it possible to name tests differently for MRR vs. ARC
  using RETAIN_PTR_TEST_NAME macro.
* TestWebKitAPI/Tests/WTF/ns/RetainPtrARC.mm: Add.
- Run tests in RetainPtr.mm with ARC enabled.
* TestWebKitAPI/Tests/WebKitCocoa/QuickLook.mm:
(readFile):
- Use bridge_cast() to fix assignment.
- Drive-by fix to keep NSData out of autoreleasePool.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (283475 => 283476)


--- trunk/Source/WTF/ChangeLog	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Source/WTF/ChangeLog	2021-10-03 19:31:55 UTC (rev 283476)
@@ -1,3 +1,39 @@
+2021-10-03  David Kilzer  <[email protected]>
+
+        WTF::RetainPtr<> allows assignment of two pointer types that are not assignable
+        <https://webkit.org/b/230406>
+        <rdar://problem/83241893>
+
+        Reviewed by Darin Adler.
+
+        * wtf/RetainPtr.h:
+        (WTF::RetainPtr::RetainPtr):
+        (WTF::RetainPtr::checkType): Add.
+        - Add type check for move constructor.
+
+        * wtf/cocoa/TypeCastsCocoa.h:
+        - Change #include to #import.
+        (WTF_CF_TO_NS_BRIDGE_TRANSFER): Add.
+        (WTF_CF_TO_NS_BRIDGE_TRANSFER): Add.
+        - Helper macros for bridge_cast() and bridge_id_cast().
+        (WTF_DECLARE_CF_NS_BRIDGE_CAST): Add.
+        - Macro used to define bridge_cast() functions for all known
+          toll-free-bridged types.
+        (WTF::bridge_cast): Add.
+        - Helper macro for toll-free-bridge casting from a known CF type
+          to and from their Objective-C NS type.  Prevents ref churn for
+          rvale RetainPtr<> objects.
+        (WTF::bridge_id_cast): Add.
+        - Helper macro for casting from any CFTypeRef to id.  Prevents
+          ref churn for rvalue RetainPtr<> objects.
+        (WTF::checked_objc_cast):
+        - Simplified to match dynamic_objc_cast<> implementation in
+          RetainPtr.h.
+
+        * wtf/cocoa/VectorCocoa.h:
+        (WTF::createNSArray):
+        - Change return type to match object.
+
 2021-10-03  Basuke Suzuki  <[email protected]>
 
         Enable release log to stderr

Modified: trunk/Source/WTF/wtf/RetainPtr.h (283475 => 283476)


--- trunk/Source/WTF/wtf/RetainPtr.h	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Source/WTF/wtf/RetainPtr.h	2021-10-03 19:31:55 UTC (rev 283476)
@@ -90,7 +90,7 @@
     template<typename U> RetainPtr(const RetainPtr<U>&);
 
     constexpr RetainPtr(RetainPtr&& o) : m_ptr(toStorageType(o.leakRef())) { }
-    template<typename U> constexpr RetainPtr(RetainPtr<U>&& o) : m_ptr(toStorageType(o.leakRef())) { }
+    template<typename U> constexpr RetainPtr(RetainPtr<U>&& o) : m_ptr(toStorageType(checkType(o.leakRef()))) { }
 
     // Hash table deleted values, which are only constructed and never copied or destroyed.
     constexpr RetainPtr(HashTableDeletedValueType) : m_ptr(hashTableDeletedValue()) { }
@@ -138,6 +138,8 @@
     enum AdoptTag { Adopt };
     constexpr RetainPtr(PtrType ptr, AdoptTag) : m_ptr(toStorageType(ptr)) { }
 
+    static constexpr PtrType checkType(PtrType ptr) { return ptr; }
+
     static constexpr PtrType hashTableDeletedValue() { return reinterpret_cast<PtrType>(-1); }
 
 #ifdef __OBJC__

Modified: trunk/Source/WTF/wtf/cocoa/TypeCastsCocoa.h (283475 => 283476)


--- trunk/Source/WTF/wtf/cocoa/TypeCastsCocoa.h	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Source/WTF/wtf/cocoa/TypeCastsCocoa.h	2021-10-03 19:31:55 UTC (rev 283476)
@@ -25,24 +25,97 @@
 
 #pragma once
 
-#include <wtf/Assertions.h>
-#include <wtf/RetainPtr.h>
+#import <wtf/Assertions.h>
+#import <wtf/RetainPtr.h>
 
 namespace WTF {
 
+// Use bridge_cast() to convert between CF <-> NS types without ref churn.
+
+#if __has_feature(objc_arc)
+#define WTF_CF_TO_NS_BRIDGE_TRANSFER(type, value) ((__bridge_transfer type)value)
+#define WTF_NS_TO_CF_BRIDGE_TRANSFER(type, value) ((type)reinterpret_cast<uintptr_t>(value))
+#else
+#define WTF_CF_TO_NS_BRIDGE_TRANSFER(type, value) ((__bridge type)value)
+#define WTF_NS_TO_CF_BRIDGE_TRANSFER(type, value) ((__bridge type)value)
+#endif
+
+#define WTF_DECLARE_CF_NS_BRIDGE_CAST(CFClassName, NSClassName) \
+inline CFClassName##Ref bridge_cast(NSClassName *object) \
+{ \
+    return (__bridge CFClassName##Ref)object; \
+} \
+inline RetainPtr<CFClassName##Ref> bridge_cast(RetainPtr<NSClassName>&& object) \
+{ \
+    return adoptCF(WTF_NS_TO_CF_BRIDGE_TRANSFER(CFClassName##Ref, object.leakRef())); \
+} \
+inline NSClassName *bridge_cast(CFClassName##Ref object) \
+{ \
+    return (__bridge NSClassName *)object; \
+} \
+inline RetainPtr<NSClassName> bridge_cast(RetainPtr<CFClassName##Ref>&& object) \
+{ \
+    return adoptNS(WTF_CF_TO_NS_BRIDGE_TRANSFER(NSClassName *, object.leakRef())); \
+}
+
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFArray, NSArray)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFAttributedString, NSAttributedString)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFCharacterSet, NSCharacterSet)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFData, NSData)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFDate, NSDate)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFDictionary, NSDictionary)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFError, NSError)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFFileSecurity, NSFileSecurity)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFLocale, NSLocale)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFNull, NSNull)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFNumber, NSNumber)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFSet, NSSet)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFString, NSString)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFTimeZone, NSTimeZone)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFURL, NSURL)
+
+inline NSNumber *bridge_cast(CFBooleanRef object)
+{
+    return (__bridge NSNumber *)object;
+}
+inline RetainPtr<NSNumber> bridge_cast(RetainPtr<CFBooleanRef>&& object)
+{
+    return adoptNS(WTF_CF_TO_NS_BRIDGE_TRANSFER(NSNumber *, object.leakRef()));
+}
+
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableArray, NSMutableArray)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableAttributedString, NSMutableAttributedString)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableData, NSMutableData)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableDictionary, NSMutableDictionary)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableSet, NSMutableSet)
+WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableString, NSMutableString)
+
+// Use bridge_id_cast to convert from CF -> id without ref churn.
+
+inline id bridge_id_cast(CFTypeRef object)
+{
+    return (__bridge id)object;
+}
+
+inline RetainPtr<id> bridge_id_cast(RetainPtr<CFTypeRef>&& object)
+{
+    return adoptNS(WTF_CF_TO_NS_BRIDGE_TRANSFER(id, object.leakRef()));
+}
+
+#undef WTF_DECLARE_CF_NS_BRIDGE_CAST
+#undef WTF_NS_TO_CF_BRIDGE_TRANSFER
+#undef WTF_CF_TO_NS_BRIDGE_TRANSFER
+
 // Use checked_objc_cast<> instead of dynamic_objc_cast<> when a specific NS type is required.
 
 template<typename T> T* checked_objc_cast(id object)
 {
-    using ValueType = std::remove_pointer_t<T>;
-    using PtrType = ValueType*;
-
     if (!object)
         return nullptr;
 
-    RELEASE_ASSERT_WITH_SECURITY_IMPLICATION([object isKindOfClass:[ValueType class]]);
+    RELEASE_ASSERT_WITH_SECURITY_IMPLICATION([object isKindOfClass:[T class]]);
 
-    return reinterpret_cast<PtrType>(object);
+    return reinterpret_cast<T*>(object);
 }
 
 // Use dynamic_objc_cast<> instead of checked_objc_cast<> when actively checking NS types,
@@ -60,4 +133,6 @@
 
 } // namespace WTF
 
+using WTF::bridge_cast;
+using WTF::bridge_id_cast;
 using WTF::checked_objc_cast;

Modified: trunk/Source/WTF/wtf/cocoa/VectorCocoa.h (283475 => 283476)


--- trunk/Source/WTF/wtf/cocoa/VectorCocoa.h	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Source/WTF/wtf/cocoa/VectorCocoa.h	2021-10-03 19:31:55 UTC (rev 283476)
@@ -47,13 +47,13 @@
 //
 //    std::optional<VectorElementType> makeVectorElement(const VectorElementType*, id arrayElement);
 
-template<typename CollectionType> RetainPtr<NSArray> createNSArray(CollectionType&&);
+template<typename CollectionType> RetainPtr<NSMutableArray> createNSArray(CollectionType&&);
 template<typename VectorElementType> Vector<VectorElementType> makeVector(NSArray *);
 
 // This overload of createNSArray takes a function to map each vector element to an Objective-C object.
 // The map function has the same interface as the makeNSArrayElement function above, but can be any
 // function including a lambda, a function-like object, or Function<>.
-template<typename CollectionType, typename MapFunctionType> RetainPtr<NSArray> createNSArray(CollectionType&&, MapFunctionType&&);
+template<typename CollectionType, typename MapFunctionType> RetainPtr<NSMutableArray> createNSArray(CollectionType&&, MapFunctionType&&);
 
 // This overload of makeVector takes a function to map each Objective-C object to a vector element.
 // Currently, the map function needs to return an Optional.
@@ -67,7 +67,7 @@
         [array addObject:value];
 }
 
-template<typename CollectionType> RetainPtr<NSArray> createNSArray(CollectionType&& collection)
+template<typename CollectionType> RetainPtr<NSMutableArray> createNSArray(CollectionType&& collection)
 {
     auto array = adoptNS([[NSMutableArray alloc] initWithCapacity:std::size(collection)]);
     for (auto&& element : collection)
@@ -75,7 +75,7 @@
     return array;
 }
 
-template<typename CollectionType, typename MapFunctionType> RetainPtr<NSArray> createNSArray(CollectionType&& collection, MapFunctionType&& function)
+template<typename CollectionType, typename MapFunctionType> RetainPtr<NSMutableArray> createNSArray(CollectionType&& collection, MapFunctionType&& function)
 {
     auto array = adoptNS([[NSMutableArray alloc] initWithCapacity:std::size(collection)]);
     for (auto&& element : collection)

Modified: trunk/Source/WebKit/ChangeLog (283475 => 283476)


--- trunk/Source/WebKit/ChangeLog	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Source/WebKit/ChangeLog	2021-10-03 19:31:55 UTC (rev 283476)
@@ -1,3 +1,27 @@
+2021-10-03  David Kilzer  <[email protected]>
+
+        WTF::RetainPtr<> allows assignment of two pointer types that are not assignable
+        <https://webkit.org/b/230406>
+        <rdar://problem/83241893>
+
+        Reviewed by Darin Adler.
+
+        * Shared/API/Cocoa/WKRemoteObjectCoder.mm:
+        (transformTrustToData):
+        - Change return type to match object.
+        (encodeError):
+        - Use bridge_cast() to fix assignment.
+        (transformDataToTrust):
+        - Change return type to match object.
+        (decodeError):
+        - Use bridge_id_cast() to fix assignment.
+        * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm:
+        (WebKit::RemoteLayerBackingStore::applyBackingStoreToLayer):
+        - Use bridge_id_cast() to fix assignment.
+
+        * UIProcess/mac/WebDataListSuggestionsDropdownMac.h:
+        - Use correct name of class that actually exists.
+
 2021-10-03  Simon Fraser  <[email protected]>
 
         WebCore::Length incorrectly uses memcpy() for copy constructors/operator and IPC encoding/decoding

Modified: trunk/Source/WebKit/Shared/API/Cocoa/WKRemoteObjectCoder.mm (283475 => 283476)


--- trunk/Source/WebKit/Shared/API/Cocoa/WKRemoteObjectCoder.mm	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Source/WebKit/Shared/API/Cocoa/WKRemoteObjectCoder.mm	2021-10-03 19:31:55 UTC (rev 283476)
@@ -39,6 +39,7 @@
 #import <wtf/RetainPtr.h>
 #import <wtf/Scope.h>
 #import <wtf/SetForScope.h>
+#import <wtf/cocoa/TypeCastsCocoa.h>
 #import <wtf/text/CString.h>
 
 static const char* const classNameKey = "$class";
@@ -332,7 +333,7 @@
     return dataArray;
 }
 
-static RetainPtr<NSData> transformTrustToData(SecTrustRef trust)
+static RetainPtr<CFDataRef> transformTrustToData(SecTrustRef trust)
 {
     if (CFGetTypeID(trust) != SecTrustGetTypeID())
         [NSException raise:NSInvalidArgumentException format:@"Error encoding invalid SecTrustRef"];
@@ -363,7 +364,7 @@
     if (id trust = error.userInfo[peerTrustKey]) {
         if (!copy)
             copy = adoptNS([error.userInfo mutableCopy]);
-        copy.get()[peerTrustKey] = transformTrustToData((SecTrustRef)trust).get();
+        copy.get()[peerTrustKey] = bridge_cast(transformTrustToData((SecTrustRef)trust).get());
     }
     if (!copy)
         [error encodeWithCoder:encoder];
@@ -385,7 +386,7 @@
     return array;
 }
 
-static RetainPtr<id> transformDataToTrust(NSData *data)
+static RetainPtr<SecTrustRef> transformDataToTrust(NSData *data)
 {
     if (CFGetTypeID(data) != CFDataGetTypeID())
         [NSException raise:NSInvalidUnarchiveOperationException format:@"Invalid SecTrustRef data %@", NSStringFromClass([data class])];
@@ -407,7 +408,7 @@
     if (NSData *trust = error.get().userInfo[peerTrustKey]) {
         if (!copy)
             copy = adoptNS([error.get().userInfo mutableCopy]);
-        copy.get()[peerTrustKey] = transformDataToTrust(trust).get();
+        copy.get()[peerTrustKey] = bridge_id_cast(transformDataToTrust(trust).get());
     }
     if (!copy)
         return error;

Modified: trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm (283475 => 283476)


--- trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm	2021-10-03 19:31:55 UTC (rev 283476)
@@ -47,6 +47,7 @@
 #import <WebCore/WebLayer.h>
 #import <mach/mach_port.h>
 #import <pal/spi/cocoa/QuartzCoreSPI.h>
+#import <wtf/cocoa/TypeCastsCocoa.h>
 
 #if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
 #import <WebKitAdditions/CGDisplayListImageBufferAdditions.h>
@@ -432,8 +433,7 @@
     WTF::switchOn(*m_bufferHandle,
         [&] (ShareableBitmap::Handle& handle) {
             ASSERT(m_type == Type::Bitmap);
-            auto bitmap = ShareableBitmap::create(handle);
-            contents = bitmap->makeCGImageCopy();
+            contents = bridge_id_cast(ShareableBitmap::create(handle)->makeCGImageCopy());
         },
         [&] (MachSendRight& machSendRight) {
             ASSERT(m_type == Type::IOSurface);
@@ -444,7 +444,7 @@
                 break;
             }
             case RemoteLayerBackingStore::LayerContentsType::CAMachPort:
-                contents = adoptCF(CAMachPortCreate(machSendRight.leakSendRight()));
+                contents = bridge_id_cast(adoptCF(CAMachPortCreate(machSendRight.leakSendRight())));
                 break;
             }
         }

Modified: trunk/Source/WebKit/UIProcess/mac/WebDataListSuggestionsDropdownMac.h (283475 => 283476)


--- trunk/Source/WebKit/UIProcess/mac/WebDataListSuggestionsDropdownMac.h	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Source/WebKit/UIProcess/mac/WebDataListSuggestionsDropdownMac.h	2021-10-03 19:31:55 UTC (rev 283476)
@@ -30,7 +30,7 @@
 #import "WebDataListSuggestionsDropdown.h"
 #import <wtf/RetainPtr.h>
 
-OBJC_CLASS WKDataListSuggestionsView;
+OBJC_CLASS WKDataListSuggestionsController;
 
 namespace WebKit {
 
@@ -51,7 +51,7 @@
     void selectOption();
 
     NSView *m_view;
-    RetainPtr<WKDataListSuggestionsView> m_dropdownUI;
+    RetainPtr<WKDataListSuggestionsController> m_dropdownUI;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKitLegacy/mac/ChangeLog (283475 => 283476)


--- trunk/Source/WebKitLegacy/mac/ChangeLog	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Source/WebKitLegacy/mac/ChangeLog	2021-10-03 19:31:55 UTC (rev 283476)
@@ -1,3 +1,15 @@
+2021-10-03  David Kilzer  <[email protected]>
+
+        WTF::RetainPtr<> allows assignment of two pointer types that are not assignable
+        <https://webkit.org/b/230406>
+        <rdar://problem/83241893>
+
+        Reviewed by Darin Adler.
+
+        * Plugins/WebBasePluginPackage.mm:
+        (+[WebBasePluginPackage pluginWithPath:]):
+        - Use explicit type with RetainPtr<> to match return type.
+
 2021-10-01  Chris Dumez  <[email protected]>
 
         Drop support for macOS < 10.15

Modified: trunk/Source/WebKitLegacy/mac/Plugins/WebBasePluginPackage.mm (283475 => 283476)


--- trunk/Source/WebKitLegacy/mac/Plugins/WebBasePluginPackage.mm	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Source/WebKitLegacy/mac/Plugins/WebBasePluginPackage.mm	2021-10-03 19:31:55 UTC (rev 283476)
@@ -67,8 +67,7 @@
 
 + (WebBasePluginPackage *)pluginWithPath:(NSString *)pluginPath
 {
-    
-    auto pluginPackage = adoptNS([[WebPluginPackage alloc] initWithPath:pluginPath]);
+    RetainPtr<WebBasePluginPackage> pluginPackage = adoptNS([[WebPluginPackage alloc] initWithPath:pluginPath]);
 
     if (!pluginPackage) {
 #if ENABLE(NETSCAPE_PLUGIN_API)

Modified: trunk/Tools/ChangeLog (283475 => 283476)


--- trunk/Tools/ChangeLog	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Tools/ChangeLog	2021-10-03 19:31:55 UTC (rev 283476)
@@ -1,3 +1,43 @@
+2021-10-03  David Kilzer  <[email protected]>
+
+        WTF::RetainPtr<> allows assignment of two pointer types that are not assignable
+        <https://webkit.org/b/230406>
+        <rdar://problem/83241893>
+
+        Reviewed by Darin Adler.
+
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (dump):
+        - Use bridge_cast() to fix assignment.
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        - Add RetainPtrARC.mm and TypeCastsCocoaARC.mm to the project.
+        * TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoa.mm:
+        - Update for dual compilation with MRR and with ARC.  Change
+          -retainCount methods to CFGetRetainCount().
+        - Add @autoreleasepool blocks around groups of tests to find
+          over-released bugs sooner (for future changes).
+        - Add more CFGetRetainCount() to catch unexpected auto-released
+          objects as well as leaks.
+        (TestWebKitAPI::helloWorldCStringLength): Add.
+        (TestWebKitAPI::TEST):
+        - Add tests for bridge_cast() and bridge_id_cast().
+        - Remove invalid tests after changing RetainPtr<> move
+          constructor to check types.
+        * TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoaARC.mm: Add.
+        - Run tests in TypeCastsCocoa.mm with ARC enabled.
+        * TestWebKitAPI/Tests/WTF/ns/RetainPtr.mm:
+        (TestWebKitAPI::TEST):
+        - Update for dual compilation with MRR and with ARC.  Change
+          -retainCount methods to CFGetRetainCount().
+        - Make it possible to name tests differently for MRR vs. ARC
+          using RETAIN_PTR_TEST_NAME macro.
+        * TestWebKitAPI/Tests/WTF/ns/RetainPtrARC.mm: Add.
+        - Run tests in RetainPtr.mm with ARC enabled.
+        * TestWebKitAPI/Tests/WebKitCocoa/QuickLook.mm:
+        (readFile):
+        - Use bridge_cast() to fix assignment.
+        - Drive-by fix to keep NSData out of autoreleasePool.
+
 2021-10-03  Myles C. Maxfield  <[email protected]>
 
         Some layout tests with Japanese glyphs fail if Japanese is included in the system "Preferred Languages" settings

Modified: trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm (283475 => 283476)


--- trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm	2021-10-03 19:31:55 UTC (rev 283476)
@@ -107,6 +107,7 @@
 #import <wtf/UniqueArray.h>
 #import <wtf/WorkQueue.h>
 #import <wtf/cocoa/CrashReporter.h>
+#import <wtf/cocoa/TypeCastsCocoa.h>
 #import <wtf/cocoa/VectorCocoa.h>
 #import <wtf/text/StringBuilder.h>
 #import <wtf/text/WTFString.h>
@@ -1620,11 +1621,11 @@
             resultMimeType = @"application/pdf";
         } else if (gTestRunner->dumpDOMAsWebArchive()) {
             WebArchive *webArchive = [[mainFrame DOMDocument] webArchive];
-            resultString = WebCoreTestSupport::createXMLStringFromWebArchiveData((__bridge CFDataRef)[webArchive data]);
+            resultString = bridge_cast(WebCoreTestSupport::createXMLStringFromWebArchiveData(bridge_cast([webArchive data])));
             resultMimeType = @"application/x-webarchive";
         } else if (gTestRunner->dumpSourceAsWebArchive()) {
             WebArchive *webArchive = [[mainFrame dataSource] webArchive];
-            resultString = WebCoreTestSupport::createXMLStringFromWebArchiveData((__bridge CFDataRef)[webArchive data]);
+            resultString = bridge_cast(WebCoreTestSupport::createXMLStringFromWebArchiveData(bridge_cast([webArchive data])));
             resultMimeType = @"application/x-webarchive";
         } else if (gTestRunner->isPrinting())
             resultString = [mainFrame renderTreeAsExternalRepresentationForPrinting];

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (283475 => 283476)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2021-10-03 19:31:55 UTC (rev 283476)
@@ -262,6 +262,7 @@
 		41E67A8525D16E83007B0A4C /* STUNMessageParsingTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41E67A8425D16E83007B0A4C /* STUNMessageParsingTest.cpp */; };
 		44077BB123144B5000179E2D /* DataDetectorsTestIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44077BB0231449D200179E2D /* DataDetectorsTestIOS.mm */; };
 		4433A396208044140091ED57 /* SynchronousTimeoutTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4433A395208044130091ED57 /* SynchronousTimeoutTests.mm */; };
+		44652CB726FCD405005EC272 /* TypeCastsCocoaARC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44652CB626FCD405005EC272 /* TypeCastsCocoaARC.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
 		448110C2253F40300097FC33 /* WebPreferencesTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 448110C1253F40240097FC33 /* WebPreferencesTest.mm */; };
 		44817A2F1F0486BF00003810 /* WKRequestActivatedElementInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44817A2E1F0486BF00003810 /* WKRequestActivatedElementInfo.mm */; };
 		448D7E471EA6C55500ECC756 /* EnvironmentUtilitiesTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 448D7E451EA6C55500ECC756 /* EnvironmentUtilitiesTest.cpp */; };
@@ -269,6 +270,7 @@
 		44C2FBE225E7592C00ABC72F /* WKAppHighlights.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44C2FBE125E7592C00ABC72F /* WKAppHighlights.mm */; };
 		44CDE4D426EE6E4A009F6ACB /* TypeCastsCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44CDE4D326EE6E41009F6ACB /* TypeCastsCocoa.mm */; };
 		44CF31FD249941E8009CB6CB /* ContextMenuAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 44CF31FB24993F66009CB6CB /* ContextMenuAction.cpp */; };
+		44D5008E26FE9ED6000EB12F /* RetainPtrARC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44D5008D26FE9ED6000EB12F /* RetainPtrARC.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
 		4612C2B9210A6ACE00B788A6 /* LoadFileThenReload.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4612C2B8210A6ABF00B788A6 /* LoadFileThenReload.mm */; };
 		4628C8E92367ABD100B073F0 /* WKSecurityOrigin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4628C8E82367ABBC00B073F0 /* WKSecurityOrigin.cpp */; };
 		46397B951DC2C850009A78AE /* DOMNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 46397B941DC2C850009A78AE /* DOMNode.mm */; };
@@ -2098,6 +2100,7 @@
 		44077BB0231449D200179E2D /* DataDetectorsTestIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DataDetectorsTestIOS.mm; sourceTree = "<group>"; };
 		442BBF681C91CAD90017087F /* RefLogger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RefLogger.cpp; sourceTree = "<group>"; };
 		4433A395208044130091ED57 /* SynchronousTimeoutTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SynchronousTimeoutTests.mm; sourceTree = "<group>"; };
+		44652CB626FCD405005EC272 /* TypeCastsCocoaARC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TypeCastsCocoaARC.mm; sourceTree = "<group>"; };
 		448110C1253F40240097FC33 /* WebPreferencesTest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = WebPreferencesTest.mm; sourceTree = "<group>"; };
 		44817A2E1F0486BF00003810 /* WKRequestActivatedElementInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKRequestActivatedElementInfo.mm; sourceTree = "<group>"; };
 		448D7E451EA6C55500ECC756 /* EnvironmentUtilitiesTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EnvironmentUtilitiesTest.cpp; sourceTree = "<group>"; };
@@ -2105,6 +2108,7 @@
 		44C2FBE125E7592C00ABC72F /* WKAppHighlights.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKAppHighlights.mm; sourceTree = "<group>"; };
 		44CDE4D326EE6E41009F6ACB /* TypeCastsCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TypeCastsCocoa.mm; sourceTree = "<group>"; };
 		44CF31FB24993F66009CB6CB /* ContextMenuAction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContextMenuAction.cpp; sourceTree = "<group>"; };
+		44D5008D26FE9ED6000EB12F /* RetainPtrARC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RetainPtrARC.mm; path = ns/RetainPtrARC.mm; sourceTree = "<group>"; };
 		4612C2B8210A6ABF00B788A6 /* LoadFileThenReload.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LoadFileThenReload.mm; sourceTree = "<group>"; };
 		4628C8E82367ABBC00B073F0 /* WKSecurityOrigin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKSecurityOrigin.cpp; sourceTree = "<group>"; };
 		46397B941DC2C850009A78AE /* DOMNode.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DOMNode.mm; sourceTree = "<group>"; };
@@ -4284,6 +4288,7 @@
 			children = (
 				1ADAD14E1D77A9F600212586 /* BlockPtr.mm */,
 				BC029B1B1486B25900817DA9 /* RetainPtr.mm */,
+				44D5008D26FE9ED6000EB12F /* RetainPtrARC.mm */,
 			);
 			name = ns;
 			sourceTree = "<group>";
@@ -4998,6 +5003,7 @@
 				1C4616A626BB172F00F8C9F6 /* TextStreamCocoa.cpp */,
 				1C46169E26BA510700F8C9F6 /* TextStreamCocoa.mm */,
 				44CDE4D326EE6E41009F6ACB /* TypeCastsCocoa.mm */,
+				44652CB626FCD405005EC272 /* TypeCastsCocoaARC.mm */,
 				E3C21A7B21B25CA2003B31A3 /* URLExtras.mm */,
 			);
 			path = cocoa;
@@ -5316,6 +5322,7 @@
 				7C83DF161D0A590C00FEBCF3 /* RefPtr.cpp in Sources */,
 				44AC8BC621D0245A00CAFB34 /* RetainPtr.cpp in Sources */,
 				7C83DF241D0A590C00FEBCF3 /* RetainPtr.mm in Sources */,
+				44D5008E26FE9ED6000EB12F /* RetainPtrARC.mm in Sources */,
 				E355A6322615718F001C1129 /* RobinHoodHashMap.cpp in Sources */,
 				E355A63026157174001C1129 /* RobinHoodHashSet.cpp in Sources */,
 				7C83DF051D0A590C00FEBCF3 /* RunLoop.cpp in Sources */,
@@ -5348,6 +5355,7 @@
 				5311BD5E1EA9490E00525281 /* ThreadMessages.cpp in Sources */,
 				0F2C20B81DCD545000542D9E /* Time.cpp in Sources */,
 				44CDE4D426EE6E4A009F6ACB /* TypeCastsCocoa.mm in Sources */,
+				44652CB726FCD405005EC272 /* TypeCastsCocoaARC.mm in Sources */,
 				E324A6F02041C82000A76593 /* UniqueArray.cpp in Sources */,
 				E3A1E78221B25B7A008C6007 /* URL.cpp in Sources */,
 				E3C21A7C21B25CA2003B31A3 /* URLExtras.mm in Sources */,

Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoa.mm (283475 => 283476)


--- trunk/Tools/TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoa.mm	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoa.mm	2021-10-03 19:31:55 UTC (rev 283476)
@@ -27,6 +27,10 @@
 
 #import <wtf/StdLibExtras.h>
 
+#if __has_feature(objc_arc) && !defined(TypeCastsCocoa)
+#error This tests TypeCastsCocoa.h with ARC disabled.
+#endif
+
 @interface MyObjectSubtype : NSObject
 @end
 
@@ -37,24 +41,98 @@
 
 using namespace WTF;
 
+static const char* helloWorldCString = "Hello world";
+static size_t helloWorldCStringLength()
+{
+    static auto length = strlen(helloWorldCString);
+    return length;
+}
+
+TEST(TypeCastsCocoa, bridge_cast)
+{
+    @autoreleasepool {
+        auto objectNS = adoptNS([[NSString alloc] initWithFormat:@"%s", helloWorldCString]);
+        auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get());
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr));
+
+        auto objectCF = bridge_cast(WTFMove(objectNS));
+        auto objectCFPtr = reinterpret_cast<uintptr_t>(objectCF.get());
+        EXPECT_EQ(nil, objectNS.get());
+        EXPECT_EQ(objectNSPtr, objectCFPtr);
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCFPtr));
+
+        objectNS = bridge_cast(WTFMove(objectCF));
+        objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get());
+        EXPECT_EQ(NULL, objectCF.get());
+        EXPECT_EQ(objectCFPtr, objectNSPtr);
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr));
+    }
+
+    @autoreleasepool {
+        auto objectCF = adoptCF(CFStringCreateWithBytes(NULL, (const UInt8*)helloWorldCString, helloWorldCStringLength(), kCFStringEncodingUTF8, false));
+        auto objectCFPtr = reinterpret_cast<uintptr_t>(objectCF.get());
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCFPtr));
+
+        auto objectNS = bridge_cast(WTFMove(objectCF));
+        auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get());
+        EXPECT_EQ(NULL, objectCF.get());
+        EXPECT_EQ(objectCFPtr, objectNSPtr);
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr));
+
+        objectCF = bridge_cast(WTFMove(objectNS));
+        objectCFPtr = reinterpret_cast<uintptr_t>(objectCF.get());
+        EXPECT_EQ(nil, objectNS.get());
+        EXPECT_EQ(objectNSPtr, objectCFPtr);
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCFPtr));
+    }
+}
+
+TEST(TypeCastsCocoa, bridge_id_cast)
+{
+    @autoreleasepool {
+        RetainPtr<CFTypeRef> objectCF;
+        auto objectID = bridge_id_cast(WTFMove(objectCF));
+        EXPECT_EQ(NULL, objectCF.get());
+        EXPECT_EQ(nil, objectID.get());
+    }
+
+    @autoreleasepool {
+        auto objectCF = adoptCF(CFStringCreateWithBytes(NULL, (const UInt8*)helloWorldCString, helloWorldCStringLength(), kCFStringEncodingUTF8, false));
+        auto objectCFPtr = reinterpret_cast<uintptr_t>(objectCF.get());
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCFPtr));
+
+        auto objectID = bridge_id_cast(WTFMove(objectCF));
+        auto objectIDPtr = reinterpret_cast<uintptr_t>(objectID.get());
+        EXPECT_EQ(NULL, objectCF.get());
+        EXPECT_EQ(objectCFPtr, objectIDPtr);
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectIDPtr));
+    }
+}
+
 TEST(TypeCastsCocoa, checked_objc_cast)
 {
     EXPECT_EQ(nil, checked_objc_cast<NSString>(nil));
 
-    {
-        auto object = adoptNS(reinterpret_cast<id>([[NSString alloc] initWithFormat:@"%s", "Hello world"]));
-        EXPECT_EQ(object.get(), checked_objc_cast<NSString>(object.get()));
-        EXPECT_EQ(object.get(), checked_objc_cast<NSObject>(object.get()));
+    @autoreleasepool {
+        auto objectNS = adoptNS((id)[[NSString alloc] initWithFormat:@"%s", helloWorldCString]);
+        auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get());
+        EXPECT_EQ(objectNS.get(), checked_objc_cast<NSString>((__bridge id)(CFTypeRef)objectNSPtr));
+        EXPECT_EQ(objectNS.get(), checked_objc_cast<NSObject>((__bridge id)(CFTypeRef)objectNSPtr));
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr));
     }
 
-    {
-        auto object = adoptNS(reinterpret_cast<NSObject *>([[NSString alloc] initWithFormat:@"%s", "Hello world"]));
-        EXPECT_EQ(object.get(), checked_objc_cast<NSString>(object.get()));
+    @autoreleasepool {
+        auto objectNS = adoptNS((NSObject *)[[NSString alloc] initWithFormat:@"%s", helloWorldCString]);
+        auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get());
+        EXPECT_EQ(objectNS.get(), checked_objc_cast<NSString>((__bridge NSObject *)(CFTypeRef)objectNSPtr));
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr));
     }
 
-    {
-        auto object = adoptNS([[NSString alloc] initWithFormat:@"%s", "Hello world"]);
-        EXPECT_EQ(object.get(), checked_objc_cast<NSObject>(object.get()));
+    @autoreleasepool {
+        auto objectNS = adoptNS([[NSString alloc] initWithFormat:@"%s", helloWorldCString]);
+        auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get());
+        EXPECT_EQ(objectNS.get(), checked_objc_cast<NSObject>((__bridge NSString *)(CFTypeRef)objectNSPtr));
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr));
     }
 }
 
@@ -62,40 +140,50 @@
 {
     EXPECT_EQ(nil, dynamic_objc_cast<NSString>(nil));
 
-    {
-        auto object = adoptNS(reinterpret_cast<id>([[NSString alloc] initWithFormat:@"%s", "Hello world"]));
-        EXPECT_EQ(object.get(), dynamic_objc_cast<NSString>(object.get()));
-        EXPECT_EQ(object.get(), dynamic_objc_cast<NSObject>(object.get()));
-        EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(object.get()));
+    @autoreleasepool {
+        auto objectNS = adoptNS<id>([[NSString alloc] initWithFormat:@"%s", helloWorldCString]);
+        auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get());
+        EXPECT_EQ(objectNS.get(), dynamic_objc_cast<NSString>(objectNS.get()));
+        EXPECT_EQ(objectNS.get(), dynamic_objc_cast<NSObject>(objectNS.get()));
+        EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(objectNS.get()));
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr));
     }
 
-    {
-        auto object = adoptNS(reinterpret_cast<NSObject *>([[NSString alloc] initWithFormat:@"%s", "Hello world"]));
-        EXPECT_EQ(object.get(), dynamic_objc_cast<NSString>(object.get()));
-        EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(object.get()));
+    @autoreleasepool {
+        auto objectNS = adoptNS<NSObject *>([[NSString alloc] initWithFormat:@"%s", helloWorldCString]);
+        auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get());
+        EXPECT_EQ(objectNS.get(), dynamic_objc_cast<NSString>(objectNS.get()));
+        EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(objectNS.get()));
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr));
     }
 
-    {
-        auto object = adoptNS([[NSString alloc] initWithFormat:@"%s", "Hello world"]);
-        EXPECT_EQ(object.get(), dynamic_objc_cast<NSObject>(object.get()));
-        EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(object.get()));
+    @autoreleasepool {
+        auto objectNS = adoptNS([[NSString alloc] initWithFormat:@"%s", helloWorldCString]);
+        auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get());
+        EXPECT_EQ(objectNS.get(), dynamic_objc_cast<NSObject>(objectNS.get()));
+        EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(objectNS.get()));
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr));
     }
 
-    {
-        auto object = adoptNS(reinterpret_cast<id>([[NSObject alloc] init]));
-        EXPECT_EQ(object.get(), dynamic_objc_cast<NSObject>(object.get()));
-        EXPECT_EQ(nil, dynamic_objc_cast<MyObjectSubtype>(object.get()));
+    @autoreleasepool {
+        auto objectID = adoptNS<id>([[NSObject alloc] init]);
+        auto objectIDPtr = reinterpret_cast<uintptr_t>(objectID.get());
+        EXPECT_EQ(objectID.get(), dynamic_objc_cast<NSObject>(objectID.get()));
+        EXPECT_EQ(nil, dynamic_objc_cast<MyObjectSubtype>(objectID.get()));
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectIDPtr));
     }
 
-    {
-        auto object = adoptNS([[NSObject alloc] init]);
-        EXPECT_EQ(nil, dynamic_objc_cast<MyObjectSubtype>(object.get()));
+    @autoreleasepool {
+        auto objectNS = adoptNS([[NSObject alloc] init]);
+        auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get());
+        EXPECT_EQ(nil, dynamic_objc_cast<MyObjectSubtype>(objectNS.get()));
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr));
     }
 }
 
-TEST(TypeCastsCocoa, dynamic_ns_cast_RetainPtr)
+TEST(TypeCastsCocoa, dynamic_objc_cast_RetainPtr)
 {
-    {
+    @autoreleasepool {
         RetainPtr<NSString> object;
         auto objectCast = dynamic_objc_cast<NSString>(WTFMove(object));
         EXPECT_EQ(nil, object.get());
@@ -102,94 +190,68 @@
         EXPECT_EQ(nil, objectCast.get());
     }
 
-    {
-        auto object = adoptNS(reinterpret_cast<id>([[NSString alloc] initWithFormat:@"%s", "Hello world"]));
-        id objectPtr = object.get();
+    @autoreleasepool {
+        auto object = adoptNS<id>([[NSString alloc] initWithFormat:@"%s", helloWorldCString]);
+        auto objectPtr = reinterpret_cast<uintptr_t>(object.get());
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr));
+
         auto objectCast = dynamic_objc_cast<NSString>(WTFMove(object));
+        auto objectCastPtr = reinterpret_cast<uintptr_t>(objectCast.get());
         EXPECT_EQ(nil, object.get());
-        EXPECT_EQ(objectPtr, objectCast.get());
-        objectPtr = nil; // For ARC.
-        EXPECT_EQ(1U, [objectCast retainCount]);
+        EXPECT_EQ(objectPtr, objectCastPtr);
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCastPtr));
 
-        object = adoptNS(reinterpret_cast<id>([[NSString alloc] initWithFormat:@"%s", "Hello world"]));
-        objectPtr = object.get();
+        object = adoptNS<id>([[NSString alloc] initWithFormat:@"%s", helloWorldCString]);
+        objectPtr = reinterpret_cast<uintptr_t>(object.get());
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr));
+
         auto objectCast2 = dynamic_objc_cast<NSObject>(WTFMove(object));
+        auto objectCastPtr2 = reinterpret_cast<uintptr_t>(objectCast2.get());
         EXPECT_EQ(nil, object.get());
-        EXPECT_EQ(objectPtr, objectCast2.get());
-        objectPtr = nil; // For ARC.
-        EXPECT_EQ(1U, [objectCast2 retainCount]);
+        EXPECT_EQ(objectPtr, objectCastPtr2);
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCastPtr2));
 
-        object = adoptNS(reinterpret_cast<id>([[NSString alloc] initWithFormat:@"%s", "Hello world"]));
-        objectPtr = object.get();
-        auto objectCast3 = dynamic_objc_cast<NSArray>(WTFMove(object));
-        EXPECT_EQ(objectPtr, object.get());
-        EXPECT_EQ(nil, objectCast3.get());
-        objectPtr = nil; // For ARC.
-        EXPECT_EQ(1U, [object retainCount]);
+        object = adoptNS<id>([[NSString alloc] initWithFormat:@"%s", helloWorldCString]);
+        objectPtr = reinterpret_cast<uintptr_t>(object.get());
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr));
+
+        auto objectCastBad = dynamic_objc_cast<NSArray>(WTFMove(object));
+        auto objectPtr2 = reinterpret_cast<uintptr_t>(object.get());
+        EXPECT_EQ(objectPtr, objectPtr2);
+        EXPECT_EQ(nil, objectCastBad.get());
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr2));
     }
 
-    {
-        auto object = adoptNS(reinterpret_cast<NSObject *>([[NSString alloc] initWithFormat:@"%s", "Hello world"]));
-        id objectPtr = object.get();
-        auto objectCast = dynamic_objc_cast<NSString>(WTFMove(object));
-        EXPECT_EQ(nil, object.get());
-        EXPECT_EQ(objectPtr, objectCast.get());
-        objectPtr = nil;
-        EXPECT_EQ(1U, [objectCast retainCount]);
+    @autoreleasepool {
+        auto object = adoptNS([[NSString alloc] initWithFormat:@"%s", helloWorldCString]);
+        auto objectPtr = reinterpret_cast<uintptr_t>(object.get());
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr));
 
-        object = adoptNS(reinterpret_cast<NSObject *>([[NSString alloc] initWithFormat:@"%s", "Hello world"]));
-        objectPtr = object.get();
-        auto objectCast2 = dynamic_objc_cast<NSArray>(WTFMove(object));
-        EXPECT_EQ(objectPtr, object.get());
-        EXPECT_EQ(nil, objectCast2.get());
-        objectPtr = nil;
-        EXPECT_EQ(1U, [object retainCount]);
-    }
-
-    {
-        auto object = adoptNS([[NSString alloc] initWithFormat:@"%s", "Hello world"]);
-        id objectPtr = object.get();
         auto objectCast = dynamic_objc_cast<NSObject>(WTFMove(object));
+        auto objectCastPtr = reinterpret_cast<uintptr_t>(objectCast.get());
         EXPECT_EQ(nil, object.get());
-        EXPECT_EQ(objectPtr, objectCast.get());
-        objectPtr = nil;
-        EXPECT_EQ(1U, [objectCast retainCount]);
-
-        object = adoptNS([[NSString alloc] initWithFormat:@"%s", "Hello world"]);
-        objectPtr = object.get();
-        auto objectCast2 = dynamic_objc_cast<NSArray>(WTFMove(object));
-        EXPECT_EQ(objectPtr, object.get());
-        EXPECT_EQ(nil, objectCast2.get());
-        objectPtr = nil;
-        EXPECT_EQ(1U, [object retainCount]);
+        EXPECT_EQ(objectPtr, objectCastPtr);
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCastPtr));
     }
 
-    {
-        auto object = adoptNS(reinterpret_cast<id>([[NSObject alloc] init]));
-        id objectPtr = object.get();
+    @autoreleasepool {
+        auto object = adoptNS<id>([[NSObject alloc] init]);
+        auto objectPtr = reinterpret_cast<uintptr_t>(object.get());
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr));
+
         auto objectCast = dynamic_objc_cast<NSObject>(WTFMove(object));
+        auto objectCastPtr = reinterpret_cast<uintptr_t>(objectCast.get());
         EXPECT_EQ(nil, object.get());
-        EXPECT_EQ(objectPtr, objectCast.get());
-        objectPtr = nil; // For ARC.
-        EXPECT_EQ(1U, [objectCast retainCount]);
+        EXPECT_EQ(objectPtr, objectCastPtr);
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCastPtr));
 
-        object = adoptNS(reinterpret_cast<id>([[NSObject alloc] init]));
-        objectPtr = object.get();
-        auto objectCast2 = dynamic_objc_cast<MyObjectSubtype>(WTFMove(object));
-        EXPECT_EQ(objectPtr, object.get());
-        EXPECT_EQ(nil, objectCast2.get());
-        objectPtr = nil; // For ARC.
-        EXPECT_EQ(1U, [object retainCount]);
-    }
+        object = adoptNS<id>([[NSObject alloc] init]);
+        objectPtr = reinterpret_cast<uintptr_t>(object.get());
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr));
 
-    {
-        auto object = adoptNS([[NSObject alloc] init]);
-        id objectPtr = object.get();
-        auto objectCast = dynamic_objc_cast<MyObjectSubtype>(WTFMove(object));
-        EXPECT_EQ(objectPtr, object.get());
-        EXPECT_EQ(nil, objectCast.get());
-        objectPtr = nil; // For ARC.
-        EXPECT_EQ(1U, [object retainCount]);
+        auto objectCastBad = dynamic_objc_cast<MyObjectSubtype>(WTFMove(object));
+        EXPECT_EQ(nil, objectCastBad.get());
+        EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr));
     }
 }
 

Added: trunk/Tools/TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoaARC.mm (0 => 283476)


--- trunk/Tools/TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoaARC.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoaARC.mm	2021-10-03 19:31:55 UTC (rev 283476)
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2021 Apple 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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.
+ */
+
+#if !__has_feature(objc_arc)
+#error This tests TypeCastsCocoa.h with ARC enabled.
+#endif
+
+#define MyObjectSubtype MyObjectSubtypeARC
+#define TypeCastsCocoa TypeCastsCocoaARC
+#include "TypeCastsCocoa.mm"
+#undef TypeCastsCocoa
+#undef MyObjectSubtype

Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/ns/RetainPtr.mm (283475 => 283476)


--- trunk/Tools/TestWebKitAPI/Tests/WTF/ns/RetainPtr.mm	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/ns/RetainPtr.mm	2021-10-03 19:31:55 UTC (rev 283476)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011-2018 Apple Inc. All rights reserved.
+ * Copyright (C) 2011-2021 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -27,24 +27,37 @@
  */
 
 #import "config.h"
-
 #import <wtf/RetainPtr.h>
 
+#if __has_feature(objc_arc)
+#ifndef RETAIN_PTR_TEST_NAME
+#error This tests RetainPtr.h with ARC disabled.
+#endif
+#define autorelease self
+#endif
+
+#ifndef RETAIN_PTR_TEST_NAME
+#define RETAIN_PTR_TEST_NAME RetainPtr
+#endif
+
 namespace TestWebKitAPI {
 
-TEST(RetainPtr, AdoptNS)
+TEST(RETAIN_PTR_TEST_NAME, AdoptNS)
 {
     RetainPtr<NSObject> object1 = adoptNS([[NSObject alloc] init]);
-    EXPECT_EQ(1, CFGetRetainCount(object1.get()));
+    auto objectPtr1 = reinterpret_cast<uintptr_t>(object1.get());
+    EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr1));
 
     RetainPtr<NSObject *> object2 = adoptNS([[NSObject alloc] init]);
-    EXPECT_EQ(1, CFGetRetainCount(object2.get()));
+    auto objectPtr2 = reinterpret_cast<uintptr_t>(object2.get());
+    EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr2));
 
     RetainPtr<id> object3 = adoptNS([[NSObject alloc] init]);
-    EXPECT_EQ(1, CFGetRetainCount(object3.get()));
+    auto objectPtr3 = reinterpret_cast<uintptr_t>(object3.get());
+    EXPECT_EQ(1, CFGetRetainCount((CFTypeRef)objectPtr3));
 }
 
-TEST(RetainPtr, ConstructionFromMutableNSType)
+TEST(RETAIN_PTR_TEST_NAME, ConstructionFromMutableNSType)
 {
     NSMutableString *string = [NSMutableString stringWithUTF8String:"foo"];
 
@@ -64,7 +77,7 @@
     EXPECT_EQ((NSString *)nil, temp);
 }
 
-TEST(RetainPtr, ConstructionFromSameNSType)
+TEST(RETAIN_PTR_TEST_NAME, ConstructionFromSameNSType)
 {
     NSString *string = @"foo";
 
@@ -84,7 +97,7 @@
     EXPECT_EQ((NSString *)nil, temp);
 }
 
-TEST(RetainPtr, ConstructionFromSimilarNSType)
+TEST(RETAIN_PTR_TEST_NAME, ConstructionFromSimilarNSType)
 {
     NSString *string = @"foo";
 
@@ -104,7 +117,7 @@
     EXPECT_EQ((NSString *)nil, temp);
 }
 
-TEST(RetainPtr, ConstructionFromSimilarNSTypeReversed)
+TEST(RETAIN_PTR_TEST_NAME, ConstructionFromSimilarNSTypeReversed)
 {
     NSString *string = @"foo";
 
@@ -124,7 +137,7 @@
     EXPECT_EQ((NSString *)nil, temp);
 }
 
-TEST(RetainPtr, MoveAssignmentFromMutableNSType)
+TEST(RETAIN_PTR_TEST_NAME, MoveAssignmentFromMutableNSType)
 {
     NSMutableString *string = [NSMutableString stringWithUTF8String:"foo"];
     RetainPtr<NSString> ptr;
@@ -146,7 +159,7 @@
     EXPECT_EQ((NSString *)nil, temp);
 }
 
-TEST(RetainPtr, MoveAssignmentFromSameNSType)
+TEST(RETAIN_PTR_TEST_NAME, MoveAssignmentFromSameNSType)
 {
     NSString *string = @"foo";
     RetainPtr<NSString> ptr;
@@ -168,7 +181,7 @@
     EXPECT_EQ((NSString *)nil, temp);
 }
 
-TEST(RetainPtr, MoveAssignmentFromSimilarNSType)
+TEST(RETAIN_PTR_TEST_NAME, MoveAssignmentFromSimilarNSType)
 {
     NSString *string = @"foo";
     RetainPtr<NSString> ptr;
@@ -190,7 +203,7 @@
     EXPECT_EQ((NSString *)nil, temp);
 }
 
-TEST(RetainPtr, MoveAssignmentFromSimilarNSTypeReversed)
+TEST(RETAIN_PTR_TEST_NAME, MoveAssignmentFromSimilarNSTypeReversed)
 {
     NSString *string = @"foo";
     RetainPtr<NSString *> ptr;
@@ -212,11 +225,12 @@
     EXPECT_EQ((NSString *)nil, temp);
 }
 
-TEST(RetainPtr, OptionalRetainPtrNS)
+TEST(RETAIN_PTR_TEST_NAME, OptionalRetainPtrNS)
 {
     // Test assignment from adoptNS().
     std::optional<RetainPtr<NSObject>> optionalObject1 = adoptNS([NSObject new]);
-    EXPECT_EQ(1, CFGetRetainCount(optionalObject1.value().get()));
+    auto optionalObjectPtr1 = reinterpret_cast<uintptr_t>(optionalObject1.value().get());
+    EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)optionalObjectPtr1));
     RetainPtr<NSObject> object1 = optionalObject1.value();
     EXPECT_EQ(optionalObject1.value(), object1);
 
@@ -225,8 +239,10 @@
     @autoreleasepool {
         optionalObject2 = retainPtr([[NSObject new] autorelease]);
     }
-    EXPECT_EQ(1, CFGetRetainCount(optionalObject2.value().get()));
+    auto optionalObjectPtr2 = reinterpret_cast<uintptr_t>(optionalObject2.value().get());
+    EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)optionalObjectPtr2));
     RetainPtr<NSObject> object2 = optionalObject2.value();
+    auto objectPtr2 = reinterpret_cast<uintptr_t>(object2.get());
     EXPECT_EQ(optionalObject2.value(), object2);
 
     EXPECT_NE(object1, object2);
@@ -246,33 +262,36 @@
     EXPECT_EQ(optionalObject2.value(), object2);
 
     // Test move from std::optional<RetainPtr<NSObject>>.
-    EXPECT_EQ(2, CFGetRetainCount(object2.get()));
+    EXPECT_EQ(2L, CFGetRetainCount((CFTypeRef)objectPtr2));
     optionalObject1 = WTFMove(optionalObject2);
-    EXPECT_EQ(2, CFGetRetainCount(object2.get()));
+    EXPECT_EQ(2L, CFGetRetainCount((CFTypeRef)objectPtr2));
     EXPECT_TRUE(optionalObject1.value());
     EXPECT_TRUE(optionalObject1.value().get());
     EXPECT_EQ(optionalObject1.value(), object2);
 }
 
-TEST(RetainPtr, RetainPtrNS)
+TEST(RETAIN_PTR_TEST_NAME, RetainPtrNS)
 {
     RetainPtr<NSObject> object1;
     @autoreleasepool {
         object1 = retainPtr([[NSObject new] autorelease]);
     }
-    EXPECT_EQ(1, CFGetRetainCount(object1.get()));
+    auto objectPtr1 = reinterpret_cast<uintptr_t>(object1.get());
+    EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr1));
 
     RetainPtr<NSObject *> object2;
     @autoreleasepool {
         object2 = retainPtr([[NSObject new] autorelease]);
     }
-    EXPECT_EQ(1, CFGetRetainCount(object2.get()));
+    auto objectPtr2 = reinterpret_cast<uintptr_t>(object2.get());
+    EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr2));
 
     RetainPtr<id> object3;
     @autoreleasepool {
         object3 = retainPtr([[NSObject new] autorelease]);
     }
-    EXPECT_EQ(1, CFGetRetainCount(object3.get()));
+    auto objectPtr3 = reinterpret_cast<uintptr_t>(object3.get());
+    EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr3));
 }
 
 } // namespace TestWebKitAPI

Added: trunk/Tools/TestWebKitAPI/Tests/WTF/ns/RetainPtrARC.mm (0 => 283476)


--- trunk/Tools/TestWebKitAPI/Tests/WTF/ns/RetainPtrARC.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/ns/RetainPtrARC.mm	2021-10-03 19:31:55 UTC (rev 283476)
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2021 Apple 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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.
+ */
+
+#if !__has_feature(objc_arc)
+#error This tests RetainPtr.h with ARC enabled.
+#endif
+
+#define RETAIN_PTR_TEST_NAME RetainPtrARC
+#include "RetainPtr.mm"
+#undef RETAIN_PTR_TEST_NAME

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/QuickLook.mm (283475 => 283476)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/QuickLook.mm	2021-10-03 18:48:20 UTC (rev 283475)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/QuickLook.mm	2021-10-03 19:31:55 UTC (rev 283476)
@@ -44,7 +44,7 @@
 #import <WebKit/_WKDownload.h>
 #import <WebKit/_WKDownloadDelegate.h>
 #import <wtf/NeverDestroyed.h>
-#import <wtf/RetainPtr.h>
+#import <wtf/cocoa/TypeCastsCocoa.h>
 
 using namespace TestWebKitAPI;
 
@@ -97,8 +97,8 @@
     if ([fileURL getResourceValue:&typeIdentifier forKey:NSURLTypeIdentifierKey error:nil])
         fileType = typeIdentifier;
 
-    mimeType = adoptCF(UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)typeIdentifier, kUTTagClassMIMEType));
-    fileData = [NSData dataWithContentsOfURL:fileURL];
+    mimeType = bridge_cast(adoptCF(UTTypeCopyPreferredTagWithClass(bridge_cast(typeIdentifier), kUTTagClassMIMEType)));
+    fileData = adoptNS([[NSData alloc] initWithContentsOfURL:fileURL]);
 }
 
 - (instancetype)initWithExpectedFileURL:(NSURL *)fileURL responsePolicy:(WKNavigationResponsePolicy)responsePolicy
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to