Title: [226843] branches/safari-605-branch/Source/WebCore
Revision
226843
Author
jmarc...@apple.com
Date
2018-01-11 20:51:48 -0800 (Thu, 11 Jan 2018)

Log Message

Revert r226179. rdar://problem/36156495

Modified Paths

Added Paths

Removed Paths

Diff

Modified: branches/safari-605-branch/Source/WebCore/ChangeLog (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/ChangeLog	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/ChangeLog	2018-01-12 04:51:48 UTC (rev 226843)
@@ -1,5 +1,9 @@
 2018-01-11  Jason Marcell  <jmarc...@apple.com>
 
+        Revert r226179. rdar://problem/36156495
+
+2018-01-11  Jason Marcell  <jmarc...@apple.com>
+
         Revert r226181. rdar://problem/36148601
 
 2018-01-11  Jason Marcell  <jmarc...@apple.com>

Modified: branches/safari-605-branch/Source/WebCore/Sources.txt (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/Sources.txt	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/Sources.txt	2018-01-12 04:51:48 UTC (rev 226843)
@@ -1985,12 +1985,12 @@
 
 rendering/updating/RenderTreeBuilder.cpp
 rendering/updating/RenderTreeBuilderFirstLetter.cpp
-rendering/updating/RenderTreeBuilderList.cpp
-rendering/updating/RenderTreeBuilderMultiColumn.cpp
 rendering/updating/RenderTreeBuilderTable.cpp
 rendering/updating/RenderTreePosition.cpp
 rendering/updating/RenderTreeUpdater.cpp
 rendering/updating/RenderTreeUpdaterGeneratedContent.cpp
+rendering/updating/RenderTreeUpdaterListItem.cpp
+rendering/updating/RenderTreeUpdaterMultiColumn.cpp
 
 replay/UserInputBridge.cpp
 

Modified: branches/safari-605-branch/Source/WebCore/WebCore.xcodeproj/project.pbxproj (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-01-12 04:51:48 UTC (rev 226843)
@@ -4588,8 +4588,8 @@
 		E47C392F1FE6E0F900BBBC6B /* RenderTreeUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C392C1FE6E0DF00BBBC6B /* RenderTreeUpdater.h */; };
 		E47C39301FE6E0FD00BBBC6B /* RenderTreeBuilderFirstLetter.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C39261FE6E0DC00BBBC6B /* RenderTreeBuilderFirstLetter.h */; };
 		E47C39311FE6E10200BBBC6B /* RenderTreeUpdaterGeneratedContent.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C39251FE6E0DB00BBBC6B /* RenderTreeUpdaterGeneratedContent.h */; };
