Bug #: 3914
authoreseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 28 Sep 2005 05:06:09 +0000 (05:06 +0000)
committereseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 28 Sep 2005 05:06:09 +0000 (05:06 +0000)
Submitted by: eseidel
Reviewed by: mjs
        Removed 19 uses of dynamic_cast.
        Part of this came by making EventTarget abstract, and moving
        the necessary implementations up into NodeImpl.
        http://bugzilla.opendarwin.org/show_bug.cgi?id=3914

        * kdom/Helper.h: comment cleanup
        * kdom/bindings/IDLCodeGeneratorJs.pm: tabs -> spaces
        * kdom/core/NodeImpl.cpp: Moved EventTarget methods
        (NodeImpl::addEventListener):
        (NodeImpl::removeEventListener):
        (NodeImpl::dispatchEvent):
        * kdom/core/NodeImpl.h:
        (KDOM::NodeImpl::isSVGElement):
        * kdom/events/EventTargetImpl.cpp: Moved methods to NodeImpl
        * kdom/events/EventTargetImpl.h:
        * kdom/ls/DOMImplementationLSImpl.cpp: disabled LSParserImpl
        (DOMImplementationLSImpl::createLSParser):
        * ksvg2/ecma/Ecma.cpp:
        (Ecma::setupDocument):
        * ksvg2/misc/KSVGTimeScheduler.cpp:
        (SVGTimer::notifyAll):
        * ksvg2/svg/SVGAnimationElementImpl.cpp:
        (SVGAnimationElementImpl::targetElement):
        (SVGAnimationElementImpl::targetAttribute):
        (SVGAnimationElementImpl::setTargetAttribute):
        * ksvg2/svg/SVGElementImpl.h:
        (KSVG::SVGElementImpl::isSVGElement):
        (KSVG::SVGElementImpl::isStyled):
        (KSVG::SVGElementImpl::isSVG):
        (KSVG::svg_dynamic_cast):
        * ksvg2/svg/SVGFilterPrimitiveStandardAttributesImpl.cpp:
        (SVGFilterPrimitiveStandardAttributesImpl::x):
        (SVGFilterPrimitiveStandardAttributesImpl::y):
        (SVGFilterPrimitiveStandardAttributesImpl::width):
        (SVGFilterPrimitiveStandardAttributesImpl::height):
        (SVGFilterPrimitiveStandardAttributesImpl::result):
        * ksvg2/svg/SVGHelper.cpp:
        (SVGHelper::PercentageOfViewport):
        * ksvg2/svg/SVGLocatableImpl.cpp:
        (SVGLocatableImpl::getCTM):
        * ksvg2/svg/SVGPatternElementImpl.cpp:
        (SVGPatternElementImpl::notifyAttributeChange):
        * ksvg2/svg/SVGSVGElementImpl.h:
        (KSVG::SVGSVGElementImpl::isSVG):
        * ksvg2/svg/SVGStyledElementImpl.cpp:
        (SVGStyledElementImpl::attach):
        (SVGStyledElementImpl::detach):
        * ksvg2/svg/SVGStyledElementImpl.h:
        (KSVG::SVGStyledElementImpl::isStyled):
        * ksvg2/svg/SVGUseElementImpl.cpp:
        (SVGUseElementImpl::close):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@10642 268f45cc-cd09-0410-ab3c-d52691b4dbfc

20 files changed:
SVGSupport/kdom/Helper.h
SVGSupport/kdom/bindings/IDLCodeGeneratorJs.pm
SVGSupport/kdom/core/NodeImpl.cpp
SVGSupport/kdom/core/NodeImpl.h
SVGSupport/kdom/events/EventTargetImpl.cpp
SVGSupport/kdom/events/EventTargetImpl.h
SVGSupport/kdom/ls/DOMImplementationLSImpl.cpp
WebCore/ChangeLog-2005-12-19
WebCore/ksvg2/ecma/Ecma.cpp
WebCore/ksvg2/misc/KSVGTimeScheduler.cpp
WebCore/ksvg2/svg/SVGAnimationElementImpl.cpp
WebCore/ksvg2/svg/SVGElementImpl.h
WebCore/ksvg2/svg/SVGFilterPrimitiveStandardAttributesImpl.cpp
WebCore/ksvg2/svg/SVGHelper.cpp
WebCore/ksvg2/svg/SVGLocatableImpl.cpp
WebCore/ksvg2/svg/SVGPatternElementImpl.cpp
WebCore/ksvg2/svg/SVGSVGElementImpl.h
WebCore/ksvg2/svg/SVGStyledElementImpl.cpp
WebCore/ksvg2/svg/SVGStyledElementImpl.h
WebCore/ksvg2/svg/SVGUseElementImpl.cpp

index 5db967b..35413e6 100644 (file)
@@ -32,7 +32,6 @@ namespace KDOM
     class Length;
     class AttrImpl;
     class NodeImpl;
-    class DOMString;
     class ElementImpl;
     class DocumentImpl;
     class DOMStringImpl;
@@ -180,10 +179,10 @@ namespace KDOM
          * \code
          * Element element = document.getElementByID "foobar");
          * 
-         * DOMString href = element.getAttribute("href");
-         * DOMString documentBase = element.baseURI();
+         * DOMStringImpl href = element.getAttribute("href");
+         * DOMStringImpl documentBase = element.baseURI();
          *
