| Index: third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
|
| diff --git a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
|
| index 448a4f1b3ed22cfc431f99d7a0508f2cb8d99763..aeec98c26fc917eda8c903f8c4dee6db45c8a5d0 100644
|
| --- a/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
|
| +++ b/third_party/WebKit/Source/platform/loader/fetch/ResourceFetcher.cpp
|
| @@ -29,6 +29,7 @@
|
|
|
| #include "platform/Histogram.h"
|
| #include "platform/RuntimeEnabledFeatures.h"
|
| +#include "platform/ScriptForbiddenScope.h"
|
| #include "platform/instrumentation/tracing/TraceEvent.h"
|
| #include "platform/instrumentation/tracing/TracedValue.h"
|
| #include "platform/loader/fetch/FetchContext.h"
|
| @@ -431,6 +432,8 @@ Resource* ResourceFetcher::ResourceForStaticData(
|
| params.Options(), params.Charset());
|
| resource->SetNeedsSynchronousCacheHit(substitute_data.ForceSynchronousLoad());
|
| // FIXME: We should provide a body stream here.
|
| + resource->SetStatus(ResourceStatus::kPending);
|
| + resource->NotifyStartLoad();
|
| resource->ResponseReceived(response, nullptr);
|
| resource->SetDataBufferingPolicy(kBufferData);
|
| if (data->size())
|
| @@ -451,6 +454,8 @@ Resource* ResourceFetcher::ResourceForBlockedRequest(
|
| ResourceRequestBlockedReason blocked_reason) {
|
| Resource* resource = factory.Create(params.GetResourceRequest(),
|
| params.Options(), params.Charset());
|
| + resource->SetStatus(ResourceStatus::kPending);
|
| + resource->NotifyStartLoad();
|
| resource->FinishAsError(ResourceError::CancelledDueToAccessCheckError(
|
| params.Url(), blocked_reason));
|
| return resource;
|
| @@ -1333,44 +1338,59 @@ void ResourceFetcher::MoveResourceLoaderToNonBlocking(ResourceLoader* loader) {
|
| bool ResourceFetcher::StartLoad(Resource* resource) {
|
| DCHECK(resource);
|
| DCHECK(resource->StillNeedsLoad());
|
| - if (!Context().ShouldLoadNewResource(resource->GetType())) {
|
| - GetMemoryCache()->Remove(resource);
|
| - return false;
|
| - }
|
|
|
| ResourceRequest request(resource->GetResourceRequest());
|
| - ResourceResponse response;
|
| + ResourceLoader* loader = nullptr;
|
| +
|
| + {
|
| + // Forbids JavaScript/addClient/removeClient/revalidation until start()
|
| + // to prevent unintended state transitions.
|
| + Resource::ProhibitAddRemoveClientInScope
|
| + prohibit_add_remove_client_in_scope(resource);
|
| + Resource::RevalidationStartForbiddenScope
|
| + revalidation_start_forbidden_scope(resource);
|
| + ScriptForbiddenScope script_forbidden_scope;
|
| +
|
| + if (!Context().ShouldLoadNewResource(resource->GetType())) {
|
| + GetMemoryCache()->Remove(resource);
|
| + return false;
|
| + }
|
|
|
| - blink::probe::PlatformSendRequest probe(&Context(), resource->Identifier(),
|
| - request, response,
|
| - resource->Options().initiator_info);
|
| + ResourceResponse response;
|
|
|
| - Context().DispatchWillSendRequest(resource->Identifier(), request, response,
|
| - resource->Options().initiator_info);
|
| + blink::probe::PlatformSendRequest probe(&Context(), resource->Identifier(),
|
| + request, response,
|
| + resource->Options().initiator_info);
|
|
|
| - // TODO(shaochuan): Saving modified ResourceRequest back to |resource|, remove
|
| - // once dispatchWillSendRequest() takes const ResourceRequest.
|
| - // crbug.com/632580
|
| - resource->SetResourceRequest(request);
|
| -
|
| - // Resource requests from suborigins should not be intercepted by the service
|
| - // worker of the physical origin. This has the effect that, for now,
|
| - // suborigins do not work with service workers. See
|
| - // https://w3c.github.io/webappsec-suborigins/.
|
| - SecurityOrigin* source_origin = Context().GetSecurityOrigin();
|
| - if (source_origin && source_origin->HasSuborigin())
|
| - request.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone);
|
| -
|
| - ResourceLoader* loader = ResourceLoader::Create(this, resource);
|
| - if (resource->ShouldBlockLoadEvent())
|
| - loaders_.insert(loader);
|
| - else
|
| - non_blocking_loaders_.insert(loader);
|
| + Context().DispatchWillSendRequest(resource->Identifier(), request, response,
|
| + resource->Options().initiator_info);
|
| +
|
| + // TODO(shaochuan): Saving modified ResourceRequest back to |resource|,
|
| + // remove once dispatchWillSendRequest() takes const ResourceRequest.
|
| + // crbug.com/632580
|
| + resource->SetResourceRequest(request);
|
| +
|
| + // Resource requests from suborigins should not be intercepted by the
|
| + // service worker of the physical origin. This has the effect that, for now,
|
| + // suborigins do not work with service workers. See
|
| + // https://w3c.github.io/webappsec-suborigins/.
|
| + SecurityOrigin* source_origin = Context().GetSecurityOrigin();
|
| + if (source_origin && source_origin->HasSuborigin())
|
| + request.SetServiceWorkerMode(WebURLRequest::ServiceWorkerMode::kNone);
|
|
|
| - StorePerformanceTimingInitiatorInformation(resource);
|
| - resource->SetFetcherSecurityOrigin(source_origin);
|
| + loader = ResourceLoader::Create(this, resource);
|
| + if (resource->ShouldBlockLoadEvent())
|
| + loaders_.insert(loader);
|
| + else
|
| + non_blocking_loaders_.insert(loader);
|
| +
|
| + StorePerformanceTimingInitiatorInformation(resource);
|
| + resource->SetFetcherSecurityOrigin(source_origin);
|
| +
|
| + resource->NotifyStartLoad();
|
| + loader->ActivateCacheAwareLoadingIfNeeded(request);
|
| + }
|
|
|
| - loader->ActivateCacheAwareLoadingIfNeeded(request);
|
| loader->Start(request);
|
| return true;
|
| }
|
|
|