#pragma once
#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
#include "ActiveDOMObject.h"
#include "EventTarget.h"
#include "NotificationClient.h"
#include "URL.h"
#include "WritingMode.h"
#if ENABLE(NOTIFICATIONS)
#include "Timer.h"
#endif
namespace WebCore {
class Document;
class NotificationCenter;
class NotificationPermissionCallback;
typedef int ExceptionCode;
class Notification final : public RefCounted<Notification>, public ActiveDOMObject, public EventTargetWithInlineData {
WTF_MAKE_FAST_ALLOCATED;
public:
#if ENABLE(LEGACY_NOTIFICATIONS)
static Ref<Notification> create(const String& title, const String& body, const String& iconURL, ScriptExecutionContext&, ExceptionCode&, NotificationCenter&);
#endif
#if ENABLE(NOTIFICATIONS)
enum class Direction { Auto, Ltr, Rtl };
struct Options {
Direction dir;
String lang;
String body;
String tag;
String icon;
};
static Ref<Notification> create(Document&, const String& title, const Options&);
#endif
virtual ~Notification();
void show();
void close();
const URL& iconURL() const { return m_icon; }
const String& title() const { return m_title; }
const String& body() const { return m_body; }
const String& lang() const { return m_lang; }
const String& dir() const { return m_direction; }
void setDir(const String& dir) { m_direction = dir; }
const String& replaceId() const { return m_tag; }
void setReplaceId(const String& replaceId) { m_tag = replaceId; }
const String& tag() const { return m_tag; }
void setTag(const String& tag) { m_tag = tag; }
TextDirection direction() const { return m_direction == "rtl" ? RTL : LTR; }
WEBCORE_EXPORT void dispatchClickEvent();
WEBCORE_EXPORT void dispatchCloseEvent();
WEBCORE_EXPORT void dispatchErrorEvent();
WEBCORE_EXPORT void dispatchShowEvent();
WEBCORE_EXPORT void finalize();
#if ENABLE(NOTIFICATIONS)
static String permission(Document&);
WEBCORE_EXPORT static String permissionString(NotificationClient::Permission);
static void requestPermission(Document&, RefPtr<NotificationPermissionCallback>&&);
#endif
ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
using RefCounted::ref;
using RefCounted::deref;
private:
#if ENABLE(LEGACY_NOTIFICATIONS)
Notification(const String& title, const String& body, const String& iconURL, ScriptExecutionContext&, ExceptionCode&, NotificationCenter&);
#endif
#if ENABLE(NOTIFICATIONS)
Notification(Document&, const String& title);
#endif
EventTargetInterface eventTargetInterface() const final { return NotificationEventTargetInterfaceType; }
void contextDestroyed() final;
const char* activeDOMObjectName() const final;
bool canSuspendForDocumentSuspension() const final;
void refEventTarget() final { ref(); }
void derefEventTarget() final { deref(); }
URL m_icon;
String m_title;
String m_body;
String m_direction;
String m_lang;
String m_tag;
enum State { Idle, Showing, Closed };
State m_state { Idle };
RefPtr<NotificationCenter> m_notificationCenter;
#if ENABLE(NOTIFICATIONS)
std::unique_ptr<Timer> m_taskTimer;
#endif
};
}
#endif // ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)