/*
 * Copyright (C) 2015-2018 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

enum DeviceOrientation {
    "portrait",
    "portrait-upsidedown",
    "landscape-left",
    "landscape-right"
};

enum ModifierKey {
    "alt",
    "capsLock",
    "ctrl",
    "meta", // Command key on Mac and iOS
    "shift"
};

dictionary ScrollToOptions {
    boolean unconstrained = false;
};

dictionary TextExtractionOptions {
    boolean clipToBounds = false;
    boolean includeRects = false;
};

interface UIScriptController {

    undefined doAsyncTask(object callback); // Used to test the harness.
    undefined uiScriptComplete(DOMString result);

    undefined doAfterPresentationUpdate(object callback); // Call the callback after sending a message to the WebProcess and receiving a subsequent update.
    undefined doAfterNextStablePresentationUpdate(object callback);
    undefined ensurePositionInformationIsUpToDateAt(long x, long y, object callback);
    undefined doAfterVisibleContentRectUpdate(object callback);
    undefined doAfterNextVisibleContentRectAndStablePresentationUpdate(object callback);

    undefined doAfterDoubleTapDelay(object callback);

    undefined simulateAccessibilitySettingsChangeNotification(object callback);

    // Interaction.
    // These functions post events asynchronously. The callback is fired when the events have been dispatched, but any
    // resulting behavior may also be asynchronous. Points are in "global" (WKWebView) coordinates.
    undefined touchDownAtPoint(long x, long y, long touchCount, object callback);
    undefined liftUpAtPoint(long x, long y, long touchCount, object callback);
    undefined singleTapAtPoint(long x, long y, object callback);
    undefined singleTapAtPointWithModifiers(long x, long y, object modifierArray, object callback);
    undefined twoFingerSingleTapAtPoint(long x, long y, object callback);
    undefined doubleTapAtPoint(long x, long y, float delay, object callback);
    undefined dragFromPointToPoint(long startX, long startY, long endX, long endY, double durationSeconds, object callback);

    undefined activateAtPoint(long x, long y, object callback);

    undefined longPressAtPoint(long x, long y, object callback);

    undefined stylusDownAtPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, object callback);
    undefined stylusMoveToPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, object callback);
    undefined stylusUpAtPoint(long x, long y, object callback);
    undefined stylusTapAtPoint(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, object callback);
    undefined stylusTapAtPointWithModifiers(long x, long y, float azimuthAngle, float altitudeAngle, float pressure, object modifierArray, object callback);

    undefined enterText(DOMString text);
    undefined typeCharacterUsingHardwareKeyboard(DOMString character, object callback);

    undefined keyDown(DOMString character, object modifierArray);
    undefined toggleCapsLock(object callback);
    undefined setContinuousSpellCheckingEnabled(boolean enabled);
    undefined setSpellCheckerResults(object results);

    readonly attribute unsigned long keyboardWillHideCount;
    readonly attribute boolean keyboardIsAutomaticallyShifted;
    readonly attribute unsigned long keyboardUpdateForChangedSelectionCount;

    undefined rawKeyDown(DOMString key);
    undefined rawKeyUp(DOMString key);

    readonly attribute boolean isAnimatingDragCancel;
    readonly attribute DOMString selectionCaretBackgroundColor;
    readonly attribute object tapHighlightViewRect;

    // eventsJSON describes a series of user events in JSON form. For the keys, see HIDEventGenerator.mm.
    // For example, this JSON describes a touch down followed by a touch up (i.e. a single tap).
    //  {
    //      "events" : [
    //          {
    //              "inputType" : "hand",
    //              "timeOffset" : 0,
    //              "coordinateSpace" : "content",
    //              "touches" : [
    //                  {
    //                      "inputType" : "finger",
    //                      "phase" : "began",
    //                      "id" : 1,
    //                      "x" : 100,
    //                      "y" : 120
    //                  }
    //              ]
    //          },
    //          // This is a basic force press
    //          {
    //              "interpolate" : "linear",
    //              "timestep" : 0.025,
    //              "coordinateSpace" : "global",
    //              "startEvent" : {
    //                  "inputType" : "hand",
    //                  "timeOffset" : 0.025,
    //                  "touches" : [
    //                      {
    //                          "inputType" : "finger",
    //                          "phase" : "began",
    //                          "id" : 1,
    //                          "x" : 100,
    //                          "y" : 120,
    //                          "pressure" : 0
    //                      }
    //                  ]
    //              },
    //              "endEvent" : {
    //                  "inputType" : "hand",
    //                  "timeOffset" : 3.0,
    //                  "touches" : [
    //                      {
    //                          "inputType" : "finger",
    //                          "phase" : "stationary",
    //                          "id" : 1,
    //                          "x" : 100,
    //                          "y" : 120,
    //                          "pressure" : 500
    //                      }
    //                  ]
    //              }
    //          },
    //          //This is a basic drag
    //          {
    //              "interpolate" : "linear",
    //              "timestep" : 0.025,
    //              "coordinateSpace" : "content",
    //              "startEvent" : {
    //                  "inputType" : "hand",
    //                  "timeOffset" : 3.025,
    //                  "touches" : [
    //                      {
    //                          "inputType" : "finger",
    //                          "phase" : "moved",
    //                          "id" : 1,
    //                          "x" : 100,
    //                          "y" : 120,
    //                          "pressure" : 0
    //                      }
    //                  ]
    //              },
    //              "endEvent" : {
    //                  "inputType" : "hand",
    //                  "timeOffset" : 4.0,
    //                  "touches" : [
    //                      {
    //                          "inputType" : "finger",
    //                          "phase" : "moved",
    //                          "id" : 1,
    //                          "x" : 20,
    //                          "y" : 40,
    //                          "pressure" : 0
    //                      }
    //                  ]
    //              }
    //          },
    //          //ending lift
    //          {
    //              "inputType" : "hand",
    //              "timeOffset" : 4.025, // seconds relative to the first event
    //              "coordinateSpace" : "content",
    //              "touches" : [
    //                  {
    //                      "inputType" : "finger",
    //                      "phase" : "ended",
    //                      "id" : 1,
    //                      "x" : 20,
    //                      "y" : 40
    //                  }
    //              ]
    //          },
    //      ]
    //  }
    undefined sendEventStream(DOMString eventsJSON, object callback);

    undefined beginBackSwipe(object callback);
    undefined completeBackSwipe(object callback);

    undefined playBackEventStream(DOMString eventStream, object callback);

    // Equivalent of pressing the Done button in the form accessory bar.
    undefined dismissFormAccessoryView();

    readonly attribute object filePickerAcceptedTypeIdentifiers;
    undefined dismissFilePicker(object callback);

    readonly attribute DOMString textContentType;

    // Form control handling
    attribute object didStartFormControlInteractionCallback;
    attribute object didEndFormControlInteractionCallback;

    // Pop Over preview handling
    attribute object didShowContextMenuCallback;
    attribute object didDismissContextMenuCallback;

    readonly attribute boolean isShowingContextMenu;

    // <select> picker
    undefined selectFormAccessoryPickerRow(long rowIndex);
    boolean selectFormAccessoryHasCheckedItemAtRow(long rowIndex);
    readonly attribute DOMString selectFormPopoverTitle;
    readonly attribute DOMString formInputLabel;

    undefined setTimePickerValue(long hour, long minute);
    readonly attribute double timePickerValueHour;
    readonly attribute double timePickerValueMinute;

    readonly attribute boolean isShowingDateTimePicker;
    readonly attribute double dateTimePickerValue;
    undefined chooseDateTimePickerValue();

    // <datalist>
    readonly attribute boolean isShowingDataListSuggestions;
    undefined activateDataListSuggestion(unsigned long index, object callback);

    // <input type=color>
    undefined setSelectedColorForColorPicker(double red, double green, double blue);

    undefined keyboardAccessoryBarNext();
    undefined keyboardAccessoryBarPrevious();

    undefined selectWordForReplacement();
    undefined applyAutocorrection(DOMString newString, DOMString oldString, object callback, boolean underline);

    // Returned object is a dictionary with the passed in string as a key for returned object
    object contentsOfUserInterfaceItem(DOMString interfaceItem);

    // These callbacks also work for the form accessory views.
    attribute object didShowKeyboardCallback;
    attribute object didHideKeyboardCallback;
    readonly attribute boolean isShowingKeyboard;
    readonly attribute boolean hasInputSession;
    attribute object willStartInputSessionCallback;

    attribute double suppressSoftwareKeyboard;
    attribute boolean windowIsKey;

    attribute object didShowMenuCallback;
    attribute object didHideMenuCallback;
    readonly attribute boolean isDismissingMenu;
    readonly attribute boolean isShowingMenu;
    readonly attribute object menuRect;
    readonly attribute object contextMenuRect;
    readonly attribute object contextMenuPreviewRect;
    object rectForMenuAction(DOMString action);
    undefined chooseMenuAction(DOMString action, object callback);
    undefined dismissMenu();

    readonly attribute boolean isShowingPopover;
    readonly attribute boolean isShowingFormValidationBubble;
    attribute object willPresentPopoverCallback;
    attribute object didDismissPopoverCallback;

    attribute object willBeginZoomingCallback;
    attribute object didEndZoomingCallback;

    attribute object willCreateNewPageCallback;

    undefined zoomToScale(double scale, object callback);

    undefined setViewScale(double scale);
    undefined setMinimumEffectiveWidth(double effectiveWidth);
    undefined setAllowsViewportShrinkToFit(boolean allows);

    undefined setScrollViewKeyboardAvoidanceEnabled(boolean enabled);

    undefined setAlwaysBounceVertical(boolean value);
    undefined setAlwaysBounceHorizontal(boolean value);

    undefined beginInteractiveObscuredInsetsChange();
    undefined endInteractiveObscuredInsetsChange();
    undefined setObscuredInsets(double top, double right, double bottom, double left);

    undefined becomeFirstResponder();
    undefined resignFirstResponder();
    readonly attribute boolean isPresentingModally;

    undefined copyText(DOMString text);
    undefined paste();
    readonly attribute long long pasteboardChangeCount;

    readonly attribute double contentOffsetX;
    readonly attribute double contentOffsetY;
    readonly attribute object adjustedContentInset; // An object with 'top', 'left', 'bottom', 'right' properties.

    attribute boolean scrollUpdatesDisabled; // Turns off notifications back to the web process after scrolls (used for testing scrolling tree).

    undefined scrollToOffset(long x, long y, ScrollToOptions options); // Initiate an animated scroll in the UI process.
    attribute object didEndScrollingCallback;

    undefined immediateScrollToOffset(long x, long y, ScrollToOptions options); // Set the scroll position in the UI process without animation.
    undefined immediateZoomToScale(double scale); // Set the zoom scale in the UI process without animation.

    // Find the scroller for the given point in content ("absolute") coordinates, and do an immediate scroll.
    undefined immediateScrollElementAtContentPointToOffset(long x, long y, long xOffset, long yOffset);

    // View state
    readonly attribute double zoomScale;
    readonly attribute double minimumZoomScale;
    readonly attribute double maximumZoomScale;
    readonly attribute boolean isZoomingOrScrolling;

    // Overides the "in stable state" behavior of WKWebView (only applies to iOS)
    // When false, content rect updates to the web process have inStableState=false, as if a scroll or zoom were in progress.
    attribute boolean? stableStateOverride;

    // The attributes below return an array of objects with 'left', 'top', 'width', and 'height' properties.
    readonly attribute object contentVisibleRect;
    readonly attribute object selectionStartGrabberViewRect;
    readonly attribute object selectionEndGrabberViewRect;
    readonly attribute object selectionEndGrabberViewShapePathDescription;
    readonly attribute object selectionCaretViewRect;
    readonly attribute object selectionCaretViewRectInGlobalCoordinates;
    readonly attribute object selectionRangeViewRects;

    readonly attribute object calendarType;
    undefined setDefaultCalendarType(DOMString calendarIdentifier, DOMString localeIdentifier);
    readonly attribute object inputViewBounds;

    undefined setKeyboardInputModeIdentifier(DOMString identifier);

    undefined replaceTextAtRange(DOMString text, long location, long length);

    readonly attribute DOMString scrollingTreeAsText;
    readonly attribute DOMString uiViewTreeAsText;
    readonly attribute DOMString caLayerTreeAsText;

    boolean mayContainEditableElementsInRect(unsigned long x, unsigned long y, unsigned long width, unsigned long height);

    object propertiesOfLayerWithID(unsigned long long layerID);
    
    DOMString scrollbarStateForScrollingNodeID(unsigned long long scrollingNodeID, unsigned long long processID, boolean isVertical);

    undefined retrieveSpeakSelectionContent(object callback);
    readonly attribute DOMString accessibilitySpeakSelectionContent;
    
    undefined simulateRotation(DeviceOrientation orientation, object callback);
    undefined simulateRotationLikeSafari(DeviceOrientation orientation, object callback);

    undefined findString(DOMString string, unsigned long options, unsigned long maxCount);

    undefined presentFindNavigator();
    undefined dismissFindNavigator();

    // Unparent and parent the web view, simulating, for example, tab switching.
    undefined removeViewFromWindow(object callback);
    undefined addViewToWindow(object callback);

    undefined resizeWindowTo(unsigned long width, unsigned long height);

    undefined installTapGestureOnWindow(object callback);

    undefined overridePreference(DOMString preference, DOMString value);

    undefined setSafeAreaInsets(double top, double right, double bottom, double left);

    undefined setAppAccentColor(unsigned short red, unsigned short green, unsigned short blue);

    undefined firstResponderSuppressionForWebView(boolean shouldSuppress);
    undefined makeWindowContentViewFirstResponder();
    readonly attribute boolean isWindowContentViewFirstResponder;
    readonly attribute boolean isWebContentFirstResponder;

    undefined setHardwareKeyboardAttached(boolean attached);

    undefined setWebViewEditable(boolean editable);

    readonly attribute object fixedContainerEdgeColors;
    undefined cancelFixedColorExtensionFadeAnimations();

    undefined cookiesForDomain(DOMString domain, object callback);

    // Only affects macOS.
    undefined setWebViewAllowsMagnification(boolean allowsMagnification);

    object attachmentInfo(DOMString attachmentIdentifier);
    undefined insertAttachmentForFilePath(DOMString filePath, DOMString contentType, object callback);

    attribute object didShowContactPickerCallback;
    attribute object didHideContactPickerCallback;
    undefined dismissContactPickerWithContacts(object contacts);
    readonly attribute boolean isShowingContactPicker;

    readonly attribute DOMString lastUndoLabel;
    readonly attribute DOMString firstRedoLabel;
    
    readonly attribute unsigned long countOfUpdatesWithLayerChanges;

    readonly attribute unsigned long long currentImageAnalysisRequestID;
    undefined installFakeMachineReadableCodeResultsForImageAnalysis();

    undefined setInlinePrediction(DOMString text, unsigned long startIndex);
    undefined acceptInlinePrediction();

    undefined requestTextExtraction(object callback, TextExtractionOptions options);

    undefined requestRenderedTextForFrontmostTarget(long x, long y, object callback);
    undefined adjustVisibilityForFrontmostTarget(long x, long y, object callback);
    undefined resetVisibilityAdjustments(object callback);

    DOMString frontmostViewAtPoint(long x, long y);
};
