1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2009 Google Inc. All rights reserved.
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions are
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * met:
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     * Redistributions of source code must retain the above copyright
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer.
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     * Redistributions in binary form must reproduce the above
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * copyright notice, this list of conditions and the following disclaimer
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * in the documentation and/or other materials provided with the
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * distribution.
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *     * Neither the name of Google Inc. nor the names of its
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * contributors may be used to endorse or promote products derived from
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * this software without specific prior written permission.
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h"
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "NotificationPresenterClientQt.h"
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Document.h"
36545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "DumpRenderTreeSupportQt.h"
375af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "EventNames.h"
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "KURL.h"
390617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "Page.h"
40545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "QtPlatformPlugin.h"
41e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "ScriptExecutionContext.h"
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "SecurityOrigin.h"
43a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "UserGestureIndicator.h"
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
450617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "qwebframe_p.h"
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "qwebkitglobal.h"
470617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "qwebpage.h"
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
49545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochnamespace WebCore {
50545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
5106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(NOTIFICATIONS)
5206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
53545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochconst double notificationTimeout = 10.0;
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenbool NotificationPresenterClientQt::dumpNotification = false;
566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
57545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochNotificationPresenterClientQt* s_notificationPresenter = 0;
58545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
59545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochNotificationPresenterClientQt* NotificationPresenterClientQt::notificationPresenter()
60545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
61545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (s_notificationPresenter)
62545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return s_notificationPresenter;
63545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
64545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    s_notificationPresenter = new NotificationPresenterClientQt();
65545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return s_notificationPresenter;
66545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
67545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
6806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
6906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
7006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenNotificationWrapper::NotificationWrapper()
7106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    : m_closeTimer(this, &NotificationWrapper::close)
725af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
7306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(NOTIFICATIONS)
7406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#ifndef QT_NO_SYSTEMTRAYICON
765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    m_notificationIcon = 0;
775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#endif
78545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_presenter = 0;
7906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid NotificationWrapper::close(Timer<NotificationWrapper>*)
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
8406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(NOTIFICATIONS)
85545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    NotificationPresenterClientQt::notificationPresenter()->cancel(this);
8606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
8906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenconst QString NotificationWrapper::title() const
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
9106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(NOTIFICATIONS)
92545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Notification* notification = NotificationPresenterClientQt::notificationPresenter()->notificationForWrapper(this);
93545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (notification)
94545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return notification->contents().title();
9506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
96545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return QString();
97545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
985af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
9906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenconst QString NotificationWrapper::message() const
100545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(NOTIFICATIONS)
102545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Notification* notification = NotificationPresenterClientQt::notificationPresenter()->notificationForWrapper(this);
103545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (notification)
104545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return notification->contents().body();
10506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
106545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return QString();
107545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
1085af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
10906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenconst QByteArray NotificationWrapper::iconData() const
110545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
111545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QByteArray iconData;
11206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(NOTIFICATIONS)
11306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    Notification* notification = NotificationPresenterClientQt::notificationPresenter()->notificationForWrapper(this);
114545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (notification) {
115545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (notification->iconData())
116545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            iconData = QByteArray::fromRawData(notification->iconData()->data(), notification->iconData()->size());
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
11806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
119545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return iconData;
120545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12268513a70bcd92384395513322f1b801e7bf9c729Steve Blockconst QUrl NotificationWrapper::openerPageUrl() const
12368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
12468513a70bcd92384395513322f1b801e7bf9c729Steve Block    QUrl url;
12568513a70bcd92384395513322f1b801e7bf9c729Steve Block#if ENABLE(NOTIFICATIONS)
12668513a70bcd92384395513322f1b801e7bf9c729Steve Block    Notification* notification = NotificationPresenterClientQt::notificationPresenter()->notificationForWrapper(this);
12768513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (notification) {
12868513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (notification->scriptExecutionContext())
12968513a70bcd92384395513322f1b801e7bf9c729Steve Block            url = static_cast<Document*>(notification->scriptExecutionContext())->page()->mainFrame()->document()->url();
13068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
13168513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
13268513a70bcd92384395513322f1b801e7bf9c729Steve Block    return url;
13368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
13468513a70bcd92384395513322f1b801e7bf9c729Steve Block
13568513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid NotificationWrapper::notificationClicked()
13668513a70bcd92384395513322f1b801e7bf9c729Steve Block{
13768513a70bcd92384395513322f1b801e7bf9c729Steve Block#if ENABLE(NOTIFICATIONS)
13868513a70bcd92384395513322f1b801e7bf9c729Steve Block    NotificationPresenterClientQt::notificationPresenter()->notificationClicked(this);
13968513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
14068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
14168513a70bcd92384395513322f1b801e7bf9c729Steve Block
14206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid NotificationWrapper::notificationClosed()
14306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
14406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(NOTIFICATIONS)
14506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    NotificationPresenterClientQt::notificationPresenter()->cancel(this);
14606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#endif
14706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
14806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
14906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#if ENABLE(NOTIFICATIONS)
15006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
151545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochNotificationPresenterClientQt::NotificationPresenterClientQt() : m_clientCount(0)
152545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
153545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
154545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
155545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochNotificationPresenterClientQt::~NotificationPresenterClientQt()
156545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
157545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    while (!m_notifications.isEmpty()) {
158545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        NotificationsQueue::Iterator iter = m_notifications.begin();
159545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        detachNotification(iter.key());
1605af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
161545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
162545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
163545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid NotificationPresenterClientQt::removeClient()
164545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
165545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    m_clientCount--;
166545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (!m_clientCount) {
167545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        s_notificationPresenter = 0;
168545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        delete this;
169545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
170545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
171545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
172545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochbool NotificationPresenterClientQt::show(Notification* notification)
173545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
174545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // FIXME: workers based notifications are not supported yet.
175545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (notification->scriptExecutionContext()->isWorkerContext())
176545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return false;
177545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    notification->setPendingActivity(notification);
178545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (!notification->replaceId().isEmpty())
179545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        removeReplacedNotificationFromQueue(notification);
180545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (dumpNotification)
181545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        dumpShowText(notification);
182545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QByteArray iconData;
183545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (notification->iconData())
184545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        iconData = QByteArray::fromRawData(notification->iconData()->data(), notification->iconData()->size());
185545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    displayNotification(notification, iconData);
186545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    notification->releaseIconData();
187545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return true;
188545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
189545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
190545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid NotificationPresenterClientQt::displayNotification(Notification* notification, const QByteArray& bytes)
191545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
19206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    NotificationWrapper* wrapper = new NotificationWrapper();
1935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    m_notifications.insert(notification, wrapper);
194545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QString title;
195545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QString message;
196545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // FIXME: download & display HTML notifications
197545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (notification->isHTML())
198545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        message = notification->url().string();
199545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    else {
200545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        title = notification->contents().title();
201545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        message = notification->contents().body();
202545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
203545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
204545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_platformPlugin.plugin() && m_platformPlugin.plugin()->supportsExtension(QWebKitPlatformPlugin::Notifications))
205545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        wrapper->m_presenter = m_platformPlugin.createNotificationPresenter();
206545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
207545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (!wrapper->m_presenter) {
208545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#ifndef QT_NO_SYSTEMTRAYICON
209967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        if (!dumpNotification)
210967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            wrapper->m_closeTimer.startOneShot(notificationTimeout);
211545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        QPixmap pixmap;
212545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (bytes.length() && pixmap.loadFromData(bytes)) {
213545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            QIcon icon(pixmap);
214545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            wrapper->m_notificationIcon = new QSystemTrayIcon(icon);
215545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        } else
216545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            wrapper->m_notificationIcon = new QSystemTrayIcon();
217545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#endif
218545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
219545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
2205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    sendEvent(notification, "display");
2215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
222545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // Make sure the notification was not cancelled during handling the display event
223545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (m_notifications.find(notification) == m_notifications.end())
224545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return;
225545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
226545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (wrapper->m_presenter) {
227545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        wrapper->connect(wrapper->m_presenter.get(), SIGNAL(notificationClosed()), wrapper, SLOT(notificationClosed()), Qt::QueuedConnection);
22868513a70bcd92384395513322f1b801e7bf9c729Steve Block        wrapper->connect(wrapper->m_presenter.get(), SIGNAL(notificationClicked()), wrapper, SLOT(notificationClicked()));
229545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        wrapper->m_presenter->showNotification(wrapper);
230545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return;
231545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
232545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef QT_NO_SYSTEMTRAYICON
23468513a70bcd92384395513322f1b801e7bf9c729Steve Block    wrapper->connect(wrapper->m_notificationIcon.get(), SIGNAL(messageClicked()), wrapper, SLOT(notificationClicked()));
2355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    wrapper->m_notificationIcon->show();
2365af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    wrapper->m_notificationIcon->showMessage(notification->contents().title(), notification->contents().body());
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid NotificationPresenterClientQt::cancel(Notification* notification)
241545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
242545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (dumpNotification && notification->scriptExecutionContext()) {
243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (notification->isHTML())
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            printf("DESKTOP NOTIFICATION CLOSED: %s\n", QString(notification->url().string()).toUtf8().constData());
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        else
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            printf("DESKTOP NOTIFICATION CLOSED: %s\n", QString(notification->contents().title()).toUtf8().constData());
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
249545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    NotificationsQueue::Iterator iter = m_notifications.find(notification);
250545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (iter != m_notifications.end()) {
251545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        sendEvent(notification, eventNames().closeEvent);
252545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        detachNotification(notification);
253545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
254545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
255545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
25606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid NotificationPresenterClientQt::cancel(NotificationWrapper* wrapper)
257545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
258545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Notification* notification = notificationForWrapper(wrapper);
259545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (notification)
260545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        cancel(notification);
261545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
262545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
26368513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid NotificationPresenterClientQt::notificationClicked(NotificationWrapper* wrapper)
26468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
26568513a70bcd92384395513322f1b801e7bf9c729Steve Block    Notification* notification =  notificationForWrapper(wrapper);
266a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (notification) {
267a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // Make sure clicks on notifications are treated as user gestures.
268a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
26968513a70bcd92384395513322f1b801e7bf9c729Steve Block        sendEvent(notification, eventNames().clickEvent);
270a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
27168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
27268513a70bcd92384395513322f1b801e7bf9c729Steve Block
27368513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid NotificationPresenterClientQt::notificationClicked(const QString& title)
27468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
27568513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!dumpNotification)
27668513a70bcd92384395513322f1b801e7bf9c729Steve Block        return;
27768513a70bcd92384395513322f1b801e7bf9c729Steve Block    NotificationsQueue::ConstIterator end = m_notifications.end();
27868513a70bcd92384395513322f1b801e7bf9c729Steve Block    NotificationsQueue::ConstIterator iter = m_notifications.begin();
27968513a70bcd92384395513322f1b801e7bf9c729Steve Block    Notification* notification = 0;
28068513a70bcd92384395513322f1b801e7bf9c729Steve Block    while (iter != end) {
28168513a70bcd92384395513322f1b801e7bf9c729Steve Block        notification = iter.key();
28268513a70bcd92384395513322f1b801e7bf9c729Steve Block        QString notificationTitle;
28368513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (notification->isHTML())
28468513a70bcd92384395513322f1b801e7bf9c729Steve Block            notificationTitle = notification->url().string();
28568513a70bcd92384395513322f1b801e7bf9c729Steve Block        else
28668513a70bcd92384395513322f1b801e7bf9c729Steve Block            notificationTitle = notification->contents().title();
28768513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (notificationTitle == title)
28868513a70bcd92384395513322f1b801e7bf9c729Steve Block            break;
28968513a70bcd92384395513322f1b801e7bf9c729Steve Block        iter++;
29068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
29168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (notification)
29268513a70bcd92384395513322f1b801e7bf9c729Steve Block        sendEvent(notification, eventNames().clickEvent);
29368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
29468513a70bcd92384395513322f1b801e7bf9c729Steve Block
29506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenNotification* NotificationPresenterClientQt::notificationForWrapper(const NotificationWrapper* wrapper) const
296545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
297545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    NotificationsQueue::ConstIterator end = m_notifications.end();
298545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    NotificationsQueue::ConstIterator iter = m_notifications.begin();
299545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    while (iter != end && iter.value() != wrapper)
300545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        iter++;
301545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (iter != end)
302545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return iter.key();
303545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    return 0;
304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid NotificationPresenterClientQt::notificationObjectDestroyed(Notification* notification)
307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
3085af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // Called from ~Notification(), Remove the entry from the notifications list and delete the icon.
309545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    NotificationsQueue::Iterator iter = m_notifications.find(notification);
3105af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (iter != m_notifications.end())
3115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        delete m_notifications.take(notification);
312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
314e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkevoid NotificationPresenterClientQt::requestPermission(ScriptExecutionContext* context, PassRefPtr<VoidCallback> callback)
315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (dumpNotification)
317e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        printf("DESKTOP NOTIFICATION PERMISSION REQUESTED: %s\n", QString(context->securityOrigin()->toString()).toUtf8().constData());
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
3190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QHash<ScriptExecutionContext*, CallbacksInfo >::iterator iter = m_pendingPermissionRequests.find(context);
3205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (iter != m_pendingPermissionRequests.end())
3210617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        iter.value().m_callbacks.append(callback);
3225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    else {
3235af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        RefPtr<VoidCallback> cb = callback;
3240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        CallbacksInfo info;
3250617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        info.m_frame = toFrame(context);
3260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        info.m_callbacks.append(cb);
3270617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_pendingPermissionRequests.insert(context, info);
3280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
3290617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        if (toPage(context) && toFrame(context)) {
3300617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            m_pendingPermissionRequests.insert(context, info);
3314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            emit toPage(context)->featurePermissionRequested(toFrame(context), QWebPage::Notifications);
3320617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        }
3335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
3345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
3355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
336e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeNotificationPresenter::Permission NotificationPresenterClientQt::checkPermission(ScriptExecutionContext* context)
3375af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
3386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return m_cachedPermissions.value(context, NotificationPresenter::PermissionNotAllowed);
3395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
3405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
3410617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenvoid NotificationPresenterClientQt::cancelRequestsForPermission(ScriptExecutionContext* context)
342e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
3436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_cachedPermissions.remove(context);
3446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
3450617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QHash<ScriptExecutionContext*, CallbacksInfo >::iterator iter = m_pendingPermissionRequests.find(context);
3460617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (iter == m_pendingPermissionRequests.end())
3470617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return;
3480617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
3490617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QWebFrame* frame = iter.value().m_frame;
3500617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!frame)
3510617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return;
3520617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QWebPage* page = frame->page();
3530617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    m_pendingPermissionRequests.erase(iter);
3540617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
3550617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!page)
3560617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return;
3570617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
3580617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (dumpNotification)
3590617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        printf("DESKTOP NOTIFICATION PERMISSION REQUEST CANCELLED: %s\n", QString(context->securityOrigin()->toString()).toUtf8().constData());
3600617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
3614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    emit page->featurePermissionRequestCanceled(frame, QWebPage::Notifications);
362e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
363e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
3646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid NotificationPresenterClientQt::allowNotificationForFrame(Frame* frame)
3655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
3666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_cachedPermissions.insert(frame->document(), NotificationPresenter::PermissionAllowed);
3676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
3680617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QHash<ScriptExecutionContext*,  CallbacksInfo>::iterator iter = m_pendingPermissionRequests.begin();
3690617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    while (iter != m_pendingPermissionRequests.end()) {
3706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (iter.key() == frame->document())
3710617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen            break;
3725af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
3730617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
3740617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (iter == m_pendingPermissionRequests.end())
3750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return;
3760617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
3770617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QList<RefPtr<VoidCallback> >& callbacks = iter.value().m_callbacks;
3780617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    for (int i = 0; i < callbacks.size(); i++)
3790617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        callbacks.at(i)->handleEvent();
3800617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    m_pendingPermissionRequests.remove(iter.key());
3815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
3825af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
383545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid NotificationPresenterClientQt::sendEvent(Notification* notification, const AtomicString& eventName)
3845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
385545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (notification->scriptExecutionContext())
386545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        notification->dispatchEvent(Event::create(eventName, false, true));
387545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
388545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
389545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid NotificationPresenterClientQt::removeReplacedNotificationFromQueue(Notification* notification)
390545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
391545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Notification* oldNotification = 0;
392545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    NotificationsQueue::Iterator end = m_notifications.end();
393545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    NotificationsQueue::Iterator iter = m_notifications.begin();
394545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
395545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    while (iter != end) {
396545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        Notification* existingNotification = iter.key();
397545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (existingNotification->replaceId() == notification->replaceId() && existingNotification->url().protocol() == notification->url().protocol() && existingNotification->url().host() == notification->url().host()) {
398545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            oldNotification = iter.key();
399545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            break;
400545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
401545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        iter++;
402545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
403545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
404545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (oldNotification) {
405545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (dumpNotification)
406545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            dumpReplacedIdText(oldNotification);
407545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        sendEvent(oldNotification, eventNames().closeEvent);
408545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        detachNotification(oldNotification);
4095af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
412545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid NotificationPresenterClientQt::detachNotification(Notification* notification)
413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
414545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    delete m_notifications.take(notification);
415545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    notification->detachPresenter();
416545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    notification->unsetPendingActivity(notification);
417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
419545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid NotificationPresenterClientQt::dumpReplacedIdText(Notification* notification)
420545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
421545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (notification)
422545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        printf("REPLACING NOTIFICATION %s\n", notification->isHTML() ? QString(notification->url().string()).toUtf8().constData() : QString(notification->contents().title()).toUtf8().constData());
423545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
424545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
425545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid NotificationPresenterClientQt::dumpShowText(Notification* notification)
426545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
427545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (notification->isHTML())
428545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        printf("DESKTOP NOTIFICATION: contents at %s\n", QString(notification->url().string()).toUtf8().constData());
429545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    else {
430545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        printf("DESKTOP NOTIFICATION:%s icon %s, title %s, text %s\n",
431545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                notification->dir() == "rtl" ? "(RTL)" : "",
432545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            QString(notification->contents().icon().string()).toUtf8().constData(), QString(notification->contents().title()).toUtf8().constData(),
433545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            QString(notification->contents().body()).toUtf8().constData());
434545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
435545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
436545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
4370617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenQWebPage* NotificationPresenterClientQt::toPage(ScriptExecutionContext* context)
4380617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
4390617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!context || context->isWorkerContext())
4400617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
4410617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4420617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    Document* document = static_cast<Document*>(context);
4430617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    Page* page = document->page();
4450617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!page || !page->mainFrame())
4460617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
4470617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4480617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return QWebFramePrivate::kit(page->mainFrame())->page();
4490617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
4500617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4510617145a89917ae7735fe1c9538688ab9a577df5Kristian MonsenQWebFrame* NotificationPresenterClientQt::toFrame(ScriptExecutionContext* context)
4520617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen{
4530617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!context || context->isWorkerContext())
4540617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
4550617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4560617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    Document* document = static_cast<Document*>(context);
4570617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!document || !document->frame())
4580617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        return 0;
4590617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
4600617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    return QWebFramePrivate::kit(document->frame());
4610617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen}
4620617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
463dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif // ENABLE(NOTIFICATIONS)
46406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
46506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
46606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "moc_NotificationPresenterClientQt.cpp"
467