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