1 /* 2 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 3 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Library General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Library General Public License for more details. 14 * 15 * You should have received a copy of the GNU Library General Public License 16 * along with this library; see the file COPYING.LIB. If not, write to 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 * Boston, MA 02110-1301, USA. 19 */ 20 21 #include "config.h" 22 #include "WebDOMEventTarget.h" 23 24 #include "DOMApplicationCache.h" 25 #include "DOMWindow.h" 26 #include "DedicatedWorkerContext.h" 27 #include "EventSource.h" 28 #include "MessagePort.h" 29 #include "Node.h" 30 #include "Notification.h" 31 #include "SharedWorker.h" 32 #include "SharedWorkerContext.h" 33 #include "ThreadCheck.h" 34 #include "WebDOMDOMApplicationCache.h" 35 #include "WebDOMDOMWindow.h" 36 #include "WebDOMDedicatedWorkerContext.h" 37 #include "WebDOMEventSource.h" 38 #include "WebDOMMessagePort.h" 39 #include "WebDOMNode.h" 40 #include "WebDOMNotification.h" 41 #include "WebDOMSharedWorker.h" 42 #include "WebDOMSharedWorkerContext.h" 43 #include "WebDOMWebSocket.h" 44 #include "WebDOMWorker.h" 45 #include "WebDOMXMLHttpRequest.h" 46 #include "WebDOMXMLHttpRequestUpload.h" 47 #include "WebExceptionHandler.h" 48 #include "WebSocket.h" 49 #include "Worker.h" 50 #include "XMLHttpRequest.h" 51 #include "XMLHttpRequestUpload.h" 52 53 #include <wtf/RefPtr.h> 54 55 struct WebDOMEventTarget::WebDOMEventTargetPrivate { 56 WebDOMEventTargetPrivate(WebCore::EventTarget* object = 0) 57 : impl(object) 58 { 59 } 60 61 RefPtr<WebCore::EventTarget> impl; 62 }; 63 64 WebDOMEventTarget::WebDOMEventTarget() 65 : WebDOMObject() 66 , m_impl(0) 67 { 68 } 69 70 WebDOMEventTarget::WebDOMEventTarget(WebCore::EventTarget* impl) 71 : WebDOMObject() 72 , m_impl(new WebDOMEventTargetPrivate(impl)) 73 { 74 } 75 76 WebDOMEventTarget::WebDOMEventTarget(const WebDOMEventTarget& copy) 77 : WebDOMObject() 78 { 79 m_impl = copy.impl() ? new WebDOMEventTargetPrivate(copy.impl()) : 0; 80 } 81 82 WebDOMEventTarget::~WebDOMEventTarget() 83 { 84 delete m_impl; 85 m_impl = 0; 86 } 87 88 WebCore::EventTarget* WebDOMEventTarget::impl() const 89 { 90 return m_impl ? m_impl->impl.get() : 0; 91 } 92 93 #define ConvertTo(type) \ 94 WebDOM##type WebDOMEventTarget::to##type() \ 95 { \ 96 WebCore::EventTarget* target = impl(); \ 97 return WebDOM##type(target ? target->to##type() : 0); \ 98 } 99 100 ConvertTo(Node) 101 ConvertTo(DOMWindow) 102 ConvertTo(XMLHttpRequest) 103 ConvertTo(XMLHttpRequestUpload) 104 ConvertTo(MessagePort) 105 106 #if ENABLE(EVENTSOURCE) 107 ConvertTo(EventSource) 108 #endif 109 110 #if ENABLE(OFFLINE_WEB_APPLICATIONS) 111 ConvertTo(DOMApplicationCache) 112 #endif 113 114 #if ENABLE(WORKERS) 115 ConvertTo(Worker) 116 ConvertTo(DedicatedWorkerContext) 117 #endif 118 119 #if ENABLE(SHARED_WORKERS) 120 ConvertTo(SharedWorker) 121 ConvertTo(SharedWorkerContext) 122 #endif 123 124 #if ENABLE(NOTIFICATIONS) 125 ConvertTo(Notification) 126 #endif 127 128 #if ENABLE(WEB_SOCKETS) 129 ConvertTo(WebSocket) 130 #endif 131 132 WebCore::EventTarget* toWebCore(const WebDOMEventTarget& wrapper) 133 { 134 return wrapper.impl(); 135 } 136 137 WebDOMEventTarget toWebKit(WebCore::EventTarget* value) 138 { 139 if (WebCore::Node* node = value->toNode()) 140 return toWebKit(node); 141 142 if (WebCore::DOMWindow* window = value->toDOMWindow()) 143 return toWebKit(window); 144 145 if (WebCore::XMLHttpRequest* xhr = value->toXMLHttpRequest()) 146 return toWebKit(xhr); 147 148 if (WebCore::XMLHttpRequestUpload* upload = value->toXMLHttpRequestUpload()) 149 return toWebKit(upload); 150 151 if (WebCore::MessagePort* messagePort = value->toMessagePort()) 152 return toWebKit(messagePort); 153 154 #if ENABLE(EVENTSOURCE) 155 if (WebCore::EventSource* eventSource = value->toEventSource()) 156 return toWebKit(eventSource); 157 #endif 158 159 #if ENABLE(SVG) && 0 160 // FIXME: Enable once SVG bindings are generated. 161 // SVGElementInstance supports both toSVGElementInstance and toNode since so much mouse handling code depends on toNode returning a valid node. 162 if (WebCore::SVGElementInstance* instance = value->toSVGElementInstance()) 163 return toWebKit(instance); 164 #endif 165 166 #if ENABLE(OFFLINE_WEB_APPLICATIONS) 167 if (WebCore::DOMApplicationCache* cache = value->toDOMApplicationCache()) 168 return toWebKit(cache); 169 #endif 170 171 #if ENABLE(WORKERS) 172 if (WebCore::Worker* worker = value->toWorker()) 173 return toWebKit(worker); 174 175 if (WebCore::DedicatedWorkerContext* workerContext = value->toDedicatedWorkerContext()) 176 return toWebKit(workerContext); 177 #endif 178 179 #if ENABLE(SHARED_WORKERS) 180 if (WebCore::SharedWorker* sharedWorker = value->toSharedWorker()) 181 return toWebKit(sharedWorker); 182 183 if (WebCore::SharedWorkerContext* workerContext = value->toSharedWorkerContext()) 184 return toWebKit(workerContext); 185 #endif 186 187 #if ENABLE(NOTIFICATIONS) 188 if (WebCore::Notification* notification = value->toNotification()) 189 return toWebKit(notification); 190 #endif 191 192 #if ENABLE(WEB_SOCKETS) 193 if (WebCore::WebSocket* webSocket = value->toWebSocket()) 194 return toWebKit(webSocket); 195 #endif 196 197 ASSERT_NOT_REACHED(); 198 return WebDOMEventTarget(); 199 } 200 201 WebDOMEventTarget& WebDOMEventTarget::operator=(const WebDOMEventTarget& copy) 202 { 203 delete m_impl; 204 m_impl = copy.impl() ? new WebDOMEventTargetPrivate(copy.impl()) : 0; 205 return *this; 206 } 207