/* * Copyright (C) Research In Motion Limited 2010. All rights reserved. * Copyright (C) 2008 Apple Inc. All Rights Reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "WebDOMEventTarget.h" #include "DOMApplicationCache.h" #include "DOMWindow.h" #include "DedicatedWorkerContext.h" #include "EventSource.h" #include "MessagePort.h" #include "Node.h" #include "Notification.h" #include "SharedWorker.h" #include "SharedWorkerContext.h" #include "ThreadCheck.h" #include "WebDOMDOMApplicationCache.h" #include "WebDOMDOMWindow.h" #include "WebDOMDedicatedWorkerContext.h" #include "WebDOMEventSource.h" #include "WebDOMMessagePort.h" #include "WebDOMNode.h" #include "WebDOMNotification.h" #include "WebDOMSharedWorker.h" #include "WebDOMSharedWorkerContext.h" #include "WebDOMWebSocket.h" #include "WebDOMWorker.h" #include "WebDOMXMLHttpRequest.h" #include "WebDOMXMLHttpRequestUpload.h" #include "WebExceptionHandler.h" #include "WebSocket.h" #include "Worker.h" #include "XMLHttpRequest.h" #include "XMLHttpRequestUpload.h" #include <wtf/RefPtr.h> struct WebDOMEventTarget::WebDOMEventTargetPrivate { WebDOMEventTargetPrivate(WebCore::EventTarget* object = 0) : impl(object) { } RefPtr<WebCore::EventTarget> impl; }; WebDOMEventTarget::WebDOMEventTarget() : WebDOMObject() , m_impl(0) { } WebDOMEventTarget::WebDOMEventTarget(WebCore::EventTarget* impl) : WebDOMObject() , m_impl(new WebDOMEventTargetPrivate(impl)) { } WebDOMEventTarget::WebDOMEventTarget(const WebDOMEventTarget& copy) : WebDOMObject() { m_impl = copy.impl() ? new WebDOMEventTargetPrivate(copy.impl()) : 0; } WebDOMEventTarget::~WebDOMEventTarget() { delete m_impl; m_impl = 0; } WebCore::EventTarget* WebDOMEventTarget::impl() const { return m_impl ? m_impl->impl.get() : 0; } #define ConvertTo(type) \ WebDOM##type WebDOMEventTarget::to##type() \ { \ WebCore::EventTarget* target = impl(); \ return WebDOM##type(target ? target->to##type() : 0); \ } ConvertTo(Node) ConvertTo(DOMWindow) ConvertTo(XMLHttpRequest) ConvertTo(XMLHttpRequestUpload) ConvertTo(MessagePort) #if ENABLE(EVENTSOURCE) ConvertTo(EventSource) #endif #if ENABLE(OFFLINE_WEB_APPLICATIONS) ConvertTo(DOMApplicationCache) #endif #if ENABLE(WORKERS) ConvertTo(Worker) ConvertTo(DedicatedWorkerContext) #endif #if ENABLE(SHARED_WORKERS) ConvertTo(SharedWorker) ConvertTo(SharedWorkerContext) #endif #if ENABLE(NOTIFICATIONS) ConvertTo(Notification) #endif #if ENABLE(WEB_SOCKETS) ConvertTo(WebSocket) #endif WebCore::EventTarget* toWebCore(const WebDOMEventTarget& wrapper) { return wrapper.impl(); } WebDOMEventTarget toWebKit(WebCore::EventTarget* value) { if (WebCore::Node* node = value->toNode()) return toWebKit(node); if (WebCore::DOMWindow* window = value->toDOMWindow()) return toWebKit(window); if (WebCore::XMLHttpRequest* xhr = value->toXMLHttpRequest()) return toWebKit(xhr); if (WebCore::XMLHttpRequestUpload* upload = value->toXMLHttpRequestUpload()) return toWebKit(upload); if (WebCore::MessagePort* messagePort = value->toMessagePort()) return toWebKit(messagePort); #if ENABLE(EVENTSOURCE) if (WebCore::EventSource* eventSource = value->toEventSource()) return toWebKit(eventSource); #endif #if ENABLE(SVG) && 0 // FIXME: Enable once SVG bindings are generated. // SVGElementInstance supports both toSVGElementInstance and toNode since so much mouse handling code depends on toNode returning a valid node. if (WebCore::SVGElementInstance* instance = value->toSVGElementInstance()) return toWebKit(instance); #endif #if ENABLE(OFFLINE_WEB_APPLICATIONS) if (WebCore::DOMApplicationCache* cache = value->toDOMApplicationCache()) return toWebKit(cache); #endif #if ENABLE(WORKERS) if (WebCore::Worker* worker = value->toWorker()) return toWebKit(worker); if (WebCore::DedicatedWorkerContext* workerContext = value->toDedicatedWorkerContext()) return toWebKit(workerContext); #endif #if ENABLE(SHARED_WORKERS) if (WebCore::SharedWorker* sharedWorker = value->toSharedWorker()) return toWebKit(sharedWorker); if (WebCore::SharedWorkerContext* workerContext = value->toSharedWorkerContext()) return toWebKit(workerContext); #endif #if ENABLE(NOTIFICATIONS) if (WebCore::Notification* notification = value->toNotification()) return toWebKit(notification); #endif #if ENABLE(WEB_SOCKETS) if (WebCore::WebSocket* webSocket = value->toWebSocket()) return toWebKit(webSocket); #endif ASSERT_NOT_REACHED(); return WebDOMEventTarget(); } WebDOMEventTarget& WebDOMEventTarget::operator=(const WebDOMEventTarget& copy) { delete m_impl; m_impl = copy.impl() ? new WebDOMEventTargetPrivate(copy.impl()) : 0; return *this; }