| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> | 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> |
| 3 * 1999 Lars Knoll <knoll@kde.org> | 3 * 1999 Lars Knoll <knoll@kde.org> |
| 4 * 1999 Antti Koivisto <koivisto@kde.org> | 4 * 1999 Antti Koivisto <koivisto@kde.org> |
| 5 * 2000 Dirk Mueller <mueller@kde.org> | 5 * 2000 Dirk Mueller <mueller@kde.org> |
| 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
| 7 * (C) 2006 Graham Dennis (graham.dennis@gmail.com) | 7 * (C) 2006 Graham Dennis (graham.dennis@gmail.com) |
| 8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
| 9 * Copyright (C) 2009 Google Inc. All rights reserved. | 9 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 10 * | 10 * |
| (...skipping 1017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1028 ASSERT(inSubtreeLayout || m_layoutSubtreeRootList.isEmpty()); | 1028 ASSERT(inSubtreeLayout || m_layoutSubtreeRootList.isEmpty()); |
| 1029 | 1029 |
| 1030 int contentsHeightBeforeLayout = layoutViewItem().documentRect().height(); | 1030 int contentsHeightBeforeLayout = layoutViewItem().documentRect().height(); |
| 1031 TRACE_EVENT_BEGIN1(PERFORM_LAYOUT_TRACE_CATEGORIES, | 1031 TRACE_EVENT_BEGIN1(PERFORM_LAYOUT_TRACE_CATEGORIES, |
| 1032 "FrameView::performLayout", "contentsHeightBeforeLayout", | 1032 "FrameView::performLayout", "contentsHeightBeforeLayout", |
| 1033 contentsHeightBeforeLayout); | 1033 contentsHeightBeforeLayout); |
| 1034 prepareLayoutAnalyzer(); | 1034 prepareLayoutAnalyzer(); |
| 1035 | 1035 |
| 1036 ScriptForbiddenScope forbidScript; | 1036 ScriptForbiddenScope forbidScript; |
| 1037 | 1037 |
| 1038 if (inSubtreeLayout && hasOrthogonalWritingModeRoots()) { |
| 1039 // If we're going to lay out from each subtree root, rather than once from |
| 1040 // LayoutView, we need to merge the depth-ordered orthogonal writing mode |
| 1041 // root list into the depth-ordered list of subtrees scheduled for |
| 1042 // layout. Otherwise, during layout of one such subtree, we'd risk skipping |
| 1043 // over a subtree of objects needing layout. |
| 1044 DCHECK(!m_layoutSubtreeRootList.isEmpty()); |
| 1045 scheduleOrthogonalWritingModeRootsForLayout(); |
| 1046 } |
| 1047 |
| 1038 ASSERT(!isInPerformLayout()); | 1048 ASSERT(!isInPerformLayout()); |
| 1039 lifecycle().advanceTo(DocumentLifecycle::InPerformLayout); | 1049 lifecycle().advanceTo(DocumentLifecycle::InPerformLayout); |
| 1040 | 1050 |
| 1041 // performLayout is the actual guts of layout(). | 1051 // performLayout is the actual guts of layout(). |
| 1042 // FIXME: The 300 other lines in layout() probably belong in other helper | 1052 // FIXME: The 300 other lines in layout() probably belong in other helper |
| 1043 // functions so that a single human could understand what layout() is actually | 1053 // functions so that a single human could understand what layout() is actually |
| 1044 // doing. | 1054 // doing. |
| 1045 | 1055 |
| 1046 forceLayoutParentViewIfNeeded(); | 1056 forceLayoutParentViewIfNeeded(); |
| 1047 | 1057 |
| 1048 if (hasOrthogonalWritingModeRoots()) | |
| 1049 layoutOrthogonalWritingModeRoots(); | |
| 1050 | |
| 1051 if (inSubtreeLayout) { | 1058 if (inSubtreeLayout) { |
| 1052 if (m_analyzer) | 1059 if (m_analyzer) |
| 1053 m_analyzer->increment(LayoutAnalyzer::PerformLayoutRootLayoutObjects, | 1060 m_analyzer->increment(LayoutAnalyzer::PerformLayoutRootLayoutObjects, |
| 1054 m_layoutSubtreeRootList.size()); | 1061 m_layoutSubtreeRootList.size()); |
| 1055 for (auto& root : m_layoutSubtreeRootList.ordered()) { | 1062 for (auto& root : m_layoutSubtreeRootList.ordered()) { |
| 1056 if (!root->needsLayout()) | 1063 if (!root->needsLayout()) |
| 1057 continue; | 1064 continue; |
| 1058 layoutFromRootObject(*root); | 1065 layoutFromRootObject(*root); |
| 1059 | 1066 |
| 1060 // We need to ensure that we mark up all layoutObjects up to the | 1067 // We need to ensure that we mark up all layoutObjects up to the |
| 1061 // LayoutView for paint invalidation. This simplifies our code as we just | 1068 // LayoutView for paint invalidation. This simplifies our code as we just |
| 1062 // always do a full tree walk. | 1069 // always do a full tree walk. |
| 1063 if (LayoutItem container = LayoutItem(root->container())) | 1070 if (LayoutItem container = LayoutItem(root->container())) |
| 1064 container.setMayNeedPaintInvalidation(); | 1071 container.setMayNeedPaintInvalidation(); |
| 1065 } | 1072 } |
| 1066 m_layoutSubtreeRootList.clear(); | 1073 m_layoutSubtreeRootList.clear(); |
| 1067 } else { | 1074 } else { |
| 1075 if (hasOrthogonalWritingModeRoots()) |
| 1076 layoutOrthogonalWritingModeRoots(); |
| 1068 layoutFromRootObject(*layoutView()); | 1077 layoutFromRootObject(*layoutView()); |
| 1069 } | 1078 } |
| 1070 | 1079 |
| 1071 m_frame->document()->fetcher()->updateAllImageResourcePriorities(); | 1080 m_frame->document()->fetcher()->updateAllImageResourcePriorities(); |
| 1072 | 1081 |
| 1073 lifecycle().advanceTo(DocumentLifecycle::AfterPerformLayout); | 1082 lifecycle().advanceTo(DocumentLifecycle::AfterPerformLayout); |
| 1074 | 1083 |
| 1075 TRACE_EVENT_END1(PERFORM_LAYOUT_TRACE_CATEGORIES, "FrameView::performLayout", | 1084 TRACE_EVENT_END1(PERFORM_LAYOUT_TRACE_CATEGORIES, "FrameView::performLayout", |
| 1076 "counters", analyzerCounters()); | 1085 "counters", analyzerCounters()); |
| 1077 FirstMeaningfulPaintDetector::from(*m_frame->document()) | 1086 FirstMeaningfulPaintDetector::from(*m_frame->document()) |
| (...skipping 1039 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2117 // since the containing block of orthogonal writing mode roots | 2126 // since the containing block of orthogonal writing mode roots |
| 2118 // having floats is very rare, prefer to re-create | 2127 // having floats is very rare, prefer to re-create |
| 2119 // FloatingObjects. | 2128 // FloatingObjects. |
| 2120 if (LayoutBlock* cb = root.containingBlock()) { | 2129 if (LayoutBlock* cb = root.containingBlock()) { |
| 2121 if ((cb->normalChildNeedsLayout() || cb->selfNeedsLayout()) && | 2130 if ((cb->normalChildNeedsLayout() || cb->selfNeedsLayout()) && |
| 2122 cb->isLayoutBlockFlow()) | 2131 cb->isLayoutBlockFlow()) |
| 2123 toLayoutBlockFlow(cb)->removeFloatingObjects(); | 2132 toLayoutBlockFlow(cb)->removeFloatingObjects(); |
| 2124 } | 2133 } |
| 2125 } | 2134 } |
| 2126 | 2135 |
| 2136 static bool prepareOrthogonalWritingModeRootForLayout(LayoutObject& root) { |
| 2137 DCHECK(root.isBox() && toLayoutBox(root).isOrthogonalWritingModeRoot()); |
| 2138 if (!root.needsLayout() || root.isOutOfFlowPositioned() || |
| 2139 root.isColumnSpanAll() || |
| 2140 !root.styleRef().logicalHeight().isIntrinsicOrAuto()) |
| 2141 return false; |
| 2142 |
| 2143 removeFloatingObjectsForSubtreeRoot(root); |
| 2144 return true; |
| 2145 } |
| 2146 |
| 2127 void FrameView::layoutOrthogonalWritingModeRoots() { | 2147 void FrameView::layoutOrthogonalWritingModeRoots() { |
| 2128 for (auto& root : m_orthogonalWritingModeRootList.ordered()) { | 2148 for (auto& root : m_orthogonalWritingModeRootList.ordered()) { |
| 2129 ASSERT(root->isBox() && toLayoutBox(*root).isOrthogonalWritingModeRoot()); | 2149 if (prepareOrthogonalWritingModeRootForLayout(*root)) |
| 2130 if (!root->needsLayout() || root->isOutOfFlowPositioned() || | 2150 layoutFromRootObject(*root); |
| 2131 root->isColumnSpanAll() || | |
| 2132 !root->styleRef().logicalHeight().isIntrinsicOrAuto()) { | |
| 2133 continue; | |
| 2134 } | |
| 2135 | |
| 2136 removeFloatingObjectsForSubtreeRoot(*root); | |
| 2137 layoutFromRootObject(*root); | |
| 2138 } | 2151 } |
| 2139 } | 2152 } |
| 2140 | 2153 |
| 2154 void FrameView::scheduleOrthogonalWritingModeRootsForLayout() { |
| 2155 for (auto& root : m_orthogonalWritingModeRootList.ordered()) { |
| 2156 if (prepareOrthogonalWritingModeRootForLayout(*root)) |
| 2157 m_layoutSubtreeRootList.add(*root); |
| 2158 } |
| 2159 } |
| 2160 |
| 2141 bool FrameView::checkLayoutInvalidationIsAllowed() const { | 2161 bool FrameView::checkLayoutInvalidationIsAllowed() const { |
| 2142 if (m_allowsLayoutInvalidationAfterLayoutClean) | 2162 if (m_allowsLayoutInvalidationAfterLayoutClean) |
| 2143 return true; | 2163 return true; |
| 2144 | 2164 |
| 2145 // If we are updating all lifecycle phases beyond LayoutClean, we don't expect | 2165 // If we are updating all lifecycle phases beyond LayoutClean, we don't expect |
| 2146 // dirty layout after LayoutClean. | 2166 // dirty layout after LayoutClean. |
| 2147 CHECK_FOR_DIRTY_LAYOUT(lifecycle().state() < DocumentLifecycle::LayoutClean); | 2167 CHECK_FOR_DIRTY_LAYOUT(lifecycle().state() < DocumentLifecycle::LayoutClean); |
| 2148 | 2168 |
| 2149 return true; | 2169 return true; |
| 2150 } | 2170 } |
| (...skipping 2848 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4999 // This is the top-level frame, so no mapping necessary. | 5019 // This is the top-level frame, so no mapping necessary. |
| 5000 if (m_frame->isMainFrame()) | 5020 if (m_frame->isMainFrame()) |
| 5001 return; | 5021 return; |
| 5002 | 5022 |
| 5003 LayoutRect viewportIntersectionRect(remoteViewportIntersection()); | 5023 LayoutRect viewportIntersectionRect(remoteViewportIntersection()); |
| 5004 transformState.move( | 5024 transformState.move( |
| 5005 LayoutSize(-viewportIntersectionRect.x(), -viewportIntersectionRect.y())); | 5025 LayoutSize(-viewportIntersectionRect.x(), -viewportIntersectionRect.y())); |
| 5006 } | 5026 } |
| 5007 | 5027 |
| 5008 } // namespace blink | 5028 } // namespace blink |
| OLD | NEW |