2009-02-01 Darin Adler <darin@apple.com>
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Feb 2009 17:29:54 +0000 (17:29 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Feb 2009 17:29:54 +0000 (17:29 +0000)
        Reviewed by Dave Hyatt.

        Bug 23674: Speed up some things based on profiling the page load test
        https://bugs.webkit.org/show_bug.cgi?id=23674

        * css/CSSStyleSelector.cpp:
        (WebCore::CSSStyleSelector::canShareStyleWithElement): Use the newly named cssTarget instead
        of the old name, getCSSTarget.
        (WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector): Ditto.

        * dom/ContainerNode.cpp:
        (WebCore::ContainerNode::insertedIntoDocument): Moved code from Node in here rather than
        calling through to EventTargetNode::insertedIntoDocument.
        (WebCore::ContainerNode::removedFromDocument): Ditto.
        (WebCore::ContainerNode::insertedIntoTree): Tweaked a bit.
        (WebCore::ContainerNode::removedFromTree): Ditto.

        * dom/ContainerNode.h: Moved the constructor definition here and made it inline.

        * dom/Document.cpp:
        (WebCore::Document::removeAllEventListenersFromAllNodes): Iterate the document element and
        its contents only to avoid the document type node. This allows us to remove the virtual
        function call to isEventTargetNode from the loop.
        (WebCore::Document::setCSSTarget): Changed argument to be an Element rather than Node.

        * dom/Document.h: Changed CSS target to be an Element rather than a Node. Renamed
        getCSSTarget to cssTarget.

        * dom/EventTargetNode.cpp:
        (WebCore::EventTargetNode::removeAllEventListenersSlowCase): Renamed and turned the
        rare data check into an assertion.

        * dom/EventTargetNode.h: Made the fast case of removeAllEventListeners be inline.
        Also moved the constructor definition here and made it inline. And added toEventTargetNode,
        matching the design of the render tree checked casts. Later we can migrate all callers
        from EventTargetNodeCast to toEventTargetNode.

        * dom/NamedAttrMap.cpp:
        (WebCore::NamedAttrMap::detachAttributesFromElement): Added. Factored out from
        clearAttributes, so we could use this loop in cases where we're not clearing the attributes.
        (WebCore::NamedAttrMap::~NamedAttrMap): Call detachAttributesFromElement instead of
        clearAttributes here.
        (WebCore::NamedAttrMap::clearAttributes): Call detachAttributesFromElement here.
        (WebCore::NamedAttrMap::detachFromElement): Call detachAttributesFromElement instead of
        clearAttributes. We don't need to clear the attributes array just because the element is
        going away, so don't.
        (WebCore::NamedAttrMap::virtualLength): Added.

        * dom/NamedAttrMap.h: Made all the virtual functions inherited from NamedNodeMap be private.
        These are all unnecessarily inefficient for use outside the DOM. Changed length to be a
        non-virtual function. This was a fairly hot function.

        * dom/NamedMappedAttrMap.cpp:
        (WebCore::NamedMappedAttrMap::setClass): Changed to use element() function now that the
        m_element data member is private.

        * dom/NamedMappedAttrMap.h: Made a few functions private. Made the
        hasMappedAttributes function non-virtual.

        * dom/NamedNodeMap.h: Made length a non-virtual inline function that calls a virtual
        function, name virtualLength. This lets NamedAttrMap::length be a non-virtual function.

        * dom/Node.cpp:
        (WebCore::Node::insertedIntoDocument): Removed call to insertedIntoTree, since it's
        only non-empty in subclasses of ContainerNode.
        (WebCore::Node::removedFromDocument): Ditto. Also removed setCSSTarget. Since a CSS
        target has to be an Element, this can be moved down to ContainerNode (or it could be
        moved down to Element for that matter).

        * dom/QualifiedName.cpp:
        (WebCore::QualifiedName::QualifiedName): Removed double initialization of m_impl.

        * dom/QualifiedName.h: Moved the destructor, copy constructor, assignment operator, and
        setPrefix function definitions into the header and made them inline.

        * html/HTMLAreaElement.cpp:
        (WebCore::HTMLAreaElement::mapMouseEvent): Updated since the stored region is now
        an OwnPtr.
        (WebCore::HTMLAreaElement::accessKey): Use AtomicString.
        (WebCore::HTMLAreaElement::setAccessKey): Ditto.
        (WebCore::HTMLAreaElement::alt): Ditto.
        (WebCore::HTMLAreaElement::setAlt): Ditto.
        (WebCore::HTMLAreaElement::coords): Ditto.
        (WebCore::HTMLAreaElement::setCoords): Ditto.
        (WebCore::HTMLAreaElement::setHref): Ditto.
        (WebCore::HTMLAreaElement::shape): Ditto.
        (WebCore::HTMLAreaElement::setShape): Ditto.
        (WebCore::HTMLAreaElement::setTarget): Ditto.

        * html/HTMLAreaElement.h: Use AtomicString in the getter and setter DOM operations.
        Change the region data member to be an OwnPtr<Path> instead of a Path to optimize
        the common case where an area element is parsed but never hit-tested. This could
        also have been done by changing the Path class's null case to be more efficient,
        but this seems fine.

        * html/HTMLViewSourceDocument.cpp:
        (WebCore::HTMLViewSourceDocument::createContainingTable): Use addAttribute instead
        of insertAttribute.
        (WebCore::HTMLViewSourceDocument::addSpanWithClassName): Ditto.
        (WebCore::HTMLViewSourceDocument::addLine): Ditto.
        (WebCore::HTMLViewSourceDocument::addLink): Ditto.

        * loader/FrameLoader.cpp:
        (WebCore::FrameLoader::gotoAnchor): Use cssTarget under its new name instead
        of its old name getCSSTarget.

        * platform/graphics/GlyphWidthMap.cpp:
        (WebCore::GlyphWidthMap::locatePageSlowCase): Refactored from locatePage.

        * platform/graphics/GlyphWidthMap.h: Made most of this class inline.
        Changed m_pages to use OwnPtr.

        * platform/text/PlatformString.h: Remove include no longer needed since
        StringImpl.h includes it.

        * platform/text/StringImpl.cpp:
        (WebCore::StringImpl::createStrippingNullCharactersSlowCase): Refactored
        from createStrippingNullCharacters.
        * platform/text/StringImpl.h: Moved the definition of
        createStrippingNullCharacters here and made it inline.

        * rendering/RenderObject.cpp:
        (WebCore::RenderObject::firstLineStyleSlowCase): Refactored from
        firstLineStyle.

        * rendering/RenderObject.h: Moved the definition of the firstLineStyle
        function here and made it inline. Moved the definition of the
        documentBeingDestroyed function here and made it inline.

        * svg/SVGSVGElement.cpp:
        (WebCore::SVGSVGElement::getCTM): Use getAttributeItem instead of
        getNamedItem here since it accomplishes the same thing but is more efficient.
        (WebCore::SVGSVGElement::getScreenCTM): Ditto.
        * svg/SVGStyledElement.cpp:
        (WebCore::SVGStyledElement::getPresentationAttribute): Ditto.

        * xml/XPathFunctions.cpp:
        (WebCore::XPath::FunLang::evaluate): Use getAttributeItem instead of
        getNamedItemNS.

        * xml/XPathStep.cpp:
        (WebCore::XPath::Step::nodesInAxis): Use attributeItem instead of item here.

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

31 files changed:
WebCore/ChangeLog
WebCore/css/CSSStyleSelector.cpp
WebCore/dom/ContainerNode.cpp
WebCore/dom/ContainerNode.h
WebCore/dom/Document.cpp
WebCore/dom/Document.h
WebCore/dom/EventTargetNode.cpp
WebCore/dom/EventTargetNode.h
WebCore/dom/NamedAttrMap.cpp
WebCore/dom/NamedAttrMap.h
WebCore/dom/NamedMappedAttrMap.cpp
WebCore/dom/NamedMappedAttrMap.h
WebCore/dom/NamedNodeMap.h
WebCore/dom/Node.cpp
WebCore/dom/QualifiedName.cpp
WebCore/dom/QualifiedName.h
WebCore/html/HTMLAreaElement.cpp
WebCore/html/HTMLAreaElement.h
WebCore/html/HTMLViewSourceDocument.cpp
WebCore/loader/FrameLoader.cpp
WebCore/platform/graphics/GlyphWidthMap.cpp
WebCore/platform/graphics/GlyphWidthMap.h
WebCore/platform/text/PlatformString.h
WebCore/platform/text/StringImpl.cpp
WebCore/platform/text/StringImpl.h
WebCore/rendering/RenderObject.cpp
WebCore/rendering/RenderObject.h
WebCore/svg/SVGSVGElement.cpp
WebCore/svg/SVGStyledElement.cpp
WebCore/xml/XPathFunctions.cpp
WebCore/xml/XPathStep.cpp

index 407ccb7..19f2d5a 100644 (file)
@@ -1,3 +1,148 @@
+2009-02-01  Darin Adler  <darin@apple.com>
+
+        Reviewed by Dave Hyatt.
+
+        Bug 23674: Speed up some things based on profiling the page load test
+        https://bugs.webkit.org/show_bug.cgi?id=23674
+
+        * css/CSSStyleSelector.cpp:
+        (WebCore::CSSStyleSelector::canShareStyleWithElement): Use the newly named cssTarget instead
+        of the old name, getCSSTarget.
+        (WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector): Ditto.
+
+        * dom/ContainerNode.cpp:
+        (WebCore::ContainerNode::insertedIntoDocument): Moved code from Node in here rather than
+        calling through to EventTargetNode::insertedIntoDocument.
+        (WebCore::ContainerNode::removedFromDocument): Ditto.
+        (WebCore::ContainerNode::insertedIntoTree): Tweaked a bit.
+        (WebCore::ContainerNode::removedFromTree): Ditto.
+
+        * dom/ContainerNode.h: Moved the constructor definition here and made it inline.
+
+        * dom/Document.cpp:
+        (WebCore::Document::removeAllEventListenersFromAllNodes): Iterate the document element and
+        its contents only to avoid the document type node. This allows us to remove the virtual
+        function call to isEventTargetNode from the loop.
+        (WebCore::Document::setCSSTarget): Changed argument to be an Element rather than Node.
+
+        * dom/Document.h: Changed CSS target to be an Element rather than a Node. Renamed
+        getCSSTarget to cssTarget.
+
+        * dom/EventTargetNode.cpp:
+        (WebCore::EventTargetNode::removeAllEventListenersSlowCase): Renamed and turned the
+        rare data check into an assertion.
+
+        * dom/EventTargetNode.h: Made the fast case of removeAllEventListeners be inline.
+        Also moved the constructor definition here and made it inline. And added toEventTargetNode,
+        matching the design of the render tree checked casts. Later we can migrate all callers
+        from EventTargetNodeCast to toEventTargetNode.
+
+        * dom/NamedAttrMap.cpp:
+        (WebCore::NamedAttrMap::detachAttributesFromElement): Added. Factored out from
+        clearAttributes, so we could use this loop in cases where we're not clearing the attributes.
+        (WebCore::NamedAttrMap::~NamedAttrMap): Call detachAttributesFromElement instead of
+        clearAttributes here.
+        (WebCore::NamedAttrMap::clearAttributes): Call detachAttributesFromElement here.
+        (WebCore::NamedAttrMap::detachFromElement): Call detachAttributesFromElement instead of
+        clearAttributes. We don't need to clear the attributes array just because the element is
+        going away, so don't.
+        (WebCore::NamedAttrMap::virtualLength): Added.
+
+        * dom/NamedAttrMap.h: Made all the virtual functions inherited from NamedNodeMap be private.
+        These are all unnecessarily inefficient for use outside the DOM. Changed length to be a
+        non-virtual function. This was a fairly hot function.
+
+        * dom/NamedMappedAttrMap.cpp:
+        (WebCore::NamedMappedAttrMap::setClass): Changed to use element() function now that the
+        m_element data member is private.
+
+        * dom/NamedMappedAttrMap.h: Made a few functions private. Made the
+        hasMappedAttributes function non-virtual.
+
+        * dom/NamedNodeMap.h: Made length a non-virtual inline function that calls a virtual
+        function, name virtualLength. This lets NamedAttrMap::length be a non-virtual function.
+
+        * dom/Node.cpp:
+        (WebCore::Node::insertedIntoDocument): Removed call to insertedIntoTree, since it's
+        only non-empty in subclasses of ContainerNode.
+        (WebCore::Node::removedFromDocument): Ditto. Also removed setCSSTarget. Since a CSS
+        target has to be an Element, this can be moved down to ContainerNode (or it could be
+        moved down to Element for that matter).
+
+        * dom/QualifiedName.cpp:
+        (WebCore::QualifiedName::QualifiedName): Removed double initialization of m_impl.
+
+        * dom/QualifiedName.h: Moved the destructor, copy constructor, assignment operator, and
+        setPrefix function definitions into the header and made them inline.
+
+        * html/HTMLAreaElement.cpp:
+        (WebCore::HTMLAreaElement::mapMouseEvent): Updated since the stored region is now
+        an OwnPtr.
+        (WebCore::HTMLAreaElement::accessKey): Use AtomicString.
+        (WebCore::HTMLAreaElement::setAccessKey): Ditto.
+        (WebCore::HTMLAreaElement::alt): Ditto.
+        (WebCore::HTMLAreaElement::setAlt): Ditto.
+        (WebCore::HTMLAreaElement::coords): Ditto.
+        (WebCore::HTMLAreaElement::setCoords): Ditto.
+        (WebCore::HTMLAreaElement::setHref): Ditto.
+        (WebCore::HTMLAreaElement::shape): Ditto.
+        (WebCore::HTMLAreaElement::setShape): Ditto.
+        (WebCore::HTMLAreaElement::setTarget): Ditto.
+
+        * html/HTMLAreaElement.h: Use AtomicString in the getter and setter DOM operations.
+        Change the region data member to be an OwnPtr<Path> instead of a Path to optimize
+        the common case where an area element is parsed but never hit-tested. This could
+        also have been done by changing the Path class's null case to be more efficient,
+        but this seems fine.
+
+        * html/HTMLViewSourceDocument.cpp:
+        (WebCore::HTMLViewSourceDocument::createContainingTable): Use addAttribute instead
+        of insertAttribute.
+        (WebCore::HTMLViewSourceDocument::addSpanWithClassName): Ditto.
+        (WebCore::HTMLViewSourceDocument::addLine): Ditto.
+        (WebCore::HTMLViewSourceDocument::addLink): Ditto.
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::gotoAnchor): Use cssTarget under its new name instead
+        of its old name getCSSTarget.
+
+        * platform/graphics/GlyphWidthMap.cpp:
+        (WebCore::GlyphWidthMap::locatePageSlowCase): Refactored from locatePage.
+
+        * platform/graphics/GlyphWidthMap.h: Made most of this class inline.
+        Changed m_pages to use OwnPtr.
+
+        * platform/text/PlatformString.h: Remove include no longer needed since
+        StringImpl.h includes it.
+
+        * platform/text/StringImpl.cpp:
+        (WebCore::StringImpl::createStrippingNullCharactersSlowCase): Refactored
+        from createStrippingNullCharacters.
+        * platform/text/StringImpl.h: Moved the definition of
+        createStrippingNullCharacters here and made it inline.
+
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::firstLineStyleSlowCase): Refactored from
+        firstLineStyle.
+
+        * rendering/RenderObject.h: Moved the definition of the firstLineStyle
+        function here and made it inline. Moved the definition of the
+        documentBeingDestroyed function here and made it inline.
+
+        * svg/SVGSVGElement.cpp:
+        (WebCore::SVGSVGElement::getCTM): Use getAttributeItem instead of
+        getNamedItem here since it accomplishes the same thing but is more efficient.
+        (WebCore::SVGSVGElement::getScreenCTM): Ditto.
+        * svg/SVGStyledElement.cpp:
+        (WebCore::SVGStyledElement::getPresentationAttribute): Ditto.
+
+        * xml/XPathFunctions.cpp:
+        (WebCore::XPath::FunLang::evaluate): Use getAttributeItem instead of
+        getNamedItemNS.
+
+        * xml/XPathStep.cpp:
+        (WebCore::XPath::Step::nodesInAxis): Use attributeItem instead of item here.
+
 2009-02-02  Holger Hans Peter Freyther  <zecke@selfish.org>
 
         Reviewed by Darin Adler.