-         * DOMString theCompleteURL(Helper::BuildURI(documentBase.handle(), href.handle());
+         * DOMStringImpl theCompleteURL(Helper::BuildURI(documentBase.handle(), href.handle());
          * \endcode
          *
          * @param base the base URI to resolve against
index b64be85..1e4e3e0 100644 (file)
@@ -794,7 +794,7 @@ sub GenerateImplementation
                push(@implContent, "\n{\n    if(exec)\n        return " . $extractedType{'type'} . "Proto::self(exec);");
        }
                        
-       push(@implContent, "\n\n\treturn NULL;\n}\n");
+       push(@implContent, "\n\n    return NULL;\n}\n");
 
        # - Add 'bridge' function (always needed!)
        my $useBridge = "${showNS}DOMBridge";
@@ -1166,14 +1166,14 @@ sub GenerateHashTable
 #      push(@implContent, "static const char $nameStringTable\[\] =\n\{\n");
 #
 #      my $s = "\0";
-#      push(@implContent, "\t\"\\0\"\n");
+#      push(@implContent, "    \"\\0\"\n");
 #
 #      for my $k (sort { length($b) <=> length($a) || $a cmp $b } @$keys) {
 #              if ($s =~ /^(.*)\Q$k\E\0/) {
 #                      $soffset{$k} = length($1);
 #              } else {
 #                      $soffset{$k} = length($s);
-#                      push(@implContent, "\t\"$k\\0\"\n");
+#                      push(@implContent, "    \"$k\\0\"\n");
 #
 #                      $s .= $k;
 #                      $s .= "\0";
@@ -1190,8 +1190,8 @@ sub GenerateHashTable
                if(defined($entry)) {
                        my $key = @$keys[$entry];
 
-#                      push(@implContent, "\t\{ " . $soffset{$key});
-                       push(@implContent, "\t\{ \"" . $key . "\"");
+#                      push(@implContent, "    \{ " . $soffset{$key});
+                       push(@implContent, "    \{ \"" . $key . "\"");
                        push(@implContent, ", " . @$values[$entry]);
                        push(@implContent, ", " . @$specials[$entry]);
                        push(@implContent, ", " . @$parameters[$entry]);
@@ -1205,7 +1205,7 @@ sub GenerateHashTable
 #                              push(@implContent, "-1 \}");
                        }
                } else {
-                       push(@implContent, "\t\{ 0, 0, 0, 0, 0 \}");
+                       push(@implContent, "    \{ 0, 0, 0, 0, 0 \}");
                }
 
                push(@implContent, ",") unless($i eq $size - 1);
index 5cdb4a5..32e93a1 100644 (file)
@@ -31,6 +31,8 @@
 #include "NodeImpl.h"
 #include "TextImpl.h"
 #include "kdomevents.h"
+#include "RegisteredEventListener.h"
+#include "EventExceptionImpl.h"
 #include "RenderStyle.h"
 #include "ElementImpl.h"
 #include "DocumentImpl.h"
@@ -1182,6 +1184,150 @@ void NodeImpl::dispatchEventToSubTree(NodeImpl *node, EventImpl *event)
     }
 }
 
