1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) 3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2007 Samuel Weinig <sam@webkit.org> 5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2008 Luke Kenneth Casson Leighton <lkcl@lkcl.net> 6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2008 Martin Soto <soto@freedesktop.org> 7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2009, 2010 Igalia S.L. 8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This library is free software; you can redistribute it and/or 10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modify it under the terms of the GNU Lesser General Public 11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * License as published by the Free Software Foundation; either 12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * version 2 of the License, or (at your option) any later version. 13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This library is distributed in the hope that it will be useful, 15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * but WITHOUT ANY WARRANTY; without even the implied warranty of 16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Lesser General Public License for more details. 18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * You should have received a copy of the GNU Lesser General Public 20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * License along with this library; if not, write to the Free Software 21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */ 23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h" 25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WebKitDOMBinding.h" 26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "DOMObjectCache.h" 28dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "Element.h" 29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Event.h" 30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "EventException.h" 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HTMLNames.h" 32dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "MouseEvent.h" 33dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "UIEvent.h" 345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "WebKitDOMDOMWindowPrivate.h" 3521939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "WebKitDOMElementPrivate.h" 36f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "WebKitDOMEventPrivate.h" 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WebKitDOMNode.h" 38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WebKitDOMNodePrivate.h" 3921939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "WebKitHTMLElementWrapperFactory.h" 40dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "webkit/WebKitDOMMouseEventPrivate.h" 41dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "webkit/WebKitDOMUIEventPrivate.h" 42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebKit { 44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace WebCore; 46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace WebCore::HTMLNames; 47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// kit methods 49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic gpointer createWrapper(Node* node) 51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(node); 5321939df44de1705786c545cd1bf519d47250322dBen Murdoch ASSERT(node->nodeType()); 54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gpointer wrappedNode = 0; 56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 5721939df44de1705786c545cd1bf519d47250322dBen Murdoch switch (node->nodeType()) { 5821939df44de1705786c545cd1bf519d47250322dBen Murdoch case Node::ELEMENT_NODE: 5921939df44de1705786c545cd1bf519d47250322dBen Murdoch if (node->isHTMLElement()) 602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block wrappedNode = createHTMLElementWrapper(toHTMLElement(node)); 6121939df44de1705786c545cd1bf519d47250322dBen Murdoch else 62dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch wrappedNode = wrapElement(static_cast<Element*>(node)); 6321939df44de1705786c545cd1bf519d47250322dBen Murdoch break; 6421939df44de1705786c545cd1bf519d47250322dBen Murdoch default: 65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block wrappedNode = wrapNode(node); 6621939df44de1705786c545cd1bf519d47250322dBen Murdoch break; 6721939df44de1705786c545cd1bf519d47250322dBen Murdoch } 68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return DOMObjectCache::put(node, wrappedNode); 70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangWebKitDOMNode* kit(Node* node) 73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!node) 75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gpointer kitNode = DOMObjectCache::get(node); 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (kitNode) 794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return static_cast<WebKitDOMNode*>(kitNode); 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return static_cast<WebKitDOMNode*>(createWrapper(node)); 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangWebKitDOMElement* kit(Element* element) 8521939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 8621939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!element) 8721939df44de1705786c545cd1bf519d47250322dBen Murdoch return 0; 8821939df44de1705786c545cd1bf519d47250322dBen Murdoch 8921939df44de1705786c545cd1bf519d47250322dBen Murdoch gpointer kitElement = DOMObjectCache::get(element); 9021939df44de1705786c545cd1bf519d47250322dBen Murdoch if (kitElement) 914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return static_cast<WebKitDOMElement*>(kitElement); 9221939df44de1705786c545cd1bf519d47250322dBen Murdoch 9321939df44de1705786c545cd1bf519d47250322dBen Murdoch gpointer wrappedElement; 9421939df44de1705786c545cd1bf519d47250322dBen Murdoch 9521939df44de1705786c545cd1bf519d47250322dBen Murdoch if (element->isHTMLElement()) 962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block wrappedElement = createHTMLElementWrapper(toHTMLElement(element)); 9721939df44de1705786c545cd1bf519d47250322dBen Murdoch else 9821939df44de1705786c545cd1bf519d47250322dBen Murdoch wrappedElement = wrapElement(element); 9921939df44de1705786c545cd1bf519d47250322dBen Murdoch 1004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return static_cast<WebKitDOMElement*>(DOMObjectCache::put(element, wrappedElement)); 10121939df44de1705786c545cd1bf519d47250322dBen Murdoch} 10221939df44de1705786c545cd1bf519d47250322dBen Murdoch 1034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangWebKitDOMEvent* kit(Event* event) 104dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 105dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (!event) 106dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return 0; 107dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 108dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch gpointer kitEvent = DOMObjectCache::get(event); 109dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (kitEvent) 1104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return static_cast<WebKitDOMEvent*>(kitEvent); 111dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 112dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch gpointer wrappedEvent; 113dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 114dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (event->isMouseEvent()) 115dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch wrappedEvent = wrapMouseEvent(static_cast<MouseEvent*>(event)); 116dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch else if (event->isUIEvent()) 117dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch wrappedEvent = wrapUIEvent(static_cast<UIEvent*>(event)); 118dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch else 119f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick wrappedEvent = wrapEvent(event); 120dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 1214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return static_cast<WebKitDOMEvent*>(DOMObjectCache::put(event, wrappedEvent)); 122dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 123dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 1245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkestatic gpointer wrapEventTarget(EventTarget* target) 1255af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 1265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke ASSERT(target); 1275af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke gpointer wrappedTarget = 0; 1295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (target->toNode()) { 1315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke Node* node = target->toNode(); 1325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke wrappedTarget = wrapNode(node); 1335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } else if (target->toDOMWindow()) { 1345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke DOMWindow* window = target->toDOMWindow(); 1355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke wrappedTarget = wrapDOMWindow(window); 1365af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 1375af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1385af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return DOMObjectCache::put(target, wrappedTarget); 1395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 1405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangWebKitDOMEventTarget* kit(WebCore::EventTarget* obj) 1425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 1435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke g_return_val_if_fail(obj, 0); 1445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1455af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (gpointer ret = DOMObjectCache::get(obj)) 1464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return static_cast<WebKitDOMEventTarget*>(ret); 1475af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 1484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return static_cast<WebKitDOMEventTarget*>(DOMObjectCache::put(obj, WebKit::wrapEventTarget(obj))); 1495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 1505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} // namespace WebKit 152