Create render tree lazily
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Dec 2013 14:44:23 +0000 (14:44 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 20 Dec 2013 14:44:23 +0000 (14:44 +0000)
https://bugs.webkit.org/show_bug.cgi?id=120685

Source/WebCore:

Reviewed by Andreas Kling.

We currently recompute style and construct renderer for each DOM node immediately after they are added to
the tree. This is often inefficient as the style may change immediately afterwards and the work needs to be
redone.

With this patch we always compute style and construct render tree lazily, either on style recalc timer or
synchronously when they are needed. It also removes the 'attached' bit. If document has render tree then
all nodes are conceptually "attached" even if this happens lazily.

The patch slightly changes behavior of implicit CSS transitions. A synchronous style change during parsing
may not trigger the animation anymore as laziness means we don't see anything changing. This matches Firefox
and Chrome in our test cases.

* WebCore.exp.in:
* bindings/js/JSNodeCustom.cpp:
(WebCore::JSNode::insertBefore):
(WebCore::JSNode::replaceChild):
(WebCore::JSNode::appendChild):

    All attaching is now lazy, remove AttachLazily.

* css/CSSComputedStyleDeclaration.cpp:
(WebCore::ComputedStyleExtractor::propertyValue):

    SVG renderers with !isValid() have empty display property value for some reason. Keep the behavior.

* dom/ContainerNode.cpp:
(WebCore::ContainerNode::insertBefore):
(WebCore::ContainerNode::parserInsertBefore):
(WebCore::ContainerNode::replaceChild):
(WebCore::ContainerNode::appendChild):
(WebCore::ContainerNode::parserAppendChild):
(WebCore::ContainerNode::updateTreeAfterInsertion):
* dom/ContainerNode.h:
* dom/Document.cpp:
(WebCore::Document::~Document):
(WebCore::Document::updateStyleIfNeeded):
(WebCore::Document::createRenderTree):
(WebCore::Document::destroyRenderTree):

    Remove attach bit maintenance.

(WebCore::Document::webkitDidExitFullScreenForElement):

    Do lazy render tree reconstruction after returning from full screen. That is the only reliable way
    to get the render tree back to decent shape.

* dom/Element.cpp:
(WebCore::Element::isFocusable):

    Remove pointless !renderer()->needsLayout() assert.

(WebCore::Element::addShadowRoot):
(WebCore::Element::childShouldCreateRenderer):
(WebCore::Element::resetComputedStyle):

    Take care to reset computed style in all descendants. attachRenderTree no longer does this.

* dom/Element.h:
* dom/Node.cpp:
(WebCore::Node::insertBefore):
(WebCore::Node::replaceChild):
(WebCore::Node::appendChild):
(WebCore::Node::setNeedsStyleRecalc):

    Propagate ReconstructRenderTree.

(WebCore::Node::attached):

    Emulate the behavior of old attached bit for now so existing code calling this mostly stays working.

* dom/Node.h:

    Add new ReconstructRenderTree value for StyleChangeType.

* dom/Range.cpp:
(WebCore::Range::isPointInRange):
(WebCore::Range::comparePoint):
(WebCore::Range::compareNode):
(WebCore::Range::intersectsNode):
* editing/AppendNodeCommand.cpp:
(WebCore::AppendNodeCommand::doApply):
* editing/CompositeEditCommand.cpp:
(WebCore::CompositeEditCommand::canRebalance):
* editing/InsertNodeBeforeCommand.cpp:
(WebCore::InsertNodeBeforeCommand::doApply):
* html/HTMLDetailsElement.cpp:
(WebCore::HTMLDetailsElement::didAddUserAgentShadowRoot):
* html/HTMLDocument.cpp:
(WebCore::HTMLDocument::activeElement):
* html/HTMLElement.cpp:
(WebCore::HTMLElement::setInnerText):

    TextControlInnerTextElement always preserves newline even if it doesn't have style yet.

(WebCore::HTMLElement::supportsFocus):
* html/HTMLEmbedElement.cpp:
(WebCore::HTMLEmbedElement::parseAttribute):
* html/HTMLFormControlElement.cpp:
(WebCore::shouldAutofocus):

    Don't autofocus until we have renderer.

* html/HTMLFormControlElementWithState.cpp:
(WebCore::HTMLFormControlElementWithState::shouldSaveAndRestoreFormControlState):
* html/HTMLFrameElementBase.cpp:
(WebCore::HTMLFrameElementBase::didNotifySubtreeInsertions):
* html/HTMLInputElement.cpp:
(WebCore::HTMLInputElement::updateType):

    Lazy render tree construction.

(WebCore::HTMLInputElement::parseAttribute):
(WebCore::HTMLInputElement::defaultEventHandler):
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::parseAttribute):
* html/HTMLObjectElement.cpp:
(WebCore::HTMLObjectElement::parseAttribute):
* html/HTMLSummaryElement.cpp:
(WebCore::HTMLSummaryElement::didAddUserAgentShadowRoot):
* html/parser/HTMLConstructionSite.cpp:
(WebCore::executeTask):

    Don't attach renderer after construction.

* html/parser/HTMLTreeBuilder.cpp:
(WebCore::HTMLTreeBuilder::callTheAdoptionAgency):
* html/shadow/ContentDistributor.cpp:
(WebCore::ContentDistributor::invalidateDistribution):
* html/shadow/InsertionPoint.cpp:
(WebCore::InsertionPoint::willAttachRenderers):
(WebCore::InsertionPoint::willDetachRenderers):
* html/shadow/MediaControlElements.cpp:
(WebCore::MediaControlTextTrackContainerElement::updateDisplay):
* html/shadow/MediaControls.cpp:
(WebCore::MediaControls::createTextTrackDisplay):
* html/shadow/MediaControlsApple.cpp:
(WebCore::MediaControlsApple::createControls):
* html/track/TextTrackCue.cpp:
(WebCore::TextTrackCue::getDisplayTree):
* loader/PlaceholderDocument.cpp:
(WebCore::PlaceholderDocument::createRenderTree):
* loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::preload):
* style/StyleResolveTree.cpp:
(WebCore::Style::attachTextRenderer):
(WebCore::Style::detachTextRenderer):

    Remove attached bit maintenance.

(WebCore::Style::attachChildren):
(WebCore::Style::attachShadowRoot):
(WebCore::Style::attachRenderTree):
(WebCore::Style::detachShadowRoot):
(WebCore::Style::detachRenderTree):
(WebCore::Style::resolveLocal):
* svg/SVGTests.cpp:
(WebCore::SVGTests::handleAttributeChange):

    Make lazy.

* testing/Internals.cpp:
(WebCore::Internals::attached):
(WebCore::Internals::elementRenderTreeAsText):
(WebCore::Internals::markerAt):
(WebCore::Internals::nodesFromRect):

LayoutTests:

Reviewed by Andreas Kling.

Most of these are non-visible render tree dump changes (they become simpler).

* editing/selection/click-on-head-margin-expected.txt:
* fast/css-generated-content/before-content-continuation-chain-expected.txt:
* fast/css/transition-color-unspecified.html:
* fast/dom/adopt-node-crash-2-expected.txt:
* fast/dom/modify-node-and-while-in-the-callback-too-crash-expected.txt:
* fast/forms/radio/radio_checked_dynamic-expected.txt:
* fast/frames/lots-of-iframes-expected.txt:
* fast/frames/sandboxed-iframe-autofocus-denied-expected.txt:
* fast/table/table-row-style-not-updated-with-after-content-expected.txt:
* fullscreen/full-screen-render-inline-expected.txt:
* fullscreen/parent-flow-inline-with-block-child-expected.txt:
* platform/mac/editing/inserting/break-blockquote-after-delete-expected.txt:
* platform/mac/fast/css-generated-content/table-row-group-to-inline-expected.txt:
* platform/mac/fast/dynamic/011-expected.txt:
* platform/mac/fast/forms/formmove3-expected.txt:
* platform/mac/fast/forms/preserveFormDuringResidualStyle-expected.txt:
* platform/mac/fast/invalid/001-expected.txt:
* platform/mac/fast/invalid/003-expected.txt:
* platform/mac/fast/invalid/004-expected.txt:
* platform/mac/fast/invalid/007-expected.txt:
* platform/mac/fast/invalid/019-expected.txt:
* platform/mac/fast/multicol/span/span-as-immediate-child-generated-content-expected.txt:
* platform/mac/fast/multicol/span/span-as-immediate-columns-child-dynamic-expected.txt:
* platform/mac/fast/multicol/span/span-as-nested-columns-child-dynamic-expected.txt:
* platform/mac/fast/ruby/ruby-base-merge-block-children-crash-expected.txt:
* platform/mac/tables/mozilla/bugs/bug113235-1-expected.txt:
* platform/mac/tables/mozilla/bugs/bug647-expected.txt:
* platform/mac/tables/mozilla/other/wa_table_tr_align-expected.txt:
* plugins/plugin-remove-readystatechange-expected.txt:
* svg/custom/system-language-crash-expected.txt:
* transitions/equivalent-background-image-no-transition.html:
* transitions/repeated-firing-background-color.html:
* transitions/transition-duration-cleared-in-transitionend-crash.html:

    Adopt a few transition test cases to new behavior.

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

75 files changed:
LayoutTests/ChangeLog
LayoutTests/editing/selection/click-on-head-margin-expected.txt
LayoutTests/fast/css-generated-content/before-content-continuation-chain-expected.txt
LayoutTests/fast/css/transition-color-unspecified.html
LayoutTests/fast/dom/adopt-node-crash-2-expected.txt
LayoutTests/fast/dom/modify-node-and-while-in-the-callback-too-crash-expected.txt
LayoutTests/fast/forms/radio/radio_checked_dynamic-expected.txt
LayoutTests/fast/frames/lots-of-iframes-expected.txt
LayoutTests/fast/frames/sandboxed-iframe-autofocus-denied-expected.txt
LayoutTests/fast/table/table-row-style-not-updated-with-after-content-expected.txt
LayoutTests/fullscreen/full-screen-render-inline-expected.txt
LayoutTests/fullscreen/parent-flow-inline-with-block-child-expected.txt
LayoutTests/platform/mac/editing/inserting/break-blockquote-after-delete-expected.txt
LayoutTests/platform/mac/fast/css-generated-content/table-row-group-to-inline-expected.txt
LayoutTests/platform/mac/fast/dynamic/011-expected.txt
LayoutTests/platform/mac/fast/forms/formmove3-expected.txt
LayoutTests/platform/mac/fast/forms/preserveFormDuringResidualStyle-expected.txt
LayoutTests/platform/mac/fast/invalid/001-expected.txt
LayoutTests/platform/mac/fast/invalid/003-expected.txt
LayoutTests/platform/mac/fast/invalid/004-expected.txt
LayoutTests/platform/mac/fast/invalid/007-expected.txt
LayoutTests/platform/mac/fast/invalid/019-expected.txt
LayoutTests/platform/mac/fast/multicol/span/span-as-immediate-child-generated-content-expected.txt
LayoutTests/platform/mac/fast/multicol/span/span-as-immediate-columns-child-dynamic-expected.txt
LayoutTests/platform/mac/fast/multicol/span/span-as-nested-columns-child-dynamic-expected.txt
LayoutTests/platform/mac/fast/ruby/ruby-base-merge-block-children-crash-expected.txt
LayoutTests/platform/mac/tables/mozilla/bugs/bug113235-1-expected.txt
LayoutTests/platform/mac/tables/mozilla/bugs/bug647-expected.txt
LayoutTests/platform/mac/tables/mozilla/other/wa_table_tr_align-expected.txt
LayoutTests/plugins/plugin-remove-readystatechange-expected.txt
LayoutTests/svg/custom/system-language-crash-expected.txt
LayoutTests/transitions/equivalent-background-image-no-transition.html
LayoutTests/transitions/repeated-firing-background-color.html
LayoutTests/transitions/transition-duration-cleared-in-transitionend-crash.html
Source/WebCore/ChangeLog
Source/WebCore/WebCore.exp.in
Source/WebCore/bindings/js/JSNodeCustom.cpp
Source/WebCore/css/CSSComputedStyleDeclaration.cpp
Source/WebCore/dom/ContainerNode.cpp
Source/WebCore/dom/ContainerNode.h
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/Element.h
Source/WebCore/dom/Node.cpp
Source/WebCore/dom/Node.h
Source/WebCore/dom/Range.cpp
Source/WebCore/editing/AppendNodeCommand.cpp
Source/WebCore/editing/CompositeEditCommand.cpp
Source/WebCore/editing/InsertNodeBeforeCommand.cpp
Source/WebCore/html/HTMLDetailsElement.cpp
Source/WebCore/html/HTMLDocument.cpp
Source/WebCore/html/HTMLElement.cpp
Source/WebCore/html/HTMLEmbedElement.cpp
Source/WebCore/html/HTMLFormControlElement.cpp
Source/WebCore/html/HTMLFormControlElementWithState.cpp
Source/WebCore/html/HTMLFrameElementBase.cpp
Source/WebCore/html/HTMLInputElement.cpp
Source/WebCore/html/HTMLMediaElement.cpp
Source/WebCore/html/HTMLObjectElement.cpp
Source/WebCore/html/HTMLSummaryElement.cpp
Source/WebCore/html/parser/HTMLConstructionSite.cpp
Source/WebCore/html/parser/HTMLTreeBuilder.cpp
Source/WebCore/html/shadow/ContentDistributor.cpp
Source/WebCore/html/shadow/InsertionPoint.cpp
Source/WebCore/html/shadow/MediaControlElements.cpp
Source/WebCore/html/shadow/MediaControls.cpp
Source/WebCore/html/shadow/MediaControlsApple.cpp
Source/WebCore/html/track/TextTrackCue.cpp
Source/WebCore/loader/PlaceholderDocument.cpp
Source/WebCore/loader/cache/CachedResourceLoader.cpp
Source/WebCore/style/StyleResolveTree.cpp
Source/WebCore/svg/SVGTests.cpp
Source/WebCore/testing/Internals.cpp
Source/WebKit/mac/WebView/WebHTMLView.mm
Source/WebKit2/WebProcess/WebPage/WebPage.cpp

index 6be0792..76d26d0 100644 (file)
@@ -1,3 +1,48 @@
+2013-12-19  Antti Koivisto  <antti@apple.com>
+
+        Create render tree lazily
+        https://bugs.webkit.org/show_bug.cgi?id=120685
+
+        Reviewed by Andreas Kling.
+        
+        Most of these are non-visible render tree dump changes (they become simpler).
+
+        * editing/selection/click-on-head-margin-expected.txt:
+        * fast/css-generated-content/before-content-continuation-chain-expected.txt:
+        * fast/css/transition-color-unspecified.html:
+        * fast/dom/adopt-node-crash-2-expected.txt:
+        * fast/dom/modify-node-and-while-in-the-callback-too-crash-expected.txt:
+        * fast/forms/radio/radio_checked_dynamic-expected.txt:
+        * fast/frames/lots-of-iframes-expected.txt:
+        * fast/frames/sandboxed-iframe-autofocus-denied-expected.txt:
+        * fast/table/table-row-style-not-updated-with-after-content-expected.txt:
+        * fullscreen/full-screen-render-inline-expected.txt:
+        * fullscreen/parent-flow-inline-with-block-child-expected.txt:
+        * platform/mac/editing/inserting/break-blockquote-after-delete-expected.txt:
+        * platform/mac/fast/css-generated-content/table-row-group-to-inline-expected.txt:
+        * platform/mac/fast/dynamic/011-expected.txt:
+        * platform/mac/fast/forms/formmove3-expected.txt:
+        * platform/mac/fast/forms/preserveFormDuringResidualStyle-expected.txt:
+        * platform/mac/fast/invalid/001-expected.txt:
+        * platform/mac/fast/invalid/003-expected.txt:
+        * platform/mac/fast/invalid/004-expected.txt:
+        * platform/mac/fast/invalid/007-expected.txt:
+        * platform/mac/fast/invalid/019-expected.txt:
+        * platform/mac/fast/multicol/span/span-as-immediate-child-generated-content-expected.txt:
+        * platform/mac/fast/multicol/span/span-as-immediate-columns-child-dynamic-expected.txt:
+        * platform/mac/fast/multicol/span/span-as-nested-columns-child-dynamic-expected.txt:
+        * platform/mac/fast/ruby/ruby-base-merge-block-children-crash-expected.txt:
+        * platform/mac/tables/mozilla/bugs/bug113235-1-expected.txt:
+        * platform/mac/tables/mozilla/bugs/bug647-expected.txt:
+        * platform/mac/tables/mozilla/other/wa_table_tr_align-expected.txt:
+        * plugins/plugin-remove-readystatechange-expected.txt:
+        * svg/custom/system-language-crash-expected.txt:
+        * transitions/equivalent-background-image-no-transition.html:
+        * transitions/repeated-firing-background-color.html:
+        * transitions/transition-duration-cleared-in-transitionend-crash.html:
+
+            Adopt a few transition test cases to new behavior.
+
 2013-12-20  Mario Sanchez Prada  <mario.prada@samsung.com>
 
         [ATK] [WK2] platform/gtk/accessibility/roles-exposed.html is failing
