Chromium Code Reviews| Index: Source/web/WebFrame.cpp |
| diff --git a/Source/web/WebFrame.cpp b/Source/web/WebFrame.cpp |
| index b6832d30b735811ea7c4940a581f6364b0182073..7fbdac76057e344dda465878c00fb1a4cde75209 100644 |
| --- a/Source/web/WebFrame.cpp |
| +++ b/Source/web/WebFrame.cpp |
| @@ -25,12 +25,21 @@ Frame* toCoreFrame(const WebFrame* frame) |
| : toWebRemoteFrameImpl(frame)->frame(); |
| } |
| -void WebFrame::swap(WebFrame* frame) |
| +bool WebFrame::swap(WebFrame* frame) |
| { |
| using std::swap; |
| + RefPtr<Frame> oldFrame = toCoreFrame(this); |
| + |
| + // All child frames must be detached first. |
| + oldFrame->detachChildren(); |
| + |
| + // If the frame has been detached during detaching its children, return |
|
eseidel
2014/09/10 18:09:12
When does this happen? Are there JS events which
|
| + // immediately. |
| + // FIXME: There is no unit test for this condition, so one needs to be |
| + // written. |
| + if (!oldFrame->host()) |
| + return false; |
| - // All child frames must have been detached first. |
| - ASSERT(!m_firstChild && !m_lastChild); |
| // The frame being swapped in should not have a Frame associated |
| // with it yet. |
| ASSERT(!toCoreFrame(frame)); |
| @@ -66,7 +75,6 @@ void WebFrame::swap(WebFrame* frame) |
| // the type of the passed in WebFrame. |
| // FIXME: This is a bit clunky; this results in pointless decrements and |
| // increments of connected subframes. |
| - Frame* oldFrame = toCoreFrame(this); |
| FrameOwner* owner = oldFrame->owner(); |
| oldFrame->disconnectOwnerElement(); |
| if (frame->isWebLocalFrame()) { |
| @@ -74,6 +82,8 @@ void WebFrame::swap(WebFrame* frame) |
| } else { |
| toWebRemoteFrameImpl(frame)->initializeCoreFrame(oldFrame->host(), owner, oldFrame->tree().name()); |
| } |
| + |
| + return true; |
| } |
| v8::Handle<v8::Value> WebFrame::executeScriptAndReturnValueForTests(const WebScriptSource& source) |