# Copyright (C) 2010-2016 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.

messages -> WebPage LegacyReceiver {
    SetInitialFocus(bool forward, bool isKeyboardEventValid, WebKit::WebKeyboardEvent event, uint64_t callbackID)
    SetViewState(unsigned viewState, bool wantsDidUpdateViewState, Vector<uint64_t> callbackIDs)
    SetLayerHostingMode(enum WebKit::LayerHostingMode layerHostingMode)

    SetSessionID(WebCore::SessionID sessionID)

    SetDrawsBackground(bool drawsBackground)

#if PLATFORM(COCOA)
    SetTopContentInsetFenced(float contentInset, IPC::Attachment fencePort)
#endif
    SetTopContentInset(float contentInset)

    SetUnderlayColor(WebCore::Color color)

    ViewWillStartLiveResize()
    ViewWillEndLiveResize()

    KeyEvent(WebKit::WebKeyboardEvent event)
    MouseEvent(WebKit::WebMouseEvent event)
#if PLATFORM(IOS)
    SetViewportConfigurationMinimumLayoutSize(WebCore::FloatSize size)
    SetMaximumUnobscuredSize(WebCore::FloatSize size)
    SetDeviceOrientation(int32_t deviceOrientation)
    DynamicViewportSizeUpdate(WebCore::FloatSize minimumLayoutSize, WebCore::FloatSize maximumUnobscuredSize, WebCore::FloatRect targetExposedContentRect, WebCore::FloatRect targetUnobscuredRect, WebCore::FloatRect targetUnobscuredRectInScrollViewCoordinates, double scale, int32_t deviceOrientation, uint64_t dynamicViewportSizeUpdateID)
    SynchronizeDynamicViewportUpdate() -> (double newTargetScale, WebCore::FloatPoint newScrollPosition, uint64_t nextValidLayerTreeTransactionID)

    HandleTap(WebCore::IntPoint point, uint64_t lastLayerTreeTransactionId)
    PotentialTapAtPosition(uint64_t requestID, WebCore::FloatPoint point)
    CommitPotentialTap(uint64_t lastLayerTreeTransactionId)
    CancelPotentialTap()
    TapHighlightAtPosition(uint64_t requestID, WebCore::FloatPoint point)
    InspectorNodeSearchMovedToPosition(WebCore::FloatPoint point)
    InspectorNodeSearchEndedAtPosition(WebCore::FloatPoint point)
    BlurAssistedNode()
    SelectWithGesture(WebCore::IntPoint point, uint32_t granularity, uint32_t gestureType, uint32_t gestureState, bool isInteractingWithAssistedNode, uint64_t callbackID)
    UpdateSelectionWithTouches(WebCore::IntPoint point, uint32_t touches, bool baseIsStart, uint64_t callbackID)
    UpdateBlockSelectionWithTouch(WebCore::IntPoint point, uint32_t touch, uint32_t handlePosition)
    SelectWithTwoTouches(WebCore::IntPoint from, WebCore::IntPoint to, uint32_t gestureType, uint32_t gestureState, uint64_t callbackID)
    ExtendSelection(uint32_t granularity)
    SelectWordBackward()
    MoveSelectionByOffset(int32_t offset, uint64_t callbackID)
    SelectTextWithGranularityAtPoint(WebCore::IntPoint point, uint32_t granularity, bool isInteractingWithAssistedNode, uint64_t callbackID)
    SelectPositionAtBoundaryWithDirection(WebCore::IntPoint point, uint32_t granularity, uint32_t direction, bool isInteractingWithAssistedNode, uint64_t callbackID)
    MoveSelectionAtBoundaryWithDirection(uint32_t granularity, uint32_t direction, uint64_t callbackID)
    SelectPositionAtPoint(WebCore::IntPoint point, bool isInteractingWithAssistedNode, uint64_t callbackID)
    BeginSelectionInDirection(uint32_t direction, uint64_t callbackID)
    UpdateSelectionWithExtentPoint(WebCore::IntPoint point, bool isInteractingWithAssistedNode, uint64_t callbackID)
    UpdateSelectionWithExtentPointAndBoundary(WebCore::IntPoint point, uint32_t granularity, bool isInteractingWithAssistedNode, uint64_t callbackID)
    RequestDictationContext(uint64_t callbackID)
    ReplaceDictatedText(String oldText, String newText)
    ReplaceSelectedText(String oldText, String newText)
    RequestAutocorrectionData(String textForAutocorrection, uint64_t callbackID)
    ApplyAutocorrection(String correction, String originalText, uint64_t callbackID)
    SyncApplyAutocorrection(String correction, String originalText) -> (bool autocorrectionApplied)
    RequestAutocorrectionContext(uint64_t callbackID)
    GetAutocorrectionContext() -> (String beforeContext, String markedText, String selectedText, String afterContext, uint64_t location, uint64_t length) 
    GetPositionInformation(WebCore::IntPoint point) -> (struct WebKit::InteractionInformationAtPosition information)
    RequestPositionInformation(WebCore::IntPoint point)
    StartInteractionWithElementAtPosition(WebCore::IntPoint point)
    StopInteraction()
    PerformActionOnElement(uint32_t action)
    FocusNextAssistedNode(bool isForward, uint64_t callbackID)
    SetAssistedNodeValue(String value)
    SetAssistedNodeValueAsNumber(double value)
    SetAssistedNodeSelectedIndex(uint32_t index, bool allowMultipleSelection)
    ApplicationWillResignActive()
    ApplicationDidEnterBackground(bool isSuspendedUnderLock)
    ApplicationDidFinishSnapshottingAfterEnteringBackground()
    ApplicationWillEnterForeground(bool isSuspendedUnderLock)
    ApplicationDidBecomeActive()
    ContentSizeCategoryDidChange(String contentSizeCategory)
    ExecuteEditCommandWithCallback(String name, uint64_t callbackID)
    GetSelectionContext(uint64_t callbackID)
    SetAllowsMediaDocumentInlinePlayback(bool allows)
    HandleTwoFingerTapAtPoint(WebCore::IntPoint point, uint64_t requestID)
    SetForceAlwaysUserScalable(bool userScalable)
#endif

    SetControlledByAutomation(bool controlled)

#if ENABLE(REMOTE_INSPECTOR)
    SetAllowsRemoteInspection(bool allow)
    SetRemoteInspectionNameOverride(String name)
#endif

#if ENABLE(IOS_TOUCH_EVENTS)
    TouchEventSync(WebKit::WebTouchEvent event) -> (bool handled)
#endif
#if !ENABLE(IOS_TOUCH_EVENTS) && ENABLE(TOUCH_EVENTS)
    TouchEvent(WebKit::WebTouchEvent event)
#endif

#if ENABLE(INPUT_TYPE_COLOR)
    DidEndColorPicker()
    DidChooseColor(WebCore::Color color)
#endif

#if ENABLE(CONTEXT_MENUS)
    ContextMenuHidden()
#endif

    ScrollBy(uint32_t scrollDirection, uint32_t scrollGranularity)
    CenterSelectionInVisibleArea()

    GoBack(uint64_t navigationID, uint64_t backForwardItemID)
    GoForward(uint64_t navigationID, uint64_t backForwardItemID)
    GoToBackForwardItem(uint64_t navigationID, uint64_t backForwardItemID)
    TryRestoreScrollPosition()

    LoadURLInFrame(String url, uint64_t frameID)
    LoadRequest(struct WebKit::LoadParameters loadParameters)
    LoadData(struct WebKit::LoadParameters loadParameters)
    LoadString(struct WebKit::LoadParameters loadParameters)
    LoadAlternateHTMLString(struct WebKit::LoadParameters loadParameters)

    NavigateToPDFLinkWithSimulatedClick(String url, WebCore::IntPoint documentPoint, WebCore::IntPoint screenPoint)

    Reload(uint64_t navigationID, bool reloadFromOrigin, bool contentBlockersEnabled, WebKit::SandboxExtension::Handle sandboxExtensionHandle)
    StopLoading()

    StopLoadingFrame(uint64_t frameID)
    
    RestoreSession(Vector<WebKit::BackForwardListItemState> itemStates)

    DidRemoveBackForwardItem(uint64_t backForwardItemID)

    DidReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, WebKit::DownloadID downloadID)

    ClearSelection()
    RestoreSelectionInFocusedEditableElement()

    # Callbacks.
    GetContentsAsString(uint64_t callbackID)
