Make it possible to test non-stable-state scrolling on iOS
[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::doAsyncTask(JSValueRef callback)
42 {
43     unsigned callbackID = m_context->prepareForAsyncTask(callback, CallbackTypeNonPersistent);
44
45     dispatch_async(dispatch_get_main_queue(), ^{
46         if (!m_context)
47             return;
48         m_context->asyncTaskComplete(callbackID);
49     });
50 }
51
52 void UIScriptController::doAfterPresentationUpdate(JSValueRef callback)
53 {
54     return doAsyncTask(callback);
55 }
56
57 void UIScriptController::zoomToScale(double scale, JSValueRef callback)
58 {
59     RefPtr<UIScriptController> protectedThis(this);
60     unsigned callbackID = protectedThis->context()->prepareForAsyncTask(callback, CallbackTypeNonPersistent);
61
62     dispatch_async(dispatch_get_main_queue(), ^{
63         [gWebScrollView zoomToScale:scale animated:YES completionHandler:^{
64             if (!protectedThis->context())
65                 return;
66             protectedThis->context()->asyncTaskComplete(callbackID);
67         }];
68     });
69 }
70
71 void UIScriptController::simulateAccessibilitySettingsChangeNotification(JSValueRef)
72 {
73 }
74
75 double UIScriptController::zoomScale() const
76 {
77     return gWebScrollView.zoomScale;
78 }
79
80 void UIScriptController::touchDownAtPoint(long x, long y, long touchCount, JSValueRef callback)
81 {
82 }
83
84 void UIScriptController::liftUpAtPoint(long x, long y, long touchCount, JSValueRef callback)
85 {
86 }
87
88 void UIScriptController::singleTapAtPoint(long x, long y, JSValueRef callback)
89 {
90 }
91
92 void UIScriptController::doubleTapAtPoint(long x, long y, JSValueRef callback)
93 {
94 }
95
96 void UIScriptController::dragFromPointToPoint(long startX, long startY, long endX, long endY, double durationSeconds, JSValueRef callback)
97 {
98 }
99     
100 void UIScriptController::longPressAtPoint(long x, long y, JSValueRef)
101 {
102 }
103
104 void UIScriptController::stylusDownAtPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
105 {
106 }
107
108 void UIScriptController::stylusMoveToPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
109 {
110 }
111
112 void UIScriptController::stylusUpAtPoint(long x, long y, JSValueRef callback)
113 {
114 }
115
116 void UIScriptController::stylusTapAtPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
117 {
118 }
119
120 void UIScriptController::sendEventStream(JSStringRef eventsJSON, JSValueRef callback)
121 {
122 }
123
124 void UIScriptController::typeCharacterUsingHardwareKeyboard(JSStringRef character, JSValueRef callback)
125 {
126 }
127
128 void UIScriptController::selectTextCandidateAtIndex(long, JSValueRef)
129 {
130 }
131
132 void UIScriptController::keyDownUsingHardwareKeyboard(JSStringRef character, JSValueRef callback)
133 {
134 }
135
136 void UIScriptController::keyUpUsingHardwareKeyboard(JSStringRef character, JSValueRef callback)
137 {
138 }
139
140 void UIScriptController::dismissFormAccessoryView()
141 {
142 }
143
144 void UIScriptController::selectFormAccessoryPickerRow(long rowIndex)
145 {
146 }
147     
148 JSObjectRef UIScriptController::contentsOfUserInterfaceItem(JSStringRef interfaceItem) const
149 {
150     return nullptr;
151 }
152
153 static CGPoint contentOffsetBoundedInValidRange(UIScrollView *scrollView, CGPoint contentOffset)
154 {
155     UIEdgeInsets contentInsets = scrollView.contentInset;
156     CGSize contentSize = scrollView.contentSize;
157     CGSize scrollViewSize = scrollView.bounds.size;
158
159     CGFloat maxHorizontalOffset = contentSize.width + contentInsets.right - scrollViewSize.width;
160     contentOffset.x = std::min(maxHorizontalOffset, contentOffset.x);
161     contentOffset.x = std::max(-contentInsets.left, contentOffset.x);
162
163     CGFloat maxVerticalOffset = contentSize.height + contentInsets.bottom - scrollViewSize.height;
164     contentOffset.y = std::min(maxVerticalOffset, contentOffset.y);
165     contentOffset.y = std::max(-contentInsets.top, contentOffset.y);
166     return contentOffset;
167 }
168
169 void UIScriptController::scrollToOffset(long x, long y)
170 {
171     [gWebScrollView setContentOffset:contentOffsetBoundedInValidRange(gWebScrollView, CGPointMake(x, y)) animated:YES];
172 }
173
174 void UIScriptController::immediateScrollToOffset(long x, long y)
175 {
176     [gWebScrollView setContentOffset:contentOffsetBoundedInValidRange(gWebScrollView, CGPointMake(x, y)) animated:NO];
177 }
178
179 void UIScriptController::immediateZoomToScale(double scale)
180 {
181     [gWebScrollView setZoomScale:scale animated:NO];
182 }
183
184 void UIScriptController::keyboardAccessoryBarNext()
185 {
186 }
187
188 void UIScriptController::keyboardAccessoryBarPrevious()
189 {
190 }
191
192 double UIScriptController::minimumZoomScale() const
193 {
194     return gWebScrollView.minimumZoomScale;
195 }
196
197 double UIScriptController::maximumZoomScale() const
198 {
199     return gWebScrollView.maximumZoomScale;
200 }
201
202 Optional<bool> UIScriptController::stableStateOverride() const
203 {
204     return Nullopt;
205 }
206
207 void UIScriptController::setStableStateOverride(Optional<bool>)
208 {
209 }
210
211
212 JSObjectRef UIScriptController::contentVisibleRect() const
213 {
214     CGRect contentVisibleRect = [gWebBrowserView documentVisibleRect];
215     WebCore::FloatRect rect(contentVisibleRect.origin.x, contentVisibleRect.origin.y, contentVisibleRect.size.width, contentVisibleRect.size.height);
216     return m_context->objectFromRect(rect);
217 }
218
219 void UIScriptController::platformSetDidStartFormControlInteractionCallback()
220 {
221 }
222
223 void UIScriptController::platformSetDidEndFormControlInteractionCallback()
224 {
225 }
226     
227 void UIScriptController::platformSetDidShowForcePressPreviewCallback()
228 {
229 }
230
231 void UIScriptController::platformSetDidDismissForcePressPreviewCallback()
232 {
233 }
234
235 void UIScriptController::platformSetWillBeginZoomingCallback()
236 {
237 }
238
239 void UIScriptController::platformSetDidEndZoomingCallback()
240 {
241 }
242
243 void UIScriptController::platformSetDidShowKeyboardCallback()
244 {
245 }
246
247 void UIScriptController::platformSetDidHideKeyboardCallback()
248 {
249 }
250
251 void UIScriptController::platformSetDidEndScrollingCallback()
252 {
253 }
254
255 void UIScriptController::platformClearAllCallbacks()
256 {
257 }
258
259 JSObjectRef UIScriptController::selectionRangeViewRects() const
260 {
261     return nullptr;
262 }
263
264 void UIScriptController::removeAllDynamicDictionaries()
265 {
266 }
267
268 JSRetainPtr<JSStringRef> UIScriptController::scrollingTreeAsText() const
269 {
270     return nullptr;
271 }
272
273 }
274
275 #endif // PLATFORM(IOS)