# 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_FAMILY)
    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)
    UpdateSupportedTypeIdentifiers(Vector<String> identifiers, String pasteboardName)
#endif

    WriteCustomData(Vector<WebCore::PasteboardCustomData> data, String pasteboardName) -> (int64_t changeCount) Synchronous
    TypesSafeForDOMToReadAndWrite(String pasteboardName, String origin) -> (Vector<String> types) Synchronous
    AllPasteboardItemInfo(String pasteboardName, int64_t changeCount) -> (Optional<Vector<WebCore::PasteboardItemInfo>> allInfo) Synchronous
    InformationForItemAtIndex(uint64_t index, String pasteboardName, int64_t changeCount) -> (Optional<WebCore::PasteboardItemInfo> info) Synchronous
    GetPasteboardItemsCount(String pasteboardName) -> (uint64_t itemsCount) Synchronous
    ReadStringFromPasteboard(uint64_t index, String pasteboardType, String pasteboardName) -> (String string) Synchronous
    ReadURLFromPasteboard(uint64_t index, String pasteboardName) -> (String url, String title) Synchronous
    ReadBufferFromPasteboard(uint64_t index, String pasteboardType, String pasteboardName) -> (WebKit::SharedMemory::Handle handle, uint64_t size) Synchronous

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

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

#if USE(LIBWPE)
    GetPasteboardTypes() -> (Vector<String> types) Synchronous
    WriteWebContentToPasteboard(struct WebCore::PasteboardWebContent content)
    WriteStringToPasteboard(String pasteboardType, String text)
#endif
}
