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 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 | 202 |
203 void DocumentLoader::setMainDocumentError(const ResourceError& error) | 203 void DocumentLoader::setMainDocumentError(const ResourceError& error) |
204 { | 204 { |
205 m_mainDocumentError = error; | 205 m_mainDocumentError = error; |
206 frameLoader()->client()->setMainDocumentError(this, error); | 206 frameLoader()->client()->setMainDocumentError(this, error); |
207 } | 207 } |
208 | 208 |
209 void DocumentLoader::mainReceivedError(const ResourceError& error) | 209 void DocumentLoader::mainReceivedError(const ResourceError& error) |
210 { | 210 { |
211 ASSERT(!error.isNull()); | 211 ASSERT(!error.isNull()); |
212 if (m_applicationCacheHost->maybeLoadFallbackForMainError(request(), error)) | |
213 return; | |
214 | |
215 if (m_identifierForLoadWithoutResourceLoader) { | 212 if (m_identifierForLoadWithoutResourceLoader) { |
216 ASSERT(!mainResourceLoader()); | 213 ASSERT(!mainResourceLoader()); |
217 frameLoader()->client()->dispatchDidFailLoading(this, m_identifierForLoa
dWithoutResourceLoader, error); | 214 frameLoader()->client()->dispatchDidFailLoading(this, m_identifierForLoa
dWithoutResourceLoader, error); |
218 } | 215 } |
219 | 216 |
220 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); | 217 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); |
221 | 218 |
222 m_applicationCacheHost->failedLoadingMainResource(); | 219 m_applicationCacheHost->failedLoadingMainResource(); |
223 | 220 |
224 if (!frameLoader()) | 221 if (!frameLoader()) |
(...skipping 21 matching lines...) Expand all Loading... |
246 // Attempt to stop the frame if the document loader is loading, or if it
is done loading but | 243 // Attempt to stop the frame if the document loader is loading, or if it
is done loading but |
247 // still parsing. Failure to do so can cause a world leak. | 244 // still parsing. Failure to do so can cause a world leak. |
248 Document* doc = m_frame->document(); | 245 Document* doc = m_frame->document(); |
249 | 246 |
250 if (loading || doc->parsing()) | 247 if (loading || doc->parsing()) |
251 m_frame->loader()->stopLoading(UnloadEventPolicyNone); | 248 m_frame->loader()->stopLoading(UnloadEventPolicyNone); |
252 } | 249 } |
253 | 250 |
254 // Always cancel multipart loaders | 251 // Always cancel multipart loaders |
255 cancelAll(m_multipartResourceLoaders); | 252 cancelAll(m_multipartResourceLoaders); |
256 | |
257 // Appcache uses ResourceHandle directly, DocumentLoader doesn't count these
loads. | |
258 m_applicationCacheHost->stopLoadingInFrame(m_frame); | |
259 | 253 |
260 clearArchiveResources(); | 254 clearArchiveResources(); |
261 | 255 |
262 if (!loading) { | 256 if (!loading) { |
263 // If something above restarted loading we might run into mysterious cra
shes like | 257 // If something above restarted loading we might run into mysterious cra
shes like |
264 // https://bugs.webkit.org/show_bug.cgi?id=62764 and <rdar://problem/932
8684> | 258 // https://bugs.webkit.org/show_bug.cgi?id=62764 and <rdar://problem/932
8684> |
265 ASSERT(!isLoading()); | 259 ASSERT(!isLoading()); |
266 return; | 260 return; |
267 } | 261 } |
268 | 262 |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 cancelMainResourceLoad(frameLoader()->cancelledError(newRequest)); | 482 cancelMainResourceLoad(frameLoader()->cancelledError(newRequest)); |
489 return; | 483 return; |
490 } | 484 } |
491 } | 485 } |
492 | 486 |
493 setRequest(newRequest); | 487 setRequest(newRequest); |
494 | 488 |
495 if (redirectResponse.isNull()) | 489 if (redirectResponse.isNull()) |
496 return; | 490 return; |
497 | 491 |
498 // We checked application cache for initial URL, now we need to check it for
redirected one. | 492 if (!shouldContinueForNavigationPolicy(newRequest)) |
499 ASSERT(!m_substituteData.isValid()); | |
500 m_applicationCacheHost->maybeLoadMainResourceForRedirect(newRequest, m_subst
ituteData); | |
501 if (m_substituteData.isValid()) | |
502 m_identifierForLoadWithoutResourceLoader = mainResourceLoader()->identif
ier(); | |
503 | |
504 if (!shouldContinueForNavigationPolicy(newRequest)) { | |
505 stopLoadingForPolicyChange(); | 493 stopLoadingForPolicyChange(); |
506 return; | |
507 } | |
508 | |
509 if (!m_substituteData.isValid()) | |
510 return; | |
511 // A redirect resulted in loading substitute data. | |
512 ASSERT(timing()->redirectCount()); | |
513 | |
514 // We need to remove our reference to the CachedResource in favor of a Subst
ituteData load. | |
515 // This will probably trigger the cancellation of the CachedResource's under
lying ResourceLoader, though there is a | |
516 // small chance that the resource is being loaded by a different Frame, prev
enting the ResourceLoader from being cancelled. | |
517 // If the ResourceLoader is indeed cancelled, it would normally send resourc
e load callbacks. | |
518 // However, from an API perspective, this isn't a cancellation. Therefore, s
ever our relationship with the network load, | |
519 // but prevent the ResourceLoader from sending ResourceLoadNotifier callback
s. | |
520 RefPtr<ResourceLoader> resourceLoader = mainResourceLoader(); | |
521 ASSERT(resourceLoader->shouldSendResourceLoadCallbacks()); | |
522 resourceLoader->setSendCallbackPolicy(DoNotSendCallbacks); | |
523 if (m_mainResource) { | |
524 m_mainResource->removeClient(this); | |
525 m_mainResource = 0; | |
526 } | |
527 resourceLoader->setSendCallbackPolicy(SendCallbacks); | |
528 handleSubstituteDataLoadSoon(); | |
529 } | 494 } |
530 | 495 |
531 bool DocumentLoader::shouldContinueForResponse() const | 496 bool DocumentLoader::shouldContinueForResponse() const |
532 { | 497 { |
533 if (m_substituteData.isValid()) | 498 if (m_substituteData.isValid()) |
534 return true; | 499 return true; |
535 | 500 |
536 int statusCode = m_response.httpStatusCode(); | 501 int statusCode = m_response.httpStatusCode(); |
537 if (statusCode == 204 || statusCode == 205) { | 502 if (statusCode == 204 || statusCode == 205) { |
538 // The server does not want us to replace the page contents. | 503 // The server does not want us to replace the page contents. |
(...skipping 15 matching lines...) Expand all Loading... |
554 return false; | 519 return false; |
555 | 520 |
556 return true; | 521 return true; |
557 } | 522 } |
558 | 523 |
559 void DocumentLoader::responseReceived(CachedResource* resource, const ResourceRe
sponse& response) | 524 void DocumentLoader::responseReceived(CachedResource* resource, const ResourceRe
sponse& response) |
560 { | 525 { |
561 ASSERT_UNUSED(resource, m_mainResource == resource); | 526 ASSERT_UNUSED(resource, m_mainResource == resource); |
562 RefPtr<DocumentLoader> protect(this); | 527 RefPtr<DocumentLoader> protect(this); |
563 | 528 |
564 m_applicationCacheHost->maybeLoadFallbackForMainResponse(request(), response
); | 529 m_applicationCacheHost->didReceiveResponseForMainResource(response); |
565 | 530 |
566 // The memory cache doesn't understand the application cache or its caching
rules. So if a main resource is served | 531 // The memory cache doesn't understand the application cache or its caching
rules. So if a main resource is served |
567 // from the application cache, ensure we don't save the result for future us
e. All responses loaded | 532 // from the application cache, ensure we don't save the result for future us
e. All responses loaded |
568 // from appcache will have a non-zero appCacheID(). | 533 // from appcache will have a non-zero appCacheID(). |
569 if (response.appCacheID()) | 534 if (response.appCacheID()) |
570 memoryCache()->remove(m_mainResource.get()); | 535 memoryCache()->remove(m_mainResource.get()); |
571 | 536 |
572 DEFINE_STATIC_LOCAL(AtomicString, xFrameOptionHeader, ("x-frame-options", At
omicString::ConstructFromLiteral)); | 537 DEFINE_STATIC_LOCAL(AtomicString, xFrameOptionHeader, ("x-frame-options", At
omicString::ConstructFromLiteral)); |
573 HTTPHeaderMap::const_iterator it = response.httpHeaderFields().find(xFrameOp
tionHeader); | 538 HTTPHeaderMap::const_iterator it = response.httpHeaderFields().find(xFrameOp
tionHeader); |
574 if (it != response.httpHeaderFields().end()) { | 539 if (it != response.httpHeaderFields().end()) { |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 { | 697 { |
733 ASSERT(data); | 698 ASSERT(data); |
734 ASSERT(length); | 699 ASSERT(length); |
735 ASSERT_UNUSED(resource, resource == m_mainResource); | 700 ASSERT_UNUSED(resource, resource == m_mainResource); |
736 ASSERT(!m_response.isNull()); | 701 ASSERT(!m_response.isNull()); |
737 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); | 702 ASSERT(!mainResourceLoader() || !mainResourceLoader()->defersLoading()); |
738 | 703 |
739 if (m_identifierForLoadWithoutResourceLoader) | 704 if (m_identifierForLoadWithoutResourceLoader) |
740 frameLoader()->notifier()->dispatchDidReceiveData(this, m_identifierForL
oadWithoutResourceLoader, data, length, -1); | 705 frameLoader()->notifier()->dispatchDidReceiveData(this, m_identifierForL
oadWithoutResourceLoader, data, length, -1); |
741 | 706 |
742 m_applicationCacheHost->mainResourceDataReceived(data, length, -1, false); | 707 m_applicationCacheHost->mainResourceDataReceived(data, length); |
743 m_timeOfLastDataReceived = monotonicallyIncreasingTime(); | 708 m_timeOfLastDataReceived = monotonicallyIncreasingTime(); |
744 | 709 |
745 if (!isMultipartReplacingLoad()) | 710 if (!isMultipartReplacingLoad()) |
746 commitLoad(data, length); | 711 commitLoad(data, length); |
747 } | 712 } |
748 | 713 |
749 void DocumentLoader::setupForReplace() | 714 void DocumentLoader::setupForReplace() |
750 { | 715 { |
751 if (!mainResourceData()) | 716 if (!mainResourceData()) |
752 return; | 717 return; |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1086 | 1051 |
1087 ASSERT(timing()->navigationStart()); | 1052 ASSERT(timing()->navigationStart()); |
1088 ASSERT(!timing()->fetchStart()); | 1053 ASSERT(!timing()->fetchStart()); |
1089 timing()->markFetchStart(); | 1054 timing()->markFetchStart(); |
1090 willSendRequest(m_request, ResourceResponse()); | 1055 willSendRequest(m_request, ResourceResponse()); |
1091 | 1056 |
1092 // willSendRequest() may lead to our Frame being detached or cancelling the
load via nulling the ResourceRequest. | 1057 // willSendRequest() may lead to our Frame being detached or cancelling the
load via nulling the ResourceRequest. |
1093 if (!m_frame || m_request.isNull()) | 1058 if (!m_frame || m_request.isNull()) |
1094 return; | 1059 return; |
1095 | 1060 |
1096 m_applicationCacheHost->maybeLoadMainResource(m_request, m_substituteData); | 1061 m_applicationCacheHost->willStartLoadingMainResource(m_request); |
1097 | 1062 |
1098 if (m_substituteData.isValid()) { | 1063 if (m_substituteData.isValid()) { |
1099 m_identifierForLoadWithoutResourceLoader = createUniqueIdentifier(); | 1064 m_identifierForLoadWithoutResourceLoader = createUniqueIdentifier(); |
1100 frameLoader()->notifier()->dispatchWillSendRequest(this, m_identifierFor
LoadWithoutResourceLoader, m_request, ResourceResponse()); | 1065 frameLoader()->notifier()->dispatchWillSendRequest(this, m_identifierFor
LoadWithoutResourceLoader, m_request, ResourceResponse()); |
1101 handleSubstituteDataLoadSoon(); | 1066 handleSubstituteDataLoadSoon(); |
1102 return; | 1067 return; |
1103 } | 1068 } |
1104 | 1069 |
1105 ResourceRequest request(m_request); | 1070 ResourceRequest request(m_request); |
1106 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, mainResourceLoadOptions, | 1071 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, mainResourceLoadOptions, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1165 commitLoad(resourceData->data(), resourceData->size()); | 1130 commitLoad(resourceData->data(), resourceData->size()); |
1166 } | 1131 } |
1167 | 1132 |
1168 void DocumentLoader::handledOnloadEvents() | 1133 void DocumentLoader::handledOnloadEvents() |
1169 { | 1134 { |
1170 m_wasOnloadHandled = true; | 1135 m_wasOnloadHandled = true; |
1171 applicationCacheHost()->stopDeferringEvents(); | 1136 applicationCacheHost()->stopDeferringEvents(); |
1172 } | 1137 } |
1173 | 1138 |
1174 } // namespace WebCore | 1139 } // namespace WebCore |
OLD | NEW |