Changeset 283476 in webkit
- Timestamp:
- Oct 3, 2021, 12:31:55 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 16 edited
-
Source/WTF/ChangeLog (modified) (1 diff)
-
Source/WTF/wtf/RetainPtr.h (modified) (2 diffs)
-
Source/WTF/wtf/cocoa/TypeCastsCocoa.h (modified) (3 diffs)
-
Source/WTF/wtf/cocoa/VectorCocoa.h (modified) (4 diffs)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/Shared/API/Cocoa/WKRemoteObjectCoder.mm (modified) (5 diffs)
-
Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm (modified) (3 diffs)
-
Source/WebKit/UIProcess/mac/WebDataListSuggestionsDropdownMac.h (modified) (2 diffs)
-
Source/WebKitLegacy/mac/ChangeLog (modified) (1 diff)
-
Source/WebKitLegacy/mac/Plugins/WebBasePluginPackage.mm (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/DumpRenderTree/mac/DumpRenderTree.mm (modified) (2 diffs)
-
Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (modified) (8 diffs)
-
Tools/TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoa.mm (modified) (4 diffs)
-
Tools/TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoaARC.mm (added)
-
Tools/TestWebKitAPI/Tests/WTF/ns/RetainPtr.mm (modified) (16 diffs)
-
Tools/TestWebKitAPI/Tests/WTF/ns/RetainPtrARC.mm (added)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/QuickLook.mm (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r283469 r283476 1 2021-10-03 David Kilzer <ddkilzer@apple.com> 2 3 WTF::RetainPtr<> allows assignment of two pointer types that are not assignable 4 <https://webkit.org/b/230406> 5 <rdar://problem/83241893> 6 7 Reviewed by Darin Adler. 8 9 * wtf/RetainPtr.h: 10 (WTF::RetainPtr::RetainPtr): 11 (WTF::RetainPtr::checkType): Add. 12 - Add type check for move constructor. 13 14 * wtf/cocoa/TypeCastsCocoa.h: 15 - Change #include to #import. 16 (WTF_CF_TO_NS_BRIDGE_TRANSFER): Add. 17 (WTF_CF_TO_NS_BRIDGE_TRANSFER): Add. 18 - Helper macros for bridge_cast() and bridge_id_cast(). 19 (WTF_DECLARE_CF_NS_BRIDGE_CAST): Add. 20 - Macro used to define bridge_cast() functions for all known 21 toll-free-bridged types. 22 (WTF::bridge_cast): Add. 23 - Helper macro for toll-free-bridge casting from a known CF type 24 to and from their Objective-C NS type. Prevents ref churn for 25 rvale RetainPtr<> objects. 26 (WTF::bridge_id_cast): Add. 27 - Helper macro for casting from any CFTypeRef to id. Prevents 28 ref churn for rvalue RetainPtr<> objects. 29 (WTF::checked_objc_cast): 30 - Simplified to match dynamic_objc_cast<> implementation in 31 RetainPtr.h. 32 33 * wtf/cocoa/VectorCocoa.h: 34 (WTF::createNSArray): 35 - Change return type to match object. 36 1 37 2021-10-03 Basuke Suzuki <basuke.suzuki@sony.com> 2 38 -
trunk/Source/WTF/wtf/RetainPtr.h
r282844 r283476 91 91 92 92 constexpr RetainPtr(RetainPtr&& o) : m_ptr(toStorageType(o.leakRef())) { } 93 template<typename U> constexpr RetainPtr(RetainPtr<U>&& o) : m_ptr(toStorageType( o.leakRef())) { }93 template<typename U> constexpr RetainPtr(RetainPtr<U>&& o) : m_ptr(toStorageType(checkType(o.leakRef()))) { } 94 94 95 95 // Hash table deleted values, which are only constructed and never copied or destroyed. … … 138 138 enum AdoptTag { Adopt }; 139 139 constexpr RetainPtr(PtrType ptr, AdoptTag) : m_ptr(toStorageType(ptr)) { } 140 141 static constexpr PtrType checkType(PtrType ptr) { return ptr; } 140 142 141 143 static constexpr PtrType hashTableDeletedValue() { return reinterpret_cast<PtrType>(-1); } -
trunk/Source/WTF/wtf/cocoa/TypeCastsCocoa.h
r282844 r283476 26 26 #pragma once 27 27 28 #i nclude<wtf/Assertions.h>29 #i nclude<wtf/RetainPtr.h>28 #import <wtf/Assertions.h> 29 #import <wtf/RetainPtr.h> 30 30 31 31 namespace WTF { 32 33 // Use bridge_cast() to convert between CF <-> NS types without ref churn. 34 35 #if __has_feature(objc_arc) 36 #define WTF_CF_TO_NS_BRIDGE_TRANSFER(type, value) ((__bridge_transfer type)value) 37 #define WTF_NS_TO_CF_BRIDGE_TRANSFER(type, value) ((type)reinterpret_cast<uintptr_t>(value)) 38 #else 39 #define WTF_CF_TO_NS_BRIDGE_TRANSFER(type, value) ((__bridge type)value) 40 #define WTF_NS_TO_CF_BRIDGE_TRANSFER(type, value) ((__bridge type)value) 41 #endif 42 43 #define WTF_DECLARE_CF_NS_BRIDGE_CAST(CFClassName, NSClassName) \ 44 inline CFClassName##Ref bridge_cast(NSClassName *object) \ 45 { \ 46 return (__bridge CFClassName##Ref)object; \ 47 } \ 48 inline RetainPtr<CFClassName##Ref> bridge_cast(RetainPtr<NSClassName>&& object) \ 49 { \ 50 return adoptCF(WTF_NS_TO_CF_BRIDGE_TRANSFER(CFClassName##Ref, object.leakRef())); \ 51 } \ 52 inline NSClassName *bridge_cast(CFClassName##Ref object) \ 53 { \ 54 return (__bridge NSClassName *)object; \ 55 } \ 56 inline RetainPtr<NSClassName> bridge_cast(RetainPtr<CFClassName##Ref>&& object) \ 57 { \ 58 return adoptNS(WTF_CF_TO_NS_BRIDGE_TRANSFER(NSClassName *, object.leakRef())); \ 59 } 60 61 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFArray, NSArray) 62 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFAttributedString, NSAttributedString) 63 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFCharacterSet, NSCharacterSet) 64 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFData, NSData) 65 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFDate, NSDate) 66 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFDictionary, NSDictionary) 67 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFError, NSError) 68 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFFileSecurity, NSFileSecurity) 69 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFLocale, NSLocale) 70 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFNull, NSNull) 71 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFNumber, NSNumber) 72 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFSet, NSSet) 73 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFString, NSString) 74 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFTimeZone, NSTimeZone) 75 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFURL, NSURL) 76 77 inline NSNumber *bridge_cast(CFBooleanRef object) 78 { 79 return (__bridge NSNumber *)object; 80 } 81 inline RetainPtr<NSNumber> bridge_cast(RetainPtr<CFBooleanRef>&& object) 82 { 83 return adoptNS(WTF_CF_TO_NS_BRIDGE_TRANSFER(NSNumber *, object.leakRef())); 84 } 85 86 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableArray, NSMutableArray) 87 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableAttributedString, NSMutableAttributedString) 88 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableData, NSMutableData) 89 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableDictionary, NSMutableDictionary) 90 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableSet, NSMutableSet) 91 WTF_DECLARE_CF_NS_BRIDGE_CAST(CFMutableString, NSMutableString) 92 93 // Use bridge_id_cast to convert from CF -> id without ref churn. 94 95 inline id bridge_id_cast(CFTypeRef object) 96 { 97 return (__bridge id)object; 98 } 99 100 inline RetainPtr<id> bridge_id_cast(RetainPtr<CFTypeRef>&& object) 101 { 102 return adoptNS(WTF_CF_TO_NS_BRIDGE_TRANSFER(id, object.leakRef())); 103 } 104 105 #undef WTF_DECLARE_CF_NS_BRIDGE_CAST 106 #undef WTF_NS_TO_CF_BRIDGE_TRANSFER 107 #undef WTF_CF_TO_NS_BRIDGE_TRANSFER 32 108 33 109 // Use checked_objc_cast<> instead of dynamic_objc_cast<> when a specific NS type is required. … … 35 111 template<typename T> T* checked_objc_cast(id object) 36 112 { 37 using ValueType = std::remove_pointer_t<T>;38 using PtrType = ValueType*;39 40 113 if (!object) 41 114 return nullptr; 42 115 43 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION([object isKindOfClass:[ ValueTypeclass]]);116 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION([object isKindOfClass:[T class]]); 44 117 45 return reinterpret_cast< PtrType>(object);118 return reinterpret_cast<T*>(object); 46 119 } 47 120 … … 61 134 } // namespace WTF 62 135 136 using WTF::bridge_cast; 137 using WTF::bridge_id_cast; 63 138 using WTF::checked_objc_cast; -
trunk/Source/WTF/wtf/cocoa/VectorCocoa.h
r278253 r283476 48 48 // std::optional<VectorElementType> makeVectorElement(const VectorElementType*, id arrayElement); 49 49 50 template<typename CollectionType> RetainPtr<NS Array> createNSArray(CollectionType&&);50 template<typename CollectionType> RetainPtr<NSMutableArray> createNSArray(CollectionType&&); 51 51 template<typename VectorElementType> Vector<VectorElementType> makeVector(NSArray *); 52 52 … … 54 54 // The map function has the same interface as the makeNSArrayElement function above, but can be any 55 55 // function including a lambda, a function-like object, or Function<>. 56 template<typename CollectionType, typename MapFunctionType> RetainPtr<NS Array> createNSArray(CollectionType&&, MapFunctionType&&);56 template<typename CollectionType, typename MapFunctionType> RetainPtr<NSMutableArray> createNSArray(CollectionType&&, MapFunctionType&&); 57 57 58 58 // This overload of makeVector takes a function to map each Objective-C object to a vector element. … … 68 68 } 69 69 70 template<typename CollectionType> RetainPtr<NS Array> createNSArray(CollectionType&& collection)70 template<typename CollectionType> RetainPtr<NSMutableArray> createNSArray(CollectionType&& collection) 71 71 { 72 72 auto array = adoptNS([[NSMutableArray alloc] initWithCapacity:std::size(collection)]); … … 76 76 } 77 77 78 template<typename CollectionType, typename MapFunctionType> RetainPtr<NS Array> createNSArray(CollectionType&& collection, MapFunctionType&& function)78 template<typename CollectionType, typename MapFunctionType> RetainPtr<NSMutableArray> createNSArray(CollectionType&& collection, MapFunctionType&& function) 79 79 { 80 80 auto array = adoptNS([[NSMutableArray alloc] initWithCapacity:std::size(collection)]); -
trunk/Source/WebKit/ChangeLog
r283470 r283476 1 2021-10-03 David Kilzer <ddkilzer@apple.com> 2 3 WTF::RetainPtr<> allows assignment of two pointer types that are not assignable 4 <https://webkit.org/b/230406> 5 <rdar://problem/83241893> 6 7 Reviewed by Darin Adler. 8 9 * Shared/API/Cocoa/WKRemoteObjectCoder.mm: 10 (transformTrustToData): 11 - Change return type to match object. 12 (encodeError): 13 - Use bridge_cast() to fix assignment. 14 (transformDataToTrust): 15 - Change return type to match object. 16 (decodeError): 17 - Use bridge_id_cast() to fix assignment. 18 * Shared/RemoteLayerTree/RemoteLayerBackingStore.mm: 19 (WebKit::RemoteLayerBackingStore::applyBackingStoreToLayer): 20 - Use bridge_id_cast() to fix assignment. 21 22 * UIProcess/mac/WebDataListSuggestionsDropdownMac.h: 23 - Use correct name of class that actually exists. 24 1 25 2021-10-03 Simon Fraser <simon.fraser@apple.com> 2 26 -
trunk/Source/WebKit/Shared/API/Cocoa/WKRemoteObjectCoder.mm
r275680 r283476 40 40 #import <wtf/Scope.h> 41 41 #import <wtf/SetForScope.h> 42 #import <wtf/cocoa/TypeCastsCocoa.h> 42 43 #import <wtf/text/CString.h> 43 44 … … 333 334 } 334 335 335 static RetainPtr< NSData> transformTrustToData(SecTrustRef trust)336 static RetainPtr<CFDataRef> transformTrustToData(SecTrustRef trust) 336 337 { 337 338 if (CFGetTypeID(trust) != SecTrustGetTypeID()) … … 364 365 if (!copy) 365 366 copy = adoptNS([error.userInfo mutableCopy]); 366 copy.get()[peerTrustKey] = transformTrustToData((SecTrustRef)trust).get();367 copy.get()[peerTrustKey] = bridge_cast(transformTrustToData((SecTrustRef)trust).get()); 367 368 } 368 369 if (!copy) … … 386 387 } 387 388 388 static RetainPtr< id> transformDataToTrust(NSData *data)389 static RetainPtr<SecTrustRef> transformDataToTrust(NSData *data) 389 390 { 390 391 if (CFGetTypeID(data) != CFDataGetTypeID()) … … 408 409 if (!copy) 409 410 copy = adoptNS([error.get().userInfo mutableCopy]); 410 copy.get()[peerTrustKey] = transformDataToTrust(trust).get();411 copy.get()[peerTrustKey] = bridge_id_cast(transformDataToTrust(trust).get()); 411 412 } 412 413 if (!copy) -
trunk/Source/WebKit/Shared/RemoteLayerTree/RemoteLayerBackingStore.mm
r282639 r283476 48 48 #import <mach/mach_port.h> 49 49 #import <pal/spi/cocoa/QuartzCoreSPI.h> 50 #import <wtf/cocoa/TypeCastsCocoa.h> 50 51 51 52 #if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER) … … 433 434 [&] (ShareableBitmap::Handle& handle) { 434 435 ASSERT(m_type == Type::Bitmap); 435 auto bitmap = ShareableBitmap::create(handle); 436 contents = bitmap->makeCGImageCopy(); 436 contents = bridge_id_cast(ShareableBitmap::create(handle)->makeCGImageCopy()); 437 437 }, 438 438 [&] (MachSendRight& machSendRight) { … … 445 445 } 446 446 case RemoteLayerBackingStore::LayerContentsType::CAMachPort: 447 contents = adoptCF(CAMachPortCreate(machSendRight.leakSendRight()));447 contents = bridge_id_cast(adoptCF(CAMachPortCreate(machSendRight.leakSendRight()))); 448 448 break; 449 449 } -
trunk/Source/WebKit/UIProcess/mac/WebDataListSuggestionsDropdownMac.h
r237307 r283476 31 31 #import <wtf/RetainPtr.h> 32 32 33 OBJC_CLASS WKDataListSuggestions View;33 OBJC_CLASS WKDataListSuggestionsController; 34 34 35 35 namespace WebKit { … … 52 52 53 53 NSView *m_view; 54 RetainPtr<WKDataListSuggestions View> m_dropdownUI;54 RetainPtr<WKDataListSuggestionsController> m_dropdownUI; 55 55 }; 56 56 -
trunk/Source/WebKitLegacy/mac/ChangeLog
r283431 r283476 1 2021-10-03 David Kilzer <ddkilzer@apple.com> 2 3 WTF::RetainPtr<> allows assignment of two pointer types that are not assignable 4 <https://webkit.org/b/230406> 5 <rdar://problem/83241893> 6 7 Reviewed by Darin Adler. 8 9 * Plugins/WebBasePluginPackage.mm: 10 (+[WebBasePluginPackage pluginWithPath:]): 11 - Use explicit type with RetainPtr<> to match return type. 12 1 13 2021-10-01 Chris Dumez <cdumez@apple.com> 2 14 -
trunk/Source/WebKitLegacy/mac/Plugins/WebBasePluginPackage.mm
r281791 r283476 68 68 + (WebBasePluginPackage *)pluginWithPath:(NSString *)pluginPath 69 69 { 70 71 auto pluginPackage = adoptNS([[WebPluginPackage alloc] initWithPath:pluginPath]); 70 RetainPtr<WebBasePluginPackage> pluginPackage = adoptNS([[WebPluginPackage alloc] initWithPath:pluginPath]); 72 71 73 72 if (!pluginPackage) { -
trunk/Tools/ChangeLog
r283468 r283476 1 2021-10-03 David Kilzer <ddkilzer@apple.com> 2 3 WTF::RetainPtr<> allows assignment of two pointer types that are not assignable 4 <https://webkit.org/b/230406> 5 <rdar://problem/83241893> 6 7 Reviewed by Darin Adler. 8 9 * DumpRenderTree/mac/DumpRenderTree.mm: 10 (dump): 11 - Use bridge_cast() to fix assignment. 12 * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: 13 - Add RetainPtrARC.mm and TypeCastsCocoaARC.mm to the project. 14 * TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoa.mm: 15 - Update for dual compilation with MRR and with ARC. Change 16 -retainCount methods to CFGetRetainCount(). 17 - Add @autoreleasepool blocks around groups of tests to find 18 over-released bugs sooner (for future changes). 19 - Add more CFGetRetainCount() to catch unexpected auto-released 20 objects as well as leaks. 21 (TestWebKitAPI::helloWorldCStringLength): Add. 22 (TestWebKitAPI::TEST): 23 - Add tests for bridge_cast() and bridge_id_cast(). 24 - Remove invalid tests after changing RetainPtr<> move 25 constructor to check types. 26 * TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoaARC.mm: Add. 27 - Run tests in TypeCastsCocoa.mm with ARC enabled. 28 * TestWebKitAPI/Tests/WTF/ns/RetainPtr.mm: 29 (TestWebKitAPI::TEST): 30 - Update for dual compilation with MRR and with ARC. Change 31 -retainCount methods to CFGetRetainCount(). 32 - Make it possible to name tests differently for MRR vs. ARC 33 using RETAIN_PTR_TEST_NAME macro. 34 * TestWebKitAPI/Tests/WTF/ns/RetainPtrARC.mm: Add. 35 - Run tests in RetainPtr.mm with ARC enabled. 36 * TestWebKitAPI/Tests/WebKitCocoa/QuickLook.mm: 37 (readFile): 38 - Use bridge_cast() to fix assignment. 39 - Drive-by fix to keep NSData out of autoreleasePool. 40 1 41 2021-10-03 Myles C. Maxfield <mmaxfield@apple.com> 2 42 -
trunk/Tools/DumpRenderTree/mac/DumpRenderTree.mm
r281994 r283476 108 108 #import <wtf/WorkQueue.h> 109 109 #import <wtf/cocoa/CrashReporter.h> 110 #import <wtf/cocoa/TypeCastsCocoa.h> 110 111 #import <wtf/cocoa/VectorCocoa.h> 111 112 #import <wtf/text/StringBuilder.h> … … 1621 1622 } else if (gTestRunner->dumpDOMAsWebArchive()) { 1622 1623 WebArchive *webArchive = [[mainFrame DOMDocument] webArchive]; 1623 resultString = WebCoreTestSupport::createXMLStringFromWebArchiveData((__bridge CFDataRef)[webArchive data]);1624 resultString = bridge_cast(WebCoreTestSupport::createXMLStringFromWebArchiveData(bridge_cast([webArchive data]))); 1624 1625 resultMimeType = @"application/x-webarchive"; 1625 1626 } else if (gTestRunner->dumpSourceAsWebArchive()) { 1626 1627 WebArchive *webArchive = [[mainFrame dataSource] webArchive]; 1627 resultString = WebCoreTestSupport::createXMLStringFromWebArchiveData((__bridge CFDataRef)[webArchive data]);1628 resultString = bridge_cast(WebCoreTestSupport::createXMLStringFromWebArchiveData(bridge_cast([webArchive data]))); 1628 1629 resultMimeType = @"application/x-webarchive"; 1629 1630 } else if (gTestRunner->isPrinting()) -
trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
r283276 r283476 263 263 44077BB123144B5000179E2D /* DataDetectorsTestIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44077BB0231449D200179E2D /* DataDetectorsTestIOS.mm */; }; 264 264 4433A396208044140091ED57 /* SynchronousTimeoutTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4433A395208044130091ED57 /* SynchronousTimeoutTests.mm */; }; 265 44652CB726FCD405005EC272 /* TypeCastsCocoaARC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44652CB626FCD405005EC272 /* TypeCastsCocoaARC.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 265 266 448110C2253F40300097FC33 /* WebPreferencesTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 448110C1253F40240097FC33 /* WebPreferencesTest.mm */; }; 266 267 44817A2F1F0486BF00003810 /* WKRequestActivatedElementInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44817A2E1F0486BF00003810 /* WKRequestActivatedElementInfo.mm */; }; … … 270 271 44CDE4D426EE6E4A009F6ACB /* TypeCastsCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44CDE4D326EE6E41009F6ACB /* TypeCastsCocoa.mm */; }; 271 272 44CF31FD249941E8009CB6CB /* ContextMenuAction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 44CF31FB24993F66009CB6CB /* ContextMenuAction.cpp */; }; 273 44D5008E26FE9ED6000EB12F /* RetainPtrARC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44D5008D26FE9ED6000EB12F /* RetainPtrARC.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 272 274 4612C2B9210A6ACE00B788A6 /* LoadFileThenReload.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4612C2B8210A6ABF00B788A6 /* LoadFileThenReload.mm */; }; 273 275 4628C8E92367ABD100B073F0 /* WKSecurityOrigin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4628C8E82367ABBC00B073F0 /* WKSecurityOrigin.cpp */; }; … … 2099 2101 442BBF681C91CAD90017087F /* RefLogger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RefLogger.cpp; sourceTree = "<group>"; }; 2100 2102 4433A395208044130091ED57 /* SynchronousTimeoutTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SynchronousTimeoutTests.mm; sourceTree = "<group>"; }; 2103 44652CB626FCD405005EC272 /* TypeCastsCocoaARC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TypeCastsCocoaARC.mm; sourceTree = "<group>"; }; 2101 2104 448110C1253F40240097FC33 /* WebPreferencesTest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = WebPreferencesTest.mm; sourceTree = "<group>"; }; 2102 2105 44817A2E1F0486BF00003810 /* WKRequestActivatedElementInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKRequestActivatedElementInfo.mm; sourceTree = "<group>"; }; … … 2106 2109 44CDE4D326EE6E41009F6ACB /* TypeCastsCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TypeCastsCocoa.mm; sourceTree = "<group>"; }; 2107 2110 44CF31FB24993F66009CB6CB /* ContextMenuAction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContextMenuAction.cpp; sourceTree = "<group>"; }; 2111 44D5008D26FE9ED6000EB12F /* RetainPtrARC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RetainPtrARC.mm; path = ns/RetainPtrARC.mm; sourceTree = "<group>"; }; 2108 2112 4612C2B8210A6ABF00B788A6 /* LoadFileThenReload.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LoadFileThenReload.mm; sourceTree = "<group>"; }; 2109 2113 4628C8E82367ABBC00B073F0 /* WKSecurityOrigin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKSecurityOrigin.cpp; sourceTree = "<group>"; }; … … 4285 4289 1ADAD14E1D77A9F600212586 /* BlockPtr.mm */, 4286 4290 BC029B1B1486B25900817DA9 /* RetainPtr.mm */, 4291 44D5008D26FE9ED6000EB12F /* RetainPtrARC.mm */, 4287 4292 ); 4288 4293 name = ns; … … 4999 5004 1C46169E26BA510700F8C9F6 /* TextStreamCocoa.mm */, 5000 5005 44CDE4D326EE6E41009F6ACB /* TypeCastsCocoa.mm */, 5006 44652CB626FCD405005EC272 /* TypeCastsCocoaARC.mm */, 5001 5007 E3C21A7B21B25CA2003B31A3 /* URLExtras.mm */, 5002 5008 ); … … 5317 5323 44AC8BC621D0245A00CAFB34 /* RetainPtr.cpp in Sources */, 5318 5324 7C83DF241D0A590C00FEBCF3 /* RetainPtr.mm in Sources */, 5325 44D5008E26FE9ED6000EB12F /* RetainPtrARC.mm in Sources */, 5319 5326 E355A6322615718F001C1129 /* RobinHoodHashMap.cpp in Sources */, 5320 5327 E355A63026157174001C1129 /* RobinHoodHashSet.cpp in Sources */, … … 5349 5356 0F2C20B81DCD545000542D9E /* Time.cpp in Sources */, 5350 5357 44CDE4D426EE6E4A009F6ACB /* TypeCastsCocoa.mm in Sources */, 5358 44652CB726FCD405005EC272 /* TypeCastsCocoaARC.mm in Sources */, 5351 5359 E324A6F02041C82000A76593 /* UniqueArray.cpp in Sources */, 5352 5360 E3A1E78221B25B7A008C6007 /* URL.cpp in Sources */, -
trunk/Tools/TestWebKitAPI/Tests/WTF/cocoa/TypeCastsCocoa.mm
r282844 r283476 28 28 #import <wtf/StdLibExtras.h> 29 29 30 #if __has_feature(objc_arc) && !defined(TypeCastsCocoa) 31 #error This tests TypeCastsCocoa.h with ARC disabled. 32 #endif 33 30 34 @interface MyObjectSubtype : NSObject 31 35 @end … … 38 42 using namespace WTF; 39 43 44 static const char* helloWorldCString = "Hello world"; 45 static size_t helloWorldCStringLength() 46 { 47 static auto length = strlen(helloWorldCString); 48 return length; 49 } 50 51 TEST(TypeCastsCocoa, bridge_cast) 52 { 53 @autoreleasepool { 54 auto objectNS = adoptNS([[NSString alloc] initWithFormat:@"%s", helloWorldCString]); 55 auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get()); 56 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr)); 57 58 auto objectCF = bridge_cast(WTFMove(objectNS)); 59 auto objectCFPtr = reinterpret_cast<uintptr_t>(objectCF.get()); 60 EXPECT_EQ(nil, objectNS.get()); 61 EXPECT_EQ(objectNSPtr, objectCFPtr); 62 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCFPtr)); 63 64 objectNS = bridge_cast(WTFMove(objectCF)); 65 objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get()); 66 EXPECT_EQ(NULL, objectCF.get()); 67 EXPECT_EQ(objectCFPtr, objectNSPtr); 68 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr)); 69 } 70 71 @autoreleasepool { 72 auto objectCF = adoptCF(CFStringCreateWithBytes(NULL, (const UInt8*)helloWorldCString, helloWorldCStringLength(), kCFStringEncodingUTF8, false)); 73 auto objectCFPtr = reinterpret_cast<uintptr_t>(objectCF.get()); 74 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCFPtr)); 75 76 auto objectNS = bridge_cast(WTFMove(objectCF)); 77 auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get()); 78 EXPECT_EQ(NULL, objectCF.get()); 79 EXPECT_EQ(objectCFPtr, objectNSPtr); 80 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr)); 81 82 objectCF = bridge_cast(WTFMove(objectNS)); 83 objectCFPtr = reinterpret_cast<uintptr_t>(objectCF.get()); 84 EXPECT_EQ(nil, objectNS.get()); 85 EXPECT_EQ(objectNSPtr, objectCFPtr); 86 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCFPtr)); 87 } 88 } 89 90 TEST(TypeCastsCocoa, bridge_id_cast) 91 { 92 @autoreleasepool { 93 RetainPtr<CFTypeRef> objectCF; 94 auto objectID = bridge_id_cast(WTFMove(objectCF)); 95 EXPECT_EQ(NULL, objectCF.get()); 96 EXPECT_EQ(nil, objectID.get()); 97 } 98 99 @autoreleasepool { 100 auto objectCF = adoptCF(CFStringCreateWithBytes(NULL, (const UInt8*)helloWorldCString, helloWorldCStringLength(), kCFStringEncodingUTF8, false)); 101 auto objectCFPtr = reinterpret_cast<uintptr_t>(objectCF.get()); 102 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCFPtr)); 103 104 auto objectID = bridge_id_cast(WTFMove(objectCF)); 105 auto objectIDPtr = reinterpret_cast<uintptr_t>(objectID.get()); 106 EXPECT_EQ(NULL, objectCF.get()); 107 EXPECT_EQ(objectCFPtr, objectIDPtr); 108 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectIDPtr)); 109 } 110 } 111 40 112 TEST(TypeCastsCocoa, checked_objc_cast) 41 113 { 42 114 EXPECT_EQ(nil, checked_objc_cast<NSString>(nil)); 43 115 44 { 45 auto object = adoptNS(reinterpret_cast<id>([[NSString alloc] initWithFormat:@"%s", "Hello world"])); 46 EXPECT_EQ(object.get(), checked_objc_cast<NSString>(object.get())); 47 EXPECT_EQ(object.get(), checked_objc_cast<NSObject>(object.get())); 48 } 49 50 { 51 auto object = adoptNS(reinterpret_cast<NSObject *>([[NSString alloc] initWithFormat:@"%s", "Hello world"])); 52 EXPECT_EQ(object.get(), checked_objc_cast<NSString>(object.get())); 53 } 54 55 { 56 auto object = adoptNS([[NSString alloc] initWithFormat:@"%s", "Hello world"]); 57 EXPECT_EQ(object.get(), checked_objc_cast<NSObject>(object.get())); 116 @autoreleasepool { 117 auto objectNS = adoptNS((id)[[NSString alloc] initWithFormat:@"%s", helloWorldCString]); 118 auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get()); 119 EXPECT_EQ(objectNS.get(), checked_objc_cast<NSString>((__bridge id)(CFTypeRef)objectNSPtr)); 120 EXPECT_EQ(objectNS.get(), checked_objc_cast<NSObject>((__bridge id)(CFTypeRef)objectNSPtr)); 121 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr)); 122 } 123 124 @autoreleasepool { 125 auto objectNS = adoptNS((NSObject *)[[NSString alloc] initWithFormat:@"%s", helloWorldCString]); 126 auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get()); 127 EXPECT_EQ(objectNS.get(), checked_objc_cast<NSString>((__bridge NSObject *)(CFTypeRef)objectNSPtr)); 128 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr)); 129 } 130 131 @autoreleasepool { 132 auto objectNS = adoptNS([[NSString alloc] initWithFormat:@"%s", helloWorldCString]); 133 auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get()); 134 EXPECT_EQ(objectNS.get(), checked_objc_cast<NSObject>((__bridge NSString *)(CFTypeRef)objectNSPtr)); 135 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr)); 58 136 } 59 137 } … … 63 141 EXPECT_EQ(nil, dynamic_objc_cast<NSString>(nil)); 64 142 65 { 66 auto object = adoptNS(reinterpret_cast<id>([[NSString alloc] initWithFormat:@"%s", "Hello world"])); 67 EXPECT_EQ(object.get(), dynamic_objc_cast<NSString>(object.get())); 68 EXPECT_EQ(object.get(), dynamic_objc_cast<NSObject>(object.get())); 69 EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(object.get())); 70 } 71 72 { 73 auto object = adoptNS(reinterpret_cast<NSObject *>([[NSString alloc] initWithFormat:@"%s", "Hello world"])); 74 EXPECT_EQ(object.get(), dynamic_objc_cast<NSString>(object.get())); 75 EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(object.get())); 76 } 77 78 { 79 auto object = adoptNS([[NSString alloc] initWithFormat:@"%s", "Hello world"]); 80 EXPECT_EQ(object.get(), dynamic_objc_cast<NSObject>(object.get())); 81 EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(object.get())); 82 } 83 84 { 85 auto object = adoptNS(reinterpret_cast<id>([[NSObject alloc] init])); 86 EXPECT_EQ(object.get(), dynamic_objc_cast<NSObject>(object.get())); 87 EXPECT_EQ(nil, dynamic_objc_cast<MyObjectSubtype>(object.get())); 88 } 89 90 { 91 auto object = adoptNS([[NSObject alloc] init]); 92 EXPECT_EQ(nil, dynamic_objc_cast<MyObjectSubtype>(object.get())); 93 } 94 } 95 96 TEST(TypeCastsCocoa, dynamic_ns_cast_RetainPtr) 97 { 98 { 143 @autoreleasepool { 144 auto objectNS = adoptNS<id>([[NSString alloc] initWithFormat:@"%s", helloWorldCString]); 145 auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get()); 146 EXPECT_EQ(objectNS.get(), dynamic_objc_cast<NSString>(objectNS.get())); 147 EXPECT_EQ(objectNS.get(), dynamic_objc_cast<NSObject>(objectNS.get())); 148 EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(objectNS.get())); 149 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr)); 150 } 151 152 @autoreleasepool { 153 auto objectNS = adoptNS<NSObject *>([[NSString alloc] initWithFormat:@"%s", helloWorldCString]); 154 auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get()); 155 EXPECT_EQ(objectNS.get(), dynamic_objc_cast<NSString>(objectNS.get())); 156 EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(objectNS.get())); 157 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr)); 158 } 159 160 @autoreleasepool { 161 auto objectNS = adoptNS([[NSString alloc] initWithFormat:@"%s", helloWorldCString]); 162 auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get()); 163 EXPECT_EQ(objectNS.get(), dynamic_objc_cast<NSObject>(objectNS.get())); 164 EXPECT_EQ(nil, dynamic_objc_cast<NSArray>(objectNS.get())); 165 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr)); 166 } 167 168 @autoreleasepool { 169 auto objectID = adoptNS<id>([[NSObject alloc] init]); 170 auto objectIDPtr = reinterpret_cast<uintptr_t>(objectID.get()); 171 EXPECT_EQ(objectID.get(), dynamic_objc_cast<NSObject>(objectID.get())); 172 EXPECT_EQ(nil, dynamic_objc_cast<MyObjectSubtype>(objectID.get())); 173 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectIDPtr)); 174 } 175 176 @autoreleasepool { 177 auto objectNS = adoptNS([[NSObject alloc] init]); 178 auto objectNSPtr = reinterpret_cast<uintptr_t>(objectNS.get()); 179 EXPECT_EQ(nil, dynamic_objc_cast<MyObjectSubtype>(objectNS.get())); 180 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectNSPtr)); 181 } 182 } 183 184 TEST(TypeCastsCocoa, dynamic_objc_cast_RetainPtr) 185 { 186 @autoreleasepool { 99 187 RetainPtr<NSString> object; 100 188 auto objectCast = dynamic_objc_cast<NSString>(WTFMove(object)); … … 103 191 } 104 192 105 { 106 auto object = adoptNS(reinterpret_cast<id>([[NSString alloc] initWithFormat:@"%s", "Hello world"])); 107 id objectPtr = object.get(); 193 @autoreleasepool { 194 auto object = adoptNS<id>([[NSString alloc] initWithFormat:@"%s", helloWorldCString]); 195 auto objectPtr = reinterpret_cast<uintptr_t>(object.get()); 196 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr)); 197 108 198 auto objectCast = dynamic_objc_cast<NSString>(WTFMove(object)); 109 EXPECT_EQ(nil, object.get()); 110 EXPECT_EQ(objectPtr, objectCast.get()); 111 objectPtr = nil; // For ARC. 112 EXPECT_EQ(1U, [objectCast retainCount]); 113 114 object = adoptNS(reinterpret_cast<id>([[NSString alloc] initWithFormat:@"%s", "Hello world"])); 115 objectPtr = object.get(); 199 auto objectCastPtr = reinterpret_cast<uintptr_t>(objectCast.get()); 200 EXPECT_EQ(nil, object.get()); 201 EXPECT_EQ(objectPtr, objectCastPtr); 202 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCastPtr)); 203 204 object = adoptNS<id>([[NSString alloc] initWithFormat:@"%s", helloWorldCString]); 205 objectPtr = reinterpret_cast<uintptr_t>(object.get()); 206 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr)); 207 116 208 auto objectCast2 = dynamic_objc_cast<NSObject>(WTFMove(object)); 117 EXPECT_EQ(nil, object.get()); 118 EXPECT_EQ(objectPtr, objectCast2.get()); 119 objectPtr = nil; // For ARC. 120 EXPECT_EQ(1U, [objectCast2 retainCount]); 121 122 object = adoptNS(reinterpret_cast<id>([[NSString alloc] initWithFormat:@"%s", "Hello world"])); 123 objectPtr = object.get(); 124 auto objectCast3 = dynamic_objc_cast<NSArray>(WTFMove(object)); 125 EXPECT_EQ(objectPtr, object.get()); 126 EXPECT_EQ(nil, objectCast3.get()); 127 objectPtr = nil; // For ARC. 128 EXPECT_EQ(1U, [object retainCount]); 129 } 130 131 { 132 auto object = adoptNS(reinterpret_cast<NSObject *>([[NSString alloc] initWithFormat:@"%s", "Hello world"])); 133 id objectPtr = object.get(); 134 auto objectCast = dynamic_objc_cast<NSString>(WTFMove(object)); 135 EXPECT_EQ(nil, object.get()); 136 EXPECT_EQ(objectPtr, objectCast.get()); 137 objectPtr = nil; 138 EXPECT_EQ(1U, [objectCast retainCount]); 139 140 object = adoptNS(reinterpret_cast<NSObject *>([[NSString alloc] initWithFormat:@"%s", "Hello world"])); 141 objectPtr = object.get(); 142 auto objectCast2 = dynamic_objc_cast<NSArray>(WTFMove(object)); 143 EXPECT_EQ(objectPtr, object.get()); 144 EXPECT_EQ(nil, objectCast2.get()); 145 objectPtr = nil; 146 EXPECT_EQ(1U, [object retainCount]); 147 } 148 149 { 150 auto object = adoptNS([[NSString alloc] initWithFormat:@"%s", "Hello world"]); 151 id objectPtr = object.get(); 209 auto objectCastPtr2 = reinterpret_cast<uintptr_t>(objectCast2.get()); 210 EXPECT_EQ(nil, object.get()); 211 EXPECT_EQ(objectPtr, objectCastPtr2); 212 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCastPtr2)); 213 214 object = adoptNS<id>([[NSString alloc] initWithFormat:@"%s", helloWorldCString]); 215 objectPtr = reinterpret_cast<uintptr_t>(object.get()); 216 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr)); 217 218 auto objectCastBad = dynamic_objc_cast<NSArray>(WTFMove(object)); 219 auto objectPtr2 = reinterpret_cast<uintptr_t>(object.get()); 220 EXPECT_EQ(objectPtr, objectPtr2); 221 EXPECT_EQ(nil, objectCastBad.get()); 222 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr2)); 223 } 224 225 @autoreleasepool { 226 auto object = adoptNS([[NSString alloc] initWithFormat:@"%s", helloWorldCString]); 227 auto objectPtr = reinterpret_cast<uintptr_t>(object.get()); 228 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr)); 229 152 230 auto objectCast = dynamic_objc_cast<NSObject>(WTFMove(object)); 153 EXPECT_EQ(nil, object.get()); 154 EXPECT_EQ(objectPtr, objectCast.get()); 155 objectPtr = nil; 156 EXPECT_EQ(1U, [objectCast retainCount]); 157 158 object = adoptNS([[NSString alloc] initWithFormat:@"%s", "Hello world"]); 159 objectPtr = object.get(); 160 auto objectCast2 = dynamic_objc_cast<NSArray>(WTFMove(object)); 161 EXPECT_EQ(objectPtr, object.get()); 162 EXPECT_EQ(nil, objectCast2.get()); 163 objectPtr = nil; 164 EXPECT_EQ(1U, [object retainCount]); 165 } 166 167 { 168 auto object = adoptNS(reinterpret_cast<id>([[NSObject alloc] init])); 169 id objectPtr = object.get(); 231 auto objectCastPtr = reinterpret_cast<uintptr_t>(objectCast.get()); 232 EXPECT_EQ(nil, object.get()); 233 EXPECT_EQ(objectPtr, objectCastPtr); 234 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCastPtr)); 235 } 236 237 @autoreleasepool { 238 auto object = adoptNS<id>([[NSObject alloc] init]); 239 auto objectPtr = reinterpret_cast<uintptr_t>(object.get()); 240 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr)); 241 170 242 auto objectCast = dynamic_objc_cast<NSObject>(WTFMove(object)); 171 EXPECT_EQ(nil, object.get()); 172 EXPECT_EQ(objectPtr, objectCast.get()); 173 objectPtr = nil; // For ARC. 174 EXPECT_EQ(1U, [objectCast retainCount]); 175 176 object = adoptNS(reinterpret_cast<id>([[NSObject alloc] init])); 177 objectPtr = object.get(); 178 auto objectCast2 = dynamic_objc_cast<MyObjectSubtype>(WTFMove(object)); 179 EXPECT_EQ(objectPtr, object.get()); 180 EXPECT_EQ(nil, objectCast2.get()); 181 objectPtr = nil; // For ARC. 182 EXPECT_EQ(1U, [object retainCount]); 183 } 184 185 { 186 auto object = adoptNS([[NSObject alloc] init]); 187 id objectPtr = object.get(); 188 auto objectCast = dynamic_objc_cast<MyObjectSubtype>(WTFMove(object)); 189 EXPECT_EQ(objectPtr, object.get()); 190 EXPECT_EQ(nil, objectCast.get()); 191 objectPtr = nil; // For ARC. 192 EXPECT_EQ(1U, [object retainCount]); 243 auto objectCastPtr = reinterpret_cast<uintptr_t>(objectCast.get()); 244 EXPECT_EQ(nil, object.get()); 245 EXPECT_EQ(objectPtr, objectCastPtr); 246 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectCastPtr)); 247 248 object = adoptNS<id>([[NSObject alloc] init]); 249 objectPtr = reinterpret_cast<uintptr_t>(object.get()); 250 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr)); 251 252 auto objectCastBad = dynamic_objc_cast<MyObjectSubtype>(WTFMove(object)); 253 EXPECT_EQ(nil, objectCastBad.get()); 254 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr)); 193 255 } 194 256 } -
trunk/Tools/TestWebKitAPI/Tests/WTF/ns/RetainPtr.mm
r278253 r283476 1 1 /* 2 * Copyright (C) 2011-20 18Apple Inc. All rights reserved.2 * Copyright (C) 2011-2021 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 28 28 29 29 #import "config.h" 30 31 30 #import <wtf/RetainPtr.h> 32 31 32 #if __has_feature(objc_arc) 33 #ifndef RETAIN_PTR_TEST_NAME 34 #error This tests RetainPtr.h with ARC disabled. 35 #endif 36 #define autorelease self 37 #endif 38 39 #ifndef RETAIN_PTR_TEST_NAME 40 #define RETAIN_PTR_TEST_NAME RetainPtr 41 #endif 42 33 43 namespace TestWebKitAPI { 34 44 35 TEST(R etainPtr, AdoptNS)45 TEST(RETAIN_PTR_TEST_NAME, AdoptNS) 36 46 { 37 47 RetainPtr<NSObject> object1 = adoptNS([[NSObject alloc] init]); 38 EXPECT_EQ(1, CFGetRetainCount(object1.get())); 48 auto objectPtr1 = reinterpret_cast<uintptr_t>(object1.get()); 49 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr1)); 39 50 40 51 RetainPtr<NSObject *> object2 = adoptNS([[NSObject alloc] init]); 41 EXPECT_EQ(1, CFGetRetainCount(object2.get())); 52 auto objectPtr2 = reinterpret_cast<uintptr_t>(object2.get()); 53 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr2)); 42 54 43 55 RetainPtr<id> object3 = adoptNS([[NSObject alloc] init]); 44 EXPECT_EQ(1, CFGetRetainCount(object3.get())); 45 } 46 47 TEST(RetainPtr, ConstructionFromMutableNSType) 56 auto objectPtr3 = reinterpret_cast<uintptr_t>(object3.get()); 57 EXPECT_EQ(1, CFGetRetainCount((CFTypeRef)objectPtr3)); 58 } 59 60 TEST(RETAIN_PTR_TEST_NAME, ConstructionFromMutableNSType) 48 61 { 49 62 NSMutableString *string = [NSMutableString stringWithUTF8String:"foo"]; … … 65 78 } 66 79 67 TEST(R etainPtr, ConstructionFromSameNSType)80 TEST(RETAIN_PTR_TEST_NAME, ConstructionFromSameNSType) 68 81 { 69 82 NSString *string = @"foo"; … … 85 98 } 86 99 87 TEST(R etainPtr, ConstructionFromSimilarNSType)100 TEST(RETAIN_PTR_TEST_NAME, ConstructionFromSimilarNSType) 88 101 { 89 102 NSString *string = @"foo"; … … 105 118 } 106 119 107 TEST(R etainPtr, ConstructionFromSimilarNSTypeReversed)120 TEST(RETAIN_PTR_TEST_NAME, ConstructionFromSimilarNSTypeReversed) 108 121 { 109 122 NSString *string = @"foo"; … … 125 138 } 126 139 127 TEST(R etainPtr, MoveAssignmentFromMutableNSType)140 TEST(RETAIN_PTR_TEST_NAME, MoveAssignmentFromMutableNSType) 128 141 { 129 142 NSMutableString *string = [NSMutableString stringWithUTF8String:"foo"]; … … 147 160 } 148 161 149 TEST(R etainPtr, MoveAssignmentFromSameNSType)162 TEST(RETAIN_PTR_TEST_NAME, MoveAssignmentFromSameNSType) 150 163 { 151 164 NSString *string = @"foo"; … … 169 182 } 170 183 171 TEST(R etainPtr, MoveAssignmentFromSimilarNSType)184 TEST(RETAIN_PTR_TEST_NAME, MoveAssignmentFromSimilarNSType) 172 185 { 173 186 NSString *string = @"foo"; … … 191 204 } 192 205 193 TEST(R etainPtr, MoveAssignmentFromSimilarNSTypeReversed)206 TEST(RETAIN_PTR_TEST_NAME, MoveAssignmentFromSimilarNSTypeReversed) 194 207 { 195 208 NSString *string = @"foo"; … … 213 226 } 214 227 215 TEST(R etainPtr, OptionalRetainPtrNS)228 TEST(RETAIN_PTR_TEST_NAME, OptionalRetainPtrNS) 216 229 { 217 230 // Test assignment from adoptNS(). 218 231 std::optional<RetainPtr<NSObject>> optionalObject1 = adoptNS([NSObject new]); 219 EXPECT_EQ(1, CFGetRetainCount(optionalObject1.value().get())); 232 auto optionalObjectPtr1 = reinterpret_cast<uintptr_t>(optionalObject1.value().get()); 233 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)optionalObjectPtr1)); 220 234 RetainPtr<NSObject> object1 = optionalObject1.value(); 221 235 EXPECT_EQ(optionalObject1.value(), object1); … … 226 240 optionalObject2 = retainPtr([[NSObject new] autorelease]); 227 241 } 228 EXPECT_EQ(1, CFGetRetainCount(optionalObject2.value().get())); 242 auto optionalObjectPtr2 = reinterpret_cast<uintptr_t>(optionalObject2.value().get()); 243 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)optionalObjectPtr2)); 229 244 RetainPtr<NSObject> object2 = optionalObject2.value(); 245 auto objectPtr2 = reinterpret_cast<uintptr_t>(object2.get()); 230 246 EXPECT_EQ(optionalObject2.value(), object2); 231 247 … … 247 263 248 264 // Test move from std::optional<RetainPtr<NSObject>>. 249 EXPECT_EQ(2 , CFGetRetainCount(object2.get()));265 EXPECT_EQ(2L, CFGetRetainCount((CFTypeRef)objectPtr2)); 250 266 optionalObject1 = WTFMove(optionalObject2); 251 EXPECT_EQ(2 , CFGetRetainCount(object2.get()));267 EXPECT_EQ(2L, CFGetRetainCount((CFTypeRef)objectPtr2)); 252 268 EXPECT_TRUE(optionalObject1.value()); 253 269 EXPECT_TRUE(optionalObject1.value().get()); … … 255 271 } 256 272 257 TEST(R etainPtr, RetainPtrNS)273 TEST(RETAIN_PTR_TEST_NAME, RetainPtrNS) 258 274 { 259 275 RetainPtr<NSObject> object1; … … 261 277 object1 = retainPtr([[NSObject new] autorelease]); 262 278 } 263 EXPECT_EQ(1, CFGetRetainCount(object1.get())); 279 auto objectPtr1 = reinterpret_cast<uintptr_t>(object1.get()); 280 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr1)); 264 281 265 282 RetainPtr<NSObject *> object2; … … 267 284 object2 = retainPtr([[NSObject new] autorelease]); 268 285 } 269 EXPECT_EQ(1, CFGetRetainCount(object2.get())); 286 auto objectPtr2 = reinterpret_cast<uintptr_t>(object2.get()); 287 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr2)); 270 288 271 289 RetainPtr<id> object3; … … 273 291 object3 = retainPtr([[NSObject new] autorelease]); 274 292 } 275 EXPECT_EQ(1, CFGetRetainCount(object3.get())); 293 auto objectPtr3 = reinterpret_cast<uintptr_t>(object3.get()); 294 EXPECT_EQ(1L, CFGetRetainCount((CFTypeRef)objectPtr3)); 276 295 } 277 296 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/QuickLook.mm
r273610 r283476 45 45 #import <WebKit/_WKDownloadDelegate.h> 46 46 #import <wtf/NeverDestroyed.h> 47 #import <wtf/ RetainPtr.h>47 #import <wtf/cocoa/TypeCastsCocoa.h> 48 48 49 49 using namespace TestWebKitAPI; … … 98 98 fileType = typeIdentifier; 99 99 100 mimeType = adoptCF(UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)typeIdentifier, kUTTagClassMIMEType));101 fileData = [NSData dataWithContentsOfURL:fileURL];100 mimeType = bridge_cast(adoptCF(UTTypeCopyPreferredTagWithClass(bridge_cast(typeIdentifier), kUTTagClassMIMEType))); 101 fileData = adoptNS([[NSData alloc] initWithContentsOfURL:fileURL]); 102 102 } 103 103
Note:
See TracChangeset
for help on using the changeset viewer.