Index: Source/core/frame/FrameView.cpp |
diff --git a/Source/core/frame/FrameView.cpp b/Source/core/frame/FrameView.cpp |
index da1ffa226151929878792d65c96c7e7c2061e4e2..c7514dbb85db28dd68120feb83c066c8e11d8f37 100644 |
--- a/Source/core/frame/FrameView.cpp |
+++ b/Source/core/frame/FrameView.cpp |
@@ -65,6 +65,7 @@ |
#include "core/rendering/RenderScrollbarPart.h" |
#include "core/rendering/RenderTheme.h" |
#include "core/rendering/RenderView.h" |
+#include "core/rendering/RenderWidget.h" |
#include "core/rendering/TextAutosizer.h" |
#include "core/rendering/style/RenderStyle.h" |
#include "core/rendering/svg/RenderSVGRoot.h" |
@@ -952,8 +953,7 @@ void FrameView::scheduleOrPerformPostLayoutTasks() |
if (!m_inSynchronousPostLayout) { |
if (frame().document()->shouldDisplaySeamlesslyWithParent()) { |
- if (RenderView* renderView = this->renderView()) |
- renderView->updateWidgetPositions(); |
+ updateWidgetPositions(); |
} else { |
m_inSynchronousPostLayout = true; |
// Calls resumeScheduledEvents() |
@@ -1263,6 +1263,31 @@ RenderBox* FrameView::embeddedContentBox() const |
return 0; |
} |
+ |
+void FrameView::addWidget(RenderWidget* object) |
+{ |
+ m_widgets.add(object); |
+} |
+ |
+void FrameView::removeWidget(RenderWidget* object) |
+{ |
+ m_widgets.remove(object); |
+} |
+ |
+void FrameView::updateWidgetPositions() |
+{ |
+ Vector<RefPtr<RenderWidget> > widgets; |
+ copyToVector(m_widgets, widgets); |
+ |
+ // Script or plugins could detach the frame so abort processing if that happens. |
+ |
+ for (size_t i = 0; i < widgets.size() && renderView(); ++i) |
+ widgets[i]->updateWidgetPosition(); |
+ |
+ for (size_t i = 0; i < widgets.size() && renderView(); ++i) |
+ widgets[i]->widgetPositionsUpdated(); |
+} |
+ |
void FrameView::addWidgetToUpdate(RenderEmbeddedObject& object) |
{ |
// Tell the DOM element that it needs a widget update. |
@@ -1734,13 +1759,13 @@ void FrameView::scrollPositionChanged() |
void FrameView::repaintFixedElementsAfterScrolling() |
{ |
+ RefPtr<FrameView> protect(this); |
// For fixed position elements, update widget positions and compositing layers after scrolling, |
// but only if we're not inside of layout. |
if (!m_nestedLayoutCount && hasViewportConstrainedObjects()) { |
- if (RenderView* renderView = this->renderView()) { |
- renderView->updateWidgetPositions(); |
+ updateWidgetPositions(); |
+ if (RenderView* renderView = this->renderView()) |
renderView->layer()->updateLayerPositionsAfterDocumentScroll(); |
- } |
} |
} |
@@ -2300,9 +2325,11 @@ void FrameView::performPostLayoutTasks() |
FontFaceSet::didLayout(m_frame->document()); |
- RenderView* renderView = this->renderView(); |
- if (renderView) |
- renderView->updateWidgetPositions(); |
+ updateWidgetPositions(); |
+ |
+ // Plugins could have torn down the page inside updateWidgetPositions(). |
+ if (!renderView()) |
+ return; |
if (!m_updateWidgetsTimer.isActive()) |
m_updateWidgetsTimer.startOneShot(0); |