Reviewed by Darin Adler.
[WebKit-https.git] / WebCore / loader / appcache / DOMApplicationCache.h
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef DOMApplicationCache_h
27 #define DOMApplicationCache_h
28
29 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
30
31 #include <wtf/RefCounted.h>
32 #include "EventTarget.h"
33
34 #include "EventListener.h"
35 #include <wtf/HashMap.h>
36 #include <wtf/PassRefPtr.h>
37 #include <wtf/Vector.h>
38
39 namespace WebCore {
40
41 class ApplicationCache;
42 class AtomicStringImpl;
43 class Frame;
44 class KURL;
45 class String;
46     
47 class DOMApplicationCache : public RefCounted<DOMApplicationCache>, public EventTarget {
48 public:
49     static PassRefPtr<DOMApplicationCache> create(Frame* frame) { return adoptRef(new DOMApplicationCache(frame)); }
50     void disconnectFrame();
51
52     enum Status {
53         UNCACHED = 0,
54         IDLE = 1,
55         CHECKING = 2,
56         DOWNLOADING = 3,
57         UPDATEREADY = 4,
58     };
59
60     unsigned short status() const;
61     
62     void update(ExceptionCode&);
63     void swapCache(ExceptionCode&);
64     
65     unsigned length() const;
66     String item(unsigned item, ExceptionCode&);
67     void add(const KURL&, ExceptionCode&);
68     void remove(const KURL&, ExceptionCode&);
69
70     virtual void addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
71     virtual void removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture);
72     virtual bool dispatchEvent(PassRefPtr<Event>, ExceptionCode&);
73     
74     typedef Vector<RefPtr<EventListener> > ListenerVector;
75     typedef HashMap<AtomicStringImpl*, ListenerVector> EventListenersMap;
76     EventListenersMap& eventListeners() { return m_eventListeners; }
77
78     using RefCounted<DOMApplicationCache>::ref;
79     using RefCounted<DOMApplicationCache>::deref;
80
81     void setOnchecking(PassRefPtr<EventListener> eventListener) { m_onCheckingListener = eventListener; }
82     EventListener* onchecking() const { return m_onCheckingListener.get(); }
83
84     void setOnerror(PassRefPtr<EventListener> eventListener) { m_onErrorListener = eventListener; }
85     EventListener* onerror() const { return m_onErrorListener.get(); }
86
87     void setOnnoupdate(PassRefPtr<EventListener> eventListener) { m_onNoUpdateListener = eventListener; }
88     EventListener* onnoupdate() const { return m_onNoUpdateListener.get(); }
89
90     void setOndownloading(PassRefPtr<EventListener> eventListener) { m_onDownloadingListener = eventListener; }
91     EventListener* ondownloading() const { return m_onDownloadingListener.get(); }
92     
93     void setOnprogress(PassRefPtr<EventListener> eventListener) { m_onProgressListener = eventListener; }
94     EventListener* onprogress() const { return m_onProgressListener.get(); }
95
96     void setOnupdateready(PassRefPtr<EventListener> eventListener) { m_onUpdateReadyListener = eventListener; }
97     EventListener* onupdateready() const { return m_onUpdateReadyListener.get(); }
98
99     void setOncached(PassRefPtr<EventListener> eventListener) { m_onCachedListener = eventListener; }
100     EventListener* oncached() const { return m_onCachedListener.get(); }
101
102     Frame* associatedFrame() const { return m_frame; }
103     DOMApplicationCache* toDOMApplicationCache() { return this; }
104
105     void callCheckingListener();
106     void callErrorListener();    
107     void callNoUpdateListener();    
108     void callDownloadingListener();
109     void callProgressListener();
110     void callUpdateReadyListener();
111     void callCachedListener();
112     
113 private:
114     DOMApplicationCache(Frame*);
115     void callListener(const AtomicString& eventType, EventListener*);
116     
117     virtual void refEventTarget() { ref(); }
118     virtual void derefEventTarget() { deref(); }
119
120     ApplicationCache* associatedCache() const;
121     bool swapCache();
122     
123     RefPtr<EventListener> m_onCheckingListener;
124     RefPtr<EventListener> m_onErrorListener;
125     RefPtr<EventListener> m_onNoUpdateListener;
126     RefPtr<EventListener> m_onDownloadingListener;
127     RefPtr<EventListener> m_onProgressListener;
128     RefPtr<EventListener> m_onUpdateReadyListener;
129     RefPtr<EventListener> m_onCachedListener;
130     
131     EventListenersMap m_eventListeners;
132
133     Frame* m_frame;
134 };
135
136 } // namespace WebCore
137
138 #endif // ENABLE(OFFLINE_WEB_APPLICATIONS)
139
140 #endif // DOMApplicationCache_h