| Index: Source/core/loader/DocumentThreadableLoader.cpp
|
| diff --git a/Source/core/loader/DocumentThreadableLoader.cpp b/Source/core/loader/DocumentThreadableLoader.cpp
|
| index 74bf523ccfafd5dd70bdf8d83fee6171c90a7c4e..6ac4982d229f13001ac95f2392b259c51cba3436 100644
|
| --- a/Source/core/loader/DocumentThreadableLoader.cpp
|
| +++ b/Source/core/loader/DocumentThreadableLoader.cpp
|
| @@ -67,38 +67,43 @@ static const int kMaxCORSRedirects = 20;
|
| void DocumentThreadableLoader::loadResourceSynchronously(Document& document, const ResourceRequest& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions)
|
| {
|
| // The loader will be deleted as soon as this function exits.
|
| - RefPtr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, &client, LoadSynchronously, request, options, resourceLoaderOptions));
|
| + RefPtr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, &client, LoadSynchronously, options, resourceLoaderOptions));
|
| + loader->start(request);
|
| ASSERT(loader->hasOneRef());
|
| }
|
|
|
| -PassRefPtr<DocumentThreadableLoader> DocumentThreadableLoader::create(Document& document, ThreadableLoaderClient* client, const ResourceRequest& request, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions)
|
| +PassRefPtr<DocumentThreadableLoader> DocumentThreadableLoader::create(Document& document, ThreadableLoaderClient* client, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions)
|
| {
|
| - RefPtr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, client, LoadAsynchronously, request, options, resourceLoaderOptions));
|
| - if (!loader->resource())
|
| - loader = nullptr;
|
| - return loader.release();
|
| + return adoptRef(new DocumentThreadableLoader(document, client, LoadAsynchronously, options, resourceLoaderOptions));
|
| }
|
|
|
| -DocumentThreadableLoader::DocumentThreadableLoader(Document& document, ThreadableLoaderClient* client, BlockingBehavior blockingBehavior, const ResourceRequest& request, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions)
|
| +DocumentThreadableLoader::DocumentThreadableLoader(Document& document, ThreadableLoaderClient* client, BlockingBehavior blockingBehavior, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions)
|
| : m_client(client)
|
| , m_document(document)
|
| , m_options(options)
|
| , m_resourceLoaderOptions(resourceLoaderOptions)
|
| , m_forceDoNotAllowStoredCredentials(false)
|
| , m_securityOrigin(m_resourceLoaderOptions.securityOrigin)
|
| - , m_sameOriginRequest(securityOrigin()->canRequestNoSuborigin(request.url()))
|
| + , m_sameOriginRequest(false)
|
| , m_crossOriginNonSimpleRequest(false)
|
| , m_isUsingDataConsumerHandle(false)
|
| , m_async(blockingBehavior == LoadAsynchronously)
|
| - , m_requestContext(request.requestContext())
|
| + , m_requestContext(WebURLRequest::RequestContextUnspecified)
|
| , m_timeoutTimer(this, &DocumentThreadableLoader::didTimeout)
|
| , m_requestStartedSeconds(0.0)
|
| , m_corsRedirectLimit(kMaxCORSRedirects)
|
| {
|
| ASSERT(client);
|
| +}
|
| +
|
| +void DocumentThreadableLoader::start(const ResourceRequest& request)
|
| +{
|
| // Setting an outgoing referer is only supported in the async code path.
|
| ASSERT(m_async || request.httpReferrer().isEmpty());
|
|
|
| + m_sameOriginRequest = securityOrigin()->canRequestNoSuborigin(request.url());
|
| + m_requestContext = request.requestContext();
|
| +
|
| if (!m_sameOriginRequest && m_options.crossOriginRequestPolicy == DenyCrossOriginRequests) {
|
| m_client->didFail(ResourceError(errorDomainBlinkInternal, 0, request.url().string(), "Cross origin requests are not supported."));
|
| return;
|
| @@ -128,7 +133,7 @@ DocumentThreadableLoader::DocumentThreadableLoader(Document& document, Threadabl
|
| // of FetchRequestMode is not speced yet except for XHR. So we set here.
|
| // FIXME: When we support fetch API in document, this value should not
|
| // be overridden here.
|
| - if (options.preflightPolicy == ForcePreflight)
|
| + if (m_options.preflightPolicy == ForcePreflight)
|
| newRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeCORSWithForcedPreflight);
|
| else
|
| newRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeCORS);
|
| @@ -603,11 +608,18 @@ void DocumentThreadableLoader::loadRequest(const ResourceRequest& request, Resou
|
| if (m_options.crossOriginRequestPolicy == AllowCrossOriginRequests)
|
| newRequest.setOriginRestriction(FetchRequest::NoOriginRestriction);
|
| ASSERT(!resource());
|
| +
|
| if (request.requestContext() == WebURLRequest::RequestContextVideo || request.requestContext() == WebURLRequest::RequestContextAudio)
|
| setResource(RawResource::fetchMedia(newRequest, m_document.fetcher()));
|
| else
|
| setResource(RawResource::fetch(newRequest, m_document.fetcher()));
|
| - if (resource() && resource()->loader()) {
|
| +
|
| + if (!resource()) {
|
| + m_client->didFail(ResourceError(errorDomainBlinkInternal, 0, requestURL.string(), "Failed to start loading."));
|
| + return;
|
| + }
|
| +
|
| + if (resource()->loader()) {
|
| unsigned long identifier = resource()->identifier();
|
| InspectorInstrumentation::documentThreadableLoaderStartedLoadingForClient(&m_document, identifier, m_client);
|
| }
|
|
|