# 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) -> (uint64_t changeCount) Synchronous
    TypesSafeForDOMToReadAndWrite(String pasteboardName, String origin) -> (Vector<String> types) Synchronous
    AllPasteboardItemInfo(String pasteboardName) -> (Vector<WebCore::PasteboardItemInfo> allInfo) Synchronous
    InformationForItemAtIndex(uint64_t index, String pasteboardName) -> (struct 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) -> (uint64_t changeCount) Synchronous
    GetPasteboardChangeCount(String pasteboardName) -> (uint64_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) -> (uint64_t changeCount) Synchronous
    SetPasteboardTypes(String pasteboardName, Vector<String> pasteboardTypes) -> (uint64_t changeCount) Synchronous
    SetPasteboardURL(struct WebCore::PasteboardURL pasteboardURL, String pasteboardName) -> (uint64_t changeCount) Synchronous WantsConnection
    SetPasteboardColor(String pasteboardName, WebCore::Color color) -> (uint64_t changeCount) Synchronous
    SetPasteboardStringForType(String pasteboardName, String pasteboardType, String string) -> (uint64_t changeCount) Synchronous
    SetPasteboardBufferForType(String pasteboardName, String pasteboardType, WebKit::SharedMemory::Handle handle, uint64_t size) -> (uint64_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
}
