| Index: Source/core/frame/LocalFrame.cpp
|
| diff --git a/Source/core/frame/LocalFrame.cpp b/Source/core/frame/LocalFrame.cpp
|
| index 0b8649d3a2a53b63488c48b36c8bc3315946c0ea..e94f3861e8c2ca1f629e129aa3637a93f222240f 100644
|
| --- a/Source/core/frame/LocalFrame.cpp
|
| +++ b/Source/core/frame/LocalFrame.cpp
|
| @@ -132,7 +132,15 @@
|
| void LocalFrame::setView(PassRefPtrWillBeRawPtr<FrameView> view)
|
| {
|
| ASSERT(!m_view || m_view != view);
|
| - ASSERT(!document() || !document()->isActive());
|
| + detachView();
|
| +
|
| + // Prepare for destruction now, so any unload event handlers get run and the LocalDOMWindow is
|
| + // notified. If we wait until the view is destroyed, then things won't be hooked up enough for
|
| + // these calls to work.
|
| + if (!view && document() && document()->isActive()) {
|
| + // FIXME: We don't call willRemove here. Why is that OK?
|
| + document()->prepareForDestruction();
|
| + }
|
|
|
| eventHandler().clear();
|
|
|
| @@ -259,8 +267,6 @@
|
| // handlers might start a new subresource load in this frame.
|
| m_loader.stopAllLoaders();
|
| m_loader.detach();
|
| - document()->prepareForDestruction();
|
| - m_loader.clear();
|
| if (!client())
|
| return;
|
|
|
| @@ -273,6 +279,10 @@
|
| willDetachFrameHost();
|
| InspectorInstrumentation::frameDetachedFromParent(this);
|
| Frame::detach();
|
| + // Clear the FrameLoader right here rather than during
|
| + // finalization. Too late to access various heap objects at that
|
| + // stage.
|
| + m_loader.clear();
|
|
|
| // Signal frame destruction here rather than in the destructor.
|
| // Main motivation is to avoid being dependent on its exact timing (Oilpan.)
|
| @@ -824,4 +834,15 @@
|
| m_instrumentingAgents = localFrameRoot()->m_instrumentingAgents;
|
| }
|
|
|
| +void LocalFrame::detachView()
|
| +{
|
| + // We detach the FrameView's custom scroll bars as early as
|
| + // possible to prevent m_doc->detach() from messing with the view
|
| + // such that its scroll bars won't be torn down.
|
| + //
|
| + // FIXME: We should revisit this.
|
| + if (m_view)
|
| + m_view->prepareForDetach();
|
| +}
|
| +
|
| } // namespace blink
|
|
|