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

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

Issue 2710983003: Move HistoryItem handling to DocumentLoader (Closed)
Patch Set: Experiment to fix DCHECKing tests Created 3 years, 8 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 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights
3 * reserved. 3 * reserved.
4 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 4 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
5 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. 5 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved.
6 * (http://www.torchmobile.com/) 6 * (http://www.torchmobile.com/)
7 * Copyright (C) 2008 Alp Toker <alp@atoker.com> 7 * Copyright (C) 2008 Alp Toker <alp@atoker.com>
8 * Copyright (C) Research In Motion Limited 2009. All rights reserved. 8 * Copyright (C) Research In Motion Limited 2009. All rights reserved.
9 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com> 9 * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com>
10 * Copyright (C) 2011 Google Inc. All rights reserved. 10 * Copyright (C) 2011 Google Inc. All rights reserved.
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 return; 133 return;
134 } 134 }
135 if (SchemeRegistry::shouldTreatURLSchemeAsLegacy( 135 if (SchemeRegistry::shouldTreatURLSchemeAsLegacy(
136 document->getSecurityOrigin()->protocol())) { 136 document->getSecurityOrigin()->protocol())) {
137 return; 137 return;
138 } 138 }
139 Deprecation::countDeprecation( 139 Deprecation::countDeprecation(
140 document, UseCounter::LegacyProtocolEmbeddedAsSubresource); 140 document, UseCounter::LegacyProtocolEmbeddedAsSubresource);
141 } 141 }
142 142
143 // static
144 ResourceRequest FrameLoader::resourceRequestFromHistoryItem(
Nate Chapin 2017/03/27 21:02:01 Moved to HistoryItem, since it actually depends on
145 HistoryItem* item,
146 WebCachePolicy cachePolicy) {
147 RefPtr<EncodedFormData> formData = item->formData();
148 ResourceRequest request(item->url());
149 request.setHTTPReferrer(item->referrer());
150 request.setCachePolicy(cachePolicy);
151 if (formData) {
152 request.setHTTPMethod(HTTPNames::POST);
153 request.setHTTPBody(formData);
154 request.setHTTPContentType(item->formContentType());
155 request.addHTTPOriginIfNeeded(item->referrer().referrer);
156 }
157 return request;
158 }
159
160 ResourceRequest FrameLoader::resourceRequestForReload( 143 ResourceRequest FrameLoader::resourceRequestForReload(
161 FrameLoadType frameLoadType, 144 FrameLoadType frameLoadType,
162 const KURL& overrideURL, 145 const KURL& overrideURL,
163 ClientRedirectPolicy clientRedirectPolicy) { 146 ClientRedirectPolicy clientRedirectPolicy) {
164 DCHECK(isReloadLoadType(frameLoadType)); 147 DCHECK(isReloadLoadType(frameLoadType));
165 WebCachePolicy cachePolicy = 148 WebCachePolicy cachePolicy =
166 frameLoadType == FrameLoadTypeReloadBypassingCache 149 frameLoadType == FrameLoadTypeReloadBypassingCache
167 ? WebCachePolicy::BypassingCache 150 ? WebCachePolicy::BypassingCache
168 : WebCachePolicy::ValidatingCacheData; 151 : WebCachePolicy::ValidatingCacheData;
169 if (!m_currentItem) 152 if (!m_documentLoader || !m_documentLoader->historyItem())
170 return ResourceRequest(); 153 return ResourceRequest();
171 ResourceRequest request = 154 ResourceRequest request =
172 resourceRequestFromHistoryItem(m_currentItem.get(), cachePolicy); 155 m_documentLoader->historyItem()->generateResourceRequest(cachePolicy);
173 156
174 // ClientRedirectPolicy is an indication that this load was triggered by some 157 // ClientRedirectPolicy is an indication that this load was triggered by some
175 // direct interaction with the page. If this reload is not a client redirect, 158 // direct interaction with the page. If this reload is not a client redirect,
176 // we should reuse the referrer from the original load of the current 159 // we should reuse the referrer from the original load of the current
177 // document. If this reload is a client redirect (e.g., location.reload()), it 160 // document. If this reload is a client redirect (e.g., location.reload()), it
178 // was initiated by something in the current document and should therefore 161 // was initiated by something in the current document and should therefore
179 // show the current document's url as the referrer. 162 // show the current document's url as the referrer.
180 if (clientRedirectPolicy == ClientRedirectPolicy::ClientRedirect) { 163 if (clientRedirectPolicy == ClientRedirectPolicy::ClientRedirect) {
181 request.setHTTPReferrer(SecurityPolicy::generateReferrer( 164 request.setHTTPReferrer(SecurityPolicy::generateReferrer(
182 m_frame->document()->getReferrerPolicy(), m_frame->document()->url(), 165 m_frame->document()->getReferrerPolicy(), m_frame->document()->url(),
(...skipping 29 matching lines...) Expand all
212 FrameLoader::~FrameLoader() { 195 FrameLoader::~FrameLoader() {
213 // Verify that this FrameLoader has been detached. 196 // Verify that this FrameLoader has been detached.
214 DCHECK(!m_progressTracker); 197 DCHECK(!m_progressTracker);
215 } 198 }
216 199
217 DEFINE_TRACE(FrameLoader) { 200 DEFINE_TRACE(FrameLoader) {
218 visitor->trace(m_frame); 201 visitor->trace(m_frame);
219 visitor->trace(m_progressTracker); 202 visitor->trace(m_progressTracker);
220 visitor->trace(m_documentLoader); 203 visitor->trace(m_documentLoader);
221 visitor->trace(m_provisionalDocumentLoader); 204 visitor->trace(m_provisionalDocumentLoader);
222 visitor->trace(m_currentItem);
223 visitor->trace(m_provisionalItem);
224 visitor->trace(m_deferredHistoryLoad); 205 visitor->trace(m_deferredHistoryLoad);
225 } 206 }
226 207
227 void FrameLoader::init() { 208 void FrameLoader::init() {
228 ResourceRequest initialRequest(KURL(ParsedURLString, emptyString)); 209 ResourceRequest initialRequest(KURL(ParsedURLString, emptyString));
229 initialRequest.setRequestContext(WebURLRequest::RequestContextInternal); 210 initialRequest.setRequestContext(WebURLRequest::RequestContextInternal);
230 initialRequest.setFrameType(m_frame->isMainFrame() 211 initialRequest.setFrameType(m_frame->isMainFrame()
231 ? WebURLRequest::FrameTypeTopLevel 212 ? WebURLRequest::FrameTypeTopLevel
232 : WebURLRequest::FrameTypeNested); 213 : WebURLRequest::FrameTypeNested);
233 m_provisionalDocumentLoader = 214 m_provisionalDocumentLoader =
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 m_deferredHistoryLoad->m_item.get(), 253 m_deferredHistoryLoad->m_item.get(),
273 m_deferredHistoryLoad->m_historyLoadType); 254 m_deferredHistoryLoad->m_historyLoadType);
274 m_deferredHistoryLoad.clear(); 255 m_deferredHistoryLoad.clear();
275 } 256 }
276 m_frame->navigationScheduler().startTimer(); 257 m_frame->navigationScheduler().startTimer();
277 scheduleCheckCompleted(); 258 scheduleCheckCompleted();
278 } 259 }
279 } 260 }
280 261
281 void FrameLoader::saveScrollState() { 262 void FrameLoader::saveScrollState() {
282 if (!m_currentItem || !m_frame->view()) 263 if (!m_documentLoader || !m_documentLoader->historyItem() || !m_frame->view())
283 return; 264 return;
284 265
285 // Shouldn't clobber anything if we might still restore later. 266 // Shouldn't clobber anything if we might still restore later.
286 if (m_documentLoader && 267 if (needsHistoryItemRestore(m_documentLoader->loadType()) &&
287 needsHistoryItemRestore(m_documentLoader->loadType()) &&
288 !m_documentLoader->initialScrollState().wasScrolledByUser) 268 !m_documentLoader->initialScrollState().wasScrolledByUser)
289 return; 269 return;
290 270
271 HistoryItem* historyItem = m_documentLoader->historyItem();
291 if (ScrollableArea* layoutScrollableArea = 272 if (ScrollableArea* layoutScrollableArea =
292 m_frame->view()->layoutViewportScrollableArea()) 273 m_frame->view()->layoutViewportScrollableArea())
293 m_currentItem->setScrollOffset(layoutScrollableArea->getScrollOffset()); 274 historyItem->setScrollOffset(layoutScrollableArea->getScrollOffset());
294 m_currentItem->setVisualViewportScrollOffset(toScrollOffset( 275 historyItem->setVisualViewportScrollOffset(toScrollOffset(
295 m_frame->page()->visualViewport().visibleRect().location())); 276 m_frame->page()->visualViewport().visibleRect().location()));
296 277
297 if (m_frame->isMainFrame()) 278 if (m_frame->isMainFrame())
298 m_currentItem->setPageScaleFactor(m_frame->page()->pageScaleFactor()); 279 historyItem->setPageScaleFactor(m_frame->page()->pageScaleFactor());
299 280
300 client()->didUpdateCurrentHistoryItem(); 281 client()->didUpdateCurrentHistoryItem();
301 } 282 }
302 283
303 void FrameLoader::dispatchUnloadEvent() { 284 void FrameLoader::dispatchUnloadEvent() {
304 FrameNavigationDisabler navigationDisabler(*m_frame); 285 FrameNavigationDisabler navigationDisabler(*m_frame);
305 286
306 // If the frame is unloading, the provisional loader should no longer be 287 // If the frame is unloading, the provisional loader should no longer be
307 // protected. It will be detached soon. 288 // protected. It will be detached soon.
308 m_protectProvisionalLoader = false; 289 m_protectProvisionalLoader = false;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 372
392 // detachChildren() potentially detaches the frame from the document. The 373 // detachChildren() potentially detaches the frame from the document. The
393 // loading cannot continue in that case. 374 // loading cannot continue in that case.
394 if (!m_frame->page()) 375 if (!m_frame->page())
395 return; 376 return;
396 377
397 client()->transitionToCommittedForNewPage(); 378 client()->transitionToCommittedForNewPage();
398 documentLoader->replaceDocumentWhileExecutingJavaScriptURL(init, source); 379 documentLoader->replaceDocumentWhileExecutingJavaScriptURL(init, source);
399 } 380 }
400 381
401 void FrameLoader::clearProvisionalHistoryItem() {
402 m_provisionalItem.clear();
403 }
404
405 void FrameLoader::setHistoryItemStateForCommit(
406 FrameLoadType loadType,
407 HistoryCommitType historyCommitType,
408 HistoryNavigationType navigationType) {
409 HistoryItem* oldItem = m_currentItem;
410 if (isBackForwardLoadType(loadType) && m_provisionalItem)
411 m_currentItem = m_provisionalItem.release();
412 else
413 m_currentItem = HistoryItem::create();
414 m_currentItem->setURL(m_documentLoader->urlForHistory());
415 m_currentItem->setDocumentState(m_frame->document()->formElementsState());
416 m_currentItem->setReferrer(SecurityPolicy::generateReferrer(
417 m_documentLoader->getRequest().getReferrerPolicy(), m_currentItem->url(),
418 m_documentLoader->getRequest().httpReferrer()));
419 m_currentItem->setFormInfoFromRequest(m_documentLoader->getRequest());
420
421 // Don't propagate state from the old item to the new item if there isn't an
422 // old item (obviously), or if this is a back/forward navigation, since we
423 // explicitly want to restore the state we just committed.
424 if (!oldItem || isBackForwardLoadType(loadType))
425 return;
426 // Don't propagate state from the old item if this is a different-document
427 // navigation, unless the before and after pages are logically related. This
428 // means they have the same url (ignoring fragment) and the new item was
429 // loaded via reload or client redirect.
430 if (navigationType == HistoryNavigationType::DifferentDocument &&
431 (historyCommitType != HistoryInertCommit ||
432 !equalIgnoringFragmentIdentifier(oldItem->url(), m_currentItem->url())))
433 return;
434 m_currentItem->setDocumentSequenceNumber(oldItem->documentSequenceNumber());
435 m_currentItem->setScrollOffset(oldItem->getScrollOffset());
436 m_currentItem->setDidSaveScrollOrScaleState(
437 oldItem->didSaveScrollOrScaleState());
438 m_currentItem->setVisualViewportScrollOffset(
439 oldItem->visualViewportScrollOffset());
440 m_currentItem->setPageScaleFactor(oldItem->pageScaleFactor());
441 m_currentItem->setScrollRestorationType(oldItem->scrollRestorationType());
442
443 // The item sequence number determines whether items are "the same", such
444 // back/forward navigation between items with the same item sequence number is
445 // a no-op. Only treat this as identical if the navigation did not create a
446 // back/forward entry and the url is identical or it was loaded via
447 // history.replaceState().
448 if (historyCommitType == HistoryInertCommit &&
449 (navigationType == HistoryNavigationType::HistoryApi ||
450 oldItem->url() == m_currentItem->url())) {
451 m_currentItem->setStateObject(oldItem->stateObject());
452 m_currentItem->setItemSequenceNumber(oldItem->itemSequenceNumber());
453 }
454 }
455
456 static HistoryCommitType loadTypeToCommitType(FrameLoadType type) {
457 switch (type) {
458 case FrameLoadTypeStandard:
459 return StandardCommit;
460 case FrameLoadTypeInitialInChildFrame:
461 case FrameLoadTypeInitialHistoryLoad:
462 return InitialCommitInChildFrame;
463 case FrameLoadTypeBackForward:
464 return BackForwardCommit;
465 default:
466 break;
467 }
468 return HistoryInertCommit;
469 }
470
471 void FrameLoader::receivedFirstData() {
472 FrameLoadType loadType = m_documentLoader->loadType();
473 HistoryCommitType historyCommitType = loadTypeToCommitType(loadType);
474 if (historyCommitType == StandardCommit &&
475 (m_documentLoader->urlForHistory().isEmpty() ||
476 (opener() && !m_currentItem &&
477 m_documentLoader->originalRequest().url().isEmpty())))
478 historyCommitType = HistoryInertCommit;
479 setHistoryItemStateForCommit(loadType, historyCommitType,
480 HistoryNavigationType::DifferentDocument);
481
482 if (!m_stateMachine.committedMultipleRealLoads() &&
483 loadType == FrameLoadTypeStandard) {
484 m_stateMachine.advanceTo(
485 FrameLoaderStateMachine::CommittedMultipleRealLoads);
486 }
487
488 client()->dispatchDidCommitLoad(m_currentItem.get(), historyCommitType);
489
490 // When the embedder gets notified (above) that the new navigation has
491 // committed, the embedder will drop the old Content Security Policy and
492 // therefore now is a good time to report to the embedder the Content Security
493 // Policies that have accumulated so far for the new navigation.
494 m_frame->securityContext()->contentSecurityPolicy()->reportAccumulatedHeaders(
495 client());
496 }
497
498 void FrameLoader::didInstallNewDocument() {
499 if (m_provisionalItem &&
500 isBackForwardLoadType(m_documentLoader->loadType())) {
501 m_frame->document()->setStateForNewFormElements(
502 m_provisionalItem->getDocumentState());
503 }
504 }
505
506 void FrameLoader::finishedParsing() { 382 void FrameLoader::finishedParsing() {
507 if (m_stateMachine.creatingInitialEmptyDocument()) 383 if (m_stateMachine.creatingInitialEmptyDocument())
508 return; 384 return;
509 385
510 m_progressTracker->finishedParsing(); 386 m_progressTracker->finishedParsing();
511 387
512 if (client()) { 388 if (client()) {
513 ScriptForbiddenScope forbidScripts; 389 ScriptForbiddenScope forbidScripts;
514 client()->dispatchDidFinishDocumentLoad(); 390 client()->dispatchDidFinishDocumentLoad();
515 } 391 }
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 566
691 void FrameLoader::updateForSameDocumentNavigation( 567 void FrameLoader::updateForSameDocumentNavigation(
692 const KURL& newURL, 568 const KURL& newURL,
693 SameDocumentNavigationSource sameDocumentNavigationSource, 569 SameDocumentNavigationSource sameDocumentNavigationSource,
694 PassRefPtr<SerializedScriptValue> data, 570 PassRefPtr<SerializedScriptValue> data,
695 HistoryScrollRestorationType scrollRestorationType, 571 HistoryScrollRestorationType scrollRestorationType,
696 FrameLoadType type, 572 FrameLoadType type,
697 Document* initiatingDocument) { 573 Document* initiatingDocument) {
698 TRACE_EVENT1("blink", "FrameLoader::updateForSameDocumentNavigation", "url", 574 TRACE_EVENT1("blink", "FrameLoader::updateForSameDocumentNavigation", "url",
699 newURL.getString().ascii().data()); 575 newURL.getString().ascii().data());
700 // Update the data source's request with the new URL to fake the URL change
701 m_frame->document()->setURL(newURL);
702 documentLoader()->setReplacesCurrentHistoryItem(type !=
703 FrameLoadTypeStandard);
704 documentLoader()->updateForSameDocumentNavigation(
705 newURL, sameDocumentNavigationSource);
706 576
707 // Generate start and stop notifications only when loader is completed so that 577 // Generate start and stop notifications only when loader is completed so that
708 // we don't fire them for fragment redirection that happens in window.onload 578 // we don't fire them for fragment redirection that happens in window.onload
709 // handler. See https://bugs.webkit.org/show_bug.cgi?id=31838 579 // handler. See https://bugs.webkit.org/show_bug.cgi?id=31838
710 // Do not fire the notifications if the frame is concurrently navigating away 580 // Do not fire the notifications if the frame is concurrently navigating away
711 // from the document, since a new document is already loading. 581 // from the document, since a new document is already loading.
712 if (m_frame->document()->loadEventFinished() && !m_provisionalDocumentLoader) 582 if (m_frame->document()->loadEventFinished() && !m_provisionalDocumentLoader)
713 client()->didStartLoading(NavigationWithinSameDocument); 583 client()->didStartLoading(NavigationWithinSameDocument);
714 584
715 HistoryCommitType historyCommitType = loadTypeToCommitType(type); 585 // Update the data source's request with the new URL to fake the URL change
716 if (!m_currentItem) 586 m_frame->document()->setURL(newURL);
Nate Chapin 2017/03/27 21:02:01 I couldn't find any evidence this clause is needed
717 historyCommitType = HistoryInertCommit; 587 documentLoader()->updateForSameDocumentNavigation(
718 if (m_frame->settings()->getHistoryEntryRequiresUserGesture() && 588 newURL, sameDocumentNavigationSource, std::move(data),
719 initiatingDocument && 589 scrollRestorationType, type, initiatingDocument);
720 !initiatingDocument->frame()->hasReceivedUserGesture()) {
721 historyCommitType = HistoryInertCommit;
722 }
723 590
724 setHistoryItemStateForCommit(
725 type, historyCommitType,
726 sameDocumentNavigationSource == SameDocumentNavigationHistoryApi
727 ? HistoryNavigationType::HistoryApi
728 : HistoryNavigationType::Fragment);
729 if (sameDocumentNavigationSource == SameDocumentNavigationHistoryApi) {
730 m_currentItem->setStateObject(std::move(data));
731 m_currentItem->setScrollRestorationType(scrollRestorationType);
732 }
733 client()->dispatchDidNavigateWithinPage(
734 m_currentItem.get(), historyCommitType, !!initiatingDocument);
735 client()->dispatchDidReceiveTitle(m_frame->document()->title()); 591 client()->dispatchDidReceiveTitle(m_frame->document()->title());
736 if (m_frame->document()->loadEventFinished() && !m_provisionalDocumentLoader) 592 if (m_frame->document()->loadEventFinished() && !m_provisionalDocumentLoader)
737 client()->didStopLoading(); 593 client()->didStopLoading();
738 } 594 }
739 595
740 void FrameLoader::detachDocumentLoader(Member<DocumentLoader>& loader) { 596 void FrameLoader::detachDocumentLoader(Member<DocumentLoader>& loader) {
741 if (!loader) 597 if (!loader)
742 return; 598 return;
743 599
744 FrameNavigationDisabler navigationDisabler(*m_frame); 600 FrameNavigationDisabler navigationDisabler(*m_frame);
745 loader->detachFromFrame(); 601 loader->detachFromFrame();
746 loader = nullptr; 602 loader = nullptr;
747 } 603 }
748 604
749 void FrameLoader::loadInSameDocument( 605 void FrameLoader::loadInSameDocument(
750 const KURL& url, 606 const KURL& url,
751 PassRefPtr<SerializedScriptValue> stateObject, 607 PassRefPtr<SerializedScriptValue> stateObject,
752 FrameLoadType frameLoadType, 608 FrameLoadType frameLoadType,
753 HistoryLoadType historyLoadType, 609 HistoryItem* historyItem,
754 ClientRedirectPolicy clientRedirect, 610 ClientRedirectPolicy clientRedirect,
755 Document* initiatingDocument) { 611 Document* initiatingDocument) {
756 // If we have a state object, we cannot also be a new navigation. 612 // If we have a state object, we cannot also be a new navigation.
757 DCHECK(!stateObject || frameLoadType == FrameLoadTypeBackForward); 613 DCHECK(!stateObject || frameLoadType == FrameLoadTypeBackForward);
758 614
759 // If we have a provisional request for a different document, a fragment 615 // If we have a provisional request for a different document, a fragment
760 // scroll should cancel it. 616 // scroll should cancel it.
761 detachDocumentLoader(m_provisionalDocumentLoader); 617 detachDocumentLoader(m_provisionalDocumentLoader);
762 618
763 if (!m_frame->host()) 619 if (!m_frame->host())
764 return; 620 return;
765 saveScrollState(); 621 saveScrollState();
766 622
767 KURL oldURL = m_frame->document()->url(); 623 KURL oldURL = m_frame->document()->url();
768 bool hashChange = equalIgnoringFragmentIdentifier(url, oldURL) && 624 bool hashChange = equalIgnoringFragmentIdentifier(url, oldURL) &&
769 url.fragmentIdentifier() != oldURL.fragmentIdentifier(); 625 url.fragmentIdentifier() != oldURL.fragmentIdentifier();
770 if (hashChange) { 626 if (hashChange) {
771 // If we were in the autoscroll/middleClickAutoscroll mode we want to stop 627 // If we were in the autoscroll/middleClickAutoscroll mode we want to stop
772 // it before following the link to the anchor 628 // it before following the link to the anchor
773 m_frame->eventHandler().stopAutoscroll(); 629 m_frame->eventHandler().stopAutoscroll();
774 m_frame->domWindow()->enqueueHashchangeEvent(oldURL, url); 630 m_frame->domWindow()->enqueueHashchangeEvent(oldURL, url);
775 } 631 }
776 m_documentLoader->setIsClientRedirect(clientRedirect == 632 m_documentLoader->setIsClientRedirect(clientRedirect ==
777 ClientRedirectPolicy::ClientRedirect); 633 ClientRedirectPolicy::ClientRedirect);
634 if (historyItem)
635 m_documentLoader->setItemForHistoryNavigation(historyItem);
778 updateForSameDocumentNavigation(url, SameDocumentNavigationDefault, nullptr, 636 updateForSameDocumentNavigation(url, SameDocumentNavigationDefault, nullptr,
779 ScrollRestorationAuto, frameLoadType, 637 ScrollRestorationAuto, frameLoadType,
780 initiatingDocument); 638 initiatingDocument);
781 639
782 m_documentLoader->initialScrollState().wasScrolledByUser = false; 640 m_documentLoader->initialScrollState().wasScrolledByUser = false;
783 641
784 checkCompleted(); 642 checkCompleted();
785 643
786 m_frame->domWindow()->statePopped(stateObject 644 m_frame->domWindow()->statePopped(stateObject
787 ? std::move(stateObject) 645 ? std::move(stateObject)
788 : SerializedScriptValue::nullValue()); 646 : SerializedScriptValue::nullValue());
789 647
790 if (historyLoadType == HistorySameDocumentLoad) 648 if (historyItem)
791 restoreScrollPositionAndViewStateForLoadType(frameLoadType); 649 restoreScrollPositionAndViewStateForLoadType(frameLoadType);
792 650
793 // We need to scroll to the fragment whether or not a hash change occurred, 651 // We need to scroll to the fragment whether or not a hash change occurred,
794 // since the user might have scrolled since the previous navigation. 652 // since the user might have scrolled since the previous navigation.
795 processFragment(url, frameLoadType, NavigationWithinSameDocument); 653 processFragment(url, frameLoadType, NavigationWithinSameDocument);
796 takeObjectSnapshot(); 654 takeObjectSnapshot();
797 } 655 }
798 656
799 // static 657 // static
800 void FrameLoader::setReferrerForFrameRequest(FrameLoadRequest& frameRequest) { 658 void FrameLoader::setReferrerForFrameRequest(FrameLoadRequest& frameRequest) {
(...skipping 18 matching lines...) Expand all
819 677
820 request.setHTTPReferrer(referrer); 678 request.setHTTPReferrer(referrer);
821 request.addHTTPOriginIfNeeded(referrer.referrer); 679 request.addHTTPOriginIfNeeded(referrer.referrer);
822 } 680 }
823 681
824 FrameLoadType FrameLoader::determineFrameLoadType( 682 FrameLoadType FrameLoader::determineFrameLoadType(
825 const FrameLoadRequest& request) { 683 const FrameLoadRequest& request) {
826 if (m_frame->tree().parent() && 684 if (m_frame->tree().parent() &&
827 !m_stateMachine.committedFirstRealDocumentLoad()) 685 !m_stateMachine.committedFirstRealDocumentLoad())
828 return FrameLoadTypeInitialInChildFrame; 686 return FrameLoadTypeInitialInChildFrame;
829 if (!m_frame->tree().parent() && !client()->backForwardLength()) 687 if (!m_frame->tree().parent() && !client()->backForwardLength()) {
688 if (opener() && request.resourceRequest().url().isEmpty())
Nate Chapin 2017/03/27 21:02:01 Was a special case in FrameLoader::receivedFirstDa
689 return FrameLoadTypeReplaceCurrentItem;
830 return FrameLoadTypeStandard; 690 return FrameLoadTypeStandard;
831 if (m_provisionalDocumentLoader && 691 }
832 request.substituteData().failingURL() ==
833 m_provisionalDocumentLoader->url() &&
834 m_provisionalDocumentLoader->loadType() == FrameLoadTypeBackForward)
Nate Chapin 2017/03/27 21:02:01 This clause moved to WebLocalFrameImpl::loadData()
835 return FrameLoadTypeBackForward;
836 if (request.resourceRequest().getCachePolicy() == 692 if (request.resourceRequest().getCachePolicy() ==
837 WebCachePolicy::ValidatingCacheData) 693 WebCachePolicy::ValidatingCacheData)
838 return FrameLoadTypeReload; 694 return FrameLoadTypeReload;
839 if (request.resourceRequest().getCachePolicy() == 695 if (request.resourceRequest().getCachePolicy() ==
840 WebCachePolicy::BypassingCache) 696 WebCachePolicy::BypassingCache)
841 return FrameLoadTypeReloadBypassingCache; 697 return FrameLoadTypeReloadBypassingCache;
842 // From the HTML5 spec for location.assign(): 698 // From the HTML5 spec for location.assign():
843 // "If the browsing context's session history contains only one Document, 699 // "If the browsing context's session history contains only one Document,
844 // and that was the about:blank Document created when the browsing context 700 // and that was the about:blank Document created when the browsing context
845 // was created, then the navigation must be done with replacement enabled." 701 // was created, then the navigation must be done with replacement enabled."
(...skipping 13 matching lines...) Expand all
859 if (request.substituteData().failingURL() == 715 if (request.substituteData().failingURL() ==
860 m_documentLoader->urlForHistory() && 716 m_documentLoader->urlForHistory() &&
861 m_documentLoader->loadType() == FrameLoadTypeReload) 717 m_documentLoader->loadType() == FrameLoadTypeReload)
862 return FrameLoadTypeReload; 718 return FrameLoadTypeReload;
863 719
864 if (m_frame->settings()->getHistoryEntryRequiresUserGesture() && 720 if (m_frame->settings()->getHistoryEntryRequiresUserGesture() &&
865 request.originDocument() && 721 request.originDocument() &&
866 !request.originDocument()->frame()->hasReceivedUserGesture()) 722 !request.originDocument()->frame()->hasReceivedUserGesture())
867 return FrameLoadTypeReplaceCurrentItem; 723 return FrameLoadTypeReplaceCurrentItem;
868 724
725 if (request.resourceRequest().url().isEmpty() &&
726 request.substituteData().failingURL().isEmpty()) {
Nate Chapin 2017/03/27 21:02:01 Was a special case in FrameLoader::receivedFirstDa
727 return FrameLoadTypeReplaceCurrentItem;
728 }
729
869 return FrameLoadTypeStandard; 730 return FrameLoadTypeStandard;
870 } 731 }
871 732
872 bool FrameLoader::prepareRequestForThisFrame(FrameLoadRequest& request) { 733 bool FrameLoader::prepareRequestForThisFrame(FrameLoadRequest& request) {
873 // If no origin Document* was specified, skip remaining security checks and 734 // If no origin Document* was specified, skip remaining security checks and
874 // assume the caller has fully initialized the FrameLoadRequest. 735 // assume the caller has fully initialized the FrameLoadRequest.
875 if (!request.originDocument()) 736 if (!request.originDocument())
876 return true; 737 return true;
877 738
878 KURL url = request.resourceRequest().url(); 739 KURL url = request.resourceRequest().url();
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1009 return; 870 return;
1010 } 871 }
1011 872
1012 FrameLoadRequest request(passedRequest); 873 FrameLoadRequest request(passedRequest);
1013 request.resourceRequest().setHasUserGesture( 874 request.resourceRequest().setHasUserGesture(
1014 UserGestureIndicator::processingUserGesture()); 875 UserGestureIndicator::processingUserGesture());
1015 876
1016 if (!prepareRequestForThisFrame(request)) 877 if (!prepareRequestForThisFrame(request))
1017 return; 878 return;
1018 879
1019 if (isBackForwardLoadType(frameLoadType)) {
Nate Chapin 2017/03/27 21:02:01 Equivalent moved to startLoad(), after the provisi
1020 DCHECK(historyItem);
1021 m_provisionalItem = historyItem;
1022 }
1023
1024 // Form submissions appear to need their special-case of finding the target at 880 // Form submissions appear to need their special-case of finding the target at
1025 // schedule rather than at fire. 881 // schedule rather than at fire.
1026 Frame* targetFrame = request.form() 882 Frame* targetFrame = request.form()
1027 ? nullptr 883 ? nullptr
1028 : m_frame->findFrameForNavigation( 884 : m_frame->findFrameForNavigation(
1029 AtomicString(request.frameName()), *m_frame); 885 AtomicString(request.frameName()), *m_frame);
1030 886
1031 NavigationPolicy policy = navigationPolicyForRequest(request); 887 NavigationPolicy policy = navigationPolicyForRequest(request);
1032 if (targetFrame && targetFrame != m_frame && 888 if (targetFrame && targetFrame != m_frame &&
1033 shouldNavigateTargetFrame(policy)) { 889 shouldNavigateTargetFrame(policy)) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1081 RefPtr<SerializedScriptValue> stateObject = 937 RefPtr<SerializedScriptValue> stateObject =
1082 sameDocumentHistoryNavigation ? historyItem->stateObject() : nullptr; 938 sameDocumentHistoryNavigation ? historyItem->stateObject() : nullptr;
1083 939
1084 if (!sameDocumentHistoryNavigation) { 940 if (!sameDocumentHistoryNavigation) {
1085 m_documentLoader->setNavigationType(determineNavigationType( 941 m_documentLoader->setNavigationType(determineNavigationType(
1086 newLoadType, false, request.triggeringEvent())); 942 newLoadType, false, request.triggeringEvent()));
1087 if (shouldTreatURLAsSameAsCurrent(url)) 943 if (shouldTreatURLAsSameAsCurrent(url))
1088 newLoadType = FrameLoadTypeReplaceCurrentItem; 944 newLoadType = FrameLoadTypeReplaceCurrentItem;
1089 } 945 }
1090 946
1091 loadInSameDocument(url, stateObject, newLoadType, historyLoadType, 947 loadInSameDocument(url, stateObject, newLoadType, historyItem,
1092 request.clientRedirect(), request.originDocument()); 948 request.clientRedirect(), request.originDocument());
1093 return; 949 return;
1094 } 950 }
1095 951
1096 // PlzNavigate 952 // PlzNavigate
1097 // If the loader classifies this navigation as a different document navigation 953 // If the loader classifies this navigation as a different document navigation
1098 // while the browser intended the navigation to be same-document, it means 954 // while the browser intended the navigation to be same-document, it means
1099 // that a different navigation must have committed while the IPC was sent. 955 // that a different navigation must have committed while the IPC was sent.
1100 // This navigation is no more same-document. The navigation is simply dropped. 956 // This navigation is no more same-document. The navigation is simply dropped.
1101 if (request.resourceRequest().isSameDocumentNavigation()) 957 if (request.resourceRequest().isSameDocumentNavigation())
1102 return; 958 return;
1103 959
1104 startLoad(request, newLoadType, policy); 960 startLoad(request, newLoadType, policy, historyItem);
1105 } 961 }
1106 962
1107 SubstituteData FrameLoader::defaultSubstituteDataForURL(const KURL& url) { 963 SubstituteData FrameLoader::defaultSubstituteDataForURL(const KURL& url) {
1108 if (!shouldTreatURLAsSrcdocDocument(url)) 964 if (!shouldTreatURLAsSrcdocDocument(url))
1109 return SubstituteData(); 965 return SubstituteData();
1110 String srcdoc = m_frame->deprecatedLocalOwner()->fastGetAttribute(srcdocAttr); 966 String srcdoc = m_frame->deprecatedLocalOwner()->fastGetAttribute(srcdocAttr);
1111 DCHECK(!srcdoc.isNull()); 967 DCHECK(!srcdoc.isNull());
1112 CString encodedSrcdoc = srcdoc.utf8(); 968 CString encodedSrcdoc = srcdoc.utf8();
1113 return SubstituteData( 969 return SubstituteData(
1114 SharedBuffer::create(encodedSrcdoc.data(), encodedSrcdoc.length()), 970 SharedBuffer::create(encodedSrcdoc.data(), encodedSrcdoc.length()),
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1151 detachDocumentLoader(m_provisionalDocumentLoader); 1007 detachDocumentLoader(m_provisionalDocumentLoader);
1152 1008
1153 m_checkTimer.stop(); 1009 m_checkTimer.stop();
1154 m_frame->navigationScheduler().cancel(); 1010 m_frame->navigationScheduler().cancel();
1155 1011
1156 // It's possible that the above actions won't have stopped loading if load 1012 // It's possible that the above actions won't have stopped loading if load
1157 // completion had been blocked on parsing or if we were in the middle of 1013 // completion had been blocked on parsing or if we were in the middle of
1158 // committing an empty document. In that case, emulate a failed navigation. 1014 // committing an empty document. In that case, emulate a failed navigation.
1159 if (!m_provisionalDocumentLoader && m_documentLoader && 1015 if (!m_provisionalDocumentLoader && m_documentLoader &&
1160 m_frame->isLoading()) { 1016 m_frame->isLoading()) {
1161 loadFailed(m_documentLoader.get(), 1017 m_documentLoader->loadFailed(
1162 ResourceError::cancelledError(m_documentLoader->url())); 1018 ResourceError::cancelledError(m_documentLoader->url()));
1163 } 1019 }
1164 1020
1165 m_inStopAllLoaders = false; 1021 m_inStopAllLoaders = false;
1166 takeObjectSnapshot(); 1022 takeObjectSnapshot();
1167 } 1023 }
1168 1024
1169 void FrameLoader::didAccessInitialDocument() { 1025 void FrameLoader::didAccessInitialDocument() {
1170 // We only need to notify the client for the main frame. 1026 // We only need to notify the client for the main frame.
1171 if (isLoadingMainFrame()) { 1027 if (isLoadingMainFrame()) {
1172 // Forbid script execution to prevent re-entering V8, since this is called 1028 // Forbid script execution to prevent re-entering V8, since this is called
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1222 // 'abort' listeners can also detach the frame. 1078 // 'abort' listeners can also detach the frame.
1223 if (!m_frame->client()) 1079 if (!m_frame->client())
1224 return false; 1080 return false;
1225 DCHECK_EQ(m_provisionalDocumentLoader, pdl); 1081 DCHECK_EQ(m_provisionalDocumentLoader, pdl);
1226 // No more events will be dispatched so detach the Document. 1082 // No more events will be dispatched so detach the Document.
1227 // TODO(yoav): Should we also be nullifying domWindow's document (or 1083 // TODO(yoav): Should we also be nullifying domWindow's document (or
1228 // domWindow) since the doc is now detached? 1084 // domWindow) since the doc is now detached?
1229 if (m_frame->document()) 1085 if (m_frame->document())
1230 m_frame->document()->shutdown(); 1086 m_frame->document()->shutdown();
1231 m_documentLoader = m_provisionalDocumentLoader.release(); 1087 m_documentLoader = m_provisionalDocumentLoader.release();
1088 if (m_documentLoader)
1089 m_documentLoader->markAsCommitted();
Nate Chapin 2017/03/27 21:02:01 (1) m_documentLoader can be nullptr here, which is
1232 takeObjectSnapshot(); 1090 takeObjectSnapshot();
1233 1091
1234 return true; 1092 return true;
1235 } 1093 }
1236 1094
1237 void FrameLoader::commitProvisionalLoad() { 1095 void FrameLoader::commitProvisionalLoad() {
1238 DCHECK(client()->hasWebView()); 1096 DCHECK(client()->hasWebView());
1239 1097
1240 // Check if the destination page is allowed to access the previous page's 1098 // Check if the destination page is allowed to access the previous page's
1241 // timing information. 1099 // timing information.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1287 1145
1288 void FrameLoader::restoreScrollPositionAndViewState() { 1146 void FrameLoader::restoreScrollPositionAndViewState() {
1289 if (!m_frame->page() || !documentLoader()) 1147 if (!m_frame->page() || !documentLoader())
1290 return; 1148 return;
1291 restoreScrollPositionAndViewStateForLoadType(documentLoader()->loadType()); 1149 restoreScrollPositionAndViewStateForLoadType(documentLoader()->loadType());
1292 } 1150 }
1293 1151
1294 void FrameLoader::restoreScrollPositionAndViewStateForLoadType( 1152 void FrameLoader::restoreScrollPositionAndViewStateForLoadType(
1295 FrameLoadType loadType) { 1153 FrameLoadType loadType) {
1296 FrameView* view = m_frame->view(); 1154 FrameView* view = m_frame->view();
1297 if (!view || !view->layoutViewportScrollableArea() || !m_currentItem || 1155 if (!view || !view->layoutViewportScrollableArea() ||
1298 !m_stateMachine.committedFirstRealDocumentLoad()) { 1156 !m_stateMachine.committedFirstRealDocumentLoad()) {
1299 return; 1157 return;
1300 } 1158 }
1301 if (!needsHistoryItemRestore(loadType)) 1159 if (!needsHistoryItemRestore(loadType))
1302 return; 1160 return;
1303 if (!m_currentItem->didSaveScrollOrScaleState()) 1161 HistoryItem* historyItem = m_documentLoader->historyItem();
1162 if (!historyItem || !historyItem->didSaveScrollOrScaleState())
1304 return; 1163 return;
1305 1164
1306 bool shouldRestoreScroll = 1165 bool shouldRestoreScroll =
1307 m_currentItem->scrollRestorationType() != ScrollRestorationManual; 1166 historyItem->scrollRestorationType() != ScrollRestorationManual;
1308 bool shouldRestoreScale = m_currentItem->pageScaleFactor(); 1167 bool shouldRestoreScale = historyItem->pageScaleFactor();
1309 1168
1310 // This tries to balance: 1169 // This tries to balance:
1311 // 1. restoring as soon as possible 1170 // 1. restoring as soon as possible
1312 // 2. not overriding user scroll (TODO(majidvp): also respect user scale) 1171 // 2. not overriding user scroll (TODO(majidvp): also respect user scale)
1313 // 3. detecting clamping to avoid repeatedly popping the scroll position down 1172 // 3. detecting clamping to avoid repeatedly popping the scroll position down
1314 // as the page height increases 1173 // as the page height increases
1315 // 4. ignore clamp detection if we are not restoring scroll or after load 1174 // 4. ignore clamp detection if we are not restoring scroll or after load
1316 // completes because that may be because the page will never reach its 1175 // completes because that may be because the page will never reach its
1317 // previous height 1176 // previous height
1318 bool canRestoreWithoutClamping = 1177 bool canRestoreWithoutClamping =
1319 view->layoutViewportScrollableArea()->clampScrollOffset( 1178 view->layoutViewportScrollableArea()->clampScrollOffset(
1320 m_currentItem->getScrollOffset()) == m_currentItem->getScrollOffset(); 1179 historyItem->getScrollOffset()) == historyItem->getScrollOffset();
1321 bool canRestoreWithoutAnnoyingUser = 1180 bool canRestoreWithoutAnnoyingUser =
1322 !documentLoader()->initialScrollState().wasScrolledByUser && 1181 !documentLoader()->initialScrollState().wasScrolledByUser &&
1323 (canRestoreWithoutClamping || !m_frame->isLoading() || 1182 (canRestoreWithoutClamping || !m_frame->isLoading() ||
1324 !shouldRestoreScroll); 1183 !shouldRestoreScroll);
1325 if (!canRestoreWithoutAnnoyingUser) 1184 if (!canRestoreWithoutAnnoyingUser)
1326 return; 1185 return;
1327 1186
1328 if (shouldRestoreScroll) { 1187 if (shouldRestoreScroll) {
1329 view->layoutViewportScrollableArea()->setScrollOffset( 1188 view->layoutViewportScrollableArea()->setScrollOffset(
1330 m_currentItem->getScrollOffset(), ProgrammaticScroll); 1189 historyItem->getScrollOffset(), ProgrammaticScroll);
1331 } 1190 }
1332 1191
1333 // For main frame restore scale and visual viewport position 1192 // For main frame restore scale and visual viewport position
1334 if (m_frame->isMainFrame()) { 1193 if (m_frame->isMainFrame()) {
1335 ScrollOffset visualViewportOffset( 1194 ScrollOffset visualViewportOffset(
1336 m_currentItem->visualViewportScrollOffset()); 1195 historyItem->visualViewportScrollOffset());
1337 1196
1338 // If the visual viewport's offset is (-1, -1) it means the history item 1197 // If the visual viewport's offset is (-1, -1) it means the history item
1339 // is an old version of HistoryItem so distribute the scroll between 1198 // is an old version of HistoryItem so distribute the scroll between
1340 // the main frame and the visual viewport as best as we can. 1199 // the main frame and the visual viewport as best as we can.
1341 if (visualViewportOffset.width() == -1 && 1200 if (visualViewportOffset.width() == -1 &&
1342 visualViewportOffset.height() == -1) { 1201 visualViewportOffset.height() == -1) {
1343 visualViewportOffset = 1202 visualViewportOffset =
1344 m_currentItem->getScrollOffset() - 1203 historyItem->getScrollOffset() -
1345 view->layoutViewportScrollableArea()->getScrollOffset(); 1204 view->layoutViewportScrollableArea()->getScrollOffset();
1346 } 1205 }
1347 1206
1348 VisualViewport& visualViewport = m_frame->page()->visualViewport(); 1207 VisualViewport& visualViewport = m_frame->page()->visualViewport();
1349 if (shouldRestoreScale && shouldRestoreScroll) { 1208 if (shouldRestoreScale && shouldRestoreScroll) {
1350 visualViewport.setScaleAndLocation(m_currentItem->pageScaleFactor(), 1209 visualViewport.setScaleAndLocation(historyItem->pageScaleFactor(),
1351 FloatPoint(visualViewportOffset)); 1210 FloatPoint(visualViewportOffset));
1352 } else if (shouldRestoreScale) { 1211 } else if (shouldRestoreScale) {
1353 visualViewport.setScale(m_currentItem->pageScaleFactor()); 1212 visualViewport.setScale(historyItem->pageScaleFactor());
1354 } else if (shouldRestoreScroll) { 1213 } else if (shouldRestoreScroll) {
1355 visualViewport.setLocation(FloatPoint(visualViewportOffset)); 1214 visualViewport.setLocation(FloatPoint(visualViewportOffset));
1356 } 1215 }
1357 1216
1358 if (ScrollingCoordinator* scrollingCoordinator = 1217 if (ScrollingCoordinator* scrollingCoordinator =
1359 m_frame->page()->scrollingCoordinator()) 1218 m_frame->page()->scrollingCoordinator())
1360 scrollingCoordinator->frameViewRootLayerDidChange(view); 1219 scrollingCoordinator->frameViewRootLayerDidChange(view);
1361 } 1220 }
1362 1221
1363 documentLoader()->initialScrollState().didRestoreFromHistory = true; 1222 documentLoader()->initialScrollState().didRestoreFromHistory = true;
(...skipping 13 matching lines...) Expand all
1377 if (parent && parent->isLocalFrame()) 1236 if (parent && parent->isLocalFrame())
1378 toLocalFrame(parent)->loader().scheduleCheckCompleted(); 1237 toLocalFrame(parent)->loader().scheduleCheckCompleted();
1379 if (m_progressTracker) { 1238 if (m_progressTracker) {
1380 m_progressTracker->dispose(); 1239 m_progressTracker->dispose();
1381 m_progressTracker.clear(); 1240 m_progressTracker.clear();
1382 } 1241 }
1383 1242
1384 TRACE_EVENT_OBJECT_DELETED_WITH_ID("loading", "FrameLoader", this); 1243 TRACE_EVENT_OBJECT_DELETED_WITH_ID("loading", "FrameLoader", this);
1385 } 1244 }
1386 1245
1387 void FrameLoader::loadFailed(DocumentLoader* loader, 1246 void FrameLoader::detachProvisionalDocumentLoader(DocumentLoader* loader) {
Nate Chapin 2017/03/27 21:02:01 I don't like having this, but a DocumentLoader nee
1388 const ResourceError& error) { 1247 DCHECK_EQ(loader, m_provisionalDocumentLoader);
1389 if (!error.isCancellation() && m_frame->owner()) { 1248 detachDocumentLoader(m_provisionalDocumentLoader);
1390 // FIXME: For now, fallback content doesn't work cross process.
1391 if (m_frame->owner()->isLocal())
1392 m_frame->deprecatedLocalOwner()->renderFallbackContent();
1393 }
1394
1395 HistoryCommitType historyCommitType =
1396 loadTypeToCommitType(loader->loadType());
1397 if (loader == m_provisionalDocumentLoader) {
1398 if (!m_provisionalDocumentLoader->didStart())
1399 probe::frameClearedScheduledClientNavigation(m_frame);
1400 m_provisionalDocumentLoader->setSentDidFinishLoad();
1401 client()->dispatchDidFailProvisionalLoad(error, historyCommitType);
1402 if (loader != m_provisionalDocumentLoader)
1403 return;
1404 detachDocumentLoader(m_provisionalDocumentLoader);
1405 } else {
1406 DCHECK_EQ(loader, m_documentLoader);
1407 if (m_frame->document()->parser())
1408 m_frame->document()->parser()->stopParsing();
1409 if (!m_documentLoader->sentDidFinishLoad()) {
1410 m_documentLoader->setSentDidFinishLoad();
1411 client()->dispatchDidFailLoad(error, historyCommitType);
1412 }
1413 }
1414 checkCompleted();
1415 } 1249 }
1416 1250
1417 bool FrameLoader::shouldPerformFragmentNavigation(bool isFormSubmission, 1251 bool FrameLoader::shouldPerformFragmentNavigation(bool isFormSubmission,
1418 const String& httpMethod, 1252 const String& httpMethod,
1419 FrameLoadType loadType, 1253 FrameLoadType loadType,
1420 const KURL& url) { 1254 const KURL& url) {
1421 // We don't do this if we are submitting a form with method other than "GET", 1255 // We don't do this if we are submitting a form with method other than "GET",
1422 // explicitly reloading, currently displaying a frameset, or if the URL does 1256 // explicitly reloading, currently displaying a frameset, or if the URL does
1423 // not have a fragment. 1257 // not have a fragment.
1424 return equalIgnoringCase(httpMethod, HTTPNames::GET) && 1258 return equalIgnoringCase(httpMethod, HTTPNames::GET) &&
(...skipping 25 matching lines...) Expand all
1450 ->view() 1284 ->view()
1451 ->setSafeToPropagateScrollToParent(false); 1285 ->setSafeToPropagateScrollToParent(false);
1452 } 1286 }
1453 1287
1454 // If scroll position is restored from history fragment or scroll 1288 // If scroll position is restored from history fragment or scroll
1455 // restoration type is manual, then we should not override it unless this 1289 // restoration type is manual, then we should not override it unless this
1456 // is a same document reload. 1290 // is a same document reload.
1457 bool shouldScrollToFragment = 1291 bool shouldScrollToFragment =
1458 (loadStartType == NavigationWithinSameDocument && 1292 (loadStartType == NavigationWithinSameDocument &&
1459 !isBackForwardLoadType(frameLoadType)) || 1293 !isBackForwardLoadType(frameLoadType)) ||
1460 (documentLoader() && 1294 (!documentLoader()->initialScrollState().didRestoreFromHistory &&
yhirano 2017/03/29 09:38:13 Can you tell me why this can be removed safely?
Nate Chapin 2017/03/29 18:23:06 The FrameView null-check at the top of processFrag
1461 !documentLoader()->initialScrollState().didRestoreFromHistory && 1295 !(documentLoader()->historyItem() &&
1462 !(m_currentItem && 1296 documentLoader()->historyItem()->scrollRestorationType() ==
1463 m_currentItem->scrollRestorationType() == ScrollRestorationManual)); 1297 ScrollRestorationManual));
1464 1298
1465 view->processUrlFragment(url, shouldScrollToFragment 1299 view->processUrlFragment(url, shouldScrollToFragment
1466 ? FrameView::UrlFragmentScroll 1300 ? FrameView::UrlFragmentScroll
1467 : FrameView::UrlFragmentDontScroll); 1301 : FrameView::UrlFragmentDontScroll);
1468 1302
1469 if (boundaryFrame && boundaryFrame->isLocalFrame()) 1303 if (boundaryFrame && boundaryFrame->isLocalFrame())
1470 toLocalFrame(boundaryFrame)->view()->setSafeToPropagateScrollToParent(true); 1304 toLocalFrame(boundaryFrame)->view()->setSafeToPropagateScrollToParent(true);
1471 } 1305 }
1472 1306
1473 bool FrameLoader::shouldClose(bool isReload) { 1307 bool FrameLoader::shouldClose(bool isReload) {
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1609 return shouldContinueForNavigationPolicy( 1443 return shouldContinueForNavigationPolicy(
1610 resourceRequest, frameLoadRequest.substituteData(), nullptr, 1444 resourceRequest, frameLoadRequest.substituteData(), nullptr,
1611 frameLoadRequest.shouldCheckMainWorldContentSecurityPolicy(), 1445 frameLoadRequest.shouldCheckMainWorldContentSecurityPolicy(),
1612 navigationType, navigationPolicy, type, 1446 navigationType, navigationPolicy, type,
1613 frameLoadRequest.clientRedirect() == ClientRedirectPolicy::ClientRedirect, 1447 frameLoadRequest.clientRedirect() == ClientRedirectPolicy::ClientRedirect,
1614 frameLoadRequest.form()); 1448 frameLoadRequest.form());
1615 } 1449 }
1616 1450
1617 void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest, 1451 void FrameLoader::startLoad(FrameLoadRequest& frameLoadRequest,
1618 FrameLoadType type, 1452 FrameLoadType type,
1619 NavigationPolicy navigationPolicy) { 1453 NavigationPolicy navigationPolicy,
1454 HistoryItem* historyItem) {
1620 DCHECK(client()->hasWebView()); 1455 DCHECK(client()->hasWebView());
1621 ResourceRequest& resourceRequest = frameLoadRequest.resourceRequest(); 1456 ResourceRequest& resourceRequest = frameLoadRequest.resourceRequest();
1622 NavigationType navigationType = determineNavigationType( 1457 NavigationType navigationType = determineNavigationType(
1623 type, resourceRequest.httpBody() || frameLoadRequest.form(), 1458 type, resourceRequest.httpBody() || frameLoadRequest.form(),
1624 frameLoadRequest.triggeringEvent()); 1459 frameLoadRequest.triggeringEvent());
1625 resourceRequest.setRequestContext( 1460 resourceRequest.setRequestContext(
1626 determineRequestContextFromNavigationType(navigationType)); 1461 determineRequestContextFromNavigationType(navigationType));
1627 resourceRequest.setFrameType(m_frame->isMainFrame() 1462 resourceRequest.setFrameType(m_frame->isMainFrame()
1628 ? WebURLRequest::FrameTypeTopLevel 1463 ? WebURLRequest::FrameTypeTopLevel
1629 : WebURLRequest::FrameTypeNested); 1464 : WebURLRequest::FrameTypeNested);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1670 navigationPolicy == NavigationPolicyHandledByClient) { 1505 navigationPolicy == NavigationPolicyHandledByClient) {
1671 m_frame->navigationScheduler().cancel(); 1506 m_frame->navigationScheduler().cancel();
1672 m_checkTimer.stop(); 1507 m_checkTimer.stop();
1673 } 1508 }
1674 1509
1675 if (frameLoadRequest.form()) 1510 if (frameLoadRequest.form())
1676 client()->dispatchWillSubmitForm(frameLoadRequest.form()); 1511 client()->dispatchWillSubmitForm(frameLoadRequest.form());
1677 1512
1678 m_provisionalDocumentLoader->appendRedirect( 1513 m_provisionalDocumentLoader->appendRedirect(
1679 m_provisionalDocumentLoader->getRequest().url()); 1514 m_provisionalDocumentLoader->getRequest().url());
1515
1516 if (isBackForwardLoadType(type)) {
1517 DCHECK(historyItem);
1518 m_provisionalDocumentLoader->setItemForHistoryNavigation(historyItem);
1519 }
1520
1680 // TODO(ananta): 1521 // TODO(ananta):
1681 // We should get rid of the dependency on the DocumentLoader in consumers of 1522 // We should get rid of the dependency on the DocumentLoader in consumers of
1682 // the didStartProvisionalLoad() notification. 1523 // the didStartProvisionalLoad() notification.
1683 client()->dispatchDidStartProvisionalLoad(m_provisionalDocumentLoader, 1524 client()->dispatchDidStartProvisionalLoad(m_provisionalDocumentLoader,
1684 resourceRequest); 1525 resourceRequest);
1685 DCHECK(m_provisionalDocumentLoader); 1526 DCHECK(m_provisionalDocumentLoader);
1686 1527
1687 if (navigationPolicy == NavigationPolicyCurrentTab) { 1528 if (navigationPolicy == NavigationPolicyCurrentTab) {
1688 m_provisionalDocumentLoader->startLoadingMainResource(); 1529 m_provisionalDocumentLoader->startLoadingMainResource();
1689 // This should happen after the request is sent, so that the state 1530 // This should happen after the request is sent, so that the state
(...skipping 13 matching lines...) Expand all
1703 takeObjectSnapshot(); 1544 takeObjectSnapshot();
1704 } 1545 }
1705 1546
1706 void FrameLoader::applyUserAgent(ResourceRequest& request) { 1547 void FrameLoader::applyUserAgent(ResourceRequest& request) {
1707 String userAgent = this->userAgent(); 1548 String userAgent = this->userAgent();
1708 DCHECK(!userAgent.isNull()); 1549 DCHECK(!userAgent.isNull());
1709 request.setHTTPUserAgent(AtomicString(userAgent)); 1550 request.setHTTPUserAgent(AtomicString(userAgent));
1710 } 1551 }
1711 1552
1712 bool FrameLoader::shouldTreatURLAsSameAsCurrent(const KURL& url) const { 1553 bool FrameLoader::shouldTreatURLAsSameAsCurrent(const KURL& url) const {
1713 return m_currentItem && url == m_currentItem->url(); 1554 return m_documentLoader->historyItem() &&
1555 url == m_documentLoader->historyItem()->url();
1714 } 1556 }
1715 1557
1716 bool FrameLoader::shouldTreatURLAsSrcdocDocument(const KURL& url) const { 1558 bool FrameLoader::shouldTreatURLAsSrcdocDocument(const KURL& url) const {
1717 if (!url.isAboutSrcdocURL()) 1559 if (!url.isAboutSrcdocURL())
1718 return false; 1560 return false;
1719 HTMLFrameOwnerElement* ownerElement = m_frame->deprecatedLocalOwner(); 1561 HTMLFrameOwnerElement* ownerElement = m_frame->deprecatedLocalOwner();
1720 if (!isHTMLIFrameElement(ownerElement)) 1562 if (!isHTMLIFrameElement(ownerElement))
1721 return false; 1563 return false;
1722 return ownerElement->fastHasAttribute(srcdocAttr); 1564 return ownerElement->fastHasAttribute(srcdocAttr);
1723 } 1565 }
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
1896 FrameLoadType loadType, 1738 FrameLoadType loadType,
1897 NavigationType navigationType) { 1739 NavigationType navigationType) {
1898 DocumentLoader* loader = client()->createDocumentLoader( 1740 DocumentLoader* loader = client()->createDocumentLoader(
1899 m_frame, request, frameLoadRequest.substituteData().isValid() 1741 m_frame, request, frameLoadRequest.substituteData().isValid()
1900 ? frameLoadRequest.substituteData() 1742 ? frameLoadRequest.substituteData()
1901 : defaultSubstituteDataForURL(request.url()), 1743 : defaultSubstituteDataForURL(request.url()),
1902 frameLoadRequest.clientRedirect()); 1744 frameLoadRequest.clientRedirect());
1903 1745
1904 loader->setLoadType(loadType); 1746 loader->setLoadType(loadType);
1905 loader->setNavigationType(navigationType); 1747 loader->setNavigationType(navigationType);
1906 loader->setReplacesCurrentHistoryItem(loadType == 1748 bool replaceCurrentItem = loadType == FrameLoadTypeReplaceCurrentItem &&
Nate Chapin 2017/03/27 21:02:01 The browser process DCHECKS when it received a bla
kinuko 2017/03/30 05:04:59 Could we have some of this note as a code comment?
Nate Chapin 2017/03/30 20:13:56 Added an explanation/TODO.
1907 FrameLoadTypeReplaceCurrentItem); 1749 (!opener() || !request.url().isEmpty());
1750 loader->setReplacesCurrentHistoryItem(replaceCurrentItem);
1908 return loader; 1751 return loader;
1909 } 1752 }
1910 1753
1911 } // namespace blink 1754 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698