Changeset 220760 in webkit
- Timestamp:
- Aug 15, 2017 2:15:09 PM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 28 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r220759 r220760 1 2017-08-15 Chris Dumez <cdumez@apple.com> 2 3 Update CachedResourceLoader::requestResource() to return a WTF::Expected 4 https://bugs.webkit.org/show_bug.cgi?id=175505 5 6 Reviewed by Youenn Fablet. 7 8 Update CachedResourceLoader::requestResource() to return a WTF::Expected 9 type instead of using an out parameter for the ResourceError in case of 10 synchronous failure. 11 12 * Modules/beacon/NavigatorBeacon.cpp: 13 (WebCore::NavigatorBeacon::sendBeacon): 14 * bindings/js/CachedScriptFetcher.cpp: 15 (WebCore::CachedScriptFetcher::requestScriptWithCache const): 16 * css/CSSFontFaceSrcValue.cpp: 17 (WebCore::CSSFontFaceSrcValue::cachedFont): 18 * css/CSSImageSetValue.cpp: 19 (WebCore::CSSImageSetValue::loadBestFitImage): 20 * css/CSSImageValue.cpp: 21 (WebCore::CSSImageValue::loadImage): 22 * css/StyleRuleImport.cpp: 23 (WebCore::StyleRuleImport::requestStyleSheet): 24 * dom/ProcessingInstruction.cpp: 25 (WebCore::ProcessingInstruction::checkStyleSheet): 26 * html/HTMLLinkElement.cpp: 27 (WebCore::HTMLLinkElement::process): 28 * loader/CrossOriginPreflightChecker.cpp: 29 (WebCore::CrossOriginPreflightChecker::startPreflight): 30 * loader/DocumentLoader.cpp: 31 (WebCore::DocumentLoader::startLoadingMainResource): 32 * loader/DocumentThreadableLoader.cpp: 33 (WebCore::DocumentThreadableLoader::loadRequest): 34 * loader/FrameLoader.cpp: 35 (WebCore::FrameLoader::loadedResourceFromMemoryCache): 36 * loader/FrameLoader.h: 37 * loader/ImageLoader.cpp: 38 (WebCore::ImageLoader::updateFromElement): 39 * loader/LinkLoader.cpp: 40 (WebCore::LinkLoader::preloadIfNeeded): 41 * loader/MediaResourceLoader.cpp: 42 (WebCore::MediaResourceLoader::requestResource): 43 * loader/TextTrackLoader.cpp: 44 (WebCore::TextTrackLoader::load): 45 * loader/cache/CachedResourceLoader.cpp: 46 (WebCore::castCachedResourceTo): 47 (WebCore::CachedResourceLoader::requestImage): 48 (WebCore::CachedResourceLoader::requestFont): 49 (WebCore::CachedResourceLoader::requestTextTrack): 50 (WebCore::CachedResourceLoader::requestCSSStyleSheet): 51 (WebCore::CachedResourceLoader::requestUserCSSStyleSheet): 52 (WebCore::CachedResourceLoader::requestScript): 53 (WebCore::CachedResourceLoader::requestXSLStyleSheet): 54 (WebCore::CachedResourceLoader::requestSVGDocument): 55 (WebCore::CachedResourceLoader::requestLinkResource): 56 (WebCore::CachedResourceLoader::requestMedia): 57 (WebCore::CachedResourceLoader::requestIcon): 58 (WebCore::CachedResourceLoader::requestRawResource): 59 (WebCore::CachedResourceLoader::requestBeaconResource): 60 (WebCore::CachedResourceLoader::requestMainResource): 61 (WebCore::CachedResourceLoader::shouldContinueAfterNotifyingLoadedFromMemoryCache): 62 (WebCore::CachedResourceLoader::requestResource): 63 (WebCore::CachedResourceLoader::preload): 64 * loader/cache/CachedResourceLoader.h: 65 * loader/cache/CachedSVGDocumentReference.cpp: 66 (WebCore::CachedSVGDocumentReference::load): 67 * loader/icon/IconLoader.cpp: 68 (WebCore::IconLoader::startLoading): 69 * platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm: 70 (WebCore::WebCoreAVFResourceLoader::startLoading): 71 * svg/SVGFEImageElement.cpp: 72 (WebCore::SVGFEImageElement::requestImageResource): 73 * svg/SVGFontFaceUriElement.cpp: 74 (WebCore::SVGFontFaceUriElement::loadFont): 75 * svg/SVGUseElement.cpp: 76 (WebCore::SVGUseElement::updateExternalDocument): 77 * xml/XSLImportRule.cpp: 78 (WebCore::XSLImportRule::loadSheet): 79 1 80 2017-08-15 Don Olmstead <don.olmstead@sony.com> 2 81 -
trunk/Source/WebCore/Modules/beacon/NavigatorBeacon.cpp
r220751 r220760 74 74 } 75 75 } 76 ResourceError error; 77 if (!document.cachedResourceLoader().requestBeaconResource({ WTFMove(request), options }, &error)) { 78 if (!error.isNull()) 79 document.addConsoleMessage(MessageSource::Network, MessageLevel::Error, error.localizedDescription()); 80 return false; 81 } 82 return true; 76 auto cachedResource = document.cachedResourceLoader().requestBeaconResource({ WTFMove(request), options }); 77 if (cachedResource) 78 return true; 79 80 document.addConsoleMessage(MessageSource::Network, MessageLevel::Error, cachedResource.error().localizedDescription()); 81 return false; 83 82 } 84 83 -
trunk/Source/WebCore/bindings/js/CachedScriptFetcher.cpp
r217760 r220760 64 64 request.setInitiator(m_initiatorName); 65 65 66 return document.cachedResourceLoader().requestScript(WTFMove(request)) ;66 return document.cachedResourceLoader().requestScript(WTFMove(request)).valueOr(nullptr); 67 67 } 68 68 -
trunk/Source/WebCore/css/CSSFontFaceSrcValue.cpp
r218890 r220760 102 102 CachedResourceRequest request(ResourceRequest(document->completeURL(m_resource)), options); 103 103 request.setInitiator(cachedResourceRequestInitiators().css); 104 m_cachedFont = document->cachedResourceLoader().requestFont(WTFMove(request), isSVG) ;104 m_cachedFont = document->cachedResourceLoader().requestFont(WTFMove(request), isSVG).valueOr(nullptr); 105 105 return m_cachedFont.get(); 106 106 } -
trunk/Source/WebCore/css/CSSImageSetValue.cpp
r218890 r220760 106 106 request.updateForAccessControl(*document); 107 107 108 m_cachedImage = loader.requestImage(WTFMove(request)) ;108 m_cachedImage = loader.requestImage(WTFMove(request)).valueOr(nullptr); 109 109 m_bestFitImageScaleFactor = image.scaleFactor; 110 110 } -
trunk/Source/WebCore/css/CSSImageValue.cpp
r219744 r220760 75 75 request.updateForAccessControl(*loader.document()); 76 76 } 77 m_cachedImage = loader.requestImage(WTFMove(request)) ;77 m_cachedImage = loader.requestImage(WTFMove(request)).valueOr(nullptr); 78 78 } 79 79 return m_cachedImage.get(); -
trunk/Source/WebCore/css/StyleRuleImport.cpp
r210859 r220760 124 124 m_cachedSheet = document->cachedResourceLoader().requestUserCSSStyleSheet(WTFMove(request)); 125 125 } else 126 m_cachedSheet = document->cachedResourceLoader().requestCSSStyleSheet(WTFMove(request)) ;126 m_cachedSheet = document->cachedResourceLoader().requestCSSStyleSheet(WTFMove(request)).valueOr(nullptr); 127 127 if (m_cachedSheet) { 128 128 // if the import rule is issued dynamically, the sheet may be -
trunk/Source/WebCore/dom/ProcessingInstruction.cpp
r214378 r220760 163 163 auto options = CachedResourceLoader::defaultCachedResourceOptions(); 164 164 options.mode = FetchOptions::Mode::SameOrigin; 165 m_cachedSheet = document().cachedResourceLoader().requestXSLStyleSheet({ResourceRequest(document().completeURL(href)), options}) ;165 m_cachedSheet = document().cachedResourceLoader().requestXSLStyleSheet({ResourceRequest(document().completeURL(href)), options}).valueOr(nullptr); 166 166 } else 167 167 #endif … … 170 170 CachedResourceRequest request(document().completeURL(href), CachedResourceLoader::defaultCachedResourceOptions(), std::nullopt, charset.isEmpty() ? document().charset() : WTFMove(charset)); 171 171 172 m_cachedSheet = document().cachedResourceLoader().requestCSSStyleSheet(WTFMove(request)) ;172 m_cachedSheet = document().cachedResourceLoader().requestCSSStyleSheet(WTFMove(request)).valueOr(nullptr); 173 173 } 174 174 if (m_cachedSheet) -
trunk/Source/WebCore/html/HTMLLinkElement.cpp
r219234 r220760 314 314 315 315 ASSERT_WITH_SECURITY_IMPLICATION(!m_cachedSheet); 316 m_cachedSheet = document().cachedResourceLoader().requestCSSStyleSheet(WTFMove(request)) ;316 m_cachedSheet = document().cachedResourceLoader().requestCSSStyleSheet(WTFMove(request)).valueOr(nullptr); 317 317 318 318 if (m_cachedSheet) -
trunk/Source/WebCore/loader/CrossOriginPreflightChecker.cpp
r220442 r220760 108 108 109 109 ASSERT(!m_resource); 110 m_resource = m_loader.document().cachedResourceLoader().requestRawResource(WTFMove(preflightRequest)) ;110 m_resource = m_loader.document().cachedResourceLoader().requestRawResource(WTFMove(preflightRequest)).valueOr(nullptr); 111 111 if (m_resource) 112 112 m_resource->addClient(*this); -
trunk/Source/WebCore/loader/DocumentLoader.cpp
r220052 r220760 1488 1488 mainResourceRequest.setDomainForCachePartition(origin->domainForCachePartition()); 1489 1489 } 1490 m_mainResource = m_cachedResourceLoader->requestMainResource(WTFMove(mainResourceRequest)) ;1490 m_mainResource = m_cachedResourceLoader->requestMainResource(WTFMove(mainResourceRequest)).valueOr(nullptr); 1491 1491 1492 1492 #if ENABLE(CONTENT_EXTENSIONS) -
trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp
r220751 r220760 450 450 } 451 451 452 // We create an URL here as the request will be moved in requestRawResource 453 URL requestUrl = newRequest.resourceRequest().url(); 454 ResourceError error; 455 m_resource = m_document.cachedResourceLoader().requestRawResource(WTFMove(newRequest), &error); 452 auto cachedResource = m_document.cachedResourceLoader().requestRawResource(WTFMove(newRequest)); 453 m_resource = cachedResource.valueOr(nullptr); 456 454 if (m_resource) 457 455 m_resource->addClient(*this); 458 else { 459 if (error.isNull()) { 460 // FIXME: Since we receive a synchronous error, this is probably due to some AccessControl checks. We should try to retrieve the actual error. 461 logErrorAndFail(ResourceError(String(), 0, requestUrl, String(), ResourceError::Type::AccessControl)); 462 } else 463 logErrorAndFail(error); 464 } 456 else 457 logErrorAndFail(cachedResource.error()); 465 458 return; 466 459 } -
trunk/Source/WebCore/loader/FrameLoader.cpp
r220750 r220760 3237 3237 } 3238 3238 3239 void FrameLoader::loadedResourceFromMemoryCache(CachedResource * resource, ResourceRequest& newRequest)3239 void FrameLoader::loadedResourceFromMemoryCache(CachedResource& resource, ResourceRequest& newRequest, ResourceError& error) 3240 3240 { 3241 3241 Page* page = m_frame.page(); … … 3243 3243 return; 3244 3244 3245 if (!resource ->shouldSendResourceLoadCallbacks() || m_documentLoader->haveToldClientAboutLoad(resource->url()))3245 if (!resource.shouldSendResourceLoadCallbacks() || m_documentLoader->haveToldClientAboutLoad(resource.url())) 3246 3246 return; 3247 3247 3248 3248 // Main resource delegate messages are synthesized in MainResourceLoader, so we must not send them here. 3249 if (resource ->type() == CachedResource::MainResource)3249 if (resource.type() == CachedResource::MainResource) 3250 3250 return; 3251 3251 3252 3252 if (!page->areMemoryCacheClientCallsEnabled()) { 3253 InspectorInstrumentation::didLoadResourceFromMemoryCache(*page, m_documentLoader.get(), resource);3254 m_documentLoader->recordMemoryCacheLoadForFutureClientNotification(resource ->resourceRequest());3255 m_documentLoader->didTellClientAboutLoad(resource ->url());3256 return; 3257 } 3258 3259 if (m_client.dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), newRequest, resource ->response(), resource->encodedSize())) {3260 InspectorInstrumentation::didLoadResourceFromMemoryCache(*page, m_documentLoader.get(), resource);3261 m_documentLoader->didTellClientAboutLoad(resource ->url());3253 InspectorInstrumentation::didLoadResourceFromMemoryCache(*page, m_documentLoader.get(), &resource); 3254 m_documentLoader->recordMemoryCacheLoadForFutureClientNotification(resource.resourceRequest()); 3255 m_documentLoader->didTellClientAboutLoad(resource.url()); 3256 return; 3257 } 3258 3259 if (m_client.dispatchDidLoadResourceFromMemoryCache(m_documentLoader.get(), newRequest, resource.response(), resource.encodedSize())) { 3260 InspectorInstrumentation::didLoadResourceFromMemoryCache(*page, m_documentLoader.get(), &resource); 3261 m_documentLoader->didTellClientAboutLoad(resource.url()); 3262 3262 return; 3263 3263 } 3264 3264 3265 3265 unsigned long identifier; 3266 ResourceError error;3267 3266 requestFromDelegate(newRequest, identifier, error); 3268 3267 3269 ResourceResponse response = resource ->response();3268 ResourceResponse response = resource.response(); 3270 3269 response.setSource(ResourceResponse::Source::MemoryCache); 3271 notifier().sendRemainingDelegateMessages(m_documentLoader.get(), identifier, newRequest, response, 0, resource ->encodedSize(), 0, error);3270 notifier().sendRemainingDelegateMessages(m_documentLoader.get(), identifier, newRequest, response, 0, resource.encodedSize(), 0, error); 3272 3271 } 3273 3272 -
trunk/Source/WebCore/loader/FrameLoader.h
r219733 r220760 191 191 void didFirstLayout(); 192 192 193 void loadedResourceFromMemoryCache(CachedResource *, ResourceRequest& newRequest);193 void loadedResourceFromMemoryCache(CachedResource&, ResourceRequest& newRequest, ResourceError&); 194 194 void tellClientAboutPastMemoryCacheLoads(); 195 195 -
trunk/Source/WebCore/loader/ImageLoader.cpp
r219237 r220760 193 193 document.cachedResourceLoader().setAutoLoadImages(autoLoadOtherImages); 194 194 } else 195 newImage = document.cachedResourceLoader().requestImage(WTFMove(request)) ;195 newImage = document.cachedResourceLoader().requestImage(WTFMove(request)).valueOr(nullptr); 196 196 197 197 // If we do not have an image here, it means that a cross-site -
trunk/Source/WebCore/loader/LinkLoader.cpp
r220632 r220760 230 230 231 231 linkRequest.setAsPotentiallyCrossOrigin(crossOriginMode, document); 232 CachedResourceHandle<CachedResource> cachedLinkResource = document.cachedResourceLoader().preload(type.value(), WTFMove(linkRequest));232 auto cachedLinkResource = document.cachedResourceLoader().preload(type.value(), WTFMove(linkRequest)).valueOr(nullptr); 233 233 234 234 if (cachedLinkResource && loader) … … 280 280 ResourceLoaderOptions options = CachedResourceLoader::defaultCachedResourceOptions(); 281 281 options.contentSecurityPolicyImposition = ContentSecurityPolicyImposition::SkipPolicyCheck; 282 m_cachedLinkResource = document.cachedResourceLoader().requestLinkResource(type, CachedResourceRequest(ResourceRequest(document.completeURL(href)), options, priority)) ;282 m_cachedLinkResource = document.cachedResourceLoader().requestLinkResource(type, CachedResourceRequest(ResourceRequest(document.completeURL(href)), options, priority)).valueOr(nullptr); 283 283 if (m_cachedLinkResource) 284 284 m_cachedLinkResource->addClient(*this); -
trunk/Source/WebCore/loader/MediaResourceLoader.cpp
r218609 r220760 83 83 cacheRequest.setInitiator(*m_mediaElement.get()); 84 84 85 CachedResourceHandle<CachedRawResource> resource = m_document->cachedResourceLoader().requestMedia(WTFMove(cacheRequest));85 auto resource = m_document->cachedResourceLoader().requestMedia(WTFMove(cacheRequest)).valueOr(nullptr); 86 86 if (!resource) 87 87 return nullptr; -
trunk/Source/WebCore/loader/TextTrackLoader.cpp
r218588 r220760 156 156 cueRequest.setAsPotentiallyCrossOrigin(crossOriginMode, *document); 157 157 158 m_resource = document->cachedResourceLoader().requestTextTrack(WTFMove(cueRequest)) ;158 m_resource = document->cachedResourceLoader().requestTextTrack(WTFMove(cueRequest)).valueOr(nullptr); 159 159 if (!m_resource) 160 160 return false; -
trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp
r220751 r220760 87 87 static const Seconds unusedPreloadTimeout { 3_s }; 88 88 89 template <typename T, typename U> 90 static inline ResourceErrorOr<CachedResourceHandle<T>> castCachedResourceTo(ResourceErrorOr<CachedResourceHandle<U>>&& cachedResource) 91 { 92 if (cachedResource) 93 return CachedResourceHandle<T> { static_cast<T*>(cachedResource.value().get()) }; 94 return makeUnexpected(cachedResource.error()); 95 } 96 89 97 static CachedResource* createResource(CachedResource::Type type, CachedResourceRequest&& request, SessionID sessionID) 90 98 { … … 182 190 } 183 191 184 CachedResourceHandle<CachedImage> CachedResourceLoader::requestImage(CachedResourceRequest&& request, ResourceError* error)192 ResourceErrorOr<CachedResourceHandle<CachedImage>> CachedResourceLoader::requestImage(CachedResourceRequest&& request) 185 193 { 186 194 if (Frame* frame = this->frame()) { … … 191 199 if (requestURL.isValid() && canRequest(CachedResource::ImageResource, requestURL, request, ForPreload::No)) 192 200 PingLoader::loadImage(*frame, requestURL); 193 return nullptr;201 return CachedResourceHandle<CachedImage> { }; 194 202 } 195 203 } 196 204 197 205 auto defer = clientDefersImage(request.resourceRequest().url()) ? DeferOption::DeferredByClient : DeferOption::NoDefer; 198 return downcast<CachedImage>(requestResource(CachedResource::ImageResource, WTFMove(request), error, ForPreload::No, defer).get());199 } 200 201 CachedResourceHandle<CachedFont> CachedResourceLoader::requestFont(CachedResourceRequest&& request, bool isSVG, ResourceError* error)206 return castCachedResourceTo<CachedImage>(requestResource(CachedResource::ImageResource, WTFMove(request), ForPreload::No, defer)); 207 } 208 209 ResourceErrorOr<CachedResourceHandle<CachedFont>> CachedResourceLoader::requestFont(CachedResourceRequest&& request, bool isSVG) 202 210 { 203 211 #if ENABLE(SVG_FONTS) 204 212 if (isSVG) 205 return downcast<CachedSVGFont>(requestResource(CachedResource::SVGFontResource, WTFMove(request), error).get());213 return castCachedResourceTo<CachedFont>(requestResource(CachedResource::SVGFontResource, WTFMove(request))); 206 214 #else 207 215 UNUSED_PARAM(isSVG); 208 216 #endif 209 return downcast<CachedFont>(requestResource(CachedResource::FontResource, WTFMove(request), error).get());217 return castCachedResourceTo<CachedFont>(requestResource(CachedResource::FontResource, WTFMove(request))); 210 218 } 211 219 212 220 #if ENABLE(VIDEO_TRACK) 213 CachedResourceHandle<CachedTextTrack> CachedResourceLoader::requestTextTrack(CachedResourceRequest&& request, ResourceError* error)214 { 215 return downcast<CachedTextTrack>(requestResource(CachedResource::TextTrackResource, WTFMove(request), error).get());216 } 217 #endif 218 219 CachedResourceHandle<CachedCSSStyleSheet> CachedResourceLoader::requestCSSStyleSheet(CachedResourceRequest&& request, ResourceError* error)220 { 221 return downcast<CachedCSSStyleSheet>(requestResource(CachedResource::CSSStyleSheet, WTFMove(request), error).get());222 } 223 224 CachedResourceHandle<CachedCSSStyleSheet> CachedResourceLoader::requestUserCSSStyleSheet(CachedResourceRequest&& request , ResourceError*)221 ResourceErrorOr<CachedResourceHandle<CachedTextTrack>> CachedResourceLoader::requestTextTrack(CachedResourceRequest&& request) 222 { 223 return castCachedResourceTo<CachedTextTrack>(requestResource(CachedResource::TextTrackResource, WTFMove(request))); 224 } 225 #endif 226 227 ResourceErrorOr<CachedResourceHandle<CachedCSSStyleSheet>> CachedResourceLoader::requestCSSStyleSheet(CachedResourceRequest&& request) 228 { 229 return castCachedResourceTo<CachedCSSStyleSheet>(requestResource(CachedResource::CSSStyleSheet, WTFMove(request))); 230 } 231 232 CachedResourceHandle<CachedCSSStyleSheet> CachedResourceLoader::requestUserCSSStyleSheet(CachedResourceRequest&& request) 225 233 { 226 234 ASSERT(document()); … … 248 256 } 249 257 250 CachedResourceHandle<CachedScript> CachedResourceLoader::requestScript(CachedResourceRequest&& request, ResourceError* error)251 { 252 return downcast<CachedScript>(requestResource(CachedResource::Script, WTFMove(request), error).get());258 ResourceErrorOr<CachedResourceHandle<CachedScript>> CachedResourceLoader::requestScript(CachedResourceRequest&& request) 259 { 260 return castCachedResourceTo<CachedScript>(requestResource(CachedResource::Script, WTFMove(request))); 253 261 } 254 262 255 263 #if ENABLE(XSLT) 256 CachedResourceHandle<CachedXSLStyleSheet> CachedResourceLoader::requestXSLStyleSheet(CachedResourceRequest&& request, ResourceError* error)257 { 258 return downcast<CachedXSLStyleSheet>(requestResource(CachedResource::XSLStyleSheet, WTFMove(request), error).get());259 } 260 #endif 261 262 CachedResourceHandle<CachedSVGDocument> CachedResourceLoader::requestSVGDocument(CachedResourceRequest&& request, ResourceError* error)263 { 264 return downcast<CachedSVGDocument>(requestResource(CachedResource::SVGDocumentResource, WTFMove(request), error).get());264 ResourceErrorOr<CachedResourceHandle<CachedXSLStyleSheet>> CachedResourceLoader::requestXSLStyleSheet(CachedResourceRequest&& request) 265 { 266 return castCachedResourceTo<CachedXSLStyleSheet>(requestResource(CachedResource::XSLStyleSheet, WTFMove(request))); 267 } 268 #endif 269 270 ResourceErrorOr<CachedResourceHandle<CachedSVGDocument>> CachedResourceLoader::requestSVGDocument(CachedResourceRequest&& request) 271 { 272 return castCachedResourceTo<CachedSVGDocument>(requestResource(CachedResource::SVGDocumentResource, WTFMove(request))); 265 273 } 266 274 267 275 #if ENABLE(LINK_PREFETCH) 268 CachedResourceHandle<CachedResource> CachedResourceLoader::requestLinkResource(CachedResource::Type type, CachedResourceRequest&& request, ResourceError* error)276 ResourceErrorOr<CachedResourceHandle<CachedResource>> CachedResourceLoader::requestLinkResource(CachedResource::Type type, CachedResourceRequest&& request) 269 277 { 270 278 ASSERT(frame()); 271 279 ASSERT(type == CachedResource::LinkPrefetch || type == CachedResource::LinkSubresource); 272 return requestResource(type, WTFMove(request) , error);273 } 274 #endif 275 276 CachedResourceHandle<CachedRawResource> CachedResourceLoader::requestMedia(CachedResourceRequest&& request, ResourceError* error)277 { 278 return downcast<CachedRawResource>(requestResource(CachedResource::MediaResource, WTFMove(request), error).get());279 } 280 281 CachedResourceHandle<CachedRawResource> CachedResourceLoader::requestIcon(CachedResourceRequest&& request, ResourceError* error)282 { 283 return downcast<CachedRawResource>(requestResource(CachedResource::Icon, WTFMove(request), error).get());284 } 285 286 CachedResourceHandle<CachedRawResource> CachedResourceLoader::requestRawResource(CachedResourceRequest&& request, ResourceError* error)287 { 288 return downcast<CachedRawResource>(requestResource(CachedResource::RawResource, WTFMove(request), error).get());289 } 290 291 CachedResourceHandle<CachedResource> CachedResourceLoader::requestBeaconResource(CachedResourceRequest&& request, ResourceError* error)292 { 293 return requestResource(CachedResource::Beacon, WTFMove(request) , error).get();294 } 295 296 CachedResourceHandle<CachedRawResource> CachedResourceLoader::requestMainResource(CachedResourceRequest&& request, ResourceError* error)297 { 298 return downcast<CachedRawResource>(requestResource(CachedResource::MainResource, WTFMove(request), error).get());280 return requestResource(type, WTFMove(request)); 281 } 282 #endif 283 284 ResourceErrorOr<CachedResourceHandle<CachedRawResource>> CachedResourceLoader::requestMedia(CachedResourceRequest&& request) 285 { 286 return castCachedResourceTo<CachedRawResource>(requestResource(CachedResource::MediaResource, WTFMove(request))); 287 } 288 289 ResourceErrorOr<CachedResourceHandle<CachedRawResource>> CachedResourceLoader::requestIcon(CachedResourceRequest&& request) 290 { 291 return castCachedResourceTo<CachedRawResource>(requestResource(CachedResource::Icon, WTFMove(request))); 292 } 293 294 ResourceErrorOr<CachedResourceHandle<CachedRawResource>> CachedResourceLoader::requestRawResource(CachedResourceRequest&& request) 295 { 296 return castCachedResourceTo<CachedRawResource>(requestResource(CachedResource::RawResource, WTFMove(request))); 297 } 298 299 ResourceErrorOr<CachedResourceHandle<CachedResource>> CachedResourceLoader::requestBeaconResource(CachedResourceRequest&& request) 300 { 301 return requestResource(CachedResource::Beacon, WTFMove(request)); 302 } 303 304 ResourceErrorOr<CachedResourceHandle<CachedRawResource>> CachedResourceLoader::requestMainResource(CachedResourceRequest&& request) 305 { 306 return castCachedResourceTo<CachedRawResource>(requestResource(CachedResource::MainResource, WTFMove(request))); 299 307 } 300 308 … … 557 565 } 558 566 559 bool CachedResourceLoader::shouldContinueAfterNotifyingLoadedFromMemoryCache(const CachedResourceRequest& request, CachedResource * resource)560 { 561 if (! resource || !frame() || resource->status() != CachedResource::Cached)567 bool CachedResourceLoader::shouldContinueAfterNotifyingLoadedFromMemoryCache(const CachedResourceRequest& request, CachedResource& resource, ResourceError& error) 568 { 569 if (!frame() || resource.status() != CachedResource::Cached) 562 570 return true; 563 571 564 ResourceRequest newRequest = ResourceRequest(resource ->url());572 ResourceRequest newRequest = ResourceRequest(resource.url()); 565 573 newRequest.setInitiatorIdentifier(request.resourceRequest().initiatorIdentifier()); 566 574 if (request.resourceRequest().hiddenFromInspector()) 567 575 newRequest.setHiddenFromInspector(true); 568 frame()->loader().loadedResourceFromMemoryCache(resource, newRequest );576 frame()->loader().loadedResourceFromMemoryCache(resource, newRequest, error); 569 577 570 578 // FIXME <http://webkit.org/b/113251>: If the delegate modifies the request's … … 689 697 } 690 698 691 CachedResourceHandle<CachedResource> CachedResourceLoader::requestResource(CachedResource::Type type, CachedResourceRequest&& request, ResourceError* error, ForPreload forPreload, DeferOption defer)699 ResourceErrorOr<CachedResourceHandle<CachedResource>> CachedResourceLoader::requestResource(CachedResource::Type type, CachedResourceRequest&& request, ForPreload forPreload, DeferOption defer) 692 700 { 693 701 if (Document* document = this->document()) … … 700 708 if (!url.isValid()) { 701 709 RELEASE_LOG_IF_ALLOWED("requestResource: URL is invalid (frame = %p)", frame()); 702 if (error) 703 *error = { errorDomainWebKitInternal, 0, url, ASCIILiteral("URL is invalid") }; 704 return nullptr; 710 return makeUnexpected(ResourceError { errorDomainWebKitInternal, 0, url, ASCIILiteral("URL is invalid") }); 705 711 } 706 712 … … 710 716 if (!canRequest(type, url, request, forPreload)) { 711 717 RELEASE_LOG_IF_ALLOWED("requestResource: Not allowed to request resource (frame = %p)", frame()); 712 if (error) 713 *error = { errorDomainWebKitInternal, 0, url, ASCIILiteral("Not allowed to request resource"), ResourceError::Type::AccessControl }; 714 return nullptr; 718 return makeUnexpected(ResourceError { errorDomainWebKitInternal, 0, url, ASCIILiteral("Not allowed to request resource"), ResourceError::Type::AccessControl }); 715 719 } 716 720 … … 723 727 RELEASE_LOG_IF_ALLOWED("requestResource: Resource blocked by content blocker (frame = %p)", frame()); 724 728 if (type == CachedResource::Type::MainResource) { 725 autoresource = createResource(type, WTFMove(request), sessionID());729 CachedResourceHandle<CachedResource> resource = createResource(type, WTFMove(request), sessionID()); 726 730 ASSERT(resource); 727 731 resource->error(CachedResource::Status::LoadError); 728 732 resource->setResourceError(ResourceError(ContentExtensions::WebKitContentBlockerDomain, 0, resourceRequest.url(), WEB_UI_STRING("The URL was blocked by a content blocker", "WebKitErrorBlockedByContentBlocker description"))); 729 return resource;733 return WTFMove(resource); 730 734 } 731 if (error) 732 *error = { errorDomainWebKitInternal, 0, url, ASCIILiteral("Resource blocked by content blocker"), ResourceError::Type::AccessControl }; 733 return nullptr; 735 return makeUnexpected(ResourceError { errorDomainWebKitInternal, 0, url, ASCIILiteral("Resource blocked by content blocker"), ResourceError::Type::AccessControl }); 734 736 } 735 737 if (blockedStatus.madeHTTPS … … 795 797 policy = Load; 796 798 } else { 797 if (!shouldContinueAfterNotifyingLoadedFromMemoryCache(request, resource.get())) 798 return nullptr; 799 ResourceError error; 800 if (!shouldContinueAfterNotifyingLoadedFromMemoryCache(request, *resource, error)) 801 return makeUnexpected(WTFMove(error)); 799 802 logMemoryCacheResourceRequest(frame(), DiagnosticLoggingKeys::memoryCacheEntryDecisionKey(), DiagnosticLoggingKeys::usedKey()); 800 803 loadTiming.setResponseEnd(MonotonicTime::now()); … … 819 822 break; 820 823 } 821 822 if (!resource) 823 return nullptr; 824 ASSERT(resource); 824 825 825 826 if (forPreload == ForPreload::No && resource->loader() && resource->ignoreForRequestCount()) { … … 835 836 if (resource->allowsCaching() && resource->inCache()) 836 837 memoryCache.remove(*resource); 837 if (error) { 838 839 840 *error = !resourceError.isNull() && !resourceError.isCancellation() ? resourceError : ResourceError(String(), 0, url, String(), ResourceError::Type::AccessControl);841 }842 return nullptr;838 839 auto resourceError = resource->resourceError(); 840 // Synchronous cancellations are likely due to access control. 841 if (resourceError.isNull() || resourceError.isCancellation()) 842 return makeUnexpected(ResourceError { String(), 0, url, String(), ResourceError::Type::AccessControl }); 843 return makeUnexpected(resourceError); 843 844 } 844 845 } … … 849 850 ASSERT(resource->url() == url.string()); 850 851 m_documentResources.set(resource->url(), resource); 851 return resource;852 return WTFMove(resource); 852 853 } 853 854 … … 1251 1252 } 1252 1253 1253 CachedResourceHandle<CachedResource> CachedResourceLoader::preload(CachedResource::Type type, CachedResourceRequest&& request)1254 ResourceErrorOr<CachedResourceHandle<CachedResource>> CachedResourceLoader::preload(CachedResource::Type type, CachedResourceRequest&& request) 1254 1255 { 1255 1256 if (request.charset().isEmpty() && (type == CachedResource::Script || type == CachedResource::CSSStyleSheet)) 1256 1257 request.setCharset(m_document->charset()); 1257 1258 1258 CachedResourceHandle<CachedResource> resource = requestResource(type, WTFMove(request), nullptr, ForPreload::Yes); 1259 if (resource && (!m_preloads || !m_preloads->contains(resource.get()))) { 1259 auto resource = requestResource(type, WTFMove(request), ForPreload::Yes); 1260 if (resource && (!m_preloads || !m_preloads->contains(resource.value().get()))) { 1261 auto resourceValue = resource.value(); 1260 1262 // Fonts need special treatment since just creating the resource doesn't trigger a load. 1261 1263 if (type == CachedResource::FontResource) 1262 downcast<CachedFont>(resource .get())->beginLoadIfNeeded(*this);1263 resource ->increasePreloadCount();1264 downcast<CachedFont>(resourceValue.get())->beginLoadIfNeeded(*this); 1265 resourceValue->increasePreloadCount(); 1264 1266 1265 1267 if (!m_preloads) 1266 1268 m_preloads = std::make_unique<ListHashSet<CachedResource*>>(); 1267 m_preloads->add(resource .get());1269 m_preloads->add(resourceValue.get()); 1268 1270 } 1269 1271 return resource; -
trunk/Source/WebCore/loader/cache/CachedResourceLoader.h
r220751 r220760 34 34 #include "ResourceTimingInformation.h" 35 35 #include "Timer.h" 36 #include <wtf/Expected.h> 36 37 #include <wtf/HashMap.h> 37 38 #include <wtf/HashSet.h> … … 56 57 class URL; 57 58 59 template <typename T> 60 using ResourceErrorOr = Expected<T, ResourceError>; 61 58 62 // The CachedResourceLoader provides a per-context interface to the MemoryCache 59 63 // and enforces a bunch of security checks and rules for resource revalidation. … … 73 77 ~CachedResourceLoader(); 74 78 75 CachedResourceHandle<CachedImage> requestImage(CachedResourceRequest&&, ResourceError* = nullptr);76 CachedResourceHandle<CachedCSSStyleSheet> requestCSSStyleSheet(CachedResourceRequest&&, ResourceError* = nullptr);77 CachedResourceHandle<CachedCSSStyleSheet> requestUserCSSStyleSheet(CachedResourceRequest&& , ResourceError* = nullptr);78 CachedResourceHandle<CachedScript> requestScript(CachedResourceRequest&&, ResourceError* = nullptr);79 CachedResourceHandle<CachedFont> requestFont(CachedResourceRequest&&, bool isSVG, ResourceError* = nullptr);80 CachedResourceHandle<CachedRawResource> requestMedia(CachedResourceRequest&&, ResourceError* = nullptr);81 CachedResourceHandle<CachedRawResource> requestIcon(CachedResourceRequest&&, ResourceError* = nullptr);82 CachedResourceHandle<CachedResource> requestBeaconResource(CachedResourceRequest&&, ResourceError* = nullptr);83 CachedResourceHandle<CachedRawResource> requestRawResource(CachedResourceRequest&&, ResourceError* = nullptr);84 CachedResourceHandle<CachedRawResource> requestMainResource(CachedResourceRequest&&, ResourceError* = nullptr);85 CachedResourceHandle<CachedSVGDocument> requestSVGDocument(CachedResourceRequest&&, ResourceError* = nullptr);79 ResourceErrorOr<CachedResourceHandle<CachedImage>> requestImage(CachedResourceRequest&&); 80 ResourceErrorOr<CachedResourceHandle<CachedCSSStyleSheet>> requestCSSStyleSheet(CachedResourceRequest&&); 81 CachedResourceHandle<CachedCSSStyleSheet> requestUserCSSStyleSheet(CachedResourceRequest&&); 82 ResourceErrorOr<CachedResourceHandle<CachedScript>> requestScript(CachedResourceRequest&&); 83 ResourceErrorOr<CachedResourceHandle<CachedFont>> requestFont(CachedResourceRequest&&, bool isSVG); 84 ResourceErrorOr<CachedResourceHandle<CachedRawResource>> requestMedia(CachedResourceRequest&&); 85 ResourceErrorOr<CachedResourceHandle<CachedRawResource>> requestIcon(CachedResourceRequest&&); 86 ResourceErrorOr<CachedResourceHandle<CachedResource>> requestBeaconResource(CachedResourceRequest&&); 87 ResourceErrorOr<CachedResourceHandle<CachedRawResource>> requestRawResource(CachedResourceRequest&&); 88 ResourceErrorOr<CachedResourceHandle<CachedRawResource>> requestMainResource(CachedResourceRequest&&); 89 ResourceErrorOr<CachedResourceHandle<CachedSVGDocument>> requestSVGDocument(CachedResourceRequest&&); 86 90 #if ENABLE(XSLT) 87 CachedResourceHandle<CachedXSLStyleSheet> requestXSLStyleSheet(CachedResourceRequest&&, ResourceError* = nullptr);91 ResourceErrorOr<CachedResourceHandle<CachedXSLStyleSheet>> requestXSLStyleSheet(CachedResourceRequest&&); 88 92 #endif 89 93 #if ENABLE(LINK_PREFETCH) 90 CachedResourceHandle<CachedResource> requestLinkResource(CachedResource::Type, CachedResourceRequest&&, ResourceError* = nullptr);94 ResourceErrorOr<CachedResourceHandle<CachedResource>> requestLinkResource(CachedResource::Type, CachedResourceRequest&&); 91 95 #endif 92 96 #if ENABLE(VIDEO_TRACK) 93 CachedResourceHandle<CachedTextTrack> requestTextTrack(CachedResourceRequest&&, ResourceError* = nullptr);97 ResourceErrorOr<CachedResourceHandle<CachedTextTrack>> requestTextTrack(CachedResourceRequest&&); 94 98 #endif 95 99 … … 133 137 enum class ClearPreloadsMode { ClearSpeculativePreloads, ClearAllPreloads }; 134 138 void clearPreloads(ClearPreloadsMode); 135 CachedResourceHandle<CachedResource> preload(CachedResource::Type, CachedResourceRequest&&);139 ResourceErrorOr<CachedResourceHandle<CachedResource>> preload(CachedResource::Type, CachedResourceRequest&&); 136 140 void printPreloadStats(); 137 141 void warnUnusedPreloads(); … … 156 160 enum class DeferOption { NoDefer, DeferredByClient }; 157 161 158 CachedResourceHandle<CachedResource> requestResource(CachedResource::Type, CachedResourceRequest&&, ResourceError* = nullptr, ForPreload = ForPreload::No, DeferOption = DeferOption::NoDefer);162 ResourceErrorOr<CachedResourceHandle<CachedResource>> requestResource(CachedResource::Type, CachedResourceRequest&&, ForPreload = ForPreload::No, DeferOption = DeferOption::NoDefer); 159 163 CachedResourceHandle<CachedResource> revalidateResource(CachedResourceRequest&&, CachedResource&); 160 164 CachedResourceHandle<CachedResource> loadResource(CachedResource::Type, CachedResourceRequest&&); … … 172 176 CachedResourceHandle<CachedResource> updateCachedResourceWithCurrentRequest(const CachedResource&, CachedResourceRequest&&); 173 177 174 bool shouldContinueAfterNotifyingLoadedFromMemoryCache(const CachedResourceRequest&, CachedResource *);178 bool shouldContinueAfterNotifyingLoadedFromMemoryCache(const CachedResourceRequest&, CachedResource&, ResourceError&); 175 179 bool checkInsecureContent(CachedResource::Type, const URL&) const; 176 180 bool allowedByContentSecurityPolicy(CachedResource::Type, const URL&, const ResourceLoaderOptions&, ContentSecurityPolicy::RedirectResponseReceived) const; -
trunk/Source/WebCore/loader/cache/CachedSVGDocumentReference.cpp
r206867 r220760 57 57 CachedResourceRequest request(ResourceRequest(loader.document()->completeURL(m_url)), fetchOptions); 58 58 request.setInitiator(cachedResourceRequestInitiators().css); 59 m_document = loader.requestSVGDocument(WTFMove(request)) ;59 m_document = loader.requestSVGDocument(WTFMove(request)).valueOr(nullptr); 60 60 if (m_document) 61 61 m_document->addClient(*this); -
trunk/Source/WebCore/loader/icon/IconLoader.cpp
r219733 r220760 76 76 request.setInitiator(cachedResourceRequestInitiators().icon); 77 77 78 m_resource = frame->document()->cachedResourceLoader().requestIcon(WTFMove(request)); 78 auto cachedResource = frame->document()->cachedResourceLoader().requestIcon(WTFMove(request)); 79 m_resource = cachedResource.valueOr(nullptr); 79 80 if (m_resource) 80 81 m_resource->addClient(*this); 81 82 else 82 LOG_ERROR("Failed to start load for icon at url %s ", resourceRequestURL.string().ascii().data());83 LOG_ERROR("Failed to start load for icon at url %s (error: %s)", resourceRequestURL.string().ascii().data(), cachedResource.error().localizedDescription().utf8().data()); 83 84 } 84 85 -
trunk/Source/WebCore/platform/graphics/avfoundation/cf/WebCoreAVCFResourceLoader.cpp
r219191 r220760 78 78 79 79 CachedResourceLoader* loader = m_parent->player()->cachedResourceLoader(); 80 m_resource = loader ? loader->requestRawResource(WTFMove(request)) : 0;80 m_resource = loader ? loader->requestRawResource(WTFMove(request)).valueOr(nullptr) : nullptr; 81 81 if (m_resource) 82 82 m_resource->addClient(*this); -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm
r219191 r220760 75 75 CachedResourceRequest request(WTFMove(resourceRequest), ResourceLoaderOptions(SendCallbacks, DoNotSniffContent, BufferData, DoNotAllowStoredCredentials, ClientCredentialPolicy::CannotAskClientForCredentials, FetchOptions::Credentials::Omit, DoSecurityCheck, FetchOptions::Mode::NoCors, DoNotIncludeCertificateInfo, ContentSecurityPolicyImposition::DoPolicyCheck, DefersLoadingPolicy::AllowDefersLoading, CachingPolicy::DisallowCaching)); 76 76 if (auto* loader = m_parent->player()->cachedResourceLoader()) 77 m_resource = loader->requestMedia(WTFMove(request)) ;77 m_resource = loader->requestMedia(WTFMove(request)).valueOr(nullptr); 78 78 79 79 if (m_resource) -
trunk/Source/WebCore/svg/SVGFEImageElement.cpp
r211591 r220760 90 90 CachedResourceRequest request(ResourceRequest(document().completeURL(href())), options); 91 91 request.setInitiator(*this); 92 m_cachedImage = document().cachedResourceLoader().requestImage(WTFMove(request)) ;92 m_cachedImage = document().cachedResourceLoader().requestImage(WTFMove(request)).valueOr(nullptr); 93 93 94 94 if (m_cachedImage) -
trunk/Source/WebCore/svg/SVGFontFaceUriElement.cpp
r210845 r220760 107 107 CachedResourceRequest request(ResourceRequest(document().completeURL(href)), options); 108 108 request.setInitiator(*this); 109 m_cachedFont = cachedResourceLoader.requestFont(WTFMove(request), isSVGFontTarget(*this)) ;109 m_cachedFont = cachedResourceLoader.requestFont(WTFMove(request), isSVGFontTarget(*this)).valueOr(nullptr); 110 110 if (m_cachedFont) { 111 111 m_cachedFont->addClient(*this); -
trunk/Source/WebCore/svg/SVGUseElement.cpp
r219237 r220760 575 575 CachedResourceRequest request { ResourceRequest { externalDocumentURL }, options }; 576 576 request.setInitiator(*this); 577 m_externalDocument = document().cachedResourceLoader().requestSVGDocument(WTFMove(request)) ;577 m_externalDocument = document().cachedResourceLoader().requestSVGDocument(WTFMove(request)).valueOr(nullptr); 578 578 if (m_externalDocument) 579 579 m_externalDocument->addClient(*this); -
trunk/Source/WebCore/xml/XSLImportRule.cpp
r206867 r220760 104 104 auto options = CachedResourceLoader::defaultCachedResourceOptions(); 105 105 options.mode = FetchOptions::Mode::SameOrigin; 106 m_cachedSheet = cachedResourceLoader->requestXSLStyleSheet({ResourceRequest(cachedResourceLoader->document()->completeURL(absHref)), options}) ;106 m_cachedSheet = cachedResourceLoader->requestXSLStyleSheet({ResourceRequest(cachedResourceLoader->document()->completeURL(absHref)), options}).valueOr(nullptr); 107 107 108 108 if (m_cachedSheet) {
Note: See TracChangeset
for help on using the changeset viewer.