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

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

Issue 14264012: Create errors (especially cancellation errors) internally to WebCore, rather (Closed) Base URL: svn://svn.chromium.org/blink/trunk/
Patch Set: Created 7 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 | Annotate | Revision Log
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 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 return; 267 return;
268 } 268 }
269 269
270 // We might run in to infinite recursion if we're stopping loading as the re sult of 270 // We might run in to infinite recursion if we're stopping loading as the re sult of
271 // detaching from the frame, so break out of that recursion here. 271 // detaching from the frame, so break out of that recursion here.
272 // See <rdar://problem/9673866> for more details. 272 // See <rdar://problem/9673866> for more details.
273 if (m_isStopping) 273 if (m_isStopping)
274 return; 274 return;
275 275
276 m_isStopping = true; 276 m_isStopping = true;
277
278 FrameLoader* frameLoader = DocumentLoader::frameLoader();
279 277
280 if (isLoadingMainResource()) 278 if (isLoadingMainResource())
281 // Stop the main resource loader and let it send the cancelled message. 279 // Stop the main resource loader and let it send the cancelled message.
282 cancelMainResourceLoad(frameLoader->cancelledError(m_request)); 280 cancelMainResourceLoad(ResourceError::cancelledError(m_request.url()));
283 else if (!m_resourceLoaders.isEmpty()) 281 else if (!m_resourceLoaders.isEmpty())
284 // The main resource loader already finished loading. Set the cancelled error on the 282 // The main resource loader already finished loading. Set the cancelled error on the
285 // document and let the resourceLoaders send individual cancelled messag es below. 283 // document and let the resourceLoaders send individual cancelled messag es below.
286 setMainDocumentError(frameLoader->cancelledError(m_request)); 284 setMainDocumentError(ResourceError::cancelledError(m_request.url()));
287 else 285 else
288 // If there are no resource loaders, we need to manufacture a cancelled message. 286 // If there are no resource loaders, we need to manufacture a cancelled message.
289 // (A back/forward navigation has no resource loaders because its resour ces are cached.) 287 // (A back/forward navigation has no resource loaders because its resour ces are cached.)
290 mainReceivedError(frameLoader->cancelledError(m_request)); 288 mainReceivedError(ResourceError::cancelledError(m_request.url()));
291 289
292 stopLoadingSubresources(); 290 stopLoadingSubresources();
293 291
294 m_isStopping = false; 292 m_isStopping = false;
295 } 293 }
296 294
297 void DocumentLoader::commitIfReady() 295 void DocumentLoader::commitIfReady()
298 { 296 {
299 if (!m_committed) { 297 if (!m_committed) {
300 m_committed = true; 298 m_committed = true;
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 445
448 void DocumentLoader::willSendRequest(ResourceRequest& newRequest, const Resource Response& redirectResponse) 446 void DocumentLoader::willSendRequest(ResourceRequest& newRequest, const Resource Response& redirectResponse)
449 { 447 {
450 // Note that there are no asserts here as there are for the other callbacks. This is due to the 448 // Note that there are no asserts here as there are for the other callbacks. This is due to the
451 // fact that this "callback" is sent when starting every load, and the state of callback 449 // fact that this "callback" is sent when starting every load, and the state of callback
452 // deferrals plays less of a part in this function in preventing the bad beh avior deferring 450 // deferrals plays less of a part in this function in preventing the bad beh avior deferring
453 // callbacks is meant to prevent. 451 // callbacks is meant to prevent.
454 ASSERT(!newRequest.isNull()); 452 ASSERT(!newRequest.isNull());
455 453
456 if (!frameLoader()->checkIfFormActionAllowedByCSP(newRequest.url())) { 454 if (!frameLoader()->checkIfFormActionAllowedByCSP(newRequest.url())) {
457 cancelMainResourceLoad(frameLoader()->cancelledError(newRequest)); 455 cancelMainResourceLoad(ResourceError::cancelledError(newRequest.url()));
458 return; 456 return;
459 } 457 }
460 458
461 ASSERT(timing()->fetchStart()); 459 ASSERT(timing()->fetchStart());
462 if (!redirectResponse.isNull()) { 460 if (!redirectResponse.isNull()) {
463 // If the redirecting url is not allowed to display content from the tar get origin, 461 // If the redirecting url is not allowed to display content from the tar get origin,
464 // then block the redirect. 462 // then block the redirect.
465 RefPtr<SecurityOrigin> redirectingOrigin = SecurityOrigin::create(redire ctResponse.url()); 463 RefPtr<SecurityOrigin> redirectingOrigin = SecurityOrigin::create(redire ctResponse.url());
466 if (!redirectingOrigin->canDisplay(newRequest.url())) { 464 if (!redirectingOrigin->canDisplay(newRequest.url())) {
467 FrameLoader::reportLocalLoadFailed(m_frame, newRequest.url().string( )); 465 FrameLoader::reportLocalLoadFailed(m_frame, newRequest.url().string( ));
468 cancelMainResourceLoad(frameLoader()->cancelledError(newRequest)); 466 cancelMainResourceLoad(ResourceError::cancelledError(newRequest.url( )));
469 return; 467 return;
470 } 468 }
471 timing()->addRedirect(redirectResponse.url(), newRequest.url()); 469 timing()->addRedirect(redirectResponse.url(), newRequest.url());
472 } 470 }
473 471
474 // Update cookie policy base URL as URL changes, except for subframes, which use the 472 // Update cookie policy base URL as URL changes, except for subframes, which use the
475 // URL of the main frame which doesn't change when we redirect. 473 // URL of the main frame which doesn't change when we redirect.
476 if (frameLoader()->isLoadingMainFrame()) 474 if (frameLoader()->isLoadingMainFrame())
477 newRequest.setFirstPartyForCookies(newRequest.url()); 475 newRequest.setFirstPartyForCookies(newRequest.url());
478 476
479 // If we're fielding a redirect in response to a POST, force a load from ori gin, since 477 // If we're fielding a redirect in response to a POST, force a load from ori gin, since
480 // this is a common site technique to return to a page viewing some data tha t the POST 478 // this is a common site technique to return to a page viewing some data tha t the POST
481 // just modified. 479 // just modified.
482 // Also, POST requests always load from origin, but this does not affect sub resources. 480 // Also, POST requests always load from origin, but this does not affect sub resources.
483 if (newRequest.cachePolicy() == UseProtocolCachePolicy && isPostOrRedirectAf terPost(newRequest, redirectResponse)) 481 if (newRequest.cachePolicy() == UseProtocolCachePolicy && isPostOrRedirectAf terPost(newRequest, redirectResponse))
484 newRequest.setCachePolicy(ReloadIgnoringCacheData); 482 newRequest.setCachePolicy(ReloadIgnoringCacheData);
485 483
486 Frame* top = m_frame->tree()->top(); 484 Frame* top = m_frame->tree()->top();
487 if (top != m_frame) { 485 if (top != m_frame) {
488 if (!frameLoader()->mixedContentChecker()->canDisplayInsecureContent(top ->document()->securityOrigin(), newRequest.url())) { 486 if (!frameLoader()->mixedContentChecker()->canDisplayInsecureContent(top ->document()->securityOrigin(), newRequest.url())) {
489 cancelMainResourceLoad(frameLoader()->cancelledError(newRequest)); 487 cancelMainResourceLoad(ResourceError::cancelledError(newRequest.url( )));
490 return; 488 return;
491 } 489 }
492 } 490 }
493 491
494 setRequest(newRequest); 492 setRequest(newRequest);
495 493
496 if (redirectResponse.isNull()) 494 if (redirectResponse.isNull())
497 return; 495 return;
498 496
499 // We checked application cache for initial URL, now we need to check it for redirected one. 497 // We checked application cache for initial URL, now we need to check it for redirected one.
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 ASSERT(m_mainResource); 575 ASSERT(m_mainResource);
578 unsigned long identifier = m_identifierForLoadWithoutResourceLoader ? m_ identifierForLoadWithoutResourceLoader : m_mainResource->identifier(); 576 unsigned long identifier = m_identifierForLoadWithoutResourceLoader ? m_ identifierForLoadWithoutResourceLoader : m_mainResource->identifier();
579 ASSERT(identifier); 577 ASSERT(identifier);
580 if (frameLoader()->shouldInterruptLoadForXFrameOptions(content, response .url(), identifier)) { 578 if (frameLoader()->shouldInterruptLoadForXFrameOptions(content, response .url(), identifier)) {
581 InspectorInstrumentation::continueAfterXFrameOptionsDenied(m_frame, this, identifier, response); 579 InspectorInstrumentation::continueAfterXFrameOptionsDenied(m_frame, this, identifier, response);
582 String message = "Refused to display '" + response.url().elidedStrin g() + "' in a frame because it set 'X-Frame-Options' to '" + content + "'."; 580 String message = "Refused to display '" + response.url().elidedStrin g() + "' in a frame because it set 'X-Frame-Options' to '" + content + "'.";
583 frame()->document()->addConsoleMessage(SecurityMessageSource, ErrorM essageLevel, message, identifier); 581 frame()->document()->addConsoleMessage(SecurityMessageSource, ErrorM essageLevel, message, identifier);
584 frame()->document()->enforceSandboxFlags(SandboxOrigin); 582 frame()->document()->enforceSandboxFlags(SandboxOrigin);
585 if (HTMLFrameOwnerElement* ownerElement = frame()->ownerElement()) 583 if (HTMLFrameOwnerElement* ownerElement = frame()->ownerElement())
586 ownerElement->dispatchEvent(Event::create(eventNames().loadEvent , false, false)); 584 ownerElement->dispatchEvent(Event::create(eventNames().loadEvent , false, false));
587 cancelMainResourceLoad(frameLoader()->cancelledError(m_request)); 585 cancelMainResourceLoad(ResourceError::cancelledError(m_request.url() ));
588 return; 586 return;
589 } 587 }
590 } 588 }
591 589
592 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); 590 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading());
593 591
594 if (m_isLoadingMultipartContent) { 592 if (m_isLoadingMultipartContent) {
595 setupForReplace(); 593 setupForReplace();
596 m_mainResource->clear(); 594 m_mainResource->clear();
597 } else if (response.isMultipart()) { 595 } else if (response.isMultipart()) {
(...skipping 15 matching lines...) Expand all
613 if (m_response.isHTTP()) { 611 if (m_response.isHTTP()) {
614 int status = m_response.httpStatusCode(); 612 int status = m_response.httpStatusCode();
615 if (status < 200 || status >= 300) { 613 if (status < 200 || status >= 300) {
616 bool hostedByObject = frameLoader()->isHostedByObjectElement(); 614 bool hostedByObject = frameLoader()->isHostedByObjectElement();
617 615
618 frameLoader()->handleFallbackContent(); 616 frameLoader()->handleFallbackContent();
619 // object elements are no longer rendered after we fallback, so don' t 617 // object elements are no longer rendered after we fallback, so don' t
620 // keep trying to process data from their load 618 // keep trying to process data from their load
621 619
622 if (hostedByObject) 620 if (hostedByObject)
623 cancelMainResourceLoad(frameLoader()->cancelledError(m_request)) ; 621 cancelMainResourceLoad(ResourceError::cancelledError(m_request.u rl()));
624 } 622 }
625 } 623 }
626 624
627 if (!isStopping() && m_substituteData.isValid()) { 625 if (!isStopping() && m_substituteData.isValid()) {
628 if (m_substituteData.content()->size()) 626 if (m_substituteData.content()->size())
629 dataReceived(0, m_substituteData.content()->data(), m_substituteData .content()->size()); 627 dataReceived(0, m_substituteData.content()->data(), m_substituteData .content()->size());
630 if (isLoadingMainResource()) 628 if (isLoadingMainResource())
631 finishedLoading(0); 629 finishedLoading(0);
632 } 630 }
633 } 631 }
(...skipping 12 matching lines...) Expand all
646 644
647 commitIfReady(); 645 commitIfReady();
648 FrameLoader* frameLoader = DocumentLoader::frameLoader(); 646 FrameLoader* frameLoader = DocumentLoader::frameLoader();
649 if (!frameLoader) 647 if (!frameLoader)
650 return; 648 return;
651 if (isArchiveMIMEType(response().mimeType())) 649 if (isArchiveMIMEType(response().mimeType()))
652 return; 650 return;
653 frameLoader->client()->committedLoad(this, data, length); 651 frameLoader->client()->committedLoad(this, data, length);
654 } 652 }
655 653
656 ResourceError DocumentLoader::interruptedForPolicyChangeError() const
657 {
658 return frameLoader()->client()->interruptedForPolicyChangeError(request());
659 }
660
661 void DocumentLoader::stopLoadingForPolicyChange() 654 void DocumentLoader::stopLoadingForPolicyChange()
662 { 655 {
663 ResourceError error = interruptedForPolicyChangeError(); 656 ResourceError error = frameLoader()->client()->interruptedForPolicyChangeErr or(m_request);
664 error.setIsCancellation(true); 657 error.setIsCancellation(true);
665 cancelMainResourceLoad(error); 658 cancelMainResourceLoad(error);
666 } 659 }
667 660
668 void DocumentLoader::commitData(const char* bytes, size_t length) 661 void DocumentLoader::commitData(const char* bytes, size_t length)
669 { 662 {
670 if (!m_gotFirstByte) { 663 if (!m_gotFirstByte) {
671 m_gotFirstByte = true; 664 m_gotFirstByte = true;
672 m_writer.begin(documentURL(), false); 665 m_writer.begin(documentURL(), false);
673 m_writer.setDocumentWasLoadedAsPartOfNavigation(); 666 m_writer.setDocumentWasLoadedAsPartOfNavigation();
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
897 if (m_frame->page()->defersLoading()) 890 if (m_frame->page()->defersLoading())
898 return; 891 return;
899 892
900 SubstituteResourceMap copy; 893 SubstituteResourceMap copy;
901 copy.swap(m_pendingSubstituteResources); 894 copy.swap(m_pendingSubstituteResources);
902 895
903 SubstituteResourceMap::const_iterator end = copy.end(); 896 SubstituteResourceMap::const_iterator end = copy.end();
904 for (SubstituteResourceMap::const_iterator it = copy.begin(); it != end; ++i t) { 897 for (SubstituteResourceMap::const_iterator it = copy.begin(); it != end; ++i t) {
905 RefPtr<ResourceLoader> loader = it->key; 898 RefPtr<ResourceLoader> loader = it->key;
906 SubstituteResource* resource = it->value.get(); 899 SubstituteResource* resource = it->value.get();
900 ASSERT(resource);
907 901
908 if (resource) { 902 if (resource) {
909 SharedBuffer* data = resource->data(); 903 SharedBuffer* data = resource->data();
910 904
911 loader->didReceiveResponse(0, resource->response()); 905 loader->didReceiveResponse(0, resource->response());
912 906
913 // Calling ResourceLoader::didReceiveResponse can end up cancelling the load, 907 // Calling ResourceLoader::didReceiveResponse can end up cancelling the load,
914 // so we need to check if the loader has reached its terminal state. 908 // so we need to check if the loader has reached its terminal state.
915 if (loader->reachedTerminalState()) 909 if (loader->reachedTerminalState())
916 return; 910 return;
917 911
918 loader->didReceiveData(0, data->data(), data->size(), data->size()); 912 loader->didReceiveData(0, data->data(), data->size(), data->size());
919 913
920 // Calling ResourceLoader::didReceiveData can end up cancelling the load, 914 // Calling ResourceLoader::didReceiveData can end up cancelling the load,
921 // so we need to check if the loader has reached its terminal state. 915 // so we need to check if the loader has reached its terminal state.
922 if (loader->reachedTerminalState()) 916 if (loader->reachedTerminalState())
923 return; 917 return;
924 918
925 loader->didFinishLoading(0, 0); 919 loader->didFinishLoading(0, 0);
926 } else {
927 // A null resource means that we should fail the load.
928 // FIXME: Maybe we should use another error here - something like "n ot in cache".
929 loader->didFail(0, loader->cannotShowURLError());
930 } 920 }
931 } 921 }
932 } 922 }
933 923
934 #ifndef NDEBUG 924 #ifndef NDEBUG
935 bool DocumentLoader::isSubstituteLoadPending(ResourceLoader* loader) const 925 bool DocumentLoader::isSubstituteLoadPending(ResourceLoader* loader) const
936 { 926 {
937 return m_pendingSubstituteResources.contains(loader); 927 return m_pendingSubstituteResources.contains(loader);
938 } 928 }
939 #endif 929 #endif
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 // If there was a fragment identifier on m_request, the cache will have stri pped it. m_request should include 1128 // If there was a fragment identifier on m_request, the cache will have stri pped it. m_request should include
1139 // the fragment identifier, so add that back in. 1129 // the fragment identifier, so add that back in.
1140 if (equalIgnoringFragmentIdentifier(m_request.url(), request.url())) 1130 if (equalIgnoringFragmentIdentifier(m_request.url(), request.url()))
1141 request.setURL(m_request.url()); 1131 request.setURL(m_request.url());
1142 setRequest(request); 1132 setRequest(request);
1143 } 1133 }
1144 1134
1145 void DocumentLoader::cancelMainResourceLoad(const ResourceError& resourceError) 1135 void DocumentLoader::cancelMainResourceLoad(const ResourceError& resourceError)
1146 { 1136 {
1147 RefPtr<DocumentLoader> protect(this); 1137 RefPtr<DocumentLoader> protect(this);
1148 ResourceError error = resourceError.isNull() ? frameLoader()->cancelledError (m_request) : resourceError; 1138 ResourceError error = resourceError.isNull() ? ResourceError::cancelledError (m_request.url()) : resourceError;
1149 1139
1150 m_dataLoadTimer.stop(); 1140 m_dataLoadTimer.stop();
1151 if (mainResourceLoader()) 1141 if (mainResourceLoader())
1152 mainResourceLoader()->cancel(error); 1142 mainResourceLoader()->cancel(error);
1153 1143
1154 mainReceivedError(error); 1144 mainReceivedError(error);
1155 } 1145 }
1156 1146
1157 void DocumentLoader::subresourceLoaderFinishedLoadingOnePart(ResourceLoader* loa der) 1147 void DocumentLoader::subresourceLoaderFinishedLoadingOnePart(ResourceLoader* loa der)
1158 { 1148 {
(...skipping 15 matching lines...) Expand all
1174 commitLoad(resourceData->data(), resourceData->size()); 1164 commitLoad(resourceData->data(), resourceData->size());
1175 } 1165 }
1176 1166
1177 void DocumentLoader::handledOnloadEvents() 1167 void DocumentLoader::handledOnloadEvents()
1178 { 1168 {
1179 m_wasOnloadHandled = true; 1169 m_wasOnloadHandled = true;
1180 applicationCacheHost()->stopDeferringEvents(); 1170 applicationCacheHost()->stopDeferringEvents();
1181 } 1171 }
1182 1172
1183 } // namespace WebCore 1173 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698