index 590f9b3..3216fb0 100644 (file)
@@ -933,7 +933,7 @@ bool CSSStyleSelector::canShareStyleWithElement(Node* n)
             (s->hovered() == m_element->hovered()) &&
             (s->active() == m_element->active()) &&
             (s->focused() == m_element->focused()) &&
-            (s != s->document()->getCSSTarget() && m_element != m_element->document()->getCSSTarget()) &&
+            (s != s->document()->cssTarget() && m_element != m_element->document()->cssTarget()) &&
             (s->getAttribute(typeAttr) == m_element->getAttribute(typeAttr)) &&
             (s->getAttribute(XMLNames::langAttr) == m_element->getAttribute(XMLNames::langAttr)) &&
             (s->getAttribute(langAttr) == m_element->getAttribute(langAttr)) &&
@@ -2209,7 +2209,7 @@ bool CSSStyleSelector::SelectorChecker::checkOneSelector(CSSSelector* sel, Eleme
                 break;
             }
             case CSSSelector::PseudoTarget:
-                if (e == e->document()->getCSSTarget())
+                if (e == e->document()->cssTarget())
                     return true;
                 break;
             case CSSSelector::PseudoAnyLink:
index 958fc4e..7afc18d 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -46,13 +46,6 @@ static NodeCallbackQueue* s_postAttachCallbackQueue = 0;
 
 static size_t s_attachDepth = 0;
 
