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

Side by Side Diff: third_party/WebKit/Source/core/loader/DocumentLoader.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 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
3 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * Copyright (C) 2011 Google Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 8 *
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 13 matching lines...) Expand all
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */ 28 */
29 29
30 #include "core/loader/DocumentLoader.h" 30 #include "core/loader/DocumentLoader.h"
31 31
32 #include <memory> 32 #include <memory>
33 #include "core/dom/Document.h" 33 #include "core/dom/Document.h"
34 #include "core/dom/DocumentParser.h"
34 #include "core/dom/WeakIdentifierMap.h" 35 #include "core/dom/WeakIdentifierMap.h"
35 #include "core/events/Event.h" 36 #include "core/events/Event.h"
36 #include "core/frame/Deprecation.h" 37 #include "core/frame/Deprecation.h"
37 #include "core/frame/FrameHost.h" 38 #include "core/frame/FrameHost.h"
38 #include "core/frame/LocalDOMWindow.h" 39 #include "core/frame/LocalDOMWindow.h"
39 #include "core/frame/LocalFrame.h" 40 #include "core/frame/LocalFrame.h"
40 #include "core/frame/LocalFrameClient.h" 41 #include "core/frame/LocalFrameClient.h"
41 #include "core/frame/Settings.h" 42 #include "core/frame/Settings.h"
42 #include "core/frame/csp/ContentSecurityPolicy.h" 43 #include "core/frame/csp/ContentSecurityPolicy.h"
43 #include "core/html/HTMLFrameOwnerElement.h" 44 #include "core/html/HTMLFrameOwnerElement.h"
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 DCHECK(!m_frame); 152 DCHECK(!m_frame);
152 DCHECK(!m_mainResource); 153 DCHECK(!m_mainResource);
153 DCHECK(!m_applicationCacheHost); 154 DCHECK(!m_applicationCacheHost);
154 DCHECK_EQ(m_state, SentDidFinishLoad); 155 DCHECK_EQ(m_state, SentDidFinishLoad);
155 } 156 }
156 157
157 DEFINE_TRACE(DocumentLoader) { 158 DEFINE_TRACE(DocumentLoader) {
158 visitor->trace(m_frame); 159 visitor->trace(m_frame);
159 visitor->trace(m_fetcher); 160 visitor->trace(m_fetcher);
160 visitor->trace(m_mainResource); 161 visitor->trace(m_mainResource);
162 visitor->trace(m_historyItem);
161 visitor->trace(m_writer); 163 visitor->trace(m_writer);
162 visitor->trace(m_subresourceFilter); 164 visitor->trace(m_subresourceFilter);
163 visitor->trace(m_documentLoadTiming); 165 visitor->trace(m_documentLoadTiming);
164 visitor->trace(m_applicationCacheHost); 166 visitor->trace(m_applicationCacheHost);
165 visitor->trace(m_contentSecurityPolicy); 167 visitor->trace(m_contentSecurityPolicy);
166 RawResourceClient::trace(visitor); 168 RawResourceClient::trace(visitor);
167 } 169 }
168 170
169 unsigned long DocumentLoader::mainResourceIdentifier() const { 171 unsigned long DocumentLoader::mainResourceIdentifier() const {
170 return m_mainResource ? m_mainResource->identifier() : 0; 172 return m_mainResource ? m_mainResource->identifier() : 0;
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 } 268 }
267 269
268 void DocumentLoader::didObserveLoadingBehavior( 270 void DocumentLoader::didObserveLoadingBehavior(
269 WebLoadingBehaviorFlag behavior) { 271 WebLoadingBehaviorFlag behavior) {
270 if (m_frame) { 272 if (m_frame) {
271 DCHECK_GE(m_state, Committed); 273 DCHECK_GE(m_state, Committed);
272 localFrameClient().didObserveLoadingBehavior(behavior); 274 localFrameClient().didObserveLoadingBehavior(behavior);
273 } 275 }
274 } 276 }
275 277
278 static HistoryCommitType loadTypeToCommitType(FrameLoadType type) {
279 switch (type) {
280 case FrameLoadTypeStandard:
281 return StandardCommit;
282 case FrameLoadTypeInitialInChildFrame:
283 case FrameLoadTypeInitialHistoryLoad:
284 return InitialCommitInChildFrame;
285 case FrameLoadTypeBackForward:
286 return BackForwardCommit;
287 default:
288 break;
289 }
290 return HistoryInertCommit;
291 }
292
276 void DocumentLoader::updateForSameDocumentNavigation( 293 void DocumentLoader::updateForSameDocumentNavigation(
277 const KURL& newURL, 294 const KURL& newURL,
278 SameDocumentNavigationSource sameDocumentNavigationSource) { 295 SameDocumentNavigationSource sameDocumentNavigationSource,
296 PassRefPtr<SerializedScriptValue> data,
297 HistoryScrollRestorationType scrollRestorationType,
298 FrameLoadType type,
299 Document* initiatingDocument) {
300 if (m_frame->settings()->getHistoryEntryRequiresUserGesture() &&
301 initiatingDocument &&
302 !initiatingDocument->frame()->hasReceivedUserGesture()) {
303 type = FrameLoadTypeReplaceCurrentItem;
304 }
305
279 KURL oldURL = m_request.url(); 306 KURL oldURL = m_request.url();
280 m_originalRequest.setURL(newURL); 307 m_originalRequest.setURL(newURL);
281 m_request.setURL(newURL); 308 m_request.setURL(newURL);
309 setReplacesCurrentHistoryItem(type != FrameLoadTypeStandard);
282 if (sameDocumentNavigationSource == SameDocumentNavigationHistoryApi) { 310 if (sameDocumentNavigationSource == SameDocumentNavigationHistoryApi) {
283 m_request.setHTTPMethod(HTTPNames::GET); 311 m_request.setHTTPMethod(HTTPNames::GET);
284 m_request.setHTTPBody(nullptr); 312 m_request.setHTTPBody(nullptr);
285 } 313 }
286 clearRedirectChain(); 314 clearRedirectChain();
287 if (m_isClientRedirect) 315 if (m_isClientRedirect)
288 appendRedirect(oldURL); 316 appendRedirect(oldURL);
289 appendRedirect(newURL); 317 appendRedirect(newURL);
318
319 setHistoryItemStateForCommit(
320 m_historyItem.get(), type,
321 sameDocumentNavigationSource == SameDocumentNavigationHistoryApi
322 ? HistoryNavigationType::HistoryApi
323 : HistoryNavigationType::Fragment);
324 m_historyItem->setDocumentState(m_frame->document()->formElementsState());
Nate Chapin 2017/03/27 21:02:01 This was in FrameLoader::setHistoryItemStateForCom
325 if (sameDocumentNavigationSource == SameDocumentNavigationHistoryApi) {
326 m_historyItem->setStateObject(std::move(data));
327 m_historyItem->setScrollRestorationType(scrollRestorationType);
328 }
329 localFrameClient().dispatchDidNavigateWithinPage(
330 m_historyItem.get(), loadTypeToCommitType(type), initiatingDocument);
290 } 331 }
291 332
292 const KURL& DocumentLoader::urlForHistory() const { 333 const KURL& DocumentLoader::urlForHistory() const {
293 return unreachableURL().isEmpty() ? url() : unreachableURL(); 334 return unreachableURL().isEmpty() ? url() : unreachableURL();
294 } 335 }
295 336
296 void DocumentLoader::commitIfReady() { 337 void DocumentLoader::setHistoryItemStateForCommit(
297 if (m_state < Committed) { 338 HistoryItem* oldItem,
298 m_state = Committed; 339 FrameLoadType loadType,
299 frameLoader().commitProvisionalLoad(); 340 HistoryNavigationType navigationType) {
341 if (!m_historyItem || !isBackForwardLoadType(loadType))
342 m_historyItem = HistoryItem::create();
343
344 m_historyItem->setURL(urlForHistory());
345 m_historyItem->setReferrer(SecurityPolicy::generateReferrer(
346 m_request.getReferrerPolicy(), m_historyItem->url(),
347 m_request.httpReferrer()));
348 m_historyItem->setFormInfoFromRequest(m_request);
349
350 // Don't propagate state from the old item to the new item if there isn't an
351 // old item (obviously), or if this is a back/forward navigation, since we
352 // explicitly want to restore the state we just committed.
353 if (!oldItem || isBackForwardLoadType(loadType))
354 return;
355 // Don't propagate state from the old item if this is a different-document
356 // navigation, unless the before and after pages are logically related. This
357 // means they have the same url (ignoring fragment) and the new item was
358 // loaded via reload or client redirect.
359 HistoryCommitType historyCommitType = loadTypeToCommitType(loadType);
360 if (navigationType == HistoryNavigationType::DifferentDocument &&
361 (historyCommitType != HistoryInertCommit ||
362 !equalIgnoringFragmentIdentifier(oldItem->url(), m_historyItem->url())))
363 return;
364 m_historyItem->setDocumentSequenceNumber(oldItem->documentSequenceNumber());
365 m_historyItem->setScrollOffset(oldItem->getScrollOffset());
366 m_historyItem->setDidSaveScrollOrScaleState(
367 oldItem->didSaveScrollOrScaleState());
368 m_historyItem->setVisualViewportScrollOffset(
369 oldItem->visualViewportScrollOffset());
370 m_historyItem->setPageScaleFactor(oldItem->pageScaleFactor());
371 m_historyItem->setScrollRestorationType(oldItem->scrollRestorationType());
372
373 // The item sequence number determines whether items are "the same", such
374 // back/forward navigation between items with the same item sequence number is
375 // a no-op. Only treat this as identical if the navigation did not create a
376 // back/forward entry and the url is identical or it was loaded via
377 // history.replaceState().
378 if (historyCommitType == HistoryInertCommit &&
379 (navigationType == HistoryNavigationType::HistoryApi ||
380 oldItem->url() == m_historyItem->url())) {
381 m_historyItem->setStateObject(oldItem->stateObject());
382 m_historyItem->setItemSequenceNumber(oldItem->itemSequenceNumber());
300 } 383 }
301 } 384 }
302 385
303 void DocumentLoader::notifyFinished(Resource* resource) { 386 void DocumentLoader::notifyFinished(Resource* resource) {
304 DCHECK_EQ(m_mainResource, resource); 387 DCHECK_EQ(m_mainResource, resource);
305 DCHECK(m_mainResource); 388 DCHECK(m_mainResource);
306 389
307 if (!m_mainResource->errorOccurred() && !m_mainResource->wasCanceled()) { 390 if (!m_mainResource->errorOccurred() && !m_mainResource->wasCanceled()) {
308 finishedLoading(m_mainResource->loadFinishTime()); 391 finishedLoading(m_mainResource->loadFinishTime());
309 return; 392 return;
310 } 393 }
311 394
312 if (m_applicationCacheHost) 395 if (m_applicationCacheHost)
313 m_applicationCacheHost->failedLoadingMainResource(); 396 m_applicationCacheHost->failedLoadingMainResource();
314 397
315 if (m_mainResource->resourceError().wasBlockedByResponse()) { 398 if (m_mainResource->resourceError().wasBlockedByResponse()) {
316 probe::canceledAfterReceivedResourceResponse( 399 probe::canceledAfterReceivedResourceResponse(
317 m_frame, this, mainResourceIdentifier(), resource->response(), 400 m_frame, this, mainResourceIdentifier(), resource->response(),
318 m_mainResource.get()); 401 m_mainResource.get());
319 } 402 }
320 403
321 frameLoader().loadFailed(this, m_mainResource->resourceError()); 404 loadFailed(m_mainResource->resourceError());
322 clearMainResourceHandle(); 405 clearMainResourceHandle();
323 } 406 }
324 407
408 void DocumentLoader::loadFailed(const ResourceError& error) {
409 if (!error.isCancellation() && m_frame->owner()) {
410 // FIXME: For now, fallback content doesn't work cross process.
411 if (m_frame->owner()->isLocal())
412 m_frame->deprecatedLocalOwner()->renderFallbackContent();
413 }
414
415 HistoryCommitType historyCommitType = loadTypeToCommitType(m_loadType);
416 FrameLoader& loader = frameLoader();
417 if (m_state < Committed) {
418 if (m_state == NotStarted)
419 probe::frameClearedScheduledClientNavigation(m_frame);
420 m_state = SentDidFinishLoad;
421 localFrameClient().dispatchDidFailProvisionalLoad(error, historyCommitType);
422 if (!m_frame)
423 return;
424 loader.detachProvisionalDocumentLoader(this);
425 } else if (m_state == Committed) {
426 if (m_frame->document()->parser())
427 m_frame->document()->parser()->stopParsing();
428 m_state = SentDidFinishLoad;
429 localFrameClient().dispatchDidFailLoad(error, historyCommitType);
430 }
431 loader.checkCompleted();
432 }
433
325 void DocumentLoader::finishedLoading(double finishTime) { 434 void DocumentLoader::finishedLoading(double finishTime) {
326 DCHECK(m_frame->loader().stateMachine()->creatingInitialEmptyDocument() || 435 DCHECK(m_frame->loader().stateMachine()->creatingInitialEmptyDocument() ||
327 !m_frame->page()->suspended() || 436 !m_frame->page()->suspended() ||
328 MainThreadDebugger::instance()->isPaused()); 437 MainThreadDebugger::instance()->isPaused());
329 438
330 double responseEndTime = finishTime; 439 double responseEndTime = finishTime;
331 if (!responseEndTime) 440 if (!responseEndTime)
332 responseEndTime = m_timeOfLastDataReceived; 441 responseEndTime = m_timeOfLastDataReceived;
333 if (!responseEndTime) 442 if (!responseEndTime)
334 responseEndTime = monotonicallyIncreasingTime(); 443 responseEndTime = monotonicallyIncreasingTime();
335 timing().setResponseEnd(responseEndTime); 444 timing().setResponseEnd(responseEndTime);
336
337 commitIfReady();
Nate Chapin 2017/03/27 21:02:01 The equivalent of commitIfReady() now happens in e
338 if (!m_frame)
339 return;
340
341 if (!maybeCreateArchive()) { 445 if (!maybeCreateArchive()) {
342 // If this is an empty document, it will not have actually been created yet. 446 // If this is an empty document, it will not have actually been created yet.
343 // Commit dummy data so that DocumentWriter::begin() gets called and creates 447 // Commit dummy data so that DocumentWriter::begin() gets called and creates
344 // the Document. 448 // the Document.
345 if (!m_writer) 449 if (!m_writer)
346 commitData(0, 0); 450 commitData(0, 0);
347 } 451 }
348 452
349 if (!m_frame) 453 if (!m_frame)
350 return; 454 return;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 m_navigationType, NavigationPolicyCurrentTab, m_loadType, 495 m_navigationType, NavigationPolicyCurrentTab, m_loadType,
392 isClientRedirect(), nullptr) != NavigationPolicyCurrentTab) { 496 isClientRedirect(), nullptr) != NavigationPolicyCurrentTab) {
393 m_fetcher->stopFetching(); 497 m_fetcher->stopFetching();
394 return false; 498 return false;
395 } 499 }
396 500
397 DCHECK(timing().fetchStart()); 501 DCHECK(timing().fetchStart());
398 appendRedirect(requestURL); 502 appendRedirect(requestURL);
399 timing().addRedirect(redirectResponse.url(), requestURL); 503 timing().addRedirect(redirectResponse.url(), requestURL);
400 504
401 // If a redirection happens during a back/forward navigation, don't restore 505 // If a redirection happens during a back/forward navigation, don't restore
yhirano 2017/03/29 09:38:13 Is this comment still valid?
Nate Chapin 2017/03/29 18:23:06 Yes, this is the same behavior as before.
402 // any state from the old HistoryItem. There is a provisional history item for 506 // any state from the old HistoryItem. There is a provisional history item for
403 // back/forward navigation only. In the other case, clearing it is a no-op. 507 // back/forward navigation only. In the other case, clearing it is a no-op.
404 frameLoader().clearProvisionalHistoryItem(); 508 m_historyItem.clear();
405 509
406 localFrameClient().dispatchDidReceiveServerRedirectForProvisionalLoad(); 510 localFrameClient().dispatchDidReceiveServerRedirectForProvisionalLoad();
407 511
408 return true; 512 return true;
409 } 513 }
410 514
411 static bool canShowMIMEType(const String& mimeType, LocalFrame* frame) { 515 static bool canShowMIMEType(const String& mimeType, LocalFrame* frame) {
412 if (MIMETypeRegistry::isSupportedMIMEType(mimeType)) 516 if (MIMETypeRegistry::isSupportedMIMEType(mimeType))
413 return true; 517 return true;
414 PluginData* pluginData = frame->pluginData(); 518 PluginData* pluginData = frame->pluginData();
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 if (m_frame->owner() && m_response.isHTTP() && 644 if (m_frame->owner() && m_response.isHTTP() &&
541 !FetchUtils::isOkStatus(m_response.httpStatusCode())) 645 !FetchUtils::isOkStatus(m_response.httpStatusCode()))
542 m_frame->owner()->renderFallbackContent(); 646 m_frame->owner()->renderFallbackContent();
543 } 647 }
544 648
545 void DocumentLoader::ensureWriter(const AtomicString& mimeType, 649 void DocumentLoader::ensureWriter(const AtomicString& mimeType,
546 const KURL& overridingURL) { 650 const KURL& overridingURL) {
547 if (m_writer) 651 if (m_writer)
548 return; 652 return;
549 653
654 // Set history state before commitProvisionalLoad() so that we still have
655 // access to the previous committed DocumentLoader's HistoryItem, in case we
656 // need to copy state from it.
657 if (!frameLoader().stateMachine()->creatingInitialEmptyDocument()) {
658 setHistoryItemStateForCommit(frameLoader().documentLoader()->historyItem(),
659 m_loadType,
660 HistoryNavigationType::DifferentDocument);
661 }
662
663 DCHECK_EQ(m_state, Provisional);
664 frameLoader().commitProvisionalLoad();
665 if (!m_frame)
666 return;
667
550 const AtomicString& encoding = response().textEncodingName(); 668 const AtomicString& encoding = response().textEncodingName();
551 669
552 // Prepare a DocumentInit before clearing the frame, because it may need to 670 // Prepare a DocumentInit before clearing the frame, because it may need to
553 // inherit an aliased security context. 671 // inherit an aliased security context.
554 Document* owner = nullptr; 672 Document* owner = nullptr;
555 // TODO(dcheng): This differs from the behavior of both IE and Firefox: the 673 // TODO(dcheng): This differs from the behavior of both IE and Firefox: the
556 // origin is inherited from the document that loaded the URL. 674 // origin is inherited from the document that loaded the URL.
557 if (shouldInheritSecurityOriginFromOwner(url())) { 675 if (shouldInheritSecurityOriginFromOwner(url())) {
558 Frame* ownerFrame = m_frame->tree().parent(); 676 Frame* ownerFrame = m_frame->tree().parent();
559 if (!ownerFrame) 677 if (!ownerFrame)
(...skipping 14 matching lines...) Expand all
574 installNewDocument(init, mimeType, encoding, 692 installNewDocument(init, mimeType, encoding,
575 InstallNewDocumentReason::kNavigation, parsingPolicy, 693 InstallNewDocumentReason::kNavigation, parsingPolicy,
576 overridingURL); 694 overridingURL);
577 m_writer->setDocumentWasLoadedAsPartOfNavigation(); 695 m_writer->setDocumentWasLoadedAsPartOfNavigation();
578 m_frame->document()->maybeHandleHttpRefresh( 696 m_frame->document()->maybeHandleHttpRefresh(
579 m_response.httpHeaderField(HTTPNames::Refresh), 697 m_response.httpHeaderField(HTTPNames::Refresh),
580 Document::HttpRefreshFromHeader); 698 Document::HttpRefreshFromHeader);
581 } 699 }
582 700
583 void DocumentLoader::commitData(const char* bytes, size_t length) { 701 void DocumentLoader::commitData(const char* bytes, size_t length) {
584 DCHECK_EQ(m_state, Committed);
585 ensureWriter(m_response.mimeType()); 702 ensureWriter(m_response.mimeType());
703 DCHECK_GE(m_state, Committed);
yhirano 2017/03/29 09:38:13 There are several early returns in FrameLoader::pr
Nate Chapin 2017/03/29 18:23:06 The early exits are the reason it's DCHECK_GE() in
586 704
587 // This can happen if document.close() is called by an event handler while 705 // This can happen if document.close() is called by an event handler while
588 // there's still pending incoming data. 706 // there's still pending incoming data.
589 if (m_frame && !m_frame->document()->parsing()) 707 if (!m_frame || !m_frame->document()->parsing())
590 return; 708 return;
591 709
592 if (length) 710 if (length)
593 m_dataReceived = true; 711 m_dataReceived = true;
594 712
595 m_writer->addData(bytes, length); 713 m_writer->addData(bytes, length);
596 } 714 }
597 715
598 void DocumentLoader::dataReceived(Resource* resource, 716 void DocumentLoader::dataReceived(Resource* resource,
599 const char* data, 717 const char* data,
(...skipping 30 matching lines...) Expand all
630 // All data has been consumed, so flush the buffer. 748 // All data has been consumed, so flush the buffer.
631 m_dataBuffer->clear(); 749 m_dataBuffer->clear();
632 } 750 }
633 751
634 void DocumentLoader::processData(const char* data, size_t length) { 752 void DocumentLoader::processData(const char* data, size_t length) {
635 m_applicationCacheHost->mainResourceDataReceived(data, length); 753 m_applicationCacheHost->mainResourceDataReceived(data, length);
636 m_timeOfLastDataReceived = monotonicallyIncreasingTime(); 754 m_timeOfLastDataReceived = monotonicallyIncreasingTime();
637 755
638 if (isArchiveMIMEType(response().mimeType())) 756 if (isArchiveMIMEType(response().mimeType()))
639 return; 757 return;
640 commitIfReady();
641 if (!m_frame)
642 return;
643 commitData(data, length); 758 commitData(data, length);
644 759
645 // If we are sending data to MediaDocument, we should stop here and cancel the 760 // If we are sending data to MediaDocument, we should stop here and cancel the
646 // request. 761 // request.
647 if (m_frame && m_frame->document()->isMediaDocument()) 762 if (m_frame && m_frame->document()->isMediaDocument())
648 m_fetcher->stopFetching(); 763 m_fetcher->stopFetching();
649 } 764 }
650 765
651 void DocumentLoader::clearRedirectChain() { 766 void DocumentLoader::clearRedirectChain() {
652 m_redirectChain.clear(); 767 m_redirectChain.clear();
653 } 768 }
654 769
655 void DocumentLoader::appendRedirect(const KURL& url) { 770 void DocumentLoader::appendRedirect(const KURL& url) {
656 m_redirectChain.push_back(url); 771 m_redirectChain.push_back(url);
657 } 772 }
658 773
659 void DocumentLoader::detachFromFrame() { 774 void DocumentLoader::detachFromFrame() {
660 DCHECK(m_frame); 775 DCHECK(m_frame);
661 776
662 // It never makes sense to have a document loader that is detached from its 777 // It never makes sense to have a document loader that is detached from its
663 // frame have any loads active, so go ahead and kill all the loads. 778 // frame have any loads active, so go ahead and kill all the loads.
664 m_fetcher->stopFetching(); 779 m_fetcher->stopFetching();
665 780
666 if (m_frame && !sentDidFinishLoad()) 781 if (m_frame && !sentDidFinishLoad())
667 frameLoader().loadFailed(this, ResourceError::cancelledError(url())); 782 loadFailed(ResourceError::cancelledError(url()));
668 783
669 // If that load cancellation triggered another detach, leave. 784 // If that load cancellation triggered another detach, leave.
670 // (fast/frames/detach-frame-nested-no-crash.html is an example of this.) 785 // (fast/frames/detach-frame-nested-no-crash.html is an example of this.)
671 if (!m_frame) 786 if (!m_frame)
672 return; 787 return;
673 788
674 m_fetcher->clearContext(); 789 m_fetcher->clearContext();
675 m_applicationCacheHost->detachFromDocumentLoader(); 790 m_applicationCacheHost->detachFromDocumentLoader();
676 m_applicationCacheHost.clear(); 791 m_applicationCacheHost.clear();
677 m_serviceWorkerNetworkProvider = nullptr; 792 m_serviceWorkerNetworkProvider = nullptr;
(...skipping 16 matching lines...) Expand all
694 return false; 809 return false;
695 810
696 DCHECK(m_mainResource); 811 DCHECK(m_mainResource);
697 ArchiveResource* mainResource = 812 ArchiveResource* mainResource =
698 m_fetcher->createArchive(m_mainResource.get()); 813 m_fetcher->createArchive(m_mainResource.get());
699 if (!mainResource) 814 if (!mainResource)
700 return false; 815 return false;
701 // The origin is the MHTML file, we need to set the base URL to the document 816 // The origin is the MHTML file, we need to set the base URL to the document
702 // encoded in the MHTML so relative URLs are resolved properly. 817 // encoded in the MHTML so relative URLs are resolved properly.
703 ensureWriter(mainResource->mimeType(), mainResource->url()); 818 ensureWriter(mainResource->mimeType(), mainResource->url());
819 if (!m_frame)
820 return false;
704 821
705 // The Document has now been created. 822 // The Document has now been created.
706 m_frame->document()->enforceSandboxFlags(SandboxAll); 823 m_frame->document()->enforceSandboxFlags(SandboxAll);
707 824
708 commitData(mainResource->data()->data(), mainResource->data()->size()); 825 commitData(mainResource->data()->data(), mainResource->data()->size());
709 return true; 826 return true;
710 } 827 }
711 828
712 const AtomicString& DocumentLoader::responseMIMEType() const { 829 const AtomicString& DocumentLoader::responseMIMEType() const {
713 return m_response.mimeType(); 830 return m_response.mimeType();
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 898
782 void DocumentLoader::endWriting() { 899 void DocumentLoader::endWriting() {
783 m_writer->end(); 900 m_writer->end();
784 m_writer.clear(); 901 m_writer.clear();
785 } 902 }
786 903
787 void DocumentLoader::didInstallNewDocument(Document* document) { 904 void DocumentLoader::didInstallNewDocument(Document* document) {
788 document->setReadyState(Document::Loading); 905 document->setReadyState(Document::Loading);
789 document->initContentSecurityPolicy(m_contentSecurityPolicy.release()); 906 document->initContentSecurityPolicy(m_contentSecurityPolicy.release());
790 907
791 frameLoader().didInstallNewDocument(); 908 if (m_historyItem && isBackForwardLoadType(m_loadType))
909 document->setStateForNewFormElements(m_historyItem->getDocumentState());
792 910
793 String suboriginHeader = m_response.httpHeaderField(HTTPNames::Suborigin); 911 String suboriginHeader = m_response.httpHeaderField(HTTPNames::Suborigin);
794 if (!suboriginHeader.isNull()) { 912 if (!suboriginHeader.isNull()) {
795 Vector<String> messages; 913 Vector<String> messages;
796 Suborigin suborigin; 914 Suborigin suborigin;
797 if (parseSuboriginHeader(suboriginHeader, &suborigin, messages)) 915 if (parseSuboriginHeader(suboriginHeader, &suborigin, messages))
798 document->enforceSuborigin(suborigin); 916 document->enforceSuborigin(suborigin);
799 917
800 for (auto& message : messages) { 918 for (auto& message : messages) {
801 document->addConsoleMessage( 919 document->addConsoleMessage(
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
836 UseCounter::count(*document, UseCounter::ReferrerPolicyHeader); 954 UseCounter::count(*document, UseCounter::ReferrerPolicyHeader);
837 document->parseAndSetReferrerPolicy(referrerPolicyHeader); 955 document->parseAndSetReferrerPolicy(referrerPolicyHeader);
838 } 956 }
839 957
840 localFrameClient().didCreateNewDocument(); 958 localFrameClient().didCreateNewDocument();
841 } 959 }
842 960
843 void DocumentLoader::didCommitNavigation() { 961 void DocumentLoader::didCommitNavigation() {
844 if (frameLoader().stateMachine()->creatingInitialEmptyDocument()) 962 if (frameLoader().stateMachine()->creatingInitialEmptyDocument())
845 return; 963 return;
846 frameLoader().receivedFirstData(); 964
965 localFrameClient().dispatchDidCommitLoad(m_historyItem.get(),
966 loadTypeToCommitType(m_loadType));
967
968 // When the embedder gets notified (above) that the new navigation has
969 // committed, the embedder will drop the old Content Security Policy and
970 // therefore now is a good time to report to the embedder the Content
971 // Security Policies that have accumulated so far for the new navigation.
972 m_frame->securityContext()->contentSecurityPolicy()->reportAccumulatedHeaders(
973 &localFrameClient());
974
975 if (!m_frame->loader().stateMachine()->committedMultipleRealLoads() &&
yhirano 2017/03/29 09:38:13 Can you tell my why you changed the calling order
Nate Chapin 2017/03/29 18:23:06 It was accidental, but when we update FrameLoaderS
976 m_loadType == FrameLoadTypeStandard) {
977 m_frame->loader().stateMachine()->advanceTo(
978 FrameLoaderStateMachine::CommittedMultipleRealLoads);
979 }
847 980
848 // didObserveLoadingBehavior() must be called after dispatchDidCommitLoad() is 981 // didObserveLoadingBehavior() must be called after dispatchDidCommitLoad() is
849 // called for the metrics tracking logic to handle it properly. 982 // called for the metrics tracking logic to handle it properly.
850 if (m_serviceWorkerNetworkProvider && 983 if (m_serviceWorkerNetworkProvider &&
851 m_serviceWorkerNetworkProvider->isControlledByServiceWorker()) { 984 m_serviceWorkerNetworkProvider->isControlledByServiceWorker()) {
852 localFrameClient().didObserveLoadingBehavior( 985 localFrameClient().didObserveLoadingBehavior(
853 WebLoadingBehaviorServiceWorkerControlled); 986 WebLoadingBehaviorServiceWorkerControlled);
854 } 987 }
855 988
856 // Links with media values need more information (like viewport information). 989 // Links with media values need more information (like viewport information).
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
945 InstallNewDocumentReason::kJavascriptURL, 1078 InstallNewDocumentReason::kJavascriptURL,
946 ForceSynchronousParsing, KURL()); 1079 ForceSynchronousParsing, KURL());
947 if (!source.isNull()) 1080 if (!source.isNull())
948 m_writer->appendReplacingData(source); 1081 m_writer->appendReplacingData(source);
949 endWriting(); 1082 endWriting();
950 } 1083 }
951 1084
952 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader); 1085 DEFINE_WEAK_IDENTIFIER_MAP(DocumentLoader);
953 1086
954 } // namespace blink 1087 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698