+void NodeImpl::addEventListener(DOMStringImpl *type, EventListenerImpl *listener, bool useCapture)
+{
+    if(!listener)
+        return;
+
+    if(type)
+        type->ref();
+
+    // If the requested listener is builtin (ie. DOMNODEREMOVED_EVENT)
+    // we'll cache the specific enumeration value to save space
+    // but in case of a custom event (ie. as used in the dom2 events test suite)
+    // for example 'foo' just don't cache it; kdom internally won't fire any
+    // 'foo' events, which means it doesn't need to know anything about it...
+
+    if(!m_eventListeners)
+    {
+        m_eventListeners = new Q3PtrList<RegisteredEventListener>();
+        m_eventListeners->setAutoDelete(true);
+    }
+    else
+    {
+        // If there is an existing listener forget this call...
+        RegisteredEventListener compare(type, listener, useCapture); 
+
+        Q3PtrListIterator<RegisteredEventListener> it(*m_eventListeners);
+        for(; it.current(); ++it)
+        {
+            if(*(it.current()) == compare)
+                return;
+        }
+    }
+
+    DocumentImpl *doc = (nodeType() == DOCUMENT_NODE) ? static_cast<DocumentImpl *>(this) : ownerDocument();
+    addListenerType(doc->addListenerType(type));
+    m_eventListeners->append(new RegisteredEventListener(type, listener, useCapture));
+
+    if(type)
+        type->deref();
+}
+
+void NodeImpl::removeEventListener(DOMStringImpl *type, EventListenerImpl *listener, bool useCapture)
+{
+    if(!m_eventListeners || !listener)
+        return;
+
+    DocumentImpl *doc = (nodeType() == DOCUMENT_NODE) ? static_cast<DocumentImpl *>(this) : ownerDocument();
+    if(!doc)
+    {
+        kdError() << "Couldn't remove listener type! No document available!" << endl;
+        return;
+    }
+
+    RegisteredEventListener compare(type, listener, useCapture);
+
+    Q3PtrListIterator<RegisteredEventListener> it(*m_eventListeners);
+    for(; it.current(); ++it)
+    {
+        if((*it.current()) == compare)
+        {
+            m_eventListeners->removeRef(it.current());
+            removeListenerType(doc->removeListenerType(type));
+            return;
+        }
+    }
+}
+
+bool NodeImpl::dispatchEvent(EventImpl *evt)
+{
+    if(!evt || (evt->id() == UNKNOWN_EVENT && (!evt->type() || evt->type()->isEmpty())))
+        throw new EventExceptionImpl(UNSPECIFIED_EVENT_TYPE_ERR);
+
+    evt->setTarget(this);
+
+    // Find out, where to send to -> collect parent nodes,
+    // cast them to EventTargets and add them to list
+    Q3PtrList<EventTargetImpl> targetChain;
+    for(NodeImpl *n = this; n != 0; n = n->parentNode())
+        targetChain.prepend(n);
+
+    // Trigger any capturing event handlers on our way down
+    evt->setEventPhase(CAPTURING_PHASE);
+
+    Q3PtrListIterator<EventTargetImpl> it(targetChain);
+    for(; it.current() && it.current() != this && !evt->propagationStopped(); ++it)
+    {
+        EventTargetImpl *i = it.current();
+        evt->setCurrentTarget(i);
+
+        if(i)
+            i->handleLocalEvents(evt, true);
+    }
+
+    // Dispatch to the actual target node
+    it.toLast();
+    if(!evt->propagationStopped())
+    {
+        EventTargetImpl *i = it.current();
+
+        evt->setCurrentTarget(i);
+        evt->setEventPhase(AT_TARGET);
+
+        if(i)
+            i->handleLocalEvents(evt, false);
+    }
+
+    --it;
+
+    // Bubble up again
+    if(evt->bubbles())
+    {
+        evt->setEventPhase(BUBBLING_PHASE);
+        for(; it.current() && !evt->propagationStopped(); --it)
+        {
+            EventTargetImpl *i = it.current();
+            evt->setCurrentTarget(i);
+
+            if(i)
+                i->handleLocalEvents(evt, false);
+        }
+    }
+
+    evt->setCurrentTarget(0);
+    evt->setEventPhase(0);        // I guess this is correct, the spec does not seem to say
+                                // anything about the default event handler phase.
+    if(evt->bubbles())
+    {
+        // now we call all default event handlers (this is not part of DOM - it is internal to khtml)
+        it.toLast();
+        for(; it.current() && !evt->propagationStopped() && !evt->defaultPrevented() && !evt->defaultHandled(); --it)
+            it.current()->defaultEventHandler(evt);
+    }
+
+    DocumentImpl *doc = (nodeType() == DOCUMENT_NODE) ? static_cast<DocumentImpl *>(this) : ownerDocument();
+    doc->updateRendering(); // any changes during event handling need to be rendered
+
+/* FIXME
+    Ecma *ecmaEngine = doc->ecmaEngine();
+    if(ecmaEngine)
+        ecmaEngine->finishedWithEvent(evt);
+*/
+    bool retVal = !evt->defaultPrevented(); // What if defaultPrevented was called before dispatchEvent?
+    return retVal;
+}
+
 NodeImpl *NodeImpl::traverseNextNode(NodeImpl *stayWithin) const
 {
     if(firstChild() || stayWithin == this)
index 4cecd93..d75e3c5 100644 (file)
@@ -147,6 +147,11 @@ namespace KDOM
         void dispatchChildRemovalEvents(NodeImpl *child);
         void dispatchChildInsertedEvents(NodeImpl *child);
         void dispatchEventToSubTree(NodeImpl *node, EventImpl *event);
+        
+        // EventTarget abstract methods
+        virtual void addEventListener(DOMStringImpl *type, EventListenerImpl *listener, bool useCapture);
+        virtual void removeEventListener(DOMStringImpl *type, EventListenerImpl *listener, bool useCapture);
+        virtual bool dispatchEvent(EventImpl *evt);
 
         // Internal
         virtual bool isReadOnly() const;
@@ -268,7 +273,9 @@ namespace KDOM
 
         bool inDocument() const { return m_inDocument; }
         void setInDocument(bool b = true) { m_inDocument = b; }
-
+#if APPLE_CHANGES
+        virtual bool isSVGElement() { return false; }
+#endif
     protected:
         // Helper methods (They will eventually throw exceptions!)
         bool isAncestor(NodeImpl *current, NodeImpl *other);
index b61645e..3837f8d 100644 (file)
@@ -44,177 +44,6 @@ EventTargetImpl::~EventTargetImpl()
     delete m_eventListeners;
 }
 