-ContainerNode::ContainerNode(Document* doc, bool isElement)
-    : EventTargetNode(doc, isElement, true)
-    , m_firstChild(0)
-    , m_lastChild(0)
-{
-}
-
 void ContainerNode::removeAllChildren()
 {
     removeAllChildrenInContainer<Node, ContainerNode>(this);
@@ -594,34 +587,36 @@ void ContainerNode::detach()
 
 void ContainerNode::insertedIntoDocument()
 {
-    EventTargetNode::insertedIntoDocument();
-    for (Node *child = m_firstChild; child; child = child->nextSibling())
+    setInDocument(true);
+    insertedIntoTree(false);
+    for (Node* child = m_firstChild; child; child = child->nextSibling())
         child->insertedIntoDocument();
 }
 
 void ContainerNode::removedFromDocument()
 {
-    EventTargetNode::removedFromDocument();
-    for (Node *child = m_firstChild; child; child = child->nextSibling())
+    if (document()->cssTarget() == this)
+        document()->setCSSTarget(0);
+    setInDocument(false);
+    removedFromTree(false);
+    for (Node* child = m_firstChild; child; child = child->nextSibling())
         child->removedFromDocument();
 }
 
 void ContainerNode::insertedIntoTree(bool deep)
 {
-    EventTargetNode::insertedIntoTree(deep);
-    if (deep) {
-        for (Node *child = m_firstChild; child; child = child->nextSibling())
-            child->insertedIntoTree(deep);
-    }
+    if (!deep)
+        return;
+    for (Node* child = m_firstChild; child; child = child->nextSibling())
+        child->insertedIntoTree(true);
 }
 
 void ContainerNode::removedFromTree(bool deep)
 {
-    EventTargetNode::removedFromTree(deep);
-    if (deep) {
-        for (Node *child = m_firstChild; child; child = child->nextSibling())
-            child->removedFromTree(deep);
-    }
+    if (!deep)
+        return;
+    for (Node* child = m_firstChild; child; child = child->nextSibling())
+        child->removedFromTree(true);
 }
 
 void ContainerNode::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
index 91ca49a..cbd5b76 100644 (file)
@@ -96,7 +96,14 @@ private:
     Node* m_firstChild;
     Node* m_lastChild;
 };
-    
+
+inline ContainerNode::ContainerNode(Document* document, bool isElement)
+    : EventTargetNode(document, isElement, true)
+    , m_firstChild(0)
+    , m_lastChild(0)
+{
+}
+
 inline unsigned Node::containerChildNodeCount() const
 {
     ASSERT(isContainerNode());
index 05af696..30432b3 100644 (file)
@@ -3,7 +3,7 @@
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
  *           (C) 2006 Alexey Proskuryakov (ap@webkit.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
  * Copyright (C) 2008 David Levin (levin@chromium.org)
  *
@@ -1338,11 +1338,9 @@ void Document::removeAllEventListenersFromAllNodes()
         m_windowEventListeners[i]->setRemoved(true);
     m_windowEventListeners.clear();
     removeAllDisconnectedNodeEventListeners();
-    for (Node *n = this; n; n = n->traverseNextNode()) {
-        if (!n->isEventTargetNode())
-            continue;
-        EventTargetNodeCast(n)->removeAllEventListeners();
-    }
+    Element* documentElement = this->documentElement();
+    for (Node* node = documentElement; node; node = node->traverseNextNode(documentElement))
+        toEventTargetNode(node)->removeAllEventListeners();
 }
 
 void Document::registerDisconnectedNodeWithEventListeners(Node* node)
@@ -2557,7 +2555,7 @@ SetFocusedNodeDone:
     return !focusChangeBlocked;
   }
   
-void Document::setCSSTarget(Node* n)
+void Document::setCSSTarget(Element* n)
 {
     if (m_cssTarget)
         m_cssTarget->setChanged();
@@ -2566,11 +2564,6 @@ void Document::setCSSTarget(Node* n)
         n->setChanged();
 }
 
