Move WebCore into Source
[WebKit.git] / Source / WebCore / notifications / Notification.h
1 /*
2  * Copyright (C) 2009 Google Inc. All rights reserved.
3  * Copyright (C) 2009 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 "Event.h"
37 #include "EventListener.h"
38 #include "EventNames.h"
39 #include "EventTarget.h"
40 #include "ExceptionCode.h"
41 #include "KURL.h"
42 #include "NotificationPresenter.h"
43 #include "NotificationContents.h"
44 #include "RegisteredEventListener.h"
45 #include "SharedBuffer.h"
46 #include "TextDirection.h"
47 #include "ThreadableLoader.h"
48 #include "ThreadableLoaderClient.h"
49 #include <wtf/OwnPtr.h>
50 #include <wtf/PassRefPtr.h>
51 #include <wtf/RefCounted.h>
52 #include <wtf/RefPtr.h>
53 #include <wtf/text/AtomicStringHash.h>
54
55 #if ENABLE(NOTIFICATIONS)
56 namespace WebCore {
57
58     class NotificationCenter;
59     class WorkerContext;
60
61     class Notification : public RefCounted<Notification>, public ActiveDOMObject, public ThreadableLoaderClient, public EventTarget {
62     public:
63         static PassRefPtr<Notification> create(const KURL& url, ScriptExecutionContext* context, ExceptionCode& ec, PassRefPtr<NotificationCenter> provider);
64         static PassRefPtr<Notification> create(const NotificationContents& contents, ScriptExecutionContext* context, ExceptionCode& ec, PassRefPtr<NotificationCenter> provider);
65         
66         virtual ~Notification();
67
68         void show();
69         void cancel();
70     
71         bool isHTML() { return m_isHTML; }
72         KURL url() { return m_notificationURL; }
73         KURL iconURL() { return m_contents.icon(); }
74         NotificationContents& contents() { return m_contents; }
75
76         String dir() const { return m_direction; }
77         void setDir(const String& dir) { m_direction = dir; }
78         String replaceId() const { return m_replaceId; }
79         void setReplaceId(const String& replaceId) { m_replaceId = replaceId; }
80
81         TextDirection direction() const { return dir() == "rtl" ? RTL : LTR; }
82
83         DEFINE_ATTRIBUTE_EVENT_LISTENER(display);
84         DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
85         DEFINE_ATTRIBUTE_EVENT_LISTENER(close);
86         DEFINE_ATTRIBUTE_EVENT_LISTENER(click);
87     
88         using RefCounted<Notification>::ref;
89         using RefCounted<Notification>::deref;
90     
91         // EventTarget interface
92         virtual ScriptExecutionContext* scriptExecutionContext() const { return ActiveDOMObject::scriptExecutionContext(); }
93         virtual Notification* toNotification() { return this; }
94
95         // ActiveDOMObject interface
96         virtual void contextDestroyed();
97
98         void stopLoading();
99
100         SharedBuffer* iconData() { return m_iconData.get(); }
101         void releaseIconData() { m_iconData = 0; }
102
103         // Deprecated. Use functions from NotificationCenter.
104         void detachPresenter() { }
105
106         virtual void didReceiveResponse(const ResourceResponse&);
107         virtual void didReceiveData(const char* data, int lengthReceived);
108         virtual void didFinishLoading(unsigned long identifier);
109         virtual void didFail(const ResourceError&);
110         virtual void didFailRedirectCheck();
111         virtual void didReceiveAuthenticationCancellation(const ResourceResponse&);
112
113     private:
114         Notification(const KURL&, ScriptExecutionContext*, ExceptionCode&, PassRefPtr<NotificationCenter>);
115         Notification(const NotificationContents&, ScriptExecutionContext*, ExceptionCode&, PassRefPtr<NotificationCenter>);
116
117         // EventTarget interface
118         virtual void refEventTarget() { ref(); }
119         virtual void derefEventTarget() { deref(); }
120         virtual EventTargetData* eventTargetData();
121         virtual EventTargetData* ensureEventTargetData();
122
123         void startLoading();
124         void finishLoading();
125
126         bool m_isHTML;
127         KURL m_notificationURL;
128         NotificationContents m_contents;
129
130         String m_direction;
131         String m_replaceId;
132
133         enum NotificationState {
134             Idle = 0,
135             Loading = 1,
136             Showing = 2,
137             Cancelled = 3
138         };
139
140         NotificationState m_state;
141
142         RefPtr<NotificationCenter> m_notificationCenter;
143         
144         EventTargetData m_eventTargetData;
145
146         RefPtr<ThreadableLoader> m_loader;
147         RefPtr<SharedBuffer> m_iconData;
148     };
149
150 } // namespace WebCore
151
152 #endif // ENABLE(NOTIFICATIONS)
153
154 #endif // Notifications_h