1/* 2 * Copyright (C) 2009 Google Inc. All rights reserved. 3 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * * Redistributions in binary form must reproduce the above 12 * copyright notice, this list of conditions and the following disclaimer 13 * in the documentation and/or other materials provided with the 14 * distribution. 15 * * Neither the name of Google Inc. nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#ifndef NotificationCenter_h 33#define NotificationCenter_h 34 35#include "ExceptionCode.h" 36#include "Notification.h" 37#include "ScriptExecutionContext.h" 38#include "Timer.h" 39#include "VoidCallback.h" 40#include <wtf/PassRefPtr.h> 41#include <wtf/RefCounted.h> 42#include <wtf/RefPtr.h> 43 44#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS) 45 46namespace WebCore { 47 48class NotificationClient; 49class VoidCallback; 50 51class NotificationCenter : public RefCounted<NotificationCenter>, public ActiveDOMObject { 52public: 53 static PassRef<NotificationCenter> create(ScriptExecutionContext*, NotificationClient*); 54 55#if ENABLE(LEGACY_NOTIFICATIONS) 56 PassRefPtr<Notification> createNotification(const String& iconURI, const String& title, const String& body, ExceptionCode& ec) 57 { 58 if (!client()) { 59 ec = INVALID_STATE_ERR; 60 return 0; 61 } 62 return Notification::create(title, body, iconURI, scriptExecutionContext(), ec, this); 63 } 64#endif 65 66 NotificationClient* client() const { return m_client; } 67 68#if ENABLE(LEGACY_NOTIFICATIONS) 69 int checkPermission(); 70 void requestPermission(PassRefPtr<VoidCallback> = 0); 71#endif 72 73private: 74 NotificationCenter(ScriptExecutionContext*, NotificationClient*); 75 76 // ActiveDOMObject 77 virtual void stop() override; 78 79 class NotificationRequestCallback : public RefCounted<NotificationRequestCallback> { 80 public: 81 static PassRefPtr<NotificationRequestCallback> createAndStartTimer(NotificationCenter*, PassRefPtr<VoidCallback>); 82 void startTimer(); 83 void timerFired(Timer<NotificationRequestCallback>&); 84 private: 85 NotificationRequestCallback(NotificationCenter*, PassRefPtr<VoidCallback>); 86 87 RefPtr<NotificationCenter> m_notificationCenter; 88 Timer<NotificationRequestCallback> m_timer; 89 RefPtr<VoidCallback> m_callback; 90 }; 91 92 void requestTimedOut(NotificationRequestCallback*); 93 94 NotificationClient* m_client; 95 HashSet<RefPtr<NotificationRequestCallback>> m_callbacks; 96}; 97 98} // namespace WebCore 99 100#endif // ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS) 101 102#endif // NotificationCenter_h 103