-Node* Document::getCSSTarget() const
-{
-    return m_cssTarget;
-}
-
 void Document::attachNodeIterator(NodeIterator *ni)
 {
     m_nodeIterators.add(ni);
index 91b049d..1e91d14 100644 (file)
@@ -3,7 +3,7 @@
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
  *           (C) 2006 Alexey Proskuryakov (ap@webkit.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
  *
  * This library is free software; you can redistribute it and/or
@@ -533,8 +533,8 @@ public:
     void activeChainNodeDetached(Node*);
 
     // Updates for :target (CSS3 selector).
-    void setCSSTarget(Node*);
-    Node* getCSSTarget() const;
+    void setCSSTarget(Element*);
+    Element* cssTarget() const { return m_cssTarget; }
     
     void setDocumentChanged(bool);
 
@@ -935,7 +935,7 @@ private:
 
     Timer<Document> m_updateFocusAppearanceTimer;
 
-    Node* m_cssTarget;
+    Element* m_cssTarget;
     
     bool m_processingLoadEvent;
     double m_startTime;
index 95b020c..ff0994e 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  *           (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
  *
  * This library is free software; you can redistribute it and/or
@@ -61,11 +61,6 @@ namespace WebCore {
     
 static HashSet<EventTargetNode*>* gNodesDispatchingSimulatedClicks = 0; 
 
-EventTargetNode::EventTargetNode(Document* doc, bool isElement, bool isContainer, bool isText)
-    : Node(doc, isElement, isContainer, isText)
-{
-}
-
 EventTargetNode::~EventTargetNode()
 {
     if (!eventListeners().isEmpty() && !inDocument())
@@ -191,10 +186,9 @@ void EventTargetNode::removeEventListener(const AtomicString& eventType, EventLi
     }
 }
 
-void EventTargetNode::removeAllEventListeners()
+void EventTargetNode::removeAllEventListenersSlowCase()
 {
-    if (!hasRareData())
-        return;
+    ASSERT(hasRareData());
 
     RegisteredEventListenerVector* listeners = rareData()->listeners();
     if (!listeners)
index 063bfbe..6991c67 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  *           (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
  *
  * This library is free software; you can redistribute it and/or
@@ -49,7 +49,7 @@ public:
     virtual void addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture);
     virtual void removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture);
     virtual bool dispatchEvent(PassRefPtr<Event>, ExceptionCode&);
-    void removeAllEventListeners();
+    void removeAllEventListeners() { if (hasRareData()) removeAllEventListenersSlowCase(); }
 
     void setInlineEventListenerForType(const AtomicString& eventType, PassRefPtr<EventListener>);
     void setInlineEventListenerForTypeAndAttribute(const AtomicString& eventType, Attribute*);
@@ -187,18 +187,40 @@ public:
 private:
     virtual void refEventTarget() { ref(); }
     virtual void derefEventTarget() { deref(); }
+
+    void removeAllEventListenersSlowCase();
 };
 
-inline EventTargetNode* EventTargetNodeCast(Node* n) 
+inline EventTargetNode::EventTargetNode(Document* document, bool isElement, bool isContainer, bool isText)
+    : Node(document, isElement, isContainer, isText)
+{
+}
+
+inline EventTargetNode* toEventTargetNode(Node* node)
+{ 
+    ASSERT(node->isEventTargetNode());
+    return static_cast<EventTargetNode*>(node);
+}
+
+inline const EventTargetNode* toEventTargetNode(const Node* node)
+{ 
+    ASSERT(node->isEventTargetNode());
+    return static_cast<const EventTargetNode*>(node); 
+}
+
+// This will catch anyone doing an unnecessary cast.
+void toEventTargetNode(const EventTargetNode*);
+
+// Deprecated name. Remove callers and switch to toEventTargetNode.
+inline EventTargetNode* EventTargetNodeCast(Node* node) 
 { 
-    ASSERT(n->isEventTargetNode());
-    return static_cast<EventTargetNode*>(n); 
+    return toEventTargetNode(node); 
 }
 
-inline const EventTargetNode* EventTargetNodeCast(const Node* n) 
+// Deprecated name. Remove callers and switch to toEventTargetNode.
+inline const EventTargetNode* EventTargetNodeCast(const Node* node)
 { 
-    ASSERT(n->isEventTargetNode());
-    return static_cast<const EventTargetNode*>(n); 
+    return toEventTargetNode(node); 
 }
 
 } // namespace WebCore
index 8944b79..33c60d3 100644 (file)
@@ -3,7 +3,7 @@
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Peter Kelly (pmk@post.com)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  *           (C) 2007 Eric Seidel (eric@webkit.org)
  *
  * This library is free software; you can redistribute it and/or
@@ -39,9 +39,18 @@ static inline bool shouldIgnoreAttributeCase(const Element* e)
     return e && e->document()->isHTMLDocument() && e->isHTMLElement();
 }
 
+inline void NamedAttrMap::detachAttributesFromElement()
+{
+    size_t size = m_attributes.size();
+    for (size_t i = 0; i < size; i++) {
+        if (Attr* attr = m_attributes[i]->attr())
+            attr->m_element = 0;
+    }
+}
+
 NamedAttrMap::~NamedAttrMap()
 {
-    NamedAttrMap::clearAttributes(); // virtual function, qualify to be explicit and slightly faster
+    detachAttributesFromElement();
 }
 
 bool NamedAttrMap::isMappedAttributeMap() const
@@ -190,11 +199,7 @@ Attribute* NamedAttrMap::getAttributeItem(const QualifiedName& name) const
 
 void NamedAttrMap::clearAttributes()
 {
-    unsigned len = length();
-    for (unsigned i = 0; i < len; i++)
-        if (Attr* attr = m_attributes[i]->attr())
-            attr->m_element = 0;
-
+    detachAttributesFromElement();
     m_attributes.clear();
 }
 
@@ -203,7 +208,7 @@ void NamedAttrMap::detachFromElement()
     // we allow a NamedAttrMap w/o an element in case someone still has a reference
     // to if after the element gets deleted - but the map is now invalid
     m_element = 0;
-    clearAttributes();
+    detachAttributesFromElement();
 }
 
 void NamedAttrMap::setAttributes(const NamedAttrMap& other)
@@ -310,4 +315,9 @@ bool NamedAttrMap::mapsEquivalent(const NamedAttrMap* otherMap) const
     return true;
 }
 
+size_t NamedAttrMap::virtualLength() const
+{
+    return length();
+}
+
 }
