1231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block/*
2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2009 Google Inc. All rights reserved.
3231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2009 Apple Inc. All rights reserved.
4231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
5231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Redistribution and use in source and binary forms, with or without
6231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * modification, are permitted provided that the following conditions are
7231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * met:
8231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
9231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *     * Redistributions of source code must retain the above copyright
10231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * notice, this list of conditions and the following disclaimer.
11231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *     * Redistributions in binary form must reproduce the above
12231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * copyright notice, this list of conditions and the following disclaimer
13231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * in the documentation and/or other materials provided with the
14231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * distribution.
15231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *     * Neither the name of Google Inc. nor the names of its
16231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * contributors may be used to endorse or promote products derived from
17231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * this software without specific prior written permission.
18231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block *
19231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block */
31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef Notification_h
33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define Notification_h
34231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
35231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "ActiveDOMObject.h"
36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Event.h"
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "EventListener.h"
38231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "EventNames.h"
39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "EventTarget.h"
40231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "ExceptionCode.h"
41231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "KURL.h"
42231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "NotificationPresenter.h"
43231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "NotificationContents.h"
44231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "RegisteredEventListener.h"
45545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "SharedBuffer.h"
4606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "TextDirection.h"
47545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "ThreadableLoader.h"
48545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "ThreadableLoaderClient.h"
49231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/OwnPtr.h>
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/PassRefPtr.h>
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/RefCounted.h>
52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/RefPtr.h>
53f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/AtomicStringHash.h>
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(NOTIFICATIONS)
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocknamespace WebCore {
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
58e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    class NotificationCenter;
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    class WorkerContext;
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
61545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    class Notification : public RefCounted<Notification>, public ActiveDOMObject, public ThreadableLoaderClient, public EventTarget {
62ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        WTF_MAKE_FAST_ALLOCATED;
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    public:
64e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        static PassRefPtr<Notification> create(const KURL& url, ScriptExecutionContext* context, ExceptionCode& ec, PassRefPtr<NotificationCenter> provider);
65e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        static PassRefPtr<Notification> create(const NotificationContents& contents, ScriptExecutionContext* context, ExceptionCode& ec, PassRefPtr<NotificationCenter> provider);
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        virtual ~Notification();
68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void show();
70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void cancel();
71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        bool isHTML() { return m_isHTML; }
73231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        KURL url() { return m_notificationURL; }
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        KURL iconURL() { return m_contents.icon(); }
75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        NotificationContents& contents() { return m_contents; }
76231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        String dir() const { return m_direction; }
785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        void setDir(const String& dir) { m_direction = dir; }
795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        String replaceId() const { return m_replaceId; }
805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        void setReplaceId(const String& replaceId) { m_replaceId = replaceId; }
815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        TextDirection direction() const { return dir() == "rtl" ? RTL : LTR; }
8306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        DEFINE_ATTRIBUTE_EVENT_LISTENER(display);
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        DEFINE_ATTRIBUTE_EVENT_LISTENER(close);
875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        DEFINE_ATTRIBUTE_EVENT_LISTENER(click);
88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
89231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        using RefCounted<Notification>::ref;
90231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        using RefCounted<Notification>::deref;
91231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
92231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // EventTarget interface
93231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        virtual ScriptExecutionContext* scriptExecutionContext() const { return ActiveDOMObject::scriptExecutionContext(); }
94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        virtual Notification* toNotification() { return this; }
95231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
9606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        // ActiveDOMObject interface
9706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        virtual void contextDestroyed();
9806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
99545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        void stopLoading();
100545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
101545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        SharedBuffer* iconData() { return m_iconData.get(); }
102545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        void releaseIconData() { m_iconData = 0; }
103545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
104e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        // Deprecated. Use functions from NotificationCenter.
105e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        void detachPresenter() { }
106545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
107545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        virtual void didReceiveResponse(const ResourceResponse&);
1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        virtual void didReceiveData(const char* data, int dataLength);
10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        virtual void didFinishLoading(unsigned long identifier, double finishTime);
110545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        virtual void didFail(const ResourceError&);
111545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        virtual void didFailRedirectCheck();
112545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        virtual void didReceiveAuthenticationCancellation(const ResourceResponse&);
113545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
114231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    private:
115e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        Notification(const KURL&, ScriptExecutionContext*, ExceptionCode&, PassRefPtr<NotificationCenter>);
116e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        Notification(const NotificationContents&, ScriptExecutionContext*, ExceptionCode&, PassRefPtr<NotificationCenter>);
117231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
118231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // EventTarget interface
119231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        virtual void refEventTarget() { ref(); }
120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        virtual void derefEventTarget() { deref(); }
121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        virtual EventTargetData* eventTargetData();
122231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        virtual EventTargetData* ensureEventTargetData();
123231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
124545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        void startLoading();
125545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        void finishLoading();
126545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        bool m_isHTML;
128231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        KURL m_notificationURL;
129231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        NotificationContents m_contents;
130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        String m_direction;
1325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        String m_replaceId;
133545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
134545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        enum NotificationState {
135545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            Idle = 0,
136545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            Loading = 1,
137545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            Showing = 2,
138545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            Cancelled = 3
139545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        };
140545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
141545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        NotificationState m_state;
142231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
143e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        RefPtr<NotificationCenter> m_notificationCenter;
144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
145231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        EventTargetData m_eventTargetData;
146545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
147545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        RefPtr<ThreadableLoader> m_loader;
148545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        RefPtr<SharedBuffer> m_iconData;
149231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    };
150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
151231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} // namespace WebCore
152231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // ENABLE(NOTIFICATIONS)
154231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
155231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // Notifications_h
156