Index: Source/core/rendering/RenderLayerScrollableArea.cpp |
diff --git a/Source/core/rendering/RenderLayerScrollableArea.cpp b/Source/core/rendering/RenderLayerScrollableArea.cpp |
index 65872f9b9e8b72ba5b7f1fada072e4a73005f9de..ce5dab5a7bd70846861ceff7a76a7110673d385d 100644 |
--- a/Source/core/rendering/RenderLayerScrollableArea.cpp |
+++ b/Source/core/rendering/RenderLayerScrollableArea.cpp |
@@ -330,38 +330,34 @@ void RenderLayerScrollableArea::setScrollOffset(const IntPoint& newScrollOffset) |
setScrollOffset(toIntSize(newScrollOffset)); |
Frame* frame = m_box->frame(); |
- InspectorInstrumentation::willScrollLayer(m_box); |
+ ASSERT(frame); |
- RenderView* view = m_box->view(); |
+ RefPtr<FrameView> frameView = m_box->frameView(); |
- // We should have a RenderView if we're trying to scroll. |
- ASSERT(view); |
+ InspectorInstrumentation::willScrollLayer(m_box); |
// Update the positions of our child layers (if needed as only fixed layers should be impacted by a scroll). |
// We don't update compositing layers, because we need to do a deep update from the compositing ancestor. |
- bool inLayout = view ? view->frameView()->isInLayout() : false; |
- if (!inLayout) { |
+ if (!frameView->isInLayout()) { |
// If we're in the middle of layout, we'll just update layers once layout has finished. |
layer()->updateLayerPositionsAfterOverflowScroll(); |
- if (view) { |
- // Update regions, scrolling may change the clip of a particular region. |
- view->frameView()->updateAnnotatedRegions(); |
- view->updateWidgetPositions(); |
- } |
- |
+ // Update regions, scrolling may change the clip of a particular region. |
+ frameView->updateAnnotatedRegions(); |
+ // FIXME: We shouldn't call updateWidgetPositions() here since it might tear down the render tree, |
+ // for now we just crash to avoid allowing an attacker to use after free. |
+ frameView->updateWidgetPositions(); |
+ RELEASE_ASSERT(frameView->renderView()); |
updateCompositingLayersAfterScroll(); |
} |
RenderLayerModelObject* repaintContainer = m_box->containerForRepaint(); |
- if (frame) { |
- // The caret rect needs to be invalidated after scrolling |
- frame->selection().setCaretRectNeedsUpdate(); |
- |
- FloatQuad quadForFakeMouseMoveEvent = FloatQuad(layer()->repainter().repaintRect()); |
- if (repaintContainer) |
- quadForFakeMouseMoveEvent = repaintContainer->localToAbsoluteQuad(quadForFakeMouseMoveEvent); |
- frame->eventHandler().dispatchFakeMouseMoveEventSoonInQuad(quadForFakeMouseMoveEvent); |
- } |
+ // The caret rect needs to be invalidated after scrolling |
+ frame->selection().setCaretRectNeedsUpdate(); |
+ |
+ FloatQuad quadForFakeMouseMoveEvent = FloatQuad(layer()->repainter().repaintRect()); |
+ if (repaintContainer) |
+ quadForFakeMouseMoveEvent = repaintContainer->localToAbsoluteQuad(quadForFakeMouseMoveEvent); |
+ frame->eventHandler().dispatchFakeMouseMoveEventSoonInQuad(quadForFakeMouseMoveEvent); |
bool requiresRepaint = true; |
@@ -377,7 +373,7 @@ void RenderLayerScrollableArea::setScrollOffset(const IntPoint& newScrollOffset) |
} |
// Just schedule a full repaint of our object. |
- if (view && requiresRepaint) |
+ if (requiresRepaint) |
m_box->repaintUsingContainer(repaintContainer, pixelSnappedIntRect(layer()->repainter().repaintRect())); |
// Schedule the scroll DOM event. |