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

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

Issue 927213004: Accept options in history APIs to allow scroll restoration to be disabled (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: minor Created 5 years, 7 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 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 clear(); 283 clear();
284 284
285 // detachChildren() potentially detaches the frame from the document. The 285 // detachChildren() potentially detaches the frame from the document. The
286 // loading cannot continue in that case. 286 // loading cannot continue in that case.
287 if (!m_frame->page()) 287 if (!m_frame->page())
288 return; 288 return;
289 289
290 documentLoader->replaceDocumentWhileExecutingJavaScriptURL(init, source, own erDocument); 290 documentLoader->replaceDocumentWhileExecutingJavaScriptURL(init, source, own erDocument);
291 } 291 }
292 292
293 void FrameLoader::setHistoryItemStateForCommit(HistoryCommitType historyCommitTy pe, bool isPushOrReplaceState, PassRefPtr<SerializedScriptValue> stateObject) 293 void FrameLoader::setHistoryItemStateForCommit(HistoryCommitType historyCommitTy pe, bool isPushOrReplaceState, bool shouldRestoreScroll, PassRefPtr<SerializedSc riptValue> stateObject)
294 { 294 {
295 if (m_provisionalItem) 295 if (m_provisionalItem)
296 m_currentItem = m_provisionalItem.release(); 296 m_currentItem = m_provisionalItem.release();
297 297
298 if (!m_currentItem || historyCommitType == StandardCommit) { 298 if (!m_currentItem || historyCommitType == StandardCommit) {
299 m_currentItem = HistoryItem::create(); 299 m_currentItem = HistoryItem::create();
300 } else if (!isPushOrReplaceState && m_documentLoader->url() != m_currentItem ->url()) { 300 } else if (!isPushOrReplaceState && m_documentLoader->url() != m_currentItem ->url()) {
301 m_currentItem->generateNewItemSequenceNumber(); 301 m_currentItem->generateNewItemSequenceNumber();
302 if (!equalIgnoringFragmentIdentifier(m_documentLoader->url(), m_currentI tem->url())) 302 if (!equalIgnoringFragmentIdentifier(m_documentLoader->url(), m_currentI tem->url()))
303 m_currentItem->generateNewDocumentSequenceNumber(); 303 m_currentItem->generateNewDocumentSequenceNumber();
304 } 304 }
305 305
306 m_currentItem->setURL(m_documentLoader->urlForHistory()); 306 m_currentItem->setURL(m_documentLoader->urlForHistory());
307 m_currentItem->setDocumentState(m_frame->document()->formElementsState()); 307 m_currentItem->setDocumentState(m_frame->document()->formElementsState());
308 m_currentItem->setTarget(m_frame->tree().uniqueName()); 308 m_currentItem->setTarget(m_frame->tree().uniqueName());
309 if (isPushOrReplaceState) 309 if (isPushOrReplaceState) {
310 m_currentItem->setStateObject(stateObject); 310 m_currentItem->setStateObject(stateObject);
311 m_currentItem->setShouldRestoreScroll(shouldRestoreScroll);
312 }
311 m_currentItem->setReferrer(SecurityPolicy::generateReferrer(m_documentLoader ->request().referrerPolicy(), m_currentItem->url(), m_documentLoader->request(). httpReferrer())); 313 m_currentItem->setReferrer(SecurityPolicy::generateReferrer(m_documentLoader ->request().referrerPolicy(), m_currentItem->url(), m_documentLoader->request(). httpReferrer()));
312 m_currentItem->setFormInfoFromRequest(m_documentLoader->request()); 314 m_currentItem->setFormInfoFromRequest(m_documentLoader->request());
313 } 315 }
314 316
315 static HistoryCommitType loadTypeToCommitType(FrameLoadType type) 317 static HistoryCommitType loadTypeToCommitType(FrameLoadType type)
316 { 318 {
317 switch (type) { 319 switch (type) {
318 case FrameLoadTypeStandard: 320 case FrameLoadTypeStandard:
319 return StandardCommit; 321 return StandardCommit;
320 case FrameLoadTypeInitialInChildFrame: 322 case FrameLoadTypeInitialInChildFrame:
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 // accessible, so bail early. 551 // accessible, so bail early.
550 if (!client()) 552 if (!client())
551 return false; 553 return false;
552 Settings* settings = m_frame->settings(); 554 Settings* settings = m_frame->settings();
553 bool allowed = client()->allowPlugins(settings && settings->pluginsEnabled() ); 555 bool allowed = client()->allowPlugins(settings && settings->pluginsEnabled() );
554 if (!allowed && reason == AboutToInstantiatePlugin) 556 if (!allowed && reason == AboutToInstantiatePlugin)
555 client()->didNotAllowPlugins(); 557 client()->didNotAllowPlugins();
556 return allowed; 558 return allowed;
557 } 559 }
558 560
559 void FrameLoader::updateForSameDocumentNavigation(const KURL& newURL, SameDocume ntNavigationSource sameDocumentNavigationSource, PassRefPtr<SerializedScriptValu e> data, FrameLoadType type) 561 void FrameLoader::updateForSameDocumentNavigation(const KURL& newURL, SameDocume ntNavigationSource sameDocumentNavigationSource, PassRefPtr<SerializedScriptValu e> data, bool shouldRestoreScroll, FrameLoadType type)
560 { 562 {
561 saveScrollState(); 563 saveScrollState();
562 564
563 // Update the data source's request with the new URL to fake the URL change 565 // Update the data source's request with the new URL to fake the URL change
564 m_frame->document()->setURL(newURL); 566 m_frame->document()->setURL(newURL);
565 documentLoader()->setReplacesCurrentHistoryItem(type != FrameLoadTypeStandar d); 567 documentLoader()->setReplacesCurrentHistoryItem(type != FrameLoadTypeStandar d);
566 documentLoader()->updateForSameDocumentNavigation(newURL, sameDocumentNaviga tionSource); 568 documentLoader()->updateForSameDocumentNavigation(newURL, sameDocumentNaviga tionSource);
567 569
568 // Generate start and stop notifications only when loader is completed so th at we 570 // Generate start and stop notifications only when loader is completed so th at we
569 // don't fire them for fragment redirection that happens in window.onload ha ndler. 571 // don't fire them for fragment redirection that happens in window.onload ha ndler.
570 // See https://bugs.webkit.org/show_bug.cgi?id=31838 572 // See https://bugs.webkit.org/show_bug.cgi?id=31838
571 if (m_frame->document()->loadEventFinished()) 573 if (m_frame->document()->loadEventFinished())
572 client()->didStartLoading(NavigationWithinSameDocument); 574 client()->didStartLoading(NavigationWithinSameDocument);
573 575
574 HistoryCommitType historyCommitType = loadTypeToCommitType(type); 576 HistoryCommitType historyCommitType = loadTypeToCommitType(type);
575 if (!m_currentItem) 577 if (!m_currentItem)
576 historyCommitType = HistoryInertCommit; 578 historyCommitType = HistoryInertCommit;
577 579
578 setHistoryItemStateForCommit(historyCommitType, sameDocumentNavigationSource == SameDocumentNavigationHistoryApi, data); 580 setHistoryItemStateForCommit(historyCommitType, sameDocumentNavigationSource == SameDocumentNavigationHistoryApi, shouldRestoreScroll, data);
579 client()->dispatchDidNavigateWithinPage(m_currentItem.get(), historyCommitTy pe); 581 client()->dispatchDidNavigateWithinPage(m_currentItem.get(), historyCommitTy pe);
580 client()->dispatchDidReceiveTitle(m_frame->document()->title()); 582 client()->dispatchDidReceiveTitle(m_frame->document()->title());
581 if (m_frame->document()->loadEventFinished()) 583 if (m_frame->document()->loadEventFinished())
582 client()->didStopLoading(); 584 client()->didStopLoading();
583 } 585 }
584 586
585 void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScrip tValue> stateObject, FrameLoadType type, ClientRedirectPolicy clientRedirect) 587 void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScrip tValue> stateObject, FrameLoadType type, ClientRedirectPolicy clientRedirect)
586 { 588 {
587 // If we have a state object, we cannot also be a new navigation. 589 // If we have a state object, we cannot also be a new navigation.
588 ASSERT(!stateObject || type == FrameLoadTypeBackForward); 590 ASSERT(!stateObject || type == FrameLoadTypeBackForward);
(...skipping 10 matching lines...) Expand all
599 m_loadType = type; 601 m_loadType = type;
600 602
601 KURL oldURL = m_frame->document()->url(); 603 KURL oldURL = m_frame->document()->url();
602 // If we were in the autoscroll/panScroll mode we want to stop it before fol lowing the link to the anchor 604 // If we were in the autoscroll/panScroll mode we want to stop it before fol lowing the link to the anchor
603 bool hashChange = equalIgnoringFragmentIdentifier(url, oldURL) && url.fragme ntIdentifier() != oldURL.fragmentIdentifier(); 605 bool hashChange = equalIgnoringFragmentIdentifier(url, oldURL) && url.fragme ntIdentifier() != oldURL.fragmentIdentifier();
604 if (hashChange) { 606 if (hashChange) {
605 m_frame->eventHandler().stopAutoscroll(); 607 m_frame->eventHandler().stopAutoscroll();
606 m_frame->localDOMWindow()->enqueueHashchangeEvent(oldURL, url); 608 m_frame->localDOMWindow()->enqueueHashchangeEvent(oldURL, url);
607 } 609 }
608 m_documentLoader->setIsClientRedirect(clientRedirect == ClientRedirect); 610 m_documentLoader->setIsClientRedirect(clientRedirect == ClientRedirect);
609 updateForSameDocumentNavigation(url, SameDocumentNavigationDefault, nullptr, type); 611 updateForSameDocumentNavigation(url, SameDocumentNavigationDefault, nullptr, true, type);
610 612
611 m_frame->view()->setWasScrolledByUser(false); 613 m_frame->view()->setWasScrolledByUser(false);
612 614
613 // We need to scroll to the fragment whether or not a hash change occurred, since 615 // We need to scroll to the fragment whether or not a hash change occurred, since
614 // the user might have scrolled since the previous navigation. 616 // the user might have scrolled since the previous navigation.
615 scrollToFragmentWithParentBoundary(url); 617 scrollToFragmentWithParentBoundary(url);
616 checkCompleted(); 618 checkCompleted();
617 619
618 m_frame->localDOMWindow()->statePopped(stateObject ? stateObject : Serialize dScriptValue::nullValue()); 620 m_frame->localDOMWindow()->statePopped(stateObject ? stateObject : Serialize dScriptValue::nullValue());
619 } 621 }
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
1016 1018
1017 void FrameLoader::restoreScrollPositionAndViewState() 1019 void FrameLoader::restoreScrollPositionAndViewState()
1018 { 1020 {
1019 FrameView* view = m_frame->view(); 1021 FrameView* view = m_frame->view();
1020 if (!m_frame->page() || !view || !m_currentItem || !m_stateMachine.committed FirstRealDocumentLoad()) 1022 if (!m_frame->page() || !view || !m_currentItem || !m_stateMachine.committed FirstRealDocumentLoad())
1021 return; 1023 return;
1022 1024
1023 if (!needsHistoryItemRestore(m_loadType)) 1025 if (!needsHistoryItemRestore(m_loadType))
1024 return; 1026 return;
1025 1027
1028 if (!m_currentItem->shouldRestoreScroll())
1029 return;
1030
1026 // This tries to balance 1. restoring as soon as possible, 2. detecting 1031 // This tries to balance 1. restoring as soon as possible, 2. detecting
1027 // clamping to avoid repeatedly popping the scroll position down as the 1032 // clamping to avoid repeatedly popping the scroll position down as the
1028 // page height increases, 3. ignore clamp detection after load completes 1033 // page height increases, 3. ignore clamp detection after load completes
1029 // because that may be because the page will never reach its previous 1034 // because that may be because the page will never reach its previous
1030 // height. 1035 // height.
1031 bool canRestoreWithoutClamping = view->clampOffsetAtScale(m_currentItem->scr ollPoint(), 1) == m_currentItem->scrollPoint(); 1036 bool canRestoreWithoutClamping = view->clampOffsetAtScale(m_currentItem->scr ollPoint(), 1) == m_currentItem->scrollPoint();
1032 bool canRestoreWithoutAnnoyingUser = !view->wasScrolledByUser() && (canResto reWithoutClamping || m_frame->isLoading()); 1037 bool canRestoreWithoutAnnoyingUser = !view->wasScrolledByUser() && (canResto reWithoutClamping || m_frame->isLoading());
1033 if (!canRestoreWithoutAnnoyingUser) 1038 if (!canRestoreWithoutAnnoyingUser)
1034 return; 1039 return;
1035 1040
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
1451 // FIXME: We need a way to propagate insecure requests policy flags to 1456 // FIXME: We need a way to propagate insecure requests policy flags to
1452 // out-of-process frames. For now, we'll always use default behavior. 1457 // out-of-process frames. For now, we'll always use default behavior.
1453 if (!parentFrame->isLocalFrame()) 1458 if (!parentFrame->isLocalFrame())
1454 return nullptr; 1459 return nullptr;
1455 1460
1456 ASSERT(toLocalFrame(parentFrame)->document()); 1461 ASSERT(toLocalFrame(parentFrame)->document());
1457 return toLocalFrame(parentFrame)->document()->insecureNavigationsToUpgrade() ; 1462 return toLocalFrame(parentFrame)->document()->insecureNavigationsToUpgrade() ;
1458 } 1463 }
1459 1464
1460 } // namespace blink 1465 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698