summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp293
1 files changed, 150 insertions, 143 deletions
diff --git a/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
index f34ee2e5b9e..9178bf34ce1 100644
--- a/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
+++ b/chromium/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
@@ -37,9 +37,10 @@
#include "core/fetch/FetchRequest.h"
#include "core/fetch/Resource.h"
#include "core/fetch/ResourceFetcher.h"
-#include "core/frame/ContentSecurityPolicy.h"
-#include "core/frame/Frame.h"
+#include "core/frame/LocalFrame.h"
+#include "core/frame/csp/ContentSecurityPolicy.h"
#include "core/inspector/InspectorInstrumentation.h"
+#include "core/inspector/InspectorTraceEvents.h"
#include "core/loader/CrossOriginPreflightResultCache.h"
#include "core/loader/DocumentThreadableLoaderClient.h"
#include "core/loader/FrameLoader.h"
@@ -52,37 +53,48 @@
namespace WebCore {
-void DocumentThreadableLoader::loadResourceSynchronously(Document* document, const ResourceRequest& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options)
+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));
+ RefPtr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, &client, LoadSynchronously, request, options, resourceLoaderOptions));
ASSERT(loader->hasOneRef());
}
-PassRefPtr<DocumentThreadableLoader> DocumentThreadableLoader::create(Document* document, ThreadableLoaderClient* client, const ResourceRequest& request, const ThreadableLoaderOptions& options)
+PassRefPtr<DocumentThreadableLoader> DocumentThreadableLoader::create(Document& document, ThreadableLoaderClient* client, const ResourceRequest& request, const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions)
{
- RefPtr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, client, LoadAsynchronously, request, options));
+ RefPtr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, client, LoadAsynchronously, request, options, resourceLoaderOptions));
if (!loader->resource())
- loader = 0;
+ loader = nullptr;
return loader.release();
}
-DocumentThreadableLoader::DocumentThreadableLoader(Document* document, ThreadableLoaderClient* client, BlockingBehavior blockingBehavior, const ResourceRequest& request, const ThreadableLoaderOptions& options)
+DocumentThreadableLoader::DocumentThreadableLoader(Document& document, ThreadableLoaderClient* client, BlockingBehavior blockingBehavior, const ResourceRequest& request, 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()->canRequest(request.url()))
, m_simpleRequest(true)
, m_async(blockingBehavior == LoadAsynchronously)
, m_timeoutTimer(this, &DocumentThreadableLoader::didTimeout)
{
- ASSERT(document);
ASSERT(client);
// Setting an outgoing referer is only supported in the async code path.
ASSERT(m_async || request.httpReferrer().isEmpty());
+ // Save any CORS simple headers on the request here. If this request redirects cross-origin, we cancel the old request
+ // create a new one, and copy these headers.
+ const HTTPHeaderMap& headerMap = request.httpHeaderFields();
+ HTTPHeaderMap::const_iterator end = headerMap.end();
+ for (HTTPHeaderMap::const_iterator it = headerMap.begin(); it != end; ++it) {
+ if (isOnAccessControlSimpleRequestHeaderWhitelist(it->key, it->value))
+ m_simpleRequestHeaders.add(it->key, it->value);
+ }
+
if (m_sameOriginRequest || m_options.crossOriginRequestPolicy == AllowCrossOriginRequests) {
- loadRequest(request, DoSecurityCheck);
+ loadRequest(request, m_resourceLoaderOptions);
return;
}
@@ -98,42 +110,37 @@ void DocumentThreadableLoader::makeCrossOriginAccessRequest(const ResourceReques
{
ASSERT(m_options.crossOriginRequestPolicy == UseAccessControl);
- OwnPtr<ResourceRequest> crossOriginRequest = adoptPtr(new ResourceRequest(request));
+ if ((m_options.preflightPolicy == ConsiderPreflight && isSimpleCrossOriginAccessRequest(request.httpMethod(), request.httpHeaderFields())) || m_options.preflightPolicy == PreventPreflight) {
+ // Cross-origin requests are only allowed for HTTP and registered schemes. We would catch this when checking response headers later, but there is no reason to send a request that's guaranteed to be denied.
+ if (!SchemeRegistry::shouldTreatURLSchemeAsCORSEnabled(request.url().protocol())) {
+ m_client->didFailAccessControlCheck(ResourceError(errorDomainBlinkInternal, 0, request.url().string(), "Cross origin requests are only supported for HTTP."));
+ return;
+ }
- if ((m_options.preflightPolicy == ConsiderPreflight && isSimpleCrossOriginAccessRequest(crossOriginRequest->httpMethod(), crossOriginRequest->httpHeaderFields())) || m_options.preflightPolicy == PreventPreflight) {
- updateRequestForAccessControl(*crossOriginRequest, securityOrigin(), m_options.allowCredentials);
- makeSimpleCrossOriginAccessRequest(*crossOriginRequest);
+ ResourceRequest crossOriginRequest(request);
+ ResourceLoaderOptions crossOriginOptions(m_resourceLoaderOptions);
+ updateRequestForAccessControl(crossOriginRequest, securityOrigin(), effectiveAllowCredentials());
+ loadRequest(crossOriginRequest, crossOriginOptions);
} else {
m_simpleRequest = false;
+
+ OwnPtr<ResourceRequest> crossOriginRequest = adoptPtr(new ResourceRequest(request));
+ OwnPtr<ResourceLoaderOptions> crossOriginOptions = adoptPtr(new ResourceLoaderOptions(m_resourceLoaderOptions));
// Do not set the Origin header for preflight requests.
- updateRequestForAccessControl(*crossOriginRequest, 0, m_options.allowCredentials);
+ updateRequestForAccessControl(*crossOriginRequest, 0, effectiveAllowCredentials());
m_actualRequest = crossOriginRequest.release();
+ m_actualOptions = crossOriginOptions.release();
- if (CrossOriginPreflightResultCache::shared().canSkipPreflight(securityOrigin()->toString(), m_actualRequest->url(), m_options.allowCredentials, m_actualRequest->httpMethod(), m_actualRequest->httpHeaderFields()))
- preflightSuccess();
- else
- makeCrossOriginAccessRequestWithPreflight(*m_actualRequest);
- }
-}
-
-void DocumentThreadableLoader::makeSimpleCrossOriginAccessRequest(const ResourceRequest& request)
-{
- ASSERT(m_options.preflightPolicy != ForcePreflight);
- ASSERT(m_options.preflightPolicy == PreventPreflight || isSimpleCrossOriginAccessRequest(request.httpMethod(), request.httpHeaderFields()));
-
- // Cross-origin requests are only allowed for HTTP and registered schemes. We would catch this when checking response headers later, but there is no reason to send a request that's guaranteed to be denied.
- if (!SchemeRegistry::shouldTreatURLSchemeAsCORSEnabled(request.url().protocol())) {
- m_client->didFailAccessControlCheck(ResourceError(errorDomainBlinkInternal, 0, request.url().string(), "Cross origin requests are only supported for HTTP."));
- return;
+ if (CrossOriginPreflightResultCache::shared().canSkipPreflight(securityOrigin()->toString(), m_actualRequest->url(), effectiveAllowCredentials(), m_actualRequest->httpMethod(), m_actualRequest->httpHeaderFields())) {
+ loadActualRequest();
+ } else {
+ ResourceRequest preflightRequest = createAccessControlPreflightRequest(*m_actualRequest, securityOrigin());
+ // Create a ResourceLoaderOptions for preflight.
+ ResourceLoaderOptions preflightOptions = *m_actualOptions;
+ preflightOptions.allowCredentials = DoNotAllowStoredCredentials;
+ loadRequest(preflightRequest, preflightOptions);
+ }
}
-
- loadRequest(request, DoSecurityCheck);
-}
-
-void DocumentThreadableLoader::makeCrossOriginAccessRequestWithPreflight(const ResourceRequest& request)
-{
- ResourceRequest preflightRequest = createAccessControlPreflightRequest(request, securityOrigin());
- loadRequest(preflightRequest, DoSecurityCheck);
}
DocumentThreadableLoader::~DocumentThreadableLoader()
@@ -157,7 +164,7 @@ void DocumentThreadableLoader::cancelWithError(const ResourceError& error)
errorForCallback = ResourceError(errorDomainBlinkInternal, 0, resource()->url().string(), "Load cancelled");
errorForCallback.setIsCancellation(true);
}
- didFail(resource()->identifier(), errorForCallback);
+ m_client->didFail(errorForCallback);
}
clearResource();
m_client = 0;
@@ -193,19 +200,21 @@ void DocumentThreadableLoader::redirectReceived(Resource* resource, ResourceRequ
// original request was not same-origin.
if (m_options.crossOriginRequestPolicy == UseAccessControl) {
- InspectorInstrumentation::didReceiveCORSRedirectResponse(m_document->frame(), resource->identifier(), m_document->frame()->loader().documentLoader(), redirectResponse, 0);
+ InspectorInstrumentation::didReceiveCORSRedirectResponse(m_document.frame(), resource->identifier(), m_document.frame()->loader().documentLoader(), redirectResponse, 0);
bool allowRedirect = false;
String accessControlErrorDescription;
if (m_simpleRequest) {
- allowRedirect = checkCrossOriginAccessRedirectionUrl(request.url(), accessControlErrorDescription)
- && (m_sameOriginRequest || passesAccessControlCheck(redirectResponse, m_options.allowCredentials, securityOrigin(), accessControlErrorDescription));
+ allowRedirect = CrossOriginAccessControl::isLegalRedirectLocation(request.url(), accessControlErrorDescription)
+ && (m_sameOriginRequest || passesAccessControlCheck(redirectResponse, effectiveAllowCredentials(), securityOrigin(), accessControlErrorDescription));
} else {
accessControlErrorDescription = "The request was redirected to '"+ request.url().string() + "', which is disallowed for cross-origin requests that require preflight.";
}
if (allowRedirect) {
+ // FIXME: consider combining this with CORS redirect handling performed by
+ // CrossOriginAccessControl::handleRedirect().
clearResource();
RefPtr<SecurityOrigin> originalOrigin = SecurityOrigin::create(redirectResponse.url());
@@ -214,21 +223,24 @@ void DocumentThreadableLoader::redirectReceived(Resource* resource, ResourceRequ
// set the source origin to a globally unique identifier. (If the original request was same-origin, the origin of the new request
// should be the original URL origin.)
if (!m_sameOriginRequest && !originalOrigin->isSameSchemeHostPort(requestOrigin.get()))
- m_options.securityOrigin = SecurityOrigin::createUnique();
+ m_securityOrigin = SecurityOrigin::createUnique();
// Force any subsequent requests to use these checks.
m_sameOriginRequest = false;
// Since the request is no longer same-origin, if the user didn't request credentials in
// the first place, update our state so we neither request them nor expect they must be allowed.
- if (m_options.credentialsRequested == ClientDidNotRequestCredentials)
- m_options.allowCredentials = DoNotAllowStoredCredentials;
+ if (m_resourceLoaderOptions.credentialsRequested == ClientDidNotRequestCredentials)
+ m_forceDoNotAllowStoredCredentials = true;
// Remove any headers that may have been added by the network layer that cause access control to fail.
- request.clearHTTPContentType();
request.clearHTTPReferrer();
request.clearHTTPOrigin();
request.clearHTTPUserAgent();
- request.clearHTTPAccept();
+ // Add any CORS simple request headers which we previously saved from the original request.
+ HTTPHeaderMap::const_iterator end = m_simpleRequestHeaders.end();
+ for (HTTPHeaderMap::const_iterator it = m_simpleRequestHeaders.begin(); it != end; ++it) {
+ request.setHTTPHeaderField(it->key, it->value);
+ }
makeCrossOriginAccessRequest(request);
return;
}
@@ -260,66 +272,75 @@ void DocumentThreadableLoader::dataDownloaded(Resource* resource, int dataLength
void DocumentThreadableLoader::responseReceived(Resource* resource, const ResourceResponse& response)
{
ASSERT_UNUSED(resource, resource == this->resource());
- didReceiveResponse(resource->identifier(), response);
+ handleResponse(resource->identifier(), response);
}
-void DocumentThreadableLoader::didReceiveResponse(unsigned long identifier, const ResourceResponse& response)
+void DocumentThreadableLoader::handlePreflightResponse(unsigned long identifier, const ResourceResponse& response)
{
- ASSERT(m_client);
+ // Notifying the inspector here is necessary because a call to handlePreflightFailure() might synchronously
+ // cause the underlying ResourceLoader to be cancelled before it tells the inspector about the response.
+ // In that case, if we don't tell the inspector about the response now, the resource type in the inspector
+ // will default to "other" instead of something more descriptive.
+ DocumentLoader* loader = m_document.frame()->loader().documentLoader();
+ TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "ResourceReceiveResponse", "data", InspectorReceiveResponseEvent::data(identifier, m_document.frame(), response));
+ // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
+ InspectorInstrumentation::didReceiveResourceResponse(m_document.frame(), identifier, loader, response, resource() ? resource()->loader() : 0);
String accessControlErrorDescription;
- if (m_actualRequest) {
- DocumentLoader* loader = m_document->frame()->loader().documentLoader();
- InspectorInstrumentation::didReceiveResourceResponse(m_document->frame(), identifier, loader, response, resource() ? resource()->loader() : 0);
- if (!passesAccessControlCheck(response, m_options.allowCredentials, securityOrigin(), accessControlErrorDescription)) {
- preflightFailure(identifier, response.url().string(), accessControlErrorDescription);
- return;
- }
+ if (!passesAccessControlCheck(response, effectiveAllowCredentials(), securityOrigin(), accessControlErrorDescription)) {
+ handlePreflightFailure(response.url().string(), accessControlErrorDescription);
+ return;
+ }
- if (!passesPreflightStatusCheck(response, accessControlErrorDescription)) {
- preflightFailure(identifier, response.url().string(), accessControlErrorDescription);
- return;
- }
+ if (!passesPreflightStatusCheck(response, accessControlErrorDescription)) {
+ handlePreflightFailure(response.url().string(), accessControlErrorDescription);
+ return;
+ }
- OwnPtr<CrossOriginPreflightResultCacheItem> preflightResult = adoptPtr(new CrossOriginPreflightResultCacheItem(m_options.allowCredentials));
- if (!preflightResult->parse(response, accessControlErrorDescription)
- || !preflightResult->allowsCrossOriginMethod(m_actualRequest->httpMethod(), accessControlErrorDescription)
- || !preflightResult->allowsCrossOriginHeaders(m_actualRequest->httpHeaderFields(), accessControlErrorDescription)) {
- preflightFailure(identifier, response.url().string(), accessControlErrorDescription);
- return;
- }
+ OwnPtr<CrossOriginPreflightResultCacheItem> preflightResult = adoptPtr(new CrossOriginPreflightResultCacheItem(effectiveAllowCredentials()));
+ if (!preflightResult->parse(response, accessControlErrorDescription)
+ || !preflightResult->allowsCrossOriginMethod(m_actualRequest->httpMethod(), accessControlErrorDescription)
+ || !preflightResult->allowsCrossOriginHeaders(m_actualRequest->httpHeaderFields(), accessControlErrorDescription)) {
+ handlePreflightFailure(response.url().string(), accessControlErrorDescription);
+ return;
+ }
- CrossOriginPreflightResultCache::shared().appendEntry(securityOrigin()->toString(), m_actualRequest->url(), preflightResult.release());
- } else {
- if (!m_sameOriginRequest && m_options.crossOriginRequestPolicy == UseAccessControl) {
- if (!passesAccessControlCheck(response, m_options.allowCredentials, securityOrigin(), accessControlErrorDescription)) {
- m_client->didFailAccessControlCheck(ResourceError(errorDomainBlinkInternal, 0, response.url().string(), accessControlErrorDescription));
- return;
- }
- }
+ CrossOriginPreflightResultCache::shared().appendEntry(securityOrigin()->toString(), m_actualRequest->url(), preflightResult.release());
+}
- m_client->didReceiveResponse(identifier, response);
+void DocumentThreadableLoader::handleResponse(unsigned long identifier, const ResourceResponse& response)
+{
+ ASSERT(m_client);
+
+ if (m_actualRequest) {
+ handlePreflightResponse(identifier, response);
+ return;
}
+
+ if (!m_sameOriginRequest && m_options.crossOriginRequestPolicy == UseAccessControl) {
+ String accessControlErrorDescription;
+ if (!passesAccessControlCheck(response, effectiveAllowCredentials(), securityOrigin(), accessControlErrorDescription)) {
+ m_client->didFailAccessControlCheck(ResourceError(errorDomainBlinkInternal, 0, response.url().string(), accessControlErrorDescription));
+ return;
+ }
+ }
+
+ m_client->didReceiveResponse(identifier, response);
}
void DocumentThreadableLoader::dataReceived(Resource* resource, const char* data, int dataLength)
{
- ASSERT(resource == this->resource());
- didReceiveData(resource->identifier(), data, dataLength);
+ ASSERT_UNUSED(resource, resource == this->resource());
+ handleReceivedData(data, dataLength);
}
-void DocumentThreadableLoader::didReceiveData(unsigned long identifier, const char* data, int dataLength)
+void DocumentThreadableLoader::handleReceivedData(const char* data, int dataLength)
{
ASSERT(m_client);
-
// Preflight data should be invisible to clients.
- if (m_actualRequest) {
- InspectorInstrumentation::didReceiveData(m_document->frame(), identifier, 0, 0, dataLength);
- return;
- }
-
- m_client->didReceiveData(data, dataLength);
+ if (!m_actualRequest)
+ m_client->didReceiveData(data, dataLength);
}
void DocumentThreadableLoader::notifyFinished(Resource* resource)
@@ -330,30 +351,21 @@ void DocumentThreadableLoader::notifyFinished(Resource* resource)
m_timeoutTimer.stop();
if (resource->errorOccurred())
- didFail(resource->identifier(), resource->resourceError());
+ m_client->didFail(resource->resourceError());
else
- didFinishLoading(resource->identifier(), resource->loadFinishTime());
+ handleSuccessfulFinish(resource->identifier(), resource->loadFinishTime());
}
-void DocumentThreadableLoader::didFinishLoading(unsigned long identifier, double finishTime)
+void DocumentThreadableLoader::handleSuccessfulFinish(unsigned long identifier, double finishTime)
{
if (m_actualRequest) {
- InspectorInstrumentation::didFinishLoading(m_document->frame(), identifier, m_document->frame()->loader().documentLoader(), finishTime);
ASSERT(!m_sameOriginRequest);
ASSERT(m_options.crossOriginRequestPolicy == UseAccessControl);
- preflightSuccess();
+ loadActualRequest();
} else
m_client->didFinishLoading(identifier, finishTime);
}
-void DocumentThreadableLoader::didFail(unsigned long identifier, const ResourceError& error)
-{
- if (m_actualRequest)
- InspectorInstrumentation::didFailLoading(m_document->frame(), identifier, m_document->frame()->loader().documentLoader(), error);
-
- m_client->didFail(error);
-}
-
void DocumentThreadableLoader::didTimeout(Timer<DocumentThreadableLoader>* timer)
{
ASSERT_UNUSED(timer, timer == &m_timeoutTimer);
@@ -366,67 +378,70 @@ void DocumentThreadableLoader::didTimeout(Timer<DocumentThreadableLoader>* timer
cancelWithError(error);
}
-void DocumentThreadableLoader::preflightSuccess()
+void DocumentThreadableLoader::loadActualRequest()
{
OwnPtr<ResourceRequest> actualRequest;
actualRequest.swap(m_actualRequest);
+ OwnPtr<ResourceLoaderOptions> actualOptions;
+ actualOptions.swap(m_actualOptions);
- actualRequest->setHTTPOrigin(securityOrigin()->toString());
+ actualRequest->setHTTPOrigin(securityOrigin()->toAtomicString());
clearResource();
- // It should be ok to skip the security check since we already asked about the preflight request.
- loadRequest(*actualRequest, SkipSecurityCheck);
+ loadRequest(*actualRequest, *actualOptions);
}
-void DocumentThreadableLoader::preflightFailure(unsigned long identifier, const String& url, const String& errorDescription)
+void DocumentThreadableLoader::handlePreflightFailure(const String& url, const String& errorDescription)
{
ResourceError error(errorDomainBlinkInternal, 0, url, errorDescription);
- if (m_actualRequest)
- InspectorInstrumentation::didFailLoading(m_document->frame(), identifier, m_document->frame()->loader().documentLoader(), error);
- m_actualRequest = nullptr; // Prevent didFinishLoading() from bypassing access check.
+
+ // Prevent handleSuccessfulFinish() from bypassing access check.
+ m_actualRequest = nullptr;
+
m_client->didFailAccessControlCheck(error);
}
-void DocumentThreadableLoader::loadRequest(const ResourceRequest& request, SecurityCheckPolicy securityCheck)
+void DocumentThreadableLoader::loadRequest(const ResourceRequest& request, ResourceLoaderOptions resourceLoaderOptions)
{
// Any credential should have been removed from the cross-site requests.
const KURL& requestURL = request.url();
- m_options.securityCheck = securityCheck;
ASSERT(m_sameOriginRequest || requestURL.user().isEmpty());
ASSERT(m_sameOriginRequest || requestURL.pass().isEmpty());
- ThreadableLoaderOptions options = m_options;
+ // Update resourceLoaderOptions with enforced values.
+ if (m_forceDoNotAllowStoredCredentials)
+ resourceLoaderOptions.allowCredentials = DoNotAllowStoredCredentials;
+ resourceLoaderOptions.securityOrigin = m_securityOrigin;
if (m_async) {
- options.crossOriginCredentialPolicy = DoNotAskClientForCrossOriginCredentials;
if (m_actualRequest) {
- // Don't sniff content or send load callbacks for the preflight request.
- options.sendLoadCallbacks = DoNotSendCallbacks;
- options.sniffContent = DoNotSniffContent;
- // Keep buffering the data for the preflight request.
- options.dataBufferingPolicy = BufferData;
+ resourceLoaderOptions.sniffContent = DoNotSniffContent;
+ resourceLoaderOptions.dataBufferingPolicy = BufferData;
}
if (m_options.timeoutMilliseconds > 0)
- m_timeoutTimer.startOneShot(m_options.timeoutMilliseconds / 1000.0);
+ m_timeoutTimer.startOneShot(m_options.timeoutMilliseconds / 1000.0, FROM_HERE);
- FetchRequest newRequest(request, m_options.initiator, options);
+ FetchRequest newRequest(request, m_options.initiator, resourceLoaderOptions);
ASSERT(!resource());
- setResource(m_document->fetcher()->fetchRawResource(newRequest));
+ if (request.targetType() == ResourceRequest::TargetIsMedia)
+ setResource(m_document.fetcher()->fetchMedia(newRequest));
+ else
+ setResource(m_document.fetcher()->fetchRawResource(newRequest));
if (resource() && resource()->loader()) {
unsigned long identifier = resource()->identifier();
- InspectorInstrumentation::documentThreadableLoaderStartedLoadingForClient(m_document, identifier, m_client);
+ InspectorInstrumentation::documentThreadableLoaderStartedLoadingForClient(&m_document, identifier, m_client);
}
return;
}
- FetchRequest fetchRequest(request, m_options.initiator, options);
- ResourcePtr<Resource> resource = m_document->fetcher()->fetchSynchronously(fetchRequest);
+ FetchRequest fetchRequest(request, m_options.initiator, resourceLoaderOptions);
+ ResourcePtr<Resource> resource = m_document.fetcher()->fetchSynchronously(fetchRequest);
ResourceResponse response = resource ? resource->response() : ResourceResponse();
unsigned long identifier = resource ? resource->identifier() : std::numeric_limits<unsigned long>::max();
ResourceError error = resource ? resource->resourceError() : ResourceError();
- InspectorInstrumentation::documentThreadableLoaderStartedLoadingForClient(m_document, identifier, m_client);
+ InspectorInstrumentation::documentThreadableLoaderStartedLoadingForClient(&m_document, identifier, m_client);
if (!resource) {
m_client->didFail(error);
@@ -448,13 +463,13 @@ void DocumentThreadableLoader::loadRequest(const ResourceRequest& request, Secur
return;
}
- didReceiveResponse(identifier, response);
+ handleResponse(identifier, response);
SharedBuffer* data = resource->resourceBuffer();
if (data)
- didReceiveData(identifier, data->data(), data->size());
+ handleReceivedData(data->data(), data->size());
- didFinishLoading(identifier, 0.0);
+ handleSuccessfulFinish(identifier, 0.0);
}
bool DocumentThreadableLoader::isAllowedRedirect(const KURL& url) const
@@ -469,27 +484,19 @@ bool DocumentThreadableLoader::isAllowedByPolicy(const KURL& url) const
{
if (m_options.contentSecurityPolicyEnforcement != EnforceConnectSrcDirective)
return true;
- return m_document->contentSecurityPolicy()->allowConnectToSource(url);
+ return m_document.contentSecurityPolicy()->allowConnectToSource(url);
}
-SecurityOrigin* DocumentThreadableLoader::securityOrigin() const
+StoredCredentials DocumentThreadableLoader::effectiveAllowCredentials() const
{
- return m_options.securityOrigin ? m_options.securityOrigin.get() : m_document->securityOrigin();
+ if (m_forceDoNotAllowStoredCredentials)
+ return DoNotAllowStoredCredentials;
+ return m_resourceLoaderOptions.allowCredentials;
}
-bool DocumentThreadableLoader::checkCrossOriginAccessRedirectionUrl(const KURL& requestUrl, String& errorDescription)
+SecurityOrigin* DocumentThreadableLoader::securityOrigin() const
{
- if (!SchemeRegistry::shouldTreatURLSchemeAsCORSEnabled(requestUrl.protocol())) {
- errorDescription = "The request was redirected to a URL ('" + requestUrl.string() + "') which has a disallowed scheme for cross-origin requests.";
- return false;
- }
-
- if (!(requestUrl.user().isEmpty() && requestUrl.pass().isEmpty())) {
- errorDescription = "The request was redirected to a URL ('" + requestUrl.string() + "') containing userinfo, which is disallowed for cross-origin requests.";
- return false;
- }
-
- return true;
+ return m_securityOrigin ? m_securityOrigin.get() : m_document.securityOrigin();
}
} // namespace WebCore