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