index 693a9e5..de634e0 100644 (file)
@@ -1,11 +1,9 @@
 /*
- * This file is part of the DOM implementation for KDE.
- *
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Peter Kelly (pmk@post.com)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc.
+ * Copyright (C) 2003, 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -29,7 +27,6 @@
 
 #include "Attribute.h"
 #include "NamedNodeMap.h"
-#include <wtf/RefPtr.h>
 #include <wtf/Vector.h>
 
 #ifdef __OBJC__
@@ -50,26 +47,10 @@ public:
 
     void setAttributes(const NamedAttrMap&);
 
-    // DOM methods & attributes for NamedNodeMap
-
-    virtual PassRefPtr<Node> getNamedItem(const String& name) const;
-    virtual PassRefPtr<Node> removeNamedItem(const String& name, ExceptionCode&);
-
-    virtual PassRefPtr<Node> getNamedItemNS(const String& namespaceURI, const String& localName) const;
-    virtual PassRefPtr<Node> removeNamedItemNS(const String& namespaceURI, const String& localName, ExceptionCode&);
-
-    virtual PassRefPtr<Node> getNamedItem(const QualifiedName& name) const;
-    virtual PassRefPtr<Node> removeNamedItem(const QualifiedName& name, ExceptionCode&);
-    virtual PassRefPtr<Node> setNamedItem(Node* arg, ExceptionCode&);
-
-    virtual PassRefPtr<Node> item(unsigned index) const;
     size_t length() const { return m_attributes.size(); }
-
-    // Other methods (not part of DOM)
     Attribute* attributeItem(unsigned index) const { return m_attributes[index].get(); }
-    Attribute* getAttributeItem(const QualifiedName& name) const;
-    Attribute* getAttributeItem(const String& name, bool shouldIgnoreAttributeCase) const;
-    
+    Attribute* getAttributeItem(const QualifiedName&) const;
+
     void shrinkToLength() { m_attributes.shrinkCapacity(length()); }
     void reserveCapacity(unsigned capacity) { m_attributes.reserveCapacity(capacity); }
 
@@ -83,20 +64,38 @@ public:
     }
 
     virtual bool isMappedAttributeMap() const;
-
-    const AtomicString& id() const { return m_id; }
-    void setID(const AtomicString& _id) { m_id = _id; }
     
+    const AtomicString& id() const { return m_id; }
+    void setID(const AtomicString& newId) { m_id = newId; }
+
     bool mapsEquivalent(const NamedAttrMap* otherMap) const;
 
-    // These functions are internal, and do no error checking.
+    // These functions do no error checking.
     void addAttribute(PassRefPtr<Attribute>);
-    void removeAttribute(const QualifiedName& name);
+    void removeAttribute(const QualifiedName&);
 
 protected:
     virtual void clearAttributes();
 
+    Element* element() const { return m_element; }
+
+private:
+    void detachAttributesFromElement();
     void detachFromElement();
+    Attribute* getAttributeItem(const String& name, bool shouldIgnoreAttributeCase) const;
+
+    virtual PassRefPtr<Node> getNamedItem(const String& name) const;
+    virtual PassRefPtr<Node> removeNamedItem(const String& name, ExceptionCode&);
+
+    virtual PassRefPtr<Node> getNamedItemNS(const String& namespaceURI, const String& localName) const;
+    virtual PassRefPtr<Node> removeNamedItemNS(const String& namespaceURI, const String& localName, ExceptionCode&);
+
+    virtual PassRefPtr<Node> getNamedItem(const QualifiedName& name) const;
+    virtual PassRefPtr<Node> removeNamedItem(const QualifiedName& name, ExceptionCode&);
+    virtual PassRefPtr<Node> setNamedItem(Node*, ExceptionCode&);
+
+    virtual PassRefPtr<Node> item(unsigned index) const;
+    virtual size_t virtualLength() const;
 
     Element* m_element;
     Vector<RefPtr<Attribute> > m_attributes;
index bc2d999..cff4997 100644 (file)
@@ -75,12 +75,12 @@ bool NamedMappedAttrMap::mapsEquivalent(const NamedMappedAttrMap* otherMap) cons
 
 void NamedMappedAttrMap::setClass(const String& classStr) 
 { 
-    if (!m_element->hasClass()) { 
+    if (!element()->hasClass()) { 
         m_classNames.clear(); 
         return;
     }
 
-    m_classNames.set(classStr, m_element->document()->inCompatMode()); 
+    m_classNames.set(classStr, element()->document()->inCompatMode()); 
 }
 
 }
index c4deddc..9267f89 100644 (file)
@@ -4,7 +4,7 @@
  *           (C) 2001 Peter Kelly (pmk@post.com)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
  *           (C) 2007 David Smith (catfish.man@gmail.com)
- * Copyright (C) 2003, 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
 #define NamedMappedAttrMap_h
 
 #include "ClassNames.h"
-#include "MappedAttribute.h"
+#include "MappedAttribute.h" // This header is not required for the NamedMappedAttrMap definition. Should remove it.
 #include "NamedAttrMap.h"
 
 namespace WebCore {
 
 class NamedMappedAttrMap : public NamedAttrMap {
-private:
-    NamedMappedAttrMap(Element* element) : NamedAttrMap(element), m_mappedAttributeCount(0) { }
 public:
     static PassRefPtr<NamedMappedAttrMap> create(Element* element = 0) { return adoptRef(new NamedMappedAttrMap(element)); }
 
-    virtual void clearAttributes();
-    virtual bool isMappedAttributeMap() const;
-
     void clearClass() { m_classNames.clear(); }
     void setClass(const String&);
     const ClassNames& classNames() const { return m_classNames; }
 
-    virtual bool hasMappedAttributes() const { return m_mappedAttributeCount > 0; }
+    bool hasMappedAttributes() const { return m_mappedAttributeCount > 0; }
     void declRemoved() { m_mappedAttributeCount--; }
     void declAdded() { m_mappedAttributeCount++; }
-    
+
     bool mapsEquivalent(const NamedMappedAttrMap*) const;
-    int declCount() const;
 
 private:
+    NamedMappedAttrMap(Element* element) : NamedAttrMap(element), m_mappedAttributeCount(0) { }
+
+    virtual void clearAttributes();
+    virtual bool isMappedAttributeMap() const;
+
+    int declCount() const;
+
     ClassNames m_classNames;
     int m_mappedAttributeCount;
 };
index 504af69..08e6efb 100644 (file)
@@ -56,7 +56,10 @@ public:
     virtual PassRefPtr<Node> setNamedItem(Node*, ExceptionCode&) = 0;
 
     virtual PassRefPtr<Node> item(unsigned index) const = 0;
-    virtual size_t length() const = 0;
+    size_t length() const { return virtualLength(); }
+
+private:
+    virtual size_t virtualLength() const = 0;
 };
 
 } //namespace
index 7791cf9..28a043a 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
  *
  * This library is free software; you can redistribute it and/or
@@ -1078,17 +1078,16 @@ void Node::detach()
 
 void Node::insertedIntoDocument()
 {
+    // Note: ContainerNode::insertedIntoDocument does not call through here, so if you
+    // change this function, change that one as well.
     setInDocument(true);
-    insertedIntoTree(false);
 }
 
 void Node::removedFromDocument()
 {
-    if (m_document && m_document->getCSSTarget() == this)
-        m_document->setCSSTarget(0);
-
+    // Note: ContainerNode::insertedIntoDocument does not call through here, so if you
+    // change this function, change that one as well.
     setInDocument(false);
-    removedFromTree(false);
 }
 
 Node *Node::previousEditable() const
index f40f398..5953b97 100644 (file)
@@ -1,7 +1,5 @@
-/**
- * This file is part of the DOM implementation for KDE.
- *
- * Copyright (C) 2005, 2006 Apple Computer, Inc.
+/*
+ * Copyright (C) 2005, 2006, 2009 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -54,7 +52,6 @@ struct QNameComponentsTranslator {
 static QNameSet* gNameCache;
 
 QualifiedName::QualifiedName(const AtomicString& p, const AtomicString& l, const AtomicString& n)
-    : m_impl(0)
 {
     if (!gNameCache)
         gNameCache = new QNameSet;
@@ -65,28 +62,6 @@ QualifiedName::QualifiedName(const AtomicString& p, const AtomicString& l, const
         m_impl->ref();
 }
 
-QualifiedName::~QualifiedName()
-{
-    deref();
-}
-
-QualifiedName::QualifiedName(const QualifiedName& other)
-{
-    m_impl = other.m_impl;
-    ref();
-}
-
-const QualifiedName& QualifiedName::operator=(const QualifiedName& other)
-{
-    if (m_impl != other.m_impl) {
-        deref();
-        m_impl = other.m_impl;
-        ref();
-    }
-    
-    return *this;
-}
-
 void QualifiedName::deref()
 {
 #ifdef QNAME_DEFAULT_CONSTRUCTOR
@@ -99,12 +74,6 @@ void QualifiedName::deref()
     m_impl->deref();
 }
 
-void QualifiedName::setPrefix(const AtomicString& prefix)
-{
-    QualifiedName other(prefix, localName(), namespaceURI());
-    *this = other;
-}
-
 String QualifiedName::toString() const
 {
     String local = localName();
index d09cdea..b5e6f96 100644 (file)
@@ -1,7 +1,5 @@
 /*
- * This file is part of the DOM implementation for KDE.
- *
- * Copyright (C) 2005 Apple Computer, Inc.
+ * Copyright (C) 2005, 2006, 2009 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -19,6 +17,7 @@
  * Boston, MA 02110-1301, USA.
  *
  */
+
 #ifndef QualifiedName_h
 #define QualifiedName_h
 
