[iOS] Crash in WebKit::WebPage::positionInformation via Range::startPosition
[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_FAMILY)
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::ensurePositionInformationIsUpToDateAt(long x, long y, JSValueRef callback)
67 {
68     return doAsyncTask(callback);
69 }
70
71 void UIScriptController::doAfterVisibleContentRectUpdate(JSValueRef callback)
72 {
73     doAsyncTask(callback);
74 }
75
76 void UIScriptController::zoomToScale(double scale, JSValueRef callback)
77 {
78     RefPtr<UIScriptController> protectedThis(this);
79     unsigned callbackID = protectedThis->context()->prepareForAsyncTask(callback, CallbackTypeNonPersistent);
80
81     dispatch_async(dispatch_get_main_queue(), ^{
82         [gWebScrollView zoomToScale:scale animated:YES completionHandler:^{
83             if (!protectedThis->context())
84                 return;
85             protectedThis->context()->asyncTaskComplete(callbackID);
86         }];
87     });
88 }
89
90 void UIScriptController::resignFirstResponder()
91 {
92 }
93
94 void UIScriptController::setViewScale(double)
95 {
96 }
97
98 void UIScriptController::setMinimumEffectiveWidth(double)
99 {
100 }
101
102 void UIScriptController::setAllowsViewportShrinkToFit(bool)
103 {
104 }
105
106 void UIScriptController::simulateAccessibilitySettingsChangeNotification(JSValueRef)
107 {
108 }
109
110 double UIScriptController::zoomScale() const
111 {
112     return gWebScrollView.zoomScale;
113 }
114
115 void UIScriptController::touchDownAtPoint(long x, long y, long touchCount, JSValueRef callback)
116 {
117 }
118
119 void UIScriptController::liftUpAtPoint(long x, long y, long touchCount, JSValueRef callback)
120 {
121 }
122
123 void UIScriptController::singleTapAtPoint(long x, long y, JSValueRef callback)
124 {
125 }
126
127 void UIScriptController::singleTapAtPointWithModifiers(long x, long y, JSValueRef modifierArray, JSValueRef callback)
128 {
129 }
130
131 void UIScriptController::doubleTapAtPoint(long x, long y, JSValueRef callback)
132 {
133 }
134
135 void UIScriptController::dragFromPointToPoint(long startX, long startY, long endX, long endY, double durationSeconds, JSValueRef callback)
136 {
137 }
138     
139 void UIScriptController::longPressAtPoint(long x, long y, JSValueRef)
140 {
141 }
142
143 void UIScriptController::stylusDownAtPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
144 {
145 }
146
147 void UIScriptController::stylusMoveToPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
148 {
149 }
150
151 void UIScriptController::stylusUpAtPoint(long x, long y, JSValueRef callback)
152 {
153 }
154
155 void UIScriptController::stylusTapAtPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
156 {
157 }
158
159 void UIScriptController::stylusTapAtPointWithModifiers(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef modifierArray, JSValueRef callback)
160 {
161 }
162
163 void UIScriptController::sendEventStream(JSStringRef eventsJSON, JSValueRef callback)
164 {
165 }
166
167 void UIScriptController::enterText(JSStringRef)
168 {
169 }
170
171 void UIScriptController::typeCharacterUsingHardwareKeyboard(JSStringRef character, JSValueRef callback)
172 {
173 }
174
175 void UIScriptController::keyDown(JSStringRef, JSValueRef)
176 {
177 }
178
179 void UIScriptController::dismissFormAccessoryView()
180 {
181 }
182
183 void UIScriptController::dismissFilePicker(JSValueRef)
184 {
185 }
186
187 void UIScriptController::setTimePickerValue(long, long)
188 {
189 }
190
191 void UIScriptController::setShareSheetCompletesImmediatelyWithResolution(bool)
192 {
193 }
194
195 void UIScriptController::selectFormAccessoryPickerRow(long rowIndex)
196 {
197 }
198
199 bool UIScriptController::isPresentingModally() const
200 {
201     return false;
202 }
203
204 JSRetainPtr<JSStringRef> UIScriptController::textContentType() const
205 {
206     return nullptr;
207 }
208
209 JSRetainPtr<JSStringRef> UIScriptController::selectFormPopoverTitle() const
210 {
211     return nullptr;
212 }
213
214 JSRetainPtr<JSStringRef> UIScriptController::formInputLabel() const
215 {
216     return nullptr;
217 }
218     
219 JSObjectRef UIScriptController::contentsOfUserInterfaceItem(JSStringRef interfaceItem) const
220 {
221     return nullptr;
222 }
223
224 static CGPoint contentOffsetBoundedInValidRange(UIScrollView *scrollView, CGPoint contentOffset)
225 {
226     UIEdgeInsets contentInsets = scrollView.contentInset;
227     CGSize contentSize = scrollView.contentSize;
228     CGSize scrollViewSize = scrollView.bounds.size;
229
230     CGFloat maxHorizontalOffset = contentSize.width + contentInsets.right - scrollViewSize.width;
231     contentOffset.x = std::min(maxHorizontalOffset, contentOffset.x);
232     contentOffset.x = std::max(-contentInsets.left, contentOffset.x);
233
234     CGFloat maxVerticalOffset = contentSize.height + contentInsets.bottom - scrollViewSize.height;
235     contentOffset.y = std::min(maxVerticalOffset, contentOffset.y);
236     contentOffset.y = std::max(-contentInsets.top, contentOffset.y);
237     return contentOffset;
238 }
239
240 double UIScriptController::contentOffsetX() const
241 {
242     return [gWebScrollView contentOffset].x;
243 }
244
245 double UIScriptController::contentOffsetY() const
246 {
247     return [gWebScrollView contentOffset].y;
248 }
249
250 bool UIScriptController::scrollUpdatesDisabled() const
251 {
252     return false;
253 }
254
255 void UIScriptController::setScrollUpdatesDisabled(bool)
256 {
257 }
258
259 void UIScriptController::scrollToOffset(long x, long y)
260 {
261     [gWebScrollView setContentOffset:contentOffsetBoundedInValidRange(gWebScrollView, CGPointMake(x, y)) animated:YES];
262 }
263
264 void UIScriptController::immediateScrollToOffset(long x, long y)
265 {
266     [gWebScrollView setContentOffset:contentOffsetBoundedInValidRange(gWebScrollView, CGPointMake(x, y)) animated:NO];
267 }
268
269 void UIScriptController::immediateScrollElementAtContentPointToOffset(long x, long y, long xScrollOffset, long yScrollOffset)
270 {
271 }
272
273 void UIScriptController::immediateZoomToScale(double scale)
274 {
275     [gWebScrollView setZoomScale:scale animated:NO];
276 }
277
278 void UIScriptController::keyboardAccessoryBarNext()
279 {
280 }
281
282 void UIScriptController::keyboardAccessoryBarPrevious()
283 {
284 }
285
286 void UIScriptController::applyAutocorrection(JSStringRef, JSStringRef, JSValueRef)
287 {
288 }
289
290 bool UIScriptController::isShowingKeyboard() const
291 {
292     return false;
293 }
294
295 bool UIScriptController::hasInputSession() const
296 {
297     return false;
298 }
299
300 double UIScriptController::minimumZoomScale() const
301 {
302     return gWebScrollView.minimumZoomScale;
303 }
304
305 double UIScriptController::maximumZoomScale() const
306 {
307     return gWebScrollView.maximumZoomScale;
308 }
309
310 Optional<bool> UIScriptController::stableStateOverride() const
311 {
312     return WTF::nullopt;
313 }
314
315 void UIScriptController::setStableStateOverride(Optional<bool>)
316 {
317 }
318
319 JSObjectRef UIScriptController::contentVisibleRect() const
320 {
321     CGRect contentVisibleRect = [gWebBrowserView documentVisibleRect];
322     WebCore::FloatRect rect(contentVisibleRect.origin.x, contentVisibleRect.origin.y, contentVisibleRect.size.width, contentVisibleRect.size.height);
323     return m_context->objectFromRect(rect);
324 }
325
326 void UIScriptController::platformSetDidStartFormControlInteractionCallback()
327 {
328 }
329
330 void UIScriptController::platformSetDidEndFormControlInteractionCallback()
331 {
332 }
333     
334 void UIScriptController::platformSetDidShowForcePressPreviewCallback()
335 {
336 }
337
338 void UIScriptController::platformSetDidDismissForcePressPreviewCallback()
339 {
340 }
341
342 void UIScriptController::platformSetWillBeginZoomingCallback()
343 {
344 }
345
346 void UIScriptController::platformSetDidEndZoomingCallback()
347 {
348 }
349
350 void UIScriptController::platformSetDidShowKeyboardCallback()
351 {
352 }
353
354 void UIScriptController::platformSetDidHideKeyboardCallback()
355 {
356 }
357
358 void UIScriptController::platformSetDidShowMenuCallback()
359 {
360 }
361
362 void UIScriptController::platformSetDidHideMenuCallback()
363 {
364 }
365
366 bool UIScriptController::isShowingPopover() const
367 {
368     return false;
369 }
370
371 void UIScriptController::platformSetWillPresentPopoverCallback()
372 {
373 }
374
375 void UIScriptController::platformSetDidDismissPopoverCallback()
376 {
377 }
378
379 JSObjectRef UIScriptController::rectForMenuAction(JSStringRef) const
380 {
381     return nullptr;
382 }
383
384 JSObjectRef UIScriptController::menuRect() const
385 {
386     return nullptr;
387 }
388
389 bool UIScriptController::isShowingMenu() const
390 {
391     return false;
392 }
393
394 bool UIScriptController::isDismissingMenu() const
395 {
396     return false;
397 }
398
399 void UIScriptController::platformSetDidEndScrollingCallback()
400 {
401 }
402
403 void UIScriptController::platformClearAllCallbacks()
404 {
405 }
406
407 JSObjectRef UIScriptController::textSelectionRangeRects() const
408 {
409     return nullptr;
410 }
411
412 JSObjectRef UIScriptController::textSelectionCaretRect() const
413 {
414     return nullptr;
415 }
416
417 JSObjectRef UIScriptController::inputViewBounds() const
418 {
419     return nullptr;
420 }
421
422 void UIScriptController::removeAllDynamicDictionaries()
423 {
424 }
425
426 JSRetainPtr<JSStringRef> UIScriptController::scrollingTreeAsText() const
427 {
428     return nullptr;
429 }
430
431 JSObjectRef UIScriptController::propertiesOfLayerWithID(uint64_t layerID) const
432 {
433     return nullptr;
434 }
435
436 void UIScriptController::retrieveSpeakSelectionContent(JSValueRef)
437 {
438 }
439
440 JSRetainPtr<JSStringRef> UIScriptController::accessibilitySpeakSelectionContent() const
441 {
442     return nullptr;
443 }
444
445 void UIScriptController::simulateRotation(DeviceOrientation*, JSValueRef)
446 {
447 }
448
449 void UIScriptController::simulateRotationLikeSafari(DeviceOrientation*, JSValueRef)
450 {
451 }
452
453 void UIScriptController::findString(JSStringRef, unsigned long options, unsigned long maxCount)
454 {
455 }
456
457 void UIScriptController::removeViewFromWindow(JSValueRef)
458 {
459 }
460
461 void UIScriptController::addViewToWindow(JSValueRef)
462 {
463 }
464
465 void UIScriptController::setSafeAreaInsets(double, double, double, double)
466 {
467 }
468
469 void UIScriptController::beginBackSwipe(JSValueRef callback)
470 {
471 }
472
473 void UIScriptController::completeBackSwipe(JSValueRef callback)
474 {
475 }
476
477 JSObjectRef UIScriptController::selectionStartGrabberViewRect() const
478 {
479     return nullptr;
480 }
481
482 JSObjectRef UIScriptController::selectionEndGrabberViewRect() const
483 {
484     return nullptr;
485 }
486
487 JSObjectRef UIScriptController::selectionCaretViewRect() const
488 {
489     return nullptr;
490 }
491
492 JSObjectRef UIScriptController::selectionRangeViewRects() const
493 {
494     return nullptr;
495 }
496
497 bool UIScriptController::isShowingDataListSuggestions() const
498 {
499     return false;
500 }
501
502 JSObjectRef UIScriptController::calendarType() const
503 {
504     return nullptr;
505 }
506
507 void UIScriptController::setDefaultCalendarType(JSStringRef calendarIdentifier)
508 {
509 }
510
511 void UIScriptController::overridePreference(JSStringRef, JSStringRef)
512 {
513 }
514
515 void UIScriptController::drawSquareInEditableImage()
516 {
517 }
518
519 long UIScriptController::numberOfStrokesInEditableImage()
520 {
521     return 0;
522 }
523
524 void UIScriptController::toggleCapsLock(JSValueRef callback)
525 {
526     doAsyncTask(callback);
527 }
528
529 JSObjectRef UIScriptController::attachmentInfo(JSStringRef)
530 {
531     return nullptr;
532 }
533
534 void UIScriptController::setKeyboardInputModeIdentifier(JSStringRef)
535 {
536 }
537
538 JSRetainPtr<JSStringRef> UIScriptController::lastUndoLabel() const
539 {
540     return nullptr;
541 }
542
543 JSRetainPtr<JSStringRef> UIScriptController::firstRedoLabel() const
544 {
545     return nullptr;
546 }
547
548 NSUndoManager *UIScriptController::platformUndoManager() const
549 {
550     return nil;
551 }
552
553 void UIScriptController::setHardwareKeyboardAttached(bool)
554 {
555 }
556
557 }
558
559 #endif // PLATFORM(IOS_FAMILY)