2008-04-17 Anders Carlsson <andersca@apple.com>
[WebKit-https.git] / WebCore / bindings / js / JSDOMApplicationCacheCustom.cpp
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 #include "config.h"
27 #include "JSDOMApplicationCache.h"
28
29 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
30
31 #include "AtomicString.h"
32 #include "DOMApplicationCache.h"
33 #include "DOMWindow.h"
34 #include "Event.h"
35 #include "Frame.h"
36 #include "FrameLoader.h"
37 #include "JSDOMWindow.h"
38 #include "JSEvent.h"
39 #include "kjs_events.h"
40
41 using namespace KJS;
42
43 namespace WebCore {
44     
45 JSValue* JSDOMApplicationCache::add(ExecState* exec, const List& args)
46 {
47     Frame* frame = toJSDOMWindow(exec->dynamicGlobalObject())->impl()->frame();
48     if (!frame)
49         return jsUndefined();
50     const KURL& url = frame->loader()->completeURL(args[0]->toString(exec));
51     
52     ExceptionCode ec = 0;
53     impl()->add(url, ec);
54     setDOMException(exec, ec);
55     return jsUndefined();
56 }
57     
58 JSValue* JSDOMApplicationCache::remove(ExecState* exec, const List& args)
59 {
60     Frame* frame = toJSDOMWindow(exec->dynamicGlobalObject())->impl()->frame();
61     if (!frame)
62         return jsUndefined();
63     const KURL& url = frame->loader()->completeURL(args[0]->toString(exec));
64     
65     ExceptionCode ec = 0;
66     impl()->remove(url, ec);
67     setDOMException(exec, ec);
68     return jsUndefined();
69 }
70     
71 JSValue* JSDOMApplicationCache::addEventListener(ExecState* exec, const List& args)
72 {
73     Frame* frame = impl()->frame();
74     if (!frame)
75         return jsUndefined();
76     JSUnprotectedEventListener* listener = toJSDOMWindow(frame)->findOrCreateJSUnprotectedEventListener(args[1], true);
77     if (!listener)
78         return jsUndefined();
79     impl()->addEventListener(args[0]->toString(exec), listener, args[2]->toBoolean(exec));
80     return jsUndefined();
81 }
82
83 JSValue* JSDOMApplicationCache::removeEventListener(ExecState* exec, const List& args)
84 {
85     Frame* frame = impl()->frame();
86     if (!frame)
87         return jsUndefined();
88     JSUnprotectedEventListener* listener = toJSDOMWindow(frame)->findOrCreateJSUnprotectedEventListener(args[1], true);
89     if (!listener)
90         return jsUndefined();
91     impl()->removeEventListener(args[0]->toString(exec), listener, args[2]->toBoolean(exec));
92     return jsUndefined();
93     
94 }
95     
96 JSValue* JSDOMApplicationCache::dispatchEvent(KJS::ExecState* exec, const List& args)
97 {
98     ExceptionCode ec = 0;
99     
100     bool result = impl()->dispatchEvent(toEvent(args[0]), ec);
101     setDOMException(exec, ec);
102     return jsBoolean(result);    
103 }
104
105 void JSDOMApplicationCache::setOnchecking(ExecState*, JSValue* value)
106 {
107     if (Frame* frame = impl()->frame())
108         impl()->setOnCheckingListener(toJSDOMWindow(frame)->findOrCreateJSUnprotectedEventListener(value, true));
109 }
110
111 JSValue* JSDOMApplicationCache::onchecking(ExecState*) const
112 {
113     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(impl()->onCheckingListener()))
114         if (JSObject* listenerObj = listener->listenerObj())
115             return listenerObj;
116     return jsNull();
117 }
118
119 void JSDOMApplicationCache::setOnerror(ExecState*, JSValue* value)
120 {
121     if (Frame* frame = impl()->frame())
122         impl()->setOnErrorListener(toJSDOMWindow(frame)->findOrCreateJSUnprotectedEventListener(value, true));
123 }
124
125 JSValue* JSDOMApplicationCache::onerror(ExecState*) const
126 {
127     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(impl()->onErrorListener()))
128         if (JSObject* listenerObj = listener->listenerObj())
129             return listenerObj;
130     return jsNull();
131 }
132
133 void JSDOMApplicationCache::setOnnoupdate(ExecState*, JSValue* value)
134 {
135     if (Frame* frame = impl()->frame())
136         impl()->setOnNoUpdateListener(toJSDOMWindow(frame)->findOrCreateJSUnprotectedEventListener(value, true));
137 }
138
139 JSValue* JSDOMApplicationCache::onnoupdate(ExecState*) const
140 {
141     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(impl()->onNoUpdateListener()))
142         if (JSObject* listenerObj = listener->listenerObj())
143             return listenerObj;
144     return jsNull();
145 }
146
147 void JSDOMApplicationCache::setOndownloading(ExecState*, JSValue* value)
148 {
149     if (Frame* frame = impl()->frame())
150         impl()->setOnDownloadingListener(toJSDOMWindow(frame)->findOrCreateJSUnprotectedEventListener(value, true));
151 }
152
153 JSValue* JSDOMApplicationCache::ondownloading(ExecState*) const
154 {
155     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(impl()->onDownloadingListener()))
156         if (JSObject* listenerObj = listener->listenerObj())
157             return listenerObj;
158     return jsNull();
159 }
160
161 void JSDOMApplicationCache::setOnprogress(ExecState*, JSValue* value)
162 {
163     if (Frame* frame = impl()->frame())
164         impl()->setOnProgressListener(toJSDOMWindow(frame)->findOrCreateJSUnprotectedEventListener(value, true));
165 }
166
167 JSValue* JSDOMApplicationCache::onprogress(ExecState*) const
168 {
169     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(impl()->onProgressListener()))
170         if (JSObject* listenerObj = listener->listenerObj())
171             return listenerObj;
172     return jsNull();
173 }
174
175 void JSDOMApplicationCache::setOnupdateready(ExecState*, JSValue* value)
176 {
177     if (Frame* frame = impl()->frame())
178         impl()->setOnUpdateReadyListener(toJSDOMWindow(frame)->findOrCreateJSUnprotectedEventListener(value, true));
179 }
180
181 JSValue* JSDOMApplicationCache::onupdateready(ExecState*) const
182 {
183     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(impl()->onUpdateReadyListener()))
184         if (JSObject* listenerObj = listener->listenerObj())
185             return listenerObj;
186     return jsNull();
187 }
188
189 void JSDOMApplicationCache::setOncached(ExecState*, JSValue* value)
190 {
191     if (Frame* frame = impl()->frame())
192         impl()->setOnCachedListener(toJSDOMWindow(frame)->findOrCreateJSUnprotectedEventListener(value, true));
193 }
194
195 JSValue* JSDOMApplicationCache::oncached(ExecState*) const
196 {
197     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(impl()->onCachedListener()))
198         if (JSObject* listenerObj = listener->listenerObj())
199             return listenerObj;
200     return jsNull();
201 }
202
203 void JSDOMApplicationCache::mark()
204 {
205     DOMObject::mark();
206  
207     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(m_impl->onCheckingListener()))
208         listener->mark();
209         
210     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(m_impl->onErrorListener()))
211         listener->mark();
212
213     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(m_impl->onNoUpdateListener()))
214         listener->mark();
215
216     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(m_impl->onDownloadingListener()))
217         listener->mark();
218
219     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(m_impl->onProgressListener()))
220         listener->mark();
221
222     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(m_impl->onUpdateReadyListener()))
223         listener->mark();
224
225     if (JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(m_impl->onCachedListener()))
226         listener->mark();
227     
228     typedef DOMApplicationCache::EventListenersMap EventListenersMap;
229     typedef DOMApplicationCache::ListenerVector ListenerVector;
230     EventListenersMap& eventListeners = m_impl->eventListeners();
231     for (EventListenersMap::iterator mapIter = eventListeners.begin(); mapIter != eventListeners.end(); ++mapIter) {
232         for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter) {
233             JSUnprotectedEventListener* listener = static_cast<JSUnprotectedEventListener*>(vecIter->get());
234             listener->mark();
235         }
236     }
237 }
238
239 } // namespace WebCore
240
241 #endif // ENABLE(OFFLINE_WEB_APPLICATIONS)