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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 // The maximum number of updateWidgets iterations that should be done before ret
urning. | 101 // The maximum number of updateWidgets iterations that should be done before ret
urning. |
102 static const unsigned maxUpdateWidgetsIterations = 2; | 102 static const unsigned maxUpdateWidgetsIterations = 2; |
103 static const double resourcePriorityUpdateDelayAfterScroll = 0.250; | 103 static const double resourcePriorityUpdateDelayAfterScroll = 0.250; |
104 | 104 |
105 FrameView::FrameView(LocalFrame* frame) | 105 FrameView::FrameView(LocalFrame* frame) |
106 : m_frame(frame) | 106 : m_frame(frame) |
107 , m_displayMode(WebDisplayModeBrowser) | 107 , m_displayMode(WebDisplayModeBrowser) |
108 , m_canHaveScrollbars(true) | 108 , m_canHaveScrollbars(true) |
109 , m_slowRepaintObjectCount(0) | 109 , m_slowRepaintObjectCount(0) |
110 , m_hasPendingLayout(false) | 110 , m_hasPendingLayout(false) |
111 , m_layoutSubtreeRoot(0) | 111 , m_isSubtreeLayout(false) |
112 , m_inSynchronousPostLayout(false) | 112 , m_inSynchronousPostLayout(false) |
113 , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired) | 113 , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired) |
114 , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired) | 114 , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired) |
115 , m_isTransparent(false) | 115 , m_isTransparent(false) |
116 , m_baseBackgroundColor(Color::white) | 116 , m_baseBackgroundColor(Color::white) |
117 , m_mediaType(MediaTypeNames::screen) | 117 , m_mediaType(MediaTypeNames::screen) |
118 , m_overflowStatusDirty(true) | 118 , m_overflowStatusDirty(true) |
119 , m_viewportRenderer(0) | 119 , m_viewportRenderer(0) |
120 , m_wasScrolledByUser(false) | 120 , m_wasScrolledByUser(false) |
121 , m_inProgrammaticScroll(false) | 121 , m_inProgrammaticScroll(false) |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 visitor->trace(m_horizontalScrollbar); | 220 visitor->trace(m_horizontalScrollbar); |
221 visitor->trace(m_verticalScrollbar); | 221 visitor->trace(m_verticalScrollbar); |
222 visitor->trace(m_children); | 222 visitor->trace(m_children); |
223 #endif | 223 #endif |
224 Widget::trace(visitor); | 224 Widget::trace(visitor); |
225 } | 225 } |
226 | 226 |
227 void FrameView::reset() | 227 void FrameView::reset() |
228 { | 228 { |
229 m_hasPendingLayout = false; | 229 m_hasPendingLayout = false; |
230 m_layoutSubtreeRoot = nullptr; | 230 m_isSubtreeLayout = false; |
231 m_doFullPaintInvalidation = false; | 231 m_doFullPaintInvalidation = false; |
232 m_layoutSchedulingEnabled = true; | 232 m_layoutSchedulingEnabled = true; |
233 m_inPerformLayout = false; | 233 m_inPerformLayout = false; |
234 m_inSynchronousPostLayout = false; | 234 m_inSynchronousPostLayout = false; |
235 m_layoutCount = 0; | 235 m_layoutCount = 0; |
236 m_nestedLayoutCount = 0; | 236 m_nestedLayoutCount = 0; |
237 m_postLayoutTasksTimer.stop(); | 237 m_postLayoutTasksTimer.stop(); |
238 m_updateWidgetsTimer.stop(); | 238 m_updateWidgetsTimer.stop(); |
239 m_firstLayout = true; | 239 m_firstLayout = true; |
240 m_firstLayoutCallbackPending = false; | 240 m_firstLayoutCallbackPending = false; |
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
757 | 757 |
758 bool FrameView::isEnclosedInCompositingLayer() const | 758 bool FrameView::isEnclosedInCompositingLayer() const |
759 { | 759 { |
760 // FIXME: It's a bug that compositing state isn't always up to date when thi
s is called. crbug.com/366314 | 760 // FIXME: It's a bug that compositing state isn't always up to date when thi
s is called. crbug.com/366314 |
761 DisableCompositingQueryAsserts disabler; | 761 DisableCompositingQueryAsserts disabler; |
762 | 762 |
763 LayoutObject* frameOwnerRenderer = m_frame->ownerRenderer(); | 763 LayoutObject* frameOwnerRenderer = m_frame->ownerRenderer(); |
764 return frameOwnerRenderer && frameOwnerRenderer->enclosingLayer()->enclosing
LayerForPaintInvalidationCrossingFrameBoundaries(); | 764 return frameOwnerRenderer && frameOwnerRenderer->enclosingLayer()->enclosing
LayerForPaintInvalidationCrossingFrameBoundaries(); |
765 } | 765 } |
766 | 766 |
767 LayoutObject* FrameView::layoutRoot(bool onlyDuringLayout) const | 767 static inline void countObjectsNeedingLayoutInRoot(const LayoutObject* root, uns
igned& needsLayoutObjects, unsigned& totalObjects) |
768 { | 768 { |
769 return onlyDuringLayout && layoutPending() ? nullptr : m_layoutSubtreeRoot; | 769 for (const LayoutObject* o = root; o; o = o->nextInPreOrder(root)) { |
| 770 ++totalObjects; |
| 771 if (o->needsLayout()) |
| 772 ++needsLayoutObjects; |
| 773 } |
| 774 } |
| 775 |
| 776 void FrameView::countObjectsNeedingLayout(unsigned& needsLayoutObjects, unsigned
& totalObjects, bool& isSubtree) |
| 777 { |
| 778 needsLayoutObjects = 0; |
| 779 totalObjects = 0; |
| 780 if (isSubtreeLayout()) { |
| 781 isSubtree = true; |
| 782 for (auto& subtreeRoot : m_layoutSubtreeRoots) |
| 783 countObjectsNeedingLayoutInRoot(subtreeRoot, needsLayoutObjects, tot
alObjects); |
| 784 } else { |
| 785 isSubtree = false; |
| 786 countObjectsNeedingLayoutInRoot(m_frame->document()->renderView(), needs
LayoutObjects, totalObjects); |
| 787 } |
| 788 } |
| 789 |
| 790 bool FrameView::isLayoutRoot(const LayoutObject* object) const |
| 791 { |
| 792 return m_layoutSubtreeRoots.contains(const_cast<LayoutObject*>(object)); |
770 } | 793 } |
771 | 794 |
772 inline void FrameView::forceLayoutParentViewIfNeeded() | 795 inline void FrameView::forceLayoutParentViewIfNeeded() |
773 { | 796 { |
774 LayoutPart* ownerRenderer = m_frame->ownerRenderer(); | 797 LayoutPart* ownerRenderer = m_frame->ownerRenderer(); |
775 if (!ownerRenderer || !ownerRenderer->frame()) | 798 if (!ownerRenderer || !ownerRenderer->frame()) |
776 return; | 799 return; |
777 | 800 |
778 RenderBox* contentBox = embeddedContentBox(); | 801 RenderBox* contentBox = embeddedContentBox(); |
779 if (!contentBox) | 802 if (!contentBox) |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
828 | 851 |
829 document->updateRenderTreeIfNeeded(); | 852 document->updateRenderTreeIfNeeded(); |
830 lifecycle().advanceTo(DocumentLifecycle::StyleClean); | 853 lifecycle().advanceTo(DocumentLifecycle::StyleClean); |
831 } | 854 } |
832 | 855 |
833 void FrameView::lineLayoutTime(double ms) | 856 void FrameView::lineLayoutTime(double ms) |
834 { | 857 { |
835 m_lineLayoutMs += ms; | 858 m_lineLayoutMs += ms; |
836 } | 859 } |
837 | 860 |
838 void FrameView::performLayout(LayoutObject* rootForThisLayout, bool inSubtreeLay
out) | 861 static void gatherDebugLayoutRects(LayoutObject& layoutRoot) |
839 { | 862 { |
| 863 bool isTracing; |
| 864 TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("blink.debug.la
yout"), &isTracing); |
| 865 if (!isTracing) |
| 866 return; |
| 867 if (!layoutRoot.enclosingLayer()->hasCompositedLayerMapping()) |
| 868 return; |
| 869 // For access to compositedLayerMapping(). |
| 870 DisableCompositingQueryAsserts disabler; |
| 871 GraphicsLayer* graphicsLayer = layoutRoot.enclosingLayer()->compositedLayerM
apping()->mainGraphicsLayer(); |
| 872 if (!graphicsLayer) |
| 873 return; |
| 874 |
| 875 GraphicsLayerDebugInfo& debugInfo = graphicsLayer->debugInfo(); |
| 876 |
| 877 debugInfo.currentLayoutRects().clear(); |
| 878 for (LayoutObject* renderer = &layoutRoot; renderer; renderer = renderer->ne
xtInPreOrder()) { |
| 879 if (renderer->layoutDidGetCalledSinceLastFrame()) { |
| 880 FloatQuad quad = renderer->localToAbsoluteQuad(FloatQuad(renderer->p
reviousPaintInvalidationRect())); |
| 881 LayoutRect rect = quad.enclosingBoundingBox(); |
| 882 debugInfo.currentLayoutRects().append(rect); |
| 883 } |
| 884 } |
| 885 } |
| 886 |
| 887 static inline void layoutFromRootObject(LayoutObject& root) |
| 888 { |
| 889 LayoutState layoutState(root); |
| 890 root.layout(); |
| 891 gatherDebugLayoutRects(root); |
| 892 } |
| 893 |
| 894 void FrameView::performLayout(bool inSubtreeLayout) |
| 895 { |
| 896 ASSERT(inSubtreeLayout || m_layoutSubtreeRoots.isEmpty()); |
| 897 |
840 m_lineLayoutMs = 0; | 898 m_lineLayoutMs = 0; |
841 TRACE_EVENT0("blink,benchmark", "FrameView::performLayout"); | 899 TRACE_EVENT0("blink,benchmark", "FrameView::performLayout"); |
842 double start = WTF::currentTimeMS(); | 900 double start = WTF::currentTimeMS(); |
843 | 901 |
844 ScriptForbiddenScope forbidScript; | 902 ScriptForbiddenScope forbidScript; |
845 | 903 |
846 ASSERT(!isInPerformLayout()); | 904 ASSERT(!isInPerformLayout()); |
847 lifecycle().advanceTo(DocumentLifecycle::InPerformLayout); | 905 lifecycle().advanceTo(DocumentLifecycle::InPerformLayout); |
848 | 906 |
849 TemporaryChange<bool> changeInPerformLayout(m_inPerformLayout, true); | 907 TemporaryChange<bool> changeInPerformLayout(m_inPerformLayout, true); |
850 | 908 |
851 // performLayout is the actual guts of layout(). | 909 // performLayout is the actual guts of layout(). |
852 // FIXME: The 300 other lines in layout() probably belong in other helper fu
nctions | 910 // FIXME: The 300 other lines in layout() probably belong in other helper fu
nctions |
853 // so that a single human could understand what layout() is actually doing. | 911 // so that a single human could understand what layout() is actually doing. |
854 | 912 |
855 LayoutState layoutState(*rootForThisLayout); | |
856 | |
857 forceLayoutParentViewIfNeeded(); | 913 forceLayoutParentViewIfNeeded(); |
858 | 914 |
859 rootForThisLayout->layout(); | 915 if (inSubtreeLayout) { |
860 gatherDebugLayoutRects(rootForThisLayout); | 916 while (m_layoutSubtreeRoots.size()) { |
| 917 LayoutObject& root = *m_layoutSubtreeRoots.takeAny(); |
| 918 if (!root.needsLayout()) |
| 919 continue; |
| 920 layoutFromRootObject(root); |
| 921 |
| 922 // We need to ensure that we mark up all renderers up to the RenderV
iew |
| 923 // for paint invalidation. This simplifies our code as we just alway
s |
| 924 // do a full tree walk. |
| 925 if (LayoutObject* container = root.container()) |
| 926 container->setMayNeedPaintInvalidation(); |
| 927 } |
| 928 } else { |
| 929 layoutFromRootObject(*m_frame->document()->renderView()); |
| 930 } |
861 | 931 |
862 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->updateAllIma
geResourcePriorities(); | 932 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->updateAllIma
geResourcePriorities(); |
863 | 933 |
864 lifecycle().advanceTo(DocumentLifecycle::AfterPerformLayout); | 934 lifecycle().advanceTo(DocumentLifecycle::AfterPerformLayout); |
865 int layoutMs = (WTF::currentTimeMS() - start); | 935 int layoutMs = (WTF::currentTimeMS() - start); |
866 Platform::current()->histogramCustomCounts("Renderer.LayoutMs", layoutMs, 0,
1000 * 60, 50); | 936 Platform::current()->histogramCustomCounts("Renderer.LayoutMs", layoutMs, 0,
1000 * 60, 50); |
867 // TODO(benjhayden): re-enable when safe | 937 // TODO(benjhayden): re-enable when safe |
868 // Platform::current()->histogramCustomCounts("Renderer.LineLayoutMs", m_lin
eLayoutMs, 0, 1000 * 60, 50); | 938 // Platform::current()->histogramCustomCounts("Renderer.LineLayoutMs", m_lin
eLayoutMs, 0, 1000 * 60, 50); |
869 } | 939 } |
870 | 940 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
926 | 996 |
927 #if !ENABLE(OILPAN) | 997 #if !ENABLE(OILPAN) |
928 // If there is only one ref to this view left, then its going to be destroye
d as soon as we exit, | 998 // If there is only one ref to this view left, then its going to be destroye
d as soon as we exit, |
929 // so there's no point to continuing to layout | 999 // so there's no point to continuing to layout |
930 if (protector->hasOneRef()) | 1000 if (protector->hasOneRef()) |
931 return; | 1001 return; |
932 #endif | 1002 #endif |
933 | 1003 |
934 Document* document = m_frame->document(); | 1004 Document* document = m_frame->document(); |
935 bool inSubtreeLayout = isSubtreeLayout(); | 1005 bool inSubtreeLayout = isSubtreeLayout(); |
936 LayoutObject* rootForThisLayout = inSubtreeLayout ? m_layoutSubtreeRoot : do
cument->renderView(); | 1006 |
| 1007 // FIXME: The notion of a single root for layout is no longer applicable. Re
move or update this code. crbug.com/460596 |
| 1008 LayoutObject* rootForThisLayout = inSubtreeLayout ? *(m_layoutSubtreeRoots.b
egin()) : renderView(); |
937 if (!rootForThisLayout) { | 1009 if (!rootForThisLayout) { |
938 // FIXME: Do we need to set m_size here? | 1010 // FIXME: Do we need to set m_size here? |
939 ASSERT_NOT_REACHED(); | 1011 ASSERT_NOT_REACHED(); |
940 return; | 1012 return; |
941 } | 1013 } |
942 | 1014 |
943 FontCachePurgePreventer fontCachePurgePreventer; | 1015 FontCachePurgePreventer fontCachePurgePreventer; |
944 Layer* layer; | |
945 { | 1016 { |
946 TemporaryChange<bool> changeSchedulingEnabled(m_layoutSchedulingEnabled,
false); | 1017 TemporaryChange<bool> changeSchedulingEnabled(m_layoutSchedulingEnabled,
false); |
947 | 1018 |
948 m_nestedLayoutCount++; | 1019 m_nestedLayoutCount++; |
949 if (!inSubtreeLayout) { | 1020 if (!inSubtreeLayout) { |
950 Document* document = m_frame->document(); | 1021 clearLayoutSubtreeRootsAndMarkContainingBlocks(); |
951 Node* body = document->body(); | 1022 Node* body = document->body(); |
952 if (body && body->renderer()) { | 1023 if (body && body->renderer()) { |
953 if (isHTMLFrameSetElement(*body)) { | 1024 if (isHTMLFrameSetElement(*body)) { |
954 body->renderer()->setChildNeedsLayout(); | 1025 body->renderer()->setChildNeedsLayout(); |
955 } else if (isHTMLBodyElement(*body)) { | 1026 } else if (isHTMLBodyElement(*body)) { |
956 if (!m_firstLayout && m_size.height() != layoutSize().height
() && body->renderer()->enclosingBox()->stretchesToViewport()) | 1027 if (!m_firstLayout && m_size.height() != layoutSize().height
() && body->renderer()->enclosingBox()->stretchesToViewport()) |
957 body->renderer()->setChildNeedsLayout(); | 1028 body->renderer()->setChildNeedsLayout(); |
958 } | 1029 } |
959 } | 1030 } |
960 } | 1031 } |
961 updateCounters(); | 1032 updateCounters(); |
962 | 1033 |
963 ScrollbarMode hMode; | 1034 ScrollbarMode hMode; |
964 ScrollbarMode vMode; | 1035 ScrollbarMode vMode; |
965 calculateScrollbarModesForLayoutAndSetViewportRenderer(hMode, vMode); | 1036 calculateScrollbarModesForLayoutAndSetViewportRenderer(hMode, vMode); |
966 | 1037 |
967 if (!inSubtreeLayout) { | 1038 if (!inSubtreeLayout) { |
968 // Now set our scrollbar state for the layout. | 1039 // Now set our scrollbar state for the layout. |
969 ScrollbarMode currentHMode = horizontalScrollbarMode(); | 1040 ScrollbarMode currentHMode = horizontalScrollbarMode(); |
970 ScrollbarMode currentVMode = verticalScrollbarMode(); | 1041 ScrollbarMode currentVMode = verticalScrollbarMode(); |
971 | 1042 |
972 if (m_firstLayout) { | 1043 if (m_firstLayout) { |
973 setScrollbarsSuppressed(true); | 1044 setScrollbarsSuppressed(true); |
974 | 1045 |
975 m_doFullPaintInvalidation = true; | 1046 m_doFullPaintInvalidation = true; |
976 m_firstLayout = false; | 1047 m_firstLayout = false; |
977 m_firstLayoutCallbackPending = true; | 1048 m_firstLayoutCallbackPending = true; |
978 m_lastViewportSize = layoutSize(IncludeScrollbars); | 1049 m_lastViewportSize = layoutSize(IncludeScrollbars); |
979 m_lastZoomFactor = rootForThisLayout->style()->zoom(); | 1050 m_lastZoomFactor = renderView()->style()->zoom(); |
980 | 1051 |
981 // Set the initial vMode to AlwaysOn if we're auto. | 1052 // Set the initial vMode to AlwaysOn if we're auto. |
982 if (vMode == ScrollbarAuto) | 1053 if (vMode == ScrollbarAuto) |
983 setVerticalScrollbarMode(ScrollbarAlwaysOn); // This causes
a vertical scrollbar to appear. | 1054 setVerticalScrollbarMode(ScrollbarAlwaysOn); // This causes
a vertical scrollbar to appear. |
984 // Set the initial hMode to AlwaysOff if we're auto. | 1055 // Set the initial hMode to AlwaysOff if we're auto. |
985 if (hMode == ScrollbarAuto) | 1056 if (hMode == ScrollbarAuto) |
986 setHorizontalScrollbarMode(ScrollbarAlwaysOff); // This caus
es a horizontal scrollbar to disappear. | 1057 setHorizontalScrollbarMode(ScrollbarAlwaysOff); // This caus
es a horizontal scrollbar to disappear. |
987 | 1058 |
988 setScrollbarModes(hMode, vMode); | 1059 setScrollbarModes(hMode, vMode); |
989 setScrollbarsSuppressed(false, true); | 1060 setScrollbarsSuppressed(false, true); |
(...skipping 15 matching lines...) Expand all Loading... |
1005 bodyRenderer->setChildNeedsLayout(); | 1076 bodyRenderer->setChildNeedsLayout(); |
1006 else if (rootRenderer && rootRenderer->stretchesToViewport()) | 1077 else if (rootRenderer && rootRenderer->stretchesToViewport()) |
1007 rootRenderer->setChildNeedsLayout(); | 1078 rootRenderer->setChildNeedsLayout(); |
1008 } | 1079 } |
1009 | 1080 |
1010 // We need to set m_doFullPaintInvalidation before triggering layout
as LayoutObject::checkForPaintInvalidation | 1081 // We need to set m_doFullPaintInvalidation before triggering layout
as LayoutObject::checkForPaintInvalidation |
1011 // checks the boolean to disable local paint invalidations. | 1082 // checks the boolean to disable local paint invalidations. |
1012 m_doFullPaintInvalidation |= renderView()->shouldDoFullPaintInvalida
tionForNextLayout(); | 1083 m_doFullPaintInvalidation |= renderView()->shouldDoFullPaintInvalida
tionForNextLayout(); |
1013 } | 1084 } |
1014 | 1085 |
1015 layer = rootForThisLayout->enclosingLayer(); | 1086 performLayout(inSubtreeLayout); |
1016 | 1087 |
1017 performLayout(rootForThisLayout, inSubtreeLayout); | 1088 m_layoutSubtreeRoots.clear(); |
1018 | 1089 m_isSubtreeLayout = false; |
1019 m_layoutSubtreeRoot = nullptr; | |
1020 // We need to ensure that we mark up all renderers up to the RenderView | |
1021 // for paint invalidation. This simplifies our code as we just always | |
1022 // do a full tree walk. | |
1023 if (LayoutObject* container = rootForThisLayout->container()) | |
1024 container->setMayNeedPaintInvalidation(); | |
1025 } // Reset m_layoutSchedulingEnabled to its previous value. | 1090 } // Reset m_layoutSchedulingEnabled to its previous value. |
1026 | 1091 |
1027 if (!inSubtreeLayout && !toRenderView(rootForThisLayout)->document().printin
g()) | 1092 if (!inSubtreeLayout && !document->printing()) |
1028 adjustViewSize(); | 1093 adjustViewSize(); |
1029 | 1094 |
1030 layer->updateLayerPositionsAfterLayout(); | 1095 // FIXME: Could find the common ancestor layer of all dirty subtrees and mar
k from there. |
| 1096 renderView()->enclosingLayer()->updateLayerPositionsAfterLayout(); |
1031 | 1097 |
1032 renderView()->compositor()->didLayout(); | 1098 renderView()->compositor()->didLayout(); |
1033 | 1099 |
1034 m_layoutCount++; | 1100 m_layoutCount++; |
1035 | 1101 |
1036 if (AXObjectCache* cache = rootForThisLayout->document().axObjectCache()) { | 1102 if (AXObjectCache* cache = document->axObjectCache()) { |
1037 const KURL& url = rootForThisLayout->document().url(); | 1103 const KURL& url = document->url(); |
1038 if (url.isValid() && !url.isAboutBlankURL()) | 1104 if (url.isValid() && !url.isAboutBlankURL()) |
1039 cache->handleLayoutComplete(rootForThisLayout); | 1105 cache->handleLayoutComplete(document); |
1040 } | 1106 } |
1041 updateAnnotatedRegions(); | 1107 updateAnnotatedRegions(); |
1042 | 1108 |
1043 ASSERT(!rootForThisLayout->needsLayout()); | |
1044 | |
1045 if (document->hasListenerType(Document::OVERFLOWCHANGED_LISTENER)) | 1109 if (document->hasListenerType(Document::OVERFLOWCHANGED_LISTENER)) |
1046 updateOverflowStatus(layoutSize().width() < contentsWidth(), layoutSize(
).height() < contentsHeight()); | 1110 updateOverflowStatus(layoutSize().width() < contentsWidth(), layoutSize(
).height() < contentsHeight()); |
1047 | 1111 |
1048 scheduleOrPerformPostLayoutTasks(); | 1112 scheduleOrPerformPostLayoutTasks(); |
1049 | 1113 |
| 1114 // FIXME: The notion of a single root for layout is no longer applicable. Re
move or update this code. crbug.com/460596 |
1050 TRACE_EVENT_END1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Layout", "
endData", InspectorLayoutEvent::endData(rootForThisLayout)); | 1115 TRACE_EVENT_END1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Layout", "
endData", InspectorLayoutEvent::endData(rootForThisLayout)); |
1051 InspectorInstrumentation::didLayout(m_frame.get(), rootForThisLayout); | 1116 InspectorInstrumentation::didLayout(m_frame.get()); |
1052 | 1117 |
1053 m_nestedLayoutCount--; | 1118 m_nestedLayoutCount--; |
1054 if (m_nestedLayoutCount) | 1119 if (m_nestedLayoutCount) |
1055 return; | 1120 return; |
1056 | 1121 |
1057 #if ENABLE(ASSERT) | 1122 #if ENABLE(ASSERT) |
1058 // Post-layout assert that nobody was re-marked as needing layout during lay
out. | 1123 // Post-layout assert that nobody was re-marked as needing layout during lay
out. |
1059 document->renderView()->assertSubtreeIsLaidOut(); | 1124 renderView()->assertSubtreeIsLaidOut(); |
1060 #endif | 1125 #endif |
1061 | 1126 |
1062 // FIXME: It should be not possible to remove the FrameView from the frame/p
age during layout | 1127 // FIXME: It should be not possible to remove the FrameView from the frame/p
age during layout |
1063 // however m_inPerformLayout is not set for most of this function, so none o
f our RELEASE_ASSERTS | 1128 // however m_inPerformLayout is not set for most of this function, so none o
f our RELEASE_ASSERTS |
1064 // in LocalFrame/Page will fire. One of the post-layout tasks is disconnecti
ng the LocalFrame from | 1129 // in LocalFrame/Page will fire. One of the post-layout tasks is disconnecti
ng the LocalFrame from |
1065 // the page in fast/frames/crash-remove-iframe-during-object-beforeload-2.ht
ml | 1130 // the page in fast/frames/crash-remove-iframe-during-object-beforeload-2.ht
ml |
1066 // necessitating this check here. | 1131 // necessitating this check here. |
1067 // ASSERT(frame()->page()); | 1132 // ASSERT(frame()->page()); |
1068 if (frame().page()) | 1133 if (frame().page()) |
1069 frame().page()->chrome().client().layoutUpdated(m_frame.get()); | 1134 frame().page()->chrome().client().layoutUpdated(m_frame.get()); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 | 1167 |
1103 if (m_frame->selection().isCaretBoundsDirty()) | 1168 if (m_frame->selection().isCaretBoundsDirty()) |
1104 m_frame->selection().invalidateCaretRect(); | 1169 m_frame->selection().invalidateCaretRect(); |
1105 } | 1170 } |
1106 | 1171 |
1107 DocumentLifecycle& FrameView::lifecycle() const | 1172 DocumentLifecycle& FrameView::lifecycle() const |
1108 { | 1173 { |
1109 return m_frame->document()->lifecycle(); | 1174 return m_frame->document()->lifecycle(); |
1110 } | 1175 } |
1111 | 1176 |
1112 void FrameView::gatherDebugLayoutRects(LayoutObject* layoutRoot) | |
1113 { | |
1114 bool isTracing; | |
1115 TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("blink.debug.la
yout"), &isTracing); | |
1116 if (!isTracing) | |
1117 return; | |
1118 if (!layoutRoot->enclosingLayer()->hasCompositedLayerMapping()) | |
1119 return; | |
1120 // For access to compositedLayerMapping(). | |
1121 DisableCompositingQueryAsserts disabler; | |
1122 GraphicsLayer* graphicsLayer = layoutRoot->enclosingLayer()->compositedLayer
Mapping()->mainGraphicsLayer(); | |
1123 if (!graphicsLayer) | |
1124 return; | |
1125 | |
1126 GraphicsLayerDebugInfo& debugInfo = graphicsLayer->debugInfo(); | |
1127 | |
1128 debugInfo.currentLayoutRects().clear(); | |
1129 for (LayoutObject* renderer = layoutRoot; renderer; renderer = renderer->nex
tInPreOrder()) { | |
1130 if (renderer->layoutDidGetCalledSinceLastFrame()) { | |
1131 FloatQuad quad = renderer->localToAbsoluteQuad(FloatQuad(renderer->p
reviousPaintInvalidationRect())); | |
1132 LayoutRect rect = quad.enclosingBoundingBox(); | |
1133 debugInfo.currentLayoutRects().append(rect); | |
1134 } | |
1135 } | |
1136 } | |
1137 | |
1138 RenderBox* FrameView::embeddedContentBox() const | 1177 RenderBox* FrameView::embeddedContentBox() const |
1139 { | 1178 { |
1140 RenderView* renderView = this->renderView(); | 1179 RenderView* renderView = this->renderView(); |
1141 if (!renderView) | 1180 if (!renderView) |
1142 return nullptr; | 1181 return nullptr; |
1143 | 1182 |
1144 LayoutObject* firstChild = renderView->firstChild(); | 1183 LayoutObject* firstChild = renderView->firstChild(); |
1145 if (!firstChild || !firstChild->isBox()) | 1184 if (!firstChild || !firstChild->isBox()) |
1146 return nullptr; | 1185 return nullptr; |
1147 | 1186 |
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1804 | 1843 |
1805 void FrameView::handleLoadCompleted() | 1844 void FrameView::handleLoadCompleted() |
1806 { | 1845 { |
1807 // Once loading has completed, allow autoSize one last opportunity to | 1846 // Once loading has completed, allow autoSize one last opportunity to |
1808 // reduce the size of the frame. | 1847 // reduce the size of the frame. |
1809 if (m_autoSizeInfo) | 1848 if (m_autoSizeInfo) |
1810 m_autoSizeInfo->autoSizeIfNeeded(); | 1849 m_autoSizeInfo->autoSizeIfNeeded(); |
1811 maintainScrollPositionAtAnchor(0); | 1850 maintainScrollPositionAtAnchor(0); |
1812 } | 1851 } |
1813 | 1852 |
| 1853 void FrameView::clearLayoutSubtreeRoot(const LayoutObject* root) |
| 1854 { |
| 1855 m_layoutSubtreeRoots.remove(const_cast<LayoutObject*>(root)); |
| 1856 if (m_layoutSubtreeRoots.isEmpty()) |
| 1857 m_isSubtreeLayout = false; |
| 1858 } |
| 1859 |
| 1860 void FrameView::clearLayoutSubtreeRootsAndMarkContainingBlocks() |
| 1861 { |
| 1862 for (auto& iter : m_layoutSubtreeRoots) |
| 1863 iter->markContainingBlocksForLayout(false); |
| 1864 m_layoutSubtreeRoots.clear(); |
| 1865 } |
| 1866 |
1814 void FrameView::scheduleRelayout() | 1867 void FrameView::scheduleRelayout() |
1815 { | 1868 { |
1816 ASSERT(m_frame->view() == this); | 1869 ASSERT(m_frame->view() == this); |
1817 | 1870 |
1818 if (isSubtreeLayout()) { | 1871 m_isSubtreeLayout = false; |
1819 m_layoutSubtreeRoot->markContainingBlocksForLayout(false); | |
1820 m_layoutSubtreeRoot = nullptr; | |
1821 } | |
1822 if (!m_layoutSchedulingEnabled) | 1872 if (!m_layoutSchedulingEnabled) |
1823 return; | 1873 return; |
1824 if (!needsLayout()) | 1874 if (!needsLayout()) |
1825 return; | 1875 return; |
1826 if (!m_frame->document()->shouldScheduleLayout()) | 1876 if (!m_frame->document()->shouldScheduleLayout()) |
1827 return; | 1877 return; |
1828 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Invali
dateLayout", "data", InspectorInvalidateLayoutEvent::data(m_frame.get())); | 1878 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Invali
dateLayout", "data", InspectorInvalidateLayoutEvent::data(m_frame.get())); |
1829 | 1879 |
1830 if (m_hasPendingLayout) | 1880 if (m_hasPendingLayout) |
1831 return; | 1881 return; |
| 1882 clearLayoutSubtreeRootsAndMarkContainingBlocks(); |
1832 m_hasPendingLayout = true; | 1883 m_hasPendingLayout = true; |
1833 | 1884 |
1834 page()->animator().scheduleVisualUpdate(m_frame.get()); | 1885 page()->animator().scheduleVisualUpdate(m_frame.get()); |
1835 lifecycle().ensureStateAtMost(DocumentLifecycle::StyleClean); | 1886 lifecycle().ensureStateAtMost(DocumentLifecycle::StyleClean); |
1836 } | 1887 } |
1837 | 1888 |
1838 static bool isObjectAncestorContainerOf(LayoutObject* ancestor, LayoutObject* de
scendant) | |
1839 { | |
1840 for (LayoutObject* r = descendant; r; r = r->container()) { | |
1841 if (r == ancestor) | |
1842 return true; | |
1843 } | |
1844 return false; | |
1845 } | |
1846 | |
1847 void FrameView::scheduleRelayoutOfSubtree(LayoutObject* relayoutRoot) | 1889 void FrameView::scheduleRelayoutOfSubtree(LayoutObject* relayoutRoot) |
1848 { | 1890 { |
1849 ASSERT(m_frame->view() == this); | 1891 ASSERT(m_frame->view() == this); |
1850 | 1892 |
1851 // FIXME: Should this call shouldScheduleLayout instead? | 1893 // FIXME: Should this call shouldScheduleLayout instead? |
1852 if (!m_frame->document()->isActive()) | 1894 if (!m_frame->document()->isActive()) |
1853 return; | 1895 return; |
1854 | 1896 |
1855 RenderView* renderView = this->renderView(); | 1897 RenderView* renderView = this->renderView(); |
1856 if (renderView && renderView->needsLayout()) { | 1898 if (renderView && renderView->needsLayout()) { |
| 1899 ASSERT(!m_isSubtreeLayout); |
1857 if (relayoutRoot) | 1900 if (relayoutRoot) |
1858 relayoutRoot->markContainingBlocksForLayout(false); | 1901 relayoutRoot->markContainingBlocksForLayout(false); |
1859 return; | 1902 return; |
1860 } | 1903 } |
1861 | 1904 |
1862 if (layoutPending() || !m_layoutSchedulingEnabled) { | 1905 if (relayoutRoot == renderView) { |
1863 if (m_layoutSubtreeRoot != relayoutRoot) { | 1906 m_isSubtreeLayout = false; |
1864 if (isObjectAncestorContainerOf(m_layoutSubtreeRoot, relayoutRoot))
{ | 1907 clearLayoutSubtreeRootsAndMarkContainingBlocks(); |
1865 // Keep the current root | 1908 } else { |
1866 relayoutRoot->markContainingBlocksForLayout(false, m_layoutSubtr
eeRoot); | 1909 m_isSubtreeLayout = true; |
1867 ASSERT(!m_layoutSubtreeRoot->container() || !m_layoutSubtreeRoot
->container()->needsLayout()); | 1910 m_layoutSubtreeRoots.add(relayoutRoot); |
1868 } else if (isSubtreeLayout() && isObjectAncestorContainerOf(relayout
Root, m_layoutSubtreeRoot)) { | 1911 } |
1869 // Re-root at relayoutRoot | 1912 if (m_layoutSchedulingEnabled) { |
1870 m_layoutSubtreeRoot->markContainingBlocksForLayout(false, relayo
utRoot); | |
1871 m_layoutSubtreeRoot = relayoutRoot; | |
1872 ASSERT(!m_layoutSubtreeRoot->container() || !m_layoutSubtreeRoot
->container()->needsLayout()); | |
1873 } else { | |
1874 // Just do a full relayout | |
1875 if (isSubtreeLayout()) | |
1876 m_layoutSubtreeRoot->markContainingBlocksForLayout(false); | |
1877 m_layoutSubtreeRoot = nullptr; | |
1878 relayoutRoot->markContainingBlocksForLayout(false); | |
1879 } | |
1880 } | |
1881 } else if (m_layoutSchedulingEnabled) { | |
1882 m_layoutSubtreeRoot = relayoutRoot; | |
1883 ASSERT(!m_layoutSubtreeRoot->container() || !m_layoutSubtreeRoot->contai
ner()->needsLayout()); | |
1884 m_hasPendingLayout = true; | 1913 m_hasPendingLayout = true; |
1885 | 1914 |
1886 page()->animator().scheduleVisualUpdate(m_frame.get()); | 1915 page()->animator().scheduleVisualUpdate(m_frame.get()); |
1887 lifecycle().ensureStateAtMost(DocumentLifecycle::StyleClean); | 1916 lifecycle().ensureStateAtMost(DocumentLifecycle::StyleClean); |
1888 } | 1917 } |
1889 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Invali
dateLayout", "data", InspectorInvalidateLayoutEvent::data(m_frame.get())); | 1918 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Invali
dateLayout", "data", InspectorInvalidateLayoutEvent::data(m_frame.get())); |
1890 } | 1919 } |
1891 | 1920 |
1892 bool FrameView::layoutPending() const | 1921 bool FrameView::layoutPending() const |
1893 { | 1922 { |
(...skipping 2160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4054 { | 4083 { |
4055 Settings* settings = frame().settings(); | 4084 Settings* settings = frame().settings(); |
4056 if (!settings || !settings->rootLayerScrolls()) | 4085 if (!settings || !settings->rootLayerScrolls()) |
4057 return this; | 4086 return this; |
4058 | 4087 |
4059 RenderView* renderView = this->renderView(); | 4088 RenderView* renderView = this->renderView(); |
4060 return renderView ? renderView->scrollableArea() : nullptr; | 4089 return renderView ? renderView->scrollableArea() : nullptr; |
4061 } | 4090 } |
4062 | 4091 |
4063 } // namespace blink | 4092 } // namespace blink |
OLD | NEW |