# 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)
    WriteWebContentToPasteboard(struct WebCore::PasteboardWebContent content)
    WriteImageToPasteboard(struct WebCore::PasteboardImage pasteboardImage)
    WriteStringToPasteboard(String pasteboardType, String text) 
    ReadStringFromPasteboard(uint64_t index, String pasteboardType) -> (String string)
    ReadURLFromPasteboard(uint64_t index, String pasteboardType) -> (String string)
    ReadBufferFromPasteboard(uint64_t index, String pasteboardType) -> (WebKit::SharedMemory::Handle handle, uint64_t size)
    GetPasteboardItemsCount() -> (uint64_t itemsCount)
#endif

#if PLATFORM(COCOA)
    # Pasteboard messages.
    GetPasteboardTypes(String pasteboardName) -> (Vector<String> types)
    GetPasteboardPathnamesForType(String pasteboardName, String pasteboardType) -> (Vector<String> pathnames)
    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)
    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
}
