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

#if ENABLE(PLUGIN_PROCESS)

messages -> PluginProxy {
    # Asks the web process to load a URL.
    LoadURL(uint64_t requestID, WTF::String method, WTF::String urlString, WTF::String target, WebCore::HTTPHeaderMap headerFields, Vector<uint8_t> httpBody, bool allowPopups);

    # Called when the plug-in has painted into its backing store.
    Update(WebCore::IntRect paintedRect)

    # Returns a PAC style string with proxies for the given URL.
    ProxiesForURL(WTF::String urlString) -> (WTF::String proxiesString)

    # Returns the cookies for the given URL.
    CookiesForURL(WTF::String urlString) -> (WTF::String cookieString)

    # Sets the cookies for the given URL.
    SetCookiesForURL(WTF::String urlString, WTF::String cookieString)

    # Gets a reference to the window NPObject.
    GetWindowScriptNPObject() -> (uint64_t windowScriptNPObjectID)

    # Gets a reference to the plug-in element NPObject.
    GetPluginElementNPObject() -> (uint64_t pluginElementNPObjectID)

    # Evaluates the given JavaScript string.
    Evaluate(WebKit::NPVariantData npObjectAsVariantData, WTF::String scriptString, bool allowPopups) -> (bool returnValue, WebKit::NPVariantData resultData)

    # Cancels the given stream load.
    CancelStreamLoad(uint64_t streamID)

    # Cancel the manual stream load.
    CancelManualStreamLoad()

    # Set the status bar text.
    SetStatusbarText(WTF::String statusbarText)

#if PLATFORM(MAC)
    # Change whether complext text input is enabled for this plug-in.
    SetComplexTextInputEnabled(bool complexTextInputEnabled)
#endif
}

#endif
