# Copyright (C) 2014 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 -> WebPasteboardProxy {
#if PLATFORM(IOS)
    WriteURLToPasteboard(struct WebCore::PasteboardURL url, String pasteboardName)
    WriteWebContentToPasteboard(struct WebCore::PasteboardWebContent content, String pasteboardName)
    WriteImageToPasteboard(struct WebCore::PasteboardImage pasteboardImage, String pasteboardName)
    WriteStringToPasteboard(String pasteboardType, String text, String pasteboardName)
    ReadStringFromPasteboard(uint64_t index, String pasteboardType, String pasteboardName) -> (String string)
    ReadURLFromPasteboard(uint64_t index, String pasteboardType, String pasteboardName) -> (String url, String title)
    ReadBufferFromPasteboard(uint64_t index, String pasteboardType, String pasteboardName) -> (WebKit::SharedMemory::Handle handle, uint64_t size)
    GetPasteboardItemsCount(String pasteboardName) -> (uint64_t itemsCount)
    InformationForItemAtIndex(uint64_t index, String pasteboardName) -> (struct WebCore::PasteboardItemInfo info)
    UpdateSupportedTypeIdentifiers(Vector<String> identifiers, String pasteboardName)
    GetPasteboardTypesByFidelityForItemAtIndex(uint64_t index, String pasteboardName) -> (Vector<String> types)
#endif

    WriteCustomData(struct WebCore::PasteboardCustomData data, String pasteboardName) -> (uint64_t changeCount)
    TypesSafeForDOMToReadAndWrite(String pasteboardName, String origin) -> (Vector<String> types)

#if PLATFORM(COCOA)
    # Pasteboard messages.
    GetNumberOfFiles(String pasteboardName) -> (uint64_t numberOfFiles)
    GetPasteboardTypes(String pasteboardName) -> (Vector<String> types)
    GetPasteboardPathnamesForType(String pasteboardName, String pasteboardType) -> (Vector<String> pathnames, WebKit::SandboxExtension::HandleArray sandboxExtensions) WantsConnection
    GetPasteboardStringForType(String pasteboardName, String pasteboardType) -> (String string)
    GetPasteboardBufferForType(String pasteboardName, String pasteboardType) -> (WebKit::SharedMemory::Handle handle, uint64_t size)
    PasteboardCopy(String fromPasteboard, String toPasteboard) -> (uint64_t changeCount)
    GetPasteboardChangeCount(String pasteboardName) -> (uint64_t changeCount)
    GetPasteboardUniqueName() -> (String pasteboardName)
    GetPasteboardColor(String pasteboardName) -> (WebCore::Color color)
    GetPasteboardURL(String pasteboardName) -> (String urlString)
    AddPasteboardTypes(String pasteboardName, Vector<String> pasteboardTypes) -> (uint64_t changeCount)
    SetPasteboardTypes(String pasteboardName, Vector<String> pasteboardTypes) -> (uint64_t changeCount)
    SetPasteboardPathnamesForType(String pasteboardName, String pasteboardType, Vector<String> pathnames) -> (uint64_t changeCount) WantsConnection
    SetPasteboardStringForType(String pasteboardName, String pasteboardType, String string) -> (uint64_t changeCount)
    SetPasteboardBufferForType(String pasteboardName, String pasteboardType, WebKit::SharedMemory::Handle handle, uint64_t size) -> (uint64_t changeCount)
#endif

#if PLATFORM(GTK)
    WriteToClipboard(String pasteboardName, struct WebKit::WebSelectionData pasteboardContent)
    ReadFromClipboard(String pasteboardName) -> (struct WebKit::WebSelectionData pasteboardContent)
#endif

#if PLATFORM(WPE)
    GetPasteboardTypes() -> (Vector<String> types)
    ReadStringFromPasteboard(uint64_t index, String pasteboardType) -> (String string)
    WriteWebContentToPasteboard(struct WebCore::PasteboardWebContent content)
    WriteStringToPasteboard(String pasteboardType, String text)
#endif
}
