Source/WebCore: Remove Node::attached()
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 29 Dec 2013 22:40:04 +0000 (22:40 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 29 Dec 2013 22:40:04 +0000 (22:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=126276

Reviewed by Sam Weinig.

Node::attached() is poorly defined. Replace it with renderer() and inRenderedDocument() tests as appropriate.

Also remove some unnecessary explicit attachRenderTree/detachRenderTree calls from the tree builders.

LayoutTests: Remove Node::attached()
https://bugs.webkit.org/show_bug.cgi?id=126276

Reviewed by Sam Weinig.

* platform/mac/fast/table/dynamic-caption-add-before-child-expected.png:
* platform/mac/fast/table/dynamic-caption-add-before-child-expected.txt:

    This test result change is a progression. Dynamic captions are now correctly in document order.

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

34 files changed:
LayoutTests/ChangeLog
LayoutTests/platform/mac/fast/table/dynamic-caption-add-before-child-expected.png
LayoutTests/platform/mac/fast/table/dynamic-caption-add-before-child-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityMenuListPopup.cpp
Source/WebCore/dom/ContainerNode.cpp
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/DocumentStyleSheetCollection.cpp
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/Node.cpp
Source/WebCore/dom/Node.h
Source/WebCore/dom/ShadowRoot.cpp
Source/WebCore/editing/AppendNodeCommand.cpp
Source/WebCore/editing/InsertNodeBeforeCommand.cpp
Source/WebCore/editing/RemoveNodeCommand.cpp
Source/WebCore/html/HTMLDetailsElement.cpp
Source/WebCore/html/HTMLPlugInImageElement.cpp
Source/WebCore/html/HTMLSelectElement.cpp
Source/WebCore/html/parser/HTMLTreeBuilder.cpp
Source/WebCore/html/shadow/MediaControlElementTypes.cpp
Source/WebCore/html/shadow/MediaControlElements.cpp
Source/WebCore/html/shadow/SliderThumbElement.cpp
Source/WebCore/loader/FrameLoader.cpp
Source/WebCore/loader/HistoryController.cpp
Source/WebCore/loader/ImageLoader.cpp
Source/WebCore/loader/PlaceholderDocument.cpp
Source/WebCore/page/Frame.cpp
Source/WebCore/rendering/RenderCounter.cpp
Source/WebCore/rendering/RenderMenuList.cpp
Source/WebCore/style/StyleResolveTree.cpp
Source/WebCore/testing/Internals.cpp
Source/WebCore/xml/XMLErrors.cpp
Source/WebCore/xml/parser/XMLDocumentParser.cpp
Source/WebCore/xml/parser/XMLDocumentParserLibxml2.cpp

index 4fa510f..de89bfa 100644 (file)
@@ -1,3 +1,15 @@
+2013-12-29  Antti Koivisto  <antti@apple.com>
+
+        Remove Node::attached()
+        https://bugs.webkit.org/show_bug.cgi?id=126276
+        
+        Reviewed by Sam Weinig.
+
+        * platform/mac/fast/table/dynamic-caption-add-before-child-expected.png:
+        * platform/mac/fast/table/dynamic-caption-add-before-child-expected.txt:
+        
+            This test result change is a progression. Dynamic captions are now correctly in document order.
+
 2013-12-27  Gavin Barraclough  <barraclough@apple.com>
 
         Merge PageVisibilityState & ViewState::IsVisible in WebKit2
index 4377365..2eba0dd 100644 (file)
Binary files a/LayoutTests/platform/mac/fast/table/dynamic-caption-add-before-child-expected.png and b/LayoutTests/platform/mac/fast/table/dynamic-caption-add-before-child-expected.png differ
index 015bfda..d61e913 100644 (file)
@@ -4,28 +4,28 @@ layer at (0,0) size 800x232
   RenderBlock {html} at (0,0) size 800x232
     RenderBody {body} at (8,8) size 784x216
       RenderTable {table} at (0,0) size 81x216
-        RenderBlock {caption} at (0,144) size 81x72
+        RenderBlock {caption} at (0,0) size 81x72
           RenderText {#text} at (19,0) size 81x72
             text run at (19,0) width 43: "PASS:"
             text run at (0,18) width 81: "Dynamically"
             text run at (21,36) width 39: "added"
             text run at (17,54) width 47: "caption"
-        RenderBlock {caption} at (0,0) size 81x36
+        RenderBlock {caption} at (0,72) size 81x36
           RenderText {#text} at (2,0) size 77x36
             text run at (2,0) width 77: "PASS: Text"
             text run at (3,18) width 75: "in caption 1"
-layer at (8,44) size 81x36
-  RenderBlock {caption} at (0,36) size 81x36
+layer at (8,116) size 81x36
+  RenderBlock {caption} at (0,108) size 81x36
     RenderText {#text} at (2,0) size 77x36
       text run at (2,0) width 77: "PASS: Text"
       text run at (3,18) width 75: "in caption 2"
-layer at (8,80) size 81x36
-  RenderBlock {caption} at (0,72) size 81x36
+layer at (8,152) size 81x36
+  RenderBlock {caption} at (0,144) size 81x36
     RenderText {#text} at (2,0) size 77x36
       text run at (2,0) width 77: "PASS: Text"
       text run at (3,18) width 75: "in caption 3"
-layer at (8,116) size 81x36
-  RenderBlock {caption} at (0,108) size 81x36
+layer at (8,188) size 81x36
+  RenderBlock {caption} at (0,180) size 81x36
     RenderText {#text} at (2,0) size 77x36
       text run at (2,0) width 77: "PASS: Text"
       text run at (3,18) width 75: "in caption 4"
index f07b5ab..48af7ec 100644 (file)
@@ -1,3 +1,14 @@
+2013-12-29  Antti Koivisto  <antti@apple.com>
+
+        Remove Node::attached()
+        https://bugs.webkit.org/show_bug.cgi?id=126276
+
+        Reviewed by Sam Weinig.
+
+        Node::attached() is poorly defined. Replace it with renderer() and inRenderedDocument() tests as appropriate.
+        
+        Also remove some unnecessary explicit attachRenderTree/detachRenderTree calls from the tree builders.
+
 2013-12-29  Andreas Kling  <akling@apple.com>
 
         RenderLayer: Store reflection renderer in a RenderPtr.
index 1ef2890..921769d 100644 (file)
@@ -70,7 +70,7 @@ bool AccessibilityMenuListPopup::computeAccessibilityIsIgnored() const
 
 AccessibilityMenuListOption* AccessibilityMenuListPopup::menuListOptionAccessibilityObject(HTMLElement* element) const
 {
-    if (!element || !isHTMLOptionElement(element) || !element->attached())
+    if (!element || !isHTMLOptionElement(element) || !element->inRenderedDocument())
         return 0;
 
     AccessibilityObject* object = document()->axObjectCache()->getOrCreate(MenuListOptionRole);
@@ -118,7 +118,7 @@ void AccessibilityMenuListPopup::childrenChanged()
     AXObjectCache* cache = axObjectCache();
     for (size_t i = m_children.size(); i > 0 ; --i) {
         AccessibilityObject* child = m_children[i - 1].get();
-        if (child->actionElement() && !child->actionElement()->attached()) {
+        if (child->actionElement() && !child->actionElement()->inRenderedDocument()) {
             child->detachFromParent();
             cache->remove(child->axObjectID());
         }
index 4257693..fc85c2c 100644 (file)
@@ -140,7 +140,7 @@ void ContainerNode::takeAllChildrenFrom(ContainerNode* oldParent)
 
     for (unsigned i = 0; i < children.size(); ++i) {
         Node& child = children[i].get();
-        if (child.attached())
+        if (child.renderer())
             detachChild(child);
 
         // FIXME: We need a no mutation event version of adoptNode.
@@ -150,7 +150,7 @@ void ContainerNode::takeAllChildrenFrom(ContainerNode* oldParent)
         // (if the document changed or oldParent was in a shadow tree, AND *this is in a shadow tree).
         // Can we do better?
         treeScope().adoptIfNeeded(adoptedChild.get());
-        if (attached() && !adoptedChild->attached())
+        if (renderer() && !adoptedChild->renderer())
             attachChild(*adoptedChild.get());
     }
 }
@@ -594,7 +594,8 @@ void ContainerNode::removeBetween(Node* previousChild, Node* nextChild, Node& ol
     ASSERT(oldChild.parentNode() == this);
 
     // Remove from rendering tree
-    if (oldChild.attached())
+    // FIXME: Get rid of the named flow test.
+    if (oldChild.renderer() || oldChild.inNamedFlow())
         detachChild(oldChild);
 
     if (nextChild)
index 7534d6c..993b3ff 100644 (file)
@@ -1953,7 +1953,7 @@ void Document::setRenderView(RenderView* renderView)
 
 void Document::createRenderTree()
 {
-    ASSERT(!attached());
+    ASSERT(!renderView());
     ASSERT(!m_inPageCache);
     ASSERT(!m_axObjectCache || this != topDocument());
 
@@ -1986,7 +1986,7 @@ void Document::didBecomeCurrentDocumentInFrame()
 
     m_frame->script().updateDocument();
 
-    if (!attached())
+    if (!hasLivingRenderTree())
         createRenderTree();
 
     updateViewportArguments();
@@ -2033,7 +2033,7 @@ void Document::disconnectFromFrame()
 
 void Document::destroyRenderTree()
 {
-    ASSERT(attached());
+    ASSERT(hasLivingRenderTree());
     ASSERT(!m_inPageCache);
 
     TemporaryChange<bool> change(m_renderTreeBeingDestroyed, true);
@@ -3210,7 +3210,7 @@ void Document::styleResolverChanged(StyleResolverUpdateFlag updateFlag)
 
     // Don't bother updating, since we haven't loaded all our style info yet
     // and haven't calculated the style selector for the first time.
-    if (!attached() || (!m_didCalculateStyleResolver && !haveStylesheetsLoaded())) {
+    if (!hasLivingRenderTree() || (!m_didCalculateStyleResolver && !haveStylesheetsLoaded())) {
         m_styleResolver.clear();
         return;
     }
@@ -5360,7 +5360,7 @@ bool Document::webkitFullscreenEnabled() const
 
 void Document::webkitWillEnterFullScreenForElement(Element* element)
 {
-    if (!attached() || inPageCache())
+    if (!hasLivingRenderTree() || inPageCache())
         return;
 
     ASSERT(element);
@@ -5405,7 +5405,7 @@ void Document::webkitDidEnterFullScreenForElement(Element*)
     if (!m_fullScreenElement)
         return;
 
-    if (!attached() || inPageCache())
+    if (!hasLivingRenderTree() || inPageCache())
         return;
 
     m_fullScreenElement->didBecomeFullscreenElement();
@@ -5418,7 +5418,7 @@ void Document::webkitWillExitFullScreenForElement(Element*)
     if (!m_fullScreenElement)
         return;
 
-    if (!attached() || inPageCache())
+    if (!hasLivingRenderTree() || inPageCache())
         return;
 
     m_fullScreenElement->willStopBeingFullscreenElement();
@@ -5429,7 +5429,7 @@ void Document::webkitDidExitFullScreenForElement(Element*)
     if (!m_fullScreenElement)
         return;
 
-    if (!attached() || inPageCache())
+    if (!hasLivingRenderTree() || inPageCache())
         return;
 
     m_fullScreenElement->setContainsFullScreenElementOnAncestorsCrossingFrameBoundaries(false);
index b0ad073..1593061 100644 (file)
@@ -447,7 +447,7 @@ bool DocumentStyleSheetCollection::updateActiveStyleSheets(UpdateFlag updateFlag
         return false;
 
     }
-    if (!m_document.renderView() || !m_document.attached())
+    if (!m_document.hasLivingRenderTree())
         return false;
 
     Vector<RefPtr<StyleSheet>> activeStyleSheets;
index c1bed0a..e543f3a 100644 (file)
@@ -1096,7 +1096,7 @@ void Element::attributeChanged(const QualifiedName& name, const AtomicString& ne
     document().incDOMTreeVersion();
 
     StyleResolver* styleResolver = document().styleResolverIfExists();
-    bool testShouldInvalidateStyle = attached() && styleResolver && styleChangeType() < FullStyleChange;
+    bool testShouldInvalidateStyle = inRenderedDocument() && styleResolver && styleChangeType() < FullStyleChange;
     bool shouldInvalidateStyle = false;
 
     if (isIdAttributeName(name)) {
@@ -1197,7 +1197,7 @@ static bool checkSelectorForClassChange(const SpaceSplitString& oldClasses, cons
 void Element::classAttributeChanged(const AtomicString& newClassString)
 {
     StyleResolver* styleResolver = document().styleResolverIfExists();
-    bool testShouldInvalidateStyle = attached() && styleResolver && styleChangeType() < FullStyleChange;
+    bool testShouldInvalidateStyle = inRenderedDocument() && styleResolver && styleChangeType() < FullStyleChange;
     bool shouldInvalidateStyle = false;
 
     if (classStringHasClassName(newClassString)) {
@@ -1496,11 +1496,7 @@ void Element::addShadowRoot(PassRefPtr<ShadowRoot> newShadowRoot)
 
     resetNeedsNodeRenderingTraversalSlowPath();
 
-    // FIXME(94905): ShadowHost should be reattached during recalcStyle.
-    // Set some flag here and recreate shadow hosts' renderer in
-    // Element::recalcStyle.
-    if (attached())
-        setNeedsStyleRecalc(ReconstructRenderTree);
+    setNeedsStyleRecalc(ReconstructRenderTree);
 
     InspectorInstrumentation::didPushShadowRoot(this, shadowRoot);
 }
@@ -1513,7 +1509,7 @@ void Element::removeShadowRoot()
     InspectorInstrumentation::willPopShadowRoot(this, oldRoot.get());
     document().removeFocusedNodeOfSubtree(oldRoot.get());
 
-    ASSERT(!oldRoot->attached());
+    ASSERT(!oldRoot->renderer());
 
     elementRareData()->clearShadowRoot();
 
@@ -1627,8 +1623,7 @@ static void checkForSiblingStyleChanges(Element* parent, SiblingCheckType checkT
         // Find the first element node following |afterChange|
 
         // This is the insert/append case.
-        if (newFirstElement != elementAfterChange && elementAfterChange->attached()
-            && elementAfterChange->renderStyle() && elementAfterChange->renderStyle()->firstChildState())
+        if (newFirstElement != elementAfterChange && elementAfterChange->renderStyle() && elementAfterChange->renderStyle()->firstChildState())
             elementAfterChange->setNeedsStyleRecalc();
             
         // We also have to handle node removal.
@@ -1642,8 +1637,7 @@ static void checkForSiblingStyleChanges(Element* parent, SiblingCheckType checkT
         // Find our new last child.
         Element* newLastElement = ElementTraversal::lastChild(parent);
 
-        if (newLastElement != elementBeforeChange && elementBeforeChange->attached()
-            && elementBeforeChange->renderStyle() && elementBeforeChange->renderStyle()->lastChildState())
+        if (newLastElement != elementBeforeChange && elementBeforeChange->renderStyle() && elementBeforeChange->renderStyle()->lastChildState())
             elementBeforeChange->setNeedsStyleRecalc();
             
         // We also have to handle node removal.  The parser callback case is similar to node removal as well in that we need to change the last child
@@ -1656,8 +1650,7 @@ static void checkForSiblingStyleChanges(Element* parent, SiblingCheckType checkT
     // The + selector.  We need to invalidate the first element following the insertion point.  It is the only possible element
     // that could be affected by this DOM change.
     if (parent->childrenAffectedByDirectAdjacentRules() && elementAfterChange) {
-        if (elementAfterChange->attached())
-            elementAfterChange->setNeedsStyleRecalc();
+        elementAfterChange->setNeedsStyleRecalc();
     }
 
     // Forward positional selectors include the ~ selector, nth-child, nth-of-type, first-of-type and only-of-type.
@@ -1697,8 +1690,7 @@ void Element::removeAllEventListeners()
 void Element::beginParsingChildren()
 {
     clearIsParsingChildrenFinished();
-    StyleResolver* styleResolver = document().styleResolverIfExists();
-    if (styleResolver && attached())
+    if (auto styleResolver = document().styleResolverIfExists())
         styleResolver->pushParentElement(this);
 }
 
@@ -1707,7 +1699,7 @@ void Element::finishParsingChildren()
     ContainerNode::finishParsingChildren();
     setIsParsingChildrenFinished();
     checkForSiblingStyleChanges(this, FinishedParsingChildren, ElementTraversal::lastChild(this), nullptr);
-    if (StyleResolver* styleResolver = document().styleResolverIfExists())
+    if (auto styleResolver = document().styleResolverIfExists())
         styleResolver->popParentElement(this);
 }
 
@@ -2354,7 +2346,7 @@ static void disconnectPseudoElement(PseudoElement* pseudoElement)
 {
     if (!pseudoElement)
         return;
-    if (pseudoElement->attached())
+    if (pseudoElement->renderer())
         Style::detachRenderTree(*pseudoElement);
     ASSERT(pseudoElement->hostElement());
     pseudoElement->clearHostElement();
@@ -2815,7 +2807,8 @@ void Element::willModifyAttribute(const QualifiedName& name, const AtomicString&
     }
 
     if (oldValue != newValue) {
-        if (attached() && document().styleResolverIfExists() && document().styleResolverIfExists()->hasSelectorForAttribute(name.localName()))
+        auto styleResolver = document().styleResolverIfExists();
+        if (styleResolver && styleResolver->hasSelectorForAttribute(name.localName()))
             setNeedsStyleRecalc();
     }
 
index d9dbc91..a26f8fc 100644 (file)
@@ -678,7 +678,7 @@ void Node::derefEventTarget()
 void Node::setNeedsStyleRecalc(StyleChangeType changeType)
 {
     ASSERT(changeType != NoStyleChange);
-    if (changeType != ReconstructRenderTree && !attached()) // changed compared to what?
+    if (!inRenderedDocument())
         return;
 
     StyleChangeType existingChangeType = styleChangeType();
@@ -2302,11 +2302,9 @@ void Node::updateAncestorConnectedSubframeCountForInsertion() const
         node->incrementConnectedSubframeCount(count);
 }
 
-bool Node::attached() const
+bool Node::inRenderedDocument() const
 {
-    // FIXME: This should go away along with the whole vague 'attached' concept. The conditions here produce
-    // roughly the old behavior based on an explicit attached bit.
-    return inDocument() && document().renderView() && (renderer() || styleChangeType() != ReconstructRenderTree);
+    return inDocument() && document().hasLivingRenderTree();
 }
 
 } // namespace WebCore
index bc8c3be..35a72f2 100644 (file)
@@ -311,7 +311,7 @@ public:
     bool isUserActionElement() const { return getFlag(IsUserActionElement); }
     void setUserActionElement(bool flag) { setFlag(flag, IsUserActionElement); }
 
-    bool attached() const;
+    bool inRenderedDocument() const;
     bool needsStyleRecalc() const { return styleChangeType() != NoStyleChange; }
     StyleChangeType styleChangeType() const { return static_cast<StyleChangeType>(m_nodeFlags & StyleChangeMask); }
     bool childNeedsStyleRecalc() const { return getFlag(ChildNeedsStyleRecalcFlag); }
index 8551d6a..db535b2 100644 (file)
@@ -30,6 +30,7 @@
 #include "ElementTraversal.h"
 #include "HistogramSupport.h"
 #include "InsertionPoint.h"
+#include "RenderElement.h"
 #include "RuntimeEnabledFeatures.h"
 #include "StyleResolver.h"
 #include "markup.h"
@@ -139,7 +140,7 @@ void ShadowRoot::setResetStyleInheritance(bool value)
 
     if (value != m_resetStyleInheritance) {
         m_resetStyleInheritance = value;
-        if (attached() && hostElement())
+        if (renderer() && hostElement())
             Style::resolveTree(*hostElement(), Style::Force);
     }
 }
index 15a5233..25c596a 100644 (file)
@@ -29,6 +29,7 @@
 #include "AXObjectCache.h"
 #include "Document.h"
 #include "ExceptionCodePlaceholder.h"
+#include "RenderElement.h"
 #include "htmlediting.h"
 
 namespace WebCore {
@@ -42,7 +43,7 @@ AppendNodeCommand::AppendNodeCommand(PassRefPtr<ContainerNode> parent, PassRefPt
     ASSERT(m_node);
     ASSERT(!m_node->parentNode());
 
-    ASSERT(m_parent->hasEditableStyle() || !m_parent->attached());
+    ASSERT(m_parent->hasEditableStyle() || !m_parent->renderer());
 }
 
 static void sendAXTextChangedIgnoringLineBreaks(Node* node, AXObjectCache::AXTextChange textChange)
@@ -58,7 +59,7 @@ static void sendAXTextChangedIgnoringLineBreaks(Node* node, AXObjectCache::AXTex
 
 void AppendNodeCommand::doApply()
 {
-    if (!m_parent->hasEditableStyle() && m_parent->attached())
+    if (!m_parent->hasEditableStyle() && m_parent->renderer())
         return;
 
     m_parent->appendChild(m_node.get(), IGNORE_EXCEPTION);
index 76c63a5..7ac54e8 100644 (file)
@@ -45,7 +45,7 @@ InsertNodeBeforeCommand::InsertNodeBeforeCommand(PassRefPtr<Node> insertChild, P
     ASSERT(m_refChild);
     ASSERT(m_refChild->parentNode());
 
-    ASSERT(m_refChild->parentNode()->hasEditableStyle() || !m_refChild->parentNode()->attached());
+    ASSERT(m_refChild->parentNode()->hasEditableStyle() || !m_refChild->parentNode()->renderer());
 }
 
 void InsertNodeBeforeCommand::doApply()
index 0b330aa..67d9c56 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "ExceptionCodePlaceholder.h"
 #include "Node.h"
+#include "RenderElement.h"
 #include <wtf/Assertions.h>
 
 namespace WebCore {
@@ -45,9 +46,9 @@ void RemoveNodeCommand::doApply()
 {
     ContainerNode* parent = m_node->parentNode();
     if (!parent || (m_shouldAssumeContentIsAlwaysEditable == DoNotAssumeContentIsAlwaysEditable
-        && !parent->isContentEditable(Node::UserSelectAllIsAlwaysNonEditable) && parent->attached()))
+        && !parent->isContentEditable(Node::UserSelectAllIsAlwaysNonEditable) && parent->renderer()))
         return;
-    ASSERT(parent->isContentEditable(Node::UserSelectAllIsAlwaysNonEditable) || !parent->attached());
+    ASSERT(parent->isContentEditable(Node::UserSelectAllIsAlwaysNonEditable) || !parent->renderer());
 
     m_parent = parent;
     m_refChild = m_node->nextSibling();
index ea38790..8a27237 100644 (file)
@@ -136,7 +136,7 @@ void HTMLDetailsElement::parseAttribute(const QualifiedName& name, const AtomicS
     if (name == openAttr) {
         bool oldValue = m_isOpen;
         m_isOpen = !value.isNull();
-        if (oldValue != m_isOpen && attached())
+        if (oldValue != m_isOpen && renderer())
             Style::reattachRenderTree(*this);
     } else
         HTMLElement::parseAttribute(name, value);
index d17af11..54114be 100644 (file)
@@ -262,7 +262,7 @@ void HTMLPlugInImageElement::willDetachRenderers()
     // FIXME: Because of the insanity that is HTMLPlugInImageElement::willRecalcStyle,
     // we can end up detaching during an attach() call, before we even have a
     // renderer.  In that case, don't mark the widget for update.
-    if (attached() && renderer() && !useFallbackContent()) {
+    if (renderer() && !useFallbackContent()) {
         // Update the widget the next time we attach (detaching destroys the plugin).
         setNeedsWidgetUpdate(true);
     }
index 55068af..01c2c40 100644 (file)
@@ -315,7 +315,7 @@ void HTMLSelectElement::parseAttribute(const QualifiedName& name, const AtomicSt
 
         m_size = size;
         setNeedsValidityCheck();
-        if (m_size != oldSize && attached()) {
+        if (m_size != oldSize && renderer()) {
             Style::reattachRenderTree(*this);
             setRecalcListItems();
         }
@@ -1046,7 +1046,7 @@ void HTMLSelectElement::parseMultipleAttribute(const AtomicString& value)
     bool oldUsesMenuList = usesMenuList();
     m_multiple = !value.isNull();
     setNeedsValidityCheck();
-    if (oldUsesMenuList != usesMenuList() && attached())
+    if (oldUsesMenuList != usesMenuList() && renderer())
         Style::reattachRenderTree(*this);
 }
 
index 2f3040c..4139d36 100644 (file)
@@ -1633,12 +1633,6 @@ void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken* token)
         //        be in HTMLConstructionSite. My guess is that steps 11--15
         //        should all be in some HTMLConstructionSite function.
         furthestBlockElement->parserAppendChild(newItem->element());
-        // FIXME: Why is this attach logic necessary? Style resolve should attach us if needed.
-        if (furthestBlockElement->attached() && !newItem->element()->attached()) {
-            // Notice that newItem->element() might already be attached if, for example, one of the reparented
-            // children is a style element, which attaches itself automatically.
-            Style::attachRenderTree(*newItem->element());
-        }
         // 14.
         m_tree.activeFormattingElements()->swapTo(formattingElement, newItem, bookmark);
         // 15.
index b939d8c..5912ec3 100644 (file)
@@ -258,7 +258,7 @@ void MediaControlVolumeSliderElement::defaultEventHandler(Event* event)
     if (event->isMouseEvent() && static_cast<MouseEvent*>(event)->button())
         return;
 
-    if (!attached())
+    if (!renderer())
         return;
 
     MediaControlInputElement::defaultEventHandler(event);
@@ -276,7 +276,7 @@ void MediaControlVolumeSliderElement::defaultEventHandler(Event* event)
 
 bool MediaControlVolumeSliderElement::willRespondToMouseMoveEvents()
 {
-    if (!attached())
+    if (!renderer())
         return false;
 
     return MediaControlInputElement::willRespondToMouseMoveEvents();
@@ -284,7 +284,7 @@ bool MediaControlVolumeSliderElement::willRespondToMouseMoveEvents()
 
 bool MediaControlVolumeSliderElement::willRespondToMouseClickEvents()
 {
-    if (!attached())
+    if (!renderer())
         return false;
 
     return MediaControlInputElement::willRespondToMouseClickEvents();
index 7c87d1f..297b110 100644 (file)
@@ -942,7 +942,7 @@ void MediaControlTimelineElement::defaultEventHandler(Event* event)
     if (event->isMouseEvent() && static_cast<MouseEvent*>(event)->button())
         return;
 
-    if (!attached())
+    if (!renderer())
         return;
 
     if (event->type() == eventNames().mousedownEvent)
@@ -968,7 +968,7 @@ void MediaControlTimelineElement::defaultEventHandler(Event* event)
 #if !PLATFORM(IOS)
 bool MediaControlTimelineElement::willRespondToMouseClickEvents()
 {
-    if (!attached())
+    if (!renderer())
         return false;
 
     return true;
index aeb5fac..c960cfa 100644 (file)
@@ -519,7 +519,7 @@ void SliderThumbElement::handleTouchEvent(TouchEvent* touchEvent)
 
 bool SliderThumbElement::shouldAcceptTouchEvents()
 {
-    return attached() && !isDisabledFormControl();
+    return renderer() && !isDisabledFormControl();
 }
 
 void SliderThumbElement::registerForTouchEvents()
index d9c6612..64668aa 100644 (file)
@@ -617,7 +617,7 @@ void FrameLoader::clear(Document* newDocument, bool clearWindowProperties, bool
     if (!m_frame.document()->inPageCache()) {
         m_frame.document()->cancelParsing();
         m_frame.document()->stopActiveDOMObjects();
-        if (m_frame.document()->attached()) {
+        if (m_frame.document()->hasLivingRenderTree()) {
             m_frame.document()->prepareForDestruction();
             m_frame.document()->removeFocusedNodeOfSubtree(m_frame.document());
         }
index ebc1182..fe6e3d4 100644 (file)
@@ -181,7 +181,7 @@ void HistoryController::saveDocumentState()
     Document* document = m_frame.document();
     ASSERT(document);
     
-    if (item->isCurrentDocument(document) && document->attached()) {
+    if (item->isCurrentDocument(document) && document->hasLivingRenderTree()) {
         LOG(Loading, "WebCoreLoading %s: saving form state to %p", m_frame.tree().uniqueName().string().utf8().data(), item);
         item->setDocumentState(document->formElementsState());
     }
index b53b88a..85f6b22 100644 (file)
@@ -401,7 +401,7 @@ void ImageLoader::dispatchPendingBeforeLoadEvent()
         return;
     if (!m_image)
         return;
-    if (!m_element->document().attached())
+    if (!m_element->document().hasLivingRenderTree())
         return;
     m_hasPendingBeforeLoadEvent = false;
     if (m_element->dispatchBeforeLoadEvent(m_image->url())) {
@@ -431,7 +431,7 @@ void ImageLoader::dispatchPendingLoadEvent()
     if (!m_image)
         return;
     m_hasPendingLoadEvent = false;
-    if (element()->document().attached())
+    if (m_element->document().hasLivingRenderTree())
         dispatchLoadEvent();
 
     // Only consider updating the protection ref-count of the Element immediately before returning
@@ -444,8 +444,8 @@ void ImageLoader::dispatchPendingErrorEvent()
     if (!m_hasPendingErrorEvent)
         return;
     m_hasPendingErrorEvent = false;
-    if (element()->document().attached())
-        element()->dispatchEvent(Event::create(eventNames().errorEvent, false, false));
+    if (m_element->document().hasLivingRenderTree())
+        m_element->dispatchEvent(Event::create(eventNames().errorEvent, false, false));
 
     // Only consider updating the protection ref-count of the Element immediately before returning
     // from this function as doing so might result in the destruction of this ImageLoader.
index f236f14..401905e 100644 (file)
@@ -32,7 +32,7 @@ namespace WebCore {
 
 void PlaceholderDocument::createRenderTree()
 {
-    ASSERT(!attached());
+    ASSERT(!renderView());
 
     for (auto& child : elementChildren(*this))
         Style::attachRenderTree(child);
index d8440ea..0bdfbd5 100644 (file)
@@ -271,7 +271,7 @@ void Frame::setView(PassRefPtr<FrameView> view)
     // Prepare for destruction now, so any unload event handlers get run and the DOMWindow is
     // notified. If we wait until the view is destroyed, then things won't be hooked up enough for
     // these calls to work.
-    if (!view && m_doc && m_doc->attached() && !m_doc->inPageCache())
+    if (!view && m_doc && m_doc->hasLivingRenderTree() && !m_doc->inPageCache())
         m_doc->prepareForDestruction();
     
     if (m_view)
@@ -296,7 +296,7 @@ void Frame::setDocument(PassRefPtr<Document> newDocument)
 {
     ASSERT(!newDocument || newDocument->frame() == this);
 
-    if (m_doc && m_doc->attached() && !m_doc->inPageCache())
+    if (m_doc && m_doc->hasLivingRenderTree() && !m_doc->inPageCache())
         m_doc->prepareForDestruction();
 
     m_doc = newDocument.get();
index de99359..5faaf19 100644 (file)
@@ -560,7 +560,7 @@ void RenderCounter::rendererSubtreeAttached(RenderObject* renderer)
         node = node->parentNode();
     else
         node = renderer->generatingNode();
-    if (node && !node->attached())
+    if (node && !node->renderer())
         return; // No need to update if the parent is not attached yet
     for (RenderObject* descendant = renderer; descendant; descendant = descendant->nextInPreOrder(renderer))
         updateCounters(descendant);
@@ -569,7 +569,7 @@ void RenderCounter::rendererSubtreeAttached(RenderObject* renderer)
 void RenderCounter::rendererStyleChanged(RenderObject* renderer, const RenderStyle* oldStyle, const RenderStyle* newStyle)
 {
     Node* node = renderer->generatingNode();
-    if (!node || !node->attached())
+    if (!node || !node->renderer())
         return; // cannot have generated content or if it can have, it will be handled during attaching
     const CounterDirectiveMap* newCounterDirectives;
     const CounterDirectiveMap* oldCounterDirectives;
index 6fd56cb..9b34350 100644 (file)
@@ -436,7 +436,7 @@ void RenderMenuList::didUpdateActiveOption(int optionIndex)
 
     HTMLElement* listItem = selectElement().listItems()[listIndex];
     ASSERT(listItem);
-    if (listItem->attached()) {
+    if (listItem->renderer()) {
         if (AccessibilityMenuList* menuList = toAccessibilityMenuList(document().axObjectCache()->get(this)))
             menuList->didUpdateActiveOption(optionIndex);
     }
index 8cd48ad..a13cf61 100644 (file)
@@ -135,14 +135,14 @@ static RenderObject* nextSiblingRenderer(const Element& element, const Container
     // Avoid an O(N^2) problem with this function by not checking for
     // nextRenderer() when the parent element hasn't attached yet.
     // FIXME: Why would we get here anyway if parent is not attached?
-    if (renderingParentNode && !renderingParentNode->attached())
-        return 0;
+    if (renderingParentNode && !renderingParentNode->renderer())
+        return nullptr;
     for (Node* sibling = NodeRenderingTraversal::nextSibling(&element); sibling; sibling = NodeRenderingTraversal::nextSibling(sibling)) {
         RenderObject* renderer = sibling->renderer();
         if (renderer && !isRendererReparented(renderer))
             return renderer;
     }
-    return 0;
+    return nullptr;
 }
 
 static bool shouldCreateRenderer(const Element& element, const ContainerNode* renderingParent)
@@ -302,7 +302,7 @@ static void reattachTextRenderersForWhitespaceOnlySiblingsAfterAttachIfNeeded(No
     // the current node gaining or losing the renderer. This can only affect white space text nodes.
     for (Node* sibling = NodeRenderingTraversal::nextSibling(&current); sibling; sibling = NodeRenderingTraversal::nextSibling(sibling)) {
         // Siblings haven't been attached yet. They will be handled normally when they are.
-        if (!sibling->attached())
+        if (sibling->styleChangeType() == ReconstructRenderTree)
             return;
         if (sibling->isElementNode()) {
             // Text renderers beyond rendered elements can't be affected.
@@ -416,8 +416,6 @@ void detachTextRenderer(Text& textNode)
 
 void updateTextRendererAfterContentChange(Text& textNode, unsigned offsetOfReplacedData, unsigned lengthOfReplacedData)
 {
-    if (!textNode.attached())
-        return;
     RenderText* textRenderer = textNode.renderer();
     if (!textRenderer) {
         attachTextRenderer(textNode);
@@ -896,7 +894,7 @@ void detachRenderTreeInReattachMode(Element& element)
 
 void reattachRenderTree(Element& current)
 {
-    if (current.attached())
+    if (current.renderer())
         detachRenderTree(current, ReattachDetach);
     attachRenderTree(current);
 }
index a796e8f..5f1d277 100644 (file)
@@ -1924,6 +1924,7 @@ void Internals::removeURLSchemeRegisteredAsBypassingContentSecurityPolicy(const
 
 PassRefPtr<MallocStatistics> Internals::mallocStatistics() const
 {
+//    WTF::releaseFastMallocFreeMemory();
     return MallocStatistics::create();
 }
 
index 8a701b5..5dae417 100644 (file)
@@ -127,8 +127,6 @@ void XMLErrors::insertErrorMessageBlock()
         RefPtr<Element> body = m_document->createElement(bodyTag, true);
         rootElement->parserAppendChild(body);
         m_document->parserAppendChild(rootElement);
-        if (m_document->attached() && !rootElement->attached())
-            Style::attachRenderTree(*rootElement);
         documentElement = body.get();
     }
 #if ENABLE(SVG)
@@ -138,13 +136,11 @@ void XMLErrors::insertErrorMessageBlock()
         rootElement->parserAppendChild(body);
 
         documentElement->parentNode()->parserRemoveChild(*documentElement);
-        if (documentElement->attached())
-            Style::detachRenderTree(*documentElement);
 
         body->parserAppendChild(documentElement);
         m_document->parserAppendChild(rootElement.get());
 
-        if (m_document->attached())
+        if (m_document->hasLivingRenderTree())
             // In general, rootElement shouldn't be attached right now, but it will be if there is a style element
             // in the SVG content.
             Style::reattachRenderTree(*rootElement);
@@ -173,9 +169,6 @@ void XMLErrors::insertErrorMessageBlock()
     else
         documentElement->parserAppendChild(reportElement);
 
-    if (documentElement->attached() && !reportElement->attached())
-        Style::attachRenderTree(*reportElement);
-
     m_document->updateStyleIfNeeded();
 }
 
index 90efd54..fdd45f9 100644 (file)
@@ -166,7 +166,7 @@ void XMLDocumentParser::exitText()
     Vector<xmlChar> empty;
     m_bufferedText.swap(empty);
 
-    if (m_view && m_leafTextNode->parentNode() && m_leafTextNode->parentNode()->attached() && !m_leafTextNode->attached())
+    if (m_view && m_leafTextNode->parentNode() && m_leafTextNode->parentNode()->renderer() && !m_leafTextNode->renderer())
         Style::attachTextRenderer(*m_leafTextNode);
 
     m_leafTextNode = 0;
index 95d77b9..749cea0 100644 (file)
@@ -47,6 +47,7 @@
 #include "HTMLTemplateElement.h"
 #include "Page.h"
 #include "ProcessingInstruction.h"
+#include "RenderElement.h"
 #include "ResourceError.h"
 #include "ResourceRequest.h"
 #include "ResourceResponse.h"
@@ -854,7 +855,7 @@ void XMLDocumentParser::startElementNs(const xmlChar* xmlLocalName, const xmlCha
     pushCurrentNode(newElement.get());
 #endif
 
-    if (m_view && currentNode->attached() && !newElement->attached())
+    if (m_view && currentNode->renderer() && !newElement->renderer())
         Style::attachRenderTree(*newElement);
 
     if (newElement->hasTagName(HTMLNames::htmlTag))
@@ -1030,7 +1031,7 @@ void XMLDocumentParser::cdataBlock(const xmlChar* s, int len)
 
     RefPtr<CDATASection> newNode = CDATASection::create(m_currentNode->document(), toString(s, len));
     m_currentNode->parserAppendChild(newNode.get());
-    if (m_view && !newNode->attached())
+    if (m_view)
         Style::attachTextRenderer(*newNode);
 }