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

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

Issue 181493007: Don't stop the documentLoader on navigations. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: use onReceivedResponse Created 6 years, 9 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 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 FrameLoader::FrameLoader(LocalFrame* frame, FrameLoaderClient* client) 142 FrameLoader::FrameLoader(LocalFrame* frame, FrameLoaderClient* client)
143 : m_frame(frame) 143 : m_frame(frame)
144 , m_client(client) 144 , m_client(client)
145 , m_mixedContentChecker(frame) 145 , m_mixedContentChecker(frame)
146 , m_progressTracker(FrameProgressTracker::create(m_frame)) 146 , m_progressTracker(FrameProgressTracker::create(m_frame))
147 , m_state(FrameStateProvisional) 147 , m_state(FrameStateProvisional)
148 , m_loadType(FrameLoadTypeStandard) 148 , m_loadType(FrameLoadTypeStandard)
149 , m_fetchContext(FrameFetchContext::create(frame)) 149 , m_fetchContext(FrameFetchContext::create(frame))
150 , m_inStopAllLoaders(false) 150 , m_inStopAllLoaders(false)
151 , m_isComplete(false) 151 , m_isComplete(false)
152 , m_currentLoaderNeedsStop(false)
152 , m_checkTimer(this, &FrameLoader::checkTimerFired) 153 , m_checkTimer(this, &FrameLoader::checkTimerFired)
153 , m_shouldCallCheckCompleted(false) 154 , m_shouldCallCheckCompleted(false)
154 , m_didAccessInitialDocument(false) 155 , m_didAccessInitialDocument(false)
155 , m_didAccessInitialDocumentTimer(this, &FrameLoader::didAccessInitialDocume ntTimerFired) 156 , m_didAccessInitialDocumentTimer(this, &FrameLoader::didAccessInitialDocume ntTimerFired)
156 , m_forcedSandboxFlags(SandboxNone) 157 , m_forcedSandboxFlags(SandboxNone)
157 { 158 {
158 } 159 }
159 160
160 FrameLoader::~FrameLoader() 161 FrameLoader::~FrameLoader()
161 { 162 {
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 if (m_frame->view()) 609 if (m_frame->view())
609 m_frame->view()->maintainScrollPositionAtAnchor(0); 610 m_frame->view()->maintainScrollPositionAtAnchor(0);
610 } 611 }
611 612
612 void FrameLoader::started() 613 void FrameLoader::started()
613 { 614 {
614 for (LocalFrame* frame = m_frame; frame; frame = frame->tree().parent()) 615 for (LocalFrame* frame = m_frame; frame; frame = frame->tree().parent())
615 frame->loader().m_isComplete = false; 616 frame->loader().m_isComplete = false;
616 } 617 }
617 618
619 void FrameLoader::onResponseReceived()
620 {
621 checkCurrentDocumentLoaderNeedsStop();
622 }
623
624 void FrameLoader::checkCurrentDocumentLoaderNeedsStop()
Nate Chapin 2014/03/10 16:12:44 If this function is only called once, let's merge
mkosiba (inactive) 2014/03/11 23:24:08 sure, I was keeping it separate because I was expe
625 {
626 if (!m_currentLoaderNeedsStop)
627 return;
628
629 for (RefPtr<LocalFrame> child = m_frame->tree().firstChild(); child; child = child->tree().nextSibling())
630 child->loader().stopAllLoaders();
631 if (m_documentLoader)
632 m_documentLoader->stopLoading();
633
634 m_currentLoaderNeedsStop = false;
635
636 if (m_state == FrameStateProvisional)
637 m_progressTracker->progressStarted();
Nate Chapin 2014/03/10 16:12:44 It doesn't seem right to wait to send a progress t
mkosiba (inactive) 2014/03/11 23:24:08 this is the meat of the change. The problem is tha
Nate Chapin 2014/03/12 19:55:45 I talked with darin, and our thoughts were: 1. Le
638 }
639
618 void FrameLoader::setReferrerForFrameRequest(ResourceRequest& request, ShouldSen dReferrer shouldSendReferrer, Document* originDocument) 640 void FrameLoader::setReferrerForFrameRequest(ResourceRequest& request, ShouldSen dReferrer shouldSendReferrer, Document* originDocument)
619 { 641 {
620 if (shouldSendReferrer == NeverSendReferrer) { 642 if (shouldSendReferrer == NeverSendReferrer) {
621 request.clearHTTPReferrer(); 643 request.clearHTTPReferrer();
622 return; 644 return;
623 } 645 }
624 646
625 // Always use the initiating document to generate the referrer. 647 // Always use the initiating document to generate the referrer.
626 // We need to generateReferrerHeader(), because we might not have enforced R eferrerPolicy or https->http 648 // We need to generateReferrerHeader(), because we might not have enforced R eferrerPolicy or https->http
627 // referrer suppression yet. 649 // referrer suppression yet.
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 952
931 FrameLoadType FrameLoader::loadType() const 953 FrameLoadType FrameLoader::loadType() const
932 { 954 {
933 return m_loadType; 955 return m_loadType;
934 } 956 }
935 957
936 void FrameLoader::checkLoadCompleteForThisFrame() 958 void FrameLoader::checkLoadCompleteForThisFrame()
937 { 959 {
938 ASSERT(m_client->hasWebView()); 960 ASSERT(m_client->hasWebView());
939 961
962 if (m_currentLoaderNeedsStop)
Nate Chapin 2014/03/10 16:12:44 Why is this needed?
mkosiba (inactive) 2014/03/11 23:24:08 because otherwise we'll call m_progressTracker
963 return;
964
940 if (m_state == FrameStateProvisional && m_provisionalDocumentLoader) { 965 if (m_state == FrameStateProvisional && m_provisionalDocumentLoader) {
941 const ResourceError& error = m_provisionalDocumentLoader->mainDocumentEr ror(); 966 const ResourceError& error = m_provisionalDocumentLoader->mainDocumentEr ror();
942 if (error.isNull()) 967 if (error.isNull())
943 return; 968 return;
944 RefPtr<DocumentLoader> loader = m_provisionalDocumentLoader; 969 RefPtr<DocumentLoader> loader = m_provisionalDocumentLoader;
945 m_client->dispatchDidFailProvisionalLoad(error); 970 m_client->dispatchDidFailProvisionalLoad(error);
946 if (loader != m_provisionalDocumentLoader) 971 if (loader != m_provisionalDocumentLoader)
947 return; 972 return;
948 m_provisionalDocumentLoader->detachFromFrame(); 973 m_provisionalDocumentLoader->detachFromFrame();
949 m_provisionalDocumentLoader = nullptr; 974 m_provisionalDocumentLoader = nullptr;
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
1281 m_policyDocumentLoader->setReplacesCurrentHistoryItem(replacesCurrentHistory Item); 1306 m_policyDocumentLoader->setReplacesCurrentHistoryItem(replacesCurrentHistory Item);
1282 m_policyDocumentLoader->setIsClientRedirect(clientRedirect == ClientRedirect ); 1307 m_policyDocumentLoader->setIsClientRedirect(clientRedirect == ClientRedirect );
1283 1308
1284 if (LocalFrame* parent = m_frame->tree().parent()) 1309 if (LocalFrame* parent = m_frame->tree().parent())
1285 m_policyDocumentLoader->setOverrideEncoding(parent->loader().documentLoa der()->overrideEncoding()); 1310 m_policyDocumentLoader->setOverrideEncoding(parent->loader().documentLoa der()->overrideEncoding());
1286 else if (!overrideEncoding.isEmpty()) 1311 else if (!overrideEncoding.isEmpty())
1287 m_policyDocumentLoader->setOverrideEncoding(overrideEncoding); 1312 m_policyDocumentLoader->setOverrideEncoding(overrideEncoding);
1288 else if (m_documentLoader) 1313 else if (m_documentLoader)
1289 m_policyDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEn coding()); 1314 m_policyDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEn coding());
1290 1315
1291 // stopAllLoaders can detach the LocalFrame, so protect it. 1316 // Stopping the provisional loader can detach the Frame, so protect it.
1292 RefPtr<LocalFrame> protect(m_frame); 1317 RefPtr<LocalFrame> protect(m_frame);
1293 if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request) || !shouldClose()) && m_policyDocumentLoader) { 1318 if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request) || !shouldClose()) && m_policyDocumentLoader) {
1294 m_policyDocumentLoader->detachFromFrame(); 1319 m_policyDocumentLoader->detachFromFrame();
1295 m_policyDocumentLoader = nullptr; 1320 m_policyDocumentLoader = nullptr;
1296 return; 1321 return;
1297 } 1322 }
1298 1323
1299 // A new navigation is in progress, so don't clear the history's provisional item.
1300 stopAllLoaders();
1301
1302 // <rdar://problem/6250856> - In certain circumstances on pages with multipl e frames, stopAllLoaders()
1303 // might detach the current FrameLoader, in which case we should bail on thi s newly defunct load.
1304 if (!m_frame->page() || !m_policyDocumentLoader)
1305 return;
1306
1307 if (isLoadingMainFrame()) 1324 if (isLoadingMainFrame())
1308 m_frame->page()->inspectorController().resume(); 1325 m_frame->page()->inspectorController().resume();
1309 m_frame->navigationScheduler().cancel(); 1326 m_frame->navigationScheduler().cancel();
1310 1327
1328 if (m_provisionalDocumentLoader)
1329 m_provisionalDocumentLoader->stopLoading();
1330 if (m_provisionalDocumentLoader)
Nate Chapin 2014/03/10 16:12:44 Merge these 2 ifs? Or can stopLoading() null out t
mkosiba (inactive) 2014/03/11 23:24:08 merge - sure. call stopLoading() - no, since that
1331 m_provisionalDocumentLoader->detachFromFrame();
1332 m_checkTimer.stop();
1333
1311 m_provisionalDocumentLoader = m_policyDocumentLoader.release(); 1334 m_provisionalDocumentLoader = m_policyDocumentLoader.release();
1312 m_loadType = type; 1335 m_loadType = type;
1313 m_state = FrameStateProvisional; 1336 m_state = FrameStateProvisional;
1337 m_currentLoaderNeedsStop = true;
1314 1338
1315 if (formState) 1339 if (formState)
1316 m_client->dispatchWillSubmitForm(formState); 1340 m_client->dispatchWillSubmitForm(formState);
1317 1341
1318 m_progressTracker->progressStarted();
1319 if (m_provisionalDocumentLoader->isClientRedirect()) 1342 if (m_provisionalDocumentLoader->isClientRedirect())
1320 m_provisionalDocumentLoader->appendRedirect(m_frame->document()->url()); 1343 m_provisionalDocumentLoader->appendRedirect(m_frame->document()->url());
1321 m_provisionalDocumentLoader->appendRedirect(m_provisionalDocumentLoader->req uest().url()); 1344 m_provisionalDocumentLoader->appendRedirect(m_provisionalDocumentLoader->req uest().url());
1322 m_client->dispatchDidStartProvisionalLoad(); 1345 m_client->dispatchDidStartProvisionalLoad();
1323 ASSERT(m_provisionalDocumentLoader); 1346 ASSERT(m_provisionalDocumentLoader);
1324 m_provisionalDocumentLoader->startLoadingMainResource(); 1347 m_provisionalDocumentLoader->startLoadingMainResource();
1325 } 1348 }
1326 1349
1327 void FrameLoader::applyUserAgent(ResourceRequest& request) 1350 void FrameLoader::applyUserAgent(ResourceRequest& request)
1328 { 1351 {
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1435 { 1458 {
1436 SandboxFlags flags = m_forcedSandboxFlags; 1459 SandboxFlags flags = m_forcedSandboxFlags;
1437 if (LocalFrame* parentFrame = m_frame->tree().parent()) 1460 if (LocalFrame* parentFrame = m_frame->tree().parent())
1438 flags |= parentFrame->document()->sandboxFlags(); 1461 flags |= parentFrame->document()->sandboxFlags();
1439 if (HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement()) 1462 if (HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement())
1440 flags |= ownerElement->sandboxFlags(); 1463 flags |= ownerElement->sandboxFlags();
1441 return flags; 1464 return flags;
1442 } 1465 }
1443 1466
1444 } // namespace WebCore 1467 } // namespace WebCore
OLDNEW
« Source/core/loader/FrameLoader.h ('K') | « Source/core/loader/FrameLoader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698