Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(372)

Side by Side Diff: Source/core/frame/LocalFrame.cpp

Issue 551973005: Streamline frame detach (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
3 * 1999 Lars Knoll <knoll@kde.org> 3 * 1999 Lars Knoll <knoll@kde.org>
4 * 1999 Antti Koivisto <koivisto@kde.org> 4 * 1999 Antti Koivisto <koivisto@kde.org>
5 * 2000 Simon Hausmann <hausmann@kde.org> 5 * 2000 Simon Hausmann <hausmann@kde.org>
6 * 2000 Stefan Schimanski <1Stein@gmx.de> 6 * 2000 Stefan Schimanski <1Stein@gmx.de>
7 * 2001 George Staikos <staikos@kde.org> 7 * 2001 George Staikos <staikos@kde.org>
8 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ights reserved. 8 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ights reserved.
9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com> 9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com>
10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 HeapSupplementable<LocalFrame>::trace(visitor); 155 HeapSupplementable<LocalFrame>::trace(visitor);
156 #endif 156 #endif
157 Frame::trace(visitor); 157 Frame::trace(visitor);
158 } 158 }
159 159
160 void LocalFrame::detach() 160 void LocalFrame::detach()
161 { 161 {
162 // A lot of the following steps can result in the current frame being 162 // A lot of the following steps can result in the current frame being
163 // detached, so protect a reference to it. 163 // detached, so protect a reference to it.
164 RefPtrWillBeRawPtr<LocalFrame> protect(this); 164 RefPtrWillBeRawPtr<LocalFrame> protect(this);
165 m_loader.stopAllLoaders();
166 m_loader.closeURL();
167 detachChildren(); 165 detachChildren();
168 // stopAllLoaders() needs to be called after detachChildren(), because detac hChildren() 166 // stopAllLoaders() needs to be called after detachChildren(), because detac hChildren()
169 // will trigger the unload event handlers of any child frames, and those eve nt 167 // will trigger the unload event handlers of any child frames, and those eve nt
170 // handlers might start a new subresource load in this frame. 168 // handlers might start a new subresource load in this frame.
169 m_loader.closeURL();
dcheng 2014/09/25 23:35:43 Out of curiosity, is there a reason you chose to r
Nate Chapin 2014/09/25 23:57:50 So it appears. I was grumpy about the 2 stopAllLoa
171 m_loader.stopAllLoaders(); 170 m_loader.stopAllLoaders();
172 m_loader.detachFromParent(); 171 if (!client())
172 return;
173 m_loader.detach();
174 setView(nullptr);
175 willDetachFrameHost();
176 // Notify ScriptController that the frame is closing, since its cleanup ends up calling
177 // back to FrameLoaderClient via WindowProxy.
178 script().clearForClose();
179 InspectorInstrumentation::frameDetachedFromParent(this);
180 Frame::detach();
173 } 181 }
174 182
175 bool LocalFrame::inScope(TreeScope* scope) const 183 bool LocalFrame::inScope(TreeScope* scope) const
176 { 184 {
177 ASSERT(scope); 185 ASSERT(scope);
178 Document* doc = document(); 186 Document* doc = document();
179 if (!doc) 187 if (!doc)
180 return false; 188 return false;
181 // FIXME: This check is broken in for OOPI. 189 // FIXME: This check is broken in for OOPI.
182 HTMLFrameOwnerElement* owner = doc->ownerElement(); 190 HTMLFrameOwnerElement* owner = doc->ownerElement();
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 m_destructionObservers.add(observer); 315 m_destructionObservers.add(observer);
308 } 316 }
309 317
310 void LocalFrame::removeDestructionObserver(FrameDestructionObserver* observer) 318 void LocalFrame::removeDestructionObserver(FrameDestructionObserver* observer)
311 { 319 {
312 m_destructionObservers.remove(observer); 320 m_destructionObservers.remove(observer);
313 } 321 }
314 322
315 void LocalFrame::willDetachFrameHost() 323 void LocalFrame::willDetachFrameHost()
316 { 324 {
317 // We should never be detatching the page during a Layout.
318 RELEASE_ASSERT(!m_view || !m_view->isInPerformLayout());
319
320 Frame* parent = tree().parent();
321 if (parent && parent->isLocalFrame())
322 toLocalFrame(parent)->loader().checkLoadComplete();
323 325
324 WillBeHeapHashSet<RawPtrWillBeWeakMember<FrameDestructionObserver> >::iterat or stop = m_destructionObservers.end(); 326 WillBeHeapHashSet<RawPtrWillBeWeakMember<FrameDestructionObserver> >::iterat or stop = m_destructionObservers.end();
325 for (WillBeHeapHashSet<RawPtrWillBeWeakMember<FrameDestructionObserver> >::i terator it = m_destructionObservers.begin(); it != stop; ++it) 327 for (WillBeHeapHashSet<RawPtrWillBeWeakMember<FrameDestructionObserver> >::i terator it = m_destructionObservers.begin(); it != stop; ++it)
326 (*it)->willDetachFrameHost(); 328 (*it)->willDetachFrameHost();
327 329
328 // FIXME: Page should take care of updating focus/scrolling instead of Frame . 330 // FIXME: Page should take care of updating focus/scrolling instead of Frame .
329 // FIXME: It's unclear as to why this is called more than once, but it is, 331 // FIXME: It's unclear as to why this is called more than once, but it is,
330 // so page() could be null. 332 // so page() could be null.
331 if (page() && page()->focusController().focusedFrame() == this) 333 if (page() && page()->focusController().focusedFrame() == this)
332 page()->focusController().setFocusedFrame(nullptr); 334 page()->focusController().setFocusedFrame(nullptr);
333 script().clearScriptObjects(); 335 script().clearScriptObjects();
334 336
335 if (page() && page()->scrollingCoordinator() && m_view) 337 if (page() && page()->scrollingCoordinator() && m_view)
336 page()->scrollingCoordinator()->willDestroyScrollableArea(m_view.get()); 338 page()->scrollingCoordinator()->willDestroyScrollableArea(m_view.get());
337 } 339 }
338 340
339 void LocalFrame::detachFromFrameHost()
340 {
341 // We should never be detaching the page during a Layout.
342 RELEASE_ASSERT(!m_view || !m_view->isInPerformLayout());
343 m_host = nullptr;
344 }
345
346 String LocalFrame::documentTypeString() const 341 String LocalFrame::documentTypeString() const
347 { 342 {
348 if (DocumentType* doctype = document()->doctype()) 343 if (DocumentType* doctype = document()->doctype())
349 return createMarkup(doctype); 344 return createMarkup(doctype);
350 345
351 return String(); 346 return String();
352 } 347 }
353 348
354 String LocalFrame::selectedText() const 349 String LocalFrame::selectedText() const
355 { 350 {
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
572 for (RefPtrWillBeRawPtr<Frame> child = tree().firstChild(); child; child = c hild->tree().nextSibling()) { 567 for (RefPtrWillBeRawPtr<Frame> child = tree().firstChild(); child; child = c hild->tree().nextSibling()) {
573 if (child->isLocalFrame()) 568 if (child->isLocalFrame())
574 toLocalFrame(child.get())->deviceOrPageScaleFactorChanged(); 569 toLocalFrame(child.get())->deviceOrPageScaleFactorChanged();
575 } 570 }
576 } 571 }
577 572
578 bool LocalFrame::isURLAllowed(const KURL& url) const 573 bool LocalFrame::isURLAllowed(const KURL& url) const
579 { 574 {
580 // We allow one level of self-reference because some sites depend on that, 575 // We allow one level of self-reference because some sites depend on that,
581 // but we don't allow more than one. 576 // but we don't allow more than one.
582 if (page()->subframeCount() >= Page::maxNumberOfFrames) 577 if (host()->frameCount() >= FrameHost::maxNumberOfFrames)
583 return false; 578 return false;
584 bool foundSelfReference = false; 579 bool foundSelfReference = false;
585 for (const Frame* frame = this; frame; frame = frame->tree().parent()) { 580 for (const Frame* frame = this; frame; frame = frame->tree().parent()) {
586 if (!frame->isLocalFrame()) 581 if (!frame->isLocalFrame())
587 continue; 582 continue;
588 if (equalIgnoringFragmentIdentifier(toLocalFrame(frame)->document()->url (), url)) { 583 if (equalIgnoringFragmentIdentifier(toLocalFrame(frame)->document()->url (), url)) {
589 if (foundSelfReference) 584 if (foundSelfReference)
590 return false; 585 return false;
591 foundSelfReference = true; 586 foundSelfReference = true;
592 } 587 }
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 725
731 return curFrame; 726 return curFrame;
732 } 727 }
733 728
734 void LocalFrame::setPagePopupOwner(Element& owner) 729 void LocalFrame::setPagePopupOwner(Element& owner)
735 { 730 {
736 m_pagePopupOwner = &owner; 731 m_pagePopupOwner = &owner;
737 } 732 }
738 733
739 } // namespace blink 734 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698