#if ENABLE(MHTML)
    GetContentsAsMHTMLData(uint64_t callbackID)
#endif
    GetMainResourceDataOfFrame(uint64_t frameID, uint64_t callbackID)
    GetResourceDataFromFrame(uint64_t frameID, String resourceURL, uint64_t callbackID)
    GetRenderTreeExternalRepresentation(uint64_t callbackID)
    GetSelectionOrContentsAsString(uint64_t callbackID)
    GetSelectionAsWebArchiveData(uint64_t callbackID)
    GetSourceForFrame(uint64_t frameID, uint64_t callbackID)
    GetWebArchiveOfFrame(uint64_t frameID, uint64_t callbackID)
    RunJavaScriptInMainFrame(String script, uint64_t callbackID)
    ForceRepaint(uint64_t callbackID)

#if PLATFORM(COCOA)
    # Dictionary support.
    PerformDictionaryLookupAtLocation(WebCore::FloatPoint point)
#endif

#if PLATFORM(MAC)
    PerformDictionaryLookupOfCurrentSelection()
    SetFont(String fontFamily, double fontSize, uint64_t fontTraits)
#endif

    PreferencesDidChange(struct WebKit::WebPreferencesStore store)

    SetUserAgent(String userAgent)
    SetCustomTextEncodingName(String encodingName)

    SuspendActiveDOMObjectsAndAnimations()
    ResumeActiveDOMObjectsAndAnimations()

    Close()
    TryClose()

    SetEditable(bool editable)
    ValidateCommand(String name, uint64_t callbackID)
    ExecuteEditCommand(String name, String argument)

    DidRemoveEditCommand(uint64_t commandID)
    ReapplyEditCommand(uint64_t commandID)
    UnapplyEditCommand(uint64_t commandID)

    SetPageAndTextZoomFactors(double pageZoomFactor, double textZoomFactor)
    SetPageZoomFactor(double zoomFactor)
    SetTextZoomFactor(double zoomFactor)
    WindowScreenDidChange(uint32_t displayID)

    ScalePage(double scale, WebCore::IntPoint origin)
    ScalePageInViewCoordinates(double scale, WebCore::IntPoint centerInViewCoordinates)
    ScaleView(double scale)

    SetUseFixedLayout(bool fixed)
    SetFixedLayoutSize(WebCore::IntSize size)
    ListenForLayoutMilestones(uint32_t milestones)
    SetSuppressScrollbarAnimations(bool suppressAnimations)

    SetEnableVerticalRubberBanding(bool enableVerticalRubberBanding)
    SetEnableHorizontalRubberBanding(bool enableHorizontalRubberBanding)

    SetBackgroundExtendsBeyondPage(bool backgroundExtendsBeyondPage)

    SetPaginationMode(uint32_t mode)
    SetPaginationBehavesLikeColumns(bool behavesLikeColumns)
    SetPageLength(double pageLength)
    SetGapBetweenPages(double gap)
    SetPaginationLineGridEnabled(bool lineGridEnabled)

    PostInjectedBundleMessage(String messageName, WebKit::UserData messageBody)

    # Find.
    FindString(String string, uint32_t findOptions, unsigned maxMatchCount)
    FindStringMatches(String string, uint32_t findOptions, unsigned maxMatchCount)
    GetImageForFindMatch(uint32_t matchIndex)
    SelectFindMatch(uint32_t matchIndex)
    HideFindUI()
    CountStringMatches(String string, uint32_t findOptions, unsigned maxMatchCount)
    
    AddMIMETypeWithCustomContentProvider(String mimeType)

    # Drag and drop.
