Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(324)

Side by Side Diff: Source/core/rendering/RenderView.cpp

Issue 190973007: Reland "Avoid layout/full-repaint on view height change if possible" (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Viewport media query, comments, etc. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv ed. 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv ed.
4 * 4 *
5 * This library is free software; you can redistribute it and/or 5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public 6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either 7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version. 8 * version 2 of the License, or (at your option) any later version.
9 * 9 *
10 * This library is distributed in the hope that it will be useful, 10 * This library is distributed in the hope that it will be useful,
(...skipping 979 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 float scale = m_frameView ? m_frameView->frame().pageZoomFactor() : 1; 990 float scale = m_frameView ? m_frameView->frame().pageZoomFactor() : 1;
991 return viewWidth(IncludeScrollbars) / scale; 991 return viewWidth(IncludeScrollbars) / scale;
992 } 992 }
993 993
994 double RenderView::layoutViewportHeight() const 994 double RenderView::layoutViewportHeight() const
995 { 995 {
996 float scale = m_frameView ? m_frameView->frame().pageZoomFactor() : 1; 996 float scale = m_frameView ? m_frameView->frame().pageZoomFactor() : 1;
997 return viewHeight(IncludeScrollbars) / scale; 997 return viewHeight(IncludeScrollbars) / scale;
998 } 998 }
999 999
1000 bool RenderView::trySimplifiedLayoutOnHeightChange()
1001 {
1002 // FIXME: Move logics that are generic to RenderBox or RenderBlock into thes e classes
1003 // so that this function can be also used to optimize layout of them.
1004
1005 // The style must be up-to-date.
1006 ASSERT(!document().needsStyleRecalc() && !document().childNeedsStyleRecalc() );
1007
1008 // Don't need to check viewport media queries or viewport sizes here, becaus e they are
1009 // handled before and during style recalc which should happen before this fu nction is called.
1010
1011 // Quicks mode has different layout rules on view size change, e.g. the heig ht of <body> and
1012 // percent height descendants etc. To avoid simplified layout from being too complex, fallback
1013 // to full layout.
1014 if (document().inQuirksMode())
1015 return false;
1016
1017 if (document().paginated() || shouldUsePrintingLayout())
1018 return false;
1019
1020 // If the height is decreasing and the view isn't vertically scrollable, fal lback to
1021 // full layout to calculate the new layout overflow rect.
1022 LayoutRect layoutOverflow = layoutOverflowRect();
1023 if (layoutOverflow.maxY() <= noOverflowRect().maxY() && viewHeight() < heigh t())
1024 return false;
1025
1026 // Update style to ensure the following checks to access up-to-date styles.
1027 document().updateStyleIfNeeded();
Julien - ping for review 2014/03/11 01:23:37 Isn't this line contrary with the ASSERT above abo
Xianzhu 2014/03/11 19:05:13 Sorry. I added the code and later meant to move th
1028 if (needsLayout())
1029 return false;
1030
1031 // Optimize layout in horizontal writing mode only to simplify the logic.
1032 if (!style()->isHorizontalWritingMode())
1033 return false;
1034
1035 if (hasPercentHeightDescendants())
1036 return false;
1037
1038 // Needs full layout if there is no body element (e.g. there is frameset who se layout is almost always
1039 // affected by the view size.
1040 Element* body = document().body();
1041 if (!body || !body->hasTagName(HTMLNames::bodyTag))
1042 return false;
1043
1044 // Root background image may be stretched related to the viewport size.
1045 Element* documentElement = document().documentElement();
1046 if (!documentElement || !documentElement->renderer()
1047 || documentElement->renderer()->rendererForRootBackground()->style()->ha sBackgroundImage())
1048 return false;
1049
1050 if (TrackedRendererListHashSet* positionedObjects = this->positionedObjects( )) {
1051 TrackedRendererListHashSet::iterator end = positionedObjects->end();
1052 for (TrackedRendererListHashSet::iterator it = positionedObjects->begin( ); it != end; ++it) {
1053 if ((*it)->node() && (*it)->node()->hasTagName(HTMLNames::dialogTag) )
1054 return false;
1055
1056 RenderStyle* childStyle = (*it)->style();
1057 // Fixed position element may change compositing state when viewport height changes.
1058 if (childStyle->position() == FixedPosition)
1059 return false;
Xianzhu 2014/03/11 19:05:13 Removed the above because fixed position layout ha
1060 if (childStyle->top().isPercent() || childStyle->height().isPercent( ) || childStyle->minHeight().isPercent() || childStyle->maxHeight().isPercent() || !childStyle->bottom().isAuto())
1061 return false;
1062 }
1063 }
1064
1065 // Do a simplified layout on height change.
1066 setHeight(viewHeight());
1067
1068 // During a normal layout, change of height may cause creating or destroying the overflow.
1069 // The following code mimics the normal layout for overflow.
1070 m_overflow.clear();
1071 addLayoutOverflow(layoutOverflow);
Julien - ping for review 2014/03/11 01:23:37 It's weird that you don't also add visual overflow
Xianzhu 2014/03/11 19:05:13 Actually I didn't notice it, so for cases needing
1072
1073 // FIXME: There may be a more efficient way to adjust the size of the root l ayer.
1074 layer()->updateLayerPositionsAfterLayout(layer(), RenderLayer::defaultFlags) ;
Julien - ping for review 2014/03/11 01:23:37 updateLayerPositions will recurse into all the lay
Xianzhu 2014/03/11 19:05:13 The repaints caused by layer resizing and exposing
1075
1076 return true;
1077 }
1078
1000 } // namespace WebCore 1079 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698