diff options
Diffstat (limited to 'Source/WebCore/bindings/gobject')
5 files changed, 91 insertions, 44 deletions
diff --git a/Source/WebCore/bindings/gobject/GNUmakefile.am b/Source/WebCore/bindings/gobject/GNUmakefile.am index 881f45a..8370b86 100644 --- a/Source/WebCore/bindings/gobject/GNUmakefile.am +++ b/Source/WebCore/bindings/gobject/GNUmakefile.am @@ -244,6 +244,8 @@ webkitgtk_gdom_built_sources += \ DerivedSources/webkit/WebKitDOMUIEventPrivate.h \ DerivedSources/webkit/WebKitDOMValidityState.cpp \ DerivedSources/webkit/WebKitDOMValidityStatePrivate.h \ + DerivedSources/webkit/WebKitDOMWebKitAnimation.cpp \ + DerivedSources/webkit/WebKitDOMWebKitAnimationList.cpp \ DerivedSources/webkit/WebKitDOMWebKitPoint.cpp \ DerivedSources/webkit/WebKitDOMWebKitPointPrivate.h \ DerivedSources/webkit/WebKitDOMXPathExpression.cpp \ @@ -372,6 +374,8 @@ webkitgtk_built_h_api += \ DerivedSources/webkit/WebKitDOMObject.h \ DerivedSources/webkit/WebKitDOMNavigator.h \ DerivedSources/webkit/WebKitDOMScreen.h \ + DerivedSources/webkit/WebKitDOMWebKitAnimation.h \ + DerivedSources/webkit/WebKitDOMWebKitAnimationList.h \ DerivedSources/webkit/WebKitDOMWebKitPoint.h \ DerivedSources/webkit/WebKitDOMDOMMimeType.h \ DerivedSources/webkit/WebKitDOMDOMMimeTypeArray.h \ 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; } diff --git a/Source/WebCore/bindings/gobject/GObjectEventListener.h b/Source/WebCore/bindings/gobject/GObjectEventListener.h index ef1637a..6c85701 100644 --- a/Source/WebCore/bindings/gobject/GObjectEventListener.h +++ b/Source/WebCore/bindings/gobject/GObjectEventListener.h @@ -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 @@ -19,30 +19,30 @@ #ifndef GObjectEventListener_h #define GObjectEventListener_h -#include "DOMWindow.h" #include "EventListener.h" -#include "Node.h" +#include "EventTarget.h" #include <wtf/RefPtr.h> #include <wtf/text/CString.h> typedef struct _GObject GObject; +typedef void (*GCallback) (void); namespace WebCore { class GObjectEventListener : public EventListener { public: - static void addEventListener(GObject* object, DOMWindow* window, const char* domEventName, const char* signalName) + static bool addEventListener(GObject* object, EventTarget* target, const char* domEventName, GCallback handler, bool useCapture, void* userData) { - RefPtr<GObjectEventListener> listener(adoptRef(new GObjectEventListener(object, window, 0, domEventName, signalName))); - window->addEventListener(domEventName, listener.release(), false); + RefPtr<GObjectEventListener> listener(adoptRef(new GObjectEventListener(object, target, domEventName, handler, useCapture, userData))); + return target->addEventListener(domEventName, listener.release(), useCapture); } - static void addEventListener(GObject* object, Node* node, const char* domEventName, const char* signalName) + static bool removeEventListener(GObject* object, EventTarget* target, const char* domEventName, GCallback handler, bool useCapture) { - RefPtr<GObjectEventListener> listener(adoptRef(new GObjectEventListener(object, 0, node, domEventName, signalName))); - node->addEventListener(domEventName, listener.release(), false); + GObjectEventListener key(object, target, domEventName, handler, useCapture, 0); + return target->removeEventListener(domEventName, &key, useCapture); } static void gobjectDestroyedCallback(GObjectEventListener* listener, GObject*) @@ -60,7 +60,7 @@ public: virtual bool operator==(const EventListener& other); private: - GObjectEventListener(GObject*, DOMWindow*, Node*, const char* domEventName, const char* signalName); + GObjectEventListener(GObject*, EventTarget*, const char* domEventName, GCallback handler, bool capture, void* userData); ~GObjectEventListener(); void gobjectDestroyed(); @@ -68,12 +68,13 @@ private: GObject* m_object; - // We do not need to keep a reference to these WebCore objects, because - // we only use them when the GObject and thus the WebCore object is alive. - Node* m_coreNode; - DOMWindow* m_coreWindow; + // We do not need to keep a reference to the m_coreTarget, because + // we only use it when the GObject and thus the m_coreTarget object is alive. + EventTarget* m_coreTarget; CString m_domEventName; - CString m_signalName; + GCallback m_handler; + bool m_capture; + void* m_userData; }; } // namespace WebCore diff --git a/Source/WebCore/bindings/gobject/WebKitDOMEventTarget.cpp b/Source/WebCore/bindings/gobject/WebKitDOMEventTarget.cpp index f2b1a94..f74c340 100644 --- a/Source/WebCore/bindings/gobject/WebKitDOMEventTarget.cpp +++ b/Source/WebCore/bindings/gobject/WebKitDOMEventTarget.cpp @@ -66,17 +66,42 @@ static void webkit_dom_event_target_default_init(WebKitDOMEventTargetIface*) void webkit_dom_event_target_dispatch_event(WebKitDOMEventTarget* target, WebKitDOMEvent* event, GError** error) { - WebKitDOMEventTargetIface* iface; - g_return_if_fail(WEBKIT_DOM_IS_EVENT_TARGET(target)); g_return_if_fail(WEBKIT_DOM_IS_EVENT(event)); - iface = WEBKIT_DOM_EVENT_TARGET_GET_IFACE(target); + WebKitDOMEventTargetIface* iface = WEBKIT_DOM_EVENT_TARGET_GET_IFACE(target); if (iface->dispatch_event) iface->dispatch_event(target, event, error); } +gboolean webkit_dom_event_target_add_event_listener(WebKitDOMEventTarget* target, const char* eventName, GCallback handler, gboolean bubble, gpointer userData) +{ + + g_return_val_if_fail(WEBKIT_DOM_IS_EVENT_TARGET(target), FALSE); + g_return_val_if_fail(eventName, FALSE); + + WebKitDOMEventTargetIface* iface = WEBKIT_DOM_EVENT_TARGET_GET_IFACE(target); + + if (iface->add_event_listener) + return iface->add_event_listener(target, eventName, handler, bubble, userData); + + return FALSE; +} + +gboolean webkit_dom_event_target_remove_event_listener(WebKitDOMEventTarget* target, const char* eventName, GCallback handler, gboolean bubble) +{ + g_return_val_if_fail(WEBKIT_DOM_IS_EVENT_TARGET(target), FALSE); + g_return_val_if_fail(eventName, FALSE); + + WebKitDOMEventTargetIface* iface = WEBKIT_DOM_EVENT_TARGET_GET_IFACE(target); + + if (iface->remove_event_listener) + return iface->remove_event_listener(target, eventName, handler, bubble); + + return FALSE; +} + namespace WebKit { WebCore::EventTarget* core(WebKitDOMEventTarget* request) diff --git a/Source/WebCore/bindings/gobject/WebKitDOMEventTarget.h b/Source/WebCore/bindings/gobject/WebKitDOMEventTarget.h index 206abc7..4adbda1 100644 --- a/Source/WebCore/bindings/gobject/WebKitDOMEventTarget.h +++ b/Source/WebCore/bindings/gobject/WebKitDOMEventTarget.h @@ -37,9 +37,19 @@ struct _WebKitDOMEventTargetIface { GTypeInterface gIface; /* virtual table */ - void (* dispatch_event)(WebKitDOMEventTarget* target, - WebKitDOMEvent* event, - GError** error); + void (* dispatch_event)(WebKitDOMEventTarget *target, + WebKitDOMEvent *event, + GError **error); + + gboolean (* add_event_listener)(WebKitDOMEventTarget *target, + const char *eventName, + GCallback handler, + gboolean bubble, + gpointer userData); + gboolean (* remove_event_listener)(WebKitDOMEventTarget *target, + const char *eventName, + GCallback handler, + gboolean bubble); }; @@ -49,6 +59,17 @@ WEBKIT_API void webkit_dom_event_target_dispatch_event(WebKitDOMEventTarget WebKitDOMEvent *event, GError **error); +WEBKIT_API gboolean webkit_dom_event_target_add_event_listener(WebKitDOMEventTarget *target, + const char *eventName, + GCallback handler, + gboolean bubble, + gpointer userData); + +WEBKIT_API gboolean webkit_dom_event_target_remove_event_listener(WebKitDOMEventTarget *target, + const char *eventName, + GCallback handler, + gboolean bubble); + G_END_DECLS #endif /* WebKitDOMEventTarget_h */ |