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 1241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1252 return false; | 1252 return false; |
| 1253 } | 1253 } |
| 1254 | 1254 |
| 1255 bool FrameView::useSlowRepaintsIfNotOverlapped() const | 1255 bool FrameView::useSlowRepaintsIfNotOverlapped() const |
| 1256 { | 1256 { |
| 1257 return useSlowRepaints(false); | 1257 return useSlowRepaints(false); |
| 1258 } | 1258 } |
| 1259 | 1259 |
| 1260 bool FrameView::shouldAttemptToScrollUsingFastPath() const | 1260 bool FrameView::shouldAttemptToScrollUsingFastPath() const |
| 1261 { | 1261 { |
| 1262 // FIXME: useSlowRepaints reads compositing state in parent frames. Composit ing state on the parent | |
| 1263 // frames is not necessarily up to date. | |
| 1264 // https://code.google.com/p/chromium/issues/detail?id=343766 | |
| 1265 DisableCompositingQueryAsserts disabler; | |
| 1266 return !useSlowRepaints(); | 1262 return !useSlowRepaints(); |
| 1267 } | 1263 } |
| 1268 | 1264 |
| 1269 bool FrameView::contentsInCompositedLayer() const | 1265 bool FrameView::contentsInCompositedLayer() const |
| 1270 { | 1266 { |
| 1271 RenderView* renderView = this->renderView(); | 1267 RenderView* renderView = this->renderView(); |
| 1272 if (renderView && renderView->compositingState() == PaintsIntoOwnBacking) { | 1268 if (renderView && renderView->compositingState() == PaintsIntoOwnBacking) { |
| 1273 GraphicsLayer* layer = renderView->layer()->compositedLayerMapping()->ma inGraphicsLayer(); | 1269 GraphicsLayer* layer = renderView->layer()->compositedLayerMapping()->ma inGraphicsLayer(); |
| 1274 if (layer && layer->drawsContent()) | 1270 if (layer && layer->drawsContent()) |
| 1275 return true; | 1271 return true; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1395 { | 1391 { |
| 1396 return m_frame->eventHandler().lastKnownMousePosition(); | 1392 return m_frame->eventHandler().lastKnownMousePosition(); |
| 1397 } | 1393 } |
| 1398 | 1394 |
| 1399 bool FrameView::shouldSetCursor() const | 1395 bool FrameView::shouldSetCursor() const |
| 1400 { | 1396 { |
| 1401 Page* page = frame().page(); | 1397 Page* page = frame().page(); |
| 1402 return page && page->visibilityState() != PageVisibilityStateHidden && page- >focusController().isActive(); | 1398 return page && page->visibilityState() != PageVisibilityStateHidden && page- >focusController().isActive(); |
| 1403 } | 1399 } |
| 1404 | 1400 |
| 1401 void FrameView::scrollContentsIfNeededRecursive() | |
| 1402 { | |
| 1403 scrollContentsIfNeeded(); | |
| 1404 | |
| 1405 for (LocalFrame* child = m_frame->tree().firstChild(); child; child = child- >tree().nextSibling()) { | |
| 1406 if (FrameView* view = child->view()) | |
| 1407 view->scrollContentsIfNeededRecursive(); | |
| 1408 } | |
| 1409 } | |
| 1410 | |
| 1411 void FrameView::scrollContentsIfNeeded() | |
| 1412 { | |
| 1413 bool didScroll = !pendingScrollDelta().isZero(); | |
| 1414 ScrollView::scrollContentsIfNeeded(); | |
| 1415 if (didScroll) | |
| 1416 updateFixedElementRepaintRectsAfterScroll(); | |
| 1417 } | |
| 1418 | |
| 1405 bool FrameView::scrollContentsFastPath(const IntSize& scrollDelta, const IntRect & rectToScroll, const IntRect& clipRect) | 1419 bool FrameView::scrollContentsFastPath(const IntSize& scrollDelta, const IntRect & rectToScroll, const IntRect& clipRect) |
| 1406 { | 1420 { |
| 1407 if (!m_viewportConstrainedObjects || m_viewportConstrainedObjects->isEmpty() ) { | 1421 if (!m_viewportConstrainedObjects || m_viewportConstrainedObjects->isEmpty() ) { |
| 1408 hostWindow()->scroll(scrollDelta, rectToScroll, clipRect); | 1422 hostWindow()->scroll(scrollDelta, rectToScroll, clipRect); |
| 1409 return true; | 1423 return true; |
| 1410 } | 1424 } |
| 1411 | 1425 |
| 1412 // https://code.google.com/p/chromium/issues/detail?id=343767 | |
| 1413 DisableCompositingQueryAsserts disabler; | |
| 1414 const bool isCompositedContentLayer = contentsInCompositedLayer(); | 1426 const bool isCompositedContentLayer = contentsInCompositedLayer(); |
| 1415 | 1427 |
| 1416 // Get the rects of the fixed objects visible in the rectToScroll | 1428 // Get the rects of the fixed objects visible in the rectToScroll |
| 1417 Region regionToUpdate; | 1429 Region regionToUpdate; |
| 1418 ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObje cts->end(); | 1430 ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObje cts->end(); |
| 1419 for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrained Objects->begin(); it != end; ++it) { | 1431 for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrained Objects->begin(); it != end; ++it) { |
| 1420 RenderObject* renderer = *it; | 1432 RenderObject* renderer = *it; |
| 1421 if (!renderer->style()->hasViewportConstrainedPosition()) | 1433 if (!renderer->style()->hasViewportConstrainedPosition()) |
| 1422 continue; | 1434 continue; |
| 1423 | 1435 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1466 | 1478 |
| 1467 // 1) scroll | 1479 // 1) scroll |
| 1468 hostWindow()->scroll(scrollDelta, rectToScroll, clipRect); | 1480 hostWindow()->scroll(scrollDelta, rectToScroll, clipRect); |
| 1469 | 1481 |
| 1470 // 2) update the area of fixed objects that has been invalidated | 1482 // 2) update the area of fixed objects that has been invalidated |
| 1471 Vector<IntRect> subRectsToUpdate = regionToUpdate.rects(); | 1483 Vector<IntRect> subRectsToUpdate = regionToUpdate.rects(); |
| 1472 size_t viewportConstrainedObjectsCount = subRectsToUpdate.size(); | 1484 size_t viewportConstrainedObjectsCount = subRectsToUpdate.size(); |
| 1473 for (size_t i = 0; i < viewportConstrainedObjectsCount; ++i) { | 1485 for (size_t i = 0; i < viewportConstrainedObjectsCount; ++i) { |
| 1474 IntRect updateRect = subRectsToUpdate[i]; | 1486 IntRect updateRect = subRectsToUpdate[i]; |
| 1475 IntRect scrolledRect = updateRect; | 1487 IntRect scrolledRect = updateRect; |
| 1476 scrolledRect.move(scrollDelta); | 1488 scrolledRect.move(-scrollDelta); |
| 1477 updateRect.unite(scrolledRect); | 1489 updateRect.unite(scrolledRect); |
| 1478 if (isCompositedContentLayer) { | 1490 if (isCompositedContentLayer) { |
| 1479 updateRect = rootViewToContents(updateRect); | 1491 updateRect = rootViewToContents(updateRect); |
| 1480 ASSERT(renderView()); | 1492 ASSERT(renderView()); |
| 1481 renderView()->layer()->repainter().setBackingNeedsRepaintInRect(upda teRect); | 1493 renderView()->layer()->repainter().setBackingNeedsRepaintInRect(upda teRect); |
| 1482 continue; | 1494 continue; |
| 1483 } | 1495 } |
| 1484 if (clipsRepaints()) | 1496 if (clipsRepaints()) |
| 1485 updateRect.intersect(rectToScroll); | 1497 updateRect.intersect(rectToScroll); |
| 1486 hostWindow()->invalidateContentsAndRootView(updateRect); | 1498 hostWindow()->invalidateContentsAndRootView(updateRect); |
| 1487 } | 1499 } |
| 1488 | 1500 |
| 1489 return true; | 1501 return true; |
| 1490 } | 1502 } |
| 1491 | 1503 |
| 1492 void FrameView::scrollContentsSlowPath(const IntRect& updateRect) | 1504 void FrameView::scrollContentsSlowPath(const IntRect& updateRect) |
| 1493 { | 1505 { |
| 1494 // FIXME: This is called when JS calls scrollTo, at which point there's no g uarantee that | |
| 1495 // compositing state is up to date. | |
| 1496 // https://code.google.com/p/chromium/issues/detail?id=343767 | |
| 1497 DisableCompositingQueryAsserts disabler; | |
| 1498 | |
| 1499 if (contentsInCompositedLayer()) { | 1506 if (contentsInCompositedLayer()) { |
| 1500 IntRect updateRect = visibleContentRect(); | 1507 IntRect updateRect = visibleContentRect(); |
| 1501 ASSERT(renderView()); | 1508 ASSERT(renderView()); |
| 1502 renderView()->layer()->repainter().setBackingNeedsRepaintInRect(updateRe ct); | 1509 renderView()->layer()->repainter().setBackingNeedsRepaintInRect(updateRe ct); |
| 1503 } | 1510 } |
| 1504 if (RenderPart* frameRenderer = m_frame->ownerRenderer()) { | 1511 if (RenderPart* frameRenderer = m_frame->ownerRenderer()) { |
| 1505 if (isEnclosedInCompositingLayer()) { | 1512 if (isEnclosedInCompositingLayer()) { |
| 1506 LayoutRect rect(frameRenderer->borderLeft() + frameRenderer->padding Left(), | 1513 LayoutRect rect(frameRenderer->borderLeft() + frameRenderer->padding Left(), |
| 1507 frameRenderer->borderTop() + frameRenderer->paddingT op(), | 1514 frameRenderer->borderTop() + frameRenderer->paddingT op(), |
| 1508 visibleWidth(), visibleHeight()); | 1515 visibleWidth(), visibleHeight()); |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1677 frame().loader().saveScrollState(); | 1684 frame().loader().saveScrollState(); |
| 1678 } | 1685 } |
| 1679 | 1686 |
| 1680 void FrameView::didScrollTimerFired(Timer<FrameView>*) | 1687 void FrameView::didScrollTimerFired(Timer<FrameView>*) |
| 1681 { | 1688 { |
| 1682 if (m_frame->document() && m_frame->document()->renderer()) { | 1689 if (m_frame->document() && m_frame->document()->renderer()) { |
| 1683 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->updateAl lImageResourcePriorities(); | 1690 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->updateAl lImageResourcePriorities(); |
| 1684 } | 1691 } |
| 1685 } | 1692 } |
| 1686 | 1693 |
| 1687 void FrameView::repaintFixedElementsAfterScrolling() | 1694 void FrameView::updateLayersAndCompositingAfterScrollIfNeeded() |
| 1688 { | 1695 { |
| 1696 // Nothing to do after scrolling if there are no fixed position elements. | |
| 1697 if (!hasViewportConstrainedObjects()) | |
| 1698 return; | |
| 1699 | |
| 1689 RefPtr<FrameView> protect(this); | 1700 RefPtr<FrameView> protect(this); |
| 1690 // For fixed position elements, update widget positions and compositing laye rs after scrolling, | 1701 |
| 1691 // but only if we're not inside of layout. | 1702 // If there fixed position elements, scrolling may cause compositing layers to change. |
| 1692 if (!m_nestedLayoutCount && hasViewportConstrainedObjects()) { | 1703 // Update widget and layer positions after scrolling, but only if we're not inside of |
| 1704 // layout. | |
| 1705 if (!m_nestedLayoutCount) { | |
| 1693 updateWidgetPositions(); | 1706 updateWidgetPositions(); |
| 1694 if (RenderView* renderView = this->renderView()) | 1707 if (RenderView* renderView = this->renderView()) |
| 1695 renderView->layer()->updateLayerPositionsAfterDocumentScroll(); | 1708 renderView->layer()->updateLayerPositionsAfterDocumentScroll(); |
| 1696 } | 1709 } |
| 1710 | |
| 1711 // Compositing layers may change after scrolling. | |
| 1712 // FIXME: Maybe no longer needed after we land squashing and kill overlap te sting? | |
| 1713 if (m_nestedLayoutCount <= 1) { | |
| 1714 if (RenderView* renderView = this->renderView()) | |
| 1715 renderView->compositor()->setNeedsCompositingUpdate(CompositingUpdat eOnScroll); | |
| 1716 } | |
| 1697 } | 1717 } |
| 1698 | 1718 |
| 1699 void FrameView::updateFixedElementsAfterScrolling() | 1719 void FrameView::updateFixedElementRepaintRectsAfterScroll() |
| 1700 { | 1720 { |
| 1701 if (m_nestedLayoutCount <= 1 && hasViewportConstrainedObjects()) { | 1721 if (!hasViewportConstrainedObjects()) |
| 1702 if (RenderView* renderView = this->renderView()) | 1722 return; |
| 1703 renderView->compositor()->setNeedsCompositingUpdate(CompositingUpdat eOnScroll); | 1723 |
| 1724 // Update the repaint rects for fixed elements after scrolling and invalidat ion to reflect | |
| 1725 // the new scroll position. | |
| 1726 ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObje cts->end(); | |
| 1727 for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrained Objects->begin(); it != end; ++it) { | |
| 1728 RenderObject* renderer = *it; | |
| 1729 if (!renderer->style()->hasViewportConstrainedPosition()) | |
|
esprehn
2014/03/25 02:37:44
It seems really weird that m_viewportConstrainedOb
ykyyip
2014/03/25 23:02:00
I don't know why this check is here either. m_view
| |
| 1730 continue; | |
| 1731 | |
| 1732 // Fixed items should always have layers. | |
| 1733 ASSERT(renderer->hasLayer()); | |
| 1734 | |
| 1735 RenderLayer* layer = toRenderBoxModelObject(renderer)->layer(); | |
| 1736 | |
| 1737 // Don't need to do this for composited fixed items. | |
| 1738 if (layer->compositingState() == PaintsIntoOwnBacking) | |
|
esprehn
2014/03/25 02:37:44
Fixed position elements are always composited now,
ykyyip
2014/03/25 23:02:00
Really, that code still gets run when there are fi
| |
| 1739 continue; | |
| 1740 | |
| 1741 // Also don't need to do this for invisible items. | |
| 1742 if (layer->viewportConstrainedNotCompositedReason() == RenderLayer::NotC ompositedForBoundsOutOfView | |
| 1743 || layer->viewportConstrainedNotCompositedReason() == RenderLayer::N otCompositedForNoVisibleContent) | |
| 1744 continue; | |
| 1745 | |
| 1746 layer->repainter().computeRepaintRects(renderer->containerForRepaint()); | |
| 1704 } | 1747 } |
| 1705 } | 1748 } |
| 1706 | 1749 |
| 1707 bool FrameView::shouldRubberBandInDirection(ScrollDirection direction) const | 1750 bool FrameView::shouldRubberBandInDirection(ScrollDirection direction) const |
| 1708 { | 1751 { |
| 1709 Page* page = frame().page(); | 1752 Page* page = frame().page(); |
| 1710 if (!page) | 1753 if (!page) |
| 1711 return ScrollView::shouldRubberBandInDirection(direction); | 1754 return ScrollView::shouldRubberBandInDirection(direction); |
| 1712 return page->chrome().client().shouldRubberBandInDirection(direction); | 1755 return page->chrome().client().shouldRubberBandInDirection(direction); |
| 1713 } | 1756 } |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2302 bool FrameView::isActive() const | 2345 bool FrameView::isActive() const |
| 2303 { | 2346 { |
| 2304 Page* page = frame().page(); | 2347 Page* page = frame().page(); |
| 2305 return page && page->focusController().isActive(); | 2348 return page && page->focusController().isActive(); |
| 2306 } | 2349 } |
| 2307 | 2350 |
| 2308 void FrameView::scrollTo(const IntSize& newOffset) | 2351 void FrameView::scrollTo(const IntSize& newOffset) |
| 2309 { | 2352 { |
| 2310 LayoutSize offset = scrollOffset(); | 2353 LayoutSize offset = scrollOffset(); |
| 2311 ScrollView::scrollTo(newOffset); | 2354 ScrollView::scrollTo(newOffset); |
| 2312 if (offset != scrollOffset()) | 2355 if (offset != scrollOffset()) { |
| 2356 updateLayersAndCompositingAfterScrollIfNeeded(); | |
| 2313 scrollPositionChanged(); | 2357 scrollPositionChanged(); |
| 2358 } | |
| 2314 frame().loader().client()->didChangeScrollOffset(); | 2359 frame().loader().client()->didChangeScrollOffset(); |
| 2315 } | 2360 } |
| 2316 | 2361 |
| 2317 void FrameView::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rec t) | 2362 void FrameView::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rec t) |
| 2318 { | 2363 { |
| 2319 // Add in our offset within the FrameView. | 2364 // Add in our offset within the FrameView. |
| 2320 IntRect dirtyRect = rect; | 2365 IntRect dirtyRect = rect; |
| 2321 dirtyRect.moveBy(scrollbar->location()); | 2366 dirtyRect.moveBy(scrollbar->location()); |
| 2322 | 2367 |
| 2323 if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled() && isInPerformLayout ()) { | 2368 if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled() && isInPerformLayout ()) { |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2781 | 2826 |
| 2782 ScrollView::paintOverhangAreas(context, horizontalOverhangArea, verticalOver hangArea, dirtyRect); | 2827 ScrollView::paintOverhangAreas(context, horizontalOverhangArea, verticalOver hangArea, dirtyRect); |
| 2783 } | 2828 } |
| 2784 | 2829 |
| 2785 void FrameView::updateLayoutAndStyleForPainting() | 2830 void FrameView::updateLayoutAndStyleForPainting() |
| 2786 { | 2831 { |
| 2787 // Updating layout can run script, which can tear down the FrameView. | 2832 // Updating layout can run script, which can tear down the FrameView. |
| 2788 RefPtr<FrameView> protector(this); | 2833 RefPtr<FrameView> protector(this); |
| 2789 | 2834 |
| 2790 updateLayoutAndStyleIfNeededRecursive(); | 2835 updateLayoutAndStyleIfNeededRecursive(); |
| 2836 | |
| 2791 if (RenderView* view = renderView()) | 2837 if (RenderView* view = renderView()) |
| 2792 view->compositor()->updateCompositingLayers(); | 2838 view->compositor()->updateCompositingLayers(); |
| 2839 | |
| 2840 scrollContentsIfNeededRecursive(); | |
| 2793 } | 2841 } |
| 2794 | 2842 |
| 2795 void FrameView::updateLayoutAndStyleIfNeededRecursive() | 2843 void FrameView::updateLayoutAndStyleIfNeededRecursive() |
| 2796 { | 2844 { |
| 2797 // We have to crawl our entire tree looking for any FrameViews that need | 2845 // We have to crawl our entire tree looking for any FrameViews that need |
| 2798 // layout and make sure they are up to date. | 2846 // layout and make sure they are up to date. |
| 2799 // Mac actually tests for intersection with the dirty region and tries not t o | 2847 // Mac actually tests for intersection with the dirty region and tries not t o |
| 2800 // update layout for frames that are outside the dirty region. Not only doe s this seem | 2848 // update layout for frames that are outside the dirty region. Not only doe s this seem |
| 2801 // pointless (since those frames will have set a zero timer to layout anyway ), but | 2849 // pointless (since those frames will have set a zero timer to layout anyway ), but |
| 2802 // it is also incorrect, since if two frames overlap, the first could be exc luded from the dirty | 2850 // it is also incorrect, since if two frames overlap, the first could be exc luded from the dirty |
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3216 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o rientation) | 3264 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o rientation) |
| 3217 { | 3265 { |
| 3218 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); | 3266 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); |
| 3219 if (AXObjectCache* cache = axObjectCache()) { | 3267 if (AXObjectCache* cache = axObjectCache()) { |
| 3220 cache->remove(scrollbar); | 3268 cache->remove(scrollbar); |
| 3221 cache->handleScrollbarUpdate(this); | 3269 cache->handleScrollbarUpdate(this); |
| 3222 } | 3270 } |
| 3223 } | 3271 } |
| 3224 | 3272 |
| 3225 } // namespace WebCore | 3273 } // namespace WebCore |
| OLD | NEW |