| 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 #include "core/loader/FrameLoaderClient.h" | 52 #include "core/loader/FrameLoaderClient.h" |
| 53 #include "core/loader/PingLoader.h" | 53 #include "core/loader/PingLoader.h" |
| 54 #include "core/loader/UniqueIdentifier.h" | 54 #include "core/loader/UniqueIdentifier.h" |
| 55 #include "core/loader/appcache/ApplicationCacheHost.h" | 55 #include "core/loader/appcache/ApplicationCacheHost.h" |
| 56 #include "core/page/ContentSecurityPolicy.h" | 56 #include "core/page/ContentSecurityPolicy.h" |
| 57 #include "core/page/DOMWindow.h" | 57 #include "core/page/DOMWindow.h" |
| 58 #include "core/page/Frame.h" | 58 #include "core/page/Frame.h" |
| 59 #include "core/page/Performance.h" | 59 #include "core/page/Performance.h" |
| 60 #include "core/page/ResourceTimingInfo.h" | 60 #include "core/page/ResourceTimingInfo.h" |
| 61 #include "core/page/Settings.h" | 61 #include "core/page/Settings.h" |
| 62 #include "core/platform/HistogramSupport.h" |
| 62 #include "core/platform/Logging.h" | 63 #include "core/platform/Logging.h" |
| 63 #include "core/platform/chromium/TraceEvent.h" | 64 #include "core/platform/chromium/TraceEvent.h" |
| 64 #include "public/platform/Platform.h" | 65 #include "public/platform/Platform.h" |
| 65 #include "public/platform/WebURL.h" | 66 #include "public/platform/WebURL.h" |
| 66 #include "weborigin/SecurityOrigin.h" | 67 #include "weborigin/SecurityOrigin.h" |
| 67 #include "weborigin/SecurityPolicy.h" | 68 #include "weborigin/SecurityPolicy.h" |
| 68 #include "wtf/text/CString.h" | 69 #include "wtf/text/CString.h" |
| 69 #include "wtf/text/WTFString.h" | 70 #include "wtf/text/WTFString.h" |
| 70 | 71 |
| 71 #define PRELOAD_DEBUG 0 | 72 #define PRELOAD_DEBUG 0 |
| 72 | 73 |
| 73 namespace WebCore { | 74 namespace WebCore { |
| 74 | 75 |
| 75 static Resource* createResource(Resource::Type type, const ResourceRequest& requ
est, const String& charset) | 76 namespace { |
| 77 |
| 78 enum ActionUponResourceRequest { |
| 79 LoadResource, |
| 80 RevalidateResource, |
| 81 UseResourceFromCache, |
| 82 NumberOfResourceRequestActions, |
| 83 }; |
| 84 |
| 85 Resource* createResource(Resource::Type type, const ResourceRequest& request, co
nst String& charset) |
| 76 { | 86 { |
| 77 switch (type) { | 87 switch (type) { |
| 78 case Resource::Image: | 88 case Resource::Image: |
| 79 return new ImageResource(request); | 89 return new ImageResource(request); |
| 80 case Resource::CSSStyleSheet: | 90 case Resource::CSSStyleSheet: |
| 81 return new CSSStyleSheetResource(request, charset); | 91 return new CSSStyleSheetResource(request, charset); |
| 82 case Resource::Script: | 92 case Resource::Script: |
| 83 return new ScriptResource(request, charset); | 93 return new ScriptResource(request, charset); |
| 84 case Resource::SVGDocument: | 94 case Resource::SVGDocument: |
| 85 return new DocumentResource(request, Resource::SVGDocument); | 95 return new DocumentResource(request, Resource::SVGDocument); |
| 86 case Resource::Font: | 96 case Resource::Font: |
| 87 return new FontResource(request); | 97 return new FontResource(request); |
| 88 case Resource::Raw: | 98 case Resource::Raw: |
| 89 case Resource::MainResource: | 99 case Resource::MainResource: |
| 90 return new RawResource(request, type); | 100 return new RawResource(request, type); |
| 91 case Resource::XSLStyleSheet: | 101 case Resource::XSLStyleSheet: |
| 92 return new XSLStyleSheetResource(request); | 102 return new XSLStyleSheetResource(request); |
| 93 case Resource::LinkPrefetch: | 103 case Resource::LinkPrefetch: |
| 94 return new Resource(request, Resource::LinkPrefetch); | 104 return new Resource(request, Resource::LinkPrefetch); |
| 95 case Resource::LinkSubresource: | 105 case Resource::LinkSubresource: |
| 96 return new Resource(request, Resource::LinkSubresource); | 106 return new Resource(request, Resource::LinkSubresource); |
| 97 case Resource::TextTrack: | 107 case Resource::TextTrack: |
| 98 return new TextTrackResource(request); | 108 return new TextTrackResource(request); |
| 99 case Resource::Shader: | 109 case Resource::Shader: |
| 100 return new ShaderResource(request); | 110 return new ShaderResource(request); |
| 101 case Resource::ImportResource: | 111 case Resource::ImportResource: |
| 102 return new RawResource(request, type); | 112 return new RawResource(request, type); |
| 113 case Resource::NumberOfTypes: |
| 114 ASSERT_NOT_REACHED(); |
| 103 } | 115 } |
| 104 | 116 |
| 105 ASSERT_NOT_REACHED(); | 117 ASSERT_NOT_REACHED(); |
| 106 return 0; | 118 return 0; |
| 107 } | 119 } |
| 108 | 120 |
| 109 static ResourceLoadPriority loadPriority(Resource::Type type, const FetchRequest
& request) | 121 ResourceLoadPriority loadPriority(Resource::Type type, const FetchRequest& reque
st) |
| 110 { | 122 { |
| 111 if (request.priority() != ResourceLoadPriorityUnresolved) | 123 if (request.priority() != ResourceLoadPriorityUnresolved) |
| 112 return request.priority(); | 124 return request.priority(); |
| 113 | 125 |
| 114 switch (type) { | 126 switch (type) { |
| 115 case Resource::MainResource: | 127 case Resource::MainResource: |
| 116 return ResourceLoadPriorityVeryHigh; | 128 return ResourceLoadPriorityVeryHigh; |
| 117 case Resource::CSSStyleSheet: | 129 case Resource::CSSStyleSheet: |
| 118 return ResourceLoadPriorityHigh; | 130 return ResourceLoadPriorityHigh; |
| 119 case Resource::Script: | 131 case Resource::Script: |
| 120 case Resource::Font: | 132 case Resource::Font: |
| 121 case Resource::Raw: | 133 case Resource::Raw: |
| 122 case Resource::ImportResource: | 134 case Resource::ImportResource: |
| 123 return ResourceLoadPriorityMedium; | 135 return ResourceLoadPriorityMedium; |
| 124 case Resource::Image: | 136 case Resource::Image: |
| 125 return request.forPreload() ? ResourceLoadPriorityVeryLow : ResourceLoad
PriorityLow; | 137 return request.forPreload() ? ResourceLoadPriorityVeryLow : ResourceLoad
PriorityLow; |
| 126 case Resource::XSLStyleSheet: | 138 case Resource::XSLStyleSheet: |
| 127 return ResourceLoadPriorityHigh; | 139 return ResourceLoadPriorityHigh; |
| 128 case Resource::SVGDocument: | 140 case Resource::SVGDocument: |
| 129 return ResourceLoadPriorityLow; | 141 return ResourceLoadPriorityLow; |
| 130 case Resource::LinkPrefetch: | 142 case Resource::LinkPrefetch: |
| 131 return ResourceLoadPriorityVeryLow; | 143 return ResourceLoadPriorityVeryLow; |
| 132 case Resource::LinkSubresource: | 144 case Resource::LinkSubresource: |
| 133 return ResourceLoadPriorityLow; | 145 return ResourceLoadPriorityLow; |
| 134 case Resource::TextTrack: | 146 case Resource::TextTrack: |
| 135 return ResourceLoadPriorityLow; | 147 return ResourceLoadPriorityLow; |
| 136 case Resource::Shader: | 148 case Resource::Shader: |
| 137 return ResourceLoadPriorityMedium; | 149 return ResourceLoadPriorityMedium; |
| 150 case Resource::NumberOfTypes: |
| 151 ASSERT_NOT_REACHED(); |
| 138 } | 152 } |
| 139 ASSERT_NOT_REACHED(); | 153 ASSERT_NOT_REACHED(); |
| 140 return ResourceLoadPriorityUnresolved; | 154 return ResourceLoadPriorityUnresolved; |
| 141 } | 155 } |
| 142 | 156 |
| 143 static Resource* resourceFromDataURIRequest(const ResourceRequest& request) | 157 Resource* resourceFromDataURIRequest(const ResourceRequest& request) |
| 144 { | 158 { |
| 145 const KURL& url = request.url(); | 159 const KURL& url = request.url(); |
| 146 ASSERT(url.protocolIsData()); | 160 ASSERT(url.protocolIsData()); |
| 147 | 161 |
| 148 WebKit::WebString mimetype; | 162 WebKit::WebString mimetype; |
| 149 WebKit::WebString charset; | 163 WebKit::WebString charset; |
| 150 RefPtr<SharedBuffer> data = PassRefPtr<SharedBuffer>(WebKit::Platform::curre
nt()->parseDataURL(url, mimetype, charset)); | 164 RefPtr<SharedBuffer> data = PassRefPtr<SharedBuffer>(WebKit::Platform::curre
nt()->parseDataURL(url, mimetype, charset)); |
| 151 if (!data) | 165 if (!data) |
| 152 return 0; | 166 return 0; |
| 153 ResourceResponse response(url, mimetype, data->size(), charset, String()); | 167 ResourceResponse response(url, mimetype, data->size(), charset, String()); |
| 154 | 168 |
| 155 Resource* resource = createResource(Resource::Image, request, charset); | 169 Resource* resource = createResource(Resource::Image, request, charset); |
| 156 resource->responseReceived(response); | 170 resource->responseReceived(response); |
| 157 // FIXME: AppendData causes an unnecessary memcpy. | 171 // FIXME: AppendData causes an unnecessary memcpy. |
| 158 if (data->size()) | 172 if (data->size()) |
| 159 resource->appendData(data->data(), data->size()); | 173 resource->appendData(data->data(), data->size()); |
| 160 resource->finish(); | 174 resource->finish(); |
| 161 return resource; | 175 return resource; |
| 162 } | 176 } |
| 163 | 177 |
| 178 } // namespace |
| 179 |
| 164 ResourceFetcher::ResourceFetcher(DocumentLoader* documentLoader) | 180 ResourceFetcher::ResourceFetcher(DocumentLoader* documentLoader) |
| 165 : m_document(0) | 181 : m_document(0) |
| 166 , m_documentLoader(documentLoader) | 182 , m_documentLoader(documentLoader) |
| 167 , m_requestCount(0) | 183 , m_requestCount(0) |
| 168 , m_garbageCollectDocumentResourcesTimer(this, &ResourceFetcher::garbageColl
ectDocumentResourcesTimerFired) | 184 , m_garbageCollectDocumentResourcesTimer(this, &ResourceFetcher::garbageColl
ectDocumentResourcesTimerFired) |
| 169 , m_autoLoadImages(true) | 185 , m_autoLoadImages(true) |
| 170 , m_imagesEnabled(true) | 186 , m_imagesEnabled(true) |
| 171 , m_allowStaleResources(false) | 187 , m_allowStaleResources(false) |
| 172 { | 188 { |
| 173 } | 189 } |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 // These resources can corrupt only the frame's pixels. | 366 // These resources can corrupt only the frame's pixels. |
| 351 treatment = TreatAsPassiveContent; | 367 treatment = TreatAsPassiveContent; |
| 352 break; | 368 break; |
| 353 | 369 |
| 354 case Resource::MainResource: | 370 case Resource::MainResource: |
| 355 case Resource::LinkPrefetch: | 371 case Resource::LinkPrefetch: |
| 356 case Resource::LinkSubresource: | 372 case Resource::LinkSubresource: |
| 357 // These cannot affect the current document. | 373 // These cannot affect the current document. |
| 358 treatment = TreatAsAlwaysAllowedContent; | 374 treatment = TreatAsAlwaysAllowedContent; |
| 359 break; | 375 break; |
| 376 case Resource::NumberOfTypes: |
| 377 ASSERT_NOT_REACHED(); |
| 360 } | 378 } |
| 361 } | 379 } |
| 362 if (treatment == TreatAsActiveContent) { | 380 if (treatment == TreatAsActiveContent) { |
| 363 if (Frame* f = frame()) { | 381 if (Frame* f = frame()) { |
| 364 if (!f->loader()->mixedContentChecker()->canRunInsecureContent(m_doc
ument->securityOrigin(), url)) | 382 if (!f->loader()->mixedContentChecker()->canRunInsecureContent(m_doc
ument->securityOrigin(), url)) |
| 365 return false; | 383 return false; |
| 366 } | 384 } |
| 367 } else if (treatment == TreatAsPassiveContent) { | 385 } else if (treatment == TreatAsPassiveContent) { |
| 368 if (Frame* f = frame()) { | 386 if (Frame* f = frame()) { |
| 369 Frame* top = f->tree()->top(); | 387 Frame* top = f->tree()->top(); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 return false; | 428 return false; |
| 411 } | 429 } |
| 412 break; | 430 break; |
| 413 case Resource::SVGDocument: | 431 case Resource::SVGDocument: |
| 414 case Resource::XSLStyleSheet: | 432 case Resource::XSLStyleSheet: |
| 415 if (!m_document->securityOrigin()->canRequest(url)) { | 433 if (!m_document->securityOrigin()->canRequest(url)) { |
| 416 printAccessDeniedMessage(url); | 434 printAccessDeniedMessage(url); |
| 417 return false; | 435 return false; |
| 418 } | 436 } |
| 419 break; | 437 break; |
| 438 case Resource::NumberOfTypes: |
| 439 ASSERT_NOT_REACHED(); |
| 420 } | 440 } |
| 421 | 441 |
| 422 switch (type) { | 442 switch (type) { |
| 423 case Resource::XSLStyleSheet: | 443 case Resource::XSLStyleSheet: |
| 424 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowScriptFromSource(url)) | 444 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowScriptFromSource(url)) |
| 425 return false; | 445 return false; |
| 426 break; | 446 break; |
| 427 case Resource::Script: | 447 case Resource::Script: |
| 428 case Resource::ImportResource: | 448 case Resource::ImportResource: |
| 429 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowScriptFromSource(url)) | 449 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowScriptFromSource(url)) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 457 case Resource::Raw: | 477 case Resource::Raw: |
| 458 case Resource::LinkPrefetch: | 478 case Resource::LinkPrefetch: |
| 459 case Resource::LinkSubresource: | 479 case Resource::LinkSubresource: |
| 460 break; | 480 break; |
| 461 case Resource::TextTrack: | 481 case Resource::TextTrack: |
| 462 // Cues aren't called out in the CPS spec yet, but they only work with a
media element | 482 // Cues aren't called out in the CPS spec yet, but they only work with a
media element |
| 463 // so use the media policy. | 483 // so use the media policy. |
| 464 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowMediaFromSource(url)) | 484 if (!shouldBypassMainWorldContentSecurityPolicy && !m_document->contentS
ecurityPolicy()->allowMediaFromSource(url)) |
| 465 return false; | 485 return false; |
| 466 break; | 486 break; |
| 487 case Resource::NumberOfTypes: |
| 488 ASSERT_NOT_REACHED(); |
| 467 } | 489 } |
| 468 | 490 |
| 469 // Last of all, check for insecure content. We do this last so that when | 491 // Last of all, check for insecure content. We do this last so that when |
| 470 // folks block insecure content with a CSP policy, they don't get a warning. | 492 // folks block insecure content with a CSP policy, they don't get a warning. |
| 471 // They'll still get a warning in the console about CSP blocking the load. | 493 // They'll still get a warning in the console about CSP blocking the load. |
| 472 | 494 |
| 473 // FIXME: Should we consider forPreload here? | 495 // FIXME: Should we consider forPreload here? |
| 474 if (!checkInsecureContent(type, url, options.mixedContentBlockingTreatment)) | 496 if (!checkInsecureContent(type, url, options.mixedContentBlockingTreatment)) |
| 475 return false; | 497 return false; |
| 476 | 498 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 // See if we can use an existing resource from the cache. | 556 // See if we can use an existing resource from the cache. |
| 535 ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url); | 557 ResourcePtr<Resource> resource = memoryCache()->resourceForURL(url); |
| 536 | 558 |
| 537 const RevalidationPolicy policy = determineRevalidationPolicy(type, request.
mutableResourceRequest(), request.forPreload(), resource.get(), request.defer())
; | 559 const RevalidationPolicy policy = determineRevalidationPolicy(type, request.
mutableResourceRequest(), request.forPreload(), resource.get(), request.defer())
; |
| 538 switch (policy) { | 560 switch (policy) { |
| 539 case Reload: | 561 case Reload: |
| 540 memoryCache()->remove(resource.get()); | 562 memoryCache()->remove(resource.get()); |
| 541 // Fall through | 563 // Fall through |
| 542 case Load: | 564 case Load: |
| 543 resource = loadResource(type, request, request.charset()); | 565 resource = loadResource(type, request, request.charset()); |
| 566 HistogramSupport::histogramEnumeration( |
| 567 "WebCore.ResourceFetcher.ActionUponResourceRequest", LoadResource, |
| 568 NumberOfResourceRequestActions); |
| 544 break; | 569 break; |
| 545 case Revalidate: | 570 case Revalidate: |
| 546 resource = revalidateResource(request, resource.get()); | 571 resource = revalidateResource(request, resource.get()); |
| 572 HistogramSupport::histogramEnumeration( |
| 573 "WebCore.ResourceFetcher.ActionUponResourceRequest", RevalidateResou
rce, |
| 574 NumberOfResourceRequestActions); |
| 547 break; | 575 break; |
| 548 case Use: | 576 case Use: |
| 549 resource->updateForAccess(); | 577 resource->updateForAccess(); |
| 550 notifyLoadedFromMemoryCache(resource.get()); | 578 notifyLoadedFromMemoryCache(resource.get()); |
| 579 HistogramSupport::histogramEnumeration( |
| 580 "WebCore.ResourceFetcher.ActionUponResourceRequest", UseResourceFrom
Cache, |
| 581 NumberOfResourceRequestActions); |
| 582 HistogramSupport::histogramEnumeration( |
| 583 "WebCore.ResourceFetcher.ResourceHasClientUponCacheHit", resource->h
asClients(), 2); |
| 584 HistogramSupport::histogramEnumeration( |
| 585 "WebCore.ResourceFetcher.ResourceTypeUponCacheHit", resource->type()
, |
| 586 Resource::NumberOfTypes); |
| 551 break; | 587 break; |
| 552 } | 588 } |
| 553 | 589 |
| 554 if (!resource) | 590 if (!resource) |
| 555 return 0; | 591 return 0; |
| 556 | 592 |
| 557 if (policy != Use) | 593 if (policy != Use) |
| 558 resource->setIdentifier(createUniqueIdentifier()); | 594 resource->setIdentifier(createUniqueIdentifier()); |
| 559 | 595 |
| 560 if (!request.forPreload() || policy != Use) { | 596 if (!request.forPreload() || policy != Use) { |
| (...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1310 } | 1346 } |
| 1311 #endif | 1347 #endif |
| 1312 | 1348 |
| 1313 const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions() | 1349 const ResourceLoaderOptions& ResourceFetcher::defaultResourceOptions() |
| 1314 { | 1350 { |
| 1315 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, options, (SendCallbacks, SniffCon
tent, BufferData, AllowStoredCredentials, ClientRequestedCredentials, AskClientF
orCrossOriginCredentials, DoSecurityCheck, CheckContentSecurityPolicy, UseDefaul
tOriginRestrictionsForType, DocumentContext)); | 1351 DEFINE_STATIC_LOCAL(ResourceLoaderOptions, options, (SendCallbacks, SniffCon
tent, BufferData, AllowStoredCredentials, ClientRequestedCredentials, AskClientF
orCrossOriginCredentials, DoSecurityCheck, CheckContentSecurityPolicy, UseDefaul
tOriginRestrictionsForType, DocumentContext)); |
| 1316 return options; | 1352 return options; |
| 1317 } | 1353 } |
| 1318 | 1354 |
| 1319 } | 1355 } |
| OLD | NEW |