[iOS] Can't select text after dismissing the keyboard when changing focus
[WebKit-https.git] / Tools / DumpRenderTree / ios / UIScriptControllerIOS.mm
1 /*
2  * Copyright (C) 2015 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 #import "config.h"
27 #import "UIScriptController.h"
28
29 #if PLATFORM(IOS)
30
31 #import "DumpRenderTreeBrowserView.h"
32 #import "UIScriptContext.h"
33 #import <WebCore/FloatRect.h>
34 #import <wtf/MainThread.h>
35
36 extern DumpRenderTreeBrowserView *gWebBrowserView;
37 extern DumpRenderTreeWebScrollView *gWebScrollView;
38
39 namespace WTR {
40     
41 void UIScriptController::checkForOutstandingCallbacks()
42 {
43 }
44
45 void UIScriptController::doAsyncTask(JSValueRef callback)
46 {
47     unsigned callbackID = m_context->prepareForAsyncTask(callback, CallbackTypeNonPersistent);
48
49     dispatch_async(dispatch_get_main_queue(), ^{
50         if (!m_context)
51             return;
52         m_context->asyncTaskComplete(callbackID);
53     });
54 }
55
56 void UIScriptController::doAfterPresentationUpdate(JSValueRef callback)
57 {
58     return doAsyncTask(callback);
59 }
60
61 void UIScriptController::doAfterNextStablePresentationUpdate(JSValueRef callback)
62 {
63     doAsyncTask(callback);
64 }
65
66 void UIScriptController::doAfterVisibleContentRectUpdate(JSValueRef callback)
67 {
68     doAsyncTask(callback);
69 }
70
71 void UIScriptController::zoomToScale(double scale, JSValueRef callback)
72 {
73     RefPtr<UIScriptController> protectedThis(this);
74     unsigned callbackID = protectedThis->context()->prepareForAsyncTask(callback, CallbackTypeNonPersistent);
75
76     dispatch_async(dispatch_get_main_queue(), ^{
77         [gWebScrollView zoomToScale:scale animated:YES completionHandler:^{
78             if (!protectedThis->context())
79                 return;
80             protectedThis->context()->asyncTaskComplete(callbackID);
81         }];
82     });
83 }
84
85 void UIScriptController::setViewScale(double)
86 {
87 }
88
89 void UIScriptController::simulateAccessibilitySettingsChangeNotification(JSValueRef)
90 {
91 }
92
93 double UIScriptController::zoomScale() const
94 {
95     return gWebScrollView.zoomScale;
96 }
97
98 void UIScriptController::touchDownAtPoint(long x, long y, long touchCount, JSValueRef callback)
99 {
100 }
101
102 void UIScriptController::liftUpAtPoint(long x, long y, long touchCount, JSValueRef callback)
103 {
104 }
105
106 void UIScriptController::singleTapAtPoint(long x, long y, JSValueRef callback)
107 {
108 }
109
110 void UIScriptController::doubleTapAtPoint(long x, long y, JSValueRef callback)
111 {
112 }
113
114 void UIScriptController::dragFromPointToPoint(long startX, long startY, long endX, long endY, double durationSeconds, JSValueRef callback)
115 {
116 }
117     
118 void UIScriptController::longPressAtPoint(long x, long y, JSValueRef)
119 {
120 }
121
122 void UIScriptController::stylusDownAtPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
123 {
124 }
125
126 void UIScriptController::stylusMoveToPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
127 {
128 }
129
130 void UIScriptController::stylusUpAtPoint(long x, long y, JSValueRef callback)
131 {
132 }
133
134 void UIScriptController::stylusTapAtPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
135 {
136 }
137
138 void UIScriptController::sendEventStream(JSStringRef eventsJSON, JSValueRef callback)
139 {
140 }
141
142 void UIScriptController::enterText(JSStringRef)
143 {
144 }
145
146 void UIScriptController::typeCharacterUsingHardwareKeyboard(JSStringRef character, JSValueRef callback)
147 {
148 }
149
150 void UIScriptController::keyDownUsingHardwareKeyboard(JSStringRef character, JSValueRef callback)
151 {
152 }
153
154 void UIScriptController::keyUpUsingHardwareKeyboard(JSStringRef character, JSValueRef callback)
155 {
156 }
157
158 void UIScriptController::dismissFormAccessoryView()
159 {
160 }
161
162 void UIScriptController::setTimePickerValue(long, long)
163 {
164 }
165
166 void UIScriptController::setShareSheetCompletesImmediatelyWithResolution(bool)
167 {
168 }
169
170 void UIScriptController::selectFormAccessoryPickerRow(long rowIndex)
171 {
172 }
173
174 JSRetainPtr<JSStringRef> UIScriptController::textContentType() const
175 {
176     return nullptr;
177 }
178
179 JSRetainPtr<JSStringRef> UIScriptController::selectFormPopoverTitle() const
180 {
181     return nullptr;
182 }
183
184 JSRetainPtr<JSStringRef> UIScriptController::formInputLabel() const
185 {
186     return nullptr;
187 }
188     
189 JSObjectRef UIScriptController::contentsOfUserInterfaceItem(JSStringRef interfaceItem) const
190 {
191     return nullptr;
192 }
193
194 static CGPoint contentOffsetBoundedInValidRange(UIScrollView *scrollView, CGPoint contentOffset)
195 {
196     UIEdgeInsets contentInsets = scrollView.contentInset;
197     CGSize contentSize = scrollView.contentSize;
198     CGSize scrollViewSize = scrollView.bounds.size;
199
200     CGFloat maxHorizontalOffset = contentSize.width + contentInsets.right - scrollViewSize.width;
201     contentOffset.x = std::min(maxHorizontalOffset, contentOffset.x);
202     contentOffset.x = std::max(-contentInsets.left, contentOffset.x);
203
204     CGFloat maxVerticalOffset = contentSize.height + contentInsets.bottom - scrollViewSize.height;
205     contentOffset.y = std::min(maxVerticalOffset, contentOffset.y);
206     contentOffset.y = std::max(-contentInsets.top, contentOffset.y);
207     return contentOffset;
208 }
209
210 void UIScriptController::scrollToOffset(long x, long y)
211 {
212     [gWebScrollView setContentOffset:contentOffsetBoundedInValidRange(gWebScrollView, CGPointMake(x, y)) animated:YES];
213 }
214
215 void UIScriptController::immediateScrollToOffset(long x, long y)
216 {
217     [gWebScrollView setContentOffset:contentOffsetBoundedInValidRange(gWebScrollView, CGPointMake(x, y)) animated:NO];
218 }
219
220 void UIScriptController::immediateZoomToScale(double scale)
221 {
222     [gWebScrollView setZoomScale:scale animated:NO];
223 }
224
225 void UIScriptController::keyboardAccessoryBarNext()
226 {
227 }
228
229 void UIScriptController::keyboardAccessoryBarPrevious()
230 {
231 }
232
233 void UIScriptController::applyAutocorrection(JSStringRef, JSStringRef, JSValueRef)
234 {
235 }
236
237 bool UIScriptController::isShowingKeyboard() const
238 {
239     return false;
240 }
241
242 double UIScriptController::minimumZoomScale() const
243 {
244     return gWebScrollView.minimumZoomScale;
245 }
246
247 double UIScriptController::maximumZoomScale() const
248 {
249     return gWebScrollView.maximumZoomScale;
250 }
251
252 std::optional<bool> UIScriptController::stableStateOverride() const
253 {
254     return std::nullopt;
255 }
256
257 void UIScriptController::setStableStateOverride(std::optional<bool>)
258 {
259 }
260
261 JSObjectRef UIScriptController::contentVisibleRect() const
262 {
263     CGRect contentVisibleRect = [gWebBrowserView documentVisibleRect];
264     WebCore::FloatRect rect(contentVisibleRect.origin.x, contentVisibleRect.origin.y, contentVisibleRect.size.width, contentVisibleRect.size.height);
265     return m_context->objectFromRect(rect);
266 }
267
268 void UIScriptController::platformSetDidStartFormControlInteractionCallback()
269 {
270 }
271
272 void UIScriptController::platformSetDidEndFormControlInteractionCallback()
273 {
274 }
275     
276 void UIScriptController::platformSetDidShowForcePressPreviewCallback()
277 {
278 }
279
280 void UIScriptController::platformSetDidDismissForcePressPreviewCallback()
281 {
282 }
283
284 void UIScriptController::platformSetWillBeginZoomingCallback()
285 {
286 }
287
288 void UIScriptController::platformSetDidEndZoomingCallback()
289 {
290 }
291
292 void UIScriptController::platformSetDidShowKeyboardCallback()
293 {
294 }
295
296 void UIScriptController::platformSetDidHideKeyboardCallback()
297 {
298 }
299
300 void UIScriptController::platformSetDidEndScrollingCallback()
301 {
302 }
303
304 void UIScriptController::platformClearAllCallbacks()
305 {
306 }
307
308 JSObjectRef UIScriptController::selectionRangeViewRects() const
309 {
310     return nullptr;
311 }
312
313 JSObjectRef UIScriptController::textSelectionCaretRect() const
314 {
315     return nullptr;
316 }
317
318 JSObjectRef UIScriptController::inputViewBounds() const
319 {
320     return nullptr;
321 }
322
323 void UIScriptController::removeAllDynamicDictionaries()
324 {
325 }
326
327 JSRetainPtr<JSStringRef> UIScriptController::scrollingTreeAsText() const
328 {
329     return nullptr;
330 }
331
332 JSObjectRef UIScriptController::propertiesOfLayerWithID(uint64_t layerID) const
333 {
334     return nullptr;
335 }
336
337 void UIScriptController::retrieveSpeakSelectionContent(JSValueRef)
338 {
339 }
340
341 JSRetainPtr<JSStringRef> UIScriptController::accessibilitySpeakSelectionContent() const
342 {
343     return nullptr;
344 }
345
346 void UIScriptController::simulateRotation(DeviceOrientation*, JSValueRef)
347 {
348 }
349
350 void UIScriptController::simulateRotationLikeSafari(DeviceOrientation*, JSValueRef)
351 {
352 }
353
354 void UIScriptController::findString(JSStringRef, unsigned long options, unsigned long maxCount)
355 {
356 }
357
358 void UIScriptController::removeViewFromWindow(JSValueRef)
359 {
360 }
361
362 void UIScriptController::addViewToWindow(JSValueRef)
363 {
364 }
365
366 void UIScriptController::setSafeAreaInsets(double, double, double, double)
367 {
368 }
369
370 void UIScriptController::beginBackSwipe(JSValueRef callback)
371 {
372 }
373
374 void UIScriptController::completeBackSwipe(JSValueRef callback)
375 {
376 }
377
378 JSObjectRef UIScriptController::selectionStartGrabberViewRect() const
379 {
380     return nullptr;
381 }
382
383 JSObjectRef UIScriptController::selectionEndGrabberViewRect() const
384 {
385     return nullptr;
386 }
387
388 }
389
390 #endif // PLATFORM(IOS)