Changeset 62004 in webkit
- Timestamp:
- Jun 28, 2010 7:39:17 AM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r62003 r62004 1 2010-06-28 Xan Lopez <xlopez@igalia.com> 2 3 Reviewed by Gustavo Noronha. 4 5 Until now we were adding the event listeners for a given object in 6 the wrap method, since that's the first moment we have accoss to 7 the core WebCore object. The problem is that we only install the 8 listeners that the topmost class in the class hierarchy needs (eg, 9 HTMLParagrahElement for a P element), when most of the actual 10 event attributes are defined in the base classes (Node, Element, 11 ...). 12 13 To fix this set the core object as a construct/write-only property 14 on the wrapper GObject, and set the eventlisteners in the cGObject 15 'construct' method, chaining up through all the class hierarchy 16 until the end. This way we'll get all the eventlisteners defined 17 in all the superclasses of our object, which is what we want. 18 19 * bindings/gobject/WebKitDOMObject.cpp: 20 (webkit_dom_object_get_property): 21 (webkit_dom_object_set_property): 22 (webkit_dom_object_class_init): 23 * bindings/scripts/CodeGeneratorGObject.pm: 24 * dom/Node.idl: 25 1 26 2010-06-28 Xan Lopez <xlopez@igalia.com> 2 27 -
trunk/WebCore/bindings/gobject/WebKitDOMObject.cpp
r57985 r62004 12 12 #include "WebKitDOMBinding.h" 13 13 14 enum { 15 PROP_0, 16 PROP_CORE_OBJECT 17 }; 18 14 19 G_DEFINE_TYPE(WebKitDOMObject, webkit_dom_object, G_TYPE_OBJECT); 15 20 … … 18 23 } 19 24 25 static void webkit_dom_object_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec) 26 { 27 switch (prop_id) { 28 default: 29 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); 30 break; 31 } 32 } 33 34 static void webkit_dom_object_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec) 35 { 36 switch (prop_id) { 37 case PROP_CORE_OBJECT: 38 WEBKIT_DOM_OBJECT(object)->coreObject = g_value_get_pointer(value); 39 break; 40 default: 41 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); 42 break; 43 } 44 } 45 20 46 static void webkit_dom_object_class_init(WebKitDOMObjectClass* klass) 21 47 { 48 GObjectClass* gobjectClass = G_OBJECT_CLASS(klass); 49 gobjectClass->set_property = webkit_dom_object_set_property; 50 gobjectClass->get_property = webkit_dom_object_get_property; 51 52 g_object_class_install_property(gobjectClass, 53 PROP_CORE_OBJECT, 54 g_param_spec_pointer("core-object", 55 "Core Object", 56 "The WebCore object the WebKitDOMObject wraps", 57 static_cast<GParamFlags>(G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY))); 22 58 } 23 59 -
trunk/WebCore/bindings/scripts/CodeGeneratorGObject.pm
r61428 r62004 505 505 506 506 my $txtInstallEventListener = << "EOF"; 507 RefPtr<WebCore::GObjectEventListener> ${listenerName} = WebCore::GObjectEventListener::create(reinterpret_cast<GObject*>( wrapper), "${gobjectSignalName}");507 RefPtr<WebCore::GObjectEventListener> ${listenerName} = WebCore::GObjectEventListener::create(reinterpret_cast<GObject*>(object), "${gobjectSignalName}"); 508 508 coreObject->addEventListener("${domSignalName}", ${listenerName}, false); 509 509 EOF … … 626 626 @txtGetProps 627 627 628 static void ${lowerCaseIfaceName}_constructed(GObject* object) 629 { 630 EOF 631 push(@cBodyPriv, $implContent); 632 633 if (scalar @txtInstallEventListeners > 0) { 634 $implContent = << "EOF"; 635 WebCore::${interfaceName}* coreObject = static_cast<WebCore::${interfaceName}*>(WEBKIT_DOM_OBJECT(object)->coreObject); 636 EOF 637 push(@cBodyPriv, $implContent); 638 } 639 640 $implContent = << "EOF"; 641 @txtInstallEventListeners 642 if (G_OBJECT_CLASS(${lowerCaseIfaceName}_parent_class)->constructed) 643 G_OBJECT_CLASS(${lowerCaseIfaceName}_parent_class)->constructed(object); 644 } 645 628 646 static void ${lowerCaseIfaceName}_class_init(${className}Class* requestClass) 629 647 { … … 632 650 gobjectClass->set_property = ${lowerCaseIfaceName}_set_property; 633 651 gobjectClass->get_property = ${lowerCaseIfaceName}_get_property; 652 gobjectClass->constructed = ${lowerCaseIfaceName}_constructed; 634 653 635 654 @txtInstallProps … … 1102 1121 { 1103 1122 g_return_val_if_fail(coreObject, 0); 1104 1105 ${className}* wrapper = WEBKIT_DOM_${clsCaps}(g_object_new(WEBKIT_TYPE_DOM_${clsCaps}, NULL));1106 g_return_val_if_fail(wrapper, 0);1107 1123 1108 1124 /* We call ref() rather than using a C++ smart pointer because we can't store a C++ object … … 1110 1126 * matching deref(). 1111 1127 */ 1112 1113 1128 coreObject->ref(); 1114 WEBKIT_DOM_OBJECT(wrapper)->coreObject = coreObject; 1115 @txtInstallEventListeners 1116 1117 return wrapper; 1129 1130 return WEBKIT_DOM_${clsCaps}(g_object_new(WEBKIT_TYPE_DOM_${clsCaps}, 1131 "core-object", coreObject, NULL)); 1118 1132 } 1119 1133 } // namespace WebKit -
trunk/WebCore/dom/Node.idl
r60784 r62004 135 135 #if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP 136 136 #if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C 137 #if !defined(LANGUAGE_GOBJECT) || !LANGUAGE_GOBJECT138 137 void addEventListener(in DOMString type, 139 138 in EventListener listener, … … 144 143 boolean dispatchEvent(in Event event) 145 144 raises(EventException); 146 #endif147 145 #endif 148 146 #endif
Note: See TracChangeset
for help on using the changeset viewer.