CTTE Timer and DeferrableOneShotTimer
[WebKit-https.git] / Source / WebCore / Modules / notifications / Notification.h
1 /*
2  * Copyright (C) 2009 Google Inc. All rights reserved.
3  * Copyright (C) 2009, 2011, 2012 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  *     * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *     * Redistributions in binary form must reproduce the above
12  * copyright notice, this list of conditions and the following disclaimer
13  * in the documentation and/or other materials provided with the
14  * distribution.
15  *     * Neither the name of Google Inc. nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #ifndef Notification_h  
33 #define Notification_h
34
35 #include "ActiveDOMObject.h"
36 #include "EventNames.h"
37 #include "EventTarget.h"
38 #include "URL.h"
39 #include "NotificationClient.h"
40 #include "SharedBuffer.h"
41 #include "TextDirection.h"
42 #include "ThreadableLoaderClient.h"
43 #include <wtf/OwnPtr.h>
44 #include <wtf/PassRefPtr.h>
45 #include <wtf/RefCounted.h>
46 #include <wtf/RefPtr.h>
47 #include <wtf/text/AtomicStringHash.h>
48
49 #if ENABLE(NOTIFICATIONS)
50 #include "Timer.h"
51 #endif
52
53 #if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
54 namespace WebCore {
55
56 class Dictionary;
57 class NotificationCenter;
58 class NotificationPermissionCallback;
59 class ResourceError;
60 class ResourceResponse;
61 class ScriptExecutionContext;
62 class ThreadableLoader;
63
64 typedef int ExceptionCode;
65
66 class Notification FINAL : public RefCounted<Notification>, public ActiveDOMObject, public EventTargetWithInlineData {
67     WTF_MAKE_FAST_ALLOCATED;
68 public:
69     Notification();
70 #if ENABLE(LEGACY_NOTIFICATIONS)
71     static PassRefPtr<Notification> create(const String& title, const String& body, const String& iconURI, ScriptExecutionContext*, ExceptionCode&, PassRefPtr<NotificationCenter> provider);
72 #endif
73 #if ENABLE(NOTIFICATIONS)
74     static PassRefPtr<Notification> create(ScriptExecutionContext&, const String& title, const Dictionary& options);
75 #endif
76     
77     virtual ~Notification();
78
79     void show();
80 #if ENABLE(LEGACY_NOTIFICATIONS)
81     void cancel() { close(); }
82 #endif
83     void close();
84
85     URL iconURL() const { return m_icon; }
86     void setIconURL(const URL& url) { m_icon = url; }
87
88     String title() const { return m_title; }
89     String body() const { return m_body; }
90
91     String lang() const { return m_lang; }
92     void setLang(const String& lang) { m_lang = lang; }
93
94     String dir() const { return m_direction; }
95     void setDir(const String& dir) { m_direction = dir; }
96
97 #if ENABLE(LEGACY_NOTIFICATIONS)
98     String replaceId() const { return tag(); }
99     void setReplaceId(const String& replaceId) { setTag(replaceId); }
100 #endif
101
102     String tag() const { return m_tag; }
103     void setTag(const String& tag) { m_tag = tag; }
104
105     TextDirection direction() const { return dir() == "rtl" ? RTL : LTR; }
106
107 #if ENABLE(LEGACY_NOTIFICATIONS)
108     EventListener* ondisplay() { return getAttributeEventListener(eventNames().showEvent); }
109     void setOndisplay(PassRefPtr<EventListener> listener) { setAttributeEventListener(eventNames().showEvent, listener); }
110 #endif
111     DEFINE_ATTRIBUTE_EVENT_LISTENER(show);
112     DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
113     DEFINE_ATTRIBUTE_EVENT_LISTENER(close);
114     DEFINE_ATTRIBUTE_EVENT_LISTENER(click);
115     
116     void dispatchClickEvent();
117     void dispatchCloseEvent();
118     void dispatchErrorEvent();
119     void dispatchShowEvent();
120
121     using RefCounted<Notification>::ref;
122     using RefCounted<Notification>::deref;
123
124     // EventTarget interface
125     virtual EventTargetInterface eventTargetInterface() const OVERRIDE { return NotificationEventTargetInterfaceType; }
126     virtual ScriptExecutionContext* scriptExecutionContext() const OVERRIDE { return ActiveDOMObject::scriptExecutionContext(); }
127
128     void stopLoadingIcon();
129
130     // Deprecated. Use functions from NotificationCenter.
131     void detachPresenter() { }
132
133     void finalize();
134
135 #if ENABLE(NOTIFICATIONS)
136     static const String permission(ScriptExecutionContext*);
137     static const String permissionString(NotificationClient::Permission);
138     static void requestPermission(ScriptExecutionContext*, PassRefPtr<NotificationPermissionCallback> = 0);
139 #endif
140
141 private:
142 #if ENABLE(LEGACY_NOTIFICATIONS)
143     Notification(const String& title, const String& body, const String& iconURI, ScriptExecutionContext*, ExceptionCode&, PassRefPtr<NotificationCenter>);
144 #endif
145 #if ENABLE(NOTIFICATIONS)
146     Notification(ScriptExecutionContext&, const String& title);
147 #endif
148
149     void setBody(const String& body) { m_body = body; }
150
151     // ActiveDOMObject interface
152     virtual void contextDestroyed() OVERRIDE;
153
154     // EventTarget interface
155     virtual void refEventTarget() OVERRIDE { ref(); }
156     virtual void derefEventTarget() OVERRIDE { deref(); }
157
158     void startLoadingIcon();
159     void finishLoadingIcon();
160
161 #if ENABLE(NOTIFICATIONS)
162     void taskTimerFired(Timer<Notification>&);
163 #endif
164
165     // Text notifications.
166     URL m_icon;
167     String m_title;
168     String m_body;
169     String m_direction;
170     String m_lang;
171     String m_tag;
172
173     enum NotificationState {
174         Idle = 0,
175         Showing = 1,
176         Closed = 2,
177     };
178
179     NotificationState m_state;
180
181     RefPtr<NotificationCenter> m_notificationCenter;
182
183 #if ENABLE(NOTIFICATIONS)
184     OwnPtr<Timer<Notification>> m_taskTimer;
185 #endif
186 };
187
188 } // namespace WebCore
189
190 #endif // ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
191
192 #endif // Notifications_h