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 1206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1217 scrollContentsIfNeeded(); | 1217 scrollContentsIfNeeded(); |
| 1218 | 1218 |
| 1219 for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree ().nextSibling()) { | 1219 for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree ().nextSibling()) { |
| 1220 if (!child->isLocalFrame()) | 1220 if (!child->isLocalFrame()) |
| 1221 continue; | 1221 continue; |
| 1222 if (FrameView* view = toLocalFrame(child)->view()) | 1222 if (FrameView* view = toLocalFrame(child)->view()) |
| 1223 view->scrollContentsIfNeededRecursive(); | 1223 view->scrollContentsIfNeededRecursive(); |
| 1224 } | 1224 } |
| 1225 } | 1225 } |
| 1226 | 1226 |
| 1227 void FrameView::scrollContentsIfNeeded() | 1227 // FIXME: If we had a flag to force invalidations in a whole subtree, we could g et rid of this function. |
|
dsinclair
2014/09/02 18:36:47
crbug?
Julien - ping for review
2014/09/03 00:20:20
crbug.com/410097 (probably unneeded but at least i
| |
| 1228 static void paintInvalidationRectIncludingNonCompositingDescendants(const Render Layer* layer) | |
|
dsinclair
2014/09/02 18:36:48
This method name doesn't seem to match up with wha
Julien - ping for review
2014/09/03 00:20:20
Fine with the alternative name.
| |
| 1228 { | 1229 { |
| 1229 bool didScroll = !pendingScrollDelta().isZero(); | 1230 layer->renderer()->setShouldDoFullPaintInvalidation(true); |
| 1230 ScrollView::scrollContentsIfNeeded(); | 1231 |
| 1231 if (didScroll) | 1232 for (RenderLayer* child = layer->firstChild(); child; child = child->nextSib ling()) { |
| 1232 updateFixedElementPaintInvalidationRectsAfterScroll(); | 1233 // Don't include paint invalidation rects for composited child layers; t hey will paint themselves and have a different origin. |
| 1234 if (child->isPaintInvalidationContainer()) | |
| 1235 continue; | |
| 1236 | |
| 1237 paintInvalidationRectIncludingNonCompositingDescendants(child); | |
|
esprehn
2014/09/02 20:23:10
Instead of walking the whole tree recursively we s
Julien - ping for review
2014/09/03 00:20:20
The FIXME above exactly what covers this case :-)
| |
| 1238 } | |
| 1233 } | 1239 } |
| 1234 | 1240 |
| 1235 bool FrameView::scrollContentsFastPath(const IntSize& scrollDelta) | 1241 bool FrameView::scrollContentsFastPath(const IntSize& scrollDelta) |
| 1236 { | 1242 { |
| 1237 if (!contentsInCompositedLayer() || hasSlowRepaintObjects()) | 1243 if (!contentsInCompositedLayer() || hasSlowRepaintObjects()) |
| 1238 return false; | 1244 return false; |
| 1239 | 1245 |
| 1240 if (!m_viewportConstrainedObjects || m_viewportConstrainedObjects->isEmpty() ) { | 1246 if (!m_viewportConstrainedObjects || m_viewportConstrainedObjects->isEmpty() ) { |
| 1241 InspectorInstrumentation::didScroll(page()); | 1247 InspectorInstrumentation::didScroll(page()); |
| 1242 return true; | 1248 return true; |
| 1243 } | 1249 } |
| 1244 | 1250 |
| 1245 Region regionToUpdate; | |
| 1246 ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObje cts->end(); | 1251 ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObje cts->end(); |
| 1247 for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrained Objects->begin(); it != end; ++it) { | 1252 for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrained Objects->begin(); it != end; ++it) { |
| 1248 RenderObject* renderer = *it; | 1253 RenderObject* renderer = *it; |
| 1249 ASSERT(renderer->style()->hasViewportConstrainedPosition()); | 1254 ASSERT(renderer->style()->hasViewportConstrainedPosition()); |
| 1250 ASSERT(renderer->hasLayer()); | 1255 ASSERT(renderer->hasLayer()); |
| 1251 RenderLayer* layer = toRenderBoxModelObject(renderer)->layer(); | 1256 RenderLayer* layer = toRenderBoxModelObject(renderer)->layer(); |
| 1252 | 1257 |
| 1253 CompositingState state = layer->compositingState(); | 1258 if (layer->isPaintInvalidationContainer()) |
| 1254 if (state == PaintsIntoOwnBacking || state == PaintsIntoGroupedBacking) | |
| 1255 continue; | 1259 continue; |
| 1256 | 1260 |
| 1257 if (layer->subtreeIsInvisible()) | 1261 if (layer->subtreeIsInvisible()) |
| 1258 continue; | 1262 continue; |
| 1259 | 1263 |
| 1260 // If the fixed layer has a blur/drop-shadow filter applied on at least one of its parents, we cannot | 1264 // If the fixed layer has a blur/drop-shadow filter applied on at least one of its parents, we cannot |
| 1261 // scroll using the fast path, otherwise the outsets of the filter will be moved around the page. | 1265 // scroll using the fast path, otherwise the outsets of the filter will be moved around the page. |
| 1262 if (layer->hasAncestorWithFilterOutsets()) | 1266 if (layer->hasAncestorWithFilterOutsets()) |
| 1263 return false; | 1267 return false; |
| 1264 | 1268 |
| 1265 IntRect updateRect = pixelSnappedIntRect(layer->paintInvalidator().paint InvalidationRectIncludingNonCompositingDescendants()); | 1269 paintInvalidationRectIncludingNonCompositingDescendants(layer); |
| 1266 | |
| 1267 const RenderLayerModelObject* repaintContainer = layer->renderer()->cont ainerForPaintInvalidation(); | |
| 1268 if (repaintContainer && !repaintContainer->isRenderView()) { | |
| 1269 // Invalidate the old and new locations of fixed position elements t hat are not drawn into the RenderView. | |
| 1270 updateRect.moveBy(scrollPosition()); | |
| 1271 IntRect previousRect = updateRect; | |
| 1272 previousRect.move(scrollDelta); | |
| 1273 // FIXME: Rather than uniting the rects, we should just issue both i nvalidations. | |
| 1274 updateRect.unite(previousRect); | |
| 1275 layer->renderer()->invalidatePaintUsingContainer(repaintContainer, u pdateRect, InvalidationScroll); | |
| 1276 } else { | |
| 1277 // Coalesce the paint invalidations that will be issued to the rende rView. | |
| 1278 updateRect = contentsToRootView(updateRect); | |
| 1279 if (!updateRect.isEmpty()) | |
| 1280 regionToUpdate.unite(updateRect); | |
| 1281 } | |
| 1282 } | |
| 1283 | |
| 1284 InspectorInstrumentation::didScroll(page()); | |
|
dsinclair
2014/09/02 18:36:48
Does this still need to exist somewhere?
Julien - ping for review
2014/09/03 00:20:20
I would believe it does, it's a bad merge :(
| |
| 1285 | |
| 1286 // Invalidate the old and new locations of fixed position elements that are drawn into the RenderView. | |
| 1287 Vector<IntRect> subRectsToUpdate = regionToUpdate.rects(); | |
| 1288 size_t viewportConstrainedObjectsCount = subRectsToUpdate.size(); | |
| 1289 for (size_t i = 0; i < viewportConstrainedObjectsCount; ++i) { | |
| 1290 IntRect updateRect = subRectsToUpdate[i]; | |
| 1291 IntRect scrolledRect = updateRect; | |
| 1292 scrolledRect.move(-scrollDelta); | |
| 1293 updateRect.unite(scrolledRect); | |
| 1294 // FIXME: We should be able to issue these invalidations separately and before we actually scroll. | |
| 1295 renderView()->layer()->paintInvalidator().setBackingNeedsPaintInvalidati onInRect(rootViewToContents(updateRect)); | |
| 1296 } | 1270 } |
| 1297 | 1271 |
| 1298 return true; | 1272 return true; |
| 1299 } | 1273 } |
| 1300 | 1274 |
| 1301 void FrameView::scrollContentsSlowPath(const IntRect& updateRect) | 1275 void FrameView::scrollContentsSlowPath(const IntRect& updateRect) |
| 1302 { | 1276 { |
| 1303 if (contentsInCompositedLayer()) { | 1277 if (contentsInCompositedLayer()) { |
| 1304 IntRect updateRect = visibleContentRect(); | 1278 IntRect updateRect = visibleContentRect(); |
| 1305 ASSERT(renderView()); | 1279 ASSERT(renderView()); |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1517 // If there fixed position elements, scrolling may cause compositing layers to change. | 1491 // If there fixed position elements, scrolling may cause compositing layers to change. |
| 1518 // Update widget and layer positions after scrolling, but only if we're not inside of | 1492 // Update widget and layer positions after scrolling, but only if we're not inside of |
| 1519 // layout. | 1493 // layout. |
| 1520 if (!m_nestedLayoutCount) { | 1494 if (!m_nestedLayoutCount) { |
| 1521 updateWidgetPositions(); | 1495 updateWidgetPositions(); |
| 1522 if (RenderView* renderView = this->renderView()) | 1496 if (RenderView* renderView = this->renderView()) |
| 1523 renderView->layer()->setNeedsCompositingInputsUpdate(); | 1497 renderView->layer()->setNeedsCompositingInputsUpdate(); |
| 1524 } | 1498 } |
| 1525 } | 1499 } |
| 1526 | 1500 |
| 1527 void FrameView::updateFixedElementPaintInvalidationRectsAfterScroll() | |
| 1528 { | |
| 1529 if (!hasViewportConstrainedObjects()) | |
| 1530 return; | |
| 1531 | |
| 1532 // Update the paint invalidation rects for fixed elements after scrolling an d invalidation to reflect | |
| 1533 // the new scroll position. | |
| 1534 ViewportConstrainedObjectSet::const_iterator end = m_viewportConstrainedObje cts->end(); | |
| 1535 for (ViewportConstrainedObjectSet::const_iterator it = m_viewportConstrained Objects->begin(); it != end; ++it) { | |
| 1536 RenderObject* renderer = *it; | |
| 1537 // m_viewportConstrainedObjects should not contain non-viewport constrai ned objects. | |
| 1538 ASSERT(renderer->style()->hasViewportConstrainedPosition()); | |
| 1539 | |
| 1540 // Fixed items should always have layers. | |
| 1541 ASSERT(renderer->hasLayer()); | |
| 1542 | |
| 1543 RenderLayer* layer = toRenderBoxModelObject(renderer)->layer(); | |
| 1544 | |
| 1545 // Don't need to do this for composited fixed items. | |
| 1546 if (layer->compositingState() == PaintsIntoOwnBacking) | |
| 1547 continue; | |
| 1548 | |
| 1549 layer->paintInvalidator().computePaintInvalidationRectsIncludingNonCompo sitingDescendants(); | |
| 1550 } | |
| 1551 } | |
| 1552 | |
| 1553 void FrameView::updateCompositedSelectionBoundsIfNeeded() | 1501 void FrameView::updateCompositedSelectionBoundsIfNeeded() |
| 1554 { | 1502 { |
| 1555 if (!RuntimeEnabledFeatures::compositedSelectionUpdatesEnabled()) | 1503 if (!RuntimeEnabledFeatures::compositedSelectionUpdatesEnabled()) |
| 1556 return; | 1504 return; |
| 1557 | 1505 |
| 1558 Page* page = frame().page(); | 1506 Page* page = frame().page(); |
| 1559 ASSERT(page); | 1507 ASSERT(page); |
| 1560 | 1508 |
| 1561 LocalFrame* frame = toLocalFrame(page->focusController().focusedOrMainFrame( )); | 1509 LocalFrame* frame = toLocalFrame(page->focusController().focusedOrMainFrame( )); |
| 1562 if (!frame || !frame->selection().isCaretOrRange()) { | 1510 if (!frame || !frame->selection().isCaretOrRange()) { |
| (...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2536 | 2484 |
| 2537 void FrameView::updateLayoutAndStyleForPainting() | 2485 void FrameView::updateLayoutAndStyleForPainting() |
| 2538 { | 2486 { |
| 2539 // Updating layout can run script, which can tear down the FrameView. | 2487 // Updating layout can run script, which can tear down the FrameView. |
| 2540 RefPtr<FrameView> protector(this); | 2488 RefPtr<FrameView> protector(this); |
| 2541 | 2489 |
| 2542 updateLayoutAndStyleIfNeededRecursive(); | 2490 updateLayoutAndStyleIfNeededRecursive(); |
| 2543 | 2491 |
| 2544 updateWidgetPositionsIfNeeded(); | 2492 updateWidgetPositionsIfNeeded(); |
| 2545 | 2493 |
| 2546 if (RenderView* view = renderView()) { | 2494 RenderView* view = renderView(); |
| 2495 if (view) { | |
| 2547 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Up dateLayerTree", "frame", m_frame.get()); | 2496 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Up dateLayerTree", "frame", m_frame.get()); |
| 2548 // FIXME(361045): remove InspectorInstrumentation calls once DevTools Ti meline migrates to tracing. | 2497 // FIXME(361045): remove InspectorInstrumentation calls once DevTools Ti meline migrates to tracing. |
| 2549 InspectorInstrumentation::willUpdateLayerTree(m_frame.get()); | 2498 InspectorInstrumentation::willUpdateLayerTree(m_frame.get()); |
| 2550 | 2499 |
| 2551 view->compositor()->updateIfNeededRecursive(); | 2500 view->compositor()->updateIfNeededRecursive(); |
| 2552 | 2501 |
| 2553 if (view->compositor()->inCompositingMode() && m_frame->isLocalRoot()) | 2502 if (view->compositor()->inCompositingMode() && m_frame->isLocalRoot()) |
| 2554 m_frame->page()->scrollingCoordinator()->updateAfterCompositingChang eIfNeeded(); | 2503 m_frame->page()->scrollingCoordinator()->updateAfterCompositingChang eIfNeeded(); |
| 2555 | 2504 |
| 2556 updateCompositedSelectionBoundsIfNeeded(); | 2505 updateCompositedSelectionBoundsIfNeeded(); |
| 2557 | 2506 |
| 2558 InspectorInstrumentation::didUpdateLayerTree(m_frame.get()); | 2507 InspectorInstrumentation::didUpdateLayerTree(m_frame.get()); |
| 2559 | |
| 2560 invalidateTreeIfNeededRecursive(); | |
| 2561 } | 2508 } |
| 2562 | 2509 |
| 2563 scrollContentsIfNeededRecursive(); | 2510 scrollContentsIfNeededRecursive(); |
| 2511 | |
| 2512 if (view) | |
| 2513 invalidateTreeIfNeededRecursive(); | |
| 2514 | |
| 2564 ASSERT(lifecycle().state() == DocumentLifecycle::PaintInvalidationClean); | 2515 ASSERT(lifecycle().state() == DocumentLifecycle::PaintInvalidationClean); |
| 2565 } | 2516 } |
| 2566 | 2517 |
| 2567 void FrameView::updateLayoutAndStyleIfNeededRecursive() | 2518 void FrameView::updateLayoutAndStyleIfNeededRecursive() |
| 2568 { | 2519 { |
| 2569 // We have to crawl our entire tree looking for any FrameViews that need | 2520 // We have to crawl our entire tree looking for any FrameViews that need |
| 2570 // layout and make sure they are up to date. | 2521 // layout and make sure they are up to date. |
| 2571 // Mac actually tests for intersection with the dirty region and tries not t o | 2522 // Mac actually tests for intersection with the dirty region and tries not t o |
| 2572 // update layout for frames that are outside the dirty region. Not only doe s this seem | 2523 // update layout for frames that are outside the dirty region. Not only doe s this seem |
| 2573 // pointless (since those frames will have set a zero timer to layout anyway ), but | 2524 // pointless (since those frames will have set a zero timer to layout anyway ), but |
| (...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3000 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o rientation) | 2951 void FrameView::willRemoveScrollbar(Scrollbar* scrollbar, ScrollbarOrientation o rientation) |
| 3001 { | 2952 { |
| 3002 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); | 2953 ScrollableArea::willRemoveScrollbar(scrollbar, orientation); |
| 3003 if (AXObjectCache* cache = axObjectCache()) { | 2954 if (AXObjectCache* cache = axObjectCache()) { |
| 3004 cache->remove(scrollbar); | 2955 cache->remove(scrollbar); |
| 3005 cache->handleScrollbarUpdate(this); | 2956 cache->handleScrollbarUpdate(this); |
| 3006 } | 2957 } |
| 3007 } | 2958 } |
| 3008 | 2959 |
| 3009 } // namespace blink | 2960 } // namespace blink |
| OLD | NEW |