/*
 * Copyright (C) 2006, 2007, 2008 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. ``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
 * 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. 
 */

#ifndef DO_NO_IMPORTS
import "oaidl.idl";
import "ocidl.idl";
import "IWebURLAuthenticationChallenge.idl";
import "IWebDataSource.idl";
import "IWebURLResponse.idl";
import "IWebError.idl";
#endif

interface IWebView;
interface IWebDataSource;
interface IWebURLAuthenticationChallenge;
interface IWebURLResponse;
interface IWebURLRequest;

interface IWebError;

/*!
    @category  WebResourceLoadDelegate
    @discussion Implementors of this protocol will receive messages indicating
    that a resource is about to be loaded, data has been received for a resource,
    an error has been received for a resource, and completion of a resource load.
    Implementors are also given the opportunity to mutate requests before they are sent.
    The various progress methods of this protocol all receive an identifier as the
    parameter.  This identifier can be used to track messages associated with a single
    resource.  For example, a single resource may generate multiple 
    resource:willSendRequest:redirectResponse:fromDataSource: messages as it's URL is redirected.
    @interface NSObject (WebResourceLoadDelegate)
*/

[
    object,
    oleautomation,
    uuid(AF3289AA-90DB-4ca4-A112-A1E5F0517953),
    pointer_default(unique)
]
interface IWebResourceLoadDelegate : IUnknown
{
    /*!
        @method webView:identifierForInitialRequest:fromDataSource:
        @param webView The WebView sending the message.
        @param request The request about to be sent.
        @param dataSource The datasource that initiated the load.
        @discussion An implementor of WebResourceLoadDelegate should provide an identifier
        that can be used to track the load of a single resource.  This identifier will be
        passed as the first argument for all of the other WebResourceLoadDelegate methods.  The
        identifier is useful to track changes to a resources request, which will be
        provided by one or more calls to resource:willSendRequest:redirectResponse:fromDataSource:.
        @result An identifier that will be passed back to the implementor for each callback.
        The identifier will be retained.
        - (id)webView:(WebView *)sender identifierForInitialRequest:(NSURLRequest *)request fromDataSource:(WebDataSource *)dataSource;
    */
    HRESULT identifierForInitialRequest([in] IWebView* webView, [in] IWebURLRequest* request, [in] IWebDataSource* dataSource, [in] unsigned long identifier);

    /*!
        @method resource:willSendRequest:redirectResponse:fromDataSource:
        @discussion This message is sent before a load is initiated.  The request may be modified
        as necessary by the receiver.
        @param webView The WebView sending the message.
        @param identifier An identifier that can be used to track the progress of a resource load across
        multiple call backs.
        @param request The request about to be sent.
        @param redirectResponse If the request is being made in response to a redirect we received,
        the response that conveyed that redirect.
        @param dataSource The dataSource that initiated the load.
        @result Returns the request, which may be mutated by the implementor, although typically
        will be request.
        - (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource;
    */
    HRESULT willSendRequest([in] IWebView* webView, [in] unsigned long identifier, [in] IWebURLRequest* request, [in] IWebURLResponse* redirectResponse, [in] IWebDataSource* dataSource, [out, retval] IWebURLRequest** newRequest);

    /*!
        @method webView:resource:didReceiveAuthenticationChallenge:fromDataSource:
        @abstract Start authentication for the resource, providing a challenge
        @discussion Call useCredential::, continueWithoutCredential or
        cancel on the challenge when done.
        @param challenge The NSURLAuthenticationChallenge to start authentication for
        @discussion If you do not implement this delegate method, WebKit will handle authentication
        automatically by prompting with a sheet on the window that the WebView is associated with.
        - (void)webView:(WebView *)sender resource:(id)identifier didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge fromDataSource:(WebDataSource *)dataSource;
    */
    HRESULT didReceiveAuthenticationChallenge([in] IWebView* webView,  [in] unsigned long identifier,[in] IWebURLAuthenticationChallenge* challenge, [in] IWebDataSource* dataSource);

    /*!
        @method webView:resource:didCancelAuthenticationChallenge:fromDataSource:
        @abstract Cancel authentication for a given request
        @param challenge The NSURLAuthenticationChallenge for which to cancel authentication
        - (void)webView:(WebView *)sender resource:(id)identifier didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge fromDataSource:(WebDataSource *)dataSource;
    */
    HRESULT didCancelAuthenticationChallenge([in] IWebView* webView, [in] unsigned long identifier, [in] IWebURLAuthenticationChallenge* challenge, [in] IWebDataSource* dataSource);