@@ -26,7 +25,7 @@
 #include <wtf/HashFunctions.h>
 
 namespace WebCore {
-    
+
 struct QualifiedNameComponents {
     StringImpl* m_prefix;
     StringImpl* m_localName;
@@ -37,32 +36,32 @@ class QualifiedName {
 public:
     class QualifiedNameImpl : public RefCounted<QualifiedNameImpl> {
     public:
-        static PassRefPtr<QualifiedNameImpl> create(const AtomicString& p, const AtomicString& l, const AtomicString& n)
+        static PassRefPtr<QualifiedNameImpl> create(const AtomicString& prefix, const AtomicString& localName, const AtomicString& namespaceURI)
         {
-            return adoptRef(new QualifiedNameImpl(p, l, n));
+            return adoptRef(new QualifiedNameImpl(prefix, localName, namespaceURI));
         }
-        
+
         AtomicString m_prefix;
         AtomicString m_localName;
         AtomicString m_namespace;
 
     private:
-        QualifiedNameImpl(const AtomicString& p, const AtomicString& l, const AtomicString& n)
-            : m_prefix(p)
-            , m_localName(l)
-            , m_namespace(n)
+        QualifiedNameImpl(const AtomicString& prefix, const AtomicString& localName, const AtomicString& namespaceURI)
+            : m_prefix(prefix)
+            , m_localName(localName)
+            , m_namespace(namespaceURI)
         {
         }        
     };
 
     QualifiedName(const AtomicString& prefix, const AtomicString& localName, const AtomicString& namespaceURI);
-    ~QualifiedName();
+    ~QualifiedName() { deref(); }
 #ifdef QNAME_DEFAULT_CONSTRUCTOR
     QualifiedName() : m_impl(0) { }
 #endif
 
-    QualifiedName(const QualifiedName&);
-    const QualifiedName& operator=(const QualifiedName&);
+    QualifiedName(const QualifiedName& other) : m_impl(other.m_impl) { ref(); }
+    const QualifiedName& operator=(const QualifiedName& other) { other.ref(); deref(); m_impl = other.m_impl; return *this; }
 
     bool operator==(const QualifiedName& other) const { return m_impl == other.m_impl; }
     bool operator!=(const QualifiedName& other) const { return !(*this == other); }
@@ -70,7 +69,7 @@ public:
     bool matches(const QualifiedName& other) const { return m_impl == other.m_impl || (localName() == other.localName() && namespaceURI() == other.namespaceURI()); }
 
     bool hasPrefix() const { return m_impl->m_prefix != nullAtom; }
-    void setPrefix(const AtomicString& prefix);
+    void setPrefix(const AtomicString& prefix) { *this = QualifiedName(prefix, localName(), namespaceURI()); }
 
     const AtomicString& prefix() const { return m_impl->m_prefix; }
     const AtomicString& localName() const { return m_impl->m_localName; }
@@ -84,7 +83,7 @@ public:
     static void init();
     
 private:
-    void ref() { m_impl->ref(); }
+    void ref() const { m_impl->ref(); }
     void deref();
     
     QualifiedNameImpl* m_impl;
@@ -100,7 +99,6 @@ inline bool operator!=(const AtomicString& a, const QualifiedName& q) { return a
 inline bool operator==(const QualifiedName& q, const AtomicString& a) { return a == q.localName(); }
 inline bool operator!=(const QualifiedName& q, const AtomicString& a) { return a != q.localName(); }
 
-
 inline unsigned hashComponents(const QualifiedNameComponents& buf)
 {
     ASSERT(sizeof(QualifiedNameComponents) % (sizeof(uint16_t) * 2) == 0);
@@ -154,6 +152,7 @@ struct QualifiedNameHash {
 namespace WTF {
     
     template<typename T> struct DefaultHash;
+
     template<> struct DefaultHash<WebCore::QualifiedName> {
         typedef WebCore::QualifiedNameHash Hash;
     };
index 7a3c9e0..bd09547 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
- * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
+ * Copyright (C) 2004, 2005, 2006, 2009 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -35,8 +35,8 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-HTMLAreaElement::HTMLAreaElement(const QualifiedName& tagName, Document *doc)
-    : HTMLAnchorElement(tagName, doc)
+HTMLAreaElement::HTMLAreaElement(const QualifiedName& tagName, Document* document)
+    : HTMLAnchorElement(tagName, document)
     , m_coords(0)
     , m_coordsLen(0)
     , m_lastSize(-1, -1)
@@ -73,11 +73,11 @@ void HTMLAreaElement::parseMappedAttribute(MappedAttribute *attr)
 bool HTMLAreaElement::mapMouseEvent(int x, int y, const IntSize& size, HitTestResult& result)
 {
     if (m_lastSize != size) {
-        region = getRegion(size);
+        m_region.set(new Path(getRegion(size)));
         m_lastSize = size;
     }
 
-    if (!region.contains(IntPoint(x, y)))
+    if (!m_region->contains(IntPoint(x, y)))
         return false;
     
     result.setInnerNode(this);
@@ -150,32 +150,32 @@ Path HTMLAreaElement::getRegion(const IntSize& size) const
     return path;
 }
 
-String HTMLAreaElement::accessKey() const
+const AtomicString& HTMLAreaElement::accessKey() const
 {
     return getAttribute(accesskeyAttr);
 }
 
-void HTMLAreaElement::setAccessKey(const String& value)
+void HTMLAreaElement::setAccessKey(const AtomicString& value)
 {
     setAttribute(accesskeyAttr, value);
 }
 
-String HTMLAreaElement::alt() const
+const AtomicString& HTMLAreaElement::alt() const
 {
     return getAttribute(altAttr);
 }
 
-void HTMLAreaElement::setAlt(const String& value)
+void HTMLAreaElement::setAlt(const AtomicString& value)
 {
     setAttribute(altAttr, value);
 }
 
-String HTMLAreaElement::coords() const
+const AtomicString& HTMLAreaElement::coords() const
 {
     return getAttribute(coordsAttr);
 }
 
-void HTMLAreaElement::setCoords(const String& value)
+void HTMLAreaElement::setCoords(const AtomicString& value)
 {
     setAttribute(coordsAttr, value);
 }
@@ -185,7 +185,7 @@ KURL HTMLAreaElement::href() const
     return document()->completeURL(getAttribute(hrefAttr));
 }
 
-void HTMLAreaElement::setHref(const String& value)
+void HTMLAreaElement::setHref(const AtomicString& value)
 {
     setAttribute(hrefAttr, value);
 }
@@ -200,12 +200,12 @@ void HTMLAreaElement::setNoHref(bool noHref)
     setAttribute(nohrefAttr, noHref ? "" : 0);
 }
 
-String HTMLAreaElement::shape() const
+const AtomicString& HTMLAreaElement::shape() const
 {
     return getAttribute(shapeAttr);
 }
 
-void HTMLAreaElement::setShape(const String& value)
+void HTMLAreaElement::setShape(const AtomicString& value)
 {
     setAttribute(shapeAttr, value);
 }
@@ -220,7 +220,7 @@ String HTMLAreaElement::target() const
     return getAttribute(targetAttr);
 }
 
-void HTMLAreaElement::setTarget(const String& value)
+void HTMLAreaElement::setTarget(const AtomicString& value)
 {
     setAttribute(targetAttr, value);
 }
index 7de5832..19533b1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
- * Copyright (C) 2004, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2008, 2009 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
 
 #include "HTMLAnchorElement.h"
 #include "IntSize.h"
-#include "Path.h"
 
 namespace WebCore {
 
 class HitTestResult;
+class Path;
 
 class HTMLAreaElement : public HTMLAnchorElement {
 public:
@@ -47,33 +47,34 @@ public:
 
     virtual IntRect getRect(RenderObject*) const;
 
-    String accessKey() const;
-    void setAccessKey(const String&);
+    const AtomicString& accessKey() const;
+    void setAccessKey(const AtomicString&);
 
-    String alt() const;
-    void setAlt(const String&);
+    const AtomicString& alt() const;
+    void setAlt(const AtomicString&);
 
-    String coords() const;
-    void setCoords(const String&);
+    const AtomicString& coords() const;
+    void setCoords(const AtomicString&);
 
     KURL href() const;
-    void setHref(const String&);
+    void setHref(const AtomicString&);
 
     bool noHref() const;
     void setNoHref(bool);
 
-    String shape() const;
-    void setShape(const String&);
+    const AtomicString& shape() const;
+    void setShape(const AtomicString&);
 
     virtual bool isFocusable() const;
 
     virtual String target() const;
-    void setTarget(const String&);
+    void setTarget(const AtomicString&);
 
 private:
     enum Shape { Default, Poly, Rect, Circle, Unknown };
     Path getRegion(const IntSize&) const;
-    Path region;
+
+    OwnPtr<Path> m_region;
     Length* m_coords;
     int m_coordsLen;
     IntSize m_lastSize;
index 163ee72..596f16e 100644 (file)
@@ -73,7 +73,7 @@ void HTMLViewSourceDocument::createContainingTable()
     // document.
     RefPtr<Element> div = new HTMLDivElement(divTag, this);
     RefPtr<NamedMappedAttrMap> attrs = NamedMappedAttrMap::create();
-    attrs->insertAttribute(MappedAttribute::create(classAttr, "webkit-line-gutter-backdrop"), true);
+    attrs->addAttribute(MappedAttribute::create(classAttr, "webkit-line-gutter-backdrop"));
     div->setAttributeMap(attrs.release());
     body->addChild(div);
     div->attach();
@@ -195,7 +195,7 @@ Element* HTMLViewSourceDocument::addSpanWithClassName(const String& className)
 
     Element* span = new HTMLElement(spanTag, this);
     RefPtr<NamedMappedAttrMap> attrs = NamedMappedAttrMap::create();
-    attrs->insertAttribute(MappedAttribute::create(classAttr, className), true);
+    attrs->addAttribute(MappedAttribute::create(classAttr, className));
     span->setAttributeMap(attrs.release());
     m_current->addChild(span);
     span->attach();
@@ -212,7 +212,7 @@ void HTMLViewSourceDocument::addLine(const String& className)
     // Create a cell that will hold the line number (it is generated in the stylesheet using counters).
     Element* td = new HTMLTableCellElement(tdTag, this);
     RefPtr<NamedMappedAttrMap> attrs = NamedMappedAttrMap::create();
-    attrs->insertAttribute(MappedAttribute::create(classAttr, "webkit-line-number"), true);
+    attrs->addAttribute(MappedAttribute::create(classAttr, "webkit-line-number"));
     td->setAttributeMap(attrs.release());
     trow->addChild(td);
     td->attach();
@@ -220,7 +220,7 @@ void HTMLViewSourceDocument::addLine(const String& className)
     // Create a second cell for the line contents
     td = new HTMLTableCellElement(tdTag, this);
     attrs = NamedMappedAttrMap::create();
-    attrs->insertAttribute(MappedAttribute::create(classAttr, "webkit-line-content"), true);
+    attrs->addAttribute(MappedAttribute::create(classAttr, "webkit-line-content"));
     td->setAttributeMap(attrs.release());
     trow->addChild(td);
     td->attach();
@@ -283,9 +283,9 @@ Element* HTMLViewSourceDocument::addLink(const String& url, bool isAnchor)
         classValue = "webkit-html-attribute-value webkit-html-external-link";
     else
         classValue = "webkit-html-attribute-value webkit-html-resource-link";
-    attrs->insertAttribute(MappedAttribute::create(classAttr, classValue), true);
-    attrs->insertAttribute(MappedAttribute::create(targetAttr, "_blank"), true);
-    attrs->insertAttribute(MappedAttribute::create(hrefAttr, url), true);
+    attrs->addAttribute(MappedAttribute::create(classAttr, classValue));
+    attrs->addAttribute(MappedAttribute::create(targetAttr, "_blank"));
+    attrs->addAttribute(MappedAttribute::create(hrefAttr, url));
     anchor->setAttributeMap(attrs.release());
     m_current->addChild(anchor);
     anchor->attach();
index 4f92731..473ba56 100644 (file)
@@ -1228,7 +1228,7 @@ void FrameLoader::gotoAnchor()
     // OTOH If CSS target was set previously, we want to set it to 0, recalc
     // and possibly repaint because :target pseudo class may have been
     // set (see bug 11321).
-    if (!m_URL.hasRef() && !(m_frame->document() && m_frame->document()->getCSSTarget()))
+    if (!m_URL.hasRef() && !(m_frame->document() && m_frame->document()->cssTarget()))
         return;
 
     String ref = m_URL.ref();
index 6e8d68d..43cab65 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006, 2009 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #include "config.h"
 #include "GlyphWidthMap.h"
 
-namespace WebCore
-{
-
-float GlyphWidthMap::widthForGlyph(Glyph g)
-{
-    unsigned pageNumber = (g / GlyphWidthPage::size);
-    GlyphWidthPage* page = locatePage(pageNumber);
-    if (page)
-        return page->widthForGlyph(g);
-    return cGlyphWidthUnknown;
-}
-
-void GlyphWidthMap::setWidthForGlyph(Glyph glyph, float width)
-{
-    unsigned pageNumber = (glyph / GlyphWidthPage::size);
-    GlyphWidthPage* page = locatePage(pageNumber);
-    if (page)
-        page->setWidthForGlyph(glyph, width);
-}
+namespace WebCore {
 
-inline GlyphWidthMap::GlyphWidthPage* GlyphWidthMap::locatePage(unsigned pageNumber)
+GlyphWidthMap::GlyphWidthPage* GlyphWidthMap::locatePageSlowCase(unsigned pageNumber)
 {
     GlyphWidthPage* page;
     if (pageNumber == 0) {
-        if (m_filledPrimaryPage)
-            return &m_primaryPage;
+        ASSERT(!m_filledPrimaryPage);
         page = &m_primaryPage;
         m_filledPrimaryPage = true;
     } else {
         if (m_pages) {
-            GlyphWidthPage* result = m_pages->get(pageNumber);
-            if (result)
-                return result;
-        }
+            if ((page = m_pages->get(pageNumber)))
+                return page;
+        } else
+            m_pages.set(new HashMap<int, GlyphWidthPage*>);
         page = new GlyphWidthPage;
-        if (!m_pages)
-            m_pages = new HashMap<int, GlyphWidthPage*>;
         m_pages->set(pageNumber, page);
     }
 
index 1633769..e194ecf 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
+ * Copyright (C) 2006, 2009 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -29,9 +29,9 @@
 #ifndef GlyphWidthMap_h
 #define GlyphWidthMap_h
 
-#include <wtf/unicode/Unicode.h>
-#include <wtf/Noncopyable.h>
 #include <wtf/HashMap.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/unicode/Unicode.h>
 
 namespace WebCore {
 
@@ -41,34 +41,49 @@ const float cGlyphWidthUnknown = -1;
 
 class GlyphWidthMap : Noncopyable {
 public:
-    GlyphWidthMap() : m_filledPrimaryPage(false), m_pages(0) {}
-    ~GlyphWidthMap() { if (m_pages) { deleteAllValues(*m_pages); delete m_pages; } }
+    GlyphWidthMap() : m_filledPrimaryPage(false) { }
+    ~GlyphWidthMap() { if (m_pages) { deleteAllValues(*m_pages); } }
+
+    float widthForGlyph(Glyph glyph)
+    {
+        return locatePage(glyph / GlyphWidthPage::size)->widthForGlyph(glyph);
+    }
 
-    float widthForGlyph(Glyph);
-    void setWidthForGlyph(Glyph, float);
+    void setWidthForGlyph(Glyph glyph, float width)
+    {
+        locatePage(glyph / GlyphWidthPage::size)->setWidthForGlyph(glyph, width);
+    }
 
 private:
     struct GlyphWidthPage {
         static const size_t size = 256; // Usually covers Latin-1 in a single page.
         float m_widths[size];
 
-        float widthForGlyph(Glyph g) const { return m_widths[g % size]; }
-        void setWidthForGlyph(Glyph g, float w)
+        float widthForGlyph(Glyph glyph) const { return m_widths[glyph % size]; }
+        void setWidthForGlyph(Glyph glyph, float width)
         {
-            setWidthForIndex(g % size, w);
+            setWidthForIndex(glyph % size, width);
         }
-        void setWidthForIndex(unsigned index, float w)
+        void setWidthForIndex(unsigned index, float width)
         {
-            m_widths[index] = w;
+            m_widths[index] = width;
         }
     };
     
-    GlyphWidthPage* locatePage(unsigned page);
+    GlyphWidthPage* locatePage(unsigned pageNumber)
+    {
+        if (!pageNumber && m_filledPrimaryPage)
+            return &m_primaryPage;
+        return locatePageSlowCase(pageNumber);
+    }
+
+    GlyphWidthPage* locatePageSlowCase(unsigned pageNumber);
     
     bool m_filledPrimaryPage;
     GlyphWidthPage m_primaryPage; // We optimize for the page that contains glyph indices 0-255.
-    HashMap<int, GlyphWidthPage*>* m_pages;
+    OwnPtr<HashMap<int, GlyphWidthPage*> > m_pages;
 };
 
 }
+
 #endif
index 9d4b200..b638da7 100644 (file)
@@ -27,8 +27,6 @@
 
 #include "StringImpl.h"
 
-#include <wtf/PassRefPtr.h>
-
 #if USE(JSC)
 #include <runtime/Identifier.h>
 #else
index 0556f8e..6a43e24 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller ( mueller@kde.org )
- * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net)
  *
  * This library is free software; you can redistribute it and/or
@@ -907,26 +907,8 @@ WTF::Unicode::Direction StringImpl::defaultWritingDirection()
 }
 
 // This is a hot function because it's used when parsing HTML.
-PassRefPtr<StringImpl> StringImpl::createStrippingNullCharacters(const UChar* characters, unsigned length)
+PassRefPtr<StringImpl> StringImpl::createStrippingNullCharactersSlowCase(const UChar* characters, unsigned length)
 {
-    ASSERT(characters);
-    ASSERT(length);
-
-    // Optimize for the case where there are no Null characters by quickly
-    // searching for nulls, and then using StringImpl::create, which will
-    // memcpy the whole buffer.  This is faster than assigning character by
-    // character during the loop. 
-
-    // Fast case.
-    int foundNull = 0;
-    for (unsigned i = 0; !foundNull && i < length; i++) {
-        int c = characters[i]; // more efficient than using UChar here (at least on Intel Mac OS)
-        foundNull |= !c;
-    }
-    if (!foundNull)
-        return StringImpl::create(characters, length);
-    
-    // Slow case.
     StringBuffer strippedCopy(length);
     unsigned strippedLength = 0;
     for (unsigned i = 0; i < length; i++) {
index 281aa37..0816aac 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
- * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -24,7 +24,7 @@
 
 #include <limits.h>
 #include <wtf/ASCIICType.h>
-#include <wtf/Forward.h>
+#include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
 #include <wtf/Vector.h>
 #include <wtf/unicode/Unicode.h>
@@ -167,6 +167,8 @@ public:
 #endif
 
 private:
+    static PassRefPtr<StringImpl> createStrippingNullCharactersSlowCase(const UChar*, unsigned length);
+
     unsigned m_length;
     const UChar* m_data;
     mutable unsigned m_hash;
@@ -274,6 +276,29 @@ static inline bool isSpaceOrNewline(UChar c)
     return c <= 0x7F ? WTF::isASCIISpace(c) : WTF::Unicode::direction(c) == WTF::Unicode::WhiteSpaceNeutral;
 }
 
+// This is a hot function because it's used when parsing HTML.
+inline PassRefPtr<StringImpl> StringImpl::createStrippingNullCharacters(const UChar* characters, unsigned length)
+{
+    ASSERT(characters);
+    ASSERT(length);
+
+    // Optimize for the case where there are no Null characters by quickly
+    // searching for nulls, and then using StringImpl::create, which will
+    // memcpy the whole buffer.  This is faster than assigning character by
+    // character during the loop. 
+
+    // Fast case.
+    int foundNull = 0;
+    for (unsigned i = 0; !foundNull && i < length; i++) {
+        int c = characters[i]; // more efficient than using UChar here (at least on Intel Mac OS)
+        foundNull |= !c;
+    }
+    if (!foundNull)
+        return StringImpl::create(characters, length);
+
+    return StringImpl::createStrippingNullCharactersSlowCase(characters, length);
+}
+
 }
 
 namespace WTF {
index 2ef55ae..312d703 100644 (file)
@@ -2186,11 +2186,6 @@ void RenderObject::removeFromObjectLists()
     }
 }
 
-bool RenderObject::documentBeingDestroyed() const
-{
-    return !document()->renderer();
-}
-
 void RenderObject::destroy()
 {
     // Destroy any leftover anonymous children.
@@ -2436,27 +2431,25 @@ void RenderObject::deleteLineBoxWrapper()
 {
 }
 
-RenderStyle* RenderObject::firstLineStyle() const
+RenderStyle* RenderObject::firstLineStyleSlowCase() const
 {
-    if (!document()->usesFirstLineRules())
-        return m_style.get();
+    ASSERT(document()->usesFirstLineRules());
 
-    RenderStyle* s = m_style.get();
-    const RenderObject* obj = isText() ? parent() : this;
-    if (obj->isBlockFlow()) {
-        RenderBlock* firstLineBlock = obj->firstLineBlock();
-        if (firstLineBlock)
-            s = firstLineBlock->getCachedPseudoStyle(RenderStyle::FIRST_LINE, style());
-    } else if (!obj->isAnonymous() && obj->isRenderInline()) {
-        RenderStyle* parentStyle = obj->parent()->firstLineStyle();
-        if (parentStyle != obj->parent()->style()) {
-            // A first-line style is in effect. We need to cache a first-line style
-            // for ourselves.
-            style()->setHasPseudoStyle(RenderStyle::FIRST_LINE_INHERITED);
-            s = obj->getCachedPseudoStyle(RenderStyle::FIRST_LINE_INHERITED, parentStyle);
+    RenderStyle* style = m_style.get();
+    const RenderObject* renderer = isText() ? parent() : this;
+    if (renderer->isBlockFlow()) {
+        if (RenderBlock* firstLineBlock = renderer->firstLineBlock())
+            style = firstLineBlock->getCachedPseudoStyle(RenderStyle::FIRST_LINE, style);
+    } else if (!renderer->isAnonymous() && renderer->isRenderInline()) {
+        RenderStyle* parentStyle = renderer->parent()->firstLineStyle();
+        if (parentStyle != renderer->parent()->style()) {
+            // A first-line style is in effect. Cache a first-line style for ourselves.
+            style->setHasPseudoStyle(RenderStyle::FIRST_LINE_INHERITED);
+            style = renderer->getCachedPseudoStyle(RenderStyle::FIRST_LINE_INHERITED, parentStyle);
         }
     }
-    return s;
+
+    return style;
 }
 
 RenderStyle* RenderObject::getCachedPseudoStyle(RenderStyle::PseudoId pseudo, RenderStyle* parentStyle) const
index 915d35b..a022592 100644 (file)
@@ -559,7 +559,7 @@ public:
     virtual int maxPrefWidth() const { return 0; }
 
     RenderStyle* style() const { return m_style.get(); }
-    RenderStyle* firstLineStyle() const;
+    RenderStyle* firstLineStyle() const { return document()->usesFirstLineRules() ? firstLineStyleSlowCase() : style(); }
     RenderStyle* style(bool firstLine) const { return firstLine ? firstLineStyle() : style(); }
     
     // Anonymous blocks that are part of of a continuation chain will return their inline continuation's outline style instead.
@@ -835,6 +835,8 @@ protected:
     };
     
 private:
+    RenderStyle* firstLineStyleSlowCase() const;
+
     RefPtr<RenderStyle> m_style;
 
     Node* m_node;
@@ -898,6 +900,11 @@ private:
     static bool s_affectsParentBlock;
 };
 
+inline bool RenderObject::documentBeingDestroyed() const
+{
+    return !document()->renderer();
+}
+
 inline void RenderObject::setNeedsLayout(bool b, bool markParents)
 {
     bool alreadyNeededLayout = m_needsLayout;
index 27f11aa..915bc70 100644 (file)
@@ -387,7 +387,7 @@ TransformationMatrix SVGSVGElement::getCTM() const
     if (!isOutermostSVG())
         mat.translate(x().value(this), y().value(this));
 
-    if (attributes()->getNamedItem(SVGNames::viewBoxAttr)) {
+    if (attributes()->getAttributeItem(SVGNames::viewBoxAttr)) {
         TransformationMatrix viewBox = viewBoxToViewTransform(width().value(this), height().value(this));
         mat = viewBox * mat;
     }
@@ -414,7 +414,7 @@ TransformationMatrix SVGSVGElement::getScreenCTM() const
     TransformationMatrix mat = SVGStyledLocatableElement::getScreenCTM();
     mat.translate(rootLocation.x(), rootLocation.y());
 
-    if (attributes()->getNamedItem(SVGNames::viewBoxAttr)) {
+    if (attributes()->getAttributeItem(SVGNames::viewBoxAttr)) {
         TransformationMatrix viewBox = viewBoxToViewTransform(width().value(this), height().value(this));
         mat = viewBox * mat;
     }
index 466ce3c..76303a9 100644 (file)
@@ -240,7 +240,7 @@ PassRefPtr<RenderStyle> SVGStyledElement::resolveStyle(RenderStyle* parentStyle)
 
 PassRefPtr<CSSValue> SVGStyledElement::getPresentationAttribute(const String& name)
 {
-    Attribute* attr = mappedAttributes()->getAttributeItem(name, false);
+    Attribute* attr = mappedAttributes()->getAttributeItem(QualifiedName(nullAtom, name, nullAtom));
     if (!attr || !attr->isMappedAttribute() || !attr->style())
         return 0;
 
index 841b436..9008d7c 100644 (file)
@@ -534,30 +534,30 @@ Value FunLang::evaluate() const
 {
     String lang = arg(0)->evaluate().toString();
 
-    RefPtr<Node> langNode = 0;
+    Attribute* languageAttribute = 0;
     Node* node = evaluationContext().node.get();
     while (node) {
         NamedAttrMap* attrs = node->attributes();
         if (attrs)
-            langNode = attrs->getNamedItemNS(XMLNames::xmlNamespaceURI, "lang");
-        if (langNode)
+            languageAttribute = attrs->getAttributeItem(QualifiedName(nullAtom, XMLNames::xmlNamespaceURI, "lang"));
+        if (languageAttribute)
             break;
         node = node->parentNode();
     }
 
-    if (!langNode)
+    if (!languageAttribute)
         return false;
 
-    String langNodeValue = langNode->nodeValue();
+    String langValue = languageAttribute->value();
     while (true) {
-        if (equalIgnoringCase(langNodeValue, lang))
+        if (equalIgnoringCase(langValue, lang))
             return true;
 
         // Remove suffixes one by one.
-        int index = langNodeValue.reverseFind('-');
+        int index = langValue.reverseFind('-');
         if (index == -1)
             break;
-        langNodeValue = langNodeValue.left(index);
+        langValue = langValue.left(index);
     }
 
     return false;
index abdcba5..9e3a197 100644 (file)
@@ -192,9 +192,9 @@ void Step::nodesInAxis(Node* context, NodeSet& nodes) const
                 return;
 
             for (unsigned long i = 0; i < attrs->length(); ++i) {
-                RefPtr<Node> n = attrs->item(i);
-                if (nodeMatches(n.get()))
-                    nodes.append(n.release());
+                Attribute* attribute = attrs->attributeItem(i);
+                if (nodeMatches(attribute->attr()))
+                    nodes.append(attribute->attr());
             }
             return;
         }