-		E47C39321FE6E10500BBBC6B /* RenderTreeBuilderList.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C39281FE6E0DD00BBBC6B /* RenderTreeBuilderList.h */; };
-		E47C39331FE6E10800BBBC6B /* RenderTreeBuilderMultiColumn.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C39271FE6E0DC00BBBC6B /* RenderTreeBuilderMultiColumn.h */; };
+		E47C39321FE6E10500BBBC6B /* RenderTreeUpdaterListItem.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C39281FE6E0DD00BBBC6B /* RenderTreeUpdaterListItem.h */; };
+		E47C39331FE6E10800BBBC6B /* RenderTreeUpdaterMultiColumn.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C39271FE6E0DC00BBBC6B /* RenderTreeUpdaterMultiColumn.h */; };
 		E47E276516036ED200EE2AFB /* ExtensionStyleSheets.h in Headers */ = {isa = PBXBuildFile; fileRef = E47E276416036ED200EE2AFB /* ExtensionStyleSheets.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		E48137B91DB3B526005C59BF /* StyleValidity.h in Headers */ = {isa = PBXBuildFile; fileRef = E48137B81DB3B526005C59BF /* StyleValidity.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		E48944A3180B57D800F165D8 /* SimpleLineLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = E48944A1180B57D800F165D8 /* SimpleLineLayout.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -13957,15 +13957,15 @@
 		E47C39201FE6E0D900BBBC6B /* RenderTreeBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeBuilder.cpp; sourceTree = "<group>"; };
 		E47C39211FE6E0DA00BBBC6B /* RenderTreeBuilderFirstLetter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeBuilderFirstLetter.cpp; sourceTree = "<group>"; };
 		E47C39221FE6E0DA00BBBC6B /* RenderTreeUpdaterGeneratedContent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdaterGeneratedContent.cpp; sourceTree = "<group>"; };
-		E47C39231FE6E0DA00BBBC6B /* RenderTreeBuilderMultiColumn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeBuilderMultiColumn.cpp; sourceTree = "<group>"; };
+		E47C39231FE6E0DA00BBBC6B /* RenderTreeUpdaterMultiColumn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdaterMultiColumn.cpp; sourceTree = "<group>"; };
 		E47C39241FE6E0DB00BBBC6B /* RenderTreePosition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreePosition.h; sourceTree = "<group>"; };
 		E47C39251FE6E0DB00BBBC6B /* RenderTreeUpdaterGeneratedContent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdaterGeneratedContent.h; sourceTree = "<group>"; };
 		E47C39261FE6E0DC00BBBC6B /* RenderTreeBuilderFirstLetter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeBuilderFirstLetter.h; sourceTree = "<group>"; };
-		E47C39271FE6E0DC00BBBC6B /* RenderTreeBuilderMultiColumn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeBuilderMultiColumn.h; sourceTree = "<group>"; };
-		E47C39281FE6E0DD00BBBC6B /* RenderTreeBuilderList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeBuilderList.h; sourceTree = "<group>"; };
+		E47C39271FE6E0DC00BBBC6B /* RenderTreeUpdaterMultiColumn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdaterMultiColumn.h; sourceTree = "<group>"; };
+		E47C39281FE6E0DD00BBBC6B /* RenderTreeUpdaterListItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdaterListItem.h; sourceTree = "<group>"; };
 		E47C39291FE6E0DE00BBBC6B /* RenderTreePosition.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreePosition.cpp; sourceTree = "<group>"; };
 		E47C392A1FE6E0DE00BBBC6B /* RenderTreeBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeBuilder.h; sourceTree = "<group>"; };
-		E47C392B1FE6E0DF00BBBC6B /* RenderTreeBuilderList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeBuilderList.cpp; sourceTree = "<group>"; };
+		E47C392B1FE6E0DF00BBBC6B /* RenderTreeUpdaterListItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTreeUpdaterListItem.cpp; sourceTree = "<group>"; };
 		E47C392C1FE6E0DF00BBBC6B /* RenderTreeUpdater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTreeUpdater.h; sourceTree = "<group>"; };
 		E47E276416036ED200EE2AFB /* ExtensionStyleSheets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExtensionStyleSheets.h; sourceTree = "<group>"; };
 		E47E276716036EDC00EE2AFB /* ExtensionStyleSheets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExtensionStyleSheets.cpp; sourceTree = "<group>"; };
@@ -24622,10 +24622,6 @@
 				E47C392A1FE6E0DE00BBBC6B /* RenderTreeBuilder.h */,
 				E47C39211FE6E0DA00BBBC6B /* RenderTreeBuilderFirstLetter.cpp */,
 				E47C39261FE6E0DC00BBBC6B /* RenderTreeBuilderFirstLetter.h */,
-				E47C392B1FE6E0DF00BBBC6B /* RenderTreeBuilderList.cpp */,
-				E47C39281FE6E0DD00BBBC6B /* RenderTreeBuilderList.h */,
-				E47C39231FE6E0DA00BBBC6B /* RenderTreeBuilderMultiColumn.cpp */,
-				E47C39271FE6E0DC00BBBC6B /* RenderTreeBuilderMultiColumn.h */,
 				119340761FE8B92300935F1E /* RenderTreeBuilderTable.cpp */,
 				119340771FE8B92300935F1E /* RenderTreeBuilderTable.h */,
 				E47C39291FE6E0DE00BBBC6B /* RenderTreePosition.cpp */,
@@ -24634,6 +24630,10 @@
 				E47C392C1FE6E0DF00BBBC6B /* RenderTreeUpdater.h */,
 				E47C39221FE6E0DA00BBBC6B /* RenderTreeUpdaterGeneratedContent.cpp */,
 				E47C39251FE6E0DB00BBBC6B /* RenderTreeUpdaterGeneratedContent.h */,
+				E47C392B1FE6E0DF00BBBC6B /* RenderTreeUpdaterListItem.cpp */,
+				E47C39281FE6E0DD00BBBC6B /* RenderTreeUpdaterListItem.h */,
+				E47C39231FE6E0DA00BBBC6B /* RenderTreeUpdaterMultiColumn.cpp */,
+				E47C39271FE6E0DC00BBBC6B /* RenderTreeUpdaterMultiColumn.h */,
 			);
 			path = updating;
 			sourceTree = "<group>";
@@ -29049,8 +29049,8 @@
 				E47C392E1FE6E0F700BBBC6B /* RenderTreePosition.h in Headers */,
 				E47C392F1FE6E0F900BBBC6B /* RenderTreeUpdater.h in Headers */,
 				E47C39311FE6E10200BBBC6B /* RenderTreeUpdaterGeneratedContent.h in Headers */,
-				E47C39321FE6E10500BBBC6B /* RenderTreeBuilderList.h in Headers */,
-				E47C39331FE6E10800BBBC6B /* RenderTreeBuilderMultiColumn.h in Headers */,
+				E47C39321FE6E10500BBBC6B /* RenderTreeUpdaterListItem.h in Headers */,
+				E47C39331FE6E10800BBBC6B /* RenderTreeUpdaterMultiColumn.h in Headers */,
 				E44614520CD68A3500FADA75 /* RenderVideo.h in Headers */,
 				BCEA4868097D93020094C9E4 /* RenderView.h in Headers */,
 				BE20507E18A458C20080647E /* RenderVTTCue.h in Headers */,

Modified: branches/safari-605-branch/Source/WebCore/rendering/TextAutoSizing.cpp (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/TextAutoSizing.cpp	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/rendering/TextAutoSizing.cpp	2018-01-12 04:51:48 UTC (rev 226843)
@@ -37,6 +37,8 @@
 #include "RenderText.h"
 #include "RenderTextFragment.h"
 #include "RenderTreeBuilder.h"
+#include "RenderTreeBuilderFirstLetter.h"
+#include "RenderTreeUpdaterListItem.h"
 #include "StyleResolver.h"
 
 namespace WebCore {
@@ -160,7 +162,8 @@
         newParentStyle.fontCascade().update(&node->document().fontSelector());
         parentRenderer->setStyle(WTFMove(newParentStyle));
 
-        builder.updateAfterDescendants(*parentRenderer);
+        if (is<RenderListItem>(*parentRenderer))
+            RenderTreeUpdater::ListItem::updateMarker(builder, downcast<RenderListItem>(*parentRenderer));
     }
 
     for (auto& node : m_autoSizedNodes) {

Modified: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp	2018-01-12 04:51:48 UTC (rev 226843)
@@ -33,8 +33,6 @@
 #include "RenderTableRow.h"
 #include "RenderText.h"
 #include "RenderTreeBuilderFirstLetter.h"
-#include "RenderTreeBuilderList.h"
-#include "RenderTreeBuilderMultiColumn.h"
 #include "RenderTreeBuilderTable.h"
 
 namespace WebCore {
@@ -44,8 +42,6 @@
 RenderTreeBuilder::RenderTreeBuilder(RenderView& view)
     : m_view(view)
     , m_firstLetterBuilder(std::make_unique<FirstLetter>(*this))
-    , m_listBuilder(std::make_unique<List>(*this))
-    , m_multiColumnBuilder(std::make_unique<MultiColumn>(*this))
     , m_tableBuilder(std::make_unique<Table>(*this))
 {
     RELEASE_ASSERT(!s_current || &m_view != &s_current->m_view);
@@ -99,10 +95,6 @@
 {
     if (is<RenderBlock>(renderer))
         firstLetterBuilder().updateAfterDescendants(downcast<RenderBlock>(renderer));
-    if (is<RenderListItem>(renderer))
-        listBuilder().updateItemMarker(downcast<RenderListItem>(renderer));
-    if (is<RenderBlockFlow>(renderer))
-        multiColumnBuilder().updateAfterDescendants(downcast<RenderBlockFlow>(renderer));
 }
 
 void RenderTreeBuilder::rubyRunInsertChild(RenderRubyRun& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild)

Modified: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilder.h (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilder.h	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilder.h	2018-01-12 04:51:48 UTC (rev 226843)
@@ -48,15 +48,11 @@
 
 private:
     class FirstLetter;
-    class List;
-    class MultiColumn;
     class Table;
 
     void rubyRunInsertChild(RenderRubyRun&, RenderPtr<RenderObject> child, RenderObject* beforeChild);
 
     FirstLetter& firstLetterBuilder() { return *m_firstLetterBuilder; }
-    List& listBuilder() { return *m_listBuilder; }
-    MultiColumn& multiColumnBuilder() { return *m_multiColumnBuilder; }
     Table& tableBuilder() { return *m_tableBuilder; }
 
     RenderView& m_view;
@@ -65,8 +61,6 @@
     static RenderTreeBuilder* s_current;
 
     std::unique_ptr<FirstLetter> m_firstLetterBuilder;
-    std::unique_ptr<List> m_listBuilder;
-    std::unique_ptr<MultiColumn> m_multiColumnBuilder;
     std::unique_ptr<Table> m_tableBuilder;
 };
 

Deleted: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderList.cpp (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderList.cpp	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderList.cpp	2018-01-12 04:51:48 UTC (rev 226843)
@@ -1,127 +0,0 @@
-/**
- * Copyright (C) 1999 Lars Knoll (kn...@kde.org)
- *           (C) 1999 Antti Koivisto (koivi...@kde.org)
- * Copyright (C) 2003-2006, 2010, 2017 Apple Inc. All rights reserved.
- * Copyright (C) 2006 Andrew Wellington (pro...@wiretapped.net)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#include "config.h"
-#include "RenderTreeBuilderList.h"
-
-#include "RenderChildIterator.h"
-#include "RenderListMarker.h"
-#include "RenderMultiColumnFlow.h"
-#include "RenderRuby.h"
-#include "RenderTable.h"
-
-namespace WebCore {
-
-static RenderBlock* getParentOfFirstLineBox(RenderBlock& current, RenderObject& marker)
-{
-    bool inQuirksMode = current.document().inQuirksMode();
-    for (auto& child : childrenOfType<RenderObject>(current)) {
-        if (&child == &marker)
-            continue;
-
-        if (child.isInline() && (!is<RenderInline>(child) || current.generatesLineBoxesForInlineChild(&child)))
-            return &current;
-
-        if (child.isFloating() || child.isOutOfFlowPositioned())
-            continue;
-
-        if (!is<RenderBlock>(child) || is<RenderTable>(child) || is<RenderRubyAsBlock>(child))
-            break;
-
-        if (is<RenderBox>(child) && downcast<RenderBox>(child).isWritingModeRoot())
-            break;
-
-        if (is<RenderListItem>(current) && inQuirksMode && child.node() && isHTMLListElement(*child.node()))
-            break;
-
-        if (RenderBlock* lineBox = getParentOfFirstLineBox(downcast<RenderBlock>(child), marker))
-            return lineBox;
-    }
-
-    return nullptr;
-}
-
-static RenderObject* firstNonMarkerChild(RenderBlock& parent)
-{
-    RenderObject* child = parent.firstChild();
-    while (is<RenderListMarker>(child))
-        child = child->nextSibling();
-    return child;
-}
-
-RenderTreeBuilder::List::List(RenderTreeBuilder& builder)
-    : m_builder(builder)
-{
-}
-
-void RenderTreeBuilder::List::updateItemMarker(RenderListItem& listItemRenderer)
-{
-    auto& style = listItemRenderer.style();
-
-    if (style.listStyleType() == NoneListStyle && (!style.listStyleImage() || style.listStyleImage()->errorOccurred())) {
-        if (auto* marker = listItemRenderer.markerRenderer())
-            marker->removeFromParentAndDestroy();
-        return;
-    }
-
-    auto newStyle = listItemRenderer.computeMarkerStyle();
-    RenderPtr<RenderListMarker> newMarkerRenderer;
-    auto* markerRenderer = listItemRenderer.markerRenderer();
-    if (markerRenderer)
-        markerRenderer->setStyle(WTFMove(newStyle));
-    else {
-        newMarkerRenderer = WebCore::createRenderer<RenderListMarker>(listItemRenderer, WTFMove(newStyle));
-        newMarkerRenderer->initializeStyle();
-        markerRenderer = newMarkerRenderer.get();
-        listItemRenderer.setMarkerRenderer(*markerRenderer);
-    }
-
-    RenderElement* currentParent = markerRenderer->parent();
-    RenderBlock* newParent = getParentOfFirstLineBox(listItemRenderer, *markerRenderer);
-    if (!newParent) {
-        // If the marker is currently contained inside an anonymous box,
-        // then we are the only item in that anonymous box (since no line box
-        // parent was found). It's ok to just leave the marker where it is
-        // in this case.
-        if (currentParent && currentParent->isAnonymousBlock())
-            return;
-        if (auto* multiColumnFlow = listItemRenderer.multiColumnFlow())
-            newParent = multiColumnFlow;
-        else
-            newParent = &listItemRenderer;
-    }
-
-    if (newParent == currentParent)
-        return;
-
-    if (currentParent)
-        m_builder.insertChild(*newParent, currentParent->takeChild(*markerRenderer), firstNonMarkerChild(*newParent));
-    else
-        m_builder.insertChild(*newParent, WTFMove(newMarkerRenderer), firstNonMarkerChild(*newParent));
-
-    // If current parent is an anonymous block that has lost all its children, destroy it.
-    if (currentParent && currentParent->isAnonymousBlock() && !currentParent->firstChild() && !downcast<RenderBlock>(*currentParent).continuation())
-        currentParent->removeFromParentAndDestroy();
-}
-
-}

Deleted: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderList.h (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderList.h	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderList.h	2018-01-12 04:51:48 UTC (rev 226843)
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2017 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "RenderListItem.h"
-#include "RenderTreeBuilder.h"
-
-namespace WebCore {
-
-class RenderTreeBuilder::List {
-public:
-    List(RenderTreeBuilder&);
-
-    void updateItemMarker(RenderListItem&);
-
-private:
-    RenderTreeBuilder& m_builder;
-};
-
-}

Deleted: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp	2018-01-12 04:51:48 UTC (rev 226843)
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 1999 Lars Knoll (kn...@kde.org)
- *           (C) 1999 Antti Koivisto (koivi...@kde.org)
- *           (C) 2007 David Smith (catfish....@gmail.com)
- * Copyright (C) 2003-2015, 2017 Apple Inc. All rights reserved.
- * Copyright (C) Research In Motion Limited 2010. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-#include "RenderTreeBuilderMultiColumn.h"
-
-#include "RenderBlockFlow.h"
-#include "RenderChildIterator.h"
-#include "RenderMultiColumnFlow.h"
-#include "RenderMultiColumnSet.h"
-#include "RenderMultiColumnSpannerPlaceholder.h"
-#include "RenderTreeBuilder.h"
-
-namespace WebCore {
-
-RenderTreeBuilder::MultiColumn::MultiColumn(RenderTreeBuilder& builder)
-    : m_builder(builder)
-{
-}
-
-void RenderTreeBuilder::MultiColumn::updateAfterDescendants(RenderBlockFlow& flow)
-{
-    bool needsFragmentedFlow = flow.requiresColumns(flow.style().columnCount());
-    bool hasFragmentedFlow = flow.multiColumnFlow();
-
-    if (!hasFragmentedFlow && needsFragmentedFlow) {
-        createFragmentedFlow(flow);
-        return;
-    }
-    if (hasFragmentedFlow && !needsFragmentedFlow) {
-        destroyFragmentedFlow(flow);
-        return;
-    }
-}
-
-void RenderTreeBuilder::MultiColumn::createFragmentedFlow(RenderBlockFlow& flow)
-{
-    flow.setChildrenInline(false); // Do this to avoid wrapping inline children that are just going to move into the flow thread.
-    flow.deleteLines();
-    // If this soon-to-be multicolumn flow is already part of a multicolumn context, we need to move back the descendant spanners
-    // to their original position before moving subtrees around.
-    auto* enclosingflow = flow.enclosingFragmentedFlow();
-    if (is<RenderMultiColumnFlow>(enclosingflow)) {
-        auto& spanners = downcast<RenderMultiColumnFlow>(enclosingflow)->spannerMap();
-        Vector<RenderMultiColumnSpannerPlaceholder*> placeholdersToDelete;
-        for (auto& spannerAndPlaceholder : spanners) {
-            auto& placeholder = *spannerAndPlaceholder.value;
-            if (!placeholder.isDescendantOf(&flow))
-                continue;
-            placeholdersToDelete.append(&placeholder);
-        }
-        for (auto* placeholder : placeholdersToDelete) {
-            auto* spanner = placeholder->spanner();
-            if (!spanner) {
-                ASSERT_NOT_REACHED();
-                continue;
-            }
-            // Move the spanner back to its original position.
-            auto& spannerOriginalParent = *placeholder->parent();
-            // Detaching the spanner takes care of removing the placeholder (and merges the RenderMultiColumnSets).
-            auto spannerToReInsert = spanner->parent()->takeChild(*spanner);
-            m_builder.insertChild(spannerOriginalParent, WTFMove(spannerToReInsert));
-        }
-    }
-
-    auto newFragmentedFlow = WebCore::createRenderer<RenderMultiColumnFlow>(flow.document(), RenderStyle::createAnonymousStyleWithDisplay(flow.style(), BLOCK));
-    newFragmentedFlow->initializeStyle();
-    auto& fragmentedFlow = *newFragmentedFlow;
-    flow.RenderBlock::addChild(m_builder, WTFMove(newFragmentedFlow));
-
-    // Reparent children preceding the fragmented flow into the fragmented flow.
-    flow.moveChildrenTo(&fragmentedFlow, flow.firstChild(), &fragmentedFlow, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
-    if (flow.isFieldset()) {
-        // Keep legends out of the flow thread.
-        for (auto& box : childrenOfType<RenderBox>(fragmentedFlow)) {
-            if (box.isLegend())
-                fragmentedFlow.moveChildTo(&flow, &box, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
-        }
-    }
-
-    flow.setMultiColumnFlow(fragmentedFlow);
-}
-
-void RenderTreeBuilder::MultiColumn::destroyFragmentedFlow(RenderBlockFlow& flow)
-{
-    auto& multiColumnFlow = *flow.multiColumnFlow();
-    multiColumnFlow.deleteLines();
-
-    // Move spanners back to their original DOM position in the tree, and destroy the placeholders.
-    auto& spanners = multiColumnFlow.spannerMap();
-    Vector<RenderMultiColumnSpannerPlaceholder*> placeholdersToDelete;
-    for (auto& spannerAndPlaceholder : spanners)
-        placeholdersToDelete.append(spannerAndPlaceholder.value.get());
-    Vector<std::pair<RenderElement*, RenderPtr<RenderObject>>> parentAndSpannerList;
-    for (auto* placeholder : placeholdersToDelete) {
-        auto* spannerOriginalParent = placeholder->parent();
-        if (spannerOriginalParent == &multiColumnFlow)
-            spannerOriginalParent = &flow;
-        // Detaching the spanner takes care of removing the placeholder (and merges the RenderMultiColumnSets).
-        auto* spanner = placeholder->spanner();
-        parentAndSpannerList.append(std::make_pair(spannerOriginalParent, spanner->parent()->takeChild(*spanner)));
-    }
-    while (auto* columnSet = multiColumnFlow.firstMultiColumnSet())
-        columnSet->removeFromParentAndDestroy();
-
-    flow.clearMultiColumnFlow();
-    multiColumnFlow.moveAllChildrenTo(&flow, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
-    multiColumnFlow.removeFromParentAndDestroy();
-    for (auto& parentAndSpanner : parentAndSpannerList)
-        m_builder.insertChild(*parentAndSpanner.first, WTFMove(parentAndSpanner.second));
-}
-
-}

Deleted: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.h (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.h	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.h	2018-01-12 04:51:48 UTC (rev 226843)
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2017 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "RenderTreeBuilder.h"
-
-namespace WebCore {
-
-class RenderBlockFlow;
-
-class RenderTreeBuilder::MultiColumn {
-public:
-    MultiColumn(RenderTreeBuilder&);
-
-    void updateAfterDescendants(RenderBlockFlow&);
-
-private:
-    void createFragmentedFlow(RenderBlockFlow&);
-    void destroyFragmentedFlow(RenderBlockFlow&);
-
-    RenderTreeBuilder& m_builder;
-};
-
-}

Modified: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp	2018-01-12 04:51:48 UTC (rev 226843)
@@ -40,7 +40,11 @@
 #include "RenderDescendantIterator.h"
 #include "RenderFullScreen.h"
 #include "RenderInline.h"
+#include "RenderListItem.h"
+#include "RenderTreeBuilderFirstLetter.h"
 #include "RenderTreeUpdaterGeneratedContent.h"
+#include "RenderTreeUpdaterListItem.h"
+#include "RenderTreeUpdaterMultiColumn.h"
 #include "StyleResolver.h"
 #include "StyleTreeResolver.h"
 #include <wtf/SystemTracing.h>
@@ -131,7 +135,7 @@
 
     generatedContent().updateRemainingQuotes();
 
-    m_builder.updateAfterDescendants(renderView());
+    MultiColumn::update(renderView());
 
     m_styleUpdate = nullptr;
 }
@@ -269,6 +273,12 @@
 
     m_builder.updateAfterDescendants(*renderer);
 
+    // These functions do render tree mutations that require descendant renderers.
+    if (is<RenderListItem>(*renderer))
+        ListItem::updateMarker(m_builder, downcast<RenderListItem>(*renderer));
+    if (is<RenderBlockFlow>(*renderer))
+        MultiColumn::update(downcast<RenderBlockFlow>(*renderer));
+
     if (element.hasCustomStyleResolveCallbacks() && updates && updates->update.change == Style::Detach)
         element.didAttachRenderers();
 }

Modified: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdater.h (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdater.h	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdater.h	2018-01-12 04:51:48 UTC (rev 226843)
@@ -51,8 +51,11 @@
     static void tearDownRenderers(Element&);
     static void tearDownRenderer(Text&);
 
+    class ListItem;
+
 private:
     class GeneratedContent;
+    class MultiColumn;
 
     void updateRenderTree(ContainerNode& root);
     void updateTextRenderer(Text&, const Style::TextUpdate*);

Modified: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterGeneratedContent.cpp (226842 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterGeneratedContent.cpp	2018-01-12 04:47:31 UTC (rev 226842)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterGeneratedContent.cpp	2018-01-12 04:51:48 UTC (rev 226843)
@@ -34,6 +34,7 @@
 #include "RenderImage.h"
 #include "RenderQuote.h"
 #include "RenderTreeUpdater.h"
+#include "RenderTreeUpdaterListItem.h"
 #include "StyleTreeResolver.h"
 
 namespace WebCore {
@@ -151,7 +152,8 @@
         for (auto& child : descendantsOfType<RenderQuote>(*pseudoElementRenderer))
             updateQuotesUpTo(&child);
     }
-    m_updater.m_builder.updateAfterDescendants(*pseudoElementRenderer);
+    if (is<RenderListItem>(*pseudoElementRenderer))
+        ListItem::updateMarker(m_updater.m_builder, downcast<RenderListItem>(*pseudoElementRenderer));
 }
 
 bool RenderTreeUpdater::GeneratedContent::needsPseudoElement(const std::optional<Style::ElementUpdate>& update)

Copied: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterListItem.cpp (from rev 226834, branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderList.cpp) (0 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterListItem.cpp	                        (rev 0)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterListItem.cpp	2018-01-12 04:51:48 UTC (rev 226843)
@@ -0,0 +1,123 @@
+/**
+ * Copyright (C) 1999 Lars Knoll (kn...@kde.org)
+ *           (C) 1999 Antti Koivisto (koivi...@kde.org)
+ * Copyright (C) 2003-2006, 2010, 2017 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Andrew Wellington (pro...@wiretapped.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include "RenderTreeUpdaterListItem.h"
+
+#include "RenderChildIterator.h"
+#include "RenderListMarker.h"
+#include "RenderMultiColumnFlow.h"
+#include "RenderRuby.h"
+#include "RenderTable.h"
+
+namespace WebCore {
+
+static RenderBlock* getParentOfFirstLineBox(RenderBlock& current, RenderObject& marker)
+{
+    bool inQuirksMode = current.document().inQuirksMode();
+    for (auto& child : childrenOfType<RenderObject>(current)) {
+        if (&child == &marker)
+            continue;
+
+        if (child.isInline() && (!is<RenderInline>(child) || current.generatesLineBoxesForInlineChild(&child)))
+            return &current;
+
+        if (child.isFloating() || child.isOutOfFlowPositioned())
+            continue;
+
+        if (!is<RenderBlock>(child) || is<RenderTable>(child) || is<RenderRubyAsBlock>(child))
+            break;
+
+        if (is<RenderBox>(child) && downcast<RenderBox>(child).isWritingModeRoot())
+            break;
+
+        if (is<RenderListItem>(current) && inQuirksMode && child.node() && isHTMLListElement(*child.node()))
+            break;
+
+        if (RenderBlock* lineBox = getParentOfFirstLineBox(downcast<RenderBlock>(child), marker))
+            return lineBox;
+    }
+
+    return nullptr;
+}
+
+static RenderObject* firstNonMarkerChild(RenderBlock& parent)
+{
+    RenderObject* child = parent.firstChild();
+    while (is<RenderListMarker>(child))
+        child = child->nextSibling();
+    return child;
+}
+
+void RenderTreeUpdater::ListItem::updateMarker(RenderTreeBuilder& builder, RenderListItem& listItemRenderer)
+{
+    RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(!listItemRenderer.view().frameView().layoutContext().layoutState());
+
+    auto& style = listItemRenderer.style();
+
+    if (style.listStyleType() == NoneListStyle && (!style.listStyleImage() || style.listStyleImage()->errorOccurred())) {
+        if (auto* marker = listItemRenderer.markerRenderer())
+            marker->removeFromParentAndDestroy();
+        return;
+    }
+
+    auto newStyle = listItemRenderer.computeMarkerStyle();
+    RenderPtr<RenderListMarker> newMarkerRenderer;
+    auto* markerRenderer = listItemRenderer.markerRenderer();
+    if (markerRenderer)
+        markerRenderer->setStyle(WTFMove(newStyle));
+    else {
+        newMarkerRenderer = WebCore::createRenderer<RenderListMarker>(listItemRenderer, WTFMove(newStyle));
+        newMarkerRenderer->initializeStyle();
+        markerRenderer = newMarkerRenderer.get();
+        listItemRenderer.setMarkerRenderer(*markerRenderer);
+    }
+
+    RenderElement* currentParent = markerRenderer->parent();
+    RenderBlock* newParent = getParentOfFirstLineBox(listItemRenderer, *markerRenderer);
+    if (!newParent) {
+        // If the marker is currently contained inside an anonymous box,
+        // then we are the only item in that anonymous box (since no line box
+        // parent was found). It's ok to just leave the marker where it is
+        // in this case.
+        if (currentParent && currentParent->isAnonymousBlock())
+            return;
+        if (auto* multiColumnFlow = listItemRenderer.multiColumnFlow())
+            newParent = multiColumnFlow;
+        else
+            newParent = &listItemRenderer;
+    }
+
+    if (newParent != currentParent) {
+        if (currentParent)
+            builder.insertChild(*newParent, currentParent->takeChild(*markerRenderer), firstNonMarkerChild(*newParent));
+        else
+            builder.insertChild(*newParent, WTFMove(newMarkerRenderer), firstNonMarkerChild(*newParent));
+
+        // If current parent is an anonymous block that has lost all its children, destroy it.
+        if (currentParent && currentParent->isAnonymousBlock() && !currentParent->firstChild() && !downcast<RenderBlock>(*currentParent).continuation())
+            currentParent->removeFromParentAndDestroy();
+    }
+}
+
+}

Copied: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterListItem.h (from rev 226834, branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderList.h) (0 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterListItem.h	                        (rev 0)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterListItem.h	2018-01-12 04:51:48 UTC (rev 226843)
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "RenderListItem.h"
+#include "RenderTreeUpdater.h"
+
+namespace WebCore {
+
+class RenderTreeUpdater::ListItem {
+public:
+    static void updateMarker(RenderTreeBuilder&, RenderListItem&);
+};
+
+}

Copied: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterMultiColumn.cpp (from rev 226834, branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp) (0 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterMultiColumn.cpp	                        (rev 0)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterMultiColumn.cpp	2018-01-12 04:51:48 UTC (rev 226843)
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 1999 Lars Knoll (kn...@kde.org)
+ *           (C) 1999 Antti Koivisto (koivi...@kde.org)
+ *           (C) 2007 David Smith (catfish....@gmail.com)
+ * Copyright (C) 2003-2015, 2017 Apple Inc. All rights reserved.
+ * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include "RenderTreeUpdaterMultiColumn.h"
+
+#include "RenderBlockFlow.h"
+#include "RenderChildIterator.h"
+#include "RenderMultiColumnFlow.h"
+#include "RenderMultiColumnSet.h"
+#include "RenderMultiColumnSpannerPlaceholder.h"
+#include "RenderTreeBuilder.h"
+
+namespace WebCore {
+
+void RenderTreeUpdater::MultiColumn::update(RenderBlockFlow& flow)
+{
+    bool needsFragmentedFlow = flow.requiresColumns(flow.style().columnCount());
+    bool hasFragmentedFlow = flow.multiColumnFlow();
+
+    if (!hasFragmentedFlow && needsFragmentedFlow) {
+        createFragmentedFlow(flow);
+        return;
+    }
+    if (hasFragmentedFlow && !needsFragmentedFlow) {
+        destroyFragmentedFlow(flow);
+        return;
+    }
+}
+
+void RenderTreeUpdater::MultiColumn::createFragmentedFlow(RenderBlockFlow& flow)
+{
+    flow.setChildrenInline(false); // Do this to avoid wrapping inline children that are just going to move into the flow thread.
+    flow.deleteLines();
+    // If this soon-to-be multicolumn flow is already part of a multicolumn context, we need to move back the descendant spanners
+    // to their original position before moving subtrees around.
+    auto* enclosingflow = flow.enclosingFragmentedFlow();
+    if (is<RenderMultiColumnFlow>(enclosingflow)) {
+        auto& spanners = downcast<RenderMultiColumnFlow>(enclosingflow)->spannerMap();
+        Vector<RenderMultiColumnSpannerPlaceholder*> placeholdersToDelete;
+        for (auto& spannerAndPlaceholder : spanners) {
+            auto& placeholder = *spannerAndPlaceholder.value;
+            if (!placeholder.isDescendantOf(&flow))
+                continue;
+            placeholdersToDelete.append(&placeholder);
+        }
+        for (auto* placeholder : placeholdersToDelete) {
+            auto* spanner = placeholder->spanner();
+            if (!spanner) {
+                ASSERT_NOT_REACHED();
+                continue;
+            }
+            // Move the spanner back to its original position.
+            auto& spannerOriginalParent = *placeholder->parent();
+            // Detaching the spanner takes care of removing the placeholder (and merges the RenderMultiColumnSets).
+            auto spannerToReInsert = spanner->parent()->takeChild(*spanner);
+            RenderTreeBuilder::current()->insertChild(spannerOriginalParent, WTFMove(spannerToReInsert));
+        }
+    }
+
+    auto newFragmentedFlow = WebCore::createRenderer<RenderMultiColumnFlow>(flow.document(), RenderStyle::createAnonymousStyleWithDisplay(flow.style(), BLOCK));
+    newFragmentedFlow->initializeStyle();
+    auto& fragmentedFlow = *newFragmentedFlow;
+    flow.RenderBlock::addChild(*RenderTreeBuilder::current(), WTFMove(newFragmentedFlow));
+
+    // Reparent children preceding the fragmented flow into the fragmented flow.
+    flow.moveChildrenTo(&fragmentedFlow, flow.firstChild(), &fragmentedFlow, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
+    if (flow.isFieldset()) {
+        // Keep legends out of the flow thread.
+        for (auto& box : childrenOfType<RenderBox>(fragmentedFlow)) {
+            if (box.isLegend())
+                fragmentedFlow.moveChildTo(&flow, &box, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
+        }
+    }
+
+    flow.setMultiColumnFlow(fragmentedFlow);
+}
+
+void RenderTreeUpdater::MultiColumn::destroyFragmentedFlow(RenderBlockFlow& flow)
+{
+    auto& multiColumnFlow = *flow.multiColumnFlow();
+    multiColumnFlow.deleteLines();
+
+    // Move spanners back to their original DOM position in the tree, and destroy the placeholders.
+    auto& spanners = multiColumnFlow.spannerMap();
+    Vector<RenderMultiColumnSpannerPlaceholder*> placeholdersToDelete;
+    for (auto& spannerAndPlaceholder : spanners)
+        placeholdersToDelete.append(spannerAndPlaceholder.value.get());
+    Vector<std::pair<RenderElement*, RenderPtr<RenderObject>>> parentAndSpannerList;
+    for (auto* placeholder : placeholdersToDelete) {
+        auto* spannerOriginalParent = placeholder->parent();
+        if (spannerOriginalParent == &multiColumnFlow)
+            spannerOriginalParent = &flow;
+        // Detaching the spanner takes care of removing the placeholder (and merges the RenderMultiColumnSets).
+        auto* spanner = placeholder->spanner();
+        parentAndSpannerList.append(std::make_pair(spannerOriginalParent, spanner->parent()->takeChild(*spanner)));
+    }
+    while (auto* columnSet = multiColumnFlow.firstMultiColumnSet())
+        columnSet->removeFromParentAndDestroy();
+
+    flow.clearMultiColumnFlow();
+    multiColumnFlow.moveAllChildrenTo(&flow, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
+    multiColumnFlow.removeFromParentAndDestroy();
+    for (auto& parentAndSpanner : parentAndSpannerList)
+        RenderTreeBuilder::current()->insertChild(*parentAndSpanner.first, WTFMove(parentAndSpanner.second));
+}
+
+}

Copied: branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterMultiColumn.h (from rev 226834, branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.h) (0 => 226843)


--- branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterMultiColumn.h	                        (rev 0)
+++ branches/safari-605-branch/Source/WebCore/rendering/updating/RenderTreeUpdaterMultiColumn.h	2018-01-12 04:51:48 UTC (rev 226843)
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "RenderTreeUpdater.h"
+
+namespace WebCore {
+
+class RenderBlockFlow;
+
+class RenderTreeUpdater::MultiColumn {
+public:
+    static void update(RenderBlockFlow&);
+
+private:
+    static void createFragmentedFlow(RenderBlockFlow&);
+    static void destroyFragmentedFlow(RenderBlockFlow&);
+};
+
+}
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to