REGRESSION (r238635): Dragging a text selection within WKWebView causes the selection...
[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_FAMILY)
36 #import "UIKitSPI.h"
37 #import <UIKit/NSItemProvider+UIKitAdditions.h>
38 #endif
39
40 #if PLATFORM(IOS_FAMILY)
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_FAMILY)
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 - (void)endDataTransfer;
83 - (void)clearExternalDragInformation;
84 @property (nonatomic, readonly) NSArray<_WKAttachment *> *insertedAttachments;
85 @property (nonatomic, readonly) NSArray<_WKAttachment *> *removedAttachments;
86 @property (nonatomic, readonly) TestWKWebView *webView;
87
88 #if PLATFORM(IOS_FAMILY)
89
90 - (instancetype)initWithWebView:(TestWKWebView *)webView;
91 - (void)runFrom:(CGPoint)startLocation to:(CGPoint)endLocation additionalItemRequestLocations:(ProgressToCGPointValueMap)additionalItemRequestLocations;
92 - (void)ensureInputSession;
93
94 @property (nonatomic, readonly) DragAndDropPhase phase;
95 @property (nonatomic) BOOL allowsFocusToStartInputSession;
96 @property (nonatomic) BOOL shouldEnsureUIApplication;
97 @property (nonatomic) BOOL shouldAllowMoveOperation;
98 @property (nonatomic) BlockPtr<BOOL(_WKActivatedElementInfo *)> showCustomActionSheetBlock;
99 @property (nonatomic) BlockPtr<NSArray *(NSItemProvider *, NSArray *, NSDictionary *)> convertItemProvidersBlock;
100 @property (nonatomic) BlockPtr<NSArray *(id <UIDropSession>)> overridePerformDropBlock;
101 @property (nonatomic, strong) NSArray *externalItemProviders;
102 @property (nonatomic) BlockPtr<NSUInteger(NSUInteger, id)> overrideDragUpdateBlock;
103 @property (nonatomic) BlockPtr<void(BOOL, NSArray *)> dropCompletionBlock;
104
105 @property (nonatomic, readonly) NSArray *sourceItemProviders;
106 @property (nonatomic, readonly) NSArray *observedEventNames;
107 @property (nonatomic, readonly) NSArray *finalSelectionRects;
108 @property (nonatomic, readonly) CGRect lastKnownDragCaretRect;
109 @property (nonatomic, readonly) NSArray<UITargetedDragPreview *> *liftPreviews;
110 @property (nonatomic, readonly) BOOL suppressedSelectionCommandsDuringDrop;
111
112 #endif // PLATFORM(IOS_FAMILY)
113
114 #if PLATFORM(MAC)
115
116 @property (nonatomic, readonly) id <NSDraggingInfo> draggingInfo;
117 @property (nonatomic, readonly) NSPoint initialDragImageLocationInView;
118 @property (nonatomic, readonly) NSDragOperation currentDragOperation;
119 @property (nonatomic, strong) NSPasteboard *externalDragPasteboard;
120 @property (nonatomic, strong) NSImage *externalDragImage;
121 @property (nonatomic, readonly) NSArray<NSURL *> *externalPromisedFiles;
122 @property (nonatomic, copy) dispatch_block_t willEndDraggingHandler;
123
124 - (void)writePromisedFiles:(NSArray<NSURL *> *)fileURLs;
125 - (void)writeFiles:(NSArray<NSURL *> *)fileURLs;
126 - (NSArray<NSURL *> *)receivePromisedFiles;
127
128 #endif // PLATFORM(MAC)
129
130 @end
131
132 #endif // ENABLE(DRAG_SUPPORT) && WK_API_ENABLED