-void EventTargetImpl::addEventListener(DOMStringImpl *type, EventListenerImpl *listener, bool useCapture)
-{
-    if(!listener)
-        return;
-
-    if(type)
-        type->ref();
-
-    // If the requested listener is builtin (ie. DOMNODEREMOVED_EVENT)
-    // we'll cache the specific enumeration value to save space
-    // but in case of a custom event (ie. as used in the dom2 events test suite)
-    // for example 'foo' just don't cache it; kdom internally won't fire any
-    // 'foo' events, which means it doesn't need to know anything about it...
-    NodeImpl *dynObj = const_cast<NodeImpl *>(dynamic_cast<const NodeImpl *>(this));
-    if(!dynObj)
-    {
-        kdFatal() << "Upcast failed! The 'impossible' happened...!" << endl;
-        return;
-    }
-
-    DocumentImpl *doc = (dynObj->nodeType() == DOCUMENT_NODE) ? static_cast<DocumentImpl *>(dynObj) : dynObj->ownerDocument();
-    if(!doc)
-    {
-        kdError() << "Couldn't register listener type! No document available!" << endl;
-        return;
-    }
-
-    if(!m_eventListeners)
-    {
-        m_eventListeners = new Q3PtrList<RegisteredEventListener>();
-        m_eventListeners->setAutoDelete(true);
-    }
-    else
-    {
-        // If there is an existing listener forget this call...
-        RegisteredEventListener compare(type, listener, useCapture); 
-
-        Q3PtrListIterator<RegisteredEventListener> it(*m_eventListeners);
-        for(; it.current(); ++it)
-        {
-            if(*(it.current()) == compare)
-                return;
-        }
-    }
-
-    addListenerType(doc->addListenerType(type));
-    m_eventListeners->append(new RegisteredEventListener(type, listener, useCapture));
-
-    if(type)
-        type->deref();
-}
-
-void EventTargetImpl::removeEventListener(DOMStringImpl *type, EventListenerImpl *listener, bool useCapture)
-{
-    if(!m_eventListeners || !listener)
-        return;
-
-    NodeImpl *dynObj = const_cast<NodeImpl *>(dynamic_cast<const NodeImpl *>(this));
-    if(!dynObj)
-    {
-        kdFatal() << "Upcast failed! The 'impossible' happened...!" << endl;
-        return;
-    }
-
-    DocumentImpl *doc = (dynObj->nodeType() == DOCUMENT_NODE) ? static_cast<DocumentImpl *>(dynObj) : dynObj->ownerDocument();
-    if(!doc)
-    {
-        kdError() << "Couldn't remove listener type! No document available!" << endl;
-        return;
-    }
-
-    RegisteredEventListener compare(type, listener, useCapture);
-
-    Q3PtrListIterator<RegisteredEventListener> it(*m_eventListeners);
-    for(; it.current(); ++it)
-    {
-        if((*it.current()) == compare)
-        {
-            m_eventListeners->removeRef(it.current());
-            removeListenerType(doc->removeListenerType(type));
-            return;
-        }
-    }
-}
-
-bool EventTargetImpl::dispatchEvent(EventImpl *evt)
-{
-    if(!evt || (evt->id() == UNKNOWN_EVENT && (!evt->type() || evt->type()->isEmpty())))
-        throw new EventExceptionImpl(UNSPECIFIED_EVENT_TYPE_ERR);
-
-    evt->setTarget(const_cast<EventTargetImpl *>(this));
-
-    // Find out, where to send to -> collect parent nodes,
-    // cast them to EventTargets and add them to list
-    Q3PtrList<EventTargetImpl> targetChain;
-
-    NodeImpl *i = dynamic_cast<NodeImpl *>(this);
-    if(!i)
-    {
-        kdError() << k_funcinfo << " EventTarget must be inherited by Node! This should never happen." << endl;
-        return false;
-    }
-
-    for(NodeImpl *n = i; n != 0; n = n->parentNode())
-        targetChain.prepend(n);
-
-    // Trigger any capturing event handlers on our way down
-    evt->setEventPhase(CAPTURING_PHASE);
-
-    Q3PtrListIterator<EventTargetImpl> it(targetChain);
-    for(; it.current() && it.current() != this && !evt->propagationStopped(); ++it)
-    {
-        EventTargetImpl *i = it.current();
-        evt->setCurrentTarget(i);
-
-        if(i)
-            i->handleLocalEvents(evt, true);
-    }
-
-    // Dispatch to the actual target node
-    it.toLast();
-    if(!evt->propagationStopped())
-    {
-        EventTargetImpl *i = it.current();
-
-        evt->setCurrentTarget(i);
-        evt->setEventPhase(AT_TARGET);
-
-        if(i)
-            i->handleLocalEvents(evt, false);
-    }
-
-    --it;
-
-    // Bubble up again
-    if(evt->bubbles())
-    {
-        evt->setEventPhase(BUBBLING_PHASE);
-        for(; it.current() && !evt->propagationStopped(); --it)
-        {
-            EventTargetImpl *i = it.current();
-            evt->setCurrentTarget(i);
-
-            if(i)
-                i->handleLocalEvents(evt, false);
-        }
-    }
-
-    evt->setCurrentTarget(0);
-    evt->setEventPhase(0);        // I guess this is correct, the spec does not seem to say
-                                // anything about the default event handler phase.
-    if(evt->bubbles())
-    {
-        // now we call all default event handlers (this is not part of DOM - it is internal to khtml)
-        it.toLast();
-        for(; it.current() && !evt->propagationStopped() && !evt->defaultPrevented() && !evt->defaultHandled(); --it)
-            it.current()->defaultEventHandler(evt);
-    }
-
-    DocumentImpl *doc = (i->nodeType() == DOCUMENT_NODE) ? static_cast<DocumentImpl *>(i) : i->ownerDocument();
-    doc->updateRendering(); // any changes during event handling need to be rendered
-
-/* FIXME
-    Ecma *ecmaEngine = doc->ecmaEngine();
-    if(ecmaEngine)
-        ecmaEngine->finishedWithEvent(evt);
-*/
-    bool retVal = !evt->defaultPrevented(); // What if defaultPrevented was called before dispatchEvent?
-    return retVal;
-}
-
 void EventTargetImpl::handleLocalEvents(EventImpl *evt, bool useCapture)
 {
     if(!m_eventListeners || !evt)
index dbd1c6e..a76d727 100644 (file)
@@ -39,9 +39,9 @@ namespace KDOM
         EventTargetImpl();
         virtual ~EventTargetImpl();
 
-        void addEventListener(DOMStringImpl *type, EventListenerImpl *listener, bool useCapture);
-        void removeEventListener(DOMStringImpl *type, EventListenerImpl *listener, bool useCapture);
-        bool dispatchEvent(EventImpl *evt);
+        virtual void addEventListener(DOMStringImpl *type, EventListenerImpl *listener, bool useCapture) = 0;
+        virtual void removeEventListener(DOMStringImpl *type, EventListenerImpl *listener, bool useCapture) = 0;
+        virtual bool dispatchEvent(EventImpl *evt) = 0;
 
         void handleLocalEvents(EventImpl *evt, bool useCapture);
 
@@ -55,10 +55,11 @@ namespace KDOM
          */
         virtual void defaultEventHandler(EventImpl *) {}
 
+    protected:
+        Q3PtrList<RegisteredEventListener> *m_eventListeners;
+
     private:
         int m_listenerTypes;
-
-        Q3PtrList<RegisteredEventListener> *m_eventListeners;
     };
 };
 
