Reviewed by Tim H.
Patch for http://bugs.webkit.org/show_bug.cgi?id=11248
Even More auto-generated Objective-C DOM bindings changes
- Auto-generate DOMSVGPathElement.
- Auto-generate the internal interfaces even for classes that have
custom internal implementations. Change IDL property from ObjCNoInternal
to ObjCCustomInternalImpl to indicate the change.
- Add SVG classes to DOMNode and DOMEvent internal interfaces.
- Add isSVGZoomEvent() method to Event class to match other Event subclasses
and make DOM binding possible.
- Assorted cleanups.
* DerivedSources.make:
* WebCore.xcodeproj/project.pbxproj:
* bindings/objc/DOM.mm:
(WebCore::addElementClass):
(WebCore::createElementClassMap):
(WebCore::elementClass):
(-[DOMNode description]):
(+[DOMNode _nodeWith:WebCore::]):
(-[DOMNode addEventListener:listener:useCapture:]):
(-[DOMNode removeEventListener:listener:useCapture:]):
(-[DOMElement _NPObject]):
(WebCore::ObjCEventListener::handleEvent):
* bindings/objc/DOMEvents.mm:
(+[DOMEvent _eventWith:WebCore::]):
* bindings/objc/DOMInternal.h:
* bindings/objc/DOMRGBColor.mm:
(-[DOMRGBColor WebCore::]):
* bindings/objc/DOMSVGPathSegInternal.h: Removed.
* bindings/scripts/CodeGeneratorObjC.pm:
* css/CSSRule.idl:
* css/CSSValue.idl:
* css/StyleSheet.idl:
* dom/Event.cpp:
(WebCore::Event::isSVGZoomEvent):
* dom/Event.h:
* dom/Event.idl:
* dom/Node.idl:
* ksvg2/events/SVGZoomEvent.cpp:
(WebCore::SVGZoomEvent::isSVGZoomEvent):
* ksvg2/events/SVGZoomEvent.h:
* ksvg2/svg/SVGAnimatedAngle.idl:
* ksvg2/svg/SVGCircleElement.idl:
* ksvg2/svg/SVGClipPathElement.idl:
* ksvg2/svg/SVGPathElement.idl:
* ksvg2/svg/SVGPathSeg.idl:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@16982 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/bindings/objc/DOM.mm b/WebCore/bindings/objc/DOM.mm
index f08460dd..07cf460 100644
--- a/WebCore/bindings/objc/DOM.mm
+++ b/WebCore/bindings/objc/DOM.mm
@@ -63,9 +63,15 @@
#import <objc/objc-class.h>
#import <wtf/HashMap.h>
-using namespace WebCore::HTMLNames;
+#ifdef SVG_SUPPORT
+#import "SVGDocument.h"
+#import "SVGElement.h"
+#import "SVGNames.h"
+#endif
-class ObjCEventListener : public WebCore::EventListener {
+namespace WebCore {
+
+class ObjCEventListener : public EventListener {
public:
static ObjCEventListener* find(id <DOMEventListener>);
static ObjCEventListener* create(id <DOMEventListener>);
@@ -74,107 +80,176 @@
ObjCEventListener(id <DOMEventListener>);
virtual ~ObjCEventListener();
- virtual void handleEvent(WebCore::Event*, bool isWindowEvent);
+ virtual void handleEvent(Event*, bool isWindowEvent);
id <DOMEventListener> m_listener;
};
typedef HashMap<id, ObjCEventListener*> ListenerMap;
-typedef HashMap<WebCore::AtomicStringImpl*, Class> ObjCClassMap;
-
-static ObjCClassMap* elementClassMap;
static ListenerMap* listenerMap;
+} // namespace WebCore
+
//------------------------------------------------------------------------------------------
// DOMNode
-static void addElementClass(const WebCore::QualifiedName& tag, Class objCClass)
+namespace WebCore {
+
+typedef HashMap<const QualifiedName*, Class> ObjCClassMap;
+static ObjCClassMap* elementClassMap;
+
+static void addElementClass(const QualifiedName& tag, Class objCClass)
{
- elementClassMap->set(tag.localName().impl(), objCClass);
+ elementClassMap->set(&tag, objCClass);
}
-static void createHTMLElementClassMap()
+static void createElementClassMap()
{
// Create the table.
elementClassMap = new ObjCClassMap;
-
- // Populate it with HTML element classes.
- addElementClass(aTag, [DOMHTMLAnchorElement class]);
- addElementClass(appletTag, [DOMHTMLAppletElement class]);
- addElementClass(areaTag, [DOMHTMLAreaElement class]);
- addElementClass(baseTag, [DOMHTMLBaseElement class]);
- addElementClass(basefontTag, [DOMHTMLBaseFontElement class]);
- addElementClass(bodyTag, [DOMHTMLBodyElement class]);
- addElementClass(brTag, [DOMHTMLBRElement class]);
- addElementClass(buttonTag, [DOMHTMLButtonElement class]);
- addElementClass(canvasTag, [DOMHTMLImageElement class]);
- addElementClass(captionTag, [DOMHTMLTableCaptionElement class]);
- addElementClass(colTag, [DOMHTMLTableColElement class]);
- addElementClass(colgroupTag, [DOMHTMLTableColElement class]);
- addElementClass(dirTag, [DOMHTMLDirectoryElement class]);
- addElementClass(divTag, [DOMHTMLDivElement class]);
- addElementClass(dlTag, [DOMHTMLDListElement class]);
- addElementClass(fieldsetTag, [DOMHTMLFieldSetElement class]);
- addElementClass(fontTag, [DOMHTMLFontElement class]);
- addElementClass(formTag, [DOMHTMLFormElement class]);
- addElementClass(frameTag, [DOMHTMLFrameElement class]);
- addElementClass(framesetTag, [DOMHTMLFrameSetElement class]);
- addElementClass(h1Tag, [DOMHTMLHeadingElement class]);
- addElementClass(h2Tag, [DOMHTMLHeadingElement class]);
- addElementClass(h3Tag, [DOMHTMLHeadingElement class]);
- addElementClass(h4Tag, [DOMHTMLHeadingElement class]);
- addElementClass(h5Tag, [DOMHTMLHeadingElement class]);
- addElementClass(h6Tag, [DOMHTMLHeadingElement class]);
- addElementClass(headTag, [DOMHTMLHeadElement class]);
- addElementClass(hrTag, [DOMHTMLHRElement class]);
- addElementClass(htmlTag, [DOMHTMLHtmlElement class]);
- addElementClass(iframeTag, [DOMHTMLIFrameElement class]);
- addElementClass(imgTag, [DOMHTMLImageElement class]);
- addElementClass(inputTag, [DOMHTMLInputElement class]);
- addElementClass(isindexTag, [DOMHTMLIsIndexElement class]);
- addElementClass(labelTag, [DOMHTMLLabelElement class]);
- addElementClass(legendTag, [DOMHTMLLegendElement class]);
- addElementClass(liTag, [DOMHTMLLIElement class]);
- addElementClass(linkTag, [DOMHTMLLinkElement class]);
- addElementClass(listingTag, [DOMHTMLPreElement class]);
- addElementClass(mapTag, [DOMHTMLMapElement class]);
- addElementClass(menuTag, [DOMHTMLMenuElement class]);
- addElementClass(metaTag, [DOMHTMLMetaElement class]);
- addElementClass(objectTag, [DOMHTMLObjectElement class]);
- addElementClass(olTag, [DOMHTMLOListElement class]);
- addElementClass(optgroupTag, [DOMHTMLOptGroupElement class]);
- addElementClass(optionTag, [DOMHTMLOptionElement class]);
- addElementClass(pTag, [DOMHTMLParagraphElement class]);
- addElementClass(paramTag, [DOMHTMLParamElement class]);
- addElementClass(preTag, [DOMHTMLPreElement class]);
- addElementClass(qTag, [DOMHTMLQuoteElement class]);
- addElementClass(scriptTag, [DOMHTMLScriptElement class]);
- addElementClass(selectTag, [DOMHTMLSelectElement class]);
- addElementClass(styleTag, [DOMHTMLStyleElement class]);
- addElementClass(tableTag, [DOMHTMLTableElement class]);
- addElementClass(tbodyTag, [DOMHTMLTableSectionElement class]);
- addElementClass(tdTag, [DOMHTMLTableCellElement class]);
- addElementClass(textareaTag, [DOMHTMLTextAreaElement class]);
- addElementClass(tfootTag, [DOMHTMLTableSectionElement class]);
- addElementClass(theadTag, [DOMHTMLTableSectionElement class]);
- addElementClass(titleTag, [DOMHTMLTitleElement class]);
- addElementClass(trTag, [DOMHTMLTableRowElement class]);
- addElementClass(ulTag, [DOMHTMLUListElement class]);
// FIXME: Reflect marquee once the API has been determined.
+
+ // Populate it with HTML and SVG element classes.
+ addElementClass(HTMLNames::aTag, [DOMHTMLAnchorElement class]);
+ addElementClass(HTMLNames::appletTag, [DOMHTMLAppletElement class]);
+ addElementClass(HTMLNames::areaTag, [DOMHTMLAreaElement class]);
+ addElementClass(HTMLNames::baseTag, [DOMHTMLBaseElement class]);
+ addElementClass(HTMLNames::basefontTag, [DOMHTMLBaseFontElement class]);
+ addElementClass(HTMLNames::bodyTag, [DOMHTMLBodyElement class]);
+ addElementClass(HTMLNames::brTag, [DOMHTMLBRElement class]);
+ addElementClass(HTMLNames::buttonTag, [DOMHTMLButtonElement class]);
+ addElementClass(HTMLNames::canvasTag, [DOMHTMLImageElement class]);
+ addElementClass(HTMLNames::captionTag, [DOMHTMLTableCaptionElement class]);
+ addElementClass(HTMLNames::colTag, [DOMHTMLTableColElement class]);
+ addElementClass(HTMLNames::colgroupTag, [DOMHTMLTableColElement class]);
+ addElementClass(HTMLNames::dirTag, [DOMHTMLDirectoryElement class]);
+ addElementClass(HTMLNames::divTag, [DOMHTMLDivElement class]);
+ addElementClass(HTMLNames::dlTag, [DOMHTMLDListElement class]);
+ addElementClass(HTMLNames::fieldsetTag, [DOMHTMLFieldSetElement class]);
+ addElementClass(HTMLNames::fontTag, [DOMHTMLFontElement class]);
+ addElementClass(HTMLNames::formTag, [DOMHTMLFormElement class]);
+ addElementClass(HTMLNames::frameTag, [DOMHTMLFrameElement class]);
+ addElementClass(HTMLNames::framesetTag, [DOMHTMLFrameSetElement class]);
+ addElementClass(HTMLNames::h1Tag, [DOMHTMLHeadingElement class]);
+ addElementClass(HTMLNames::h2Tag, [DOMHTMLHeadingElement class]);
+ addElementClass(HTMLNames::h3Tag, [DOMHTMLHeadingElement class]);
+ addElementClass(HTMLNames::h4Tag, [DOMHTMLHeadingElement class]);
+ addElementClass(HTMLNames::h5Tag, [DOMHTMLHeadingElement class]);
+ addElementClass(HTMLNames::h6Tag, [DOMHTMLHeadingElement class]);
+ addElementClass(HTMLNames::headTag, [DOMHTMLHeadElement class]);
+ addElementClass(HTMLNames::hrTag, [DOMHTMLHRElement class]);
+ addElementClass(HTMLNames::htmlTag, [DOMHTMLHtmlElement class]);
+ addElementClass(HTMLNames::iframeTag, [DOMHTMLIFrameElement class]);
+ addElementClass(HTMLNames::imgTag, [DOMHTMLImageElement class]);
+ addElementClass(HTMLNames::inputTag, [DOMHTMLInputElement class]);
+ addElementClass(HTMLNames::isindexTag, [DOMHTMLIsIndexElement class]);
+ addElementClass(HTMLNames::labelTag, [DOMHTMLLabelElement class]);
+ addElementClass(HTMLNames::legendTag, [DOMHTMLLegendElement class]);
+ addElementClass(HTMLNames::liTag, [DOMHTMLLIElement class]);
+ addElementClass(HTMLNames::linkTag, [DOMHTMLLinkElement class]);
+ addElementClass(HTMLNames::listingTag, [DOMHTMLPreElement class]);
+ addElementClass(HTMLNames::mapTag, [DOMHTMLMapElement class]);
+ addElementClass(HTMLNames::menuTag, [DOMHTMLMenuElement class]);
+ addElementClass(HTMLNames::metaTag, [DOMHTMLMetaElement class]);
+ addElementClass(HTMLNames::objectTag, [DOMHTMLObjectElement class]);
+ addElementClass(HTMLNames::olTag, [DOMHTMLOListElement class]);
+ addElementClass(HTMLNames::optgroupTag, [DOMHTMLOptGroupElement class]);
+ addElementClass(HTMLNames::optionTag, [DOMHTMLOptionElement class]);
+ addElementClass(HTMLNames::pTag, [DOMHTMLParagraphElement class]);
+ addElementClass(HTMLNames::paramTag, [DOMHTMLParamElement class]);
+ addElementClass(HTMLNames::preTag, [DOMHTMLPreElement class]);
+ addElementClass(HTMLNames::qTag, [DOMHTMLQuoteElement class]);
+ addElementClass(HTMLNames::scriptTag, [DOMHTMLScriptElement class]);
+ addElementClass(HTMLNames::selectTag, [DOMHTMLSelectElement class]);
+ addElementClass(HTMLNames::styleTag, [DOMHTMLStyleElement class]);
+ addElementClass(HTMLNames::tableTag, [DOMHTMLTableElement class]);
+ addElementClass(HTMLNames::tbodyTag, [DOMHTMLTableSectionElement class]);
+ addElementClass(HTMLNames::tdTag, [DOMHTMLTableCellElement class]);
+ addElementClass(HTMLNames::textareaTag, [DOMHTMLTextAreaElement class]);
+ addElementClass(HTMLNames::tfootTag, [DOMHTMLTableSectionElement class]);
+ addElementClass(HTMLNames::theadTag, [DOMHTMLTableSectionElement class]);
+ addElementClass(HTMLNames::titleTag, [DOMHTMLTitleElement class]);
+ addElementClass(HTMLNames::trTag, [DOMHTMLTableRowElement class]);
+ addElementClass(HTMLNames::ulTag, [DOMHTMLUListElement class]);
+
+#ifdef SVG_SUPPORT
+ addElementClass(SVGNames::aTag, [DOMSVGAElement class]);
+ addElementClass(SVGNames::animateTag, [DOMSVGAnimateElement class]);
+ addElementClass(SVGNames::animateColorTag, [DOMSVGAnimateColorElement class]);
+ addElementClass(SVGNames::animateTransformTag, [DOMSVGAnimateTransformElement class]);
+ addElementClass(SVGNames::circleTag, [DOMSVGCircleElement class]);
+ addElementClass(SVGNames::clipPathTag, [DOMSVGClipPathElement class]);
+ addElementClass(SVGNames::cursorTag, [DOMSVGCursorElement class]);
+ addElementClass(SVGNames::defsTag, [DOMSVGDefsElement class]);
+ addElementClass(SVGNames::descTag, [DOMSVGDescElement class]);
+ addElementClass(SVGNames::ellipseTag, [DOMSVGEllipseElement class]);
+ addElementClass(SVGNames::feBlendTag, [DOMSVGFEBlendElement class]);
+ addElementClass(SVGNames::feColorMatrixTag, [DOMSVGFEColorMatrixElement class]);
+ addElementClass(SVGNames::feComponentTransferTag, [DOMSVGFEComponentTransferElement class]);
+ addElementClass(SVGNames::feCompositeTag, [DOMSVGFECompositeElement class]);
+ addElementClass(SVGNames::feDiffuseLightingTag, [DOMSVGFEDiffuseLightingElement class]);
+ addElementClass(SVGNames::feDisplacementMapTag, [DOMSVGFEDisplacementMapElement class]);
+ addElementClass(SVGNames::feDistantLightTag, [DOMSVGFEDistantLightElement class]);
+ addElementClass(SVGNames::feFloodTag, [DOMSVGFEFloodElement class]);
+ addElementClass(SVGNames::feFuncATag, [DOMSVGFEFuncAElement class]);
+ addElementClass(SVGNames::feFuncBTag, [DOMSVGFEFuncBElement class]);
+ addElementClass(SVGNames::feFuncGTag, [DOMSVGFEFuncGElement class]);
+ addElementClass(SVGNames::feFuncRTag, [DOMSVGFEFuncRElement class]);
+ addElementClass(SVGNames::feGaussianBlurTag, [DOMSVGFEGaussianBlurElement class]);
+ addElementClass(SVGNames::feImageTag, [DOMSVGFEImageElement class]);
+ addElementClass(SVGNames::feMergeTag, [DOMSVGFEMergeElement class]);
+ addElementClass(SVGNames::feMergeNodeTag, [DOMSVGFEMergeNodeElement class]);
+ addElementClass(SVGNames::feOffsetTag, [DOMSVGFEOffsetElement class]);
+ addElementClass(SVGNames::fePointLightTag, [DOMSVGFEPointLightElement class]);
+ addElementClass(SVGNames::feSpecularLightingTag, [DOMSVGFESpecularLightingElement class]);
+ addElementClass(SVGNames::feSpotLightTag, [DOMSVGFESpotLightElement class]);
+ addElementClass(SVGNames::feTileTag, [DOMSVGFETileElement class]);
+ addElementClass(SVGNames::feTurbulenceTag, [DOMSVGFETurbulenceElement class]);
+ addElementClass(SVGNames::filterTag, [DOMSVGFilterElement class]);
+ addElementClass(SVGNames::foreignObjectTag, [DOMSVGForeignObjectElement class]);
+ addElementClass(SVGNames::gTag, [DOMSVGGElement class]);
+ addElementClass(SVGNames::imageTag, [DOMSVGImageElement class]);
+ addElementClass(SVGNames::lineTag, [DOMSVGLineElement class]);
+ addElementClass(SVGNames::linearGradientTag, [DOMSVGLinearGradientElement class]);
+ addElementClass(SVGNames::markerTag, [DOMSVGMarkerElement class]);
+ addElementClass(SVGNames::maskTag, [DOMSVGMaskElement class]);
+ addElementClass(SVGNames::metadataTag, [DOMSVGMetadataElement class]);
+ addElementClass(SVGNames::pathTag, [DOMSVGPathElement class]);
+ addElementClass(SVGNames::patternTag, [DOMSVGPatternElement class]);
+ addElementClass(SVGNames::polygonTag, [DOMSVGPolygonElement class]);
+ addElementClass(SVGNames::polylineTag, [DOMSVGPolylineElement class]);
+ addElementClass(SVGNames::radialGradientTag, [DOMSVGRadialGradientElement class]);
+ addElementClass(SVGNames::rectTag, [DOMSVGRectElement class]);
+ addElementClass(SVGNames::scriptTag, [DOMSVGScriptElement class]);
+ addElementClass(SVGNames::setTag, [DOMSVGSetElement class]);
+ addElementClass(SVGNames::stopTag, [DOMSVGStopElement class]);
+ addElementClass(SVGNames::styleTag, [DOMSVGStyleElement class]);
+ addElementClass(SVGNames::svgTag, [DOMSVGSVGElement class]);
+ addElementClass(SVGNames::switchTag, [DOMSVGSwitchElement class]);
+ addElementClass(SVGNames::symbolTag, [DOMSVGSymbolElement class]);
+ addElementClass(SVGNames::textTag, [DOMSVGTextElement class]);
+ addElementClass(SVGNames::titleTag, [DOMSVGTitleElement class]);
+ addElementClass(SVGNames::trefTag, [DOMSVGTRefElement class]);
+ addElementClass(SVGNames::tspanTag, [DOMSVGTSpanElement class]);
+ addElementClass(SVGNames::useTag, [DOMSVGUseElement class]);
+ addElementClass(SVGNames::viewTag, [DOMSVGViewElement class]);
+#endif
}
-static Class elementClass(const WebCore::AtomicString& tagName)
+static Class elementClass(const QualifiedName& tag, Class defaultClass)
{
if (!elementClassMap)
- createHTMLElementClassMap();
- Class objcClass = elementClassMap->get(tagName.impl());
+ createElementClassMap();
+ Class objcClass = elementClassMap->get(&tag);
if (!objcClass)
- objcClass = [DOMHTMLElement class];
+ objcClass = defaultClass;
return objcClass;
}
+} // namespace WebCore
+
@implementation DOMNode (WebCoreInternal)
// FIXME: should this go in the main implementation?
@@ -182,7 +257,7 @@
{
if (!_internal)
return [NSString stringWithFormat:@"<%@: null>", [[self class] description], self];
-
+
NSString *value = [self nodeValue];
if (value)
return [NSString stringWithFormat:@"<%@ [%@]: %p '%@'>",
@@ -206,17 +281,21 @@
{
if (!impl)
return nil;
-
+
id cachedInstance;
cachedInstance = WebCore::getDOMWrapper(impl);
if (cachedInstance)
return [[cachedInstance retain] autorelease];
-
+
Class wrapperClass = nil;
switch (impl->nodeType()) {
case WebCore::Node::ELEMENT_NODE:
if (impl->isHTMLElement())
- wrapperClass = elementClass(static_cast<WebCore::HTMLElement*>(impl)->localName());
+ wrapperClass = WebCore::elementClass(static_cast<WebCore::HTMLElement*>(impl)->tagQName(), [DOMHTMLElement class]);
+#ifdef SVG_SUPPORT
+ else if (impl->isSVGElement())
+ wrapperClass = WebCore::elementClass(static_cast<WebCore::SVGElement*>(impl)->tagQName(), [DOMSVGElement class]);
+#endif
else
wrapperClass = [DOMElement class];
break;
@@ -244,6 +323,10 @@
case WebCore::Node::DOCUMENT_NODE:
if (static_cast<WebCore::Document*>(impl)->isHTMLDocument())
wrapperClass = [DOMHTMLDocument class];
+#ifdef SVG_SUPPORT
+ else if (static_cast<WebCore::Document*>(impl)->isSVGDocument())
+ wrapperClass = [DOMSVGDocument class];
+#endif
else
wrapperClass = [DOMDocument class];
break;
@@ -317,7 +400,7 @@
if (![self _node]->isEventTargetNode())
WebCore::raiseDOMException(DOM_NOT_SUPPORTED_ERR);
- WebCore::EventListener *wrapper = ObjCEventListener::create(listener);
+ WebCore::EventListener *wrapper = WebCore::ObjCEventListener::create(listener);
WebCore::EventTargetNodeCast([self _node])->addEventListener(type, wrapper, useCapture);
wrapper->deref();
}
@@ -333,7 +416,7 @@
if (![self _node]->isEventTargetNode())
WebCore::raiseDOMException(DOM_NOT_SUPPORTED_ERR);
- if (WebCore::EventListener *wrapper = ObjCEventListener::find(listener))
+ if (WebCore::EventListener *wrapper = WebCore::ObjCEventListener::find(listener))
WebCore::EventTargetNodeCast([self _node])->removeEventListener(type, wrapper, useCapture);
}
@@ -412,7 +495,7 @@
- (void *)_NPObject
{
WebCore::Element* element = [self _element];
- if (element->hasTagName(appletTag) || element->hasTagName(embedTag) || element->hasTagName(objectTag))
+ if (element->hasTagName(WebCore::HTMLNames::appletTag) || element->hasTagName(WebCore::HTMLNames::embedTag) || element->hasTagName(WebCore::HTMLNames::objectTag))
return static_cast<WebCore::HTMLPlugInElement*>(element)->getNPObject();
return 0;
}
@@ -590,9 +673,12 @@
@end
+
//------------------------------------------------------------------------------------------
// ObjCEventListener
+namespace WebCore {
+
ObjCEventListener* ObjCEventListener::find(id <DOMEventListener> listener)
{
if (ListenerMap* map = listenerMap)
@@ -626,7 +712,9 @@
[m_listener release];
}
-void ObjCEventListener::handleEvent(WebCore::Event* event, bool)
+void ObjCEventListener::handleEvent(Event* event, bool)
{
[m_listener handleEvent:[DOMEvent _eventWith:event]];
}
+
+} // namespace WebCore