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