    /*!
        @method webView:resource:didReceiveResponse:fromDataSource:
        @abstract This message is sent after a response has been received for this load.
        @param webView The WebView sending the message.
        @param identifier An identifier that can be used to track the progress of a resource load across
        multiple call backs.
        @param response The response for the request.
        @param dataSource The dataSource that initiated the load.
        @discussion In some rare cases, multiple responses may be received for a single load.
        This occurs with multipart/x-mixed-replace, or "server push". In this case, the client
        should assume that each new response resets progress so far for the resource back to 0,
        and should check the new response for the expected content length.
        - (void)webView:(WebView *)sender resource:(id)identifier didReceiveResponse:(NSURLResponse *)response fromDataSource:(WebDataSource *)dataSource;
    */
    HRESULT didReceiveResponse([in] IWebView* webView, [in] unsigned long identifier, [in] IWebURLResponse* response, [in] IWebDataSource* dataSource);

    /*!
        @method webView:resource:didReceiveContentLength:fromDataSource:
        @discussion Multiple of these messages may be sent as data arrives.
        @param webView The WebView sending the message.
        @param identifier An identifier that can be used to track the progress of a resource load across
        multiple call backs.
        @param length The amount of new data received.  This is not the total amount, just the new amount received.
        @param dataSource The dataSource that initiated the load.
        - (void)webView:(WebView *)sender resource:(id)identifier didReceiveContentLength:(WebNSInt)length fromDataSource:(WebDataSource *)dataSource;
    */
    HRESULT didReceiveContentLength([in] IWebView* webView, [in] unsigned long identifier, [in] UINT length, [in] IWebDataSource* dataSource);

    /*!
        @method webView:resource:didFinishLoadingFromDataSource:
        @discussion This message is sent after a load has successfully completed.
        @param webView The WebView sending the message.
        @param identifier An identifier that can be used to track the progress of a resource load across
        multiple call backs.
        @param dataSource The dataSource that initiated the load.
        - (void)webView:(WebView *)sender resource:(id)identifier didFinishLoadingFromDataSource:(WebDataSource *)dataSource;
    */
    HRESULT didFinishLoadingFromDataSource([in] IWebView* webView, [in] unsigned long identifier, [in] IWebDataSource* dataSource);

    /*!
        @method webView:resource:didFailLoadingWithError:fromDataSource:
        @discussion This message is sent after a load has failed to load due to an error.
        @param webView The WebView sending the message.
        @param identifier An identifier that can be used to track the progress of a resource load across
        multiple call backs.
        @param error The error associated with this load.
        @param dataSource The dataSource that initiated the load.
        - (void)webView:(WebView *)sender resource:(id)identifier didFailLoadingWithError:(NSError *)error fromDataSource:(WebDataSource *)dataSource;
    */
    HRESULT didFailLoadingWithError([in] IWebView* webView, [in] unsigned long identifier, [in] IWebError* error, [in] IWebDataSource* dataSource);

    /*!
        @method webView:plugInFailedWithError:dataSource:
        @discussion Called when a plug-in is not found, fails to load or is not available for some reason.
        @param webView The WebView sending the message.
        @param error The plug-in error. In the userInfo dictionary of the error, the object for the
        NSErrorFailingURLKey key is a URL string of the SRC attribute, the object for the WebKitErrorPlugInNameKey
        key is a string of the plug-in's name, the object for the WebKitErrorPlugInPageURLStringKey key is a URL string
        of the PLUGINSPAGE attribute and the object for the WebKitErrorMIMETypeKey key is a string of the TYPE attribute.
        Some, none or all of the mentioned attributes can be present in the userInfo. The error returns nil for userInfo
        when none are present.
        @param dataSource The dataSource that contains the plug-in.
        - (void)webView:(WebView *)sender plugInFailedWithError:(NSError *)error dataSource:(WebDataSource *)dataSource;
    */
    HRESULT plugInFailedWithError([in] IWebView* webView, [in] IWebError* error, [in] IWebDataSource* dataSource);
}
