/*
 * Copyright (C) 2009 Google Inc. All rights reserved.
 * Copyright (C) 2011, 2012 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:
 *
 *     * 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.
 */

// FIXME: Notification should be exposed to all Worker contexts, not just ServiceWorker.
// https://notifications.spec.whatwg.org/#notification
[
    Conditional=NOTIFICATIONS,
    ActiveDOMObject,
    EnabledBySetting=NotificationsEnabled,
    ExportMacro=WEBCORE_EXPORT,
    Exposed=(Window,ServiceWorker)
] interface Notification : EventTarget {
    [CallWith=CurrentScriptExecutionContext] constructor(DOMString title, optional NotificationOptions options);

    [CallWith=CurrentScriptExecutionContext] static readonly attribute NotificationPermission permission;
    [Exposed=Window, CallWith=CurrentDocument] static Promise<NotificationPermission> requestPermission(optional NotificationPermissionCallback? deprecatedCallback);

    // static readonly attribute unsigned long maxActions;

    attribute EventHandler onclick;
    attribute EventHandler onerror;

    readonly attribute DOMString title;
    readonly attribute NotificationDirection dir;
    readonly attribute DOMString lang;
    readonly attribute DOMString body;
    readonly attribute DOMString tag;
    // readonly attribute USVString image;
    readonly attribute USVString icon;
    // readonly attribute USVString badge;
    // readonly attribute USVString sound;
    // [SameObject] readonly attribute FrozenArray<unsigned long> vibrate;
    // readonly attribute EpochTimeStamp timestamp;
    // readonly attribute boolean renotify;
    // readonly attribute boolean silent;
    // readonly attribute boolean requireInteraction;
    [CallWith=CurrentGlobalObject, CachedAttribute, ImplementedAs=dataForBindings] readonly attribute any data;
    // [SameObject] readonly attribute FrozenArray<NotificationAction> actions;

    undefined close();

    // Legacy. Not in the specification.
    undefined show();

    attribute EventHandler onclose;
    [ImplementedAs=onshow] attribute EventHandler ondisplay;
    attribute EventHandler onshow;
};

