[macOS] [WK2] Add infrastructure to test receiving file promises on drop
[WebKit-https.git] / Tools / TestWebKitAPI / cocoa / DragAndDropSimulator.h
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(DRAG_SUPPORT) && WK_API_ENABLED
29
30 #import "TestWKWebView.h"
31 #import <WebKit/WKUIDelegatePrivate.h>
32 #import <WebKit/_WKInputDelegate.h>
33 #import <wtf/BlockPtr.h>
34
35 #if PLATFORM(IOS)
36 #import "UIKitSPI.h"
37 #import <UIKit/NSItemProvider+UIKitAdditions.h>
38 #endif
39
40 #if PLATFORM(IOS)
41
42 typedef NS_ENUM(NSInteger, DragAndDropPhase) {
43     DragAndDropPhaseCancelled = 0,
44     DragAndDropPhaseBeginning = 1,
45     DragAndDropPhaseBegan = 2,
46     DragAndDropPhaseEntered = 3,
47     DragAndDropPhasePerformingDrop = 4
48 };
49
50 typedef NSDictionary<NSNumber *, NSValue *> *ProgressToCGPointValueMap;
51
52 @interface MockDragDropSession : NSObject <UIDragDropSession> {
53 @private
54     RetainPtr<NSArray> _mockItems;
55     RetainPtr<UIWindow> _window;
56 }
57 @property (nonatomic) CGPoint mockLocationInWindow;
58 @property (nonatomic) BOOL allowMove;
59 @end
60
61 @interface MockDropSession : MockDragDropSession <UIDropSession>
62 @end
63
64 @interface MockDragSession : MockDragDropSession <UIDragSession>
65 @end
66
67 @interface WKWebView (DragAndDropTesting)
68 - (id <UIDropInteractionDelegate>)dropInteractionDelegate;
69 - (id <UIDragInteractionDelegate>)dragInteractionDelegate;
70 - (UIDropInteraction *)dropInteraction;
71 - (UIDragInteraction *)dragInteraction;
72 @end
73
74 #endif // PLATFORM(IOS)
75
76 @interface DragAndDropSimulator : NSObject<WKUIDelegatePrivate, _WKInputDelegate>
77
78 - (instancetype)initWithWebViewFrame:(CGRect)frame;
79 - (instancetype)initWithWebViewFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration;
80 // The start location, end location, and locations of additional item requests are all in window coordinates.
81 - (void)runFrom:(CGPoint)startLocation to:(CGPoint)endLocation;
82 @property (nonatomic, readonly) NSArray<_WKAttachment *> *insertedAttachments;
83 @property (nonatomic, readonly) NSArray<_WKAttachment *> *removedAttachments;
84 @property (nonatomic, readonly) TestWKWebView *webView;
85
86 #if PLATFORM(IOS)
87
88 - (instancetype)initWithWebView:(TestWKWebView *)webView;
89 - (void)runFrom:(CGPoint)startLocation to:(CGPoint)endLocation additionalItemRequestLocations:(ProgressToCGPointValueMap)additionalItemRequestLocations;
90 - (void)waitForInputSession;
91 - (void)endDataTransfer;
92
93 @property (nonatomic, readonly) DragAndDropPhase phase;
94 @property (nonatomic) BOOL allowsFocusToStartInputSession;
95 @property (nonatomic) BOOL shouldEnsureUIApplication;
96 @property (nonatomic) BOOL shouldAllowMoveOperation;
97 @property (nonatomic) BlockPtr<BOOL(_WKActivatedElementInfo *)> showCustomActionSheetBlock;
98 @property (nonatomic) BlockPtr<NSArray *(UIItemProvider *, NSArray *, NSDictionary *)> convertItemProvidersBlock;
99 @property (nonatomic) BlockPtr<NSArray *(id <UIDropSession>)> overridePerformDropBlock;
100 @property (nonatomic, strong) NSArray *externalItemProviders;
101 @property (nonatomic) BlockPtr<NSUInteger(NSUInteger, id)> overrideDragUpdateBlock;
102 @property (nonatomic) BlockPtr<void(BOOL, NSArray *)> dropCompletionBlock;
103
104 @property (nonatomic, readonly) NSArray *sourceItemProviders;
105 @property (nonatomic, readonly) NSArray *observedEventNames;
106 @property (nonatomic, readonly) NSArray *finalSelectionRects;
107 @property (nonatomic, readonly) CGRect lastKnownDragCaretRect;
108 @property (nonatomic, readonly) NSArray<UITargetedDragPreview *> *liftPreviews;
109
110 #endif // PLATFORM(IOS)
111
112 #if PLATFORM(MAC)
113
114 @property (nonatomic, readonly) id <NSDraggingInfo> draggingInfo;
115 @property (nonatomic, readonly) NSPoint initialDragImageLocationInView;
116 @property (nonatomic, readonly) NSDragOperation currentDragOperation;
117 @property (nonatomic, strong) NSPasteboard *externalDragPasteboard;
118 @property (nonatomic, strong) NSImage *externalDragImage;
119 @property (nonatomic, readonly) NSArray<NSURL *> *externalPromisedFiles;
120 @property (nonatomic, copy) dispatch_block_t willEndDraggingHandler;
121
122 - (void)writePromisedFiles:(NSArray<NSURL *> *)fileURLs;
123 - (void)writeFiles:(NSArray<NSURL *> *)fileURLs;
124
125 #endif // PLATFORM(MAC)
126
127 @end
128
129 #endif // ENABLE(DRAG_SUPPORT) && WK_API_ENABLED