| Index: Source/core/loader/FrameLoader.cpp
|
| diff --git a/Source/core/loader/FrameLoader.cpp b/Source/core/loader/FrameLoader.cpp
|
| index 922fb8214a549fff262e326be04cf7f61258e42b..cf9ee0a7283704a14ea3dab8eaebdd190b37249a 100644
|
| --- a/Source/core/loader/FrameLoader.cpp
|
| +++ b/Source/core/loader/FrameLoader.cpp
|
| @@ -242,7 +242,6 @@ void FrameLoader::clear()
|
|
|
| m_frame->editor().clear();
|
| m_frame->document()->cancelParsing();
|
| - m_frame->document()->prepareForDestruction();
|
| m_frame->document()->removeFocusedElementOfSubtree(m_frame->document());
|
| m_frame->selection().prepareForDestruction();
|
| m_frame->eventHandler().clear();
|
| @@ -279,9 +278,11 @@ void FrameLoader::replaceDocumentWhileExecutingJavaScriptURL(const String& sourc
|
| init.withNewRegistrationContext();
|
|
|
| stopAllLoaders();
|
| + m_frame->detachChildren();
|
| + m_frame->document()->prepareForDestruction();
|
| clear();
|
|
|
| - // clear() potentially detaches the frame from the document. The
|
| + // detachChildren() potentially detaches the frame from the document. The
|
| // loading cannot continue in that case.
|
| if (!m_frame->page())
|
| return;
|
| @@ -964,12 +965,19 @@ void FrameLoader::commitProvisionalLoad()
|
| client()->dispatchWillClose();
|
| dispatchUnloadEvent();
|
| }
|
| - m_frame->detachChildren();
|
| if (pdl != m_provisionalDocumentLoader)
|
| return;
|
| if (m_documentLoader)
|
| m_documentLoader->detachFromFrame();
|
| m_documentLoader = m_provisionalDocumentLoader.release();
|
| + if (m_frame->document()) {
|
| + // Note that calling detachChildren() shouldn't be needed if there's no
|
| + // Document, since no child frames should be attached. The assert below
|
| + // enforces this invariant.
|
| + m_frame->detachChildren();
|
| + m_frame->document()->prepareForDestruction();
|
| + }
|
| + ASSERT(m_frame->tree().childCount() == 0);
|
|
|
| if (isLoadingMainFrame())
|
| m_frame->page()->chrome().client().needTouchEvents(false);
|
|
|