Changeset 183777 in webkit
- Timestamp:
- May 4, 2015 4:31:10 PM (9 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r183775 r183777 1 2015-05-04 Simon Fraser <simon.fraser@apple.com> 2 3 display:none iframes cause repeated compositing flushing 4 https://bugs.webkit.org/show_bug.cgi?id=144529 5 6 Reviewed by Darin Adler. 7 8 Test with a display:none iframe that triggers a single compositing flush, 9 then counts how many occur in 10ms. 10 11 * compositing/iframes/display-none-subframe-expected.txt: Added. 12 * compositing/iframes/display-none-subframe.html: Added. 13 1 14 2015-05-04 Simon Fraser <simon.fraser@apple.com> 2 15 -
trunk/Source/WebCore/ChangeLog
r183776 r183777 1 2015-05-04 Simon Fraser <simon.fraser@apple.com> 2 3 display:none iframes cause repeated compositing flushing 4 https://bugs.webkit.org/show_bug.cgi?id=144529 5 6 Reviewed by Darin Adler. 7 8 FrameView::updateLayoutAndStyleIfNeededRecursive() only forces layout on rendered 9 frames, by virtue of using its Widget children which are FrameViews. 10 11 However, FrameView::flushCompositingStateIncludingSubframes() iterated over 12 all frames, and return false if any subframe needed layout. Thus, if it saw 13 non-rendered frames (which are never laid out), it would return false, 14 which causes the CFRunLoopObserver that drives flushing to run again. 15 16 Fix by having FrameView::flushCompositingStateIncludingSubframes() only check 17 rendered frames, using FrameTree::traverseNextRendered() (which needs to be public). 18 19 Also change FrameView::needsStyleRecalcOrLayout() and FrameView::updateLayoutAndStyleIfNeededRecursive() 20 to fetch the list of FrameViews using FrameTree's nextRenderedSibling(), rather than using 21 the Widget tree, since we'd like to eventually remove Widgets, and using the Frame 22 tree matches flushCompositingStateIncludingSubframes() and other code. 23 24 Test: compositing/iframes/display-none-subframe.html 25 26 * page/FrameTree.h: 27 * page/FrameView.cpp: 28 (WebCore::FrameView::flushCompositingStateIncludingSubframes): 29 (WebCore::FrameView::needsStyleRecalcOrLayout): 30 (WebCore::FrameView::renderedChildFrameViews): Helper that returns a vector 31 of Ref<FrameView>s for rendered frames only. 32 (WebCore::FrameView::updateLayoutAndStyleIfNeededRecursive): 33 * page/FrameView.h: 34 1 35 2015-05-04 Chris Dumez <cdumez@apple.com> 2 36 -
trunk/Source/WebCore/page/FrameTree.h
r180062 r183777 56 56 Frame* lastChild() const { return m_lastChild; } 57 57 58 Frame* firstRenderedChild() const; 59 Frame* nextRenderedSibling() const; 60 58 61 WEBCORE_EXPORT bool isDescendantOf(const Frame* ancestor) const; 59 62 … … 91 94 unsigned scopedChildCount(TreeScope*) const; 92 95 93 Frame* firstRenderedChild() const;94 Frame* nextRenderedSibling() const;95 96 96 Frame& m_thisFrame; 97 97 -
trunk/Source/WebCore/page/FrameView.cpp
r183775 r183777 1067 1067 { 1068 1068 bool allFramesFlushed = flushCompositingStateForThisFrame(&frame()); 1069 1070 for (Frame* child = frame().tree().firstChild(); child; child = child->tree().traverseNext(m_frame.ptr())) { 1069 1070 for (Frame* child = frame().tree().firstRenderedChild(); child; child = child->tree().traverseNextRendered(m_frame.ptr())) { 1071 if (!child->view()) 1072 continue; 1071 1073 bool flushed = child->view()->flushCompositingStateForThisFrame(&frame()); 1072 1074 allFramesFlushed &= flushed; … … 2594 2596 return false; 2595 2597 2596 // Find child frames via the Widget tree, as updateLayoutAndStyleIfNeededRecursive() does. 2597 Vector<Ref<FrameView>, 16> childViews; 2598 childViews.reserveInitialCapacity(children().size()); 2599 for (auto& widget : children()) { 2600 if (is<FrameView>(*widget)) 2601 childViews.uncheckedAppend(downcast<FrameView>(*widget)); 2602 } 2603 2604 for (unsigned i = 0; i < childViews.size(); ++i) { 2605 if (childViews[i]->needsStyleRecalcOrLayout()) 2598 for (auto& frameView : renderedChildFrameViews()) { 2599 if (frameView->needsStyleRecalcOrLayout()) 2606 2600 return true; 2607 2601 } … … 4037 4031 } 4038 4032 4033 FrameView::FrameViewList FrameView::renderedChildFrameViews() const 4034 { 4035 FrameViewList childViews; 4036 for (Frame* frame = m_frame->tree().firstRenderedChild(); frame; frame = frame->tree().nextRenderedSibling()) { 4037 if (frame->view()) 4038 childViews.append(*frame->view()); 4039 } 4040 4041 return childViews; 4042 } 4043 4039 4044 void FrameView::updateLayoutAndStyleIfNeededRecursive() 4040 4045 { … … 4055 4060 layout(); 4056 4061 4057 // Grab a copy of the children() set, as it may be mutated by the following updateLayoutAndStyleIfNeededRecursive 4058 // calls, as they can potentially re-enter a layout of the parent frame view, which may add/remove scrollbars 4059 // and thus mutates the children() set. 4060 // We use the Widget children because walking the Frame tree would include display:none frames. 4061 // FIXME: use FrameTree::traverseNextRendered(). 4062 Vector<Ref<FrameView>, 16> childViews; 4063 childViews.reserveInitialCapacity(children().size()); 4064 for (auto& widget : children()) { 4065 if (is<FrameView>(*widget)) 4066 childViews.uncheckedAppend(downcast<FrameView>(*widget)); 4067 } 4068 4069 for (unsigned i = 0; i < childViews.size(); ++i) 4070 childViews[i]->updateLayoutAndStyleIfNeededRecursive(); 4062 // Grab a copy of the child views, as the list may be mutated by the following updateLayoutAndStyleIfNeededRecursive 4063 // calls, as they can potentially re-enter a layout of the parent frame view. 4064 for (auto& frameView : renderedChildFrameViews()) 4065 frameView->updateLayoutAndStyleIfNeededRecursive(); 4071 4066 4072 4067 // A child frame may have dirtied us during its layout. -
trunk/Source/WebCore/page/FrameView.h
r183775 r183777 518 518 const HashSet<Widget*>& widgetsInRenderTree() const { return m_widgetsInRenderTree; } 519 519 520 typedef Vector<Ref<FrameView>, 16> FrameViewList; 521 FrameViewList renderedChildFrameViews() const; 522 520 523 void addTrackedRepaintRect(const FloatRect&); 521 524
Note: See TracChangeset
for help on using the changeset viewer.