index 92e2f9b..a1aeb55 100644 (file)
@@ -1,4 +1,4 @@
 Click on the right of this line outside the black box.
 The caret should be placed on the right of the first line, NOT on the right of this line.
- PASS
+PASS
 
index baa8293..3d4569e 100644 (file)
@@ -5,11 +5,11 @@ layer at (0,0) size 800x416
     RenderBody {BODY} at (8,8) size 784x400
       RenderBlock (anonymous) at (0,0) size 784x0
         RenderInline {SPAN} at (0,0) size 0x0 [color=#008000]
-      RenderBlock (anonymous) at (0,0) size 784x200
+      RenderBlock (anonymous) at (0,0) size 784x200 [color=#008000]
         RenderBlock (generated) at (0,0) size 784x200 [color=#0000FF]
           RenderText at (0,0) size 200x200
             text run at (0,0) width 200: "A"
-        RenderBlock {DIV} at (0,200) size 784x0 [color=#008000]
+        RenderBlock {DIV} at (0,200) size 784x0
       RenderBlock (anonymous) at (0,200) size 784x200
         RenderInline {SPAN} at (0,0) size 200x200 [color=#008000]
           RenderText {#text} at (0,0) size 200x200
index 314db15..0f0b3b8 100644 (file)
@@ -14,5 +14,5 @@
             setTimeout("testRunner.notifyDone()", 0);
     }, false);
 
-    document.getElementById("test").className = "";
+    setTimeout(function() { document.getElementById("test").className = "" }, 0);
 </script>
index ec981ea..e6528ea 100644 (file)
@@ -1,2 +1,3 @@
 Tests for a crash due to adopting a DOM node during DOMFocusOut event. Test passes if it doesn't crash.
 
+
index 9ee018f..7e3c9a1 100644 (file)
@@ -1,3 +1 @@
 This tests that making changes on a node that triggers a callback where we make changes again on the same node does not result in an assert/crash. Test passes if no crash is observed.
-
-
index b139836..d07ed33 100644 (file)
@@ -10,6 +10,6 @@ Test 3: Transfer radio buttons from <form> to <body> with a dormant state in the
 Test 3 Passed
 
 Test 4: Transfer from <form> to <form>
-  
 Test 4 Passed
 
index d351763..3dc7353 100644 (file)
@@ -1,3 +1,2 @@
 Sucessfully created 1000 frames.
 Successfully blocked creation of frame number 1001.
-
index 0ce8393..a6f4863 100644 (file)
@@ -1,5 +1,5 @@
 CONSOLE MESSAGE: line 1: Blocked script execution in 'about:srcdoc' because the document's frame is sandboxed and the 'allow-scripts' permission is not set.
-CONSOLE MESSAGE: line 1: Blocked autofocusing on a form control because the form's frame is sandboxed and the 'allow-scripts' permission is not set.
+CONSOLE MESSAGE: Blocked autofocusing on a form control because the form's frame is sandboxed and the 'allow-scripts' permission is not set.
 CONSOLE MESSAGE: line 13: PASS: The input element is not focused.
 This test passes if the input element in the sandboxed frame is not automatically focused upon, as it should be blocked by the sandboxed scripts flag. A console warning to that effect should also be present.
 
index fa08efc..dfb95dd 100644 (file)
@@ -7,14 +7,13 @@ layer at (0,0) size 800x600
         RenderTableSection (anonymous) at (0,0) size 512x256
           RenderTableRow {DIV} at (0,0) size 512x256 [color=#0000FF]
             RenderTableCell (anonymous) at (0,0) size 512x256 [r=0 c=0 rs=1 cs=1]
-              RenderTable at (0,0) size 512x256
-                RenderTableSection (anonymous) at (0,0) size 512x256
-                  RenderTableRow (anonymous) at (0,0) size 512x128
+              RenderBlock (anonymous) at (0,0) size 512x128
+                RenderText {#text} at (0,0) size 512x128
+                  text run at (0,0) width 512: "ABCD"
+              RenderTable at (0,128) size 512x128
+                RenderTableSection (anonymous) at (0,0) size 512x128
+                  RenderTableRow (anonymous) at (0,0) size 512x128 [color=#FFFF00]
                     RenderTableCell (anonymous) at (0,0) size 512x128 [r=0 c=0 rs=1 cs=1]
-                      RenderText {#text} at (0,0) size 512x128
-                        text run at (0,0) width 512: "ABCD"
-                  RenderTableRow (anonymous) at (0,128) size 512x128 [color=#FFFF00]
-                    RenderTableCell (anonymous) at (0,128) size 512x128 [r=1 c=0 rs=1 cs=1]
                       RenderText at (0,0) size 512x128
                         text run at (0,0) width 512: "4578"
       RenderBlock {DIV} at (0,256) size 784x128 [color=#008000]
index 9a6fbed..325edc9 100644 (file)
@@ -4,8 +4,6 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock {SUMMARY} at (0,0) size 784x48
-        RenderBlock (anonymous) at (0,0) size 784x0
-        RenderBlock (anonymous) at (0,0) size 784x0
         RenderBlock (anonymous) at (0,0) size 784x16
           RenderText {#text} at (0,0) size 16x16
             text run at (0,0) width 16: "a"
index a52c471..9c54d8b 100644 (file)
@@ -3,19 +3,18 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
-      RenderBlock {DIV} at (0,0) size 784x32
+      RenderBlock {DIV} at (0,0) size 784x16
         RenderBlock (anonymous) at (0,0) size 784x16
           RenderInline {SPAN} at (0,0) size 16x16
             RenderText {#text} at (0,0) size 16x16
               text run at (0,0) width 16: "1"
-          RenderText {#text} at (0,0) size 0x0
-        RenderBlock (anonymous) at (0,16) size 784x16
+          RenderText {#text} at (16,0) size 16x16
+            text run at (16,0) width 16: " "
           RenderInline {SPAN} at (0,0) size 16x16
-            RenderText {#text} at (0,0) size 16x16
-              text run at (0,0) width 16: "2"
-        RenderBlock (anonymous) at (0,32) size 784x0
+            RenderText {#text} at (32,0) size 16x16
+              text run at (32,0) width 16: "2"
+        RenderBlock (anonymous) at (0,16) size 784x0
           RenderBlock {DIV} at (0,0) size 784x0
-        RenderBlock (anonymous) at (0,32) size 784x0
+        RenderBlock (anonymous) at (0,16) size 784x0
           RenderInline {SPAN} at (0,0) size 0x0
-        RenderBlock (anonymous) at (0,32) size 784x0
           RenderText {#text} at (0,0) size 0x0
index 2fb35c8..1e0d288 100644 (file)
@@ -21,5 +21,4 @@ layer at (0,0) size 800x600
             RenderBlock {BLOCKQUOTE} at (0,0) size 772x18 [color=#008000] [border: none (2px solid #008000)]
               RenderText {#text} at (12,0) size 35x18
                 text run at (12,0) width 35: "green"
-        RenderBlock (anonymous) at (0,54) size 784x0
 caret: position 5 of child 2 {#text} of child 4 {DIV} of body
index 7fc67f9..aa59040 100644 (file)
@@ -10,14 +10,11 @@ layer at (0,0) size 800x600
         RenderText {#text} at (638,0) size 4x18
           text run at (638,0) width 4: " "
         RenderBR {BR} at (642,14) size 0x0
-      RenderBlock {UL} at (0,34) size 784x36
-        RenderListItem {LI} at (40,0) size 744x36
-          RenderBlock (anonymous) at (0,0) size 744x18
-            RenderListMarker at (-17,0) size 7x18: bullet
-          RenderTable at (0,18) size 0x0
-          RenderBlock (anonymous) at (0,18) size 744x18
-            RenderInline (generated) at (0,0) size 31x18
-              RenderText at (0,0) size 31x18
-                text run at (0,0) width 31: "hello"
-            RenderText {#text} at (31,0) size 21x18
-              text run at (31,0) width 21: "test"
+      RenderBlock {UL} at (0,34) size 784x18
+        RenderListItem {LI} at (40,0) size 744x18
+          RenderListMarker at (-17,0) size 7x18: bullet
+          RenderInline (generated) at (0,0) size 31x18
+            RenderText at (0,0) size 31x18
+              text run at (0,0) width 31: "hello"
+          RenderText {#text} at (31,0) size 21x18
+            text run at (31,0) width 21: "test"
index 2e3ae2c..16fa7b1 100644 (file)
@@ -4,7 +4,6 @@ layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock (anonymous) at (0,0) size 784x36
-        RenderInline {SPAN} at (0,0) size 0x0
         RenderInline {SPAN} at (0,0) size 781x36
           RenderInline {SPAN} at (0,0) size 781x36
             RenderText {#text} at (0,0) size 781x36
index f1e7753..f878807 100644 (file)
@@ -6,7 +6,6 @@ layer at (0,0) size 800x600
       RenderBlock (anonymous) at (0,0) size 784x0
         RenderInline {A} at (0,0) size 0x0
           RenderText {#text} at (0,0) size 0x0
-        RenderInline {A} at (0,0) size 0x0
       RenderBlock {DIV} at (0,0) size 784x28
         RenderBlock (anonymous) at (0,0) size 784x0
           RenderInline {A} at (0,0) size 0x0
index 7e785e6..fd6852a 100644 (file)
@@ -6,7 +6,6 @@ layer at (0,0) size 800x600
       RenderBlock (anonymous) at (0,0) size 784x0
         RenderInline {FONT} at (0,0) size 0x0
           RenderText {#text} at (0,0) size 0x0
-        RenderInline {FONT} at (0,0) size 0x0
       RenderBlock {CENTER} at (0,0) size 784x25
         RenderBlock (anonymous) at (0,0) size 784x0
           RenderInline {FONT} at (0,0) size 0x0
@@ -22,7 +21,6 @@ layer at (0,0) size 800x600
         RenderBlock (anonymous) at (0,25) size 784x0
           RenderInline {FONT} at (0,0) size 0x0
           RenderText {#text} at (0,0) size 0x0
-      RenderBlock (anonymous) at (0,25) size 784x0
       RenderBlock {DIV} at (0,25) size 784x36
         RenderText {#text} at (0,0) size 775x36
           text run at (0,0) width 775: "Success! This test succeeds if the input named mover is not detached from its form when it is moved around in the DOM to"
index a867180..ccf9e9b 100644 (file)
@@ -5,7 +5,6 @@ layer at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
       RenderBlock (anonymous) at (0,0) size 784x0
         RenderInline {B} at (0,0) size 0x0
-        RenderInline {B} at (0,0) size 0x0
       RenderBlock {P} at (0,0) size 784x18
         RenderInline {B} at (0,0) size 36x18
           RenderText {#text} at (0,0) size 36x18
index 30773ac..a4a20cf 100644 (file)
@@ -8,8 +8,6 @@ layer at (0,0) size 800x600
           RenderInline {I} at (0,0) size 89x18
             RenderText {#text} at (0,0) size 89x18
               text run at (0,0) width 89: "Italic and Red"
-        RenderInline {FONT} at (0,0) size 0x18 [color=#FF0000]
-          RenderInline {I} at (0,0) size 0x18
         RenderInline {I} at (0,0) size 0x18
       RenderBlock (anonymous) at (0,34) size 784x18
         RenderBlock {P} at (0,0) size 784x18
@@ -37,8 +35,6 @@ layer at (0,0) size 800x600
         RenderInline {FONT} at (0,0) size 0x0 [color=#FF0000]
           RenderInline {I} at (0,0) size 0x0
             RenderText {#text} at (0,0) size 0x0
-        RenderInline {FONT} at (0,0) size 0x0 [color=#FF0000]
-          RenderInline {I} at (0,0) size 0x0
       RenderBlock {P} at (0,136) size 784x18
         RenderInline {FONT} at (0,0) size 123x18 [color=#FF0000]
           RenderInline {I} at (0,0) size 93x18
index bd9e3f5..b5dafd2 100644 (file)
@@ -18,7 +18,6 @@ layer at (0,0) size 800x600
         RenderInline {FONT} at (0,0) size 0x0
         RenderText {#text} at (0,0) size 0x0
         RenderInline {B} at (0,0) size 0x0
-        RenderInline {B} at (0,0) size 0x0
       RenderBlock {P} at (0,206) size 784x18
         RenderInline {B} at (0,0) size 97x18
           RenderInline {I} at (0,0) size 97x18
index 3c53347..a2679c0 100644 (file)
@@ -6,8 +6,6 @@ layer at (0,0) size 800x600
       RenderBlock (anonymous) at (0,0) size 784x0
         RenderInline {LABEL} at (0,0) size 0x0
           RenderInline {A} at (0,0) size 0x0
-        RenderInline {LABEL} at (0,0) size 0x0
-          RenderInline {A} at (0,0) size 0x0
       RenderBlock (anonymous) at (0,0) size 784x36
         RenderBlock {DIV} at (0,0) size 784x36
           RenderBlock (anonymous) at (0,0) size 784x18
index 89cbd53..fa2a21e 100644 (file)
@@ -6,8 +6,6 @@ layer at (0,0) size 800x600
       RenderBlock (anonymous) at (0,0) size 784x0
         RenderInline {B} at (0,0) size 0x0
           RenderInline {NOBR} at (0,0) size 0x0
-        RenderInline {B} at (0,0) size 0x0
-          RenderInline {NOBR} at (0,0) size 0x0
       RenderBlock {DIV} at (0,0) size 784x64
         RenderBlock (anonymous) at (0,0) size 784x36
           RenderInline {B} at (0,0) size 763x36
index 3d1136c..207a526 100644 (file)
@@ -1,8 +1,8 @@
-layer at (0,0) size 785x2744
+layer at (0,0) size 785x2762
   RenderView at (0,0) size 785x600
-layer at (0,0) size 785x2744
-  RenderBlock {HTML} at (0,0) size 785x2744
-    RenderBody {BODY} at (8,16) size 769x2712
+layer at (0,0) size 785x2762
+  RenderBlock {HTML} at (0,0) size 785x2762
+    RenderBody {BODY} at (8,16) size 769x2730
 layer at (8,16) size 760x420
   RenderBlock {DIV} at (0,0) size 760x420 [border: (5px solid #800000)]
     RenderBlock (anonymous multi-column span) at (5,23) size 750x66
@@ -293,12 +293,16 @@ layer at (13,2111) size 750x126
     RenderBlock (generated) at (0,232) size 367x20 [bgcolor=#FFFF00]
       RenderText at (0,0) size 156x18
         text run at (0,0) width 156: "After Generated Content"
-layer at (8,2258) size 760x470
-  RenderBlock {DIV} at (0,2242) size 760x470 [border: (5px solid #800000)]
+layer at (8,2258) size 760x488
+  RenderBlock {DIV} at (0,2242) size 760x488 [border: (5px solid #800000)]
     RenderBlock (anonymous multi-column span) at (5,271) size 750x66
       RenderBlock {H2} at (0,19) size 750x28 [bgcolor=#EEEEEE]
         RenderText {#text} at (0,0) size 276x28
           text run at (0,0) width 276: "This is a spanning element."
+    RenderBlock (anonymous) at (5,355) size 750x18
+      RenderBlock {SPAN} at (0,0) size 750x18
+        RenderText {#text} at (0,0) size 154x18
+          text run at (0,0) width 154: "Nulla varius enim ac mi."
 layer at (13,2263) size 750x266
   RenderBlock (anonymous multi-column) at (5,5) size 750x266
     RenderBlock (generated) at (0,0) size 367x18 [bgcolor=#FFFF00]
@@ -334,17 +338,14 @@ layer at (13,2263) size 750x266
         text run at (0,144) width 343: "condimentum vestibulum. Suspendisse hendrerit quam"
         text run at (0,162) width 362: "nec felis. Sed varius turpis vitae pede. Lorem ipsum dolor"
         text run at (0,180) width 229: "sit amet, consectetuer adipiscing elit."
-layer at (13,2595) size 750x128
-  RenderBlock (anonymous multi-column) at (5,337) size 750x128
-    RenderBlock (anonymous) at (0,0) size 367x18
-      RenderInline {SPAN} at (0,0) size 354x18
-        RenderText {#text} at (0,0) size 354x18
-          text run at (0,0) width 354: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit."
-    RenderBlock (anonymous) at (0,18) size 367x18
-      RenderBlock {SPAN} at (0,0) size 367x18
-        RenderText {#text} at (0,0) size 154x18
-          text run at (0,0) width 154: "Nulla varius enim ac mi."
-    RenderBlock (anonymous) at (0,36) size 367x182
+layer at (13,2595) size 750x18
+  RenderBlock (anonymous multi-column) at (5,337) size 750x18
+    RenderInline {SPAN} at (0,0) size 354x18
+      RenderText {#text} at (0,0) size 354x18
+        text run at (0,0) width 354: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit."
+layer at (13,2631) size 750x110
+  RenderBlock (anonymous multi-column) at (5,373) size 750x110
+    RenderBlock (anonymous) at (0,0) size 367x182
       RenderInline {SPAN} at (0,0) size 362x182
         RenderText {#text} at (0,0) size 362x182
           text run at (0,0) width 362: "Curabitur sollicitudin felis quis lectus. Quisque adipiscing"
@@ -352,12 +353,12 @@ layer at (13,2595) size 750x128
           text run at (0,36) width 350: "euismod et, nisi. Sed vitae felis vel orci sagittis aliquam."
           text run at (0,54) width 332: "Cras convallis adipiscing sem. Nam nonummy enim."
           text run at (0,72) width 351: "Nullam bibendum lobortis neque. Vestibulum velit orci,"
-          text run at (0,92) width 329: "tempus euismod, pretium quis, interdum vitae, nulla."
+          text run at (0,90) width 329: "tempus euismod, pretium quis, interdum vitae, nulla."
           text run at (0,110) width 339: "Phasellus eget ante et tortor condimentum vestibulum."
           text run at (0,128) width 345: "Suspendisse hendrerit quam nec felis. Sed varius turpis"
           text run at (0,146) width 331: "vitae pede. Lorem ipsum dolor sit amet, consectetuer"
           text run at (0,164) width 91: "adipiscing elit."
       RenderText {#text} at (0,0) size 0x0
-    RenderBlock (generated) at (0,218) size 367x20 [bgcolor=#FFFF00]
+    RenderBlock (generated) at (0,182) size 367x20 [bgcolor=#FFFF00]
       RenderText at (0,0) size 156x18
         text run at (0,0) width 156: "After Generated Content"
index 735ca2d..2051c3f 100644 (file)
@@ -1,8 +1,8 @@
-layer at (0,0) size 785x2572
+layer at (0,0) size 785x2590
   RenderView at (0,0) size 785x600
-layer at (0,0) size 785x2572
-  RenderBlock {HTML} at (0,0) size 785x2572
-    RenderBody {BODY} at (8,16) size 769x2540
+layer at (0,0) size 785x2590
+  RenderBlock {HTML} at (0,0) size 785x2590
+    RenderBody {BODY} at (8,16) size 769x2558
 layer at (8,16) size 760x382
   RenderBlock {DIV} at (0,0) size 760x382 [border: (5px solid #800000)]
     RenderBlock (anonymous multi-column span) at (5,5) size 750x66
@@ -152,22 +152,21 @@ layer at (8,1260) size 760x416
           text run at (0,0) width 276: "This is a spanning element."
 layer at (13,1265) size 750x126
   RenderBlock (anonymous multi-column) at (5,5) size 750x126
-    RenderBlock (anonymous) at (0,0) size 367x234
-      RenderText {#text} at (0,0) size 363x234
-        text run at (0,0) width 354: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit."
-        text run at (0,18) width 351: "Nulla varius enim ac mi. Curabitur sollicitudin felis quis"
-        text run at (0,36) width 325: "lectus. Quisque adipiscing rhoncus sem. Proin nulla"
-        text run at (0,54) width 358: "purus, vulputate vel, varius ut, euismod et, nisi. Sed vitae"
-        text run at (0,72) width 343: "felis vel orci sagittis aliquam. Cras convallis adipiscing"
-        text run at (0,90) width 340: "sem. Nam nonummy enim. Nullam bibendum lobortis"
-        text run at (0,108) width 344: "neque. Vestibulum velit orci, tempus euismod, pretium"
-        text run at (0,126) width 343: "quis, interdum vitae, nulla. Phasellus eget ante et tortor"
-        text run at (0,144) width 343: "condimentum vestibulum. Suspendisse hendrerit quam"
-        text run at (0,162) width 362: "nec felis. Sed varius turpis vitae pede. Lorem ipsum dolor"
-        text run at (0,180) width 233: "sit amet, consectetuer adipiscing elit. "
-        text run at (233,180) width 121: "Lorem ipsum dolor"
-        text run at (0,198) width 363: "sit amet, consectetuer adipiscing elit. Nulla varius enim ac"
-        text run at (0,216) width 20: "mi."
+    RenderText {#text} at (0,0) size 363x234
+      text run at (0,0) width 354: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit."
+      text run at (0,18) width 351: "Nulla varius enim ac mi. Curabitur sollicitudin felis quis"
+      text run at (0,36) width 325: "lectus. Quisque adipiscing rhoncus sem. Proin nulla"
+      text run at (0,54) width 358: "purus, vulputate vel, varius ut, euismod et, nisi. Sed vitae"
+      text run at (0,72) width 343: "felis vel orci sagittis aliquam. Cras convallis adipiscing"
+      text run at (0,90) width 340: "sem. Nam nonummy enim. Nullam bibendum lobortis"
+      text run at (0,108) width 344: "neque. Vestibulum velit orci, tempus euismod, pretium"
+      text run at (0,126) width 343: "quis, interdum vitae, nulla. Phasellus eget ante et tortor"
+      text run at (0,144) width 343: "condimentum vestibulum. Suspendisse hendrerit quam"
+      text run at (0,162) width 362: "nec felis. Sed varius turpis vitae pede. Lorem ipsum dolor"
+      text run at (0,180) width 233: "sit amet, consectetuer adipiscing elit. "
+      text run at (233,180) width 121: "Lorem ipsum dolor"
+      text run at (0,198) width 363: "sit amet, consectetuer adipiscing elit. Nulla varius enim ac"
+      text run at (0,216) width 20: "mi."
 layer at (13,1457) size 750x214
   RenderBlock (anonymous multi-column) at (5,197) size 750x214
     RenderBlock (anonymous) at (0,0) size 367x198
@@ -257,12 +256,16 @@ layer at (13,1979) size 750x124
         text run at (0,144) width 343: "condimentum vestibulum. Suspendisse hendrerit quam"
         text run at (0,162) width 362: "nec felis. Sed varius turpis vitae pede. Lorem ipsum dolor"
         text run at (0,180) width 229: "sit amet, consectetuer adipiscing elit."
-layer at (8,2124) size 760x432
-  RenderBlock {DIV} at (0,2108) size 760x432 [border: (5px solid #800000)]
+layer at (8,2124) size 760x450
+  RenderBlock {DIV} at (0,2108) size 760x450 [border: (5px solid #800000)]
     RenderBlock (anonymous multi-column span) at (5,253) size 750x66
       RenderBlock {H2} at (0,19) size 750x28 [bgcolor=#EEEEEE]
         RenderText {#text} at (0,0) size 276x28
           text run at (0,0) width 276: "This is a spanning element."
+    RenderBlock (anonymous) at (5,337) size 750x18
+      RenderBlock {SPAN} at (0,0) size 750x18
+        RenderText {#text} at (0,0) size 154x18
+          text run at (0,0) width 154: "Nulla varius enim ac mi."
 layer at (13,2129) size 750x248
   RenderBlock (anonymous multi-column) at (5,5) size 750x248
     RenderBlock {P} at (0,16) size 367x198
@@ -295,27 +298,23 @@ layer at (13,2129) size 750x248
         text run at (0,144) width 343: "condimentum vestibulum. Suspendisse hendrerit quam"
         text run at (0,162) width 362: "nec felis. Sed varius turpis vitae pede. Lorem ipsum dolor"
         text run at (0,180) width 229: "sit amet, consectetuer adipiscing elit."
-layer at (13,2443) size 750x108
-  RenderBlock (anonymous multi-column) at (5,319) size 750x108
-    RenderBlock (anonymous) at (0,0) size 367x18
-      RenderInline {SPAN} at (0,0) size 354x18
-        RenderText {#text} at (0,0) size 354x18
-          text run at (0,0) width 354: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit."
-    RenderBlock (anonymous) at (0,18) size 367x18
-      RenderBlock {SPAN} at (0,0) size 367x18
-        RenderText {#text} at (0,0) size 154x18
-          text run at (0,0) width 154: "Nulla varius enim ac mi."
-    RenderBlock (anonymous) at (0,36) size 367x180
-      RenderInline {SPAN} at (0,0) size 362x180
-        RenderText {#text} at (0,0) size 362x180
-          text run at (0,0) width 362: "Curabitur sollicitudin felis quis lectus. Quisque adipiscing"
-          text run at (0,18) width 350: "rhoncus sem. Proin nulla purus, vulputate vel, varius ut,"
-          text run at (0,36) width 350: "euismod et, nisi. Sed vitae felis vel orci sagittis aliquam."
-          text run at (0,54) width 332: "Cras convallis adipiscing sem. Nam nonummy enim."
-          text run at (0,72) width 351: "Nullam bibendum lobortis neque. Vestibulum velit orci,"
-          text run at (0,90) width 329: "tempus euismod, pretium quis, interdum vitae, nulla."
-          text run at (0,108) width 339: "Phasellus eget ante et tortor condimentum vestibulum."
-          text run at (0,126) width 345: "Suspendisse hendrerit quam nec felis. Sed varius turpis"
-          text run at (0,144) width 331: "vitae pede. Lorem ipsum dolor sit amet, consectetuer"
-          text run at (0,162) width 91: "adipiscing elit."
-      RenderText {#text} at (0,0) size 0x0
+layer at (13,2443) size 750x18
+  RenderBlock (anonymous multi-column) at (5,319) size 750x18
+    RenderInline {SPAN} at (0,0) size 354x18
+      RenderText {#text} at (0,0) size 354x18
+        text run at (0,0) width 354: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit."
+layer at (13,2479) size 750x90
+  RenderBlock (anonymous multi-column) at (5,355) size 750x90
+    RenderInline {SPAN} at (0,0) size 362x180
+      RenderText {#text} at (0,0) size 362x180
+        text run at (0,0) width 362: "Curabitur sollicitudin felis quis lectus. Quisque adipiscing"
+        text run at (0,18) width 350: "rhoncus sem. Proin nulla purus, vulputate vel, varius ut,"
+        text run at (0,36) width 350: "euismod et, nisi. Sed vitae felis vel orci sagittis aliquam."
+        text run at (0,54) width 332: "Cras convallis adipiscing sem. Nam nonummy enim."
+        text run at (0,72) width 351: "Nullam bibendum lobortis neque. Vestibulum velit orci,"
+        text run at (0,90) width 329: "tempus euismod, pretium quis, interdum vitae, nulla."
+        text run at (0,108) width 339: "Phasellus eget ante et tortor condimentum vestibulum."
+        text run at (0,126) width 345: "Suspendisse hendrerit quam nec felis. Sed varius turpis"
+        text run at (0,144) width 331: "vitae pede. Lorem ipsum dolor sit amet, consectetuer"
+        text run at (0,162) width 91: "adipiscing elit."
+    RenderText {#text} at (0,0) size 0x0
index 2633720..88cd065 100644 (file)
@@ -131,13 +131,12 @@ layer at (13,882) size 750x158
         text run at (0,178) width 362: "nec felis. Sed varius turpis vitae pede. Lorem ipsum dolor"
         text run at (0,196) width 229: "sit amet, consectetuer adipiscing elit."
     RenderBlock {SPAN} at (0,246) size 367x36 [color=#FFFFFF] [bgcolor=#000000]
-      RenderBlock (anonymous) at (0,0) size 367x36
-        RenderText {#text} at (0,0) size 354x36
-          text run at (0,0) width 354: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit."
-          text run at (0,18) width 154: "Nulla varius enim ac mi."
+      RenderText {#text} at (0,0) size 354x36
+        text run at (0,0) width 354: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit."
+        text run at (0,18) width 154: "Nulla varius enim ac mi."
 layer at (13,1106) size 750x222
   RenderBlock (anonymous multi-column) at (5,229) size 750x222
-    RenderBlock {SPAN} at (0,16) size 367x198 [color=#FFFFFF] [bgcolor=#000000]
+    RenderBlock {SPAN} at (0,16) size 367x190 [color=#FFFFFF] [bgcolor=#000000]
       RenderBlock {P} at (0,0) size 367x198
         RenderText {#text} at (0,0) size 362x198
           text run at (0,0) width 354: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit."
@@ -151,6 +150,8 @@ layer at (13,1106) size 750x222
           text run at (0,144) width 343: "condimentum vestibulum. Suspendisse hendrerit quam"
           text run at (0,162) width 362: "nec felis. Sed varius turpis vitae pede. Lorem ipsum dolor"
           text run at (0,180) width 229: "sit amet, consectetuer adipiscing elit."
+      RenderBlock (anonymous) at (0,206) size 367x0
+        RenderText {#text} at (0,0) size 0x0
     RenderBlock (anonymous) at (0,222) size 367x198
       RenderText {#text} at (0,0) size 362x198
         text run at (0,0) width 354: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit."
index bf504f9..18ce638 100644 (file)
@@ -6,15 +6,13 @@ layer at (0,0) size 800x32
       RenderRuby (inline) {RUBY} at (0,0) size 64x16
         RenderRubyRun (anonymous) at (0,0) size 64x16
           RenderRubyBase (anonymous) at (0,0) size 64x16
-            RenderBlock (anonymous) at (0,0) size 64x16
-              RenderText {#text} at (0,0) size 64x16
-                text run at (0,0) width 64: "PASS"
-              RenderInline {I} at (0,0) size 0x0
-                RenderText {#text} at (0,0) size 0x0
-            RenderBlock (anonymous) at (0,16) size 64x0
+            RenderText {#text} at (0,0) size 64x16
+              text run at (0,0) width 64: "PASS"
+            RenderInline {I} at (0,0) size 0x0
+              RenderText {#text} at (0,0) size 0x0
+            RenderInline {I} at (0,0) size 0x0
               RenderInline {SPAN} at (0,0) size 0x0
                 RenderInline {SPAN} at (0,0) size 0x0
                   RenderText {#text} at (0,0) size 0x0
                   RenderText {#text} at (0,0) size 0x0
-            RenderBlock (anonymous) at (0,16) size 64x0
-              RenderInline {I} at (0,0) size 0x0
+            RenderInline {I} at (0,0) size 0x0
index f9e2d22..8a4c73f 100644 (file)
@@ -13,7 +13,7 @@ layer at (0,0) size 785x11400
               RenderBlock (anonymous) at (2,2) size 715x0
                 RenderInline {FONT} at (0,0) size 0x0
                   RenderText {#text} at (0,0) size 0x0
-              RenderBlock (anonymous) at (2,2) size 715x11374
+              RenderBlock (anonymous) at (2,2) size 715x52
                 RenderTable {TABLE} at (0,0) size 566x52 [border: (1px outset #808080)]
                   RenderTableSection {TBODY} at (1,1) size 564x50
                     RenderTableRow {TR} at (0,2) size 564x22
@@ -25,17 +25,19 @@ layer at (0,0) size 785x11400
                       RenderTableCell {TD} at (2,26) size 111x22 [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1]
                         RenderText {#text} at (2,2) size 107x17
                           text run at (2,2) width 107: "Search again..."
-                RenderBlock (anonymous) at (0,52) size 715x15
+              RenderBlock (anonymous) at (2,54) size 715x15
+                RenderInline {FONT} at (0,0) size 715x15
                   RenderText {#text} at (0,0) size 715x15
                     text run at (0,0) width 332: "This text node only exists once in the original document! "
                     text run at (332,0) width 307: "If it were a large collection of inlines, the page would "
                     text run at (639,0) width 76: "hang forever."
                   RenderInline {A} at (0,0) size 0x0
-                RenderBlock {H2} at (0,83) size 715x23
+              RenderBlock (anonymous) at (2,85) size 715x11291
+                RenderBlock {H2} at (0,0) size 715x23
                   RenderInline {A} at (0,0) size 169x22
                     RenderText {#text} at (0,0) size 169x22
                       text run at (0,0) width 169: "Table of Contents"
-                RenderBlock {P} at (0,122) size 715x150
+                RenderBlock {P} at (0,39) size 715x150
                   RenderInline {B} at (0,0) size 76x15
                     RenderInline {A} at (0,0) size 76x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 76x15
@@ -88,7 +90,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,135) size 217x15
                       text run at (0,135) width 217: "Related Documentation for This Book"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,285) size 715x990
+                RenderBlock {P} at (0,202) size 715x990
                   RenderInline {B} at (0,0) size 58x15
                     RenderInline {A} at (0,0) size 58x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 58x15
@@ -477,7 +479,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,975) size 100x15
                       text run at (0,975) width 100: "Table Collocation"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,1288) size 715x1995
+                RenderBlock {P} at (0,1205) size 715x1995
                   RenderInline {B} at (0,0) size 123x15
                     RenderInline {A} at (0,0) size 123x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 123x15
@@ -1268,7 +1270,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,1980) size 58x15
                       text run at (0,1980) width 58: "Examples"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,3296) size 715x1935
+                RenderBlock {P} at (0,3213) size 715x1935
                   RenderInline {B} at (0,0) size 62x15
                     RenderInline {A} at (0,0) size 62x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 62x15
@@ -2035,7 +2037,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,1920) size 136x15
                       text run at (0,1920) width 136: "User-Defined Functions"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,5244) size 715x345
+                RenderBlock {P} at (0,5161) size 715x345
                   RenderInline {B} at (0,0) size 48x15
                     RenderInline {A} at (0,0) size 48x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 48x15
@@ -2166,7 +2168,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,330) size 185x15
                       text run at (0,330) width 185: "Examples of a select-statement"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,5602) size 715x1770
+                RenderBlock {P} at (0,5519) size 715x1770
                   RenderInline {B} at (0,0) size 100x15
                     RenderInline {A} at (0,0) size 100x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 100x15
@@ -2867,7 +2869,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,1755) size 75x15
                       text run at (0,1755) width 75: "WHENEVER"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,7385) size 715x300
+                RenderBlock {P} at (0,7302) size 715x300
                   RenderInline {B} at (0,0) size 102x15
                     RenderInline {A} at (0,0) size 102x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 102x15
@@ -2980,13 +2982,13 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,285) size 105x15
                       text run at (0,285) width 105: "WHILE Statement"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,7698) size 715x15
+                RenderBlock {P} at (0,7615) size 715x15
                   RenderInline {B} at (0,0) size 150x15
                     RenderInline {A} at (0,0) size 150x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 150x15
                         text run at (0,0) width 150: "Appendix A. SQL Limits"
                   RenderBR {BR} at (150,12) size 0x0
-                RenderBlock {P} at (0,7726) size 715x90
+                RenderBlock {P} at (0,7643) size 715x90
                   RenderInline {B} at (0,0) size 274x15
                     RenderInline {A} at (0,0) size 274x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 274x15
@@ -3015,7 +3017,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,75) size 325x15
                       text run at (0,75) width 325: "DB2 Enterprise - Extended Edition Usage of the SQLCA"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,7829) size 715x165
+                RenderBlock {P} at (0,7746) size 715x165
                   RenderInline {B} at (0,0) size 264x15
                     RenderInline {A} at (0,0) size 264x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 264x15
@@ -3074,7 +3076,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,150) size 153x15
                       text run at (0,150) width 153: "SQLLEN Field for Decimal"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,8007) size 715x1095
+                RenderBlock {P} at (0,7924) size 715x1095
                   RenderInline {B} at (0,0) size 168x15
                     RenderInline {A} at (0,0) size 168x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 168x15
@@ -3505,7 +3507,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,1080) size 116x15
                       text run at (0,1080) width 116: "SYSSTAT.TABLES"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,9115) size 715x165
+                RenderBlock {P} at (0,9032) size 715x165
                   RenderInline {B} at (0,0) size 362x15
                     RenderInline {A} at (0,0) size 362x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 362x15
@@ -3564,7 +3566,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,150) size 147x15
                       text run at (0,150) width 147: "OBJCAT.TRANSFORMS"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,9293) size 715x240
+                RenderBlock {P} at (0,9210) size 715x240
                   RenderInline {B} at (0,0) size 197x15
                     RenderInline {A} at (0,0) size 197x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 197x15
@@ -3653,7 +3655,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,225) size 184x15
                       text run at (0,225) width 184: "Considerations and Restrictions"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,9546) size 715x390
+                RenderBlock {P} at (0,9463) size 715x390
                   RenderInline {B} at (0,0) size 233x15
                     RenderInline {A} at (0,0) size 233x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 233x15
@@ -3802,7 +3804,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,375) size 92x15
                       text run at (0,375) width 92: "Walker Resume"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,9949) size 715x90
+                RenderBlock {P} at (0,9866) size 715x90
                   RenderInline {B} at (0,0) size 369x15
                     RenderInline {A} at (0,0) size 369x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 369x15
@@ -3831,19 +3833,19 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,75) size 198x15
                       text run at (0,75) width 198: "ISO/ANS SQL92 Reserved Words"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,10052) size 715x15
+                RenderBlock {P} at (0,9969) size 715x15
                   RenderInline {B} at (0,0) size 269x15
                     RenderInline {A} at (0,0) size 269x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 269x15
                         text run at (0,0) width 269: "Appendix I. Comparison of Isolation Levels"
                   RenderBR {BR} at (269,12) size 0x0
-                RenderBlock {P} at (0,10080) size 715x15
+                RenderBlock {P} at (0,9997) size 715x15
                   RenderInline {B} at (0,0) size 318x15
                     RenderInline {A} at (0,0) size 318x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 318x15
                         text run at (0,0) width 318: "Appendix J. Interaction of Triggers and Constraints"
                   RenderBR {BR} at (318,12) size 0x0
-                RenderBlock {P} at (0,10108) size 715x315
+                RenderBlock {P} at (0,10025) size 715x315
                   RenderInline {B} at (0,0) size 270x15
                     RenderInline {A} at (0,0) size 270x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 270x15
@@ -3962,13 +3964,13 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,300) size 225x15
                       text run at (0,300) width 225: "ADVISE_WORKLOAD Table Definition"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,10436) size 715x15
+                RenderBlock {P} at (0,10353) size 715x15
                   RenderInline {B} at (0,0) size 227x15
                     RenderInline {A} at (0,0) size 227x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 227x15
                         text run at (0,0) width 227: "Appendix L. Explain Register Values"
                   RenderBR {BR} at (227,12) size 0x0
-                RenderBlock {P} at (0,10464) size 715x75
+                RenderBlock {P} at (0,10381) size 715x75
                   RenderInline {B} at (0,0) size 308x15
                     RenderInline {A} at (0,0) size 308x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 308x15
@@ -3991,7 +3993,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,60) size 169x15
                       text run at (0,60) width 169: "Example 3: Controlling Depth"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,10552) size 715x75
+                RenderBlock {P} at (0,10469) size 715x75
                   RenderInline {B} at (0,0) size 187x15
                     RenderInline {A} at (0,0) size 187x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 187x15
@@ -4014,7 +4016,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,60) size 179x15
                       text run at (0,60) width 179: "Querying the Exception Tables"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,10640) size 715x330
+                RenderBlock {P} at (0,10557) size 715x330
                   RenderInline {B} at (0,0) size 420x15
                     RenderInline {A} at (0,0) size 420x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 420x15
@@ -4139,13 +4141,13 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,315) size 63x15
                       text run at (0,315) width 63: "PREPARE"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,10983) size 715x15
+                RenderBlock {P} at (0,10900) size 715x15
                   RenderInline {B} at (0,0) size 295x15
                     RenderInline {A} at (0,0) size 295x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 295x15
                         text run at (0,0) width 295: "Appendix P. BNF Specifications for DATALINKs"
                   RenderBR {BR} at (295,12) size 0x0
-                RenderBlock {P} at (0,11011) size 715x180
+                RenderBlock {P} at (0,10928) size 715x180
                   RenderInline {B} at (0,0) size 217x15
                     RenderInline {A} at (0,0) size 217x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 217x15
@@ -4210,7 +4212,7 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,165) size 168x15
                       text run at (0,165) width 168: "Searching Information Online"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,11204) size 715x45
+                RenderBlock {P} at (0,11121) size 715x45
                   RenderInline {B} at (0,0) size 126x15
                     RenderInline {A} at (0,0) size 126x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 126x15
@@ -4221,13 +4223,13 @@ layer at (0,0) size 785x11400
                     RenderText {#text} at (0,30) size 69x15
                       text run at (0,30) width 69: "Trademarks"
                   RenderText {#text} at (0,0) size 0x0
-                RenderBlock {P} at (0,11262) size 715x15
+                RenderBlock {P} at (0,11179) size 715x15
                   RenderInline {B} at (0,0) size 34x15
                     RenderInline {A} at (0,0) size 34x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 34x15
                         text run at (0,0) width 34: "Index"
                   RenderBR {BR} at (34,12) size 0x0
-                RenderBlock {P} at (0,11290) size 715x45
+                RenderBlock {P} at (0,11207) size 715x45
                   RenderInline {B} at (0,0) size 95x15
                     RenderInline {A} at (0,0) size 95x15 [color=#0000EE]
                       RenderText {#text} at (0,0) size 95x15
@@ -4240,7 +4242,7 @@ layer at (0,0) size 785x11400
                   RenderText {#text} at (0,0) size 0x0
                   RenderInline {A} at (0,0) size 0x0
                   RenderText {#text} at (0,0) size 0x0
-                RenderTable {TABLE} at (0,11348) size 26x26
+                RenderTable {TABLE} at (0,11265) size 26x26
                   RenderTableSection {TBODY} at (0,0) size 26x26
                     RenderTableRow {TR} at (0,2) size 26x0
                     RenderTableRow {TR} at (0,4) size 26x20
index 32ccf8f..d8ce82a 100644 (file)
@@ -18,13 +18,11 @@ layer at (0,0) size 800x600
                         RenderBlock (anonymous) at (2,2) size 90x0
                           RenderInline {FONT} at (0,0) size 0x0
                             RenderText {#text} at (0,0) size 0x0
-                          RenderInline {FONT} at (0,0) size 0x0
                         RenderBlock {CENTER} at (2,2) size 90x13
                           RenderInline {FONT} at (0,0) size 24x13
                             RenderText {#text} at (33,0) size 24x13
                               text run at (33,0) width 24: "inside"
                           RenderText {#text} at (0,0) size 0x0
-                        RenderBlock (anonymous) at (2,15) size 90x0
                 RenderBlock (anonymous) at (0,23) size 100x18
                   RenderText {#text} at (10,0) size 80x18
                     text run at (10,0) width 80: "outside table"
index d1d5ffe..d22214f 100644 (file)
@@ -234,8 +234,6 @@ layer at (0,0) size 785x1308
                         text run at (240,0) width 48: " has no"
                         text run at (0,18) width 294: "special effect on the row data since it simply"
                         text run at (0,36) width 319: "reiterates the default horizontal row alignment!"
-                  RenderInline {B} at (0,0) size 0x0
-                    RenderInline {FONT} at (0,0) size 0x0 [color=#FF0000]
                 RenderBlock {P} at (2,72) size 336x0
                   RenderInline {B} at (0,0) size 0x0
                     RenderInline {FONT} at (0,0) size 0x0 [color=#FF0000]
@@ -280,8 +278,6 @@ layer at (0,0) size 785x1308
                         text run at (266,0) width 48: " has no"
                         text run at (0,18) width 297: "special effect on the row head since it simply"
                         text run at (0,36) width 319: "reiterates the default horizontal row alignment!"
-                  RenderInline {B} at (0,0) size 0x0
-                    RenderInline {FONT} at (0,0) size 0x0 [color=#FF0000]
                 RenderBlock {P} at (2,72) size 336x0
                   RenderInline {B} at (0,0) size 0x0
                     RenderInline {FONT} at (0,0) size 0x0 [color=#FF0000]
index c202219..ad7fa45 100644 (file)
@@ -1,3 +1,2 @@
 ALERT: PASS: element could not be re-appended
 This test passes if it does not trip an assert in debug builds. It ensures a readystatechange event can't get dispatched until after a plugin is fully removed.
-
index 10798fd..853110d 100644 (file)
@@ -41,7 +41,7 @@
         }
     });
 
-    document.getElementById("foo").className="trans";
+    setTimeout(function() { document.getElementById("foo").className="trans" }, 0);
     </script>
 
     <div id="result">
index 53c0bb1..5dc5031 100644 (file)
@@ -40,7 +40,7 @@
         checkRunning()
     });
 
-    document.getElementById("foo").className="trans";
+    setTimeout(function() { document.getElementById("foo").className="trans" }, 0);
 </script>
 
 <div id="result">
index 44097d9..262dfd7 100644 (file)
@@ -13,7 +13,7 @@
                 if (window.testRunner)
                     testRunner.notifyDone();
             });
-            el.style.cssText += ';-webkit-transition:background-color 0.2s;background-color:#fff'
+            setTimeout(function() { el.style.cssText += ';-webkit-transition:background-color 0.2s;background-color:#fff' }, 0);
         </script>
     </body>
 </html>
index 20b58cb..c009f9b 100644 (file)
@@ -1,3 +1,176 @@
+2013-12-19  Antti Koivisto  <antti@apple.com>
+
+        Create render tree lazily
+        https://bugs.webkit.org/show_bug.cgi?id=120685
+
+        Reviewed by Andreas Kling.
+
+        We currently recompute style and construct renderer for each DOM node immediately after they are added to 
+        the tree. This is often inefficient as the style may change immediately afterwards and the work needs to be
+        redone. 
+        
+        With this patch we always compute style and construct render tree lazily, either on style recalc timer or
+        synchronously when they are needed. It also removes the 'attached' bit. If document has render tree then
+        all nodes are conceptually "attached" even if this happens lazily.
+        
+        The patch slightly changes behavior of implicit CSS transitions. A synchronous style change during parsing
+        may not trigger the animation anymore as laziness means we don't see anything changing. This matches Firefox
+        and Chrome in our test cases.
+        
+        * WebCore.exp.in:
+        * bindings/js/JSNodeCustom.cpp:
+        (WebCore::JSNode::insertBefore):
+        (WebCore::JSNode::replaceChild):
+        (WebCore::JSNode::appendChild):
+        
+            All attaching is now lazy, remove AttachLazily.
+
+        * css/CSSComputedStyleDeclaration.cpp:
+        (WebCore::ComputedStyleExtractor::propertyValue):
+        
+            SVG renderers with !isValid() have empty display property value for some reason. Keep the behavior.
+
+        * dom/ContainerNode.cpp:
+        (WebCore::ContainerNode::insertBefore):
+        (WebCore::ContainerNode::parserInsertBefore):
+        (WebCore::ContainerNode::replaceChild):
+        (WebCore::ContainerNode::appendChild):
+        (WebCore::ContainerNode::parserAppendChild):
+        (WebCore::ContainerNode::updateTreeAfterInsertion):
+        * dom/ContainerNode.h:
+        * dom/Document.cpp:
+        (WebCore::Document::~Document):
+        (WebCore::Document::updateStyleIfNeeded):
+        (WebCore::Document::createRenderTree):
+        (WebCore::Document::destroyRenderTree):
+        
+            Remove attach bit maintenance.
+
+        (WebCore::Document::webkitDidExitFullScreenForElement):
+        
+            Do lazy render tree reconstruction after returning from full screen. That is the only reliable way
+            to get the render tree back to decent shape.
+
+        * dom/Element.cpp:
+        (WebCore::Element::isFocusable):
+        
+            Remove pointless !renderer()->needsLayout() assert.
+
+        (WebCore::Element::addShadowRoot):
+        (WebCore::Element::childShouldCreateRenderer):
+        (WebCore::Element::resetComputedStyle):
+        
+            Take care to reset computed style in all descendants. attachRenderTree no longer does this.
+
+        * dom/Element.h:
+        * dom/Node.cpp:
+        (WebCore::Node::insertBefore):
+        (WebCore::Node::replaceChild):
+        (WebCore::Node::appendChild):
+        (WebCore::Node::setNeedsStyleRecalc):
+        
+            Propagate ReconstructRenderTree.
+
+        (WebCore::Node::attached):
+        
+            Emulate the behavior of old attached bit for now so existing code calling this mostly stays working.
+
+        * dom/Node.h:
+        
+            Add new ReconstructRenderTree value for StyleChangeType.
+
+        * dom/Range.cpp:
+        (WebCore::Range::isPointInRange):
+        (WebCore::Range::comparePoint):
+        (WebCore::Range::compareNode):
+        (WebCore::Range::intersectsNode):
+        * editing/AppendNodeCommand.cpp:
+        (WebCore::AppendNodeCommand::doApply):
+        * editing/CompositeEditCommand.cpp:
+        (WebCore::CompositeEditCommand::canRebalance):
+        * editing/InsertNodeBeforeCommand.cpp:
+        (WebCore::InsertNodeBeforeCommand::doApply):
+        * html/HTMLDetailsElement.cpp:
+        (WebCore::HTMLDetailsElement::didAddUserAgentShadowRoot):
+        * html/HTMLDocument.cpp:
+        (WebCore::HTMLDocument::activeElement):
+        * html/HTMLElement.cpp:
+        (WebCore::HTMLElement::setInnerText):
+        
+            TextControlInnerTextElement always preserves newline even if it doesn't have style yet.
+
+        (WebCore::HTMLElement::supportsFocus):
+        * html/HTMLEmbedElement.cpp:
+        (WebCore::HTMLEmbedElement::parseAttribute):
+        * html/HTMLFormControlElement.cpp:
+        (WebCore::shouldAutofocus):
+        
+            Don't autofocus until we have renderer.
+
+        * html/HTMLFormControlElementWithState.cpp:
+        (WebCore::HTMLFormControlElementWithState::shouldSaveAndRestoreFormControlState):
+        * html/HTMLFrameElementBase.cpp:
+        (WebCore::HTMLFrameElementBase::didNotifySubtreeInsertions):
+        * html/HTMLInputElement.cpp:
+        (WebCore::HTMLInputElement::updateType):
+        
+            Lazy render tree construction.
+
+        (WebCore::HTMLInputElement::parseAttribute):
+        (WebCore::HTMLInputElement::defaultEventHandler):
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::parseAttribute):
+        * html/HTMLObjectElement.cpp:
+        (WebCore::HTMLObjectElement::parseAttribute):
+        * html/HTMLSummaryElement.cpp:
+        (WebCore::HTMLSummaryElement::didAddUserAgentShadowRoot):
+        * html/parser/HTMLConstructionSite.cpp:
+        (WebCore::executeTask):
+        
+            Don't attach renderer after construction.
+
+        * html/parser/HTMLTreeBuilder.cpp:
+        (WebCore::HTMLTreeBuilder::callTheAdoptionAgency):
+        * html/shadow/ContentDistributor.cpp:
+        (WebCore::ContentDistributor::invalidateDistribution):
+        * html/shadow/InsertionPoint.cpp:
+        (WebCore::InsertionPoint::willAttachRenderers):
+        (WebCore::InsertionPoint::willDetachRenderers):
+        * html/shadow/MediaControlElements.cpp:
+        (WebCore::MediaControlTextTrackContainerElement::updateDisplay):
+        * html/shadow/MediaControls.cpp:
+        (WebCore::MediaControls::createTextTrackDisplay):
+        * html/shadow/MediaControlsApple.cpp:
+        (WebCore::MediaControlsApple::createControls):
+        * html/track/TextTrackCue.cpp:
+        (WebCore::TextTrackCue::getDisplayTree):
+        * loader/PlaceholderDocument.cpp:
+        (WebCore::PlaceholderDocument::createRenderTree):
+        * loader/cache/CachedResourceLoader.cpp:
+        (WebCore::CachedResourceLoader::preload):
+        * style/StyleResolveTree.cpp:
+        (WebCore::Style::attachTextRenderer):
+        (WebCore::Style::detachTextRenderer):
+        
+            Remove attached bit maintenance.
+
+        (WebCore::Style::attachChildren):
+        (WebCore::Style::attachShadowRoot):
+        (WebCore::Style::attachRenderTree):
+        (WebCore::Style::detachShadowRoot):
+        (WebCore::Style::detachRenderTree):
+        (WebCore::Style::resolveLocal):
+        * svg/SVGTests.cpp:
+        (WebCore::SVGTests::handleAttributeChange):
+        
+            Make lazy.
+
+        * testing/Internals.cpp:
+        (WebCore::Internals::attached):
+        (WebCore::Internals::elementRenderTreeAsText):
+        (WebCore::Internals::markerAt):
+        (WebCore::Internals::nodesFromRect):
+
 2013-12-20  Andreas Kling  <akling@apple.com>
 
         Devirtualize RenderElement::setStyle().
index 7b03e3c..5d6d541 100644 (file)
@@ -257,7 +257,7 @@ __ZN7WebCore13AXObjectCache21gAccessibilityEnabledE
 __ZN7WebCore13AXObjectCache23focusedUIElementForPageEPKNS_4PageE
 __ZN7WebCore13AXObjectCache42gAccessibilityEnhancedUserInterfaceEnabledE
 __ZN7WebCore13CharacterData7setDataERKN3WTF6StringERi
-__ZN7WebCore13ContainerNode11appendChildEN3WTF10PassRefPtrINS_4NodeEEERiNS_14AttachBehaviorE
+__ZN7WebCore13ContainerNode11appendChildEN3WTF10PassRefPtrINS_4NodeEEERi
 __ZN7WebCore13ContainerNode11removeChildEPNS_4NodeERi
 __ZN7WebCore13GraphicsLayer11setChildrenERKN3WTF6VectorIPS0_Lm0ENS1_15CrashOnOverflowEEE
 __ZN7WebCore13GraphicsLayer12replaceChildEPS0_S1_
@@ -951,9 +951,9 @@ __ZN7WebCore4FontaSERKS0_
 __ZN7WebCore4Icon18createIconForFilesERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowEEE
 __ZN7WebCore4IconD1Ev
 __ZN7WebCore4Node10renderRectEPb
-__ZN7WebCore4Node11appendChildEN3WTF10PassRefPtrIS0_EERiNS_14AttachBehaviorE
+__ZN7WebCore4Node11appendChildEN3WTF10PassRefPtrIS0_EERi
 __ZN7WebCore4Node11removeChildEPS0_Ri
-__ZN7WebCore4Node12insertBeforeEN3WTF10PassRefPtrIS0_EEPS0_RiNS_14AttachBehaviorE
+__ZN7WebCore4Node12insertBeforeEN3WTF10PassRefPtrIS0_EEPS0_Ri
 __ZN7WebCore4Node14removedLastRefEv
 __ZN7WebCore4Node14setTextContentERKN3WTF6StringERi
 __ZN7WebCore4Node17stopIgnoringLeaksEv
@@ -1158,6 +1158,7 @@ __ZN7WebCore8Document14createTextNodeERKN3WTF6StringE
 __ZN7WebCore8Document16isPageBoxVisibleEi
 __ZN7WebCore8Document16shortcutIconURLsEv
 __ZN7WebCore8Document17setFocusedElementEN3WTF10PassRefPtrINS_7ElementEEENS_14FocusDirectionE
+__ZN7WebCore8Document19updateStyleIfNeededEv
 __ZN7WebCore8Document20styleResolverChangedENS_23StyleResolverUpdateFlagE
 __ZN7WebCore8Document22createDocumentFragmentEv
 __ZN7WebCore8Document23didAddWheelEventHandlerEv
index 6095086..3c2468c 100644 (file)
@@ -134,7 +134,7 @@ bool JSNodeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, v
 JSValue JSNode::insertBefore(ExecState* exec)
 {
     ExceptionCode ec = 0;
-    bool ok = impl().insertBefore(toNode(exec->argument(0)), toNode(exec->argument(1)), ec, AttachLazily);
+    bool ok = impl().insertBefore(toNode(exec->argument(0)), toNode(exec->argument(1)), ec);
     setDOMException(exec, ec);
     if (ok)
         return exec->argument(0);
@@ -144,7 +144,7 @@ JSValue JSNode::insertBefore(ExecState* exec)
 JSValue JSNode::replaceChild(ExecState* exec)
 {
     ExceptionCode ec = 0;
-    bool ok = impl().replaceChild(toNode(exec->argument(0)), toNode(exec->argument(1)), ec, AttachLazily);
+    bool ok = impl().replaceChild(toNode(exec->argument(0)), toNode(exec->argument(1)), ec);
     setDOMException(exec, ec);
     if (ok)
         return exec->argument(1);
@@ -164,7 +164,7 @@ JSValue JSNode::removeChild(ExecState* exec)
 JSValue JSNode::appendChild(ExecState* exec)
 {
     ExceptionCode ec = 0;
-    bool ok = impl().appendChild(toNode(exec->argument(0)), ec, AttachLazily);
+    bool ok = impl().appendChild(toNode(exec->argument(0)), ec);
     setDOMException(exec, ec);
     if (ok)
         return exec->argument(0);
index 24c064c..aadb76b 100644 (file)
@@ -58,6 +58,7 @@
 #include "RenderBox.h"
 #include "RenderStyle.h"
 #include "RenderView.h"
+#include "SVGElement.h"
 #include "StyleInheritedData.h"
 #include "StyleProperties.h"
 #include "StylePropertyShorthand.h"
@@ -1757,9 +1758,14 @@ PassRefPtr<CSSValue> ComputedStyleExtractor::propertyValue(CSSPropertyID propert
             styledNode = this->styledNode();
         }
 
-        style = computeRenderStyleForProperty(styledNode, m_pseudoElementSpecifier, propertyID);
         renderer = styledNode->renderer();
 
+#if ENABLE(SVG)
+        if (propertyID == CSSPropertyDisplay && !renderer && isSVGElement(*styledNode) && !toSVGElement(*styledNode).isValid())
+            return nullptr;
+#endif
+        style = computeRenderStyleForProperty(styledNode, m_pseudoElementSpecifier, propertyID);
+
         // FIXME: Some of these cases could be narrowed down or optimized better.
         forceFullLayout = isLayoutDependent(propertyID, style.get(), renderer)
             || styledNode->isInShadowTree()
index 2f458c8..8fe2eca 100644 (file)
@@ -258,7 +258,7 @@ static inline bool checkReplaceChild(ContainerNode* newParent, Node* newChild, N
     return true;
 }
 
-bool ContainerNode::insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode& ec, AttachBehavior attachBehavior)
+bool ContainerNode::insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode& ec)
 {
     // Check that this node is not "floating".
     // If it is, it can be deleted as a side effect of sending mutation events.
@@ -270,7 +270,7 @@ bool ContainerNode::insertBefore(PassRefPtr<Node> newChild, Node* refChild, Exce
 
     // insertBefore(node, 0) is equivalent to appendChild(node)
     if (!refChild)
-        return appendChild(newChild, ec, attachBehavior);
+        return appendChild(newChild, ec);
 
     // Make sure adding the new child is OK.
     if (!checkAddChild(this, newChild.get(), ec))
@@ -317,7 +317,7 @@ bool ContainerNode::insertBefore(PassRefPtr<Node> newChild, Node* refChild, Exce
 
         insertBeforeCommon(next.get(), child);
 
-        updateTreeAfterInsertion(child, attachBehavior);
+        updateTreeAfterInsertion(child);
     }
 
     dispatchSubtreeModifiedEvent();
@@ -396,9 +396,11 @@ void ContainerNode::parserInsertBefore(PassRefPtr<Node> newChild, Node* nextChil
     notifyChildInserted(*newChild, ChildChangeSourceParser);
 
     ChildNodeInsertionNotifier(*this).notify(*newChild);
+
+    newChild->setNeedsStyleRecalc(ReconstructRenderTree);
 }
 
-bool ContainerNode::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode& ec, AttachBehavior attachBehavior)
+bool ContainerNode::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode& ec)
 {
     // Check that this node is not "floating".
     // If it is, it can be deleted as a side effect of sending mutation events.
@@ -478,7 +480,7 @@ bool ContainerNode::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, Exce
                 appendChildToContainer(&child, *this);
         }
 
-        updateTreeAfterInsertion(child, attachBehavior);
+        updateTreeAfterInsertion(child);
     }
 
     dispatchSubtreeModifiedEvent();
@@ -674,7 +676,7 @@ void ContainerNode::removeChildren()
     dispatchSubtreeModifiedEvent();
 }
 
-bool ContainerNode::appendChild(PassRefPtr<Node> newChild, ExceptionCode& ec, AttachBehavior attachBehavior)
+bool ContainerNode::appendChild(PassRefPtr<Node> newChild, ExceptionCode& ec)
 {
     Ref<ContainerNode> protect(*this);
 
@@ -724,7 +726,7 @@ bool ContainerNode::appendChild(PassRefPtr<Node> newChild, ExceptionCode& ec, At
             appendChildToContainer(&child, *this);
         }
 
-        updateTreeAfterInsertion(child, attachBehavior);
+        updateTreeAfterInsertion(child);
     }
 
     dispatchSubtreeModifiedEvent();
@@ -757,6 +759,8 @@ void ContainerNode::parserAppendChild(PassRefPtr<Node> newChild)
     notifyChildInserted(*newChild, ChildChangeSourceParser);
 
     ChildNodeInsertionNotifier(*this).notify(*newChild);
+
+    newChild->setNeedsStyleRecalc(ReconstructRenderTree);
 }
 
 void ContainerNode::suspendPostAttachCallbacks()
@@ -1065,7 +1069,7 @@ static void dispatchChildRemovalEvents(Node& child)
     }
 }
 
-void ContainerNode::updateTreeAfterInsertion(Node& child, AttachBehavior attachBehavior)
+void ContainerNode::updateTreeAfterInsertion(Node& child)
 {
     ASSERT(child.refCount());
 
@@ -1075,19 +1079,7 @@ void ContainerNode::updateTreeAfterInsertion(Node& child, AttachBehavior attachB
 
     ChildNodeInsertionNotifier(*this).notify(child);
 
-    // FIXME: Attachment should be the first operation in this function, but some code
-    // (for example, HTMLFormControlElement's autofocus support) requires this ordering.
-    if (attached() && !child.attached() && child.parentNode() == this) {
-        if (attachBehavior == AttachLazily) {
-            if (child.isElementNode())
-                toElement(child).lazyAttach();
-            else if (child.isTextNode()) {
-                child.setAttached(true);
-                child.setNeedsStyleRecalc();
-            }
-        } else
-            attachChild(child);
-    }
+    child.setNeedsStyleRecalc(ReconstructRenderTree);
 
     dispatchChildInsertionEvents(child);
 }
index 205cc06..c8a1d41 100644 (file)
@@ -90,10 +90,10 @@ public:
     unsigned childNodeCount() const;
     Node* childNode(unsigned index) const;
 
-    bool insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode& = ASSERT_NO_EXCEPTION, AttachBehavior = AttachNow);
-    bool replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode& = ASSERT_NO_EXCEPTION, AttachBehavior = AttachNow);
+    bool insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode& = ASSERT_NO_EXCEPTION);
+    bool replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode& = ASSERT_NO_EXCEPTION);
     bool removeChild(Node* child, ExceptionCode& = ASSERT_NO_EXCEPTION);
-    bool appendChild(PassRefPtr<Node> newChild, ExceptionCode& = ASSERT_NO_EXCEPTION, AttachBehavior = AttachNow);
+    bool appendChild(PassRefPtr<Node> newChild, ExceptionCode& = ASSERT_NO_EXCEPTION);
 
     // These methods are only used during parsing.
     // They don't send DOM mutation events or handle reparenting.
@@ -168,7 +168,7 @@ private:
     void notifyChildInserted(Node& child, ChildChangeSource);
     void notifyChildRemoved(Node& child, Node* previousSibling, Node* nextSibling, ChildChangeSource);
 
-    void updateTreeAfterInsertion(Node& child, AttachBehavior);
+    void updateTreeAfterInsertion(Node& child);
 
     bool isContainerNode() const WTF_DELETED_FUNCTION;
 
index 3fb9ebc..cddcee0 100644 (file)
@@ -559,7 +559,6 @@ Document::~Document()
     ASSERT(!renderView());
     ASSERT(!m_inPageCache);
     ASSERT(m_ranges.isEmpty());
-    ASSERT(!m_styleRecalcTimer.isActive());
     ASSERT(!m_parentTreeScope);
 
 #if ENABLE(DEVICE_ORIENTATION) && PLATFORM(IOS)
@@ -1795,7 +1794,10 @@ void Document::recalcStyle(Style::Change change)
 void Document::updateStyleIfNeeded()
 {
     ASSERT(isMainThread());
-    ASSERT(!view() || (!view()->isInLayout() && !view()->isPainting()));
+    ASSERT(!view() || !view()->isPainting());
+
+    if (!view() || view()->isInLayout())
+        return;
 
     if (m_optimizedStyleSheetUpdateTimer.isActive())
         styleResolverChanged(RecalcStyleIfNeeded);
@@ -1965,8 +1967,6 @@ void Document::createRenderTree()
 
     if (m_documentElement)
         Style::attachRenderTree(*m_documentElement);
-
-    setAttached(true);
 }
 
 static void pageWheelEventHandlerCountChanged(Page& page)
@@ -2059,7 +2059,6 @@ void Document::destroyRenderTree()
         Style::detachRenderTree(*m_documentElement);
 
     clearChildNeedsStyleRecalc();
-    setAttached(false);
 
     unscheduleStyleRecalc();
 
@@ -5440,6 +5439,9 @@ void Document::webkitDidExitFullScreenForElement(Element*)
     if (m_fullScreenRenderer)
         m_fullScreenRenderer->unwrapRenderer();
 
+    if (m_fullScreenElement->parentNode())
+        m_fullScreenElement->parentNode()->setNeedsStyleRecalc(ReconstructRenderTree);
+
     m_fullScreenElement = nullptr;
     scheduleForcedStyleRecalc();
     
index 03c2208..2d07af2 100644 (file)
@@ -36,6 +36,7 @@
 #include "ContainerNodeAlgorithms.h"
 #include "DOMTokenList.h"
 #include "DocumentSharedObjectPool.h"
+#include "ElementIterator.h"
 #include "ElementRareData.h"
 #include "EventDispatcher.h"
 #include "FlowThreadController.h"
@@ -461,12 +462,10 @@ bool Element::isFocusable() const
         return e->renderer() && e->renderer()->style().visibility() == VISIBLE;
     }
 
-    if (renderer())
-        ASSERT(!renderer()->needsLayout());
-    else {
+    if (!renderer()) {
         // If the node is in a display:none tree it might say it needs style recalc but
         // the whole document is actually up to date.
-        ASSERT(!document().childNeedsStyleRecalc());
+        ASSERT(!needsStyleRecalc() || !document().childNeedsStyleRecalc());
     }
 
     // FIXME: Even if we are not visible, we might have a child that is visible.
@@ -1448,28 +1447,6 @@ void Element::unregisterNamedFlowContentElement()
         document().renderView()->flowThreadController().unregisterNamedFlowContentElement(*this);
 }
 
-void Element::lazyReattach(ShouldSetAttached shouldSetAttached)
-{
-    if (attached())
-        Style::detachRenderTreeInReattachMode(*this);
-    lazyAttach(shouldSetAttached);
-}
-
-void Element::lazyAttach(ShouldSetAttached shouldSetAttached)
-{
-    for (Node* node = this; node; node = NodeTraversal::next(node, this)) {
-        if (!node->isTextNode() && !node->isElementNode())
-            continue;
-        if (node->hasChildNodes())
-            node->setChildNeedsStyleRecalc();
-        if (node->isElementNode())
-            toElement(node)->setStyleChange(FullStyleChange);
-        if (shouldSetAttached == SetAttached)
-            node->setAttached(true);
-    }
-    markAncestorsWithChildNeedsStyleRecalc();
-}
-
 PassRef<RenderStyle> Element::styleForRenderer()
 {
     if (hasCustomStyleResolveCallbacks()) {
@@ -1523,7 +1500,7 @@ void Element::addShadowRoot(PassRefPtr<ShadowRoot> newShadowRoot)
     // Set some flag here and recreate shadow hosts' renderer in
     // Element::recalcStyle.
     if (attached())
-        lazyReattach();
+        setNeedsStyleRecalc(ReconstructRenderTree);
 
     InspectorInstrumentation::didPushShadowRoot(this, shadowRoot);
 }
@@ -2533,8 +2510,10 @@ bool Element::childShouldCreateRenderer(const Node& child) const
 {
 #if ENABLE(SVG)
     // Only create renderers for SVG elements whose parents are SVG elements, or for proper <svg xmlns="svgNS"> subdocuments.
-    if (child.isSVGElement())
-        return child.hasTagName(SVGNames::svgTag) || isSVGElement();
+    if (child.isSVGElement()) {
+        ASSERT(!isSVGElement());
+        return child.hasTagName(SVGNames::svgTag) && toSVGElement(child).isValid();
+    }
 #endif
     return ContainerNode::childShouldCreateRenderer(child);
 }
@@ -2952,9 +2931,13 @@ void Element::detachAllAttrNodesFromElement()
 
 void Element::resetComputedStyle()
 {
-    if (!hasRareData())
+    if (!hasRareData() || !elementRareData()->computedStyle())
         return;
     elementRareData()->resetComputedStyle();
+    for (auto& child : elementDescendants(*this)) {
+        if (child.hasRareData())
+            child.elementRareData()->resetComputedStyle();
+    }
 }
 
 void Element::clearStyleDerivedDataBeforeDetachingRenderer()
index 0fa9a61..ea26a5c 100644 (file)
@@ -304,12 +304,7 @@ public:
 
     virtual void copyNonAttributePropertiesFromElement(const Element&) { }
 
-    enum ShouldSetAttached {
-        SetAttached,
-        DoNotSetAttached
-    };
-    void lazyAttach(ShouldSetAttached = SetAttached);
-    void lazyReattach(ShouldSetAttached = SetAttached);
+    void lazyReattach();
 
     virtual RenderElement* createRenderer(PassRef<RenderStyle>);
     virtual bool rendererIsNeeded(const RenderStyle&);
index c0ca163..b9e536c 100644 (file)
@@ -420,22 +420,22 @@ Node* Node::firstDescendant() const
     return n;
 }
 
-bool Node::insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode& ec, AttachBehavior attachBehavior)
+bool Node::insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode& ec)
 {
     if (!isContainerNode()) {
         ec = HIERARCHY_REQUEST_ERR;
         return false;
     }
-    return toContainerNode(this)->insertBefore(newChild, refChild, ec, attachBehavior);
+    return toContainerNode(this)->insertBefore(newChild, refChild, ec);
 }
 
-bool Node::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode& ec, AttachBehavior attachBehavior)
+bool Node::replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode& ec)
 {
     if (!isContainerNode()) {
         ec = HIERARCHY_REQUEST_ERR;
         return false;
     }
-    return toContainerNode(this)->replaceChild(newChild, oldChild, ec, attachBehavior);
+    return toContainerNode(this)->replaceChild(newChild, oldChild, ec);
 }
 
 bool Node::removeChild(Node* oldChild, ExceptionCode& ec)
@@ -447,13 +447,13 @@ bool Node::removeChild(Node* oldChild, ExceptionCode& ec)
     return toContainerNode(this)->removeChild(oldChild, ec);
 }
 
-bool Node::appendChild(PassRefPtr<Node> newChild, ExceptionCode& ec, AttachBehavior attachBehavior)
+bool Node::appendChild(PassRefPtr<Node> newChild, ExceptionCode& ec)
 {
     if (!isContainerNode()) {
         ec = HIERARCHY_REQUEST_ERR;
         return false;
     }
-    return toContainerNode(this)->appendChild(newChild, ec, attachBehavior);
+    return toContainerNode(this)->appendChild(newChild, ec);
 }
 
 void Node::remove(ExceptionCode& ec)
@@ -673,14 +673,14 @@ void Node::derefEventTarget()
 void Node::setNeedsStyleRecalc(StyleChangeType changeType)
 {
     ASSERT(changeType != NoStyleChange);
-    if (!attached()) // changed compared to what?
+    if (changeType != ReconstructRenderTree && !attached()) // changed compared to what?
         return;
 
     StyleChangeType existingChangeType = styleChangeType();
     if (changeType > existingChangeType)
         setStyleChange(changeType);
 
-    if (existingChangeType == NoStyleChange)
+    if (existingChangeType == NoStyleChange || changeType == ReconstructRenderTree)
         markAncestorsWithChildNeedsStyleRecalc();
 }
 
@@ -2297,6 +2297,13 @@ void Node::updateAncestorConnectedSubframeCountForInsertion() const
         node->incrementConnectedSubframeCount(count);
 }
 
+bool Node::attached() 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);
+}
+
 } // namespace WebCore
 
 #ifndef NDEBUG
index e7a4a15..c15da30 100644 (file)
@@ -97,7 +97,8 @@ enum StyleChangeType {
     NoStyleChange = 0, 
     InlineStyleChange = 1 << nodeStyleChangeShift, 
     FullStyleChange = 2 << nodeStyleChangeShift, 
-    SyntheticStyleChange = 3 << nodeStyleChangeShift
+    SyntheticStyleChange = 3 << nodeStyleChangeShift,
+    ReconstructRenderTree = 4 << nodeStyleChangeShift,
 };
 
 class NodeRareDataBase {
@@ -114,11 +115,6 @@ private:
     RenderObject* m_renderer;
 };
 
-enum AttachBehavior {
-    AttachNow,
-    AttachLazily,
-};
-
 class Node : public EventTarget, public ScriptWrappable, public TreeShared<Node> {
     friend class Document;
     friend class TreeScope;
@@ -189,10 +185,10 @@ public:
     // These should all actually return a node, but this is only important for language bindings,
     // which will already know and hold a ref on the right node to return. Returning bool allows
     // these methods to be more efficient since they don't need to return a ref
-    bool insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode&, AttachBehavior = AttachNow);
-    bool replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode&, AttachBehavior = AttachNow);
+    bool insertBefore(PassRefPtr<Node> newChild, Node* refChild, ExceptionCode&);
+    bool replaceChild(PassRefPtr<Node> newChild, Node* oldChild, ExceptionCode&);
     bool removeChild(Node* child, ExceptionCode&);
-    bool appendChild(PassRefPtr<Node> newChild, ExceptionCode&, AttachBehavior = AttachNow);
+    bool appendChild(PassRefPtr<Node> newChild, ExceptionCode&);
 
     void remove(ExceptionCode&);
     bool hasChildNodes() const { return firstChild(); }
@@ -313,8 +309,7 @@ public:
     bool isUserActionElement() const { return getFlag(IsUserActionElement); }
     void setUserActionElement(bool flag) { setFlag(flag, IsUserActionElement); }
 
-    bool attached() const { return getFlag(IsAttachedFlag); }
-    void setAttached(bool flag) { setFlag(flag, IsAttachedFlag); }
+    bool attached() const;
     bool needsStyleRecalc() const { return styleChangeType() != NoStyleChange; }
     StyleChangeType styleChangeType() const { return static_cast<StyleChangeType>(m_nodeFlags & StyleChangeMask); }
     bool childNeedsStyleRecalc() const { return getFlag(ChildNeedsStyleRecalcFlag); }
@@ -572,7 +567,6 @@ protected:
         IsStyledElementFlag = 1 << 3,
         IsHTMLFlag = 1 << 4,
         IsSVGFlag = 1 << 5,
-        IsAttachedFlag = 1 << 6,
         ChildNeedsStyleRecalcFlag = 1 << 7,
         InDocumentFlag = 1 << 8,
         IsLinkFlag = 1 << 9,
@@ -584,8 +578,7 @@ protected:
         // be stored in the same memory word as the Node bits above.
         IsParsingChildrenFinishedFlag = 1 << 13, // Element
 
-        StyleChangeMask = 1 << nodeStyleChangeShift | 1 << (nodeStyleChangeShift + 1),
-        SelfOrAncestorHasDirAutoFlag = 1 << 16,
+        StyleChangeMask = 1 << nodeStyleChangeShift | 1 << (nodeStyleChangeShift + 1) | 1 << (nodeStyleChangeShift + 2),
         IsEditingTextFlag = 1 << 17,
         InNamedFlowFlag = 1 << 18,
         HasSyntheticAttrChildNodesFlag = 1 << 19,
@@ -600,6 +593,8 @@ protected:
         ChildrenAffectedByDirectAdjacentRulesFlag = 1 << 27,
         ChildrenAffectedByHoverRulesFlag = 1 << 28,
 
+        SelfOrAncestorHasDirAutoFlag = 1 << 29,
+
         DefaultNodeFlags = IsParsingChildrenFinishedFlag
     };
 
index 6589a3a..12d08ee 100644 (file)
@@ -311,7 +311,7 @@ bool Range::isPointInRange(Node* refNode, int offset, ExceptionCode& ec)
         return false;
     }
 
-    if (!refNode->attached() || &refNode->document() != &ownerDocument()) {
+    if (!refNode->inDocument() || &refNode->document() != &ownerDocument()) {
         return false;
     }
 
@@ -340,7 +340,7 @@ short Range::comparePoint(Node* refNode, int offset, ExceptionCode& ec) const
         return 0;
     }
 
-    if (!refNode->attached() || &refNode->document() != &ownerDocument()) {
+    if (!refNode->inDocument() || &refNode->document() != &ownerDocument()) {
         ec = WRONG_DOCUMENT_ERR;
         return 0;
     }
@@ -376,12 +376,12 @@ Range::CompareResults Range::compareNode(Node* refNode, ExceptionCode& ec) const
         return NODE_BEFORE;
     }
     
-    if (!m_start.container() && refNode->attached()) {
+    if (!m_start.container() && refNode->inDocument()) {
         ec = INVALID_STATE_ERR;
         return NODE_BEFORE;
     }
 
-    if (m_start.container() && !refNode->attached()) {
+    if (m_start.container() && !refNode->inDocument()) {
         // Firefox doesn't throw an exception for this case; it returns 0.
         return NODE_BEFORE;
     }
@@ -591,7 +591,7 @@ bool Range::intersectsNode(Node* refNode, ExceptionCode& ec)
         return false;
     }
 
-    if (!refNode->attached() || &refNode->document() != &ownerDocument()) {
+    if (!refNode->inDocument() || &refNode->document() != &ownerDocument()) {
         // Firefox doesn't throw an exception for these cases; it returns false.
         return false;
     }
index 6298184..af3ce1f 100644 (file)
@@ -61,7 +61,7 @@ void AppendNodeCommand::doApply()
     if (!m_parent->rendererIsEditable() && m_parent->attached())
         return;
 
-    m_parent->appendChild(m_node.get(), IGNORE_EXCEPTION, AttachLazily);
+    m_parent->appendChild(m_node.get(), IGNORE_EXCEPTION);
 
     if (AXObjectCache::accessibilityEnabled())
         sendAXTextChangedIgnoringLineBreaks(m_node.get(), AXObjectCache::AXTextInserted);
index 9f20ebb..05f2eaa 100644 (file)
@@ -626,6 +626,8 @@ bool CompositeEditCommand::canRebalance(const Position& position) const
     if (textNode->length() == 0)
         return false;
 
+    node->document().updateStyleIfNeeded();
+
     RenderObject* renderer = textNode->renderer();
     if (renderer && !renderer->style().collapseWhiteSpace())
         return false;
index 94f98ef..86e6822 100644 (file)
@@ -55,7 +55,7 @@ void InsertNodeBeforeCommand::doApply()
         return;
     ASSERT(parent->isContentEditable(Node::UserSelectAllIsAlwaysNonEditable));
 
-    parent->insertBefore(m_insertChild.get(), m_refChild.get(), IGNORE_EXCEPTION, AttachLazily);
+    parent->insertBefore(m_insertChild.get(), m_refChild.get(), IGNORE_EXCEPTION);
 
     if (AXObjectCache* cache = document().existingAXObjectCache())
         cache->nodeTextChangeNotification(m_insertChild.get(), AXObjectCache::AXTextInserted, 0, m_insertChild->nodeValue());
index 3073271..ea38790 100644 (file)
@@ -117,8 +117,8 @@ RenderElement* HTMLDetailsElement::createRenderer(PassRef<RenderStyle> style)
 
 void HTMLDetailsElement::didAddUserAgentShadowRoot(ShadowRoot* root)
 {
-    root->appendChild(DetailsSummaryElement::create(document()), ASSERT_NO_EXCEPTION, AttachLazily);
-    root->appendChild(DetailsContentElement::create(document()), ASSERT_NO_EXCEPTION, AttachLazily);
+    root->appendChild(DetailsSummaryElement::create(document()), ASSERT_NO_EXCEPTION);
+    root->appendChild(DetailsContentElement::create(document()), ASSERT_NO_EXCEPTION);
 }
 
 Element* HTMLDetailsElement::findMainSummary() const
index f4821ce..1521fba 100644 (file)
@@ -139,6 +139,7 @@ void HTMLDocument::setDesignMode(const String& value)
 
 Element* HTMLDocument::activeElement()
 {
+    document().updateStyleIfNeeded();
     if (Element* element = treeScope().focusedElement())
         return element;
     return body();
index cee9bab..f0f9f28 100644 (file)
@@ -39,6 +39,7 @@
 #include "ExceptionCode.h"
 #include "Frame.h"
 #include "FrameLoader.h"
+#include "FrameView.h"
 #include "HTMLBRElement.h"
 #include "HTMLCollection.h"
 #include "HTMLDocument.h"
@@ -478,7 +479,7 @@ void HTMLElement::setInnerText(const String& text, ExceptionCode& ec)
     // FIXME: Can the renderer be out of date here? Do we need to call updateStyleIfNeeded?
     // For example, for the contents of textarea elements that are display:none?
     auto r = renderer();
-    if (r && r->style().preserveNewline()) {
+    if ((r && r->style().preserveNewline()) || (inDocument() && isTextControlInnerTextElement())) {
         if (!text.contains('\r')) {
             replaceChildrenWithText(*this, text, ec);
             return;
@@ -661,6 +662,8 @@ bool HTMLElement::hasCustomFocusLogic() const
 
 bool HTMLElement::supportsFocus() const
 {
+    if (!document().view()->isInLayout())
+        document().updateStyleIfNeeded();
     return Element::supportsFocus() || (rendererIsEditable() && parentNode() && !parentNode()->rendererIsEditable());
 }
 
index 6187c93..a0183b9 100644 (file)
@@ -105,6 +105,7 @@ void HTMLEmbedElement::parseAttribute(const QualifiedName& name, const AtomicStr
         m_url = stripLeadingAndTrailingHTMLSpaces(value);
     else if (name == srcAttr) {
         m_url = stripLeadingAndTrailingHTMLSpaces(value);
+        document().updateStyleIfNeeded();
         if (renderer() && isImageType()) {
             if (!m_imageLoader)
                 m_imageLoader = adoptPtr(new HTMLImageLoader(this));
index 79ab37e..fa6cb4c 100644 (file)
@@ -170,9 +170,11 @@ void HTMLFormControlElement::requiredAttributeChanged()
 
 static bool shouldAutofocus(HTMLFormControlElement* element)
 {
+    if (!element->renderer())
+        return false;
     if (!element->fastHasAttribute(autofocusAttr))
         return false;
-    if (!element->renderer())
+    if (!element->inDocument() || !element->document().renderView())
         return false;
     if (element->document().ignoreAutofocus())
         return false;
index 5e459ea..d16577f 100644 (file)
@@ -77,7 +77,7 @@ void HTMLFormControlElementWithState::notifyFormStateChanged()
 bool HTMLFormControlElementWithState::shouldSaveAndRestoreFormControlState() const
 {
     // We don't save/restore control state in a form with autocomplete=off.
-    return attached() && shouldAutocomplete();
+    return inDocument() && shouldAutocomplete();
 }
 
 FormControlState HTMLFormControlElementWithState::saveFormControlState() const
index b3dc731..76d947f 100644 (file)
@@ -162,14 +162,8 @@ void HTMLFrameElementBase::didNotifySubtreeInsertions(ContainerNode*)
     if (!SubframeLoadingDisabler::canLoadFrame(*this))
         return;
 
-    // JavaScript in src=javascript: and beforeonload can access the renderer
-    // during attribute parsing *before* the normal parser machinery would
-    // attach the element. To support this, we lazyAttach here, but only
-    // if we don't already have a renderer (if we're inserted
-    // as part of a DocumentFragment, insertedInto from an earlier element
-    // could have forced a style resolve and already attached us).
     if (!renderer())
-        lazyAttach(DoNotSetAttached);
+        setNeedsStyleRecalc(ReconstructRenderTree);
     setNameAndOpenURL();
 }
 
index 37e88b4..0cf2cc6 100644 (file)
@@ -471,10 +471,6 @@ void HTMLInputElement::updateType()
 
     m_inputType->destroyShadowSubtree();
 
-    bool wasAttached = attached();
-    if (wasAttached)
-        Style::detachRenderTree(*this);
-
     m_inputType = std::move(newType);
     m_inputType->createShadowSubtree();
 
@@ -523,11 +519,11 @@ void HTMLInputElement::updateType()
             attributeChanged(alignAttr, align->value());
     }
 
-    if (wasAttached) {
-        Style::attachRenderTree(*this);
-        if (document().focusedElement() == this)
-            updateFocusAppearance(true);
-    }
+    if (renderer())
+        setNeedsStyleRecalc(ReconstructRenderTree);
+
+    if (document().focusedElement() == this)
+        updateFocusAppearance(true);
 
     if (ShadowRoot* shadowRoot = shadowRootOfParentForDistribution(this))
         shadowRoot->invalidateDistribution();
@@ -688,7 +684,7 @@ void HTMLInputElement::parseAttribute(const QualifiedName& name, const AtomicStr
         m_maxResults = !value.isNull() ? std::min(value.toInt(), maxSavedResults) : -1;
         // FIXME: Detaching just for maxResults change is not ideal.  We should figure out the right
         // time to relayout for this change.
-        if (m_maxResults != oldResults && (m_maxResults <= 0 || oldResults <= 0) && attached())
+        if (m_maxResults != oldResults && (m_maxResults <= 0 || oldResults <= 0) && renderer())
             Style::reattachRenderTree(*this);
         setNeedsStyleRecalc();
         FeatureObserver::observe(&document(), FeatureObserver::ResultsAttribute);
@@ -745,8 +741,7 @@ void HTMLInputElement::parseAttribute(const QualifiedName& name, const AtomicStr
             Style::detachRenderTree(*this);
             m_inputType->destroyShadowSubtree();
             m_inputType->createShadowSubtree();
-            if (!attached())
-                Style::attachRenderTree(*this);
+            Style::attachRenderTree(*this);
         } else {
             m_inputType->destroyShadowSubtree();
             m_inputType->createShadowSubtree();
@@ -1202,6 +1197,7 @@ void HTMLInputElement::defaultEventHandler(Event* evt)
             return;
     }
 
+    document().updateStyleIfNeeded();
     m_inputType->forwardEvent(evt);
 
     if (!callBaseClassEarly && !evt->defaultHandled())
index 503821d..7ab0fc2 100644 (file)
@@ -734,7 +734,7 @@ void HTMLMediaElement::removedFrom(ContainerNode& insertionPoint)
 
 void HTMLMediaElement::willAttachRenderers()
 {
-    ASSERT(!attached());
+    ASSERT(!renderer());
 
 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
     if (shouldUseVideoPluginProxy())
@@ -5106,7 +5106,7 @@ bool HTMLMediaElement::createMediaControls()
     if (isFullscreen())
         mediaControls->enteredFullscreen();
 
-    ensureUserAgentShadowRoot().appendChild(mediaControls, ASSERT_NO_EXCEPTION, AttachLazily);
+    ensureUserAgentShadowRoot().appendChild(mediaControls, ASSERT_NO_EXCEPTION);
 
     if (!controls() || !inDocument())
         mediaControls->hide();
index 4812f1b..ddfb0c7 100644 (file)
@@ -115,6 +115,7 @@ void HTMLObjectElement::parseAttribute(const QualifiedName& name, const AtomicSt
             setNeedsWidgetUpdate(true);
     } else if (name == dataAttr) {
         m_url = stripLeadingAndTrailingHTMLSpaces(value);
+        document().updateStyleIfNeeded();
         if (renderer()) {
             setNeedsWidgetUpdate(true);
             if (isImageType()) {
index ba19d33..137a5d1 100644 (file)
@@ -79,8 +79,8 @@ bool HTMLSummaryElement::childShouldCreateRenderer(const Node& child) const
 
 void HTMLSummaryElement::didAddUserAgentShadowRoot(ShadowRoot* root)
 {
-    root->appendChild(DetailsMarkerControl::create(document()), ASSERT_NO_EXCEPTION, AttachLazily);
-    root->appendChild(SummaryContentElement::create(document()), ASSERT_NO_EXCEPTION, AttachLazily);
+    root->appendChild(DetailsMarkerControl::create(document()), ASSERT_NO_EXCEPTION);
+    root->appendChild(SummaryContentElement::create(document()), ASSERT_NO_EXCEPTION);
 }
 
 HTMLDetailsElement* HTMLSummaryElement::detailsElement() const
index 9efb8cc..eccb88b 100644 (file)
@@ -91,16 +91,6 @@ static inline void executeTask(HTMLConstructionSiteTask& task)
     else
         task.parent->parserAppendChild(task.child.get());
 
-    // JavaScript run from beforeload (or DOM Mutation or event handlers)
-    // might have removed the child, in which case we should not attach it.
-
-    if (task.child->parentNode() && task.parent->attached() && !task.child->attached()) {
-        if (task.child->isElementNode())
-            Style::attachRenderTree(*toElement(task.child.get()));
-        else if (task.child->isTextNode())
-            Style::attachTextRenderer(*toText(task.child.get()));
-    }
-
     task.child->beginParsingChildren();
 
     if (task.selfClosing)
index cd3bf75..2f3040c 100644 (file)
@@ -1603,8 +1603,6 @@ void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken* token)
             if (ContainerNode* parent = lastNode->element()->parentNode())
                 parent->parserRemoveChild(*lastNode->element());
             node->element()->parserAppendChild(lastNode->element());
-            if (lastNode->element()->parentElement()->attached() && !lastNode->element()->attached())
-                lastNode->element()->lazyAttach();
             // 9.10
             lastNode = node;
         }
@@ -1624,8 +1622,6 @@ void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken* token)
 #endif
             ASSERT(lastNode->stackItem()->isElementNode());
             ASSERT(lastNode->element()->parentNode());
-            if (lastNode->element()->parentNode()->attached() && !lastNode->element()->attached())
-                lastNode->element()->lazyAttach();
         }
         // 11.
         RefPtr<HTMLStackItem> newItem = m_tree.createElementFromSavedToken(formattingElementRecord->stackItem().get());
index 7c68e4f..9a81aca 100644 (file)
@@ -144,11 +144,8 @@ void ContentDistributor::invalidateDistribution(Element* host)
     bool didNeedInvalidation = needsInvalidation();
     bool needsReattach = didNeedInvalidation ? invalidate(host) : false;
 
-    if (needsReattach && host->attached()) {
-        for (Element* element = ElementTraversal::firstWithin(host); element; element = ElementTraversal::nextSibling(element))
-            element->lazyReattach();
-        host->setNeedsStyleRecalc();
-    }
+    if (needsReattach)
+        host->setNeedsStyleRecalc(ReconstructRenderTree);
 
     if (didNeedInvalidation) {
         ASSERT(m_validity == Invalidating);
index 271b4f3..7073f6b 100644 (file)
@@ -55,22 +55,22 @@ void InsertionPoint::willAttachRenderers()
     if (ShadowRoot* shadowRoot = containingShadowRoot())
         ContentDistributor::ensureDistribution(shadowRoot);
     for (Node* current = firstDistributed(); current; current = nextDistributedTo(current)) {
-        if (current->attached())
-            continue;
         if (current->isTextNode()) {
+            if (current->renderer())
+                continue;
             Style::attachTextRenderer(*toText(current));
             continue;
         }
-        if (current->isElementNode())
+        if (current->isElementNode()) {
+            if (current->renderer())
+                Style::detachRenderTree(*toElement(current));
             Style::attachRenderTree(*toElement(current));
+        }
     }
 }
 
 void InsertionPoint::willDetachRenderers()
 {
-    if (ShadowRoot* shadowRoot = containingShadowRoot())
-        ContentDistributor::ensureDistribution(shadowRoot);
-
     for (Node* current = firstDistributed(); current; current = nextDistributedTo(current)) {
         if (current->isTextNode()) {
             Style::detachTextRenderer(*toText(current));
index 42c5309..7c87d1f 100644 (file)
@@ -1290,7 +1290,7 @@ void MediaControlTextTrackContainerElement::updateDisplay()
         RefPtr<TextTrackCueBox> displayBox = cue->getDisplayTree(m_videoDisplaySize.size());
         if (displayBox->hasChildNodes() && !contains(displayBox.get())) {
             // Note: the display tree of a cue is removed when the active flag of the cue is unset.
-            appendChild(displayBox, ASSERT_NO_EXCEPTION, AttachNow);
+            appendChild(displayBox, ASSERT_NO_EXCEPTION);
             cue->setFontSize(m_fontSize, m_videoDisplaySize.size(), m_fontSizeIsImportant);
         }
     }
index 6681e3a..bed69c3 100644 (file)
@@ -392,7 +392,7 @@ void MediaControls::createTextTrackDisplay()
         m_textDisplayContainer->setMediaController(m_mediaController);
 
     // Insert it before the first controller element so it always displays behind the controls.
-    insertBefore(textDisplayContainer.release(), m_panel, IGNORE_EXCEPTION, AttachLazily);
+    insertBefore(textDisplayContainer.release(), m_panel, IGNORE_EXCEPTION);
 }
 
 void MediaControls::showTextTrackDisplay()
index bc3d24b..660e8eb 100644 (file)
@@ -73,26 +73,26 @@ PassRefPtr<MediaControlsApple> MediaControlsApple::createControls(Document& docu
 
     RefPtr<MediaControlRewindButtonElement> rewindButton = MediaControlRewindButtonElement::create(document);
     controls->m_rewindButton = rewindButton.get();
-    panel->appendChild(rewindButton.release(), ec, AttachLazily);
+    panel->appendChild(rewindButton.release(), ec);
     if (ec)
         return 0;
 
     RefPtr<MediaControlPlayButtonElement> playButton = MediaControlPlayButtonElement::create(document);
     controls->m_playButton = playButton.get();
-    panel->appendChild(playButton.release(), ec, AttachLazily);
+    panel->appendChild(playButton.release(), ec);
     if (ec)
         return 0;
 
     RefPtr<MediaControlReturnToRealtimeButtonElement> returnToRealtimeButton = MediaControlReturnToRealtimeButtonElement::create(document);
     controls->m_returnToRealTimeButton = returnToRealtimeButton.get();
-    panel->appendChild(returnToRealtimeButton.release(), ec, AttachLazily);
+    panel->appendChild(returnToRealtimeButton.release(), ec);
     if (ec)
         return 0;
 
     if (document.page()->theme().usesMediaControlStatusDisplay()) {
         RefPtr<MediaControlStatusDisplayElement> statusDisplay = MediaControlStatusDisplayElement::create(document);
         controls->m_statusDisplay = statusDisplay.get();
-        panel->appendChild(statusDisplay.release(), ec, AttachLazily);
+        panel->appendChild(statusDisplay.release(), ec);
         if (ec)
             return 0;
     }
@@ -101,38 +101,38 @@ PassRefPtr<MediaControlsApple> MediaControlsApple::createControls(Document& docu
 
     RefPtr<MediaControlCurrentTimeDisplayElement> currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(document);
     controls->m_currentTimeDisplay = currentTimeDisplay.get();
-    timelineContainer->appendChild(currentTimeDisplay.release(), ec, AttachLazily);
+    timelineContainer->appendChild(currentTimeDisplay.release(), ec);
     if (ec)
         return 0;
 
     RefPtr<MediaControlTimelineElement> timeline = MediaControlTimelineElement::create(document, controls.get());
     controls->m_timeline = timeline.get();
-    timelineContainer->appendChild(timeline.release(), ec, AttachLazily);
+    timelineContainer->appendChild(timeline.release(), ec);
     if (ec)
         return 0;
 
     RefPtr<MediaControlTimeRemainingDisplayElement> timeRemainingDisplay = MediaControlTimeRemainingDisplayElement::create(document);
     controls->m_timeRemainingDisplay = timeRemainingDisplay.get();
-    timelineContainer->appendChild(timeRemainingDisplay.release(), ec, AttachLazily);
+    timelineContainer->appendChild(timeRemainingDisplay.release(), ec);
     if (ec)
         return 0;
 
     controls->m_timelineContainer = timelineContainer.get();
-    panel->appendChild(timelineContainer.release(), ec, AttachLazily);
+    panel->appendChild(timelineContainer.release(), ec);
     if (ec)
         return 0;
 
     // FIXME: Only create when needed <http://webkit.org/b/57163>
     RefPtr<MediaControlSeekBackButtonElement> seekBackButton = MediaControlSeekBackButtonElement::create(document);
     controls->m_seekBackButton = seekBackButton.get();
-    panel->appendChild(seekBackButton.release(), ec, AttachLazily);
+    panel->appendChild(seekBackButton.release(), ec);
     if (ec)
         return 0;
 
     // FIXME: Only create when needed <http://webkit.org/b/57163>
     RefPtr<MediaControlSeekForwardButtonElement> seekForwardButton = MediaControlSeekForwardButtonElement::create(document);
     controls->m_seekForwardButton = seekForwardButton.get();
-    panel->appendChild(seekForwardButton.release(), ec, AttachLazily);
+    panel->appendChild(seekForwardButton.release(), ec);
     if (ec)
         return 0;
 
@@ -141,18 +141,18 @@ PassRefPtr<MediaControlsApple> MediaControlsApple::createControls(Document& docu
 
         RefPtr<MediaControlClosedCaptionsTrackListElement> closedCaptionsTrackList = MediaControlClosedCaptionsTrackListElement::create(document, controls.get());
         controls->m_closedCaptionsTrackList = closedCaptionsTrackList.get();
-        closedCaptionsContainer->appendChild(closedCaptionsTrackList.release(), ec, AttachLazily);
+        closedCaptionsContainer->appendChild(closedCaptionsTrackList.release(), ec);
         if (ec)
             return 0;
 
         RefPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(document, controls.get());
         controls->m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get();
-        panel->appendChild(toggleClosedCaptionsButton.release(), ec, AttachLazily);
+        panel->appendChild(toggleClosedCaptionsButton.release(), ec);
         if (ec)
             return 0;
 
         controls->m_closedCaptionsContainer = closedCaptionsContainer.get();
-        controls->appendChild(closedCaptionsContainer.release(), ec, AttachLazily);
+        controls->appendChild(closedCaptionsContainer.release(), ec);
         if (ec)
             return 0;
     }
@@ -160,7 +160,7 @@ PassRefPtr<MediaControlsApple> MediaControlsApple::createControls(Document& docu
     // FIXME: Only create when needed <http://webkit.org/b/57163>
     RefPtr<MediaControlFullscreenButtonElement> fullScreenButton = MediaControlFullscreenButtonElement::create(document);
     controls->m_fullScreenButton = fullScreenButton.get();
-    panel->appendChild(fullScreenButton.release(), ec, AttachLazily);
+    panel->appendChild(fullScreenButton.release(), ec);
 
     // The mute button and the slider element should be in the same div.
     RefPtr<HTMLDivElement> panelVolumeControlContainer = HTMLDivElement::create(document);
@@ -170,7 +170,7 @@ PassRefPtr<MediaControlsApple> MediaControlsApple::createControls(Document& docu
 
         RefPtr<MediaControlPanelVolumeSliderElement> slider = MediaControlPanelVolumeSliderElement::create(document);
         controls->m_volumeSlider = slider.get();
-        volumeSliderContainer->appendChild(slider.release(), ec, AttachLazily);
+        volumeSliderContainer->appendChild(slider.release(), ec);
         if (ec)
             return 0;
 
@@ -178,48 +178,48 @@ PassRefPtr<MediaControlsApple> MediaControlsApple::createControls(Document& docu
         // It's important only when the volume bar is displayed below the controls.
         RefPtr<MediaControlVolumeSliderMuteButtonElement> volumeSliderMuteButton = MediaControlVolumeSliderMuteButtonElement::create(document);
         controls->m_volumeSliderMuteButton = volumeSliderMuteButton.get();
-        volumeSliderContainer->appendChild(volumeSliderMuteButton.release(), ec, AttachLazily);
+        volumeSliderContainer->appendChild(volumeSliderMuteButton.release(), ec);
 
         if (ec)
             return 0;
 
         controls->m_volumeSliderContainer = volumeSliderContainer.get();
-        panelVolumeControlContainer->appendChild(volumeSliderContainer.release(), ec, AttachLazily);
+        panelVolumeControlContainer->appendChild(volumeSliderContainer.release(), ec);
         if (ec)
             return 0;
     }
 
     RefPtr<MediaControlPanelMuteButtonElement> panelMuteButton = MediaControlPanelMuteButtonElement::create(document, controls.get());
     controls->m_panelMuteButton = panelMuteButton.get();
-    panelVolumeControlContainer->appendChild(panelMuteButton.release(), ec, AttachLazily);
+    panelVolumeControlContainer->appendChild(panelMuteButton.release(), ec);
     if (ec)
         return 0;
 
-    panel->appendChild(panelVolumeControlContainer, ec, AttachLazily);
+    panel->appendChild(panelVolumeControlContainer, ec);
     if (ec)
         return 0;
 
     // FIXME: Only create when needed <http://webkit.org/b/57163>
     RefPtr<MediaControlFullscreenVolumeMinButtonElement> fullScreenMinVolumeButton = MediaControlFullscreenVolumeMinButtonElement::create(document);
     controls->m_fullScreenMinVolumeButton = fullScreenMinVolumeButton.get();
-    panel->appendChild(fullScreenMinVolumeButton.release(), ec, AttachLazily);
+    panel->appendChild(fullScreenMinVolumeButton.release(), ec);
     if (ec)
         return 0;
 
     RefPtr<MediaControlFullscreenVolumeSliderElement> fullScreenVolumeSlider = MediaControlFullscreenVolumeSliderElement::create(document);
     controls->m_fullScreenVolumeSlider = fullScreenVolumeSlider.get();
-    panel->appendChild(fullScreenVolumeSlider.release(), ec, AttachLazily);
+    panel->appendChild(fullScreenVolumeSlider.release(), ec);
     if (ec)
         return 0;
 
     RefPtr<MediaControlFullscreenVolumeMaxButtonElement> fullScreenMaxVolumeButton = MediaControlFullscreenVolumeMaxButtonElement::create(document);
     controls->m_fullScreenMaxVolumeButton = fullScreenMaxVolumeButton.get();
-    panel->appendChild(fullScreenMaxVolumeButton.release(), ec, AttachLazily);
+    panel->appendChild(fullScreenMaxVolumeButton.release(), ec);
     if (ec)
         return 0;
 
     controls->m_panel = panel.get();
-    controls->appendChild(panel.release(), ec, AttachLazily);
+    controls->appendChild(panel.release(), ec);
     if (ec)
         return 0;
 
index a43cf2b..7fc1cae 100644 (file)
@@ -825,7 +825,7 @@ TextTrackCueBox* TextTrackCue::getDisplayTree(const IntSize& videoSize)
 
     // Note: This is contained by default in m_cueBackgroundBox.
     m_cueBackgroundBox->setPseudo(cueShadowPseudoId());
-    displayTree->appendChild(m_cueBackgroundBox, ASSERT_NO_EXCEPTION, AttachLazily);
+    displayTree->appendChild(m_cueBackgroundBox, ASSERT_NO_EXCEPTION);
 
     // FIXME(BUG 79916): Runs of children of WebVTT Ruby Objects that are not
     // WebVTT Ruby Text Objects must be wrapped in anonymous boxes whose
index ac5cae9..f236f14 100644 (file)
@@ -36,8 +36,6 @@ void PlaceholderDocument::createRenderTree()
 
     for (auto& child : elementChildren(*this))
         Style::attachRenderTree(child);
-
-    setAttached(true);
 }
 
 } // namespace WebCore
index 2089f3f..df996ad 100644 (file)
@@ -832,7 +832,7 @@ void CachedResourceLoader::preload(CachedResource::Type type, CachedResourceRequ
     // FIXME: We should consider adding a setting to toggle aggressive preloading behavior as opposed
     // to making this behavior specific to iOS.
 #if !PLATFORM(IOS)
-    bool hasRendering = m_document->body() && m_document->body()->renderer();
+    bool hasRendering = m_document->body() && m_document->renderView();
     bool canBlockParser = type == CachedResource::Script || type == CachedResource::CSSStyleSheet;
     if (!hasRendering && !canBlockParser) {
         // Don't preload subresources that can't block the parser before we have something to draw.
index 22119be..a3d59e7 100644 (file)
@@ -405,7 +405,6 @@ void attachTextRenderer(Text& textNode)
 {
     createTextRendererIfNeeded(textNode);
 
-    textNode.setAttached(true);
     textNode.clearNeedsStyleRecalc();
 }
 
@@ -414,7 +413,6 @@ void detachTextRenderer(Text& textNode)
     if (textNode.renderer())
         textNode.renderer()->destroyAndCleanupAnonymousWrappers();
     textNode.setRenderer(0);
-    textNode.setAttached(false);
 }
 
 void updateTextRendererAfterContentChange(Text& textNode, unsigned offsetOfReplacedData, unsigned lengthOfReplacedData)
@@ -440,8 +438,8 @@ void updateTextRendererAfterContentChange(Text& textNode, unsigned offsetOfRepla
 static void attachChildren(ContainerNode& current)
 {
     for (Node* child = current.firstChild(); child; child = child->nextSibling()) {
-        ASSERT(!child->attached() || current.shadowRoot());
-        if (child->attached())
+        ASSERT(!child->renderer() || current.shadowRoot() || current.isInsertionPoint());
+        if (child->renderer())
             continue;
         if (child->isTextNode()) {
             attachTextRenderer(*toText(child));
@@ -454,8 +452,6 @@ static void attachChildren(ContainerNode& current)
 
 static void attachShadowRoot(ShadowRoot& shadowRoot)
 {
-    if (shadowRoot.attached())
-        return;
     StyleResolver& styleResolver = shadowRoot.document().ensureStyleResolver();
     styleResolver.pushParentShadowRoot(&shadowRoot);
 
@@ -464,7 +460,7 @@ static void attachShadowRoot(ShadowRoot& shadowRoot)
     styleResolver.popParentShadowRoot(&shadowRoot);
 
     shadowRoot.clearNeedsStyleRecalc();
-    shadowRoot.setAttached(true);
+    shadowRoot.clearChildNeedsStyleRecalc();
 }
 
 static PseudoElement* beforeOrAfterPseudoElement(Element& current, PseudoId pseudoId)
@@ -543,8 +539,8 @@ static void attachRenderTree(Element& current, PassRefPtr<RenderStyle> resolvedS
 
     attachChildren(current);
 
-    current.setAttached(true);
     current.clearNeedsStyleRecalc();
+    current.clearChildNeedsStyleRecalc();
 
     if (AXObjectCache* cache = current.document().axObjectCache())
         cache->updateCacheAfterNodeIsAttached(&current);
@@ -572,11 +568,7 @@ static void detachChildren(ContainerNode& current, DetachType detachType)
 
 static void detachShadowRoot(ShadowRoot& shadowRoot, DetachType detachType)
 {
-    if (!shadowRoot.attached())
-        return;
     detachChildren(shadowRoot, detachType);
-
-    shadowRoot.setAttached(false);
 }
 
 static void detachRenderTree(Element& current, DetachType detachType)
@@ -602,8 +594,6 @@ static void detachRenderTree(Element& current, DetachType detachType)
         current.renderer()->destroyAndCleanupAnonymousWrappers();
     current.setRenderer(0);
 
-    current.setAttached(false);
-
     if (current.hasCustomStyleResolveCallbacks())
         current.didDetachRenderers();
 }
@@ -649,12 +639,12 @@ static Change resolveLocal(Element& current, Change inheritedChange)
     RefPtr<RenderStyle> currentStyle = current.renderStyle();
 
     Document& document = current.document();
-    if (currentStyle) {
+    if (currentStyle && current.styleChangeType() != ReconstructRenderTree) {
         newStyle = current.styleForRenderer();
         localChange = determineChange(currentStyle.get(), newStyle.get(), document.settings());
     }
     if (localChange == Detach) {
-        if (current.attached())
+        if (current.renderer() || current.inNamedFlow())
             detachRenderTree(current, ReattachDetach);
         attachRenderTree(current, newStyle.release());
         reattachTextRenderersForWhitespaceOnlySiblingsAfterAttachIfNeeded(current);
index 0a99301..6ac8f7b 100644 (file)
@@ -156,12 +156,7 @@ bool SVGTests::handleAttributeChange(SVGElement* targetElement, const QualifiedN
     if (!targetElement->inDocument())
         return true;
 
-    bool valid = targetElement->isValid();
-    bool attached = targetElement->attached();
-    if (valid && !attached && targetElement->parentNode()->attached())
-        Style::attachRenderTree(*targetElement);
-    else if (!valid && attached)
-        Style::detachRenderTree(*targetElement);
+    targetElement->setNeedsStyleRecalc(ReconstructRenderTree);
 
     return true;
 }
index ddd5005..b80c4c3 100644 (file)
@@ -486,6 +486,7 @@ bool Internals::pauseTransitionAtTimeOnPseudoElement(const String& property, dou
     return frame()->animation().pauseTransitionAtTime(pseudoElement->renderer(), property, pauseTime);
 }
 
+// FIXME: Remove.
 bool Internals::attached(Node* node, ExceptionCode& ec)
 {
     if (!node) {
@@ -493,7 +494,7 @@ bool Internals::attached(Node* node, ExceptionCode& ec)
         return false;
     }
 
-    return node->attached();
+    return true;
 }
 
 String Internals::elementRenderTreeAsText(Element* element, ExceptionCode& ec)
@@ -503,6 +504,8 @@ String Internals::elementRenderTreeAsText(Element* element, ExceptionCode& ec)
         return String();
     }
 
+    element->document().updateStyleIfNeeded();
+
     String representation = externalRepresentation(element);
     if (representation.isEmpty()) {
         ec = INVALID_ACCESS_ERR;
@@ -749,6 +752,7 @@ unsigned Internals::markerCountForNode(Node* node, const String& markerType, Exc
 
 DocumentMarker* Internals::markerAt(Node* node, const String& markerType, unsigned index, ExceptionCode& ec)
 {
+    node->document().updateLayoutIgnorePendingStylesheets();
     if (!node) {
         ec = INVALID_ACCESS_ERR;
         return 0;
@@ -1204,6 +1208,8 @@ PassRefPtr<NodeList> Internals::nodesFromRect(Document* document, int centerX, i
     if (!renderView)
         return 0;
 
+    document->updateLayoutIgnorePendingStylesheets();
+
     float zoomFactor = frame->pageZoomFactor();
     LayoutPoint point = roundedLayoutPoint(FloatPoint(centerX * zoomFactor + frameView->scrollX(), centerY * zoomFactor + frameView->scrollY()));
 
index 35d0194..2977459 100644 (file)
@@ -3016,7 +3016,16 @@ WEBCORE_COMMAND(yankAndSelect)
 // Do a layout, but set up a new fixed width for the purposes of doing printing layout.
 // minPageWidth==0 implies a non-printing layout
 - (void)layoutToMinimumPageWidth:(float)minPageLogicalWidth height:(float)minPageLogicalHeight originalPageWidth:(float)originalPageWidth originalPageHeight:(float)originalPageHeight maximumShrinkRatio:(float)maximumShrinkRatio adjustingViewSize:(BOOL)adjustViewSize
-{    
+{
+    Frame* coreFrame = core([self _frame]);
+    if (!coreFrame)
+        return;
+    if (coreFrame->document()) {
+        if (coreFrame->document()->inPageCache())
+            return;
+        coreFrame->document()->updateStyleIfNeeded();
+    }
+
     if (![self _needsLayout])
         return;
 
@@ -3026,10 +3035,6 @@ WEBCORE_COMMAND(yankAndSelect)
 
     LOG(View, "%@ doing layout", self);
 
-    Frame* coreFrame = core([self _frame]);
-    if (!coreFrame)
-        return;
-
     if (FrameView* coreView = coreFrame->view()) {
         if (minPageLogicalWidth > 0.0) {
             FloatSize pageSize(minPageLogicalWidth, minPageLogicalHeight);
index bedf5ee..ea6ad43 100644 (file)
@@ -1775,6 +1775,9 @@ void WebPage::keyEventSyncForTesting(const WebKeyboardEvent& keyboardEvent, bool
 {
     CurrentEvent currentEvent(keyboardEvent);
 
+    Frame& frame = m_page->focusController().focusedOrMainFrame();
+    frame.document()->updateStyleIfNeeded();
+
     handled = handleKeyEvent(keyboardEvent, m_page.get());
     if (!handled)
         handled = performDefaultBehaviorForKeyEvent(keyboardEvent);