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