Index: Source/core/page/FrameView.cpp |
diff --git a/Source/core/page/FrameView.cpp b/Source/core/page/FrameView.cpp |
index e1f7ea2eef7c9a4a6e6e14cd10a670ffb75ed941..ec91b231a2501f124be41833ee30d171f9650ed5 100644 |
--- a/Source/core/page/FrameView.cpp |
+++ b/Source/core/page/FrameView.cpp |
@@ -2202,26 +2202,26 @@ void FrameView::scrollToAnchor() |
m_maintainScrollPositionAnchor = anchorNode; |
} |
-void FrameView::updateWidget(RenderObject* object) |
+bool FrameView::updateWidget(RenderObject* object) |
{ |
ASSERT(!object->node() || object->node()->isElementNode()); |
- Element* ownerElement = toElement(object->node()); |
+ RefPtr<Element> ownerElement = toElement(object->node()); |
// The object may have already been destroyed (thus node cleared), |
// but FrameView holds a manual ref, so it won't have been deleted. |
ASSERT(m_widgetUpdateSet->contains(object)); |
if (!ownerElement) |
- return; |
+ return true; |
if (object->isEmbeddedObject()) { |
RenderEmbeddedObject* embeddedObject = static_cast<RenderEmbeddedObject*>(object); |
// No need to update if it's already crashed or known to be missing. |
if (embeddedObject->showsUnavailablePluginIndicator()) |
- return; |
+ return true; |
// FIXME: This could turn into a real virtual dispatch if we defined |
// updateWidget(PluginCreationOption) on HTMLElement. |
if (ownerElement->hasTagName(objectTag) || ownerElement->hasTagName(embedTag) || ownerElement->hasTagName(appletTag)) { |
- HTMLPlugInImageElement* pluginElement = toHTMLPlugInImageElement(ownerElement); |
+ HTMLPlugInImageElement* pluginElement = toHTMLPlugInImageElement(ownerElement.get()); |
if (pluginElement->needsWidgetUpdate()) |
pluginElement->updateWidget(CreateAnyWidgetType); |
} else |
@@ -2229,8 +2229,14 @@ void FrameView::updateWidget(RenderObject* object) |
// Caution: it's possible the object was destroyed again, since loading a |
// plugin may run any arbitrary JavaScript. |
+ if (ownerElement->renderer() != embeddedObject) { |
+ m_widgetUpdateSet->clear(); |
+ return false; |
+ } |
embeddedObject->updateWidgetPosition(); |
} |
+ |
+ return true; |
} |
bool FrameView::updateWidgets() |
@@ -2255,7 +2261,8 @@ bool FrameView::updateWidgets() |
for (size_t i = 0; i < size; ++i) { |
RenderObject* object = objects[i]; |
- updateWidget(object); |
+ if (!updateWidget(object)) |
+ return false; |
m_widgetUpdateSet->remove(object); |
} |
@@ -2338,6 +2345,9 @@ void FrameView::performPostLayoutTasks() |
m_actionScheduler->resume(); |
+ // Refetch render view since it can be destroyed by updateWidget() |
+ // call above. |
+ renderView = this->renderView(); |
if (renderView && !renderView->printing()) { |
IntSize currentSize; |
currentSize = visibleContentRect(IncludeScrollbars).size(); |