#ifndef Notification_h
#define Notification_h
#include "bindings/v8/ScriptWrappable.h"
#include "core/dom/ActiveDOMObject.h"
#include "core/events/EventTarget.h"
#include "heap/Handle.h"
#include "modules/notifications/NotificationClient.h"
#include "platform/AsyncMethodRunner.h"
#include "platform/text/TextDirection.h"
#include "platform/weborigin/KURL.h"
#include "wtf/OwnPtr.h"
#include "wtf/PassRefPtr.h"
#include "wtf/RefCounted.h"
namespace WebCore {
class Dictionary;
class ExecutionContext;
class NotificationPermissionCallback;
class Notification : public RefCountedWillBeRefCountedGarbageCollected<Notification>, public ScriptWrappable, public ActiveDOMObject, public EventTargetWithInlineData {
    DEFINE_EVENT_TARGET_REFCOUNTING(RefCountedWillBeRefCountedGarbageCollected<Notification>);
public:
    static PassRefPtrWillBeRawPtr<Notification> create(ExecutionContext*, const String& title, const Dictionary& options);
    virtual ~Notification();
    void close();
    DEFINE_ATTRIBUTE_EVENT_LISTENER(click);
    DEFINE_ATTRIBUTE_EVENT_LISTENER(show);
    DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
    DEFINE_ATTRIBUTE_EVENT_LISTENER(close);
    void dispatchShowEvent();
    void dispatchClickEvent();
    void dispatchErrorEvent();
    void dispatchCloseEvent();
    String title() const { return m_title; }
    String dir() const { return m_dir; }
    String lang() const { return m_lang; }
    String body() const { return m_body; }
    String tag() const { return m_tag; }
    String icon() const { return m_iconUrl; }
    TextDirection direction() const;
    KURL iconURL() const { return m_iconUrl; }
    static const String& permissionString(NotificationClient::Permission);
    static const String& permission(ExecutionContext*);
    static void requestPermission(ExecutionContext*, PassOwnPtr<NotificationPermissionCallback> = nullptr);
    
    virtual ExecutionContext* executionContext() const OVERRIDE FINAL { return ActiveDOMObject::executionContext(); }
    virtual bool dispatchEvent(PassRefPtrWillBeRawPtr<Event>) OVERRIDE FINAL;
    virtual const AtomicString& interfaceName() const OVERRIDE;
    
    virtual void stop() OVERRIDE;
    virtual bool hasPendingActivity() const OVERRIDE;
    
    void trace(Visitor*) { }
private:
    Notification(const String& title, ExecutionContext*, NotificationClient*);
    
    
    
    
    
    void show();
    void setDir(const String& dir) { m_dir = dir; }
    void setLang(const String& lang) { m_lang = lang; }
    void setBody(const String& body) { m_body = body; }
    void setIconUrl(KURL iconUrl) { m_iconUrl = iconUrl; }
    void setTag(const String& tag) { m_tag = tag; }
private:
    String m_title;
    String m_dir;
    String m_lang;
    String m_body;
    String m_tag;
    KURL m_iconUrl;
    enum NotificationState {
        Idle = 0,
        Showing = 1,
        Closed = 2,
    };
    NotificationState m_state;
    NotificationClient* m_client;
    OwnPtr<AsyncMethodRunner<Notification> > m_asyncRunner;
};
} 
#endif