#if PLATFORM(GTK) && ENABLE(DRAG_SUPPORT)
    PerformDragControllerAction(uint64_t action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t draggingSourceOperationMask, struct WebKit::WebSelectionData selection, uint32_t flags)
#endif
#if !PLATFORM(GTK) && ENABLE(DRAG_SUPPORT)
    PerformDragControllerAction(uint64_t action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t draggingSourceOperationMask, String dragStorageName, uint32_t flags, WebKit::SandboxExtension::Handle sandboxExtensionHandle, WebKit::SandboxExtension::HandleArray sandboxExtensionsForUpload)
#endif
#if ENABLE(DRAG_SUPPORT)
    DidStartDrag()
    DragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t operation)
#endif

    # Popup menu.
    DidChangeSelectedIndexForActivePopupMenu(int32_t newIndex)
    SetTextForActivePopupMenu(int32_t index)
#if PLATFORM(GTK)
    FailedToShowPopupMenu()
#endif

#if ENABLE(CONTEXT_MENUS)
    # Context menu.
    DidSelectItemFromActiveContextMenu(WebKit::WebContextMenuItemData menuItem)
#endif

    # Open panel.
#if PLATFORM(IOS)
    DidChooseFilesForOpenPanelWithDisplayStringAndIcon(Vector<String> fileURLs, String displayString, IPC::DataReference iconData)
#endif
    DidChooseFilesForOpenPanel(Vector<String> fileURLs)
    DidCancelForOpenPanel()
#if ENABLE(SANDBOX_EXTENSIONS)
    ExtendSandboxForFileFromOpenPanel(WebKit::SandboxExtension::Handle sandboxExtensionHandle)
