/*
 * Copyright (C) 2009 Google 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:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * 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.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
 * OWNER 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";
#endif

/*!
    @category WebDesktopNotification
    @discussion A class that represents a notification being shown
    on the user's desktop.  It provides the contents of the notification
    and receives events related to the display.
    @interface NSObject (WebDesktopNotificationProvider)
*/
[
    object,
    oleautomation,
    uuid(0A0AAFA8-C698-4cff-BD28-39614622EEA4),
    pointer_default(unique)
]
interface IWebDesktopNotification : IUnknown
{
    HRESULT isHTML([out, retval] BOOL* result);
    HRESULT contentsURL([out, retval] BSTR* result);
    HRESULT iconURL([out, retval] BSTR* result);
    HRESULT title([out, retval] BSTR* result);
    HRESULT text([out, retval] BSTR* result);

    HRESULT notifyDisplay();
    HRESULT notifyError();
    HRESULT notifyClose([in] BOOL xplicit);
}

/*!
    @category WebDesktopNotificationsDelegate
    @discussion A class that implements WebDesktopNotificationProvider provides
    methods that may be used by Javascript to display notifications ("toasts")
    on the user's desktop.
    @interface NSObject (WebDesktopNotificationProvider)
*/
[
    object,
    oleautomation,
    uuid(09DA073E-38B3-466a-9828-B2915FDD2ECB),
    pointer_default(unique)
]

interface IWebDesktopNotificationsDelegate : IUnknown
{
    /*!
        @method showDesktopNotification:
        @abstract Show a notification.
        @param notification The Notification to be shown.
    */
    HRESULT showDesktopNotification([in] IWebDesktopNotification* notification);

    /*!
        @method cancelDesktopNotification:
        @abstract Cancel showing a notification (or take it down if it's shown).
        @param notification The Notification to be canceled.
    */
    HRESULT cancelDesktopNotification([in] IWebDesktopNotification* notification);

    /*!
        @method notificationDestroyed:
        @abstract Notify the presenter that the object has been destroyed.  The
        notification need not be un-shown, but events should not be invoked.
        @param notification The Notification that was destroyed.
    */
    HRESULT notificationDestroyed([in] IWebDesktopNotification* notification);

    /*!
        @method checkNotificationPermission:
        @abstract See if the origin context is allowed to show notifications.
        @param origin The origin to be checked.
        @param result A value from WebCore::NotificationProvider::Permission enum.
    */
    HRESULT checkNotificationPermission([in] BSTR origin, [out, retval] int* result);

    /*!
        @method requestNotificationPermission:
        @abstract Request permission to show notifications on a given origin.
        @param origin The origin to be requested.
    */
    HRESULT requestNotificationPermission([in] BSTR origin);
}
