1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2009 Google Inc. All rights reserved.
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
48f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met:
88f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions of source code must retain the above copyright
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer.
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions in binary form must reproduce the above
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution.
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Neither the name of Google Inc. nor the names of its
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission.
18d0825bca7fe65beaee391d30da42e937db621564Steve Block *
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#ifndef NotificationPresenterClientQt_h
335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#define NotificationPresenterClientQt_h
345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Notification.h"
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "NotificationPresenter.h"
37545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "QtPlatformPlugin.h"
38545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "Timer.h"
39545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
40545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "qwebkitplatformplugin.h"
415e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include <QMultiHash>
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QSystemTrayIcon>
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
450617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenclass QWebFrame;
460617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsenclass QWebPage;
470617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
49545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass Document;
516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerclass Frame;
52e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkeclass ScriptExecutionContext;
53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenclass NotificationWrapper : public QObject, public QWebNotificationData {
55545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Q_OBJECT
56545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochpublic:
5706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    NotificationWrapper();
5806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    ~NotificationWrapper() {}
59545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
60545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void close();
6106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void close(Timer<NotificationWrapper>*);
62545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    const QString title() const;
63545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    const QString message() const;
64545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    const QByteArray iconData() const;
6568513a70bcd92384395513322f1b801e7bf9c729Steve Block    const QUrl openerPageUrl() const;
66545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
67545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochpublic Q_SLOTS:
68545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void notificationClosed();
6968513a70bcd92384395513322f1b801e7bf9c729Steve Block    void notificationClicked();
70545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
71545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochpublic:
725af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#ifndef QT_NO_SYSTEMTRAYICON
73545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    OwnPtr<QSystemTrayIcon> m_notificationIcon;
745af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#endif
75545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
76545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    OwnPtr<QWebNotificationPresenter> m_presenter;
7706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    Timer<NotificationWrapper> m_closeTimer;
785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke};
795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
80545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#if ENABLE(NOTIFICATIONS)
81545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
8206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsentypedef QHash <Notification*, NotificationWrapper*> NotificationsQueue;
83545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass NotificationPresenterClientQt : public NotificationPresenter {
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic:
86545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    NotificationPresenterClientQt();
87545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ~NotificationPresenterClientQt();
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    /* WebCore::NotificationPresenter interface */
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual bool show(Notification*);
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual void cancel(Notification*);
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual void notificationObjectDestroyed(Notification*);
93e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    virtual void requestPermission(ScriptExecutionContext*, PassRefPtr<VoidCallback>);
94e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    virtual NotificationPresenter::Permission checkPermission(ScriptExecutionContext*);
95e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    virtual void cancelRequestsForPermission(ScriptExecutionContext*);
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
9706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    void cancel(NotificationWrapper*);
98545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    void allowNotificationForFrame(Frame*);
1005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    static bool dumpNotification;
1026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
103545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void addClient() { m_clientCount++; }
104545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void removeClient();
105545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    static NotificationPresenterClientQt* notificationPresenter();
106545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
10706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    Notification* notificationForWrapper(const NotificationWrapper*) const;
10868513a70bcd92384395513322f1b801e7bf9c729Steve Block    void notificationClicked(NotificationWrapper*);
10968513a70bcd92384395513322f1b801e7bf9c729Steve Block    void notificationClicked(const QString& title);
110545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
1115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeprivate:
1125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    void sendEvent(Notification*, const AtomicString& eventName);
113545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void displayNotification(Notification*, const QByteArray&);
114545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void removeReplacedNotificationFromQueue(Notification*);
115545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void detachNotification(Notification*);
116545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void dumpReplacedIdText(Notification*);
117545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void dumpShowText(Notification*);
1180617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QWebPage* toPage(ScriptExecutionContext*);
1190617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QWebFrame* toFrame(ScriptExecutionContext*);
120545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
121545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    int m_clientCount;
1220617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    struct CallbacksInfo {
1230617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        QWebFrame* m_frame;
1240617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        QList<RefPtr<VoidCallback> > m_callbacks;
1250617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    };
1260617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QHash<ScriptExecutionContext*,  CallbacksInfo > m_pendingPermissionRequests;
1276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    QHash<ScriptExecutionContext*, NotificationPresenter::Permission> m_cachedPermissions;
1280617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
129545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    NotificationsQueue m_notifications;
130545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QtPlatformPlugin m_platformPlugin;
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1335e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#endif
1345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
135545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
136545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
137545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#endif
138