/*
 * 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;
    readonly attribute object contextMenuRect;
    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 setScrollViewKeyboardAvoidanceEnabled(boolean enabled);

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

    undefined setWebViewEditable(boolean editable);

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