#endif

    # Spelling and grammar.
    AdvanceToNextMisspelling(bool startBeforeSelection)
    ChangeSpellingToWord(String word)
    DidFinishCheckingText(uint64_t requestID, Vector<WebCore::TextCheckingResult> result)
    DidCancelCheckingText(uint64_t requestID)
#if USE(APPKIT)
    UppercaseWord()
    LowercaseWord()
    CapitalizeWord()
#endif
#if PLATFORM(COCOA)
    SetSmartInsertDeleteEnabled(bool isSmartInsertDeleteEnabled)
#endif

#if ENABLE(GEOLOCATION)
    # Geolocation
    DidReceiveGeolocationPermissionDecision(uint64_t geolocationID, bool allowed)
#endif

#if ENABLE(MEDIA_STREAM)
    # MediaSteam
    DidReceiveUserMediaPermissionDecision(uint64_t userMediaID, bool allowed, String audioDeviceUID, String videoDeviceUID)
    DidCompleteUserMediaPermissionCheck(uint64_t userMediaID, String mediaDeviceIdentifierHashSalt, bool allowed)
#endif

    # Notification
    DidReceiveNotificationPermissionDecision(uint64_t notificationID, bool allowed)

    # Printing.
    BeginPrinting(uint64_t frameID, struct WebKit::PrintInfo printInfo)
    EndPrinting()
    ComputePagesForPrinting(uint64_t frameID, struct WebKit::PrintInfo printInfo, uint64_t callbackID)
#if PLATFORM(COCOA)
    DrawRectToImage(uint64_t frameID, struct WebKit::PrintInfo printInfo, WebCore::IntRect rect, WebCore::IntSize imageSize, uint64_t callbackID)
    DrawPagesToPDF(uint64_t frameID, struct WebKit::PrintInfo printInfo, uint32_t first, uint32_t count, uint64_t callbackID)
#if PLATFORM(IOS)
    ComputePagesForPrintingAndDrawToPDF(uint64_t frameID, struct WebKit::PrintInfo printInfo, uint64_t callbackID) -> (uint32_t pageCount) Delayed
#endif
#endif
#if PLATFORM(GTK)
    DrawPagesForPrinting(uint64_t frameID, struct WebKit::PrintInfo printInfo, uint64_t callbackID)
#endif

    # Media
    SetMediaVolume(float volume)
    SetMuted(bool muted)
    SetMayStartMediaWhenInWindow(bool mayStartMedia)

#if ENABLE(MEDIA_SESSION)
    HandleMediaEvent(uint32_t eventType)
    SetVolumeOfMediaElement(double volume, uint64_t elementID)
#endif

    // FIXME: This a dummy message, to avoid breaking the build for platforms that don't require
    // any synchronous messages, and should be removed when <rdar://problem/8775115> is fixed.
    Dummy() -> (bool dummyReturn)

    SetCanRunBeforeUnloadConfirmPanel(bool canRunBeforeUnloadConfirmPanel)
    SetCanRunModal(bool canRunModal)

#if PLATFORM(EFL)
    SetThemePath(String themePath)
#endif

#if USE(COORDINATED_GRAPHICS_MULTIPROCESS)
    CommitPageTransitionViewport()
#endif

#if PLATFORM(GTK)
    SetComposition(String text, Vector<WebCore::CompositionUnderline> underlines, uint64_t selectionStart, uint64_t selectionEnd, uint64_t replacementRangeStart, uint64_t replacementRangeEnd)
    ConfirmComposition(String text, int64_t selectionStart, int64_t selectionLength)
    CancelComposition()

    CollapseSelectionInFrame(uint64_t frameID)
#endif

#if PLATFORM (GTK) && HAVE(GTK_GESTURES)
    GetCenterForZoomGesture(WebCore::IntPoint centerInViewCoordinates) -> (WebCore::IntPoint center)
#endif

#if PLATFORM(COCOA)
    # Complex text input support for plug-ins.
    SendComplexTextInputToPlugin(uint64_t pluginComplexTextInputIdentifier, String textInput)

    WindowAndViewFramesChanged(WebCore::FloatRect windowFrameInScreenCoordinates, WebCore::FloatRect windowFrameInUnflippedScreenCoordinates, WebCore::FloatRect viewFrameInWindowCoordinates, WebCore::FloatPoint accessibilityViewCoordinates)
    SetMainFrameIsScrollable(bool isScrollable)
    RegisterUIProcessAccessibilityTokens(IPC::DataReference elemenToken, IPC::DataReference windowToken)
    GetStringSelectionForPasteboard() -> (String stringValue)
    GetDataSelectionForPasteboard(String pasteboardType) -> (WebKit::SharedMemory::Handle handle, uint64_t size)
    ReadSelectionFromPasteboard(String pasteboardName) -> (bool result)

