diff options
Diffstat (limited to 'Source/WebCore/bindings/gobject/GObjectEventListener.cpp')
-rw-r--r-- | Source/WebCore/bindings/gobject/GObjectEventListener.cpp | 42 |
1 files changed, 19 insertions, 23 deletions
diff --git a/Source/WebCore/bindings/gobject/GObjectEventListener.cpp b/Source/WebCore/bindings/gobject/GObjectEventListener.cpp index 27432b9..6211e7d 100644 --- a/Source/WebCore/bindings/gobject/GObjectEventListener.cpp +++ b/Source/WebCore/bindings/gobject/GObjectEventListener.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Igalia S.L. + * Copyright (C) 2010, 2011 Igalia S.L. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -29,55 +29,51 @@ namespace WebCore { -GObjectEventListener::GObjectEventListener(GObject* object, DOMWindow* window, Node* node, const char* domEventName, const char* signalName) +typedef void (*GObjectEventListenerCallback)(GObject*, WebKitDOMEvent*, void*); + +GObjectEventListener::GObjectEventListener(GObject* object, EventTarget* target, const char* domEventName, GCallback handler, bool capture, void* userData) : EventListener(GObjectEventListenerType) , m_object(object) - , m_coreNode(node) - , m_coreWindow(window) + , m_coreTarget(target) , m_domEventName(domEventName) - , m_signalName(signalName) + , m_handler(handler) + , m_capture(capture) + , m_userData(userData) { - ASSERT(!m_coreWindow || !m_coreNode); - + ASSERT(m_coreTarget); g_object_weak_ref(object, reinterpret_cast<GWeakNotify>(GObjectEventListener::gobjectDestroyedCallback), this); } GObjectEventListener::~GObjectEventListener() { - if (!m_coreWindow && !m_coreNode) + if (!m_coreTarget) return; g_object_weak_unref(m_object, reinterpret_cast<GWeakNotify>(GObjectEventListener::gobjectDestroyedCallback), this); } void GObjectEventListener::gobjectDestroyed() { - ASSERT(!m_coreWindow || !m_coreNode); - - // We must set m_coreWindow and m_coreNode to null, because removeEventListener may call the - // destructor as a side effect and we must be in the proper state to prevent g_object_weak_unref. - if (DOMWindow* window = m_coreWindow) { - m_coreWindow = 0; - window->removeEventListener(m_domEventName.data(), this, false); - return; - } + ASSERT(m_coreTarget); - Node* node = m_coreNode; - m_coreNode = 0; // See above. - node->removeEventListener(m_domEventName.data(), this, false); + // We must set m_coreTarget to null, because removeEventListener + // may call the destructor as a side effect and we must be in the + // proper state to prevent g_object_weak_unref. + EventTarget* target = m_coreTarget; + m_coreTarget = 0; + target->removeEventListener(m_domEventName.data(), this, m_capture); } void GObjectEventListener::handleEvent(ScriptExecutionContext*, Event* event) { - gboolean handled = FALSE; WebKitDOMEvent* gobjectEvent = WEBKIT_DOM_EVENT(WebKit::kit(event)); - g_signal_emit_by_name(m_object, m_signalName.data(), gobjectEvent, &handled); + reinterpret_cast<GObjectEventListenerCallback>(m_handler)(m_object, gobjectEvent, m_userData); g_object_unref(gobjectEvent); } bool GObjectEventListener::operator==(const EventListener& listener) { if (const GObjectEventListener* gobjectEventListener = GObjectEventListener::cast(&listener)) - return m_signalName == gobjectEventListener->m_signalName && m_object == gobjectEventListener->m_object; + return m_object == gobjectEventListener->m_object && m_handler == gobjectEventListener->m_handler; return false; } |