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