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#include "config.h"
33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
34231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(NOTIFICATIONS)
35231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Notification.h"
37e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "NotificationCenter.h"
38231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "NotificationContents.h"
39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
40231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "Document.h"
41231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "EventNames.h"
42545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "ResourceRequest.h"
43545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "ResourceResponse.h"
44545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "ThreadableLoader.h"
45d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "WorkerContext.h"
46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocknamespace WebCore {
48231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
49e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockNotification::Notification(const KURL& url, ScriptExecutionContext* context, ExceptionCode& ec, PassRefPtr<NotificationCenter> provider)
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    : ActiveDOMObject(context, this)
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , m_isHTML(true)
52545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    , m_state(Idle)
53e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_notificationCenter(provider)
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
55e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ASSERT(m_notificationCenter->presenter());
56e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (m_notificationCenter->presenter()->checkPermission(context) != NotificationPresenter::PermissionAllowed) {
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ec = SECURITY_ERR;
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (url.isEmpty() || !url.isValid()) {
62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ec = SYNTAX_ERR;
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_notificationURL = url;
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
69e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockNotification::Notification(const NotificationContents& contents, ScriptExecutionContext* context, ExceptionCode& ec, PassRefPtr<NotificationCenter> provider)
70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    : ActiveDOMObject(context, this)
71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , m_isHTML(false)
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , m_contents(contents)
73545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    , m_state(Idle)
74e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    , m_notificationCenter(provider)
75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
76e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ASSERT(m_notificationCenter->presenter());
77e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (m_notificationCenter->presenter()->checkPermission(context) != NotificationPresenter::PermissionAllowed) {
78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ec = SECURITY_ERR;
79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
80231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!contents.icon().isEmpty() && !contents.icon().isValid()) {
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        ec = SYNTAX_ERR;
84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockNotification::~Notification()
89231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
90545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_state == Loading) {
91545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        ASSERT_NOT_REACHED();
92545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        cancel();
93545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
94231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
95231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
96e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockPassRefPtr<Notification> Notification::create(const KURL& url, ScriptExecutionContext* context, ExceptionCode& ec, PassRefPtr<NotificationCenter> provider)
97e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
98e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return adoptRef(new Notification(url, context, ec, provider));
99e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
100e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
101e8b154fd68f9b33be40a3590e58347f353835f5cSteve BlockPassRefPtr<Notification> Notification::create(const NotificationContents& contents, ScriptExecutionContext* context, ExceptionCode& ec, PassRefPtr<NotificationCenter> provider)
102e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block{
103e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    return adoptRef(new Notification(contents, context, ec, provider));
104e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block}
105e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
106231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Notification::show()
107231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
108545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#if PLATFORM(QT)
109545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (iconURL().isEmpty()) {
110545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        // Set the state before actually showing, because
111545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        // handling of ondisplay may rely on that.
112545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (m_state == Idle) {
113545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_state = Showing;
114e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            if (m_notificationCenter->presenter())
115e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block                m_notificationCenter->presenter()->show(this);
116545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
117545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    } else
118545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        startLoading();
119545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#else
120231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    // prevent double-showing
121e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (m_state == Idle && m_notificationCenter->presenter() && m_notificationCenter->presenter()->show(this))
122545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_state = Showing;
123545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#endif
124231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
125231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
126231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Notification::cancel()
127231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
128545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    switch (m_state) {
129545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    case Idle:
130545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        break;
131545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    case Loading:
132545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        m_state = Cancelled;
133545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        stopLoading();
134545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        break;
135545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    case Showing:
136e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        if (m_notificationCenter->presenter())
137e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            m_notificationCenter->presenter()->cancel(this);
138545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        break;
139545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    case Cancelled:
140545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        break;
141545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
142231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
143231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
144231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockEventTargetData* Notification::eventTargetData()
145231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return &m_eventTargetData;
147231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
148231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
149231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockEventTargetData* Notification::ensureEventTargetData()
150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
151231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return &m_eventTargetData;
152231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
15406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid Notification::contextDestroyed()
15506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
15606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    ActiveDOMObject::contextDestroyed();
157e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    if (m_notificationCenter->presenter())
158e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_notificationCenter->presenter()->notificationObjectDestroyed(this);
15906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
160545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
161545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid Notification::startLoading()
162545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
163545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_state != Idle)
164545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return;
165545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    setPendingActivity(this);
166545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_state = Loading;
167545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ThreadableLoaderOptions options;
168545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    options.sendLoadCallbacks = false;
169545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    options.sniffContent = false;
170545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    options.forcePreflight = false;
171545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    options.allowCredentials = AllowStoredCredentials;
172545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    options.crossOriginRequestPolicy = AllowCrossOriginRequests;
173545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_loader = ThreadableLoader::create(scriptExecutionContext(), this, ResourceRequest(iconURL()), options);
174545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
175545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
176545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid Notification::stopLoading()
177545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
178545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_iconData = 0;
179545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    RefPtr<ThreadableLoader> protect(m_loader);
180545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_loader->cancel();
181545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
182545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
183545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid Notification::didReceiveResponse(const ResourceResponse& response)
184545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
185545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    int status = response.httpStatusCode();
186545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (status && (status < 200 || status > 299)) {
187545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        stopLoading();
188545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return;
189545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
190545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_iconData = SharedBuffer::create();
191545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
192545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid Notification::didReceiveData(const char* data, int dataLength)
194545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
1952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_iconData->append(data, dataLength);
196545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
197545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
19881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid Notification::didFinishLoading(unsigned long, double)
199545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
200545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    finishLoading();
201545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
202545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
203545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid Notification::didFail(const ResourceError&)
204545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
205545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    finishLoading();
206545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
207545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
208545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid Notification::didFailRedirectCheck()
209545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
210545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    finishLoading();
211545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
212545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
213545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid Notification::didReceiveAuthenticationCancellation(const ResourceResponse&)
214545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
215545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    finishLoading();
216545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
217545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
218545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid Notification::finishLoading()
219545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
220545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_state == Loading) {
221e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        if (m_notificationCenter->presenter() && m_notificationCenter->presenter()->show(this))
222545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_state = Showing;
223545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
224545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    unsetPendingActivity(this);
225545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
226545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block} // namespace WebCore
228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
229231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif // ENABLE(NOTIFICATIONS)
230