#if ENABLE(SERVICE_CONTROLS)
    ReplaceSelectionWithPasteboardData(Vector<String> types, IPC::DataReference data)
#endif

    ShouldDelayWindowOrderingEvent(WebKit::WebMouseEvent event) -> (bool result)
    AcceptsFirstMouse(int eventNumber, WebKit::WebMouseEvent event) -> (bool result)

    InsertTextAsync(String text, struct WebKit::EditingRange replacementRange, bool registerUndoGroup, uint32_t editingRangeIsRelativeTo, bool suppressSelectionUpdate)
    GetMarkedRangeAsync(uint64_t callbackID)
    GetSelectedRangeAsync(uint64_t callbackID)
    CharacterIndexForPointAsync(WebCore::IntPoint point, uint64_t callbackID);
    FirstRectForCharacterRangeAsync(struct WebKit::EditingRange range, uint64_t callbackID);
    SetCompositionAsync(String text, Vector<WebCore::CompositionUnderline> underlines, struct WebKit::EditingRange selectionRange, struct WebKit::EditingRange replacementRange)
    ConfirmCompositionAsync()
#endif
#if PLATFORM(MAC)
    InsertDictatedTextAsync(String text, struct WebKit::EditingRange replacementRange, Vector<WebCore::DictationAlternative> dictationAlternatives, bool registerUndoGroup)
    AttributedSubstringForCharacterRangeAsync(struct WebKit::EditingRange range, uint64_t callbackID);
    FontAtSelection(uint64_t callbackID);
#endif

    SetMinimumLayoutSize(WebCore::IntSize minimumLayoutSize)
    SetAutoSizingShouldExpandToViewHeight(bool shouldExpand)

#if PLATFORM(EFL)
    ConfirmComposition(String compositionString)
    SetComposition(String compositionString, Vector<WebCore::CompositionUnderline> underlines, uint64_t cursorPosition)
    CancelComposition()
#endif
#if USE(COORDINATED_GRAPHICS_MULTIPROCESS)
    FindZoomableAreaForPoint(WebCore::IntPoint point, WebCore::IntSize area)
#endif

#if PLATFORM(COCOA)
    HandleAlternativeTextUIResult(String result)
#endif

#if PLATFORM(IOS)
    WillStartUserTriggeredZooming();
#endif

    SetScrollPinningBehavior(uint32_t pinning)
    SetScrollbarOverlayStyle(Optional<uint32_t> scrollbarStyle)

    GetBytecodeProfile(uint64_t callbackID)

    GetSamplingProfilerOutput(uint64_t callbackID)
    
    TakeSnapshot(WebCore::IntRect snapshotRect, WebCore::IntSize bitmapSize, uint32_t options, uint64_t callbackID)
#if PLATFORM(MAC)
    PerformImmediateActionHitTestAtLocation(WebCore::FloatPoint location)
    ImmediateActionDidUpdate()
    ImmediateActionDidCancel()
    ImmediateActionDidComplete()
    DataDetectorsDidPresentUI(WebCore::PageOverlay::PageOverlayID pageOverlay)
    DataDetectorsDidChangeUI(WebCore::PageOverlay::PageOverlayID pageOverlay)
    DataDetectorsDidHideUI(WebCore::PageOverlay::PageOverlayID pageOverlay)
    HandleAcceptedCandidate(struct WebCore::TextCheckingResult acceptedCandidate)
#endif

    SetShouldDispatchFakeMouseMoveEvents(bool shouldDispatchFakeMouseMoveEvents)

#if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
    PlaybackTargetSelected(uint64_t contextId, WebCore::MediaPlaybackTargetContext target)
    PlaybackTargetAvailabilityDidChange(uint64_t contextId, bool available)
    SetShouldPlayToPlaybackTarget(uint64_t contextId, bool shouldPlay)
#endif

    ClearWheelEventTestTrigger()
    SetShouldScaleViewToFitDocument(bool shouldScaleViewToFitDocument)

#if ENABLE(VIDEO) && USE(GSTREAMER)
    DidEndRequestInstallMissingMediaPlugins(uint32_t result)
#endif

    SetResourceCachingDisabled(bool disabled)

    SetUserInterfaceLayoutDirection(uint32_t direction)

#if ENABLE(GAMEPAD)
    GamepadActivity(Vector<WebKit::GamepadData> gamepadDatas)
#endif
}
