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

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

Issue 1156473002: Refactor FrameLoader loading interface (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fixed issue with inital history navigation in child frames 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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 #include "wtf/text/WTFString.h" 93 #include "wtf/text/WTFString.h"
94 94
95 using blink::WebURLRequest; 95 using blink::WebURLRequest;
96 96
97 namespace blink { 97 namespace blink {
98 98
99 using namespace HTMLNames; 99 using namespace HTMLNames;
100 100
101 bool isBackForwardLoadType(FrameLoadType type) 101 bool isBackForwardLoadType(FrameLoadType type)
102 { 102 {
103 return type == FrameLoadTypeBackForward || type == FrameLoadTypeInitialHisto ryLoad; 103 return type == FrameLoadTypeBackForward || type == FrameLoadTypeInitialHisto ryLoad
104 || type == FrameLoadTypeHistorySameDocument;
104 } 105 }
105 106
106 static bool needsHistoryItemRestore(FrameLoadType type) 107 static bool needsHistoryItemRestore(FrameLoadType type)
107 { 108 {
108 return type == FrameLoadTypeBackForward || type == FrameLoadTypeReload || ty pe == FrameLoadTypeReloadFromOrigin; 109 return type == FrameLoadTypeBackForward || type == FrameLoadTypeReload
110 || type == FrameLoadTypeReloadFromOrigin || type == FrameLoadTypeHistory SameDocument;
111 }
112
113 // static
114 ResourceRequest FrameLoader::resourceRequestFromHistoryItem(HistoryItem* item,
115 ResourceRequestCachePolicy cachePolicy)
116 {
117 RefPtr<FormData> formData = item->formData();
118 ResourceRequest request(item->url());
119 request.setHTTPReferrer(item->referrer());
120 request.setCachePolicy(cachePolicy);
121 if (formData) {
122 request.setHTTPMethod("POST");
123 request.setHTTPBody(formData);
124 request.setHTTPContentType(item->formContentType());
125 RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString (item->referrer().referrer);
126 request.addHTTPOriginIfNeeded(securityOrigin->toAtomicString());
127 }
128 return request;
129 }
130
131 // static
132 ResourceRequest FrameLoader::resourceRequestForReload(HistoryItem* item, const L ocalFrame& frame,
133 FrameLoadType frameLoadType, const KURL& overrideURL, ClientRedirectPolicy c lientRedirectPolicy)
134 {
135 ASSERT(frameLoadType == FrameLoadTypeReload || frameLoadType == FrameLoadTyp eReloadFromOrigin);
136 ResourceRequestCachePolicy cachePolicy = frameLoadType == FrameLoadTypeReloa dFromOrigin ?
137 ReloadBypassingCache : ReloadIgnoringCacheData;
138 ResourceRequest request = resourceRequestFromHistoryItem(item, cachePolicy);
139
140 // ClientRedirectPolicy is an indication that this load was triggered by
141 // some direct interaction with the page. If this reload is not a client
142 // redirect, we should reuse the referrer from the original load of the
143 // current document. If this reload is a client redirect (e.g., location.rel oad()),
144 // it was initiated by something in the current document and should
145 // therefore show the current document's url as the referrer.
146 if (clientRedirectPolicy == ClientRedirect) {
147 request.setHTTPReferrer(Referrer(frame.document()->outgoingReferrer(),
148 frame.document()->referrerPolicy()));
149 }
150
151 if (!overrideURL.isEmpty()) {
152 request.setURL(overrideURL);
153 request.clearHTTPReferrer();
154 }
155 request.setSkipServiceWorker(frameLoadType == FrameLoadTypeReloadFromOrigin) ;
156 return request;
157 }
158
159 // static
160 FrameLoadRequest FrameLoader::frameRequestForReload(const ResourceRequest& resou rceRequest,
161 ClientRedirectPolicy clientRedirectPolicy)
162 {
163 FrameLoadRequest request = FrameLoadRequest(nullptr, resourceRequest);
164 request.setClientRedirect(clientRedirectPolicy);
165 return request;
109 } 166 }
110 167
111 FrameLoader::FrameLoader(LocalFrame* frame) 168 FrameLoader::FrameLoader(LocalFrame* frame)
112 : m_frame(frame) 169 : m_frame(frame)
113 , m_progressTracker(ProgressTracker::create(frame)) 170 , m_progressTracker(ProgressTracker::create(frame))
114 , m_loadType(FrameLoadTypeStandard) 171 , m_loadType(FrameLoadTypeStandard)
115 , m_inStopAllLoaders(false) 172 , m_inStopAllLoaders(false)
116 , m_checkTimer(this, &FrameLoader::checkTimerFired) 173 , m_checkTimer(this, &FrameLoader::checkTimerFired)
117 , m_didAccessInitialDocument(false) 174 , m_didAccessInitialDocument(false)
118 , m_didAccessInitialDocumentTimer(this, &FrameLoader::didAccessInitialDocume ntTimerFired) 175 , m_didAccessInitialDocumentTimer(this, &FrameLoader::didAccessInitialDocume ntTimerFired)
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 219
163 if (Document* document = m_frame->document()) { 220 if (Document* document = m_frame->document()) {
164 if (defers) 221 if (defers)
165 document->suspendScheduledTasks(); 222 document->suspendScheduledTasks();
166 else 223 else
167 document->resumeScheduledTasks(); 224 document->resumeScheduledTasks();
168 } 225 }
169 226
170 if (!defers) { 227 if (!defers) {
171 if (m_deferredHistoryLoad.isValid()) { 228 if (m_deferredHistoryLoad.isValid()) {
172 loadHistoryItem(m_deferredHistoryLoad.m_item.get(), FrameLoadTypeBac kForward, 229 load(FrameLoadRequest(nullptr, m_deferredHistoryLoad.m_request),
173 m_deferredHistoryLoad.m_type, m_deferredHistoryLoad.m_cachePolic y); 230 m_deferredHistoryLoad.m_loadType, m_deferredHistoryLoad.m_item.g et());
174 m_deferredHistoryLoad = DeferredHistoryLoad(); 231 m_deferredHistoryLoad = DeferredHistoryLoad();
175 } 232 }
176 m_frame->navigationScheduler().startTimer(); 233 m_frame->navigationScheduler().startTimer();
177 scheduleCheckCompleted(); 234 scheduleCheckCompleted();
178 } 235 }
179 } 236 }
180 237
181 void FrameLoader::saveScrollState() 238 void FrameLoader::saveScrollState()
182 { 239 {
183 if (!m_currentItem || !m_frame->view()) 240 if (!m_currentItem || !m_frame->view())
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 379
323 static HistoryCommitType loadTypeToCommitType(FrameLoadType type) 380 static HistoryCommitType loadTypeToCommitType(FrameLoadType type)
324 { 381 {
325 switch (type) { 382 switch (type) {
326 case FrameLoadTypeStandard: 383 case FrameLoadTypeStandard:
327 return StandardCommit; 384 return StandardCommit;
328 case FrameLoadTypeInitialInChildFrame: 385 case FrameLoadTypeInitialInChildFrame:
329 case FrameLoadTypeInitialHistoryLoad: 386 case FrameLoadTypeInitialHistoryLoad:
330 return InitialCommitInChildFrame; 387 return InitialCommitInChildFrame;
331 case FrameLoadTypeBackForward: 388 case FrameLoadTypeBackForward:
389 case FrameLoadTypeHistorySameDocument:
332 return BackForwardCommit; 390 return BackForwardCommit;
333 default: 391 default:
334 break; 392 break;
335 } 393 }
336 return HistoryInertCommit; 394 return HistoryInertCommit;
337 } 395 }
338 396
339 void FrameLoader::receivedFirstData() 397 void FrameLoader::receivedFirstData()
340 { 398 {
341 if (m_stateMachine.creatingInitialEmptyDocument()) 399 if (m_stateMachine.creatingInitialEmptyDocument())
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 String headerContentLanguage = m_documentLoader->response().httpHeaderFi eld("Content-Language"); 445 String headerContentLanguage = m_documentLoader->response().httpHeaderFi eld("Content-Language");
388 if (!headerContentLanguage.isEmpty()) { 446 if (!headerContentLanguage.isEmpty()) {
389 size_t commaIndex = headerContentLanguage.find(','); 447 size_t commaIndex = headerContentLanguage.find(',');
390 headerContentLanguage.truncate(commaIndex); // kNotFound == -1 == do n't truncate 448 headerContentLanguage.truncate(commaIndex); // kNotFound == -1 == do n't truncate
391 headerContentLanguage = headerContentLanguage.stripWhiteSpace(isHTML Space<UChar>); 449 headerContentLanguage = headerContentLanguage.stripWhiteSpace(isHTML Space<UChar>);
392 if (!headerContentLanguage.isEmpty()) 450 if (!headerContentLanguage.isEmpty())
393 m_frame->document()->setContentLanguage(AtomicString(headerConte ntLanguage)); 451 m_frame->document()->setContentLanguage(AtomicString(headerConte ntLanguage));
394 } 452 }
395 } 453 }
396 454
397 if (m_provisionalItem && (m_loadType == FrameLoadTypeBackForward || m_loadTy pe == FrameLoadTypeInitialHistoryLoad)) 455 if (m_provisionalItem && (m_loadType == FrameLoadTypeBackForward
456 || m_loadType == FrameLoadTypeInitialHistoryLoad
457 || m_loadType == FrameLoadTypeHistorySameDocument)) {
398 m_frame->document()->setStateForNewFormElements(m_provisionalItem->docum entState()); 458 m_frame->document()->setStateForNewFormElements(m_provisionalItem->docum entState());
459 }
399 460
400 client()->didCreateNewDocument(); 461 client()->didCreateNewDocument();
401 } 462 }
402 463
403 void FrameLoader::finishedParsing() 464 void FrameLoader::finishedParsing()
404 { 465 {
405 if (m_stateMachine.creatingInitialEmptyDocument()) 466 if (m_stateMachine.creatingInitialEmptyDocument())
406 return; 467 return;
407 468
408 // This can be called from the LocalFrame's destructor, in which case we sho uldn't protect ourselves 469 // This can be called from the LocalFrame's destructor, in which case we sho uldn't protect ourselves
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 setHistoryItemStateForCommit(historyCommitType, sameDocumentNavigationSource == SameDocumentNavigationHistoryApi, scrollRestorationType, data); 645 setHistoryItemStateForCommit(historyCommitType, sameDocumentNavigationSource == SameDocumentNavigationHistoryApi, scrollRestorationType, data);
585 client()->dispatchDidNavigateWithinPage(m_currentItem.get(), historyCommitTy pe); 646 client()->dispatchDidNavigateWithinPage(m_currentItem.get(), historyCommitTy pe);
586 client()->dispatchDidReceiveTitle(m_frame->document()->title()); 647 client()->dispatchDidReceiveTitle(m_frame->document()->title());
587 if (m_frame->document()->loadEventFinished()) 648 if (m_frame->document()->loadEventFinished())
588 client()->didStopLoading(); 649 client()->didStopLoading();
589 } 650 }
590 651
591 void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScrip tValue> stateObject, FrameLoadType type, ClientRedirectPolicy clientRedirect) 652 void FrameLoader::loadInSameDocument(const KURL& url, PassRefPtr<SerializedScrip tValue> stateObject, FrameLoadType type, ClientRedirectPolicy clientRedirect)
592 { 653 {
593 // If we have a state object, we cannot also be a new navigation. 654 // If we have a state object, we cannot also be a new navigation.
594 ASSERT(!stateObject || type == FrameLoadTypeBackForward); 655 ASSERT(!stateObject || type == FrameLoadTypeBackForward
656 || type == FrameLoadTypeHistorySameDocument);
595 657
596 // If we have a provisional request for a different document, a fragment scr oll should cancel it. 658 // If we have a provisional request for a different document, a fragment scr oll should cancel it.
597 if (m_provisionalDocumentLoader) { 659 if (m_provisionalDocumentLoader) {
598 m_provisionalDocumentLoader->stopLoading(); 660 m_provisionalDocumentLoader->stopLoading();
599 if (m_provisionalDocumentLoader) 661 if (m_provisionalDocumentLoader)
600 m_provisionalDocumentLoader->detachFromFrame(); 662 m_provisionalDocumentLoader->detachFromFrame();
601 m_provisionalDocumentLoader = nullptr; 663 m_provisionalDocumentLoader = nullptr;
602 if (!m_frame->host()) 664 if (!m_frame->host())
603 return; 665 return;
604 } 666 }
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 KeyboardEvent* keyEvent = toKeyboardEvent(event); 811 KeyboardEvent* keyEvent = toKeyboardEvent(event);
750 navigationPolicyFromMouseEvent(0, keyEvent->ctrlKey(), keyEvent->shiftKe y(), keyEvent->altKey(), keyEvent->metaKey(), &policy); 812 navigationPolicyFromMouseEvent(0, keyEvent->ctrlKey(), keyEvent->shiftKe y(), keyEvent->altKey(), keyEvent->metaKey(), &policy);
751 } else if (event->isGestureEvent()) { 813 } else if (event->isGestureEvent()) {
752 // The click is simulated when triggering the gesture-tap event 814 // The click is simulated when triggering the gesture-tap event
753 GestureEvent* gestureEvent = toGestureEvent(event); 815 GestureEvent* gestureEvent = toGestureEvent(event);
754 navigationPolicyFromMouseEvent(0, gestureEvent->ctrlKey(), gestureEvent- >shiftKey(), gestureEvent->altKey(), gestureEvent->metaKey(), &policy); 816 navigationPolicyFromMouseEvent(0, gestureEvent->ctrlKey(), gestureEvent- >shiftKey(), gestureEvent->altKey(), gestureEvent->metaKey(), &policy);
755 } 817 }
756 return policy; 818 return policy;
757 } 819 }
758 820
759 void FrameLoader::load(const FrameLoadRequest& passedRequest) 821 void FrameLoader::load(const FrameLoadRequest& passedRequest, FrameLoadType fram eLoadType,
822 HistoryItem* historyItem)
760 { 823 {
761 ASSERT(m_frame->document()); 824 ASSERT(m_frame->document());
762 825
763 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get()); 826 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get());
764 827
765 if (m_inStopAllLoaders) 828 if (m_inStopAllLoaders)
766 return; 829 return;
767 830
831 if (m_frame->page()->defersLoading() && isBackForwardLoadType(frameLoadType) ) {
832 m_deferredHistoryLoad = DeferredHistoryLoad(
833 passedRequest.resourceRequest(), historyItem, frameLoadType);
834 return;
835 }
836
768 FrameLoadRequest request(passedRequest); 837 FrameLoadRequest request(passedRequest);
769 request.resourceRequest().setHasUserGesture(UserGestureIndicator::processing UserGesture());
770
771 if (!prepareRequestForThisFrame(request)) 838 if (!prepareRequestForThisFrame(request))
772 return; 839 return;
773 840
841 if (isBackForwardLoadType(frameLoadType)) {
842 ASSERT(historyItem);
843 m_provisionalItem = historyItem;
844 }
845
774 RefPtrWillBeRawPtr<LocalFrame> targetFrame = toLocalFrame(request.form() ? n ullptr : m_frame->findFrameForNavigation(AtomicString(request.frameName()), *m_f rame)); 846 RefPtrWillBeRawPtr<LocalFrame> targetFrame = toLocalFrame(request.form() ? n ullptr : m_frame->findFrameForNavigation(AtomicString(request.frameName()), *m_f rame));
847 request.resourceRequest().setHasUserGesture(UserGestureIndicator::processing UserGesture());
Nate Chapin 2015/05/27 16:54:34 Why move this?
clamy 2015/05/29 14:41:50 Done.
775 if (targetFrame && targetFrame.get() != m_frame) { 848 if (targetFrame && targetFrame.get() != m_frame) {
776 bool wasInSamePage = targetFrame->page() == m_frame->page(); 849 bool wasInSamePage = targetFrame->page() == m_frame->page();
777 850
778 request.setFrameName("_self"); 851 request.setFrameName("_self");
779 targetFrame->loader().load(request); 852 targetFrame->loader().load(request);
780 Page* page = targetFrame->page(); 853 Page* page = targetFrame->page();
781 if (!wasInSamePage && page) 854 if (!wasInSamePage && page)
782 page->chrome().focus(); 855 page->chrome().focus();
783 return; 856 return;
784 } 857 }
785 858
786 setReferrerForFrameRequest(request.resourceRequest(), request.shouldSendRefe rrer(), request.originDocument()); 859 setReferrerForFrameRequest(request.resourceRequest(), request.shouldSendRefe rrer(), request.originDocument());
787 860
788 FrameLoadType newLoadType = determineFrameLoadType(request); 861 FrameLoadType newLoadType = frameLoadType;
Nate Chapin 2015/05/27 16:54:34 FrameLoadType newLoadType = (frameLoadType == Fram
clamy 2015/05/29 14:41:50 Done.
862 if (newLoadType == FrameLoadTypeStandard)
863 newLoadType = determineFrameLoadType(request);
789 NavigationPolicy policy = navigationPolicyForRequest(request); 864 NavigationPolicy policy = navigationPolicyForRequest(request);
790 if (shouldOpenInNewWindow(targetFrame.get(), request, policy)) { 865 if (shouldOpenInNewWindow(targetFrame.get(), request, policy)) {
791 if (policy == NavigationPolicyDownload) { 866 if (policy == NavigationPolicyDownload) {
792 client()->loadURLExternally(request.resourceRequest(), NavigationPol icyDownload); 867 client()->loadURLExternally(request.resourceRequest(), NavigationPol icyDownload);
793 } else { 868 } else {
794 request.resourceRequest().setFrameType(WebURLRequest::FrameTypeAuxil iary); 869 request.resourceRequest().setFrameType(WebURLRequest::FrameTypeAuxil iary);
795 createWindowForRequest(request, *m_frame, policy, request.shouldSend Referrer()); 870 createWindowForRequest(request, *m_frame, policy, request.shouldSend Referrer());
796 } 871 }
797 return; 872 return;
798 } 873 }
799 874
800 const KURL& url = request.resourceRequest().url(); 875 const KURL& url = request.resourceRequest().url();
801 if (policy == NavigationPolicyCurrentTab && shouldPerformFragmentNavigation( request.form(), request.resourceRequest().httpMethod(), newLoadType, url)) { 876
877 // Perform history same document navigation.
878 if (newLoadType == FrameLoadTypeHistorySameDocument) {
879 ASSERT(historyItem);
880 loadInSameDocument(url, historyItem->stateObject(), newLoadType, NotClie ntRedirect);
881 restoreScrollPositionAndViewState();
882 return;
883 }
884
885 // Perform non-history same document navigation.
886 if ((policy == NavigationPolicyCurrentTab && newLoadType != FrameLoadTypeRel oadFromOrigin
Nate Chapin 2015/05/27 16:54:34 Add the FrameLoadTypeReloadFromOrigin case to shou
clamy 2015/05/29 14:41:50 Done.
887 && shouldPerformFragmentNavigation(request.form(), request.resourceReque st().httpMethod(), newLoadType, url))) {
802 m_documentLoader->setNavigationType(determineNavigationType(newLoadType, false, request.triggeringEvent())); 888 m_documentLoader->setNavigationType(determineNavigationType(newLoadType, false, request.triggeringEvent()));
803 if (shouldTreatURLAsSameAsCurrent(url)) 889 if (shouldTreatURLAsSameAsCurrent(url))
804 newLoadType = FrameLoadTypeRedirectWithLockedBackForwardList; 890 newLoadType = FrameLoadTypeRedirectWithLockedBackForwardList;
805 loadInSameDocument(url, nullptr, newLoadType, request.clientRedirect()); 891 loadInSameDocument(url, nullptr, newLoadType, request.clientRedirect());
806 return; 892 return;
807 } 893 }
894
895 // Perform navigation to a different document.
808 bool sameURL = url == m_documentLoader->urlForHistory(); 896 bool sameURL = url == m_documentLoader->urlForHistory();
809 startLoad(request, newLoadType, policy); 897 startLoad(request, newLoadType, policy);
898
810 // Example of this case are sites that reload the same URL with a different cookie 899 // Example of this case are sites that reload the same URL with a different cookie
811 // driving the generated content, or a master frame with links that drive a target 900 // driving the generated content, or a master frame with links that drive a target
812 // frame, where the user has clicked on the same link repeatedly. 901 // frame, where the user has clicked on the same link repeatedly.
813 if (sameURL && newLoadType != FrameLoadTypeReload && newLoadType != FrameLoa dTypeReloadFromOrigin && request.resourceRequest().httpMethod() != "POST") 902 if (sameURL
903 && isBackForwardLoadType(frameLoadType)
Nate Chapin 2015/05/27 16:54:34 Why this change?
clamy 2015/05/29 14:41:50 Actually I meant to write !isBackForwardLoadType(f
904 && newLoadType != FrameLoadTypeReload
905 && newLoadType != FrameLoadTypeReloadFromOrigin
906 && request.resourceRequest().httpMethod() != "POST") {
814 m_loadType = FrameLoadTypeSame; 907 m_loadType = FrameLoadTypeSame;
908 }
815 } 909 }
816 910
817 SubstituteData FrameLoader::defaultSubstituteDataForURL(const KURL& url) 911 SubstituteData FrameLoader::defaultSubstituteDataForURL(const KURL& url)
818 { 912 {
819 if (!shouldTreatURLAsSrcdocDocument(url)) 913 if (!shouldTreatURLAsSrcdocDocument(url))
820 return SubstituteData(); 914 return SubstituteData();
821 String srcdoc = m_frame->deprecatedLocalOwner()->fastGetAttribute(srcdocAttr ); 915 String srcdoc = m_frame->deprecatedLocalOwner()->fastGetAttribute(srcdocAttr );
822 ASSERT(!srcdoc.isNull()); 916 ASSERT(!srcdoc.isNull());
823 CString encodedSrcdoc = srcdoc.utf8(); 917 CString encodedSrcdoc = srcdoc.utf8();
824 return SubstituteData(SharedBuffer::create(encodedSrcdoc.data(), encodedSrcd oc.length()), "text/html", "UTF-8", KURL()); 918 return SubstituteData(SharedBuffer::create(encodedSrcdoc.data(), encodedSrcd oc.length()), "text/html", "UTF-8", KURL());
825 } 919 }
826 920
827 void FrameLoader::reportLocalLoadFailed(LocalFrame* frame, const String& url) 921 void FrameLoader::reportLocalLoadFailed(LocalFrame* frame, const String& url)
828 { 922 {
829 ASSERT(!url.isEmpty()); 923 ASSERT(!url.isEmpty());
830 if (!frame) 924 if (!frame)
831 return; 925 return;
832 926
833 frame->document()->addConsoleMessage(ConsoleMessage::create(SecurityMessageS ource, ErrorMessageLevel, "Not allowed to load local resource: " + url)); 927 frame->document()->addConsoleMessage(ConsoleMessage::create(SecurityMessageS ource, ErrorMessageLevel, "Not allowed to load local resource: " + url));
834 } 928 }
835 929
836 // static
837 ResourceRequest FrameLoader::requestFromHistoryItem(HistoryItem* item, ResourceR equestCachePolicy cachePolicy)
838 {
839 RefPtr<FormData> formData = item->formData();
840 ResourceRequest request(item->url());
841 request.setHTTPReferrer(item->referrer());
842 request.setCachePolicy(cachePolicy);
843 if (formData) {
844 request.setHTTPMethod("POST");
845 request.setHTTPBody(formData);
846 request.setHTTPContentType(item->formContentType());
847 RefPtr<SecurityOrigin> securityOrigin = SecurityOrigin::createFromString (item->referrer().referrer);
848 request.addHTTPOriginIfNeeded(securityOrigin->toAtomicString());
849 }
850 return request;
851 }
852
853 void FrameLoader::reload(ReloadPolicy reloadPolicy, const KURL& overrideURL, Cli entRedirectPolicy clientRedirectPolicy)
854 {
855 if (!m_currentItem)
856 return;
857
858 ResourceRequestCachePolicy cachePolicy = reloadPolicy == EndToEndReload ? Re loadBypassingCache : ReloadIgnoringCacheData;
859 ResourceRequest request = requestFromHistoryItem(m_currentItem.get(), cacheP olicy);
860
861 // ClientRedirectPolicy is an indication that this load was triggered by
862 // some direct interaction with the page. If this reload is not a client
863 // redirect, we should reuse the referrer from the original load of the
864 // current document. If this reload is a client redirect (e.g., location.rel oad()),
865 // it was initiated by something in the current document and should
866 // therefore show the current document's url as the referrer.
867 if (clientRedirectPolicy == ClientRedirect)
868 request.setHTTPReferrer(Referrer(m_frame->document()->outgoingReferrer() , m_frame->document()->referrerPolicy()));
869
870 if (!overrideURL.isEmpty()) {
871 request.setURL(overrideURL);
872 request.clearHTTPReferrer();
873 }
874 request.setSkipServiceWorker(reloadPolicy == EndToEndReload);
875 FrameLoadRequest frameLoadRequest(nullptr, request);
876 frameLoadRequest.setClientRedirect(clientRedirectPolicy);
877 startLoad(frameLoadRequest, reloadPolicy == EndToEndReload ? FrameLoadTypeRe loadFromOrigin : FrameLoadTypeReload, NavigationPolicyCurrentTab);
878 }
879
880 void FrameLoader::stopAllLoaders() 930 void FrameLoader::stopAllLoaders()
881 { 931 {
882 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal) 932 if (m_frame->document()->pageDismissalEventBeingDispatched() != Document::No Dismissal)
883 return; 933 return;
884 934
885 // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. 935 // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this.
886 if (m_inStopAllLoaders) 936 if (m_inStopAllLoaders)
887 return; 937 return;
888 938
889 // Calling stopLoading() on the provisional document loader can blow away 939 // Calling stopLoading() on the provisional document loader can blow away
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 1175
1126 bool FrameLoader::shouldPerformFragmentNavigation(bool isFormSubmission, const S tring& httpMethod, FrameLoadType loadType, const KURL& url) 1176 bool FrameLoader::shouldPerformFragmentNavigation(bool isFormSubmission, const S tring& httpMethod, FrameLoadType loadType, const KURL& url)
1127 { 1177 {
1128 ASSERT(loadType != FrameLoadTypeReloadFromOrigin); 1178 ASSERT(loadType != FrameLoadTypeReloadFromOrigin);
1129 // We don't do this if we are submitting a form with method other than "GET" , explicitly reloading, 1179 // We don't do this if we are submitting a form with method other than "GET" , explicitly reloading,
1130 // currently displaying a frameset, or if the URL does not have a fragment. 1180 // currently displaying a frameset, or if the URL does not have a fragment.
1131 return (!isFormSubmission || equalIgnoringCase(httpMethod, "GET")) 1181 return (!isFormSubmission || equalIgnoringCase(httpMethod, "GET"))
1132 && loadType != FrameLoadTypeReload 1182 && loadType != FrameLoadTypeReload
1133 && loadType != FrameLoadTypeSame 1183 && loadType != FrameLoadTypeSame
1134 && loadType != FrameLoadTypeBackForward 1184 && loadType != FrameLoadTypeBackForward
1185 && loadType != FrameLoadTypeHistorySameDocument
1135 && url.hasFragmentIdentifier() 1186 && url.hasFragmentIdentifier()
1136 && equalIgnoringFragmentIdentifier(m_frame->document()->url(), url) 1187 && equalIgnoringFragmentIdentifier(m_frame->document()->url(), url)
1137 // We don't want to just scroll if a link from within a 1188 // We don't want to just scroll if a link from within a
1138 // frameset is trying to reload the frameset into _top. 1189 // frameset is trying to reload the frameset into _top.
1139 && !m_frame->document()->isFrameSet(); 1190 && !m_frame->document()->isFrameSet();
1140 } 1191 }
1141 1192
1142 void FrameLoader::scrollToFragmentWithParentBoundary(const KURL& url) 1193 void FrameLoader::scrollToFragmentWithParentBoundary(const KURL& url)
1143 { 1194 {
1144 FrameView* view = m_frame->view(); 1195 FrameView* view = m_frame->view();
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 bool FrameLoader::shouldTreatURLAsSrcdocDocument(const KURL& url) const 1379 bool FrameLoader::shouldTreatURLAsSrcdocDocument(const KURL& url) const
1329 { 1380 {
1330 if (!equalIgnoringCase(url.string(), "about:srcdoc")) 1381 if (!equalIgnoringCase(url.string(), "about:srcdoc"))
1331 return false; 1382 return false;
1332 HTMLFrameOwnerElement* ownerElement = m_frame->deprecatedLocalOwner(); 1383 HTMLFrameOwnerElement* ownerElement = m_frame->deprecatedLocalOwner();
1333 if (!isHTMLIFrameElement(ownerElement)) 1384 if (!isHTMLIFrameElement(ownerElement))
1334 return false; 1385 return false;
1335 return ownerElement->fastHasAttribute(srcdocAttr); 1386 return ownerElement->fastHasAttribute(srcdocAttr);
1336 } 1387 }
1337 1388
1338 void FrameLoader::loadHistoryItem(HistoryItem* item, FrameLoadType frameLoadType , HistoryLoadType historyLoadType, ResourceRequestCachePolicy cachePolicy)
1339 {
1340 RefPtrWillBeRawPtr<LocalFrame> protect(m_frame.get());
1341 if (m_frame->page()->defersLoading()) {
1342 m_deferredHistoryLoad = DeferredHistoryLoad(item, historyLoadType, cache Policy);
1343 return;
1344 }
1345
1346 m_provisionalItem = item;
1347 if (historyLoadType == HistorySameDocumentLoad) {
1348 loadInSameDocument(item->url(), item->stateObject(), frameLoadType, NotC lientRedirect);
1349 restoreScrollPositionAndViewState();
1350 return;
1351 }
1352 FrameLoadRequest request(nullptr, requestFromHistoryItem(item, cachePolicy)) ;
1353 startLoad(request, frameLoadType, NavigationPolicyCurrentTab);
1354 }
1355
1356 void FrameLoader::dispatchDocumentElementAvailable() 1389 void FrameLoader::dispatchDocumentElementAvailable()
1357 { 1390 {
1358 client()->documentElementAvailable(); 1391 client()->documentElementAvailable();
1359 } 1392 }
1360 1393
1361 void FrameLoader::dispatchDidClearDocumentOfWindowObject() 1394 void FrameLoader::dispatchDidClearDocumentOfWindowObject()
1362 { 1395 {
1363 if (!m_frame->script().canExecuteScripts(NotAboutToExecuteScript)) 1396 if (!m_frame->script().canExecuteScripts(NotAboutToExecuteScript))
1364 return; 1397 return;
1365 1398
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1429 // FIXME: We need a way to propagate insecure requests policy flags to 1462 // FIXME: We need a way to propagate insecure requests policy flags to
1430 // out-of-process frames. For now, we'll always use default behavior. 1463 // out-of-process frames. For now, we'll always use default behavior.
1431 if (!parentFrame->isLocalFrame()) 1464 if (!parentFrame->isLocalFrame())
1432 return nullptr; 1465 return nullptr;
1433 1466
1434 ASSERT(toLocalFrame(parentFrame)->document()); 1467 ASSERT(toLocalFrame(parentFrame)->document());
1435 return toLocalFrame(parentFrame)->document()->insecureNavigationsToUpgrade() ; 1468 return toLocalFrame(parentFrame)->document()->insecureNavigationsToUpgrade() ;
1436 } 1469 }
1437 1470
1438 } // namespace blink 1471 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698