| OLD | NEW |
| 1 /* | 1 /* |
| 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) | 2 Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) |
| 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) | 3 Copyright (C) 2001 Dirk Mueller (mueller@kde.org) |
| 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) | 4 Copyright (C) 2002 Waldo Bastian (bastian@kde.org) |
| 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
rights reserved. | 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All
rights reserved. |
| 6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ | 6 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ |
| 7 | 7 |
| 8 This library is free software; you can redistribute it and/or | 8 This library is free software; you can redistribute it and/or |
| 9 modify it under the terms of the GNU Library General Public | 9 modify it under the terms of the GNU Library General Public |
| 10 License as published by the Free Software Foundation; either | 10 License as published by the Free Software Foundation; either |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 case Resource::CSSStyleSheet: | 81 case Resource::CSSStyleSheet: |
| 82 return new CSSStyleSheetResource(request, charset); | 82 return new CSSStyleSheetResource(request, charset); |
| 83 case Resource::Script: | 83 case Resource::Script: |
| 84 return new ScriptResource(request, charset); | 84 return new ScriptResource(request, charset); |
| 85 case Resource::SVGDocument: | 85 case Resource::SVGDocument: |
| 86 return new DocumentResource(request, Resource::SVGDocument); | 86 return new DocumentResource(request, Resource::SVGDocument); |
| 87 case Resource::Font: | 87 case Resource::Font: |
| 88 return new FontResource(request); | 88 return new FontResource(request); |
| 89 case Resource::MainResource: | 89 case Resource::MainResource: |
| 90 case Resource::Raw: | 90 case Resource::Raw: |
| 91 case Resource::XMLHttpRequest: |
| 91 case Resource::TextTrack: | 92 case Resource::TextTrack: |
| 92 case Resource::Media: | 93 case Resource::Media: |
| 93 return new RawResource(request, type); | 94 return new RawResource(request, type); |
| 94 case Resource::XSLStyleSheet: | 95 case Resource::XSLStyleSheet: |
| 95 return new XSLStyleSheetResource(request, charset); | 96 return new XSLStyleSheetResource(request, charset); |
| 96 case Resource::LinkPrefetch: | 97 case Resource::LinkPrefetch: |
| 97 return new Resource(request, Resource::LinkPrefetch); | 98 return new Resource(request, Resource::LinkPrefetch); |
| 98 case Resource::LinkSubresource: | 99 case Resource::LinkSubresource: |
| 99 return new Resource(request, Resource::LinkSubresource); | 100 return new Resource(request, Resource::LinkSubresource); |
| 100 case Resource::ImportResource: | 101 case Resource::ImportResource: |
| 101 return new RawResource(request, type); | 102 return new RawResource(request, type); |
| 102 } | 103 } |
| 103 | 104 |
| 104 ASSERT_NOT_REACHED(); | 105 ASSERT_NOT_REACHED(); |
| 105 return 0; | 106 return 0; |
| 106 } | 107 } |
| 107 | 108 |
| 108 static ResourceLoadPriority loadPriority(Resource::Type type, const FetchRequest
& request) | 109 static ResourceLoadPriority loadPriority(Resource::Type type, const FetchRequest
& request) |
| 109 { | 110 { |
| 110 if (request.priority() != ResourceLoadPriorityUnresolved) | 111 if (request.priority() != ResourceLoadPriorityUnresolved) |
| 111 return request.priority(); | 112 return request.priority(); |
| 112 | 113 |
| 113 switch (type) { | 114 switch (type) { |
| 114 case Resource::MainResource: | 115 case Resource::MainResource: |
| 115 return ResourceLoadPriorityVeryHigh; | 116 return ResourceLoadPriorityVeryHigh; |
| 116 case Resource::CSSStyleSheet: | 117 case Resource::CSSStyleSheet: |
| 117 return ResourceLoadPriorityHigh; | 118 return ResourceLoadPriorityHigh; |
| 118 case Resource::Raw: | 119 case Resource::Raw: |
| 120 case Resource::XMLHttpRequest: |
| 119 return request.options().synchronousPolicy == RequestSynchronously ? Res
ourceLoadPriorityVeryHigh : ResourceLoadPriorityMedium; | 121 return request.options().synchronousPolicy == RequestSynchronously ? Res
ourceLoadPriorityVeryHigh : ResourceLoadPriorityMedium; |
| 120 case Resource::Script: | 122 case Resource::Script: |
| 121 case Resource::Font: | 123 case Resource::Font: |
| 122 case Resource::ImportResource: | 124 case Resource::ImportResource: |
| 123 return ResourceLoadPriorityMedium; | 125 return ResourceLoadPriorityMedium; |
| 124 case Resource::Image: | 126 case Resource::Image: |
| 125 // We'll default images to VeryLow, and promote whatever is visible. Thi
s improves | 127 // We'll default images to VeryLow, and promote whatever is visible. Thi
s improves |
| 126 // speed-index by ~5% on average, ~14% at the 99th percentile. | 128 // speed-index by ~5% on average, ~14% at the 99th percentile. |
| 127 return ResourceLoadPriorityVeryLow; | 129 return ResourceLoadPriorityVeryLow; |
| 128 case Resource::Media: | 130 case Resource::Media: |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 case Resource::LinkPrefetch: | 211 case Resource::LinkPrefetch: |
| 210 return ResourceRequest::TargetIsPrefetch; | 212 return ResourceRequest::TargetIsPrefetch; |
| 211 case Resource::LinkSubresource: | 213 case Resource::LinkSubresource: |
| 212 return ResourceRequest::TargetIsSubresource; | 214 return ResourceRequest::TargetIsSubresource; |
| 213 case Resource::TextTrack: | 215 case Resource::TextTrack: |
| 214 return ResourceRequest::TargetIsTextTrack; | 216 return ResourceRequest::TargetIsTextTrack; |
| 215 case Resource::SVGDocument: | 217 case Resource::SVGDocument: |
| 216 return ResourceRequest::TargetIsImage; | 218 return ResourceRequest::TargetIsImage; |
| 217 case Resource::Media: | 219 case Resource::Media: |
| 218 return ResourceRequest::TargetIsMedia; | 220 return ResourceRequest::TargetIsMedia; |
| 221 case Resource::XMLHttpRequest: |
| 222 return ResourceRequest::TargetIsXHR; |
| 219 } | 223 } |
| 220 ASSERT_NOT_REACHED(); | 224 ASSERT_NOT_REACHED(); |
| 221 return ResourceRequest::TargetIsSubresource; | 225 return ResourceRequest::TargetIsSubresource; |
| 222 } | 226 } |
| 223 | 227 |
| 224 ResourceFetcher::ResourceFetcher(DocumentLoader* documentLoader) | 228 ResourceFetcher::ResourceFetcher(DocumentLoader* documentLoader) |
| 225 : m_document(nullptr) | 229 : m_document(nullptr) |
| 226 , m_documentLoader(documentLoader) | 230 , m_documentLoader(documentLoader) |
| 227 , m_requestCount(0) | 231 , m_requestCount(0) |
| 228 , m_garbageCollectDocumentResourcesTimer(this, &ResourceFetcher::garbageColl
ectDocumentResourcesTimerFired) | 232 , m_garbageCollectDocumentResourcesTimer(this, &ResourceFetcher::garbageColl
ectDocumentResourcesTimerFired) |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 return FetchContext::nullInstance(); | 270 return FetchContext::nullInstance(); |
| 267 } | 271 } |
| 268 | 272 |
| 269 ResourcePtr<Resource> ResourceFetcher::fetchSynchronously(FetchRequest& request) | 273 ResourcePtr<Resource> ResourceFetcher::fetchSynchronously(FetchRequest& request) |
| 270 { | 274 { |
| 271 ASSERT(document()); | 275 ASSERT(document()); |
| 272 request.mutableResourceRequest().setTimeoutInterval(10); | 276 request.mutableResourceRequest().setTimeoutInterval(10); |
| 273 ResourceLoaderOptions options(request.options()); | 277 ResourceLoaderOptions options(request.options()); |
| 274 options.synchronousPolicy = RequestSynchronously; | 278 options.synchronousPolicy = RequestSynchronously; |
| 275 request.setOptions(options); | 279 request.setOptions(options); |
| 276 return requestResource(Resource::Raw, request); | 280 return requestResource(request.resourceRequest().targetType() == ResourceReq
uest::TargetIsXHR ? Resource::XMLHttpRequest : Resource::Raw, request); |
| 277 } | 281 } |
| 278 | 282 |
| 279 ResourcePtr<ImageResource> ResourceFetcher::fetchImage(FetchRequest& request) | 283 ResourcePtr<ImageResource> ResourceFetcher::fetchImage(FetchRequest& request) |
| 280 { | 284 { |
| 281 if (LocalFrame* f = frame()) { | 285 if (LocalFrame* f = frame()) { |
| 282 if (f->document()->pageDismissalEventBeingDispatched() != Document::NoDi
smissal) { | 286 if (f->document()->pageDismissalEventBeingDispatched() != Document::NoDi
smissal) { |
| 283 KURL requestURL = request.resourceRequest().url(); | 287 KURL requestURL = request.resourceRequest().url(); |
| 284 if (requestURL.isValid() && canRequest(Resource::Image, requestURL,
request.options(), request.forPreload(), request.originRestriction())) | 288 if (requestURL.isValid() && canRequest(Resource::Image, requestURL,
request.options(), request.forPreload(), request.originRestriction())) |
| 285 PingLoader::loadImage(f, requestURL); | 289 PingLoader::loadImage(f, requestURL); |
| 286 return 0; | 290 return 0; |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 ASSERT(frame()); | 362 ASSERT(frame()); |
| 359 ASSERT(type == Resource::LinkPrefetch || type == Resource::LinkSubresource); | 363 ASSERT(type == Resource::LinkPrefetch || type == Resource::LinkSubresource); |
| 360 return requestResource(type, request); | 364 return requestResource(type, request); |
| 361 } | 365 } |
| 362 | 366 |
| 363 ResourcePtr<RawResource> ResourceFetcher::fetchRawResource(FetchRequest& request
) | 367 ResourcePtr<RawResource> ResourceFetcher::fetchRawResource(FetchRequest& request
) |
| 364 { | 368 { |
| 365 return toRawResource(requestResource(Resource::Raw, request)); | 369 return toRawResource(requestResource(Resource::Raw, request)); |
| 366 } | 370 } |
| 367 | 371 |
| 372 ResourcePtr<RawResource> ResourceFetcher::fetchXMLHttpRequest(FetchRequest& requ
est) |
| 373 { |
| 374 return toRawResource(requestResource(Resource::XMLHttpRequest, request)); |
| 375 } |
| 376 |
| 368 ResourcePtr<RawResource> ResourceFetcher::fetchMainResource(FetchRequest& reques
t, const SubstituteData& substituteData) | 377 ResourcePtr<RawResource> ResourceFetcher::fetchMainResource(FetchRequest& reques
t, const SubstituteData& substituteData) |
| 369 { | 378 { |
| 370 if (substituteData.isValid()) | 379 if (substituteData.isValid()) |
| 371 preCacheSubstituteDataForMainResource(request, substituteData); | 380 preCacheSubstituteDataForMainResource(request, substituteData); |
| 372 return toRawResource(requestResource(Resource::MainResource, request)); | 381 return toRawResource(requestResource(Resource::MainResource, request)); |
| 373 } | 382 } |
| 374 | 383 |
| 375 ResourcePtr<RawResource> ResourceFetcher::fetchMedia(FetchRequest& request) | 384 ResourcePtr<RawResource> ResourceFetcher::fetchMedia(FetchRequest& request) |
| 376 { | 385 { |
| 377 return toRawResource(requestResource(Resource::Media, request)); | 386 return toRawResource(requestResource(Resource::Media, request)); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 393 resource->setNeedsSynchronousCacheHit(substituteData.forceSynchronousLoad())
; | 402 resource->setNeedsSynchronousCacheHit(substituteData.forceSynchronousLoad())
; |
| 394 resource->setOptions(request.options()); | 403 resource->setOptions(request.options()); |
| 395 resource->setDataBufferingPolicy(BufferData); | 404 resource->setDataBufferingPolicy(BufferData); |
| 396 resource->responseReceived(response); | 405 resource->responseReceived(response); |
| 397 if (substituteData.content()->size()) | 406 if (substituteData.content()->size()) |
| 398 resource->setResourceBuffer(substituteData.content()); | 407 resource->setResourceBuffer(substituteData.content()); |
| 399 resource->finish(); | 408 resource->finish(); |
| 400 memoryCache()->add(resource.get()); | 409 memoryCache()->add(resource.get()); |
| 401 } | 410 } |
| 402 | 411 |
| 403 bool ResourceFetcher::checkInsecureContent(Resource::Type type, const KURL& url,
MixedContentBlockingTreatment treatment) const | 412 bool ResourceFetcher::checkInsecureContent(Resource::Type type, const KURL& url)
const |
| 404 { | 413 { |
| 405 if (treatment == TreatAsDefaultForType) { | |
| 406 switch (type) { | |
| 407 case Resource::XSLStyleSheet: | |
| 408 ASSERT(RuntimeEnabledFeatures::xsltEnabled()); | |
| 409 case Resource::Script: | |
| 410 case Resource::SVGDocument: | |
| 411 case Resource::CSSStyleSheet: | |
| 412 case Resource::ImportResource: | |
| 413 // These resource can inject script into the current document (Scrip
t, | |
| 414 // XSL) or exfiltrate the content of the current document (CSS). | |
| 415 treatment = TreatAsActiveContent; | |
| 416 break; | |
| 417 | |
| 418 case Resource::Font: | |
| 419 case Resource::TextTrack: | |
| 420 // These resources are passive, but mixed usage is low enough that w
e | |
| 421 // can block them in a mixed context. | |
| 422 treatment = TreatAsActiveContent; | |
| 423 break; | |
| 424 | |
| 425 case Resource::Raw: | |
| 426 case Resource::Image: | |
| 427 case Resource::Media: | |
| 428 // These resources can corrupt only the frame's pixels. | |
| 429 treatment = TreatAsPassiveContent; | |
| 430 break; | |
| 431 | |
| 432 case Resource::MainResource: | |
| 433 case Resource::LinkPrefetch: | |
| 434 case Resource::LinkSubresource: | |
| 435 // These cannot affect the current document. | |
| 436 treatment = TreatAsAlwaysAllowedContent; | |
| 437 break; | |
| 438 } | |
| 439 } | |
| 440 // FIXME: We need a way to access the top-level frame's mixedContentChecker
when that frame | 414 // FIXME: We need a way to access the top-level frame's mixedContentChecker
when that frame |
| 441 // is in a different process from the current frame. Until that is done, we
always allow | 415 // is in a different process from the current frame. Until that is done, we
always allow |
| 442 // loads in remote frames. | 416 // loads in remote frames. |
| 443 if (frame() && !frame()->tree().top()->isLocalFrame()) | 417 if (frame() && !frame()->tree().top()->isLocalFrame()) |
| 418 return false; |
| 419 |
| 420 if (!frame()) |
| 444 return true; | 421 return true; |
| 445 if (treatment == TreatAsActiveContent) { | 422 LocalFrame* top = toLocalFrame(frame()->tree().top()); |
| 446 if (LocalFrame* f = frame()) { | |
| 447 if (!f->loader().mixedContentChecker()->canRunInsecureContent(m_docu
ment->securityOrigin(), url)) | |
| 448 return false; | |
| 449 Frame* top = f->tree().top(); | |
| 450 if (top != f && !toLocalFrame(top)->loader().mixedContentChecker()->
canRunInsecureContent(toLocalFrame(top)->document()->securityOrigin(), url)) | |
| 451 return false; | |
| 452 } | |
| 453 } else if (treatment == TreatAsPassiveContent) { | |
| 454 if (LocalFrame* f = frame()) { | |
| 455 Frame* top = f->tree().top(); | |
| 456 if (!toLocalFrame(top)->loader().mixedContentChecker()->canDisplayIn
secureContent(toLocalFrame(top)->document()->securityOrigin(), url)) | |
| 457 return false; | |
| 458 if (MixedContentChecker::isMixedContent(toLocalFrame(top)->document(
)->securityOrigin(), url)) { | |
| 459 switch (type) { | |
| 460 case Resource::TextTrack: | |
| 461 UseCounter::count(toLocalFrame(top)->document(), UseCounter:
:MixedContentTextTrack); | |
| 462 break; | |
| 463 | 423 |
| 464 case Resource::Raw: | 424 switch (type) { |
| 465 UseCounter::count(toLocalFrame(top)->document(), UseCounter:
:MixedContentRaw); | 425 // Exit early for these resource types, which cannot affect the current docu
ment. |
| 466 break; | 426 case Resource::MainResource: |
| 427 case Resource::LinkPrefetch: |
| 428 case Resource::LinkSubresource: |
| 429 return true; |
| 467 | 430 |
| 468 case Resource::Image: | 431 // These resource can inject script into the current document (Script, |
| 469 UseCounter::count(toLocalFrame(top)->document(), UseCounter:
:MixedContentImage); | 432 // XSL) or exfiltrate the content of the current document (CSS). |
| 470 break; | 433 case Resource::XSLStyleSheet: |
| 434 ASSERT(RuntimeEnabledFeatures::xsltEnabled()); |
| 435 case Resource::Script: |
| 436 case Resource::SVGDocument: |
| 437 case Resource::CSSStyleSheet: |
| 438 case Resource::ImportResource: |
| 439 case Resource::XMLHttpRequest: |
| 440 // Intentionally fall-through. |
| 441 // These resources are passive, but mixed usage is low enough that we |
| 442 // can block them in a mixed context. |
| 443 case Resource::Font: |
| 444 case Resource::TextTrack: |
| 445 if (!frame()->loader().mixedContentChecker()->canRunInsecureContent(m_do
cument->securityOrigin(), url)) |
| 446 return false; |
| 447 if (top != frame() && !top->loader().mixedContentChecker()->canRunInsecu
reContent(top->document()->securityOrigin(), url)) |
| 448 return false; |
| 449 break; |
| 471 | 450 |
| 472 case Resource::Media: | 451 // These resource are passive, and can only affect the document's pixels. |
| 473 UseCounter::count(toLocalFrame(top)->document(), UseCounter:
:MixedContentMedia); | 452 case Resource::Raw: |
| 474 break; | 453 case Resource::Image: |
| 454 case Resource::Media: |
| 455 if (!frame()->loader().mixedContentChecker()->canDisplayInsecureContent(
m_document->securityOrigin(), url)) |
| 456 return false; |
| 457 if (top != frame() && !top->loader().mixedContentChecker()->canDisplayIn
secureContent(top->document()->securityOrigin(), url)) |
| 458 return false; |
| 459 if (MixedContentChecker::isMixedContent(top->document()->securityOrigin(
), url)) { |
| 460 switch (type) { |
| 461 case Resource::TextTrack: |
| 462 UseCounter::count(top->document(), UseCounter::MixedContentTextT
rack); |
| 463 break; |
| 475 | 464 |
| 476 default: | 465 case Resource::Raw: |
| 477 ASSERT_NOT_REACHED(); | 466 UseCounter::count(top->document(), UseCounter::MixedContentRaw); |
| 478 } | 467 break; |
| 468 |
| 469 case Resource::Image: |
| 470 UseCounter::count(top->document(), UseCounter::MixedContentImage
); |
| 471 break; |
| 472 |
| 473 case Resource::Media: |
| 474 UseCounter::count(top->document(), UseCounter::MixedContentMedia
); |
| 475 break; |
| 476 |
| 477 default: |
| 478 ASSERT_NOT_REACHED(); |
| 479 } | 479 } |
| 480 } | 480 } |
| 481 } else { | 481 break; |
| 482 ASSERT(treatment == TreatAsAlwaysAllowedContent); | |
| 483 } | 482 } |
| 483 |
| 484 return true; | 484 return true; |
| 485 } | 485 } |
| 486 | 486 |
| 487 bool ResourceFetcher::canRequest(Resource::Type type, const KURL& url, const Res
ourceLoaderOptions& options, bool forPreload, FetchRequest::OriginRestriction or
iginRestriction) const | 487 bool ResourceFetcher::canRequest(Resource::Type type, const KURL& url, const Res
ourceLoaderOptions& options, bool forPreload, FetchRequest::OriginRestriction or
iginRestriction) const |
| 488 { | 488 { |
| 489 SecurityOrigin* securityOrigin = options.securityOrigin.get(); | 489 SecurityOrigin* securityOrigin = options.securityOrigin.get(); |
| 490 if (!securityOrigin && document()) | 490 if (!securityOrigin && document()) |
| 491 securityOrigin = document()->securityOrigin(); | 491 securityOrigin = document()->securityOrigin(); |
| 492 | 492 |
| 493 if (securityOrigin && !securityOrigin->canDisplay(url)) { | 493 if (securityOrigin && !securityOrigin->canDisplay(url)) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 508 case Resource::Image: | 508 case Resource::Image: |
| 509 case Resource::CSSStyleSheet: | 509 case Resource::CSSStyleSheet: |
| 510 case Resource::Script: | 510 case Resource::Script: |
| 511 case Resource::Font: | 511 case Resource::Font: |
| 512 case Resource::Raw: | 512 case Resource::Raw: |
| 513 case Resource::LinkPrefetch: | 513 case Resource::LinkPrefetch: |
| 514 case Resource::LinkSubresource: | 514 case Resource::LinkSubresource: |
| 515 case Resource::TextTrack: | 515 case Resource::TextTrack: |
| 516 case Resource::ImportResource: | 516 case Resource::ImportResource: |
| 517 case Resource::Media: | 517 case Resource::Media: |
| 518 case Resource::XMLHttpRequest: |
| 518 // By default these types of resources can be loaded from any origin. | 519 // By default these types of resources can be loaded from any origin. |
| 519 // FIXME: Are we sure about Resource::Font? | 520 // FIXME: Are we sure about Resource::Font? |
| 520 if (originRestriction == FetchRequest::RestrictToSameOrigin && !security
Origin->canRequest(url)) { | 521 if (originRestriction == FetchRequest::RestrictToSameOrigin && !security
Origin->canRequest(url)) { |
| 521 printAccessDeniedMessage(url); | 522 printAccessDeniedMessage(url); |
| 522 return false; | 523 return false; |
| 523 } | 524 } |
| 524 break; | 525 break; |
| 525 case Resource::XSLStyleSheet: | 526 case Resource::XSLStyleSheet: |
| 526 ASSERT(RuntimeEnabledFeatures::xsltEnabled()); | 527 ASSERT(RuntimeEnabledFeatures::xsltEnabled()); |
| 527 case Resource::SVGDocument: | 528 case Resource::SVGDocument: |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowImageFromSource(url, cspReporting)) | 565 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowImageFromSource(url, cspReporting)) |
| 565 return false; | 566 return false; |
| 566 break; | 567 break; |
| 567 case Resource::Font: { | 568 case Resource::Font: { |
| 568 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowFontFromSource(url, cspReporting)) | 569 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowFontFromSource(url, cspReporting)) |
| 569 return false; | 570 return false; |
| 570 break; | 571 break; |
| 571 } | 572 } |
| 572 case Resource::MainResource: | 573 case Resource::MainResource: |
| 573 case Resource::Raw: | 574 case Resource::Raw: |
| 575 case Resource::XMLHttpRequest: |
| 574 case Resource::LinkPrefetch: | 576 case Resource::LinkPrefetch: |
| 575 case Resource::LinkSubresource: | 577 case Resource::LinkSubresource: |
| 576 break; | 578 break; |
| 577 case Resource::Media: | 579 case Resource::Media: |
| 578 case Resource::TextTrack: | 580 case Resource::TextTrack: |
| 579 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowMediaFromSource(url, cspReporting)) | 581 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowMediaFromSource(url, cspReporting)) |
| 580 return false; | 582 return false; |
| 581 break; | 583 break; |
| 582 } | 584 } |
| 583 | 585 |
| 584 // SVG Images have unique security rules that prevent all subresource reques
ts | 586 // SVG Images have unique security rules that prevent all subresource reques
ts |
| 585 // except for data urls. | 587 // except for data urls. |
| 586 if (type != Resource::MainResource) { | 588 if (type != Resource::MainResource) { |
| 587 if (frame() && frame()->chromeClient().isSVGImageChromeClient() && !url.
protocolIsData()) | 589 if (frame() && frame()->chromeClient().isSVGImageChromeClient() && !url.
protocolIsData()) |
| 588 return false; | 590 return false; |
| 589 } | 591 } |
| 590 | 592 |
| 591 // Last of all, check for insecure content. We do this last so that when | 593 // Last of all, check for insecure content. We do this last so that when |
| 592 // folks block insecure content with a CSP policy, they don't get a warning. | 594 // folks block insecure content with a CSP policy, they don't get a warning. |
| 593 // They'll still get a warning in the console about CSP blocking the load. | 595 // They'll still get a warning in the console about CSP blocking the load. |
| 594 | 596 |
| 595 // FIXME: Should we consider forPreload here? | 597 // FIXME: Should we consider forPreload here? |
| 596 if (!checkInsecureContent(type, url, options.mixedContentBlockingTreatment)) | 598 if (!checkInsecureContent(type, url)) |
| 597 return false; | 599 return false; |
| 598 | 600 |
| 599 return true; | 601 return true; |
| 600 } | 602 } |
| 601 | 603 |
| 602 bool ResourceFetcher::canAccessResource(Resource* resource, SecurityOrigin* sour
ceOrigin, const KURL& url) const | 604 bool ResourceFetcher::canAccessResource(Resource* resource, SecurityOrigin* sour
ceOrigin, const KURL& url) const |
| 603 { | 605 { |
| 604 // Redirects can change the response URL different from one of request. | 606 // Redirects can change the response URL different from one of request. |
| 605 if (!canRequest(resource->type(), url, resource->options(), false, FetchRequ
est::UseDefaultOriginRestrictionForType)) | 607 if (!canRequest(resource->type(), url, resource->options(), false, FetchRequ
est::UseDefaultOriginRestrictionForType)) |
| 606 return false; | 608 return false; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 m_scheduledResourceTimingReports.add(info, resource->type() == Resource:
:MainResource); | 661 m_scheduledResourceTimingReports.add(info, resource->type() == Resource:
:MainResource); |
| 660 if (!m_resourceTimingReportTimer.isActive()) | 662 if (!m_resourceTimingReportTimer.isActive()) |
| 661 m_resourceTimingReportTimer.startOneShot(0, FROM_HERE); | 663 m_resourceTimingReportTimer.startOneShot(0, FROM_HERE); |
| 662 } | 664 } |
| 663 | 665 |
| 664 m_validatedURLs.add(request.resourceRequest().url()); | 666 m_validatedURLs.add(request.resourceRequest().url()); |
| 665 } | 667 } |
| 666 | 668 |
| 667 ResourcePtr<Resource> ResourceFetcher::requestResource(Resource::Type type, Fetc
hRequest& request) | 669 ResourcePtr<Resource> ResourceFetcher::requestResource(Resource::Type type, Fetc
hRequest& request) |
| 668 { | 670 { |
| 669 ASSERT(request.options().synchronousPolicy == RequestAsynchronously || type
== Resource::Raw); | 671 ASSERT(request.options().synchronousPolicy == RequestAsynchronously || type
== Resource::Raw || type == Resource::XMLHttpRequest); |
| 670 | 672 |
| 671 TRACE_EVENT0("blink", "ResourceFetcher::requestResource"); | 673 TRACE_EVENT0("blink", "ResourceFetcher::requestResource"); |
| 672 | 674 |
| 673 KURL url = request.resourceRequest().url(); | 675 KURL url = request.resourceRequest().url(); |
| 674 | 676 |
| 675 WTF_LOG(ResourceLoading, "ResourceFetcher::requestResource '%s', charset '%s
', priority=%d, forPreload=%u, type=%s", url.elidedString().latin1().data(), req
uest.charset().latin1().data(), request.priority(), request.forPreload(), Resour
ceTypeName(type)); | 677 WTF_LOG(ResourceLoading, "ResourceFetcher::requestResource '%s', charset '%s
', priority=%d, forPreload=%u, type=%s", url.elidedString().latin1().data(), req
uest.charset().latin1().data(), request.priority(), request.forPreload(), Resour
ceTypeName(type)); |
| 676 | 678 |
| 677 // If only the fragment identifiers differ, it is the same resource. | 679 // If only the fragment identifiers differ, it is the same resource. |
| 678 url = MemoryCache::removeFragmentIdentifierIfNeeded(url); | 680 url = MemoryCache::removeFragmentIdentifierIfNeeded(url); |
| 679 | 681 |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 979 // "Access-Control-Allow-Origin: *" all the time, but some of the | 981 // "Access-Control-Allow-Origin: *" all the time, but some of the |
| 980 // client's requests are made without CORS and some with. | 982 // client's requests are made without CORS and some with. |
| 981 if (existingResource->resourceRequest().allowStoredCredentials() != request.
allowStoredCredentials()) { | 983 if (existingResource->resourceRequest().allowStoredCredentials() != request.
allowStoredCredentials()) { |
| 982 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r
eloading due to difference in credentials settings."); | 984 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r
eloading due to difference in credentials settings."); |
| 983 return Reload; | 985 return Reload; |
| 984 } | 986 } |
| 985 | 987 |
| 986 // During the initial load, avoid loading the same resource multiple times f
or a single document, | 988 // During the initial load, avoid loading the same resource multiple times f
or a single document, |
| 987 // even if the cache policies would tell us to. | 989 // even if the cache policies would tell us to. |
| 988 // We also group loads of the same resource together. | 990 // We also group loads of the same resource together. |
| 989 // Raw resources are exempted, as XHRs fall into this category and may have
user-set Cache-Control: | 991 // Raw and XHR resources are exempted, as XHR or plugins may have user-set C
ache-Control: |
| 990 // headers or other factors that require separate requests. | 992 // headers or other factors that require separate requests. |
| 991 if (type != Resource::Raw) { | 993 if (type != Resource::Raw && type != Resource::XMLHttpRequest) { |
| 992 if (document() && !document()->loadEventFinished() && m_validatedURLs.co
ntains(existingResource->url())) | 994 if (document() && !document()->loadEventFinished() && m_validatedURLs.co
ntains(existingResource->url())) |
| 993 return Use; | 995 return Use; |
| 994 if (existingResource->isLoading()) | 996 if (existingResource->isLoading()) |
| 995 return Use; | 997 return Use; |
| 996 } | 998 } |
| 997 | 999 |
| 998 // CachePolicyReload always reloads | 1000 // CachePolicyReload always reloads |
| 999 if (cachePolicy == CachePolicyReload) { | 1001 if (cachePolicy == CachePolicyReload) { |
| 1000 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r
eloading due to CachePolicyReload."); | 1002 WTF_LOG(ResourceLoading, "ResourceFetcher::determineRevalidationPolicy r
eloading due to CachePolicyReload."); |
| 1001 return Reload; | 1003 return Reload; |
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1485 } | 1487 } |
| 1486 } | 1488 } |
| 1487 | 1489 |
| 1488 void ResourceFetcher::trace(Visitor* visitor) | 1490 void ResourceFetcher::trace(Visitor* visitor) |
| 1489 { | 1491 { |
| 1490 visitor->trace(m_document); | 1492 visitor->trace(m_document); |
| 1491 ResourceLoaderHost::trace(visitor); | 1493 ResourceLoaderHost::trace(visitor); |
| 1492 } | 1494 } |
| 1493 | 1495 |
| 1494 } | 1496 } |
| OLD | NEW |