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 | 5 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All |
6 rights reserved. | 6 rights reserved. |
7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ | 7 Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ |
8 | 8 |
9 This library is free software; you can redistribute it and/or | 9 This library is free software; you can redistribute it and/or |
10 modify it under the terms of the GNU Library General Public | 10 modify it under the terms of the GNU Library General Public |
(...skipping 11 matching lines...) Expand all Loading... |
22 Boston, MA 02110-1301, USA. | 22 Boston, MA 02110-1301, USA. |
23 | 23 |
24 This class provides all functionality needed for loading images, style | 24 This class provides all functionality needed for loading images, style |
25 sheets and html pages from the web. It has a memory cache for these objects. | 25 sheets and html pages from the web. It has a memory cache for these objects. |
26 */ | 26 */ |
27 | 27 |
28 #include "platform/loader/fetch/ResourceFetcher.h" | 28 #include "platform/loader/fetch/ResourceFetcher.h" |
29 | 29 |
30 #include "platform/Histogram.h" | 30 #include "platform/Histogram.h" |
31 #include "platform/RuntimeEnabledFeatures.h" | 31 #include "platform/RuntimeEnabledFeatures.h" |
| 32 #include "platform/ScriptForbiddenScope.h" |
32 #include "platform/instrumentation/tracing/TraceEvent.h" | 33 #include "platform/instrumentation/tracing/TraceEvent.h" |
33 #include "platform/instrumentation/tracing/TracedValue.h" | 34 #include "platform/instrumentation/tracing/TracedValue.h" |
34 #include "platform/loader/fetch/FetchContext.h" | 35 #include "platform/loader/fetch/FetchContext.h" |
35 #include "platform/loader/fetch/FetchInitiatorTypeNames.h" | 36 #include "platform/loader/fetch/FetchInitiatorTypeNames.h" |
36 #include "platform/loader/fetch/MemoryCache.h" | 37 #include "platform/loader/fetch/MemoryCache.h" |
37 #include "platform/loader/fetch/ResourceLoader.h" | 38 #include "platform/loader/fetch/ResourceLoader.h" |
38 #include "platform/loader/fetch/ResourceLoadingLog.h" | 39 #include "platform/loader/fetch/ResourceLoadingLog.h" |
39 #include "platform/loader/fetch/ResourceTimingInfo.h" | 40 #include "platform/loader/fetch/ResourceTimingInfo.h" |
40 #include "platform/loader/fetch/UniqueIdentifier.h" | 41 #include "platform/loader/fetch/UniqueIdentifier.h" |
41 #include "platform/mhtml/ArchiveResource.h" | 42 #include "platform/mhtml/ArchiveResource.h" |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 response.SetURL(url); | 425 response.SetURL(url); |
425 response.SetMimeType(archive_resource->MimeType()); | 426 response.SetMimeType(archive_resource->MimeType()); |
426 response.SetExpectedContentLength(data->size()); | 427 response.SetExpectedContentLength(data->size()); |
427 response.SetTextEncodingName(archive_resource->TextEncoding()); | 428 response.SetTextEncodingName(archive_resource->TextEncoding()); |
428 } | 429 } |
429 | 430 |
430 Resource* resource = factory.Create(params.GetResourceRequest(), | 431 Resource* resource = factory.Create(params.GetResourceRequest(), |
431 params.Options(), params.Charset()); | 432 params.Options(), params.Charset()); |
432 resource->SetNeedsSynchronousCacheHit(substitute_data.ForceSynchronousLoad()); | 433 resource->SetNeedsSynchronousCacheHit(substitute_data.ForceSynchronousLoad()); |
433 // FIXME: We should provide a body stream here. | 434 // FIXME: We should provide a body stream here. |
| 435 resource->SetStatus(ResourceStatus::kPending); |
| 436 resource->NotifyStartLoad(); |
434 resource->ResponseReceived(response, nullptr); | 437 resource->ResponseReceived(response, nullptr); |
435 resource->SetDataBufferingPolicy(kBufferData); | 438 resource->SetDataBufferingPolicy(kBufferData); |
436 if (data->size()) | 439 if (data->size()) |
437 resource->SetResourceBuffer(data); | 440 resource->SetResourceBuffer(data); |
438 resource->SetIdentifier(CreateUniqueIdentifier()); | 441 resource->SetIdentifier(CreateUniqueIdentifier()); |
439 resource->SetCacheIdentifier(cache_identifier); | 442 resource->SetCacheIdentifier(cache_identifier); |
440 resource->Finish(); | 443 resource->Finish(); |
441 | 444 |
442 if (!substitute_data.IsValid()) | 445 if (!substitute_data.IsValid()) |
443 GetMemoryCache()->Add(resource); | 446 GetMemoryCache()->Add(resource); |
444 | 447 |
445 return resource; | 448 return resource; |
446 } | 449 } |
447 | 450 |
448 Resource* ResourceFetcher::ResourceForBlockedRequest( | 451 Resource* ResourceFetcher::ResourceForBlockedRequest( |
449 const FetchParameters& params, | 452 const FetchParameters& params, |
450 const ResourceFactory& factory, | 453 const ResourceFactory& factory, |
451 ResourceRequestBlockedReason blocked_reason) { | 454 ResourceRequestBlockedReason blocked_reason) { |
452 Resource* resource = factory.Create(params.GetResourceRequest(), | 455 Resource* resource = factory.Create(params.GetResourceRequest(), |
453 params.Options(), params.Charset()); | 456 params.Options(), params.Charset()); |
| 457 resource->SetStatus(ResourceStatus::kPending); |
| 458 resource->NotifyStartLoad(); |
454 resource->FinishAsError(ResourceError::CancelledDueToAccessCheckError( | 459 resource->FinishAsError(ResourceError::CancelledDueToAccessCheckError( |
455 params.Url(), blocked_reason)); | 460 params.Url(), blocked_reason)); |
456 return resource; | 461 return resource; |
457 } | 462 } |
458 | 463 |
459 void ResourceFetcher::MakePreloadedResourceBlockOnloadIfNeeded( | 464 void ResourceFetcher::MakePreloadedResourceBlockOnloadIfNeeded( |
460 Resource* resource, | 465 Resource* resource, |
461 const FetchParameters& params) { | 466 const FetchParameters& params) { |
462 // TODO(yoav): Test that non-blocking resources (video/audio/track) continue | 467 // TODO(yoav): Test that non-blocking resources (video/audio/track) continue |
463 // to not-block even after being preloaded and discovered. | 468 // to not-block even after being preloaded and discovered. |
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1326 DCHECK(loader); | 1331 DCHECK(loader); |
1327 // TODO(yoav): Convert CHECK to DCHECK if no crash reports come in. | 1332 // TODO(yoav): Convert CHECK to DCHECK if no crash reports come in. |
1328 CHECK(loaders_.Contains(loader)); | 1333 CHECK(loaders_.Contains(loader)); |
1329 non_blocking_loaders_.insert(loader); | 1334 non_blocking_loaders_.insert(loader); |
1330 loaders_.erase(loader); | 1335 loaders_.erase(loader); |
1331 } | 1336 } |
1332 | 1337 |
1333 bool ResourceFetcher::StartLoad(Resource* resource) { | 1338 bool ResourceFetcher::StartLoad(Resource* resource) { |
1334 DCHECK(resource); | 1339 DCHECK(resource); |
1335 DCHECK(resource->StillNeedsLoad()); | 1340 DCHECK(resource->StillNeedsLoad()); |
1336 if (!Context().ShouldLoadNewResource(resource->GetType())) { | 1341 |
1337 GetMemoryCache()->Remove(resource); | 1342 ResourceRequest request(resource->GetResourceRequest()); |
1338 return false; | 1343 ResourceLoader* loader = nullptr; |
| 1344 |
| 1345 { |
| 1346 // Forbids JavaScript/addClient/removeClient/revalidation until start() |
| 1347 // to prevent unintended state transitions. |
| 1348 Resource::ProhibitAddRemoveClientInScope |
| 1349 prohibit_add_remove_client_in_scope(resource); |
| 1350 Resource::RevalidationStartForbiddenScope |
| 1351 revalidation_start_forbidden_scope(resource); |
| 1352 ScriptForbiddenScope script_forbidden_scope; |
| 1353 |
| 1354 if (!Context().ShouldLoadNewResource(resource->GetType())) { |
| 1355 GetMemoryCache()->Remove(resource); |
| 1356 return false; |
| 1357 } |
| 1358 |
| 1359 ResourceResponse response; |
| 1360 |
| 1361 blink::probe::PlatformSendRequest probe(&Context(), resource->Identifier(), |
| 1362 request, response, |
| 1363 resource->Options().initiator_info); |
| 1364 |
| 1365 Context().DispatchWillSendRequest(resource->Identifier(), request, response, |
| 1366 resource->Options().initiator_info); |
| 1367 |
| 1368 // TODO(shaochuan): Saving modified ResourceRequest back to |resource|, |
| 1369 // remove once dispatchWillSendRequest() takes const ResourceRequest. |
| 1370 // crbug.com/632580 |
| 1371 resource->SetResourceRequest(request); |
| 1372 |
| 1373 // Resource requests from suborigins should not be intercepted by the |
| 1374 // service worker of the physical origin. This has the effect that, for now, |
| 1375 // suborigins do not work with service workers. See |
| 1376 // https://w3c.github.io/webappsec-suborigins/. |
| 1377 SecurityOrigin* source_origin = Context().GetSecurityOrigin(); |
| 1378 if (source_origin && source_origin->HasSuborigin()) |
| 1379 request.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone); |
| 1380 |
| 1381 loader = ResourceLoader::Create(this, resource); |
| 1382 if (resource->ShouldBlockLoadEvent()) |
| 1383 loaders_.insert(loader); |
| 1384 else |
| 1385 non_blocking_loaders_.insert(loader); |
| 1386 |
| 1387 StorePerformanceTimingInitiatorInformation(resource); |
| 1388 resource->SetFetcherSecurityOrigin(source_origin); |
| 1389 |
| 1390 resource->NotifyStartLoad(); |
| 1391 loader->ActivateCacheAwareLoadingIfNeeded(request); |
1339 } | 1392 } |
1340 | 1393 |
1341 ResourceRequest request(resource->GetResourceRequest()); | |
1342 ResourceResponse response; | |
1343 | |
1344 blink::probe::PlatformSendRequest probe(&Context(), resource->Identifier(), | |
1345 request, response, | |
1346 resource->Options().initiator_info); | |
1347 | |
1348 Context().DispatchWillSendRequest(resource->Identifier(), request, response, | |
1349 resource->Options().initiator_info); | |
1350 | |
1351 // TODO(shaochuan): Saving modified ResourceRequest back to |resource|, remove | |
1352 // once dispatchWillSendRequest() takes const ResourceRequest. | |
1353 // crbug.com/632580 | |
1354 resource->SetResourceRequest(request); | |
1355 | |
1356 // Resource requests from suborigins should not be intercepted by the service | |
1357 // worker of the physical origin. This has the effect that, for now, | |
1358 // suborigins do not work with service workers. See | |
1359 // https://w3c.github.io/webappsec-suborigins/. | |
1360 SecurityOrigin* source_origin = Context().GetSecurityOrigin(); | |
1361 if (source_origin && source_origin->HasSuborigin()) | |
1362 request.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone); | |
1363 | |
1364 ResourceLoader* loader = ResourceLoader::Create(this, resource); | |
1365 if (resource->ShouldBlockLoadEvent()) | |
1366 loaders_.insert(loader); | |
1367 else | |
1368 non_blocking_loaders_.insert(loader); | |
1369 | |
1370 StorePerformanceTimingInitiatorInformation(resource); | |
1371 resource->SetFetcherSecurityOrigin(source_origin); | |
1372 | |
1373 loader->ActivateCacheAwareLoadingIfNeeded(request); | |
1374 loader->Start(request); | 1394 loader->Start(request); |
1375 return true; | 1395 return true; |
1376 } | 1396 } |
1377 | 1397 |
1378 void ResourceFetcher::RemoveResourceLoader(ResourceLoader* loader) { | 1398 void ResourceFetcher::RemoveResourceLoader(ResourceLoader* loader) { |
1379 DCHECK(loader); | 1399 DCHECK(loader); |
1380 if (loaders_.Contains(loader)) | 1400 if (loaders_.Contains(loader)) |
1381 loaders_.erase(loader); | 1401 loaders_.erase(loader); |
1382 else if (non_blocking_loaders_.Contains(loader)) | 1402 else if (non_blocking_loaders_.Contains(loader)) |
1383 non_blocking_loaders_.erase(loader); | 1403 non_blocking_loaders_.erase(loader); |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1612 visitor->Trace(context_); | 1632 visitor->Trace(context_); |
1613 visitor->Trace(archive_); | 1633 visitor->Trace(archive_); |
1614 visitor->Trace(loaders_); | 1634 visitor->Trace(loaders_); |
1615 visitor->Trace(non_blocking_loaders_); | 1635 visitor->Trace(non_blocking_loaders_); |
1616 visitor->Trace(document_resources_); | 1636 visitor->Trace(document_resources_); |
1617 visitor->Trace(preloads_); | 1637 visitor->Trace(preloads_); |
1618 visitor->Trace(resource_timing_info_map_); | 1638 visitor->Trace(resource_timing_info_map_); |
1619 } | 1639 } |
1620 | 1640 |
1621 } // namespace blink | 1641 } // namespace blink |
OLD | NEW |