/*
 * 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;
};

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 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 boolean keyboardIsAutomaticallyShifted;

    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 applyAutocorrection(DOMString newString, DOMString oldString, object callback);

    // 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;
    object rectForMenuAction(DOMString action);
    undefined chooseMenuAction(DOMString action, object callback);
    undefined dismissMenu();

    readonly attribute boolean isShowingPopover;
    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 becomeFirstResponder();
    undefined resignFirstResponder();
    readonly attribute boolean isPresentingModally;

    undefined copyText(DOMString text);
    undefined paste();

    readonly attribute double contentOffsetX;
    readonly attribute double contentOffsetY;

    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;

    // 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;

    readonly attribute object contentVisibleRect; // Returned object has 'left', 'top', 'width', 'height' properties.

    readonly attribute object textSelectionRangeRects; // An array of objects with 'left', 'top', 'width', and 'height' properties.
    readonly attribute object textSelectionCaretRect; // An object with 'left', 'top', 'width', 'height' properties.
    readonly attribute object selectionStartGrabberViewRect;
    readonly attribute object selectionEndGrabberViewRect;
    readonly attribute object selectionCaretViewRect;
    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;

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

    object propertiesOfLayerWithID(unsigned long long layerID);

    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);

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

    undefined installTapGestureOnWindow(object callback);

    undefined overridePreference(DOMString preference, DOMString value);

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

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

    undefined setHardwareKeyboardAttached(boolean attached);

    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;
};
