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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 } | 147 } |
148 | 148 |
149 // paged-y always corresponds to TopToBottomPaginated or BottomToTopPaginate
d. If the WritingMode | 149 // paged-y always corresponds to TopToBottomPaginated or BottomToTopPaginate
d. If the WritingMode |
150 // is horizontal, then the direction of the horizontality dictates the choic
e. If the WritingMode | 150 // is horizontal, then the direction of the horizontality dictates the choic
e. If the WritingMode |
151 // is vertical, then we use TextDirection to choose between those options. | 151 // is vertical, then we use TextDirection to choose between those options. |
152 if (writingMode == TopToBottomWritingMode || (!isHorizontalWritingMode && te
xtDirection == RTL)) | 152 if (writingMode == TopToBottomWritingMode || (!isHorizontalWritingMode && te
xtDirection == RTL)) |
153 return Pagination::TopToBottomPaginated; | 153 return Pagination::TopToBottomPaginated; |
154 return Pagination::BottomToTopPaginated; | 154 return Pagination::BottomToTopPaginated; |
155 } | 155 } |
156 | 156 |
157 FrameView::DeferredRepaintScope::DeferredRepaintScope(FrameView& view) | |
158 : m_view(&view) | |
159 { | |
160 m_view->beginDeferredRepaints(); | |
161 } | |
162 | |
163 FrameView::DeferredRepaintScope::~DeferredRepaintScope() | |
164 { | |
165 m_view->endDeferredRepaints(); | |
166 } | |
167 | |
168 FrameView::FrameView(Frame* frame) | 157 FrameView::FrameView(Frame* frame) |
169 : m_frame(frame) | 158 : m_frame(frame) |
170 , m_canHaveScrollbars(true) | 159 , m_canHaveScrollbars(true) |
171 , m_slowRepaintObjectCount(0) | 160 , m_slowRepaintObjectCount(0) |
172 , m_layoutTimer(this, &FrameView::layoutTimerFired) | 161 , m_layoutTimer(this, &FrameView::layoutTimerFired) |
173 , m_layoutRoot(0) | 162 , m_layoutRoot(0) |
174 , m_inSynchronousPostLayout(false) | 163 , m_inSynchronousPostLayout(false) |
175 , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired) | 164 , m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired) |
176 , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired) | 165 , m_updateWidgetsTimer(this, &FrameView::updateWidgetsTimerFired) |
177 , m_isTransparent(false) | 166 , m_isTransparent(false) |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 m_layoutCount = 0; | 253 m_layoutCount = 0; |
265 m_nestedLayoutCount = 0; | 254 m_nestedLayoutCount = 0; |
266 m_postLayoutTasksTimer.stop(); | 255 m_postLayoutTasksTimer.stop(); |
267 m_updateWidgetsTimer.stop(); | 256 m_updateWidgetsTimer.stop(); |
268 m_firstLayout = true; | 257 m_firstLayout = true; |
269 m_firstLayoutCallbackPending = false; | 258 m_firstLayoutCallbackPending = false; |
270 m_wasScrolledByUser = false; | 259 m_wasScrolledByUser = false; |
271 m_safeToPropagateScrollToParent = true; | 260 m_safeToPropagateScrollToParent = true; |
272 m_lastViewportSize = IntSize(); | 261 m_lastViewportSize = IntSize(); |
273 m_lastZoomFactor = 1.0f; | 262 m_lastZoomFactor = 1.0f; |
274 m_deferringRepaints = 0; | |
275 m_repaintCount = 0; | 263 m_repaintCount = 0; |
276 m_repaintRects.clear(); | 264 m_repaintRects.clear(); |
277 m_deferredRepaintDelay = s_initialDeferredRepaintDelayDuringLoading; | 265 m_deferredRepaintDelay = s_initialDeferredRepaintDelayDuringLoading; |
278 m_deferredRepaintTimer.stop(); | 266 m_deferredRepaintTimer.stop(); |
279 m_isTrackingRepaints = false; | 267 m_isTrackingRepaints = false; |
280 m_trackedRepaintRects.clear(); | 268 m_trackedRepaintRects.clear(); |
281 m_lastPaintTime = 0; | 269 m_lastPaintTime = 0; |
282 m_paintBehavior = PaintBehaviorNormal; | 270 m_paintBehavior = PaintBehaviorNormal; |
283 m_isPainting = false; | 271 m_isPainting = false; |
284 m_visuallyNonEmptyCharacterCount = 0; | 272 m_visuallyNonEmptyCharacterCount = 0; |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
890 document->updateStyleIfNeeded(); | 878 document->updateStyleIfNeeded(); |
891 } | 879 } |
892 | 880 |
893 void FrameView::performLayout(RenderObject* rootForThisLayout, bool inSubtreeLay
out) | 881 void FrameView::performLayout(RenderObject* rootForThisLayout, bool inSubtreeLay
out) |
894 { | 882 { |
895 TRACE_EVENT0("webkit", "FrameView::performLayout"); | 883 TRACE_EVENT0("webkit", "FrameView::performLayout"); |
896 | 884 |
897 // performLayout is the actual guts of layout(). | 885 // performLayout is the actual guts of layout(). |
898 // FIXME: The 300 other lines in layout() probably belong in other helper fu
nctions | 886 // FIXME: The 300 other lines in layout() probably belong in other helper fu
nctions |
899 // so that a single human could understand what layout() is actually doing. | 887 // so that a single human could understand what layout() is actually doing. |
900 FrameView::DeferredRepaintScope deferRepaints(*this); | |
901 | 888 |
902 { | 889 { |
903 bool disableLayoutState = false; | 890 bool disableLayoutState = false; |
904 if (inSubtreeLayout) { | 891 if (inSubtreeLayout) { |
905 RenderView* view = rootForThisLayout->view(); | 892 RenderView* view = rootForThisLayout->view(); |
906 disableLayoutState = view->shouldDisableLayoutStateForSubtree(rootFo
rThisLayout); | 893 disableLayoutState = view->shouldDisableLayoutStateForSubtree(rootFo
rThisLayout); |
907 view->pushLayoutState(rootForThisLayout); | 894 view->pushLayoutState(rootForThisLayout); |
908 } | 895 } |
909 LayoutStateDisabler layoutStateDisabler(disableLayoutState ? rootForThis
Layout->view() : 0); | 896 LayoutStateDisabler layoutStateDisabler(disableLayoutState ? rootForThis
Layout->view() : 0); |
910 | 897 |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1112 m_layoutRoot = 0; | 1099 m_layoutRoot = 0; |
1113 } // Reset m_layoutSchedulingEnabled to its previous value. | 1100 } // Reset m_layoutSchedulingEnabled to its previous value. |
1114 | 1101 |
1115 bool neededFullRepaint = m_doFullRepaint; | 1102 bool neededFullRepaint = m_doFullRepaint; |
1116 | 1103 |
1117 if (!inSubtreeLayout && !isPartialLayout && !toRenderView(rootForThisLayout)
->document().printing()) | 1104 if (!inSubtreeLayout && !isPartialLayout && !toRenderView(rootForThisLayout)
->document().printing()) |
1118 adjustViewSize(); | 1105 adjustViewSize(); |
1119 | 1106 |
1120 m_doFullRepaint = neededFullRepaint; | 1107 m_doFullRepaint = neededFullRepaint; |
1121 | 1108 |
1122 { | 1109 if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) { |
1123 // FIXME: Can this scope just encompass this entire function? | 1110 if (m_doFullRepaint) |
1124 FrameView::DeferredRepaintScope deferRepaints(*this); | 1111 renderView()->setShouldDoFullRepaintAfterLayout(true); |
1125 | 1112 |
1126 if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) { | 1113 if (m_doFullRepaint || !partialLayout().isStopping()) |
1127 if (m_doFullRepaint) | 1114 repaintTree(rootForThisLayout); |
1128 renderView()->setShouldDoFullRepaintAfterLayout(true); | |
1129 | 1115 |
1130 if (m_doFullRepaint || !partialLayout().isStopping()) | 1116 } else if (m_doFullRepaint) { |
1131 repaintTree(rootForThisLayout); | 1117 // FIXME: This isn't really right, since the RenderView doesn't fully en
compass |
| 1118 // the visibleContentRect(). It just happens to work out most of the tim
e, |
| 1119 // since first layouts and printing don't have you scrolled anywhere. |
| 1120 renderView()->repaint(); |
| 1121 } |
1132 | 1122 |
1133 } else if (m_doFullRepaint) { | 1123 layer->updateLayerPositionsAfterLayout(renderView()->layer(), updateLayerPos
itionFlags(layer, inSubtreeLayout, m_doFullRepaint)); |
1134 // FIXME: This isn't really right, since the RenderView doesn't full
y encompass | 1124 |
1135 // the visibleContentRect(). It just happens to work out most of the
time, | |
1136 // since first layouts and printing don't have you scrolled anywhere
. | |
1137 renderView()->repaint(); | |
1138 } | |
1139 layer->updateLayerPositionsAfterLayout(renderView()->layer(), updateLaye
rPositionFlags(layer, inSubtreeLayout, m_doFullRepaint)); | |
1140 } | |
1141 updateCompositingLayersAfterLayout(); | 1125 updateCompositingLayersAfterLayout(); |
1142 | 1126 |
1143 m_layoutCount++; | 1127 m_layoutCount++; |
1144 | 1128 |
1145 if (AXObjectCache* cache = rootForThisLayout->document().existingAXObjectCac
he()) | 1129 if (AXObjectCache* cache = rootForThisLayout->document().existingAXObjectCac
he()) |
1146 cache->postNotification(rootForThisLayout, AXObjectCache::AXLayoutComple
te, true); | 1130 cache->postNotification(rootForThisLayout, AXObjectCache::AXLayoutComple
te, true); |
1147 updateAnnotatedRegions(); | 1131 updateAnnotatedRegions(); |
1148 | 1132 |
1149 ASSERT(partialLayout().isStopping() || !rootForThisLayout->needsLayout()); | 1133 ASSERT(partialLayout().isStopping() || !rootForThisLayout->needsLayout()); |
1150 | 1134 |
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1811 void FrameView::repaintContentRectangle(const IntRect& r) | 1795 void FrameView::repaintContentRectangle(const IntRect& r) |
1812 { | 1796 { |
1813 ASSERT(!m_frame->ownerElement()); | 1797 ASSERT(!m_frame->ownerElement()); |
1814 | 1798 |
1815 if (m_isTrackingRepaints) { | 1799 if (m_isTrackingRepaints) { |
1816 IntRect repaintRect = r; | 1800 IntRect repaintRect = r; |
1817 repaintRect.move(-scrollOffset()); | 1801 repaintRect.move(-scrollOffset()); |
1818 m_trackedRepaintRects.append(repaintRect); | 1802 m_trackedRepaintRects.append(repaintRect); |
1819 } | 1803 } |
1820 | 1804 |
1821 double delay = m_deferringRepaints ? 0 : adjustedDeferredRepaintDelay(); | 1805 double delay = adjustedDeferredRepaintDelay(); |
1822 if (m_deferringRepaints || m_deferredRepaintTimer.isActive() || delay) { | 1806 if (m_deferredRepaintTimer.isActive() || delay) { |
1823 IntRect paintRect = r; | 1807 IntRect paintRect = r; |
1824 if (clipsRepaints() && !paintsEntireContents()) | 1808 if (clipsRepaints() && !paintsEntireContents()) |
1825 paintRect.intersect(visibleContentRect()); | 1809 paintRect.intersect(visibleContentRect()); |
1826 if (paintRect.isEmpty()) | 1810 if (paintRect.isEmpty()) |
1827 return; | 1811 return; |
1828 if (m_repaintCount == cRepaintRectUnionThreshold) { | 1812 if (m_repaintCount == cRepaintRectUnionThreshold) { |
1829 IntRect unionedRect; | 1813 IntRect unionedRect; |
1830 for (unsigned i = 0; i < cRepaintRectUnionThreshold; ++i) | 1814 for (unsigned i = 0; i < cRepaintRectUnionThreshold; ++i) |
1831 unionedRect.unite(pixelSnappedIntRect(m_repaintRects[i])); | 1815 unionedRect.unite(pixelSnappedIntRect(m_repaintRects[i])); |
1832 m_repaintRects.clear(); | 1816 m_repaintRects.clear(); |
1833 m_repaintRects.append(unionedRect); | 1817 m_repaintRects.append(unionedRect); |
1834 } | 1818 } |
1835 if (m_repaintCount < cRepaintRectUnionThreshold) | 1819 if (m_repaintCount < cRepaintRectUnionThreshold) |
1836 m_repaintRects.append(paintRect); | 1820 m_repaintRects.append(paintRect); |
1837 else | 1821 else |
1838 m_repaintRects[0].unite(paintRect); | 1822 m_repaintRects[0].unite(paintRect); |
1839 m_repaintCount++; | 1823 m_repaintCount++; |
1840 | 1824 |
1841 if (!m_deferringRepaints) | 1825 startDeferredRepaintTimer(delay); |
1842 startDeferredRepaintTimer(delay); | |
1843 | 1826 |
1844 return; | 1827 return; |
1845 } | 1828 } |
1846 | 1829 |
1847 if (!shouldUpdate()) | 1830 if (!shouldUpdate()) |
1848 return; | 1831 return; |
1849 | 1832 |
1850 ScrollView::repaintContentRectangle(r); | 1833 ScrollView::repaintContentRectangle(r); |
1851 } | 1834 } |
1852 | 1835 |
(...skipping 23 matching lines...) Expand all Loading... |
1876 layout(); | 1859 layout(); |
1877 | 1860 |
1878 if (renderView() && renderView()->usesCompositing()) { | 1861 if (renderView() && renderView()->usesCompositing()) { |
1879 renderView()->compositor()->frameViewScrollbarsExistenceDidChange(); | 1862 renderView()->compositor()->frameViewScrollbarsExistenceDidChange(); |
1880 | 1863 |
1881 if (!useOverlayScrollbars) | 1864 if (!useOverlayScrollbars) |
1882 renderView()->compositor()->frameViewDidChangeSize(); | 1865 renderView()->compositor()->frameViewDidChangeSize(); |
1883 } | 1866 } |
1884 } | 1867 } |
1885 | 1868 |
1886 void FrameView::beginDeferredRepaints() | |
1887 { | |
1888 Page* page = m_frame->page(); | |
1889 ASSERT(page); | |
1890 | |
1891 if (!isMainFrame()) { | |
1892 page->mainFrame()->view()->beginDeferredRepaints(); | |
1893 return; | |
1894 } | |
1895 | |
1896 m_deferringRepaints++; | |
1897 } | |
1898 | |
1899 void FrameView::endDeferredRepaints() | |
1900 { | |
1901 Page* page = m_frame->page(); | |
1902 ASSERT(page); | |
1903 | |
1904 if (!isMainFrame()) { | |
1905 page->mainFrame()->view()->endDeferredRepaints(); | |
1906 return; | |
1907 } | |
1908 | |
1909 ASSERT(m_deferringRepaints > 0); | |
1910 | |
1911 if (--m_deferringRepaints) | |
1912 return; | |
1913 | |
1914 if (m_deferredRepaintTimer.isActive()) | |
1915 return; | |
1916 | |
1917 if (double delay = adjustedDeferredRepaintDelay()) { | |
1918 startDeferredRepaintTimer(delay); | |
1919 return; | |
1920 } | |
1921 | |
1922 doDeferredRepaints(); | |
1923 } | |
1924 | |
1925 void FrameView::startDeferredRepaintTimer(double delay) | 1869 void FrameView::startDeferredRepaintTimer(double delay) |
1926 { | 1870 { |
1927 if (m_deferredRepaintTimer.isActive()) | 1871 if (m_deferredRepaintTimer.isActive()) |
1928 return; | 1872 return; |
1929 | 1873 |
1930 m_deferredRepaintTimer.startOneShot(delay); | 1874 m_deferredRepaintTimer.startOneShot(delay); |
1931 } | 1875 } |
1932 | 1876 |
1933 void FrameView::handleLoadCompleted() | 1877 void FrameView::handleLoadCompleted() |
1934 { | 1878 { |
1935 // Once loading has completed, allow autoSize one last opportunity to | 1879 // Once loading has completed, allow autoSize one last opportunity to |
1936 // reduce the size of the frame. | 1880 // reduce the size of the frame. |
1937 autoSizeIfEnabled(); | 1881 autoSizeIfEnabled(); |
1938 if (shouldUseLoadTimeDeferredRepaintDelay()) | 1882 if (shouldUseLoadTimeDeferredRepaintDelay()) |
1939 return; | 1883 return; |
1940 m_deferredRepaintDelay = s_normalDeferredRepaintDelay; | 1884 m_deferredRepaintDelay = s_normalDeferredRepaintDelay; |
1941 flushDeferredRepaints(); | 1885 flushDeferredRepaints(); |
1942 } | 1886 } |
1943 | 1887 |
1944 void FrameView::flushDeferredRepaints() | 1888 void FrameView::flushDeferredRepaints() |
1945 { | 1889 { |
1946 if (!m_deferredRepaintTimer.isActive()) | 1890 if (!m_deferredRepaintTimer.isActive()) |
1947 return; | 1891 return; |
1948 m_deferredRepaintTimer.stop(); | 1892 m_deferredRepaintTimer.stop(); |
1949 doDeferredRepaints(); | 1893 doDeferredRepaints(); |
1950 } | 1894 } |
1951 | 1895 |
1952 void FrameView::doDeferredRepaints() | 1896 void FrameView::doDeferredRepaints() |
1953 { | 1897 { |
1954 ASSERT(!m_deferringRepaints); | |
1955 if (!shouldUpdate()) { | 1898 if (!shouldUpdate()) { |
1956 m_repaintRects.clear(); | 1899 m_repaintRects.clear(); |
1957 m_repaintCount = 0; | 1900 m_repaintCount = 0; |
1958 return; | 1901 return; |
1959 } | 1902 } |
1960 unsigned size = m_repaintRects.size(); | 1903 unsigned size = m_repaintRects.size(); |
1961 for (unsigned i = 0; i < size; i++) { | 1904 for (unsigned i = 0; i < size; i++) { |
1962 ScrollView::repaintContentRectangle(pixelSnappedIntRect(m_repaintRects[i
])); | 1905 ScrollView::repaintContentRectangle(pixelSnappedIntRect(m_repaintRects[i
])); |
1963 } | 1906 } |
1964 m_repaintRects.clear(); | 1907 m_repaintRects.clear(); |
(...skipping 25 matching lines...) Expand all Loading... |
1990 } | 1933 } |
1991 double incrementedRepaintDelay = m_deferredRepaintDelay + s_deferredRepaintD
elayIncrementDuringLoading; | 1934 double incrementedRepaintDelay = m_deferredRepaintDelay + s_deferredRepaintD
elayIncrementDuringLoading; |
1992 m_deferredRepaintDelay = std::min(incrementedRepaintDelay, s_maxDeferredRepa
intDelayDuringLoading); | 1935 m_deferredRepaintDelay = std::min(incrementedRepaintDelay, s_maxDeferredRepa
intDelayDuringLoading); |
1993 } | 1936 } |
1994 | 1937 |
1995 void FrameView::resetDeferredRepaintDelay() | 1938 void FrameView::resetDeferredRepaintDelay() |
1996 { | 1939 { |
1997 m_deferredRepaintDelay = 0; | 1940 m_deferredRepaintDelay = 0; |
1998 if (m_deferredRepaintTimer.isActive()) { | 1941 if (m_deferredRepaintTimer.isActive()) { |
1999 m_deferredRepaintTimer.stop(); | 1942 m_deferredRepaintTimer.stop(); |
2000 if (!m_deferringRepaints) | 1943 doDeferredRepaints(); |
2001 doDeferredRepaints(); | |
2002 } | 1944 } |
2003 } | 1945 } |
2004 | 1946 |
2005 double FrameView::adjustedDeferredRepaintDelay() const | 1947 double FrameView::adjustedDeferredRepaintDelay() const |
2006 { | 1948 { |
2007 ASSERT(!m_deferringRepaints); | |
2008 if (!m_deferredRepaintDelay) | 1949 if (!m_deferredRepaintDelay) |
2009 return 0; | 1950 return 0; |
2010 double timeSinceLastPaint = currentTime() - m_lastPaintTime; | 1951 double timeSinceLastPaint = currentTime() - m_lastPaintTime; |
2011 return max(0., m_deferredRepaintDelay - timeSinceLastPaint); | 1952 return max(0., m_deferredRepaintDelay - timeSinceLastPaint); |
2012 } | 1953 } |
2013 | 1954 |
2014 void FrameView::deferredRepaintTimerFired(Timer<FrameView>*) | 1955 void FrameView::deferredRepaintTimerFired(Timer<FrameView>*) |
2015 { | 1956 { |
2016 doDeferredRepaints(); | 1957 doDeferredRepaints(); |
2017 } | 1958 } |
(...skipping 1519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3537 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o
rientation) | 3478 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o
rientation) |
3538 { | 3479 { |
3539 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); | 3480 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); |
3540 if (AXObjectCache* cache = axObjectCache()) { | 3481 if (AXObjectCache* cache = axObjectCache()) { |
3541 cache->remove(scrollbar); | 3482 cache->remove(scrollbar); |
3542 cache->handleScrollbarUpdate(this); | 3483 cache->handleScrollbarUpdate(this); |
3543 } | 3484 } |
3544 } | 3485 } |
3545 | 3486 |
3546 } // namespace WebCore | 3487 } // namespace WebCore |
OLD | NEW |