index a50159c..2f3a745 100644 (file)
@@ -44,6 +44,7 @@ DOMImplementationLSImpl::~DOMImplementationLSImpl()
 
 LSParserImpl *DOMImplementationLSImpl::createLSParser(unsigned short mode, DOMStringImpl *schemaTypeImpl) const
 {
+#ifndef APPLE_COMPILE_HACK
     QString schemaType = schemaTypeImpl ? schemaTypeImpl->string() : QString();
 
     // NOT_SUPPORTED_ERR: Raised if the requested mode or schema type is not supported.
@@ -54,6 +55,9 @@ LSParserImpl *DOMImplementationLSImpl::createLSParser(unsigned short mode, DOMSt
     LSParserImpl *ret = new LSParserImpl();
     ret->setASync(mode == MODE_ASYNCHRONOUS);
     return ret;
+#else
+    throw new DOMExceptionImpl(NOT_SUPPORTED_ERR);
+#endif
 }
 
 LSInputImpl *DOMImplementationLSImpl::createLSInput() const
index e8dfe0b..cd4c70f 100644 (file)
@@ -1,3 +1,59 @@
+2005-09-27  Eric Seidel  <eseidel@apple.com>
+
+        Reviewed by mjs.
+
+        Removed 19 uses of dynamic_cast.
+        Part of this came by making EventTarget abstract, and moving
+        the necessary implementations up into NodeImpl.
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=3914
+
+        * kdom/Helper.h: comment cleanup
+        * kdom/bindings/IDLCodeGeneratorJs.pm: tabs -> spaces
+        * kdom/core/NodeImpl.cpp: Moved EventTarget methods
+        (NodeImpl::addEventListener):
+        (NodeImpl::removeEventListener):
+        (NodeImpl::dispatchEvent):
+        * kdom/core/NodeImpl.h:
+        (KDOM::NodeImpl::isSVGElement):
+        * kdom/events/EventTargetImpl.cpp: Moved methods to NodeImpl
+        * kdom/events/EventTargetImpl.h:
+        * kdom/ls/DOMImplementationLSImpl.cpp: disabled LSParserImpl
+        (DOMImplementationLSImpl::createLSParser):
+        * ksvg2/ecma/Ecma.cpp:
+        (Ecma::setupDocument):
+        * ksvg2/misc/KSVGTimeScheduler.cpp:
+        (SVGTimer::notifyAll):
+        * ksvg2/svg/SVGAnimationElementImpl.cpp:
+        (SVGAnimationElementImpl::targetElement):
+        (SVGAnimationElementImpl::targetAttribute):
+        (SVGAnimationElementImpl::setTargetAttribute):
+        * ksvg2/svg/SVGElementImpl.h:
+        (KSVG::SVGElementImpl::isSVGElement):
+        (KSVG::SVGElementImpl::isStyled):
+        (KSVG::SVGElementImpl::isSVG):
+        (KSVG::svg_dynamic_cast):
+        * ksvg2/svg/SVGFilterPrimitiveStandardAttributesImpl.cpp:
+        (SVGFilterPrimitiveStandardAttributesImpl::x):
+        (SVGFilterPrimitiveStandardAttributesImpl::y):
+        (SVGFilterPrimitiveStandardAttributesImpl::width):
+        (SVGFilterPrimitiveStandardAttributesImpl::height):
+        (SVGFilterPrimitiveStandardAttributesImpl::result):
+        * ksvg2/svg/SVGHelper.cpp:
+        (SVGHelper::PercentageOfViewport):
+        * ksvg2/svg/SVGLocatableImpl.cpp:
+        (SVGLocatableImpl::getCTM):
+        * ksvg2/svg/SVGPatternElementImpl.cpp:
+        (SVGPatternElementImpl::notifyAttributeChange):
+        * ksvg2/svg/SVGSVGElementImpl.h:
+        (KSVG::SVGSVGElementImpl::isSVG):
+        * ksvg2/svg/SVGStyledElementImpl.cpp:
+        (SVGStyledElementImpl::attach):
+        (SVGStyledElementImpl::detach):
+        * ksvg2/svg/SVGStyledElementImpl.h:
+        (KSVG::SVGStyledElementImpl::isStyled):
+        * ksvg2/svg/SVGUseElementImpl.cpp:
+        (SVGUseElementImpl::close):
+
 2005-09-27  Adele Peterson  <adele@apple.com>
 
         Reviewed by Maciej.
index 4765c82..6c19898 100644 (file)
@@ -109,12 +109,8 @@ Ecma::~Ecma()
 
 void Ecma::setupDocument(KDOM::DocumentImpl *document)
 {
-    SVGDocumentImpl *svgDocument = dynamic_cast<SVGDocumentImpl *>(document);
-    if(!svgDocument)
-    {    
-        kdFatal() << "Ecma::setupDocument -> The impossible happened..." << endl;
-        return;
-    }
+    ASSERT(KDOM::DOMString(document->namespaceURI()) == NS_SVG)
+    SVGDocumentImpl *svgDocument = static_cast<SVGDocumentImpl *>(document);
     
     // Create base bridge for document
     SVGDocument docObj(svgDocument);
index 39d9197..42c9fb3 100644 (file)
@@ -296,10 +296,10 @@ void SVGTimer::notifyAll()
         // Handle <animateTransform>...
         if(targetTransforms)
         {
-            SVGStyledElementImpl *styled = dynamic_cast<SVGStyledElementImpl *>(tit.key());
-            SVGTransformableImpl *transform = dynamic_cast<SVGTransformableImpl *>(tit.key());
+            SVGElementImpl *key = tit.key();
+            SVGTransformableImpl *transform = dynamic_cast<SVGTransformableImpl *>(key);
 
-            if(styled && transform)
+            if(key && key->isStyled() && transform)
             {
                 transform->transform()->setAnimVal(targetTransforms);
 
@@ -307,6 +307,7 @@ void SVGTimer::notifyAll()
                 transform->updateLocalTransform(transform->transform()->animVal());
 
                 // ... update element & child elements ...
+                SVGStyledElementImpl *styled = static_cast<SVGStyledElementImpl *>(key);
                 transform->updateSubtreeMatrices(styled);
 
                 // ... and switch back to baseVal (and do not update!)
@@ -331,9 +332,9 @@ void SVGTimer::notifyAll()
     // Optimized update logic (to avoid 4 updates, on the same element)
     for(tit = targetMap.begin(); tit != tend; ++tit)
     {
-        SVGStyledElementImpl *styled = dynamic_cast<SVGStyledElementImpl *>(tit.key());
-        if(styled)
-            styled->setChanged(true);
+        SVGElementImpl *key = tit.key();
+        if(key && key->isStyled())
+            static_cast<SVGStyledElementImpl *>(key)->setChanged(true);
     }
 }
 
index 44b492e..db0504e 100644 (file)
@@ -88,9 +88,9 @@ SVGElementImpl *SVGAnimationElementImpl::targetElement() const
     {
         if(!m_href.isEmpty())
         {
-            KDOM::ElementImpl *element = ownerDocument()->getElementById(KDOM::DOMString(SVGURIReferenceImpl::getTarget(m_href)).handle());
-            if(element)
-                m_targetElement = dynamic_cast<SVGElementImpl *>(element);
+            KDOM::DOMString targetId = SVGURIReferenceImpl::getTarget(m_href);
+            KDOM::ElementImpl *element = ownerDocument()->getElementById(targetId.handle());
+            m_targetElement = svg_dynamic_cast(element);
         }
         else if(parentNode())
         {
@@ -498,7 +498,10 @@ KDOM::DOMStringImpl *SVGAnimationElementImpl::targetAttribute() const
     if(!targetElement())
         return 0;
     
-    SVGStyledElementImpl *styled = dynamic_cast<SVGStyledElementImpl *>(targetElement());
+    SVGElementImpl *target = targetElement();
+    SVGStyledElementImpl *styled = NULL;
+    if (target && target->isStyled())
+        styled = static_cast<SVGStyledElementImpl *>(target);
     KDOM::CDFInterface *interface = (styled ? styled->ownerDocument()->implementation()->cdfInterface() : 0);
     
     KDOM::DOMStringImpl *ret = 0;
@@ -545,7 +548,9 @@ void SVGAnimationElementImpl::setTargetAttribute(SVGElementImpl *target, KDOM::D
     if(!target || !name || !value)
         return;
     
-    SVGStyledElementImpl *styled = dynamic_cast<SVGStyledElementImpl *>(target);
+    SVGStyledElementImpl *styled = NULL;
+    if (target && target->isStyled())
+        styled = static_cast<SVGStyledElementImpl *>(target);
     KDOM::CDFInterface *interface = (styled ? styled->ownerDocument()->implementation()->cdfInterface() : 0);
 
     EAttributeType attributeType = type;
index 054fa6e..58ffdd6 100644 (file)
@@ -44,7 +44,9 @@ namespace KSVG
     public:
         SVGElementImpl(KDOM::DocumentPtr *doc, KDOM::NodeImpl::Id id, KDOM::DOMStringImpl *prefix);
         virtual ~SVGElementImpl();
-
+#if APPLE_CHANGES
+        virtual bool isSVGElement() { return true; }
+#endif
         virtual bool isSupported(KDOM::DOMStringImpl *feature, KDOM::DOMStringImpl *version) const;
 
         // 'SVGElement' functions
@@ -70,6 +72,9 @@ namespace KSVG
         virtual QString adjustViewportClipping() const { return QString::null; }
 
         SVGDocumentImpl *getDocument() const;
+        
+        virtual bool isStyled() const { return false; }
+        virtual bool isSVG() const { return false; }
 
     private:
 #if 0
@@ -92,6 +97,29 @@ bool T::operator!=(const T &other) const { \
     return !operator==(other); \
 } \
 
+
+// Helper for DOMNode -> SVGElement conversion
+#include <kdom/kdom.h>
+#include <kdom/Namespace.h>
+#include <kdom/DOMString.h>
+
+namespace KSVG {
+    static inline SVGElementImpl *svg_dynamic_cast(KDOM::NodeImpl *node) {
+        SVGElementImpl *svgElement = NULL;
+#if APPLE_CHANGES
+        if (node && node->isSVGElement())
+            svgElement = static_cast<SVGElementImpl *>(node);
+#else
+        if (node && (node->nodeType() == KDOM::ELEMENT_NODE)) {
+            KDOM::ElementImpl *element = static_cast<KDOM::ElementImpl *>(node);
+            if (element && (KDOM::DOMString(element->namespaceURI()) == KDOM::NS_SVG))
+                svgElement = static_cast<SVGElementImpl *>(element);
+        }
+#endif
+        return svgElement;
+    }
+};
+
 #endif
 
 // vim:ts=4:noet
index 6ae87ba..a8a4ce9 100644 (file)
@@ -59,24 +59,21 @@ SVGFilterPrimitiveStandardAttributesImpl::~SVGFilterPrimitiveStandardAttributesI
 SVGAnimatedLengthImpl *SVGFilterPrimitiveStandardAttributesImpl::x() const
 {
     // Spec : If the attribute is not specified, the effect is as if a value of "0%" were specified.
-    const SVGStyledElementImpl *context = dynamic_cast<const SVGStyledElementImpl *>(this);
-    return lazy_create<SVGAnimatedLengthImpl>(m_x, context, LM_WIDTH);
+    return lazy_create<SVGAnimatedLengthImpl>(m_x, this, LM_WIDTH);
 }
 
 SVGAnimatedLengthImpl *SVGFilterPrimitiveStandardAttributesImpl::y() const
 {
     // Spec : If the attribute is not specified, the effect is as if a value of "0%" were specified.
-    const SVGStyledElementImpl *context = dynamic_cast<const SVGStyledElementImpl *>(this);
-    return lazy_create<SVGAnimatedLengthImpl>(m_y, context, LM_HEIGHT);
+    return lazy_create<SVGAnimatedLengthImpl>(m_y, this, LM_HEIGHT);
 }
 
 SVGAnimatedLengthImpl *SVGFilterPrimitiveStandardAttributesImpl::width() const
 {
-    const SVGStyledElementImpl *context = dynamic_cast<const SVGStyledElementImpl *>(this);
     // Spec : If the attribute is not specified, the effect is as if a value of "100%" were specified.
     if(!m_width)
     {
-         lazy_create<SVGAnimatedLengthImpl>(m_width, context, LM_WIDTH);
+        lazy_create<SVGAnimatedLengthImpl>(m_width, this, LM_WIDTH);
         m_width->baseVal()->setValueAsString(KDOM::DOMString("100%").handle());
         return m_width;
     }
@@ -86,11 +83,10 @@ SVGAnimatedLengthImpl *SVGFilterPrimitiveStandardAttributesImpl::width() const
 
 SVGAnimatedLengthImpl *SVGFilterPrimitiveStandardAttributesImpl::height() const
 {
-    const SVGStyledElementImpl *context = dynamic_cast<const SVGStyledElementImpl *>(this);
     // Spec : If the attribute is not specified, the effect is as if a value of "100%" were specified.
     if(!m_height)
     {
-         lazy_create<SVGAnimatedLengthImpl>(m_height, context, LM_HEIGHT);
+        lazy_create<SVGAnimatedLengthImpl>(m_height, this, LM_HEIGHT);
         m_height->baseVal()->setValueAsString(KDOM::DOMString("100%").handle());
         return m_height;
     }
@@ -100,8 +96,7 @@ SVGAnimatedLengthImpl *SVGFilterPrimitiveStandardAttributesImpl::height() const
 
 SVGAnimatedStringImpl *SVGFilterPrimitiveStandardAttributesImpl::result() const
 {
-    const SVGStyledElementImpl *context = dynamic_cast<const SVGStyledElementImpl *>(this);
-    return lazy_create<SVGAnimatedStringImpl>(m_result, context);
+    return lazy_create<SVGAnimatedStringImpl>(m_result, this);
 }
 
 void SVGFilterPrimitiveStandardAttributesImpl::parseAttribute(KDOM::AttributeImpl *attr)
index d39e0e2..5628dd9 100644 (file)
@@ -41,9 +41,9 @@ float SVGHelper::PercentageOfViewport(float value, const SVGElementImpl *viewpor
     if(!viewportElement)
         return 0.0;
  
-    const SVGSVGElementImpl *svg = dynamic_cast<const SVGSVGElementImpl *>(viewportElement);
-    if(svg)
+    if(viewportElement->isSVG())
     {
+        const SVGSVGElementImpl *svg = static_cast<const SVGSVGElementImpl *>(viewportElement);
         KDOM::DOMString viewBox("viewBox");
         if(svg->hasAttribute(viewBox.handle()))
         {
index 1b5c79c..8d82e6a 100644 (file)
@@ -104,10 +104,9 @@ SVGMatrixImpl *SVGLocatableImpl::getCTM() const
 
     SVGMatrixImpl *ctm = SVGSVGElementImpl::createSVGMatrix();
 
-    KDOM::NodeImpl *parent = element->parentNode();
-    if(parent && parent->nodeType() == KDOM::ELEMENT_NODE)
+    SVGElementImpl *parentElement = svg_dynamic_cast(element->parentNode());
+    if(parentElement)
     {
-        SVGElementImpl *parentElement = static_cast<SVGElementImpl *>(parent);
         SVGLocatableImpl *parentLocatable = dynamic_cast<SVGLocatableImpl *>(parentElement);
         if(parentLocatable)
         {
index c47326b..6171136 100644 (file)
@@ -228,7 +228,7 @@ void SVGPatternElementImpl::notifyAttributeChange() const
     // Find first pattern def that has children
     const KDOM::ElementImpl *target = this;
 
-    const KDOM::NodeImpl *test = static_cast<const KDOM::NodeImpl *>(target);
+    const KDOM::NodeImpl *test = this;
     while(test && !test->hasChildNodes())
     {
         QString ref = KDOM::DOMString(href()->baseVal()).string();
index 77bb880..e188537 100644 (file)
@@ -64,6 +64,8 @@ namespace KSVG
     public:
         SVGSVGElementImpl(KDOM::DocumentPtr *doc, KDOM::NodeImpl::Id id, KDOM::DOMStringImpl *prefix);
         virtual ~SVGSVGElementImpl();
+        
+        virtual bool isSVG() const { return true; }
 
         // 'SVGSVGElement' functions
         SVGAnimatedLengthImpl *x() const;
index b4d0245..ad823d9 100644 (file)
@@ -217,22 +217,23 @@ void SVGStyledElementImpl::attach()
             finalizeStyle(renderingStyle);
 
             // Apply transformations if possible...
-            SVGLocatableImpl *transformable = dynamic_cast<SVGLocatableImpl *>(this);
-            if(transformable)
+            SVGLocatableImpl *locatable = dynamic_cast<SVGLocatableImpl *>(this);
+            if(locatable)
             {
-                SVGMatrixImpl *ctm = transformable->getScreenCTM();
+                SVGMatrixImpl *ctm = locatable->getScreenCTM();
                 renderingStyle->setObjectMatrix(KCanvasMatrix(ctm->qmatrix()));
                 ctm->deref();
             }
 
-            SVGStyledElementImpl *parent = dynamic_cast<SVGStyledElementImpl *>(parentNode());
-            if(parent && parent->canvasItem() && parent->allowAttachChildren(this))
-                parent->canvasItem()->appendItem(m_canvasItem);
-            else if (parent) {
+            SVGElementImpl *parentElement = svg_dynamic_cast(parentNode());
+            SVGStyledElementImpl *styledParent = NULL;
+            if (parentElement && parentElement->isStyled())
+                    styledParent = static_cast<SVGStyledElementImpl *>(parentElement);
+            if(styledParent && styledParent->canvasItem() && styledParent->allowAttachChildren(this))
+                styledParent->canvasItem()->appendItem(m_canvasItem);
+            else if (styledParent) {
                 // FIXME: This exists until we can find a better way to create the root node. -- ecs 8/7/05
                 fprintf(stderr, "FAILED CANVAS INSERTION: <%s>, leaking %p\n", KDOM::DOMString(nodeName()).string().ascii(), this);
-                //delete m_canvasItem; // FIXME leaking items here, until we find a fix for patterns.
-                //m_canvasItem = NULL;
             }
 
 #ifndef APPLE_COMPILE_HACK
@@ -261,9 +262,13 @@ void SVGStyledElementImpl::detach()
 
     if(m_canvasItem)
     {
-        SVGStyledElementImpl *parent = dynamic_cast<SVGStyledElementImpl *>(parentNode());
-        if(parent && parent->canvasItem())
-            parent->canvasItem()->removeItem(m_canvasItem);
+        SVGElementImpl *parent = svg_dynamic_cast(parentNode());
+        SVGStyledElementImpl *styled = NULL;
+        if (parent && parent->isStyled())
+            styled = static_cast<SVGStyledElementImpl *>(parent);
+         
+        if(styled && styled->canvasItem())
+            styled->canvasItem()->removeItem(m_canvasItem);
     }
 
     kdDebug(26002) << "[SVGStyledElementImpl::detach] Detached canvas item: " << m_canvasItem << endl;
index bfce89f..558153f 100644 (file)
@@ -46,6 +46,8 @@ namespace KSVG
     public:
         SVGStyledElementImpl(KDOM::DocumentPtr *doc, KDOM::NodeImpl::Id id, KDOM::DOMStringImpl *prefix);
         virtual ~SVGStyledElementImpl();
+        
+        virtual bool isStyled() const { return true; }
 
         // 'SVGStylable' functions
         virtual SVGAnimatedStringImpl *className() const;
index 8331bee..da5ed98 100644 (file)
@@ -124,9 +124,10 @@ void SVGUseElementImpl::parseAttribute(KDOM::AttributeImpl *attr)
 void SVGUseElementImpl::close()
 {
     QString ref = KDOM::DOMString(href()->baseVal()).string();
-    QString targetId = SVGURIReferenceImpl::getTarget(ref);
-    SVGElementImpl *target = dynamic_cast<SVGElementImpl *>(ownerDocument()->getElementById(KDOM::DOMString(targetId).handle()));
-    if(!target)
+    KDOM::DOMString targetId = SVGURIReferenceImpl::getTarget(ref);
+    KDOM::ElementImpl *targetElement = ownerDocument()->getElementById(targetId.handle());
+    SVGElementImpl *target = svg_dynamic_cast(targetElement);
+    if (!target)
         return;
 
     float _x = x()->baseVal()->value(), _y = y()->baseVal()->value();