| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2013, Intel Corporation | 3 * Copyright (C) 2013, Intel Corporation |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 | 310 |
| 311 m_client->didDownloadData(dataLength); | 311 m_client->didDownloadData(dataLength); |
| 312 } | 312 } |
| 313 | 313 |
| 314 void DocumentThreadableLoader::responseReceived(Resource* resource, const Resour
ceResponse& response) | 314 void DocumentThreadableLoader::responseReceived(Resource* resource, const Resour
ceResponse& response) |
| 315 { | 315 { |
| 316 ASSERT_UNUSED(resource, resource == this->resource()); | 316 ASSERT_UNUSED(resource, resource == this->resource()); |
| 317 handleResponse(resource->identifier(), response); | 317 handleResponse(resource->identifier(), response); |
| 318 } | 318 } |
| 319 | 319 |
| 320 void DocumentThreadableLoader::handlePreflightResponse(unsigned long identifier,
const ResourceResponse& response) | 320 void DocumentThreadableLoader::handlePreflightResponse(const ResourceResponse& r
esponse) |
| 321 { | 321 { |
| 322 // Notifying the inspector here is necessary because a call to handlePreflig
htFailure() might synchronously | |
| 323 // cause the underlying ResourceLoader to be cancelled before it tells the i
nspector about the response. | |
| 324 // In that case, if we don't tell the inspector about the response now, the
resource type in the inspector | |
| 325 // will default to "other" instead of something more descriptive. | |
| 326 DocumentLoader* loader = m_document.frame()->loader().documentLoader(); | |
| 327 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Resour
ceReceiveResponse", "data", InspectorReceiveResponseEvent::data(identifier, m_do
cument.frame(), response)); | |
| 328 // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeli
ne migrates to tracing. | |
| 329 LocalFrame* frame = m_document.frame(); | |
| 330 InspectorInstrumentation::didReceiveResourceResponse(frame, identifier, load
er, response, resource() ? resource()->loader() : 0); | |
| 331 // It is essential that inspector gets resource response BEFORE console. | |
| 332 frame->console().reportResourceResponseReceived(loader, identifier, response
); | |
| 333 | |
| 334 String accessControlErrorDescription; | 322 String accessControlErrorDescription; |
| 335 | 323 |
| 336 if (!passesAccessControlCheck(response, effectiveAllowCredentials(), securit
yOrigin(), accessControlErrorDescription)) { | 324 if (!passesAccessControlCheck(response, effectiveAllowCredentials(), securit
yOrigin(), accessControlErrorDescription)) { |
| 337 handlePreflightFailure(response.url().string(), accessControlErrorDescri
ption); | 325 handlePreflightFailure(response.url().string(), accessControlErrorDescri
ption); |
| 338 return; | 326 return; |
| 339 } | 327 } |
| 340 | 328 |
| 341 if (!passesPreflightStatusCheck(response, accessControlErrorDescription)) { | 329 if (!passesPreflightStatusCheck(response, accessControlErrorDescription)) { |
| 342 handlePreflightFailure(response.url().string(), accessControlErrorDescri
ption); | 330 handlePreflightFailure(response.url().string(), accessControlErrorDescri
ption); |
| 343 return; | 331 return; |
| 344 } | 332 } |
| 345 | 333 |
| 346 OwnPtr<CrossOriginPreflightResultCacheItem> preflightResult = adoptPtr(new C
rossOriginPreflightResultCacheItem(effectiveAllowCredentials())); | 334 OwnPtr<CrossOriginPreflightResultCacheItem> preflightResult = adoptPtr(new C
rossOriginPreflightResultCacheItem(effectiveAllowCredentials())); |
| 347 if (!preflightResult->parse(response, accessControlErrorDescription) | 335 if (!preflightResult->parse(response, accessControlErrorDescription) |
| 348 || !preflightResult->allowsCrossOriginMethod(m_actualRequest->httpMethod
(), accessControlErrorDescription) | 336 || !preflightResult->allowsCrossOriginMethod(m_actualRequest->httpMethod
(), accessControlErrorDescription) |
| 349 || !preflightResult->allowsCrossOriginHeaders(m_actualRequest->httpHeade
rFields(), accessControlErrorDescription)) { | 337 || !preflightResult->allowsCrossOriginHeaders(m_actualRequest->httpHeade
rFields(), accessControlErrorDescription)) { |
| 350 handlePreflightFailure(response.url().string(), accessControlErrorDescri
ption); | 338 handlePreflightFailure(response.url().string(), accessControlErrorDescri
ption); |
| 351 return; | 339 return; |
| 352 } | 340 } |
| 353 | 341 |
| 354 CrossOriginPreflightResultCache::shared().appendEntry(securityOrigin()->toSt
ring(), m_actualRequest->url(), preflightResult.release()); | 342 CrossOriginPreflightResultCache::shared().appendEntry(securityOrigin()->toSt
ring(), m_actualRequest->url(), preflightResult.release()); |
| 355 } | 343 } |
| 356 | 344 |
| 345 void DocumentThreadableLoader::notifyResponseReceived(unsigned long identifier,
const ResourceResponse& response) |
| 346 { |
| 347 DocumentLoader* loader = m_document.frame()->loader().documentLoader(); |
| 348 TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Resour
ceReceiveResponse", "data", InspectorReceiveResponseEvent::data(identifier, m_do
cument.frame(), response)); |
| 349 LocalFrame* frame = m_document.frame(); |
| 350 InspectorInstrumentation::didReceiveResourceResponse(frame, identifier, load
er, response, resource() ? resource()->loader() : 0); |
| 351 // It is essential that inspector gets resource response BEFORE console. |
| 352 frame->console().reportResourceResponseReceived(loader, identifier, response
); |
| 353 } |
| 354 |
| 357 void DocumentThreadableLoader::handleResponse(unsigned long identifier, const Re
sourceResponse& response) | 355 void DocumentThreadableLoader::handleResponse(unsigned long identifier, const Re
sourceResponse& response) |
| 358 { | 356 { |
| 359 ASSERT(m_client); | 357 ASSERT(m_client); |
| 360 | 358 |
| 361 if (m_actualRequest) { | 359 if (m_actualRequest) { |
| 362 handlePreflightResponse(identifier, response); | 360 notifyResponseReceived(identifier, response); |
| 361 handlePreflightResponse(response); |
| 363 return; | 362 return; |
| 364 } | 363 } |
| 365 | 364 |
| 366 // If the response is fetched via ServiceWorker, the original URL of the res
ponse could be different from the URL of the request. | 365 // If the response is fetched via ServiceWorker, the original URL of the res
ponse could be different from the URL of the request. |
| 367 bool isCrossOriginResponse = false; | 366 bool isCrossOriginResponse = false; |
| 368 if (response.wasFetchedViaServiceWorker()) { | 367 if (response.wasFetchedViaServiceWorker()) { |
| 369 if (!isAllowedByPolicy(response.url())) { | 368 if (!isAllowedByPolicy(response.url())) { |
| 369 notifyResponseReceived(identifier, response); |
| 370 m_client->didFailRedirectCheck(); | 370 m_client->didFailRedirectCheck(); |
| 371 return; | 371 return; |
| 372 } | 372 } |
| 373 isCrossOriginResponse = !securityOrigin()->canRequest(response.url()); | 373 isCrossOriginResponse = !securityOrigin()->canRequest(response.url()); |
| 374 if (m_options.crossOriginRequestPolicy == DenyCrossOriginRequests && isC
rossOriginResponse) { | 374 if (m_options.crossOriginRequestPolicy == DenyCrossOriginRequests && isC
rossOriginResponse) { |
| 375 notifyResponseReceived(identifier, response); |
| 375 m_client->didFail(ResourceError(errorDomainBlinkInternal, 0, respons
e.url().string(), "Cross origin requests are not supported.")); | 376 m_client->didFail(ResourceError(errorDomainBlinkInternal, 0, respons
e.url().string(), "Cross origin requests are not supported.")); |
| 376 return; | 377 return; |
| 377 } | 378 } |
| 378 if (isCrossOriginResponse && m_resourceLoaderOptions.credentialsRequeste
d == ClientDidNotRequestCredentials) { | 379 if (isCrossOriginResponse && m_resourceLoaderOptions.credentialsRequeste
d == ClientDidNotRequestCredentials) { |
| 379 // Since the request is no longer same-origin, if the user didn't re
quest credentials in | 380 // Since the request is no longer same-origin, if the user didn't re
quest credentials in |
| 380 // the first place, update our state so we neither request them nor
expect they must be allowed. | 381 // the first place, update our state so we neither request them nor
expect they must be allowed. |
| 381 m_forceDoNotAllowStoredCredentials = true; | 382 m_forceDoNotAllowStoredCredentials = true; |
| 382 } | 383 } |
| 383 } else { | 384 } else { |
| 384 isCrossOriginResponse = !m_sameOriginRequest; | 385 isCrossOriginResponse = !m_sameOriginRequest; |
| 385 } | 386 } |
| 386 if (isCrossOriginResponse && m_options.crossOriginRequestPolicy == UseAccess
Control) { | 387 if (isCrossOriginResponse && m_options.crossOriginRequestPolicy == UseAccess
Control) { |
| 387 String accessControlErrorDescription; | 388 String accessControlErrorDescription; |
| 388 if (!passesAccessControlCheck(response, effectiveAllowCredentials(), sec
urityOrigin(), accessControlErrorDescription)) { | 389 if (!passesAccessControlCheck(response, effectiveAllowCredentials(), sec
urityOrigin(), accessControlErrorDescription)) { |
| 390 notifyResponseReceived(identifier, response); |
| 389 m_client->didFailAccessControlCheck(ResourceError(errorDomainBlinkIn
ternal, 0, response.url().string(), accessControlErrorDescription)); | 391 m_client->didFailAccessControlCheck(ResourceError(errorDomainBlinkIn
ternal, 0, response.url().string(), accessControlErrorDescription)); |
| 390 return; | 392 return; |
| 391 } | 393 } |
| 392 } | 394 } |
| 393 | 395 |
| 394 m_client->didReceiveResponse(identifier, response); | 396 m_client->didReceiveResponse(identifier, response); |
| 395 } | 397 } |
| 396 | 398 |
| 397 void DocumentThreadableLoader::dataReceived(Resource* resource, const char* data
, int dataLength) | 399 void DocumentThreadableLoader::dataReceived(Resource* resource, const char* data
, int dataLength) |
| 398 { | 400 { |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 return DoNotAllowStoredCredentials; | 567 return DoNotAllowStoredCredentials; |
| 566 return m_resourceLoaderOptions.allowCredentials; | 568 return m_resourceLoaderOptions.allowCredentials; |
| 567 } | 569 } |
| 568 | 570 |
| 569 SecurityOrigin* DocumentThreadableLoader::securityOrigin() const | 571 SecurityOrigin* DocumentThreadableLoader::securityOrigin() const |
| 570 { | 572 { |
| 571 return m_securityOrigin ? m_securityOrigin.get() : m_document.securityOrigin
(); | 573 return m_securityOrigin ? m_securityOrigin.get() : m_document.securityOrigin
(); |
| 572 } | 574 } |
| 573 | 575 |
| 574 } // namespace blink | 576 } // namespace blink |
| OLD | NEW |