WebKitDOMBinding.cpp [plain text]
#include "config.h"
#include "WebKitDOMBinding.h"
#include "Event.h"
#include "EventException.h"
#include "HTMLNames.h"
#include "WebKitDOMElementPrivate.h"
#include "WebKitDOMNode.h"
#include "WebKitDOMNodePrivate.h"
#include "WebKitHTMLElementWrapperFactory.h"
namespace WebKit {
using namespace WebCore;
using namespace WebCore::HTMLNames;
typedef HashMap<void*, gpointer> DOMObjectMap;
static DOMObjectMap& domObjects()
{
static DOMObjectMap staticDOMObjects;
return staticDOMObjects;
}
gpointer DOMObjectCache::get(void* objectHandle)
{
return domObjects().get(objectHandle);
}
gpointer DOMObjectCache::put(void* objectHandle, gpointer wrapper)
{
domObjects().set(objectHandle, wrapper);
return wrapper;
}
void DOMObjectCache::forget(void* objectHandle)
{
domObjects().take(objectHandle);
}
static gpointer createWrapper(Node* node)
{
ASSERT(node);
ASSERT(node->nodeType());
gpointer wrappedNode = 0;
switch (node->nodeType()) {
case Node::ELEMENT_NODE:
if (node->isHTMLElement())
wrappedNode = createHTMLElementWrapper(static_cast<HTMLElement*>(node));
else
wrappedNode = wrapNode(node);
break;
default:
wrappedNode = wrapNode(node);
break;
}
return DOMObjectCache::put(node, wrappedNode);
}
gpointer kit(Node* node)
{
if (!node)
return 0;
gpointer kitNode = DOMObjectCache::get(node);
if (kitNode)
return kitNode;
return createWrapper(node);
}
gpointer kit(Element* element)
{
if (!element)
return 0;
gpointer kitElement = DOMObjectCache::get(element);
if (kitElement)
return kitElement;
gpointer wrappedElement;
if (element->isHTMLElement())
wrappedElement = createHTMLElementWrapper(static_cast<HTMLElement*>(element));
else
wrappedElement = wrapElement(element);
return DOMObjectCache::put(element, wrappedElement);
}
}