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#if ENABLE(SHARED_WORKERS) 37 38#include "JSSharedWorker.h" 39#include "JSSharedWorkerContext.h" 40#endif 41 42#include "JSXMLHttpRequest.h" 43#include "JSXMLHttpRequestUpload.h" 44#include "MessagePort.h" 45 46#if ENABLE(SHARED_WORKERS) 47#include "SharedWorker.h" 48#include "SharedWorkerContext.h" 49#endif 50 51#include "XMLHttpRequest.h" 52#include "XMLHttpRequestUpload.h" 53 54#if ENABLE(EVENTSOURCE) 55#include "EventSource.h" 56#include "JSEventSource.h" 57#endif 58 59#if ENABLE(OFFLINE_WEB_APPLICATIONS) 60#include "DOMApplicationCache.h" 61#include "JSDOMApplicationCache.h" 62#endif 63 64#if ENABLE(SVG) 65#include "SVGElementInstance.h" 66#include "JSSVGElementInstance.h" 67#endif 68 69#if ENABLE(WORKERS) 70#include "DedicatedWorkerContext.h" 71#include "JSDedicatedWorkerContext.h" 72#include "JSWorker.h" 73#include "Worker.h" 74#endif 75 76#if ENABLE(NOTIFICATIONS) 77#include "JSNotification.h" 78#include "Notification.h" 79#endif 80 81#if ENABLE(INDEXED_DATABASE) 82#include "IDBRequest.h" 83#include "JSIDBRequest.h" 84#endif 85 86#if ENABLE(WEB_AUDIO) 87#include "AudioContext.h" 88#include "JSAudioContext.h" 89#include "JSJavaScriptAudioNode.h" 90#include "JavaScriptAudioNode.h" 91#endif 92 93#if ENABLE(WEB_SOCKETS) 94#include "JSWebSocket.h" 95#include "WebSocket.h" 96#endif 97 98#if ENABLE(BLOB) 99#include "JSFileReader.h" 100#include "FileReader.h" 101#endif 102 103using namespace JSC; 104 105namespace WebCore { 106 107JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, EventTarget* target) 108{ 109 if (!target) 110 return jsNull(); 111 112#if ENABLE(EVENTSOURCE) 113 if (EventSource* eventSource = target->toEventSource()) 114 return toJS(exec, globalObject, eventSource); 115#endif 116 117#if ENABLE(SVG) 118 // SVGElementInstance supports both toSVGElementInstance and toNode since so much mouse handling code depends on toNode returning a valid node. 119 if (SVGElementInstance* instance = target->toSVGElementInstance()) 120 return toJS(exec, globalObject, instance); 121#endif 122 123 if (Node* node = target->toNode()) 124 return toJS(exec, globalObject, node); 125 126 if (DOMWindow* domWindow = target->toDOMWindow()) 127 return toJS(exec, globalObject, domWindow); 128 129 if (XMLHttpRequest* xhr = target->toXMLHttpRequest()) 130 return toJS(exec, globalObject, xhr); 131 132 if (XMLHttpRequestUpload* upload = target->toXMLHttpRequestUpload()) 133 return toJS(exec, globalObject, upload); 134 135#if ENABLE(OFFLINE_WEB_APPLICATIONS) 136 if (DOMApplicationCache* cache = target->toDOMApplicationCache()) 137 return toJS(exec, globalObject, cache); 138#endif 139 140 if (MessagePort* messagePort = target->toMessagePort()) 141 return toJS(exec, globalObject, messagePort); 142 143#if ENABLE(WORKERS) 144 if (Worker* worker = target->toWorker()) 145 return toJS(exec, globalObject, worker); 146 147 if (DedicatedWorkerContext* workerContext = target->toDedicatedWorkerContext()) 148 return toJSDOMGlobalObject(workerContext, exec); 149#endif 150 151#if ENABLE(SHARED_WORKERS) 152 if (SharedWorker* sharedWorker = target->toSharedWorker()) 153 return toJS(exec, globalObject, sharedWorker); 154 155 if (SharedWorkerContext* workerContext = target->toSharedWorkerContext()) 156 return toJSDOMGlobalObject(workerContext, exec); 157#endif 158 159#if ENABLE(NOTIFICATIONS) 160 if (Notification* notification = target->toNotification()) 161 return toJS(exec, notification); 162#endif 163 164#if ENABLE(INDEXED_DATABASE) 165 if (IDBDatabase* idbDatabase = target->toIDBDatabase()) 166 return toJS(exec, idbDatabase); 167 168 if (IDBRequest* idbRequest = target->toIDBRequest()) 169 return toJS(exec, idbRequest); 170 171 if (IDBTransaction* idbTransaction = target->toIDBTransaction()) 172 return toJS(exec, idbTransaction); 173#endif 174 175#if ENABLE(WEB_AUDIO) 176 if (JavaScriptAudioNode* jsAudioNode = target->toJavaScriptAudioNode()) 177 return toJS(exec, globalObject, jsAudioNode); 178 if (AudioContext* audioContext = target->toAudioContext()) 179 return toJS(exec, globalObject, audioContext); 180#endif 181 182#if ENABLE(WEB_SOCKETS) 183 if (WebSocket* webSocket = target->toWebSocket()) 184 return toJS(exec, webSocket); 185#endif 186 187#if ENABLE(BLOB) 188 if (FileReader* fileReader = target->toFileReader()) 189 return toJS(exec, globalObject, fileReader); 190#endif 191 192 ASSERT_NOT_REACHED(); 193 return jsNull(); 194} 195 196EventTarget* toEventTarget(JSC::JSValue value) 197{ 198 #define CONVERT_TO_EVENT_TARGET(type) \ 199 if (value.inherits(&JS##type::s_info)) \ 200 return static_cast<JS##type*>(asObject(value))->impl(); 201 202 CONVERT_TO_EVENT_TARGET(Node) 203 CONVERT_TO_EVENT_TARGET(XMLHttpRequest) 204 CONVERT_TO_EVENT_TARGET(XMLHttpRequestUpload) 205 CONVERT_TO_EVENT_TARGET(MessagePort) 206 207 if (value.inherits(&JSDOMWindowShell::s_info)) 208 return static_cast<JSDOMWindowShell*>(asObject(value))->impl(); 209 210#if ENABLE(EVENTSOURCE) 211 CONVERT_TO_EVENT_TARGET(EventSource) 212#endif 213 214#if ENABLE(OFFLINE_WEB_APPLICATIONS) 215 CONVERT_TO_EVENT_TARGET(DOMApplicationCache) 216#endif 217 218#if ENABLE(SVG) 219 CONVERT_TO_EVENT_TARGET(SVGElementInstance) 220#endif 221 222#if ENABLE(WORKERS) 223 CONVERT_TO_EVENT_TARGET(Worker) 224 CONVERT_TO_EVENT_TARGET(DedicatedWorkerContext) 225#endif 226 227#if ENABLE(SHARED_WORKERS) 228 CONVERT_TO_EVENT_TARGET(SharedWorker) 229 CONVERT_TO_EVENT_TARGET(SharedWorkerContext) 230#endif 231 232#if ENABLE(NOTIFICATIONS) 233 CONVERT_TO_EVENT_TARGET(Notification) 234#endif 235 236#if ENABLE(WEB_SOCKETS) 237 CONVERT_TO_EVENT_TARGET(WebSocket) 238#endif 239 240 return 0; 241} 242 243} // namespace WebCore 244