NSFilesPromisePboardType drag from NSCollectionView works on macOS Sierra, causes crash on El Capitan
Originator: | boy | ||
Number: | rdar://28514083 | Date Originated: | 28-09-2016 |
Status: | Open | Resolved: | |
Product: | macOS SDK | Product Version: | |
Classification: | Crash/Hang/Data Loss | Reproducible: | Always |
Summary: Implementing drag-drop from an NSCollectionView with a NSFilesPromisePboardType causes some unexpected behaviour when used on macOS Sierra and El Capitan. The implementation that works for macOS Sierra, crashes on El Capitan. I've used the SlidesMagic NSCollectionView project from Ray Wenderlich as a base for the attached example project. The project contains various setups that can be used for testing in ViewController.swift, starting here from line 131. I've attached the project, but it can also be found here: https://github.com/boyvanamstel/NSFilesPromisePboardType-NSCollectionView-crash Steps to Reproduce: 1. Setup the NSCollectionView to allow content to be dragged from the grid. override func viewDidLoad() { super.viewDidLoad() collectionView.setDraggingSourceOperationMask(NSDragOperation.copy, forLocal: false) } extension ViewController : NSCollectionViewDelegate { [...] func collectionView(_ collectionView: NSCollectionView, writeItemsAt indexPaths: Set<IndexPath>, to pasteboard: NSPasteboard) -> Bool { pasteboard.clearContents() pasteboard.declareTypes([NSFilesPromisePboardType], owner: self) pasteboard.setPropertyList(["jpg"], forType: NSFilesPromisePboardType) return true } func collectionView(_ collectionView: NSCollectionView, namesOfPromisedFilesDroppedAtDestination dropURL: URL, forDraggedItemsAt indexPaths: Set<IndexPath>) -> [String] { // Write to file return [dropURL.appendingPathComponent("test.jpg").absoluteString] } // Seems redundant, but it's required by El Capitan. It causes a crash when running on El Capitan. func collectionView(_ collectionView: NSCollectionView, namesOfPromisedFilesDroppedAtDestination dropURL: URL, forDraggedItemsAt indexes: IndexSet) -> [String] { // Write to file return [dropURL.appendingPathComponent("test.jpg").absoluteString] } } 2. Compile the project and deploy it to a Mac running macOS El Capitan and one running macOS Sierra. 3. Try dragging one of the images from the NSCollectionView onto your Desktop, or a Finder window. 4. Drop the item. Expected Results: 1. The application should indicate that the item is draggable and show its intent to drop. 2. After dropping, nothing much should happen, but the app should keep running. Actual Results: On Sierra: The app keeps running. On El Capitan: The app crashes, taking Finder with it, with the following crash report: Process: SlidesMagic [913] Path: /Users/USER/Desktop/SlidesMagic.app/Contents/MacOS/SlidesMagic Identifier: com.razeware.SlidesMagic Version: 1.0 (1) Code Type: X86-64 (Native) Parent Process: ??? [1] Responsible: SlidesMagic [913] User ID: 501 Date/Time: 2016-09-28 11:35:18.315 +0200 OS Version: Mac OS X 10.11.6 (15G31) Report Version: 11 Anonymous UUID: E2E828C4-F4C1-2EE0-6239-2E04C93C5A34 Sleep/Wake UUID: FF367448-5269-4753-9E1F-5EA813163500 Time Awake Since Boot: 7300 seconds System Integrity Protection: enabled Crashed Thread: 0 Dispatch queue: com.apple.main-thread Exception Type: EXC_BAD_INSTRUCTION (SIGILL) Exception Codes: 0x0000000000000001, 0x0000000000000000 Exception Note: EXC_CORPSE_NOTIFY [...] Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 libswiftFoundation.dylib 0x000000010bf5b353 _TZFV10Foundation8IndexSet36_unconditionallyBridgeFromObjectiveCfGSqCSo10NSIndexSet_S0_ + 307 1 SlidesMagic 0x000000010b910b15 _TToFC11SlidesMagic14ViewController14collectionViewfTCSo16NSCollectionView40namesOfPromisedFilesDroppedAtDestinationV10Foundation3URL17forDraggedItemsAtVS2_8IndexSet_GSaSS_ + 101 2 com.apple.AppKit 0x00007fff8b5e0f75 -[NSCollectionView namesOfPromisedFilesDroppedAtDestination:] + 100 3 com.apple.AppKit 0x00007fff8b56024d -[NSFilePromiseDragSource getFilenamesAndDropLocation] + 70 4 com.apple.AppKit 0x00007fff8b0b9923 -[NSFilePromiseDragSource pasteboard:provideDataForType:itemIdentifier:] + 79 5 com.apple.AppKit 0x00007fff8b0b83e7 __NSPasteboardProvideData + 331 6 com.apple.CoreFoundation 0x00007fff94f3cc04 __CFPasteboardClientCallBack + 1364 7 com.apple.CoreFoundation 0x00007fff94f18628 __CFMessagePortPerform + 584 8 com.apple.CoreFoundation 0x00007fff94e80019 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41 9 com.apple.CoreFoundation 0x00007fff94e7ff89 __CFRunLoopDoSource1 + 473 10 com.apple.CoreFoundation 0x00007fff94e779bb __CFRunLoopRun + 2171 11 com.apple.CoreFoundation 0x00007fff94e76ed8 CFRunLoopRunSpecific + 296 12 com.apple.CoreFoundation 0x00007fff94edc925 CFMessagePortSendRequest + 949 13 com.apple.HIServices 0x00007fff9330e7dc SendDragIPCMessage + 530 14 com.apple.HIServices 0x00007fff93306b29 SendDropMessage + 64 15 com.apple.HIServices 0x00007fff93305807 DragInApplication + 505 16 com.apple.HIServices 0x00007fff933046cf CoreDragStartDragging + 705 17 com.apple.AppKit 0x00007fff8b01f369 -[NSCoreDragManager _dragUntilMouseUp:accepted:] + 1010 18 com.apple.AppKit 0x00007fff8b01c557 -[NSCoreDragManager dragImage:fromWindow:at:offset:event:pasteboard:source:slideBack:] + 1212 19 com.apple.AppKit 0x00007fff8b01c089 -[NSWindow(NSDrag) dragImage:at:offset:event:pasteboard:source:slideBack:] + 135 20 com.apple.AppKit 0x00007fff8b5e1543 -[NSCollectionView _startDragWithItemsAtIndexPaths:event:pasteboard:] + 345 21 com.apple.AppKit 0x00007fff8b5e178a -[NSCollectionView _writeToPasteboardAndBeginDragForIndexPaths:event:] + 182 22 com.apple.AppKit 0x00007fff8b45559f -[NSCollectionViewMouseSession _performDragFromMouseDown:] + 774 23 com.apple.AppKit 0x00007fff8b455c5e -[NSCollectionViewMouseSession handleEvent:] + 927 24 com.apple.AppKit 0x00007fff8b45644d -[NSCollectionViewMouseSession trackWithEvent:] + 132 25 com.apple.AppKit 0x00007fff8b5e0724 -[NSCollectionView mouseDown:] + 213 26 com.apple.AppKit 0x00007fff8aeed634 forwardMethod + 126 27 com.apple.AppKit 0x00007fff8aeed634 forwardMethod + 126 28 com.apple.AppKit 0x00007fff8aeed634 forwardMethod + 126 29 com.apple.AppKit 0x00007fff8afdbc8e -[NSControl mouseDown:] + 1091 30 com.apple.AppKit 0x00007fff8b5303c9 -[NSWindow _handleMouseDownEvent:isDelayedEvent:] + 6322 31 com.apple.AppKit 0x00007fff8b5313ad -[NSWindow _reallySendEvent:isDelayedEvent:] + 212 32 com.apple.AppKit 0x00007fff8af70539 -[NSWindow sendEvent:] + 517 33 com.apple.AppKit 0x00007fff8aef0a38 -[NSApplication sendEvent:] + 2540 34 com.apple.AppKit 0x00007fff8ad57df2 -[NSApplication run] + 796 35 com.apple.AppKit 0x00007fff8ad21368 NSApplicationMain + 1176 36 SlidesMagic 0x000000010b916cb4 main + 84 37 libdyld.dylib 0x00007fff975f25ad start + 1 Version: Xcode Version 8.0 (8A218a) & 8.1 beta (8T29o) Notes: I have not been able to test compiling the app on macOS El Capitan. The bug seems to be present in the latest beta versions of Xcode and its SDKs. Configuration: OS X 10.12 Sierra (16A323) Xcode Version 8.0 (8A218a) & 8.1 beta (8T29o) 2,3 GHz Intel Core i7 16 GB 1600 MHz DDR3 Attachments: 'SlidesMagic-bugreport.zip' and 'SlidesMagic_2016-09-28-113531_Dangers-Mac.crash' were successfully uploaded.
Comments
Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at bugreport.apple.com before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!