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

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

Issue 2269653002: PlzNavigate: Prevent tests to end too early. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 FrameLoader::FrameLoader(LocalFrame* frame) 177 FrameLoader::FrameLoader(LocalFrame* frame)
178 : m_frame(frame) 178 : m_frame(frame)
179 , m_progressTracker(ProgressTracker::create(frame)) 179 , m_progressTracker(ProgressTracker::create(frame))
180 , m_loadType(FrameLoadTypeStandard) 180 , m_loadType(FrameLoadTypeStandard)
181 , m_inStopAllLoaders(false) 181 , m_inStopAllLoaders(false)
182 , m_checkTimer(TaskRunnerHelper::get(TaskType::Networking, frame), this, &Fr ameLoader::checkTimerFired) 182 , m_checkTimer(TaskRunnerHelper::get(TaskType::Networking, frame), this, &Fr ameLoader::checkTimerFired)
183 , m_didAccessInitialDocument(false) 183 , m_didAccessInitialDocument(false)
184 , m_forcedSandboxFlags(SandboxNone) 184 , m_forcedSandboxFlags(SandboxNone)
185 , m_dispatchingDidClearWindowObjectInMainWorld(false) 185 , m_dispatchingDidClearWindowObjectInMainWorld(false)
186 , m_protectProvisionalLoader(false) 186 , m_protectProvisionalLoader(false)
187 , m_isNavigationHandledByClient(false)
187 { 188 {
188 TRACE_EVENT_OBJECT_CREATED_WITH_ID("loading", "FrameLoader", this); 189 TRACE_EVENT_OBJECT_CREATED_WITH_ID("loading", "FrameLoader", this);
189 takeObjectSnapshot(); 190 takeObjectSnapshot();
190 } 191 }
191 192
192 FrameLoader::~FrameLoader() 193 FrameLoader::~FrameLoader()
193 { 194 {
194 // Verify that this FrameLoader has been detached. 195 // Verify that this FrameLoader has been detached.
195 ASSERT(!m_progressTracker); 196 ASSERT(!m_progressTracker);
196 } 197 }
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 // We might have declined to run the load event due to an imminent content-i nitiated navigation. 613 // We might have declined to run the load event due to an imminent content-i nitiated navigation.
613 if (!frame->document()->loadEventFinished()) 614 if (!frame->document()->loadEventFinished())
614 return false; 615 return false;
615 616
616 // An event might have restarted a child frame. 617 // An event might have restarted a child frame.
617 if (!allDescendantsAreComplete(frame)) 618 if (!allDescendantsAreComplete(frame))
618 return false; 619 return false;
619 return true; 620 return true;
620 } 621 }
621 622
622 static bool shouldSendCompleteNotification(LocalFrame* frame) 623 static bool shouldSendCompleteNotification(LocalFrame* frame, bool isNavigationH andledByClient)
623 { 624 {
624 // FIXME: We might have already sent stop notifications and be re-completing . 625 // FIXME: We might have already sent stop notifications and be re-completing .
625 if (!frame->isLoading()) 626 if (!frame->isLoading())
626 return false; 627 return false;
627 // Only send didStopLoading() if there are no navigations in progress at all , 628 // Only send didStopLoading() if there are no navigations in progress at all ,
628 // whether committed, provisional, or pending. 629 // whether committed, provisional, or pending.
629 return frame->loader().documentLoader()->sentDidFinishLoad() && !frame->load er().provisionalDocumentLoader(); 630 return frame->loader().documentLoader()->sentDidFinishLoad() && !frame->load er().provisionalDocumentLoader() && !isNavigationHandledByClient;
630 } 631 }
631 632
632 void FrameLoader::checkCompleted() 633 void FrameLoader::checkCompleted()
633 { 634 {
634 if (!shouldComplete(m_frame->document())) 635 if (!shouldComplete(m_frame->document()))
635 return; 636 return;
636 637
637 // OK, completed. 638 // OK, completed.
638 m_frame->document()->setReadyState(Document::Complete); 639 m_frame->document()->setReadyState(Document::Complete);
639 if (m_frame->document()->loadEventStillNeeded()) 640 if (m_frame->document()->loadEventStillNeeded())
(...skipping 12 matching lines...) Expand all
652 // Report mobile vs. desktop page statistics. This will only report on A ndroid. 653 // Report mobile vs. desktop page statistics. This will only report on A ndroid.
653 if (m_frame->isMainFrame()) 654 if (m_frame->isMainFrame())
654 m_frame->document()->viewportDescription().reportMobilePageStats(m_f rame); 655 m_frame->document()->viewportDescription().reportMobilePageStats(m_f rame);
655 m_documentLoader->setSentDidFinishLoad(); 656 m_documentLoader->setSentDidFinishLoad();
656 client()->dispatchDidFinishLoad(); 657 client()->dispatchDidFinishLoad();
657 // Finishing the load can detach the frame when running layout tests. 658 // Finishing the load can detach the frame when running layout tests.
658 if (!m_frame->client()) 659 if (!m_frame->client())
659 return; 660 return;
660 } 661 }
661 662
662 if (shouldSendCompleteNotification(m_frame)) { 663 if (shouldSendCompleteNotification(m_frame, m_isNavigationHandledByClient)) {
663 m_progressTracker->progressCompleted(); 664 m_progressTracker->progressCompleted();
664 // Retry restoring scroll offset since finishing loading disables conten t 665 // Retry restoring scroll offset since finishing loading disables conten t
665 // size clamping. 666 // size clamping.
666 restoreScrollPositionAndViewState(); 667 restoreScrollPositionAndViewState();
667 668
668 m_loadType = FrameLoadTypeStandard; 669 m_loadType = FrameLoadTypeStandard;
669 m_frame->localDOMWindow()->finishedLoading(); 670 m_frame->localDOMWindow()->finishedLoading();
670 } 671 }
671 672
672 Frame* parent = m_frame->tree().parent(); 673 Frame* parent = m_frame->tree().parent();
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 { 1043 {
1043 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal) 1044 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal)
1044 return; 1045 return;
1045 1046
1046 // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. 1047 // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this.
1047 if (m_inStopAllLoaders) 1048 if (m_inStopAllLoaders)
1048 return; 1049 return;
1049 1050
1050 m_inStopAllLoaders = true; 1051 m_inStopAllLoaders = true;
1051 1052
1053 m_isNavigationHandledByClient = false;
1054
1052 for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree ().nextSibling()) { 1055 for (Frame* child = m_frame->tree().firstChild(); child; child = child->tree ().nextSibling()) {
1053 if (child->isLocalFrame()) 1056 if (child->isLocalFrame())
1054 toLocalFrame(child)->loader().stopAllLoaders(); 1057 toLocalFrame(child)->loader().stopAllLoaders();
1055 } 1058 }
1056 1059
1057 m_frame->document()->suppressLoadEvent(); 1060 m_frame->document()->suppressLoadEvent();
1058 if (m_documentLoader) 1061 if (m_documentLoader)
1059 m_documentLoader->fetcher()->stopFetching(); 1062 m_documentLoader->fetcher()->stopFetching();
1060 m_frame->document()->cancelParsing(); 1063 m_frame->document()->cancelParsing();
1061 if (!m_protectProvisionalLoader) 1064 if (!m_protectProvisionalLoader)
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1369 shouldClose = true; 1372 shouldClose = true;
1370 } 1373 }
1371 1374
1372 return shouldClose; 1375 return shouldClose;
1373 } 1376 }
1374 1377
1375 bool FrameLoader::shouldContinueForNavigationPolicy(const ResourceRequest& reque st, const SubstituteData& substituteData, 1378 bool FrameLoader::shouldContinueForNavigationPolicy(const ResourceRequest& reque st, const SubstituteData& substituteData,
1376 DocumentLoader* loader, ContentSecurityPolicyDisposition shouldCheckMainWorl dContentSecurityPolicy, 1379 DocumentLoader* loader, ContentSecurityPolicyDisposition shouldCheckMainWorl dContentSecurityPolicy,
1377 NavigationType type, NavigationPolicy policy, bool replacesCurrentHistoryIte m, bool isClientRedirect) 1380 NavigationType type, NavigationPolicy policy, bool replacesCurrentHistoryIte m, bool isClientRedirect)
1378 { 1381 {
1382 m_isNavigationHandledByClient = false;
1383
1379 // Don't ask if we are loading an empty URL. 1384 // Don't ask if we are loading an empty URL.
1380 if (request.url().isEmpty() || substituteData.isValid()) 1385 if (request.url().isEmpty() || substituteData.isValid())
1381 return true; 1386 return true;
1382 1387
1383 // If we're loading content into a subframe, check against the parent's Cont ent Security Policy 1388 // If we're loading content into a subframe, check against the parent's Cont ent Security Policy
1384 // and kill the load if that check fails, unless we should bypass the main w orld's CSP. 1389 // and kill the load if that check fails, unless we should bypass the main w orld's CSP.
1385 if (shouldCheckMainWorldContentSecurityPolicy == CheckContentSecurityPolicy) { 1390 if (shouldCheckMainWorldContentSecurityPolicy == CheckContentSecurityPolicy) {
1386 Frame* parentFrame = m_frame->tree().parent(); 1391 Frame* parentFrame = m_frame->tree().parent();
1387 if (parentFrame) { 1392 if (parentFrame) {
1388 ContentSecurityPolicy* parentPolicy = parentFrame->securityContext() ->contentSecurityPolicy(); 1393 ContentSecurityPolicy* parentPolicy = parentFrame->securityContext() ->contentSecurityPolicy();
(...skipping 11 matching lines...) Expand all
1400 bool isFormSubmission = type == NavigationTypeFormSubmitted || type == Navig ationTypeFormResubmitted; 1405 bool isFormSubmission = type == NavigationTypeFormSubmitted || type == Navig ationTypeFormResubmitted;
1401 if (isFormSubmission && !m_frame->document()->contentSecurityPolicy()->allow FormAction(request.url())) 1406 if (isFormSubmission && !m_frame->document()->contentSecurityPolicy()->allow FormAction(request.url()))
1402 return false; 1407 return false;
1403 1408
1404 policy = client()->decidePolicyForNavigation(request, loader, type, policy, replacesCurrentHistoryItem, isClientRedirect); 1409 policy = client()->decidePolicyForNavigation(request, loader, type, policy, replacesCurrentHistoryItem, isClientRedirect);
1405 if (policy == NavigationPolicyCurrentTab) 1410 if (policy == NavigationPolicyCurrentTab)
1406 return true; 1411 return true;
1407 if (policy == NavigationPolicyIgnore) 1412 if (policy == NavigationPolicyIgnore)
1408 return false; 1413 return false;
1409 if (policy == NavigationPolicyHandledByClient) { 1414 if (policy == NavigationPolicyHandledByClient) {
1415 m_isNavigationHandledByClient = true;
1410 // Mark the frame as loading since the embedder is handling the navigati on. 1416 // Mark the frame as loading since the embedder is handling the navigati on.
1411 m_progressTracker->progressStarted(); 1417 m_progressTracker->progressStarted();
1412 return false; 1418 return false;
1413 } 1419 }
1414 if (!LocalDOMWindow::allowPopUp(*m_frame) && !UserGestureIndicator::utilizeU serGesture()) 1420 if (!LocalDOMWindow::allowPopUp(*m_frame) && !UserGestureIndicator::utilizeU serGesture())
1415 return false; 1421 return false;
1416 client()->loadURLExternally(request, policy, String(), replacesCurrentHistor yItem); 1422 client()->loadURLExternally(request, policy, String(), replacesCurrentHistor yItem);
1417 return false; 1423 return false;
1418 } 1424 }
1419 1425
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
1622 tracedValue->setString("documentLoaderURL", m_documentLoader ? m_documentLoa der->url() : String()); 1628 tracedValue->setString("documentLoaderURL", m_documentLoader ? m_documentLoa der->url() : String());
1623 return tracedValue; 1629 return tracedValue;
1624 } 1630 }
1625 1631
1626 inline void FrameLoader::takeObjectSnapshot() const 1632 inline void FrameLoader::takeObjectSnapshot() const
1627 { 1633 {
1628 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID("loading", "FrameLoader", this, toTraced Value()); 1634 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID("loading", "FrameLoader", this, toTraced Value());
1629 } 1635 }
1630 1636
1631 } // namespace blink 1637 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698