| 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 |