Home | History | Annotate | Download | only in notifications
      1 /*
      2  * Copyright (C) 2009 Google Inc. All rights reserved.
      3  * Copyright (C) 2009 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 Notification_h
     33 #define Notification_h
     34 
     35 #include "ActiveDOMObject.h"
     36 #include "Event.h"
     37 #include "EventListener.h"
     38 #include "EventNames.h"
     39 #include "EventTarget.h"
     40 #include "ExceptionCode.h"
     41 #include "KURL.h"
     42 #include "NotificationPresenter.h"
     43 #include "NotificationContents.h"
     44 #include "RegisteredEventListener.h"
     45 #include "SharedBuffer.h"
     46 #include "TextDirection.h"
     47 #include "ThreadableLoader.h"
     48 #include "ThreadableLoaderClient.h"
     49 #include <wtf/OwnPtr.h>
     50 #include <wtf/PassRefPtr.h>
     51 #include <wtf/RefCounted.h>
     52 #include <wtf/RefPtr.h>
     53 #include <wtf/text/AtomicStringHash.h>
     54 
     55 #if ENABLE(NOTIFICATIONS)
     56 namespace WebCore {
     57 
     58     class NotificationCenter;
     59     class WorkerContext;
     60 
     61     class Notification : public RefCounted<Notification>, public ActiveDOMObject, public ThreadableLoaderClient, public EventTarget {
     62         WTF_MAKE_FAST_ALLOCATED;
     63     public:
     64         static PassRefPtr<Notification> create(const KURL& url, ScriptExecutionContext* context, ExceptionCode& ec, PassRefPtr<NotificationCenter> provider);
     65         static PassRefPtr<Notification> create(const NotificationContents& contents, ScriptExecutionContext* context, ExceptionCode& ec, PassRefPtr<NotificationCenter> provider);
     66 
     67         virtual ~Notification();
     68 
     69         void show();
     70         void cancel();
     71 
     72         bool isHTML() { return m_isHTML; }
     73         KURL url() { return m_notificationURL; }
     74         KURL iconURL() { return m_contents.icon(); }
     75         NotificationContents& contents() { return m_contents; }
     76 
     77         String dir() const { return m_direction; }
     78         void setDir(const String& dir) { m_direction = dir; }
     79         String replaceId() const { return m_replaceId; }
     80         void setReplaceId(const String& replaceId) { m_replaceId = replaceId; }
     81 
     82         TextDirection direction() const { return dir() == "rtl" ? RTL : LTR; }
     83 
     84         DEFINE_ATTRIBUTE_EVENT_LISTENER(display);
     85         DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
     86         DEFINE_ATTRIBUTE_EVENT_LISTENER(close);
     87         DEFINE_ATTRIBUTE_EVENT_LISTENER(click);
     88 
     89         using RefCounted<Notification>::ref;
     90         using RefCounted<Notification>::deref;
     91 
     92         // EventTarget interface
     93         virtual ScriptExecutionContext* scriptExecutionContext() const { return ActiveDOMObject::scriptExecutionContext(); }
     94         virtual Notification* toNotification() { return this; }
     95 
     96         // ActiveDOMObject interface
     97         virtual void contextDestroyed();
     98 
     99         void stopLoading();
    100 
    101         SharedBuffer* iconData() { return m_iconData.get(); }
    102         void releaseIconData() { m_iconData = 0; }
    103 
    104         // Deprecated. Use functions from NotificationCenter.
    105         void detachPresenter() { }
    106 
    107         virtual void didReceiveResponse(const ResourceResponse&);
    108         virtual void didReceiveData(const char* data, int dataLength);
    109         virtual void didFinishLoading(unsigned long identifier, double finishTime);
    110         virtual void didFail(const ResourceError&);
    111         virtual void didFailRedirectCheck();
    112         virtual void didReceiveAuthenticationCancellation(const ResourceResponse&);
    113 
    114     private:
    115         Notification(const KURL&, ScriptExecutionContext*, ExceptionCode&, PassRefPtr<NotificationCenter>);
    116         Notification(const NotificationContents&, ScriptExecutionContext*, ExceptionCode&, PassRefPtr<NotificationCenter>);
    117 
    118         // EventTarget interface
    119         virtual void refEventTarget() { ref(); }
    120         virtual void derefEventTarget() { deref(); }
    121         virtual EventTargetData* eventTargetData();
    122         virtual EventTargetData* ensureEventTargetData();
    123 
    124         void startLoading();
    125         void finishLoading();
    126 
    127         bool m_isHTML;
    128         KURL m_notificationURL;
    129         NotificationContents m_contents;
    130 
    131         String m_direction;
    132         String m_replaceId;
    133 
    134         enum NotificationState {
    135             Idle = 0,
    136             Loading = 1,
    137             Showing = 2,
    138             Cancelled = 3
    139         };
    140 
    141         NotificationState m_state;
    142 
    143         RefPtr<NotificationCenter> m_notificationCenter;
    144 
    145         EventTargetData m_eventTargetData;
    146 
    147         RefPtr<ThreadableLoader> m_loader;
    148         RefPtr<SharedBuffer> m_iconData;
    149     };
    150 
    151 } // namespace WebCore
    152 
    153 #endif // ENABLE(NOTIFICATIONS)
    154 
    155 #endif // Notifications_h
    156