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

Side by Side Diff: Source/core/loader/FrameLoader.cpp

Issue 517043003: Move Frame to the Oilpan heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase past r181245 conflict 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed.
3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 4 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
5 * Copyright (C) 2008 Alp Toker <alp@atoker.com> 5 * Copyright (C) 2008 Alp Toker <alp@atoker.com>
6 * Copyright (C) Research In Motion Limited 2009. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2009. All rights reserved.
7 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> 7 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com>
8 * Copyright (C) 2011 Google Inc. All rights reserved. 8 * Copyright (C) 2011 Google Inc. All rights reserved.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 #include "core/dom/Element.h" 43 #include "core/dom/Element.h"
44 #include "core/dom/ViewportDescription.h" 44 #include "core/dom/ViewportDescription.h"
45 #include "core/editing/Editor.h" 45 #include "core/editing/Editor.h"
46 #include "core/editing/UndoStack.h" 46 #include "core/editing/UndoStack.h"
47 #include "core/events/PageTransitionEvent.h" 47 #include "core/events/PageTransitionEvent.h"
48 #include "core/fetch/FetchContext.h" 48 #include "core/fetch/FetchContext.h"
49 #include "core/fetch/ResourceFetcher.h" 49 #include "core/fetch/ResourceFetcher.h"
50 #include "core/fetch/ResourceLoader.h" 50 #include "core/fetch/ResourceLoader.h"
51 #include "core/frame/LocalDOMWindow.h" 51 #include "core/frame/LocalDOMWindow.h"
52 #include "core/frame/FrameHost.h" 52 #include "core/frame/FrameHost.h"
53 #include "core/frame/FrameProtector.h"
53 #include "core/frame/FrameView.h" 54 #include "core/frame/FrameView.h"
54 #include "core/frame/LocalFrame.h" 55 #include "core/frame/LocalFrame.h"
55 #include "core/frame/PinchViewport.h" 56 #include "core/frame/PinchViewport.h"
56 #include "core/frame/csp/ContentSecurityPolicy.h" 57 #include "core/frame/csp/ContentSecurityPolicy.h"
57 #include "core/html/HTMLFormElement.h" 58 #include "core/html/HTMLFormElement.h"
58 #include "core/html/HTMLFrameOwnerElement.h" 59 #include "core/html/HTMLFrameOwnerElement.h"
59 #include "core/html/parser/HTMLParserIdioms.h" 60 #include "core/html/parser/HTMLParserIdioms.h"
60 #include "core/inspector/ConsoleMessage.h" 61 #include "core/inspector/ConsoleMessage.h"
61 #include "core/inspector/InspectorController.h" 62 #include "core/inspector/InspectorController.h"
62 #include "core/inspector/InspectorInstrumentation.h" 63 #include "core/inspector/InspectorInstrumentation.h"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 , m_didAccessInitialDocument(false) 124 , m_didAccessInitialDocument(false)
124 , m_didAccessInitialDocumentTimer(this, &FrameLoader::didAccessInitialDocume ntTimerFired) 125 , m_didAccessInitialDocumentTimer(this, &FrameLoader::didAccessInitialDocume ntTimerFired)
125 , m_forcedSandboxFlags(SandboxNone) 126 , m_forcedSandboxFlags(SandboxNone)
126 { 127 {
127 } 128 }
128 129
129 FrameLoader::~FrameLoader() 130 FrameLoader::~FrameLoader()
130 { 131 {
131 } 132 }
132 133
134 void FrameLoader::trace(Visitor* visitor)
135 {
136 visitor->trace(m_frame);
137 visitor->trace(m_fetchContext);
138 }
139
133 void FrameLoader::init() 140 void FrameLoader::init()
134 { 141 {
135 ResourceRequest initialRequest(KURL(ParsedURLString, emptyString())); 142 ResourceRequest initialRequest(KURL(ParsedURLString, emptyString()));
136 initialRequest.setRequestContext(WebURLRequest::RequestContextInternal); 143 initialRequest.setRequestContext(WebURLRequest::RequestContextInternal);
137 initialRequest.setFrameType(m_frame->isMainFrame() ? WebURLRequest::FrameTyp eTopLevel : WebURLRequest::FrameTypeNested); 144 initialRequest.setFrameType(m_frame->isMainFrame() ? WebURLRequest::FrameTyp eTopLevel : WebURLRequest::FrameTypeNested);
138 m_provisionalDocumentLoader = client()->createDocumentLoader(m_frame, initia lRequest, SubstituteData()); 145 m_provisionalDocumentLoader = client()->createDocumentLoader(m_frame, initia lRequest, SubstituteData());
139 m_provisionalDocumentLoader->startLoadingMainResource(); 146 m_provisionalDocumentLoader->startLoadingMainResource();
140 m_frame->document()->cancelParsing(); 147 m_frame->document()->cancelParsing();
141 m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocu ment); 148 m_stateMachine.advanceTo(FrameLoaderStateMachine::DisplayingInitialEmptyDocu ment);
142 } 149 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 242
236 // Prevent window.open(url) -- eg window.open("about:blank") -- from blowing away results 243 // Prevent window.open(url) -- eg window.open("about:blank") -- from blowing away results
237 // from a subsequent window.document.open / window.document.write call. 244 // from a subsequent window.document.open / window.document.write call.
238 // Canceling redirection here works for all cases because document.open 245 // Canceling redirection here works for all cases because document.open
239 // implicitly precedes document.write. 246 // implicitly precedes document.write.
240 m_frame->navigationScheduler().cancel(); 247 m_frame->navigationScheduler().cancel();
241 } 248 }
242 249
243 void FrameLoader::clear() 250 void FrameLoader::clear()
244 { 251 {
252 // clear() is called during (Local)Frame finalization and when creating
253 // a new Document within it (DocumentLoader::createWriterFor().)
254
245 if (m_stateMachine.creatingInitialEmptyDocument()) 255 if (m_stateMachine.creatingInitialEmptyDocument())
246 return; 256 return;
247 257
248 m_frame->editor().clear(); 258 m_frame->editor().clear();
249 m_frame->document()->cancelParsing(); 259 m_frame->document()->cancelParsing();
250 m_frame->document()->prepareForDestruction(); 260 m_frame->document()->prepareForDestruction();
251 m_frame->document()->removeFocusedElementOfSubtree(m_frame->document()); 261 m_frame->document()->removeFocusedElementOfSubtree(m_frame->document());
252 262
253 m_frame->selection().prepareForDestruction(); 263 m_frame->selection().prepareForDestruction();
254 m_frame->eventHandler().clear(); 264 m_frame->eventHandler().clear();
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 client()->dispatchDidCommitLoad(m_frame, m_currentItem.get(), historyCommitT ype); 360 client()->dispatchDidCommitLoad(m_frame, m_currentItem.get(), historyCommitT ype);
351 361
352 InspectorInstrumentation::didCommitLoad(m_frame, m_documentLoader.get()); 362 InspectorInstrumentation::didCommitLoad(m_frame, m_documentLoader.get());
353 m_frame->page()->didCommitLoad(m_frame); 363 m_frame->page()->didCommitLoad(m_frame);
354 dispatchDidClearDocumentOfWindowObject(); 364 dispatchDidClearDocumentOfWindowObject();
355 } 365 }
356 366
357 static void didFailContentSecurityPolicyCheck(FrameLoader* loader) 367 static void didFailContentSecurityPolicyCheck(FrameLoader* loader)
358 { 368 {
359 // load event and stopAllLoaders can detach the LocalFrame, so protect it. 369 // load event and stopAllLoaders can detach the LocalFrame, so protect it.
360 RefPtr<LocalFrame> frame(loader->frame()); 370 LocalFrame* frame = loader->frame();
371 FrameProtector protect(frame);
361 372
362 // Move the page to a unique origin, and cancel the load. 373 // Move the page to a unique origin, and cancel the load.
363 frame->document()->enforceSandboxFlags(SandboxOrigin); 374 frame->document()->enforceSandboxFlags(SandboxOrigin);
364 loader->stopAllLoaders(); 375 loader->stopAllLoaders();
365 376
366 // Fire a load event, as timing attacks would otherwise reveal that the 377 // Fire a load event, as timing attacks would otherwise reveal that the
367 // frame was blocked. This way, it looks like every other cross-origin 378 // frame was blocked. This way, it looks like every other cross-origin
368 // page. 379 // page.
369 if (FrameOwner* frameOwner = frame->owner()) 380 if (FrameOwner* frameOwner = frame->owner())
370 frameOwner->dispatchLoad(); 381 frameOwner->dispatchLoad();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 } 424 }
414 425
415 void FrameLoader::finishedParsing() 426 void FrameLoader::finishedParsing()
416 { 427 {
417 if (m_stateMachine.creatingInitialEmptyDocument()) 428 if (m_stateMachine.creatingInitialEmptyDocument())
418 return; 429 return;
419 430
420 // This can be called from the LocalFrame's destructor, in which case we sho uldn't protect ourselves 431 // This can be called from the LocalFrame's destructor, in which case we sho uldn't protect ourselves
421 // because doing so will cause us to re-enter the destructor when protector goes out of scope. 432 // because doing so will cause us to re-enter the destructor when protector goes out of scope.
422 // Null-checking the FrameView indicates whether or not we're in the destruc tor. 433 // Null-checking the FrameView indicates whether or not we're in the destruc tor.
423 RefPtr<LocalFrame> protector = m_frame->view() ? m_frame : 0; 434 FrameProtector protect(m_frame->view() ? m_frame : nullptr);
424 435
425 if (client()) 436 if (client())
426 client()->dispatchDidFinishDocumentLoad(); 437 client()->dispatchDidFinishDocumentLoad();
427 438
428 checkCompleted(); 439 checkCompleted();
429 440
430 if (!m_frame->view()) 441 if (!m_frame->view())
431 return; // We are being destroyed by something checkCompleted called. 442 return; // We are being destroyed by something checkCompleted called.
432 443
433 // Check if the scrollbars are really needed for the content. 444 // Check if the scrollbars are really needed for the content.
(...skipping 23 matching lines...) Expand all
457 { 468 {
458 for (Frame* ancestor = m_frame; ancestor; ancestor = ancestor->tree().parent ()) { 469 for (Frame* ancestor = m_frame; ancestor; ancestor = ancestor->tree().parent ()) {
459 if (ancestor->isLocalFrame() && !toLocalFrame(ancestor)->document()->loa dEventFinished()) 470 if (ancestor->isLocalFrame() && !toLocalFrame(ancestor)->document()->loa dEventFinished())
460 return false; 471 return false;
461 } 472 }
462 return true; 473 return true;
463 } 474 }
464 475
465 void FrameLoader::checkCompleted() 476 void FrameLoader::checkCompleted()
466 { 477 {
467 RefPtr<LocalFrame> protect(m_frame); 478 FrameProtector protect(m_frame);
468 479
469 if (m_frame->view()) 480 if (m_frame->view())
470 m_frame->view()->handleLoadCompleted(); 481 m_frame->view()->handleLoadCompleted();
471 482
472 if (m_frame->document()->isLoadCompleted() && m_stateMachine.committedFirstR ealDocumentLoad()) 483 if (m_frame->document()->isLoadCompleted() && m_stateMachine.committedFirstR ealDocumentLoad())
473 return; 484 return;
474 485
475 // Are we still parsing? 486 // Are we still parsing?
476 if (m_frame->document()->parsing()) 487 if (m_frame->document()->parsing())
477 return; 488 return;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 // We need to scroll to the fragment whether or not a hash change occurred, since 610 // We need to scroll to the fragment whether or not a hash change occurred, since
600 // the user might have scrolled since the previous navigation. 611 // the user might have scrolled since the previous navigation.
601 scrollToFragmentWithParentBoundary(url); 612 scrollToFragmentWithParentBoundary(url);
602 checkCompleted(); 613 checkCompleted();
603 614
604 m_frame->domWindow()->statePopped(stateObject ? stateObject : SerializedScri ptValue::nullValue()); 615 m_frame->domWindow()->statePopped(stateObject ? stateObject : SerializedScri ptValue::nullValue());
605 } 616 }
606 617
607 void FrameLoader::completed() 618 void FrameLoader::completed()
608 { 619 {
609 RefPtr<LocalFrame> protect(m_frame); 620 FrameProtector protect(m_frame);
610 621
611 for (Frame* descendant = m_frame->tree().traverseNext(m_frame); descendant; descendant = descendant->tree().traverseNext(m_frame)) { 622 for (Frame* descendant = m_frame->tree().traverseNext(m_frame); descendant; descendant = descendant->tree().traverseNext(m_frame)) {
612 if (descendant->isLocalFrame()) 623 if (descendant->isLocalFrame())
613 toLocalFrame(descendant)->navigationScheduler().startTimer(); 624 toLocalFrame(descendant)->navigationScheduler().startTimer();
614 } 625 }
615 626
616 Frame* parent = m_frame->tree().parent(); 627 Frame* parent = m_frame->tree().parent();
617 if (parent && parent->isLocalFrame()) 628 if (parent && parent->isLocalFrame())
618 toLocalFrame(parent)->loader().checkCompleted(); 629 toLocalFrame(parent)->loader().checkCompleted();
619 630
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 return WebURLRequest::RequestContextInternal; 734 return WebURLRequest::RequestContextInternal;
724 } 735 }
725 ASSERT_NOT_REACHED(); 736 ASSERT_NOT_REACHED();
726 return WebURLRequest::RequestContextHyperlink; 737 return WebURLRequest::RequestContextHyperlink;
727 } 738 }
728 739
729 void FrameLoader::load(const FrameLoadRequest& passedRequest) 740 void FrameLoader::load(const FrameLoadRequest& passedRequest)
730 { 741 {
731 ASSERT(m_frame->document()); 742 ASSERT(m_frame->document());
732 743
733 RefPtr<LocalFrame> protect(m_frame); 744 FrameProtector protect(m_frame);
734 745
735 if (m_inStopAllLoaders) 746 if (m_inStopAllLoaders)
736 return; 747 return;
737 748
738 FrameLoadRequest request(passedRequest); 749 FrameLoadRequest request(passedRequest);
739 if (!prepareRequestForThisFrame(request)) 750 if (!prepareRequestForThisFrame(request))
740 return; 751 return;
741 752
742 RefPtr<LocalFrame> targetFrame = request.formState() ? 0 : findFrameForNavig ation(AtomicString(request.frameName()), request.formState() ? request.formState ()->sourceDocument() : m_frame->document()); 753 LocalFrame* targetFrame = request.formState() ? 0 : findFrameForNavigation(A tomicString(request.frameName()), request.formState() ? request.formState()->sou rceDocument() : m_frame->document());
754 FrameProtector protectTarget(targetFrame);
743 if (targetFrame && targetFrame != m_frame) { 755 if (targetFrame && targetFrame != m_frame) {
744 request.setFrameName("_self"); 756 request.setFrameName("_self");
745 targetFrame->loader().load(request); 757 targetFrame->loader().load(request);
746 if (Page* page = targetFrame->page()) 758 if (Page* page = targetFrame->page())
747 page->chrome().focus(); 759 page->chrome().focus();
748 return; 760 return;
749 } 761 }
750 762
751 FrameLoadType newLoadType = determineFrameLoadType(request); 763 FrameLoadType newLoadType = determineFrameLoadType(request);
752 NavigationAction action(request.resourceRequest(), newLoadType, request.form State(), request.triggeringEvent()); 764 NavigationAction action(request.resourceRequest(), newLoadType, request.form State(), request.triggeringEvent());
753 if (action.resourceRequest().requestContext() == WebURLRequest::RequestConte xtUnspecified) 765 if (action.resourceRequest().requestContext() == WebURLRequest::RequestConte xtUnspecified)
754 action.mutableResourceRequest().setRequestContext(determineRequestContex tFromNavigationType(action.type())); 766 action.mutableResourceRequest().setRequestContext(determineRequestContex tFromNavigationType(action.type()));
755 if (shouldOpenInNewWindow(targetFrame.get(), request, action)) { 767 if (shouldOpenInNewWindow(targetFrame, request, action)) {
756 if (action.policy() == NavigationPolicyDownload) 768 if (action.policy() == NavigationPolicyDownload)
757 client()->loadURLExternally(action.resourceRequest(), NavigationPoli cyDownload); 769 client()->loadURLExternally(action.resourceRequest(), NavigationPoli cyDownload);
758 else 770 else
759 createWindowForRequest(request, *m_frame, action.policy(), request.s houldSendReferrer()); 771 createWindowForRequest(request, *m_frame, action.policy(), request.s houldSendReferrer());
760 return; 772 return;
761 } 773 }
762 774
763 const KURL& url = request.resourceRequest().url(); 775 const KURL& url = request.resourceRequest().url();
764 if (!action.shouldOpenInNewWindow() && shouldPerformFragmentNavigation(reque st.formState(), request.resourceRequest().httpMethod(), newLoadType, url)) { 776 if (!action.shouldOpenInNewWindow() && shouldPerformFragmentNavigation(reque st.formState(), request.resourceRequest().httpMethod(), newLoadType, url)) {
765 m_documentLoader->setTriggeringAction(action); 777 m_documentLoader->setTriggeringAction(action);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 { 857 {
846 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal) 858 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal)
847 return; 859 return;
848 860
849 // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. 861 // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this.
850 if (m_inStopAllLoaders) 862 if (m_inStopAllLoaders)
851 return; 863 return;
852 864
853 // Calling stopLoading() on the provisional document loader can blow away 865 // Calling stopLoading() on the provisional document loader can blow away
854 // the frame from underneath. 866 // the frame from underneath.
855 RefPtr<LocalFrame> protect(m_frame); 867 FrameProtector protect(m_frame);
856 868
857 m_inStopAllLoaders = true; 869 m_inStopAllLoaders = true;
858 870
859 for (RefPtr<Frame> child = m_frame->tree().firstChild(); child; child = chil d->tree().nextSibling()) { 871 for (RefPtrWillBeRawPtr<Frame> child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling()) {
860 if (child->isLocalFrame()) 872 if (child->isLocalFrame())
861 toLocalFrame(child.get())->loader().stopAllLoaders(); 873 toLocalFrame(child.get())->loader().stopAllLoaders();
862 } 874 }
863 if (m_provisionalDocumentLoader) 875 if (m_provisionalDocumentLoader)
864 m_provisionalDocumentLoader->stopLoading(); 876 m_provisionalDocumentLoader->stopLoading();
865 if (m_documentLoader) 877 if (m_documentLoader)
866 m_documentLoader->stopLoading(); 878 m_documentLoader->stopLoading();
867 879
868 if (m_provisionalDocumentLoader) 880 if (m_provisionalDocumentLoader)
869 m_provisionalDocumentLoader->detachFromFrame(); 881 m_provisionalDocumentLoader->detachFromFrame();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 if (m_provisionalDocumentLoader) 919 if (m_provisionalDocumentLoader)
908 return true; 920 return true;
909 return m_documentLoader && m_documentLoader->isLoading(); 921 return m_documentLoader && m_documentLoader->isLoading();
910 } 922 }
911 923
912 void FrameLoader::commitProvisionalLoad() 924 void FrameLoader::commitProvisionalLoad()
913 { 925 {
914 ASSERT(client()->hasWebView()); 926 ASSERT(client()->hasWebView());
915 ASSERT(m_state == FrameStateProvisional); 927 ASSERT(m_state == FrameStateProvisional);
916 RefPtr<DocumentLoader> pdl = m_provisionalDocumentLoader; 928 RefPtr<DocumentLoader> pdl = m_provisionalDocumentLoader;
917 RefPtr<LocalFrame> protect(m_frame); 929 FrameProtector protect(m_frame);
918 930
919 // Check if the destination page is allowed to access the previous page's ti ming information. 931 // Check if the destination page is allowed to access the previous page's ti ming information.
920 if (m_frame->document()) { 932 if (m_frame->document()) {
921 RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::create(pdl->requ est().url()); 933 RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::create(pdl->requ est().url());
922 pdl->timing()->setHasSameOriginAsPreviousDocument(securityOrigin->canReq uest(m_frame->document()->url())); 934 pdl->timing()->setHasSameOriginAsPreviousDocument(securityOrigin->canReq uest(m_frame->document()->url()));
923 } 935 }
924 936
925 // The call to closeURL() invokes the unload event handler, which can execut e arbitrary 937 // The call to closeURL() invokes the unload event handler, which can execut e arbitrary
926 // JavaScript. If the script initiates a new load, we need to abandon the cu rrent load, 938 // JavaScript. If the script initiates a new load, we need to abandon the cu rrent load,
927 // or the two will stomp each other. 939 // or the two will stomp each other.
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
982 if (document->processingLoadEvent()) 994 if (document->processingLoadEvent())
983 return false; 995 return false;
984 if (document->hasActiveParser()) 996 if (document->hasActiveParser())
985 return false; 997 return false;
986 return true; 998 return true;
987 } 999 }
988 1000
989 bool FrameLoader::checkLoadCompleteForThisFrame() 1001 bool FrameLoader::checkLoadCompleteForThisFrame()
990 { 1002 {
991 ASSERT(client()->hasWebView()); 1003 ASSERT(client()->hasWebView());
992 RefPtr<LocalFrame> protect(m_frame); 1004 FrameProtector protect(m_frame);
993 1005
994 bool allChildrenAreDoneLoading = true; 1006 bool allChildrenAreDoneLoading = true;
995 for (RefPtr<Frame> child = m_frame->tree().firstChild(); child; child = chil d->tree().nextSibling()) { 1007 for (RefPtrWillBeRawPtr<Frame> child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling()) {
996 if (child->isLocalFrame()) 1008 if (child->isLocalFrame())
997 allChildrenAreDoneLoading &= toLocalFrame(child.get())->loader().che ckLoadCompleteForThisFrame(); 1009 allChildrenAreDoneLoading &= toLocalFrame(child.get())->loader().che ckLoadCompleteForThisFrame();
998 } 1010 }
999 1011
1000 if (m_state == FrameStateProvisional && m_provisionalDocumentLoader) { 1012 if (m_state == FrameStateProvisional && m_provisionalDocumentLoader) {
1001 const ResourceError& error = m_provisionalDocumentLoader->mainDocumentEr ror(); 1013 const ResourceError& error = m_provisionalDocumentLoader->mainDocumentEr ror();
1002 if (error.isNull()) 1014 if (error.isNull())
1003 return false; 1015 return false;
1004 RefPtr<DocumentLoader> loader = m_provisionalDocumentLoader; 1016 RefPtr<DocumentLoader> loader = m_provisionalDocumentLoader;
1005 client()->dispatchDidFailProvisionalLoad(error); 1017 client()->dispatchDidFailProvisionalLoad(error);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1113 String FrameLoader::userAgent(const KURL& url) const 1125 String FrameLoader::userAgent(const KURL& url) const
1114 { 1126 {
1115 String userAgent = client()->userAgent(url); 1127 String userAgent = client()->userAgent(url);
1116 InspectorInstrumentation::applyUserAgentOverride(m_frame, &userAgent); 1128 InspectorInstrumentation::applyUserAgentOverride(m_frame, &userAgent);
1117 return userAgent; 1129 return userAgent;
1118 } 1130 }
1119 1131
1120 void FrameLoader::detachFromParent() 1132 void FrameLoader::detachFromParent()
1121 { 1133 {
1122 // The caller must protect a reference to m_frame. 1134 // The caller must protect a reference to m_frame.
1135 #if !ENABLE(OILPAN)
1123 ASSERT(m_frame->refCount() > 1); 1136 ASSERT(m_frame->refCount() > 1);
1137 #endif
1124 1138
1125 InspectorInstrumentation::frameDetachedFromParent(m_frame); 1139 InspectorInstrumentation::frameDetachedFromParent(m_frame);
1126 1140
1127 if (m_documentLoader) 1141 if (m_documentLoader)
1128 m_documentLoader->detachFromFrame(); 1142 m_documentLoader->detachFromFrame();
1129 m_documentLoader = nullptr; 1143 m_documentLoader = nullptr;
1130 1144
1131 if (!client()) 1145 if (!client())
1132 return; 1146 return;
1133 1147
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 // After this, we must no longer talk to the client since this clears 1181 // After this, we must no longer talk to the client since this clears
1168 // its owning reference back to our owning LocalFrame. 1182 // its owning reference back to our owning LocalFrame.
1169 client()->detachedFromParent(); 1183 client()->detachedFromParent();
1170 m_frame->clearClient(); 1184 m_frame->clearClient();
1171 } 1185 }
1172 } 1186 }
1173 1187
1174 void FrameLoader::receivedMainResourceError(const ResourceError& error) 1188 void FrameLoader::receivedMainResourceError(const ResourceError& error)
1175 { 1189 {
1176 // Retain because the stop may release the last reference to it. 1190 // Retain because the stop may release the last reference to it.
1177 RefPtr<LocalFrame> protect(m_frame); 1191 FrameProtector protect(m_frame);
1178 1192
1179 if (m_frame->document()->parser()) 1193 if (m_frame->document()->parser())
1180 m_frame->document()->parser()->stopParsing(); 1194 m_frame->document()->parser()->stopParsing();
1181 1195
1182 // FIXME: We really ought to be able to just check for isCancellation() here , but there are some 1196 // FIXME: We really ought to be able to just check for isCancellation() here , but there are some
1183 // ResourceErrors that setIsCancellation() but aren't created by ResourceErr or::cancelledError(). 1197 // ResourceErrors that setIsCancellation() but aren't created by ResourceErr or::cancelledError().
1184 ResourceError c(ResourceError::cancelledError(KURL())); 1198 ResourceError c(ResourceError::cancelledError(KURL()));
1185 if ((error.errorCode() != c.errorCode() || error.domain() != c.domain()) && m_frame->owner()) { 1199 if ((error.errorCode() != c.errorCode() || error.domain() != c.domain()) && m_frame->owner()) {
1186 // FIXME: For now, fallback content doesn't work cross process. 1200 // FIXME: For now, fallback content doesn't work cross process.
1187 ASSERT(m_frame->owner()->isLocal()); 1201 ASSERT(m_frame->owner()->isLocal());
(...skipping 21 matching lines...) Expand all
1209 && !m_frame->document()->isFrameSet(); 1223 && !m_frame->document()->isFrameSet();
1210 } 1224 }
1211 1225
1212 void FrameLoader::scrollToFragmentWithParentBoundary(const KURL& url) 1226 void FrameLoader::scrollToFragmentWithParentBoundary(const KURL& url)
1213 { 1227 {
1214 FrameView* view = m_frame->view(); 1228 FrameView* view = m_frame->view();
1215 if (!view) 1229 if (!view)
1216 return; 1230 return;
1217 1231
1218 // Leaking scroll position to a cross-origin ancestor would permit the so-ca lled "framesniffing" attack. 1232 // Leaking scroll position to a cross-origin ancestor would permit the so-ca lled "framesniffing" attack.
1219 RefPtr<LocalFrame> boundaryFrame(url.hasFragmentIdentifier() ? m_frame->docu ment()->findUnsafeParentScrollPropagationBoundary() : 0); 1233 LocalFrame* boundaryFrame = url.hasFragmentIdentifier() ? m_frame->document( )->findUnsafeParentScrollPropagationBoundary() : 0;
1234 FrameProtector protect(boundaryFrame);
1220 1235
1221 if (boundaryFrame) 1236 if (boundaryFrame)
1222 boundaryFrame->view()->setSafeToPropagateScrollToParent(false); 1237 boundaryFrame->view()->setSafeToPropagateScrollToParent(false);
1223 1238
1224 view->scrollToFragment(url); 1239 view->scrollToFragment(url);
1225 1240
1226 if (boundaryFrame) 1241 if (boundaryFrame)
1227 boundaryFrame->view()->setSafeToPropagateScrollToParent(true); 1242 boundaryFrame->view()->setSafeToPropagateScrollToParent(true);
1228 } 1243 }
1229 1244
1230 bool FrameLoader::shouldClose() 1245 bool FrameLoader::shouldClose()
1231 { 1246 {
1232 Page* page = m_frame->page(); 1247 Page* page = m_frame->page();
1233 if (!page || !page->chrome().canRunBeforeUnloadConfirmPanel()) 1248 if (!page || !page->chrome().canRunBeforeUnloadConfirmPanel())
1234 return true; 1249 return true;
1235 1250
1236 // Store all references to each subframe in advance since beforeunload's eve nt handler may modify frame 1251 // Store all references to each subframe in advance since beforeunload's eve nt handler may modify frame
1237 Vector<RefPtr<LocalFrame> > targetFrames; 1252 WillBeHeapVector<RefPtrWillBeMember<LocalFrame> > targetFrames;
1238 targetFrames.append(m_frame); 1253 targetFrames.append(m_frame);
1239 for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree ().traverseNext(m_frame)) { 1254 for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree ().traverseNext(m_frame)) {
1240 // FIXME: There is not yet any way to dispatch events to out-of-process frames. 1255 // FIXME: There is not yet any way to dispatch events to out-of-process frames.
1241 if (child->isLocalFrame()) 1256 if (child->isLocalFrame())
1242 targetFrames.append(toLocalFrame(child)); 1257 targetFrames.append(toLocalFrame(child));
1243 } 1258 }
1244 1259
1245 bool shouldClose = false; 1260 bool shouldClose = false;
1246 { 1261 {
1247 NavigationDisablerForBeforeUnload navigationDisabler; 1262 NavigationDisablerForBeforeUnload navigationDisabler;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1314 m_policyDocumentLoader->setOverrideEncoding(overrideEncoding); 1329 m_policyDocumentLoader->setOverrideEncoding(overrideEncoding);
1315 else if (m_documentLoader) 1330 else if (m_documentLoader)
1316 m_policyDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEn coding()); 1331 m_policyDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEn coding());
1317 1332
1318 1333
1319 bool isTransitionNavigation = false; 1334 bool isTransitionNavigation = false;
1320 if (RuntimeEnabledFeatures::navigationTransitionsEnabled() && type != FrameL oadTypeReload && type != FrameLoadTypeReloadFromOrigin && type != FrameLoadTypeS ame) 1335 if (RuntimeEnabledFeatures::navigationTransitionsEnabled() && type != FrameL oadTypeReload && type != FrameLoadTypeReloadFromOrigin && type != FrameLoadTypeS ame)
1321 isTransitionNavigation = dispatchNavigationTransitionData(); 1336 isTransitionNavigation = dispatchNavigationTransitionData();
1322 1337
1323 // stopAllLoaders can detach the LocalFrame, so protect it. 1338 // stopAllLoaders can detach the LocalFrame, so protect it.
1324 RefPtr<LocalFrame> protect(m_frame); 1339 FrameProtector protect(m_frame);
1325 if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request, sho uldCheckMainWorldContentSecurityPolicy, isTransitionNavigation) || !shouldClose( )) && m_policyDocumentLoader) { 1340 if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request, sho uldCheckMainWorldContentSecurityPolicy, isTransitionNavigation) || !shouldClose( )) && m_policyDocumentLoader) {
1326 m_policyDocumentLoader->detachFromFrame(); 1341 m_policyDocumentLoader->detachFromFrame();
1327 m_policyDocumentLoader = nullptr; 1342 m_policyDocumentLoader = nullptr;
1328 checkCompleted(); 1343 checkCompleted();
1329 return; 1344 return;
1330 } 1345 }
1331 1346
1332 if (m_provisionalDocumentLoader) { 1347 if (m_provisionalDocumentLoader) {
1333 m_provisionalDocumentLoader->stopLoading(); 1348 m_provisionalDocumentLoader->stopLoading();
1334 if (m_provisionalDocumentLoader) 1349 if (m_provisionalDocumentLoader)
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1435 { 1450 {
1436 ASSERT(activeDocument); 1451 ASSERT(activeDocument);
1437 Frame* frame = m_frame->tree().find(name); 1452 Frame* frame = m_frame->tree().find(name);
1438 if (!frame || !frame->isLocalFrame() || !activeDocument->canNavigate(toLocal Frame(*frame))) 1453 if (!frame || !frame->isLocalFrame() || !activeDocument->canNavigate(toLocal Frame(*frame)))
1439 return 0; 1454 return 0;
1440 return toLocalFrame(frame); 1455 return toLocalFrame(frame);
1441 } 1456 }
1442 1457
1443 void FrameLoader::loadHistoryItem(HistoryItem* item, HistoryLoadType historyLoad Type, ResourceRequestCachePolicy cachePolicy) 1458 void FrameLoader::loadHistoryItem(HistoryItem* item, HistoryLoadType historyLoad Type, ResourceRequestCachePolicy cachePolicy)
1444 { 1459 {
1445 RefPtr<LocalFrame> protect(m_frame); 1460 FrameProtector protect(m_frame);
1446 if (m_frame->page()->defersLoading()) { 1461 if (m_frame->page()->defersLoading()) {
1447 m_deferredHistoryLoad = DeferredHistoryLoad(item, historyLoadType, cache Policy); 1462 m_deferredHistoryLoad = DeferredHistoryLoad(item, historyLoadType, cache Policy);
1448 return; 1463 return;
1449 } 1464 }
1450 1465
1451 m_provisionalItem = item; 1466 m_provisionalItem = item;
1452 if (historyLoadType == HistorySameDocumentLoad) { 1467 if (historyLoadType == HistorySameDocumentLoad) {
1453 loadInSameDocument(item->url(), item->stateObject(), FrameLoadTypeBackFo rward, NotClientRedirect); 1468 loadInSameDocument(item->url(), item->stateObject(), FrameLoadTypeBackFo rward, NotClientRedirect);
1454 restoreScrollPositionAndViewState(); 1469 restoreScrollPositionAndViewState();
1455 return; 1470 return;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1494 // FIXME: We need a way to propagate sandbox flags to out-of-process frames. 1509 // FIXME: We need a way to propagate sandbox flags to out-of-process frames.
1495 Frame* parentFrame = m_frame->tree().parent(); 1510 Frame* parentFrame = m_frame->tree().parent();
1496 if (parentFrame && parentFrame->isLocalFrame()) 1511 if (parentFrame && parentFrame->isLocalFrame())
1497 flags |= toLocalFrame(parentFrame)->document()->sandboxFlags(); 1512 flags |= toLocalFrame(parentFrame)->document()->sandboxFlags();
1498 if (FrameOwner* frameOwner = m_frame->owner()) 1513 if (FrameOwner* frameOwner = m_frame->owner())
1499 flags |= frameOwner->sandboxFlags(); 1514 flags |= frameOwner->sandboxFlags();
1500 return flags; 1515 return flags;
1501 } 1516 }
1502 1517
1503 } // namespace blink 1518 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698