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