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 ¤t;
-
- 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 ¤t;
+
+ 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&);
+};
+
+}