20580982dd89154cbf8c28f7c5e5ac2da2fe423d
[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 using namespace JSC;
60
61 namespace WebCore {
62
63 JSValue toJS(ExecState* exec, EventTarget* target)
64 {
65     if (!target)
66         return jsNull();
67     
68 #if ENABLE(SVG)
69     // SVGElementInstance supports both toSVGElementInstance and toNode since so much mouse handling code depends on toNode returning a valid node.
70     if (SVGElementInstance* instance = target->toSVGElementInstance())
71         return toJS(exec, instance);
72 #endif
73     
74     if (Node* node = target->toNode())
75         return toJS(exec, node);
76
77     if (DOMWindow* domWindow = target->toDOMWindow())
78         return toJS(exec, domWindow);
79
80     if (XMLHttpRequest* xhr = target->toXMLHttpRequest())
81         // XMLHttpRequest is always created via JS, so we don't need to use cacheDOMObject() here.
82         return getCachedDOMObjectWrapper(exec->globalData(), xhr);
83
84     if (XMLHttpRequestUpload* upload = target->toXMLHttpRequestUpload())
85         return toJS(exec, upload);
86
87 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
88     if (DOMApplicationCache* cache = target->toDOMApplicationCache())
89         // DOMApplicationCache is always created via JS, so we don't need to use cacheDOMObject() here.
90         return getCachedDOMObjectWrapper(exec->globalData(), cache);
91 #endif
92
93     if (MessagePort* messagePort = target->toMessagePort())
94         return toJS(exec, messagePort);
95
96 #if ENABLE(WORKERS)
97     if (Worker* worker = target->toWorker())
98         return toJS(exec, worker);
99
100     if (WorkerContext* workerContext = target->toWorkerContext())
101         return toJSDOMGlobalObject(workerContext);
102 #endif
103
104     ASSERT_NOT_REACHED();
105     return jsNull();
106 }
107
108 EventTarget* toEventTarget(JSC::JSValue value)
109 {
110     #define CONVERT_TO_EVENT_TARGET(type) \
111         if (value.isObject(&JS##type::s_info)) \
112             return static_cast<JS##type*>(asObject(value))->impl();
113
114     CONVERT_TO_EVENT_TARGET(Node)
115     CONVERT_TO_EVENT_TARGET(XMLHttpRequest)
116     CONVERT_TO_EVENT_TARGET(XMLHttpRequestUpload)
117     CONVERT_TO_EVENT_TARGET(MessagePort)
118
119     if (value.isObject(&JSDOMWindowShell::s_info))
120         return static_cast<JSDOMWindowShell*>(asObject(value))->impl();
121
122 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
123     CONVERT_TO_EVENT_TARGET(DOMApplicationCache)
124 #endif
125
126 #if ENABLE(SVG)
127     CONVERT_TO_EVENT_TARGET(SVGElementInstance)
128 #endif
129
130 #if ENABLE(WORKERS)
131     CONVERT_TO_EVENT_TARGET(Worker)
132     CONVERT_TO_EVENT_TARGET(WorkerContext)
133 #endif
134
135     return 0;
136 }
137
138 } // namespace WebCore