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#include "config.h"
27#include "UIScriptController.h"
28
29#include "JSUIScriptController.h"
30#include "UIScriptContext.h"
31#include <JavaScriptCore/JSValueRef.h>
32#include <JavaScriptCore/OpaqueJSString.h>
33
34namespace WTR {
35
36DeviceOrientation* toDeviceOrientation(JSContextRef context, JSValueRef value)
37{
38 static DeviceOrientation values[] = {
39 DeviceOrientation::Portrait,
40 DeviceOrientation::PortraitUpsideDown,
41 DeviceOrientation::LandscapeLeft,
42 DeviceOrientation::LandscapeRight
43 };
44
45 auto option = adopt(JSValueToStringCopy(context, value, nullptr));
46 if (option.get()->string() == "portrait")
47 return &values[0];
48
49 if (option.get()->string() == "portrait-upsidedown")
50 return &values[1];
51
52 if (option.get()->string() == "landscape-left")
53 return &values[2];
54
55 if (option.get()->string() == "landscape-right")
56 return &values[3];
57
58 return nullptr;
59}
60
61UIScriptController::UIScriptController(UIScriptContext& context)
62 : m_context(&context)
63{
64}
65
66#if !PLATFORM(IOS_FAMILY)
67void UIScriptController::checkForOutstandingCallbacks()
68{
69}
70#endif
71
72void UIScriptController::contextDestroyed()
73{
74 m_context = nullptr;
75}
76
77void UIScriptController::makeWindowObject(JSContextRef context, JSObjectRef windowObject, JSValueRef* exception)
78{
79 setProperty(context, windowObject, "uiController", this, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, exception);
80}
81
82JSClassRef UIScriptController::wrapperClass()
83{
84 return JSUIScriptController::uIScriptControllerClass();
85}
86
87#if !PLATFORM(COCOA)
88void UIScriptController::doAsyncTask(JSValueRef)
89{
90}
91
92void simulateAccessibilitySettingsChangeNotification(JSValueRef)
93{
94}
95
96void UIScriptController::doAfterPresentationUpdate(JSValueRef)
97{
98}
99
100void UIScriptController::doAfterNextStablePresentationUpdate(JSValueRef)
101{
102}
103
104void UIScriptController::doAfterVisibleContentRectUpdate(JSValueRef)
105{
106}
107#endif
108
109void UIScriptController::setDidStartFormControlInteractionCallback(JSValueRef callback)
110{
111 m_context->registerCallback(callback, CallbackTypeDidStartFormControlInteraction);
112 platformSetDidStartFormControlInteractionCallback();
113}
114
115JSValueRef UIScriptController::didStartFormControlInteractionCallback() const
116{
117 return m_context->callbackWithID(CallbackTypeDidStartFormControlInteraction);
118}
119
120void UIScriptController::setDidEndFormControlInteractionCallback(JSValueRef callback)
121{
122 m_context->registerCallback(callback, CallbackTypeDidEndFormControlInteraction);
123 platformSetDidEndFormControlInteractionCallback();
124}
125
126JSValueRef UIScriptController::didEndFormControlInteractionCallback() const
127{
128 return m_context->callbackWithID(CallbackTypeDidEndFormControlInteraction);
129}
130
131void UIScriptController::setDidShowForcePressPreviewCallback(JSValueRef callback)
132{
133 m_context->registerCallback(callback, CallbackTypeDidShowForcePressPreview);
134 platformSetDidShowForcePressPreviewCallback();
135}
136
137JSValueRef UIScriptController::didShowForcePressPreviewCallback() const
138{
139 return m_context->callbackWithID(CallbackTypeDidShowForcePressPreview);
140}
141
142void UIScriptController::setDidDismissForcePressPreviewCallback(JSValueRef callback)
143{
144 m_context->registerCallback(callback, CallbackTypeDidDismissForcePressPreview);
145 platformSetDidDismissForcePressPreviewCallback();
146}
147
148JSValueRef UIScriptController::didDismissForcePressPreviewCallback() const
149{
150 return m_context->callbackWithID(CallbackTypeDidDismissForcePressPreview);
151}
152
153void UIScriptController::setWillBeginZoomingCallback(JSValueRef callback)
154{
155 m_context->registerCallback(callback, CallbackTypeWillBeginZooming);
156 platformSetWillBeginZoomingCallback();
157}
158
159JSValueRef UIScriptController::willBeginZoomingCallback() const
160{
161 return m_context->callbackWithID(CallbackTypeWillBeginZooming);
162}
163
164void UIScriptController::setDidEndZoomingCallback(JSValueRef callback)
165{
166 m_context->registerCallback(callback, CallbackTypeDidEndZooming);
167 platformSetDidEndZoomingCallback();
168}
169
170JSValueRef UIScriptController::didEndZoomingCallback() const
171{
172 return m_context->callbackWithID(CallbackTypeDidEndZooming);
173}
174
175void UIScriptController::setDidEndScrollingCallback(JSValueRef callback)
176{
177 m_context->registerCallback(callback, CallbackTypeDidEndScrolling);
178 platformSetDidEndScrollingCallback();
179}
180
181JSValueRef UIScriptController::didEndScrollingCallback() const
182{
183 return m_context->callbackWithID(CallbackTypeDidEndScrolling);
184}
185
186void UIScriptController::setDidShowKeyboardCallback(JSValueRef callback)
187{
188 m_context->registerCallback(callback, CallbackTypeDidShowKeyboard);
189 platformSetDidShowKeyboardCallback();
190}
191
192JSValueRef UIScriptController::didShowKeyboardCallback() const
193{
194 return m_context->callbackWithID(CallbackTypeDidShowKeyboard);
195}
196
197void UIScriptController::setDidHideKeyboardCallback(JSValueRef callback)
198{
199 m_context->registerCallback(callback, CallbackTypeDidHideKeyboard);
200 platformSetDidHideKeyboardCallback();
201}
202
203JSValueRef UIScriptController::didHideKeyboardCallback() const
204{
205 return m_context->callbackWithID(CallbackTypeDidHideKeyboard);
206}
207
208void UIScriptController::setDidShowMenuCallback(JSValueRef callback)
209{
210 m_context->registerCallback(callback, CallbackTypeDidShowMenu);
211 platformSetDidShowMenuCallback();
212}
213
214JSValueRef UIScriptController::didShowMenuCallback() const
215{
216 return m_context->callbackWithID(CallbackTypeDidShowMenu);
217}
218
219void UIScriptController::setDidHideMenuCallback(JSValueRef callback)
220{
221 m_context->registerCallback(callback, CallbackTypeDidHideMenu);
222 platformSetDidHideMenuCallback();
223}
224
225JSValueRef UIScriptController::didHideMenuCallback() const
226{
227 return m_context->callbackWithID(CallbackTypeDidHideMenu);
228}
229
230void UIScriptController::setWillPresentPopoverCallback(JSValueRef callback)
231{
232 m_context->registerCallback(callback, CallbackTypeWillPresentPopover);
233 platformSetWillPresentPopoverCallback();
234}
235
236JSValueRef UIScriptController::willPresentPopoverCallback() const
237{
238 return m_context->callbackWithID(CallbackTypeWillPresentPopover);
239}
240
241void UIScriptController::setDidDismissPopoverCallback(JSValueRef callback)
242{
243 m_context->registerCallback(callback, CallbackTypeDidDismissPopover);
244 platformSetDidDismissPopoverCallback();
245}
246
247JSValueRef UIScriptController::didDismissPopoverCallback() const
248{
249 return m_context->callbackWithID(CallbackTypeDidDismissPopover);
250}
251
252#if !PLATFORM(COCOA)
253
254void UIScriptController::zoomToScale(double, JSValueRef)
255{
256}
257
258void UIScriptController::setViewScale(double)
259{
260}
261
262void UIScriptController::setMinimumEffectiveWidth(double)
263{
264}
265
266void UIScriptController::setAllowsViewportShrinkToFit(bool)
267{
268}
269
270void UIScriptController::resignFirstResponder()
271{
272}
273
274void UIScriptController::simulateAccessibilitySettingsChangeNotification(JSValueRef)
275{
276}
277
278JSObjectRef UIScriptController::contentsOfUserInterfaceItem(JSStringRef interfaceItem) const
279{
280 return nullptr;
281}
282
283void UIScriptController::setDefaultCalendarType(JSStringRef calendarIdentifier)
284{
285}
286
287JSObjectRef UIScriptController::calendarType() const
288{
289 return nullptr;
290}
291
292void UIScriptController::toggleCapsLock(JSValueRef)
293{
294}
295
296#endif // !PLATFORM(COCOA)
297
298void UIScriptController::playBackEventStream(JSStringRef stream, JSValueRef callback)
299{
300 platformPlayBackEventStream(stream, callback);
301}
302
303#if !PLATFORM(IOS_FAMILY)
304void UIScriptController::touchDownAtPoint(long x, long y, long touchCount, JSValueRef)
305{
306}
307
308void UIScriptController::liftUpAtPoint(long x, long y, long touchCount, JSValueRef)
309{
310}
311
312void UIScriptController::singleTapAtPoint(long x, long y, JSValueRef)
313{
314}
315
316void UIScriptController::singleTapAtPointWithModifiers(long x, long y, JSValueRef modifierArray, JSValueRef callback)
317{
318}
319
320void UIScriptController::doubleTapAtPoint(long x, long y, JSValueRef)
321{
322}
323
324void UIScriptController::dragFromPointToPoint(long startX, long startY, long endX, long endY, double durationSeconds, JSValueRef callback)
325{
326}
327
328void UIScriptController::longPressAtPoint(long x, long y, JSValueRef)
329{
330}
331
332void UIScriptController::stylusDownAtPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
333{
334}
335
336void UIScriptController::stylusMoveToPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
337{
338}
339
340void UIScriptController::stylusUpAtPoint(long x, long y, JSValueRef callback)
341{
342}
343
344void UIScriptController::stylusTapAtPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef callback)
345{
346}
347
348void UIScriptController::stylusTapAtPointWithModifiers(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, JSValueRef modifierArray, JSValueRef callback)
349{
350}
351
352void UIScriptController::sendEventStream(JSStringRef eventsJSON, JSValueRef callback)
353{
354}
355
356void UIScriptController::enterText(JSStringRef)
357{
358}
359
360void UIScriptController::typeCharacterUsingHardwareKeyboard(JSStringRef, JSValueRef)
361{
362}
363
364void UIScriptController::keyDown(JSStringRef, JSValueRef)
365{
366}
367
368void UIScriptController::dismissFormAccessoryView()
369{
370}
371
372void UIScriptController::dismissFilePicker(JSValueRef)
373{
374}
375
376void UIScriptController::setTimePickerValue(long, long)
377{
378}
379
380void UIScriptController::selectFormAccessoryPickerRow(long)
381{
382}
383
384JSRetainPtr<JSStringRef> UIScriptController::textContentType() const
385{
386 return nullptr;
387}
388
389JSRetainPtr<JSStringRef> UIScriptController::selectFormPopoverTitle() const
390{
391 return nullptr;
392}
393
394JSRetainPtr<JSStringRef> UIScriptController::formInputLabel() const
395{
396 return nullptr;
397}
398
399bool UIScriptController::isPresentingModally() const
400{
401 return false;
402}
403
404double UIScriptController::contentOffsetX() const
405{
406 return 0;
407}
408
409double UIScriptController::contentOffsetY() const
410{
411 return 0;
412}
413
414bool UIScriptController::scrollUpdatesDisabled() const
415{
416 return false;
417}
418
419void UIScriptController::setScrollUpdatesDisabled(bool)
420{
421}
422
423void UIScriptController::scrollToOffset(long x, long y)
424{
425}
426
427void UIScriptController::immediateScrollToOffset(long x, long y)
428{
429}
430
431void UIScriptController::immediateScrollElementAtContentPointToOffset(long x, long y, long xScrollOffset, long yScrollOffset)
432{
433}
434
435void UIScriptController::immediateZoomToScale(double scale)
436{
437}
438
439void UIScriptController::keyboardAccessoryBarNext()
440{
441}
442
443void UIScriptController::keyboardAccessoryBarPrevious()
444{
445}
446
447void UIScriptController::applyAutocorrection(JSStringRef, JSStringRef, JSValueRef)
448{
449}
450
451bool UIScriptController::isShowingKeyboard() const
452{
453 return false;
454}
455
456double UIScriptController::zoomScale() const
457{
458 return 1;
459}
460
461double UIScriptController::minimumZoomScale() const
462{
463 return 1;
464}
465
466double UIScriptController::maximumZoomScale() const
467{
468 return 1;
469}
470
471Optional<bool> UIScriptController::stableStateOverride() const
472{
473 return WTF::nullopt;
474}
475
476void UIScriptController::setStableStateOverride(Optional<bool>)
477{
478}
479
480JSObjectRef UIScriptController::contentVisibleRect() const
481{
482 return nullptr;
483}
484
485JSObjectRef UIScriptController::textSelectionRangeRects() const
486{
487 return nullptr;
488}
489
490JSObjectRef UIScriptController::textSelectionCaretRect() const
491{
492 return nullptr;
493}
494
495JSObjectRef UIScriptController::selectionStartGrabberViewRect() const
496{
497 return nullptr;
498}
499
500JSObjectRef UIScriptController::selectionCaretViewRect() const
501{
502 return nullptr;
503}
504
505JSObjectRef UIScriptController::selectionRangeViewRects() const
506{
507 return nullptr;
508}
509
510JSObjectRef UIScriptController::selectionEndGrabberViewRect() const
511{
512 return nullptr;
513}
514
515JSObjectRef UIScriptController::inputViewBounds() const
516{
517 return nullptr;
518}
519
520void UIScriptController::removeAllDynamicDictionaries()
521{
522}
523
524JSRetainPtr<JSStringRef> UIScriptController::scrollingTreeAsText() const
525{
526 return nullptr;
527}
528
529JSObjectRef UIScriptController::propertiesOfLayerWithID(uint64_t layerID) const
530{
531 return nullptr;
532}
533
534void UIScriptController::platformSetDidStartFormControlInteractionCallback()
535{
536}
537
538void UIScriptController::platformSetDidEndFormControlInteractionCallback()
539{
540}
541
542void UIScriptController::platformSetDidShowForcePressPreviewCallback()
543{
544}
545
546void UIScriptController::platformSetDidDismissForcePressPreviewCallback()
547{
548}
549
550void UIScriptController::platformSetWillBeginZoomingCallback()
551{
552}
553
554void UIScriptController::platformSetDidEndZoomingCallback()
555{
556}
557
558void UIScriptController::platformSetDidEndScrollingCallback()
559{
560}
561
562void UIScriptController::platformSetDidShowKeyboardCallback()
563{
564}
565
566void UIScriptController::platformSetDidHideKeyboardCallback()
567{
568}
569
570void UIScriptController::platformSetDidShowMenuCallback()
571{
572}
573
574void UIScriptController::platformSetDidHideMenuCallback()
575{
576}
577
578bool UIScriptController::isShowingPopover() const
579{
580 return false;
581}
582
583void UIScriptController::platformSetWillPresentPopoverCallback()
584{
585}
586
587void UIScriptController::platformSetDidDismissPopoverCallback()
588{
589}
590
591JSObjectRef UIScriptController::menuRect() const
592{
593 return nullptr;
594}
595
596JSObjectRef UIScriptController::rectForMenuAction(JSStringRef) const
597{
598 return nullptr;
599}
600
601bool UIScriptController::isDismissingMenu() const
602{
603 return false;
604}
605
606bool UIScriptController::isShowingMenu() const
607{
608 return false;
609}
610
611void UIScriptController::platformClearAllCallbacks()
612{
613}
614
615void UIScriptController::retrieveSpeakSelectionContent(JSValueRef)
616{
617}
618
619JSRetainPtr<JSStringRef> UIScriptController::accessibilitySpeakSelectionContent() const
620{
621 return nullptr;
622}
623
624void UIScriptController::setSafeAreaInsets(double top, double right, double bottom, double left)
625{
626}
627
628void UIScriptController::drawSquareInEditableImage()
629{
630}
631
632long UIScriptController::numberOfStrokesInEditableImage()
633{
634 return 0;
635}
636
637JSObjectRef UIScriptController::attachmentInfo(JSStringRef)
638{
639 return nullptr;
640}
641
642void UIScriptController::setKeyboardInputModeIdentifier(JSStringRef)
643{
644}
645
646void UIScriptController::setHardwareKeyboardAttached(bool)
647{
648}
649
650#endif
651
652#if !PLATFORM(COCOA)
653
654void UIScriptController::simulateRotation(DeviceOrientation*, JSValueRef callback)
655{
656}
657
658void UIScriptController::simulateRotationLikeSafari(DeviceOrientation*, JSValueRef callback)
659{
660}
661
662void UIScriptController::findString(JSStringRef, unsigned long options, unsigned long maxCount)
663{
664}
665
666void UIScriptController::removeViewFromWindow(JSValueRef)
667{
668}
669
670void UIScriptController::addViewToWindow(JSValueRef)
671{
672}
673
674void UIScriptController::beginBackSwipe(JSValueRef callback)
675{
676}
677
678void UIScriptController::completeBackSwipe(JSValueRef callback)
679{
680}
681
682void UIScriptController::setShareSheetCompletesImmediatelyWithResolution(bool)
683{
684}
685
686bool UIScriptController::isShowingDataListSuggestions() const
687{
688 return false;
689}
690
691void UIScriptController::overridePreference(JSStringRef, JSStringRef)
692{
693}
694
695JSRetainPtr<JSStringRef> UIScriptController::lastUndoLabel() const
696{
697 return nullptr;
698}
699
700JSRetainPtr<JSStringRef> UIScriptController::firstRedoLabel() const
701{
702 return nullptr;
703}
704
705#endif // !PLATFORM(COCOA)
706
707#if !PLATFORM(MAC)
708
709void UIScriptController::replaceTextAtRange(JSStringRef, int, int)
710{
711}
712
713void UIScriptController::platformPlayBackEventStream(JSStringRef, JSValueRef)
714{
715}
716
717void UIScriptController::firstResponderSuppressionForWebView(bool)
718{
719}
720
721void UIScriptController::makeWindowContentViewFirstResponder()
722{
723}
724
725bool UIScriptController::isWindowContentViewFirstResponder() const
726{
727 return false;
728}
729
730#endif
731
732void UIScriptController::uiScriptComplete(JSStringRef result)
733{
734 m_context->requestUIScriptCompletion(result);
735 platformClearAllCallbacks();
736}
737
738}
739