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

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

Issue 126453005: Simplify starting a same-document navigation (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 11 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
« no previous file with comments | « Source/core/loader/FrameLoader.h ('k') | Source/core/loader/NavigationScheduler.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 542 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 historyCommitType = StandardCommit; 553 historyCommitType = StandardCommit;
554 historyItemPolicy = CreateNewHistoryItem; 554 historyItemPolicy = CreateNewHistoryItem;
555 } 555 }
556 setHistoryItemStateForCommit(historyItemPolicy, sameDocumentNavigationSource != SameDocumentNavigationDefault, data); 556 setHistoryItemStateForCommit(historyItemPolicy, sameDocumentNavigationSource != SameDocumentNavigationDefault, data);
557 m_client->dispatchDidNavigateWithinPage(m_currentItem.get(), historyCommitTy pe); 557 m_client->dispatchDidNavigateWithinPage(m_currentItem.get(), historyCommitTy pe);
558 m_client->dispatchDidReceiveTitle(m_frame->document()->title()); 558 m_client->dispatchDidReceiveTitle(m_frame->document()->title());
559 if (m_frame->document()->loadEventFinished()) 559 if (m_frame->document()->loadEventFinished())
560 m_client->postProgressFinishedNotification(); 560 m_client->postProgressFinishedNotification();
561 } 561 }
562 562
563 void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScrip tValue> stateObject, bool isNewNavigation, ClientRedirectPolicy clientRedirect) 563 void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScrip tValue> stateObject, UpdateBackForwardListPolicy updateBackForwardList, ClientRe directPolicy clientRedirect)
564 { 564 {
565 // If we have a state object, we cannot also be a new navigation. 565 // If we have a state object, we cannot also be a new navigation.
566 ASSERT(!stateObject || (stateObject && !isNewNavigation)); 566 ASSERT(!stateObject || updateBackForwardList == DoNotUpdateBackForwardList);
567
568 // If we have a provisional request for a different document, a fragment scr oll should cancel it.
569 if (m_provisionalDocumentLoader) {
570 m_provisionalDocumentLoader->stopLoading();
571 if (m_provisionalDocumentLoader)
572 m_provisionalDocumentLoader->detachFromFrame();
573 m_provisionalDocumentLoader = 0;
574 }
575 saveDocumentAndScrollState();
567 576
568 KURL oldURL = m_frame->document()->url(); 577 KURL oldURL = m_frame->document()->url();
569 // If we were in the autoscroll/panScroll mode we want to stop it before fol lowing the link to the anchor 578 // If we were in the autoscroll/panScroll mode we want to stop it before fol lowing the link to the anchor
570 bool hashChange = equalIgnoringFragmentIdentifier(url, oldURL) && url.fragme ntIdentifier() != oldURL.fragmentIdentifier(); 579 bool hashChange = equalIgnoringFragmentIdentifier(url, oldURL) && url.fragme ntIdentifier() != oldURL.fragmentIdentifier();
571 if (hashChange) { 580 if (hashChange) {
572 m_frame->eventHandler().stopAutoscroll(); 581 m_frame->eventHandler().stopAutoscroll();
573 m_frame->domWindow()->enqueueHashchangeEvent(oldURL, url); 582 m_frame->domWindow()->enqueueHashchangeEvent(oldURL, url);
574 } 583 }
575 m_documentLoader->setIsClientRedirect((clientRedirect == ClientRedirect && ! isNewNavigation) || !UserGestureIndicator::processingUserGesture()); 584 m_documentLoader->setIsClientRedirect(clientRedirect == ClientRedirect);
576 m_documentLoader->setReplacesCurrentHistoryItem(!isNewNavigation); 585 m_documentLoader->setReplacesCurrentHistoryItem(updateBackForwardList == DoN otUpdateBackForwardList);
577 UpdateBackForwardListPolicy updateBackForwardList = isNewNavigation && !shou ldTreatURLAsSameAsCurrent(url) && !stateObject ? UpdateBackForwardList : DoNotUp dateBackForwardList;
578 updateForSameDocumentNavigation(url, SameDocumentNavigationDefault, 0, updat eBackForwardList); 586 updateForSameDocumentNavigation(url, SameDocumentNavigationDefault, 0, updat eBackForwardList);
579 587
580 // It's important to model this as a load that starts and immediately finish es. 588 // It's important to model this as a load that starts and immediately finish es.
581 // Otherwise, the parent frame may think we never finished loading. 589 // Otherwise, the parent frame may think we never finished loading.
582 started(); 590 started();
583 591
584 // We need to scroll to the fragment whether or not a hash change occurred, since 592 // We need to scroll to the fragment whether or not a hash change occurred, since
585 // the user might have scrolled since the previous navigation. 593 // the user might have scrolled since the previous navigation.
586 scrollToFragmentWithParentBoundary(url); 594 scrollToFragmentWithParentBoundary(url);
587 595
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 FrameLoadType newLoadType = determineFrameLoadType(request); 716 FrameLoadType newLoadType = determineFrameLoadType(request);
709 NavigationAction action(request.resourceRequest(), newLoadType, request.form State(), request.triggeringEvent()); 717 NavigationAction action(request.resourceRequest(), newLoadType, request.form State(), request.triggeringEvent());
710 if ((!targetFrame && !request.frameName().isEmpty()) || action.shouldOpenInN ewWindow()) { 718 if ((!targetFrame && !request.frameName().isEmpty()) || action.shouldOpenInN ewWindow()) {
711 if (action.policy() == NavigationPolicyDownload) 719 if (action.policy() == NavigationPolicyDownload)
712 m_client->loadURLExternally(action.resourceRequest(), NavigationPoli cyDownload); 720 m_client->loadURLExternally(action.resourceRequest(), NavigationPoli cyDownload);
713 else 721 else
714 createWindowForRequest(request, m_frame, action.policy(), request.sh ouldSendReferrer()); 722 createWindowForRequest(request, m_frame, action.policy(), request.sh ouldSendReferrer());
715 return; 723 return;
716 } 724 }
717 725
718 if (shouldPerformFragmentNavigation(request.formState(), request.resourceReq uest().httpMethod(), newLoadType, request.resourceRequest().url())) { 726 const KURL& url = request.resourceRequest().url();
719 checkNavigationPolicyAndContinueFragmentScroll(action, newLoadType != Fr ameLoadTypeRedirectWithLockedBackForwardList, request.clientRedirect()); 727 if (shouldPerformFragmentNavigation(request.formState(), request.resourceReq uest().httpMethod(), newLoadType, url)) {
728 m_documentLoader->setTriggeringAction(action);
729 loadInSameDocument(url, 0, newLoadType == FrameLoadTypeStandard ? Update BackForwardList : DoNotUpdateBackForwardList, request.clientRedirect());
720 return; 730 return;
721 } 731 }
722 bool sameURL = shouldTreatURLAsSameAsCurrent(request.resourceRequest().url() ); 732 bool sameURL = shouldTreatURLAsSameAsCurrent(url);
723 loadWithNavigationAction(action, newLoadType, request.formState(), request.s ubstituteData(), request.clientRedirect()); 733 loadWithNavigationAction(action, newLoadType, request.formState(), request.s ubstituteData(), request.clientRedirect());
724 // Example of this case are sites that reload the same URL with a different cookie 734 // Example of this case are sites that reload the same URL with a different cookie
725 // driving the generated content, or a master frame with links that drive a target 735 // driving the generated content, or a master frame with links that drive a target
726 // frame, where the user has clicked on the same link repeatedly. 736 // frame, where the user has clicked on the same link repeatedly.
727 if (sameURL && newLoadType != FrameLoadTypeReload && newLoadType != FrameLoa dTypeReloadFromOrigin && request.resourceRequest().httpMethod() != "POST") 737 if (sameURL && newLoadType != FrameLoadTypeReload && newLoadType != FrameLoa dTypeReloadFromOrigin && request.resourceRequest().httpMethod() != "POST")
728 m_loadType = FrameLoadTypeSame; 738 m_loadType = FrameLoadTypeSame;
729 } 739 }
730 740
731 SubstituteData FrameLoader::defaultSubstituteDataForURL(const KURL& url) 741 SubstituteData FrameLoader::defaultSubstituteDataForURL(const KURL& url)
732 { 742 {
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
1151 // ResourceErrors that setIsCancellation() but aren't created by ResourceErr or::cancelledError(). 1161 // ResourceErrors that setIsCancellation() but aren't created by ResourceErr or::cancelledError().
1152 ResourceError c(ResourceError::cancelledError(KURL())); 1162 ResourceError c(ResourceError::cancelledError(KURL()));
1153 if ((error.errorCode() != c.errorCode() || error.domain() != c.domain()) && m_frame->ownerElement()) 1163 if ((error.errorCode() != c.errorCode() || error.domain() != c.domain()) && m_frame->ownerElement())
1154 m_frame->ownerElement()->renderFallbackContent(); 1164 m_frame->ownerElement()->renderFallbackContent();
1155 1165
1156 checkCompleted(); 1166 checkCompleted();
1157 if (m_frame->page()) 1167 if (m_frame->page())
1158 checkLoadComplete(); 1168 checkLoadComplete();
1159 } 1169 }
1160 1170
1161 void FrameLoader::checkNavigationPolicyAndContinueFragmentScroll(const Navigatio nAction& action, bool isNewNavigation, ClientRedirectPolicy clientRedirect)
1162 {
1163 m_documentLoader->setTriggeringAction(action);
1164
1165 const ResourceRequest& request = action.resourceRequest();
1166 if (!m_documentLoader->shouldContinueForNavigationPolicy(request, DocumentLo ader::PolicyCheckFragment))
1167 return;
1168
1169 // If we have a provisional request for a different document, a fragment scr oll should cancel it.
1170 if (m_provisionalDocumentLoader && !equalIgnoringFragmentIdentifier(m_provis ionalDocumentLoader->request().url(), request.url())) {
1171 m_provisionalDocumentLoader->stopLoading();
1172 if (m_provisionalDocumentLoader)
1173 m_provisionalDocumentLoader->detachFromFrame();
1174 m_provisionalDocumentLoader = 0;
1175 }
1176 saveDocumentAndScrollState();
1177 loadInSameDocument(request.url(), 0, isNewNavigation, clientRedirect);
1178 }
1179
1180 bool FrameLoader::shouldPerformFragmentNavigation(bool isFormSubmission, const S tring& httpMethod, FrameLoadType loadType, const KURL& url) 1171 bool FrameLoader::shouldPerformFragmentNavigation(bool isFormSubmission, const S tring& httpMethod, FrameLoadType loadType, const KURL& url)
1181 { 1172 {
1182 ASSERT(loadType != FrameLoadTypeReloadFromOrigin); 1173 ASSERT(loadType != FrameLoadTypeReloadFromOrigin);
1183 // We don't do this if we are submitting a form with method other than "GET" , explicitly reloading, 1174 // We don't do this if we are submitting a form with method other than "GET" , explicitly reloading,
1184 // currently displaying a frameset, or if the URL does not have a fragment. 1175 // currently displaying a frameset, or if the URL does not have a fragment.
1185 return (!isFormSubmission || equalIgnoringCase(httpMethod, "GET")) 1176 return (!isFormSubmission || equalIgnoringCase(httpMethod, "GET"))
1186 && loadType != FrameLoadTypeReload 1177 && loadType != FrameLoadTypeReload
1187 && loadType != FrameLoadTypeSame 1178 && loadType != FrameLoadTypeSame
1188 && loadType != FrameLoadTypeBackForward 1179 && loadType != FrameLoadTypeBackForward
1189 && url.hasFragmentIdentifier() 1180 && url.hasFragmentIdentifier()
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1279 1270
1280 if (Frame* parent = m_frame->tree().parent()) 1271 if (Frame* parent = m_frame->tree().parent())
1281 m_policyDocumentLoader->setOverrideEncoding(parent->loader().documentLoa der()->overrideEncoding()); 1272 m_policyDocumentLoader->setOverrideEncoding(parent->loader().documentLoa der()->overrideEncoding());
1282 else if (!overrideEncoding.isEmpty()) 1273 else if (!overrideEncoding.isEmpty())
1283 m_policyDocumentLoader->setOverrideEncoding(overrideEncoding); 1274 m_policyDocumentLoader->setOverrideEncoding(overrideEncoding);
1284 else if (m_documentLoader) 1275 else if (m_documentLoader)
1285 m_policyDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEn coding()); 1276 m_policyDocumentLoader->setOverrideEncoding(m_documentLoader->overrideEn coding());
1286 1277
1287 // stopAllLoaders can detach the Frame, so protect it. 1278 // stopAllLoaders can detach the Frame, so protect it.
1288 RefPtr<Frame> protect(m_frame); 1279 RefPtr<Frame> protect(m_frame);
1289 if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request, Doc umentLoader::PolicyCheckStandard) || !shouldClose()) && m_policyDocumentLoader) { 1280 if ((!m_policyDocumentLoader->shouldContinueForNavigationPolicy(request) || !shouldClose()) && m_policyDocumentLoader) {
1290 m_policyDocumentLoader->detachFromFrame(); 1281 m_policyDocumentLoader->detachFromFrame();
1291 m_policyDocumentLoader = 0; 1282 m_policyDocumentLoader = 0;
1292 return; 1283 return;
1293 } 1284 }
1294 1285
1295 // A new navigation is in progress, so don't clear the history's provisional item. 1286 // A new navigation is in progress, so don't clear the history's provisional item.
1296 stopAllLoaders(); 1287 stopAllLoaders();
1297 1288
1298 // <rdar://problem/6250856> - In certain circumstances on pages with multipl e frames, stopAllLoaders() 1289 // <rdar://problem/6250856> - In certain circumstances on pages with multipl e frames, stopAllLoaders()
1299 // might detach the current FrameLoader, in which case we should bail on thi s newly defunct load. 1290 // might detach the current FrameLoader, in which case we should bail on thi s newly defunct load.
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 1403
1413 if (!activeDocument->canNavigate(frame)) 1404 if (!activeDocument->canNavigate(frame))
1414 return 0; 1405 return 0;
1415 return frame; 1406 return frame;
1416 } 1407 }
1417 1408
1418 void FrameLoader::loadHistoryItem(HistoryItem* item, HistoryLoadType historyLoad Type, ResourceRequestCachePolicy cachePolicy) 1409 void FrameLoader::loadHistoryItem(HistoryItem* item, HistoryLoadType historyLoad Type, ResourceRequestCachePolicy cachePolicy)
1419 { 1410 {
1420 m_provisionalItem = item; 1411 m_provisionalItem = item;
1421 if (historyLoadType == HistorySameDocumentLoad) { 1412 if (historyLoadType == HistorySameDocumentLoad) {
1422 loadInSameDocument(item->url(), item->stateObject(), false, NotClientRed irect); 1413 loadInSameDocument(item->url(), item->stateObject(), DoNotUpdateBackForw ardList, NotClientRedirect);
1423 restoreScrollPositionAndViewState(ForcedRestoreForSameDocumentHistoryNav igation); 1414 restoreScrollPositionAndViewState(ForcedRestoreForSameDocumentHistoryNav igation);
1424 return; 1415 return;
1425 } 1416 }
1426 1417
1427 RefPtr<FormData> formData = item->formData(); 1418 RefPtr<FormData> formData = item->formData();
1428 ResourceRequest request(item->url()); 1419 ResourceRequest request(item->url());
1429 request.setHTTPReferrer(item->referrer()); 1420 request.setHTTPReferrer(item->referrer());
1430 request.setCachePolicy(cachePolicy); 1421 request.setCachePolicy(cachePolicy);
1431 if (formData) { 1422 if (formData) {
1432 request.setHTTPMethod("POST"); 1423 request.setHTTPMethod("POST");
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1472 { 1463 {
1473 SandboxFlags flags = m_forcedSandboxFlags; 1464 SandboxFlags flags = m_forcedSandboxFlags;
1474 if (Frame* parentFrame = m_frame->tree().parent()) 1465 if (Frame* parentFrame = m_frame->tree().parent())
1475 flags |= parentFrame->document()->sandboxFlags(); 1466 flags |= parentFrame->document()->sandboxFlags();
1476 if (HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement()) 1467 if (HTMLFrameOwnerElement* ownerElement = m_frame->ownerElement())
1477 flags |= ownerElement->sandboxFlags(); 1468 flags |= ownerElement->sandboxFlags();
1478 return flags; 1469 return flags;
1479 } 1470 }
1480 1471
1481 } // namespace WebCore 1472 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/loader/FrameLoader.h ('k') | Source/core/loader/NavigationScheduler.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698