2009-07-13 Drew Wilson <atwilson@google.com>
[WebKit-https.git] / WebCore / bindings / js / JSEventTarget.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 "JSEventTarget.h"
28
29 #include "DOMWindow.h"
30 #include "Document.h"
31 #include "JSDOMWindow.h"
32 #include "JSDOMWindowShell.h"
33 #include "JSEventListener.h"
34 #include "JSMessagePort.h"
35 #include "JSNode.h"
36 #include "JSXMLHttpRequest.h"
37 #include "JSXMLHttpRequestUpload.h"
38 #include "MessagePort.h"
39 #include "XMLHttpRequest.h"
40 #include "XMLHttpRequestUpload.h"
41
42 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
43 #include "DOMApplicationCache.h"
44 #include "JSDOMApplicationCache.h"
45 #endif
46
47 #if ENABLE(SVG)
48 #include "SVGElementInstance.h"
49 #include "JSSVGElementInstance.h"
50 #endif
51
52 #if ENABLE(WORKERS)
53 #include "JSWorker.h"
54 #include "JSWorkerContext.h"
55 #include "Worker.h"
56 #include "WorkerContext.h"
57 #endif
58
59 #if ENABLE(SHARED_WORKERS)
60 #include "JSSharedWorker.h"
61 #include "SharedWorker.h"
62 #endif
63
64 using namespace JSC;
65
66 namespace WebCore {
67
68 JSValue toJS(ExecState* exec, EventTarget* target)
69 {
70     if (!target)
71         return jsNull();
72     
73 #if ENABLE(SVG)
74     // SVGElementInstance supports both toSVGElementInstance and toNode since so much mouse handling code depends on toNode returning a valid node.
75     if (SVGElementInstance* instance = target->toSVGElementInstance())
76         return toJS(exec, instance);
77 #endif
78     
79     if (Node* node = target->toNode())
80         return toJS(exec, node);
81
82     if (DOMWindow* domWindow = target->toDOMWindow())
83         return toJS(exec, domWindow);
84
85     if (XMLHttpRequest* xhr = target->toXMLHttpRequest())
86         // XMLHttpRequest is always created via JS, so we don't need to use cacheDOMObject() here.
87         return getCachedDOMObjectWrapper(exec->globalData(), xhr);
88
89     if (XMLHttpRequestUpload* upload = target->toXMLHttpRequestUpload())
90         return toJS(exec, upload);
91
92 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
93     if (DOMApplicationCache* cache = target->toDOMApplicationCache())
94         // DOMApplicationCache is always created via JS, so we don't need to use cacheDOMObject() here.
95         return getCachedDOMObjectWrapper(exec->globalData(), cache);
96 #endif
97
98     if (MessagePort* messagePort = target->toMessagePort())
99         return toJS(exec, messagePort);
100
101 #if ENABLE(WORKERS)
102     if (Worker* worker = target->toWorker())
103         return toJS(exec, worker);
104
105     if (WorkerContext* workerContext = target->toWorkerContext())
106         return toJSDOMGlobalObject(workerContext);
107 #endif
108
109 #if ENABLE(SHARED_WORKERS)
110     if (SharedWorker* sharedWorker = target->toSharedWorker())
111         return toJS(exec, sharedWorker);
112 #endif
113
114     ASSERT_NOT_REACHED();
115     return jsNull();
116 }
117
118 EventTarget* toEventTarget(JSC::JSValue value)
119 {
120     #define CONVERT_TO_EVENT_TARGET(type) \
121         if (value.isObject(&JS##type::s_info)) \
122             return static_cast<JS##type*>(asObject(value))->impl();
123
124     CONVERT_TO_EVENT_TARGET(Node)
125     CONVERT_TO_EVENT_TARGET(XMLHttpRequest)
126     CONVERT_TO_EVENT_TARGET(XMLHttpRequestUpload)
127     CONVERT_TO_EVENT_TARGET(MessagePort)
128
129     if (value.isObject(&JSDOMWindowShell::s_info))
130         return static_cast<JSDOMWindowShell*>(asObject(value))->impl();
131
132 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
133     CONVERT_TO_EVENT_TARGET(DOMApplicationCache)
134 #endif
135
136 #if ENABLE(SVG)
137     CONVERT_TO_EVENT_TARGET(SVGElementInstance)
138 #endif
139
140 #if ENABLE(WORKERS)
141     CONVERT_TO_EVENT_TARGET(Worker)
142     CONVERT_TO_EVENT_TARGET(WorkerContext)
143 #endif
144
145 #if ENABLE(SHARED_WORKERS)
146     CONVERT_TO_EVENT_TARGET(SharedWorker)
147 #endif
148
149     return 0;
150 }
151
152 } // namespace WebCore