Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp

Issue 2746343002: Phase III Step 1: Make ImageResourceContent manage its own ResourceStatus (Closed)
Patch Set: Reflect comments Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/loader/fetch/Resource.h ('k') | third_party/WebKit/Source/web/tests/WebFrameTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698