| 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 * | 4 * |
| 4 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 6 * met: | 7 * met: |
| 7 * | 8 * |
| 8 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 11 * * Redistributions in binary form must reproduce the above |
| 11 * copyright notice, this list of conditions and the following disclaimer | 12 * copyright notice, this list of conditions and the following disclaimer |
| 12 * in the documentation and/or other materials provided with the | 13 * in the documentation and/or other materials provided with the |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 return loader.release(); | 68 return loader.release(); |
| 68 } | 69 } |
| 69 | 70 |
| 70 DocumentThreadableLoader::DocumentThreadableLoader(Document* document, Threadabl
eLoaderClient* client, BlockingBehavior blockingBehavior, const ResourceRequest&
request, const ThreadableLoaderOptions& options) | 71 DocumentThreadableLoader::DocumentThreadableLoader(Document* document, Threadabl
eLoaderClient* client, BlockingBehavior blockingBehavior, const ResourceRequest&
request, const ThreadableLoaderOptions& options) |
| 71 : m_client(client) | 72 : m_client(client) |
| 72 , m_document(document) | 73 , m_document(document) |
| 73 , m_options(options) | 74 , m_options(options) |
| 74 , m_sameOriginRequest(securityOrigin()->canRequest(request.url())) | 75 , m_sameOriginRequest(securityOrigin()->canRequest(request.url())) |
| 75 , m_simpleRequest(true) | 76 , m_simpleRequest(true) |
| 76 , m_async(blockingBehavior == LoadAsynchronously) | 77 , m_async(blockingBehavior == LoadAsynchronously) |
| 78 , m_timeoutTimer(this, &DocumentThreadableLoader::didTimeout) |
| 77 { | 79 { |
| 78 ASSERT(document); | 80 ASSERT(document); |
| 79 ASSERT(client); | 81 ASSERT(client); |
| 80 // Setting an outgoing referer is only supported in the async code path. | 82 // Setting an outgoing referer is only supported in the async code path. |
| 81 ASSERT(m_async || request.httpReferrer().isEmpty()); | 83 ASSERT(m_async || request.httpReferrer().isEmpty()); |
| 82 | 84 |
| 83 if (m_sameOriginRequest || m_options.crossOriginRequestPolicy == AllowCrossO
riginRequests) { | 85 if (m_sameOriginRequest || m_options.crossOriginRequestPolicy == AllowCrossO
riginRequests) { |
| 84 loadRequest(request, DoSecurityCheck); | 86 loadRequest(request, DoSecurityCheck); |
| 85 return; | 87 return; |
| 86 } | 88 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 } | 136 } |
| 135 | 137 |
| 136 DocumentThreadableLoader::~DocumentThreadableLoader() | 138 DocumentThreadableLoader::~DocumentThreadableLoader() |
| 137 { | 139 { |
| 138 if (m_resource) | 140 if (m_resource) |
| 139 m_resource->removeClient(this); | 141 m_resource->removeClient(this); |
| 140 } | 142 } |
| 141 | 143 |
| 142 void DocumentThreadableLoader::cancel() | 144 void DocumentThreadableLoader::cancel() |
| 143 { | 145 { |
| 146 cancelWithError(ResourceError()); |
| 147 } |
| 148 |
| 149 void DocumentThreadableLoader::cancelWithError(const ResourceError& error) |
| 150 { |
| 144 RefPtr<DocumentThreadableLoader> protect(this); | 151 RefPtr<DocumentThreadableLoader> protect(this); |
| 145 | 152 |
| 146 // Cancel can re-enter and m_resource might be null here as a result. | 153 // Cancel can re-enter and m_resource might be null here as a result. |
| 147 if (m_client && m_resource) { | 154 if (m_client && m_resource) { |
| 148 // FIXME: This error is sent to the client in didFail(), so it should no
t be an internal one. Use FrameLoaderClient::cancelledError() instead. | 155 ResourceError errorForCallback = error; |
| 149 ResourceError error(errorDomainWebKitInternal, 0, m_resource->url().stri
ng(), "Load cancelled"); | 156 if (errorForCallback.isNull()) { |
| 150 error.setIsCancellation(true); | 157 // FIXME: This error is sent to the client in didFail(), so it shoul
d not be an internal one. Use FrameLoaderClient::cancelledError() instead. |
| 151 didFail(m_resource->identifier(), error); | 158 errorForCallback = ResourceError(errorDomainWebKitInternal, 0, m_res
ource->url().string(), "Load cancelled"); |
| 159 errorForCallback.setIsCancellation(true); |
| 160 } |
| 161 didFail(m_resource->identifier(), errorForCallback); |
| 152 } | 162 } |
| 153 clearResource(); | 163 clearResource(); |
| 154 m_client = 0; | 164 m_client = 0; |
| 155 } | 165 } |
| 156 | 166 |
| 157 void DocumentThreadableLoader::setDefersLoading(bool value) | 167 void DocumentThreadableLoader::setDefersLoading(bool value) |
| 158 { | 168 { |
| 159 if (m_resource) | 169 if (m_resource) |
| 160 m_resource->setDefersLoading(value); | 170 m_resource->setDefersLoading(value); |
| 161 } | 171 } |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 return; | 322 return; |
| 313 } | 323 } |
| 314 | 324 |
| 315 m_client->didReceiveData(data, dataLength); | 325 m_client->didReceiveData(data, dataLength); |
| 316 } | 326 } |
| 317 | 327 |
| 318 void DocumentThreadableLoader::notifyFinished(CachedResource* resource) | 328 void DocumentThreadableLoader::notifyFinished(CachedResource* resource) |
| 319 { | 329 { |
| 320 ASSERT(m_client); | 330 ASSERT(m_client); |
| 321 ASSERT_UNUSED(resource, resource == m_resource); | 331 ASSERT_UNUSED(resource, resource == m_resource); |
| 332 |
| 333 m_timeoutTimer.stop(); |
| 322 | 334 |
| 323 if (m_resource->errorOccurred()) | 335 if (m_resource->errorOccurred()) |
| 324 didFail(m_resource->identifier(), m_resource->resourceError()); | 336 didFail(m_resource->identifier(), m_resource->resourceError()); |
| 325 else | 337 else |
| 326 didFinishLoading(m_resource->identifier(), m_resource->loadFinishTime())
; | 338 didFinishLoading(m_resource->identifier(), m_resource->loadFinishTime())
; |
| 327 } | 339 } |
| 328 | 340 |
| 329 void DocumentThreadableLoader::didFinishLoading(unsigned long identifier, double
finishTime) | 341 void DocumentThreadableLoader::didFinishLoading(unsigned long identifier, double
finishTime) |
| 330 { | 342 { |
| 331 if (m_actualRequest) { | 343 if (m_actualRequest) { |
| 332 InspectorInstrumentation::didFinishLoading(m_document->frame(), identifi
er, m_document->frame()->loader()->documentLoader(), finishTime); | 344 InspectorInstrumentation::didFinishLoading(m_document->frame(), identifi
er, m_document->frame()->loader()->documentLoader(), finishTime); |
| 333 ASSERT(!m_sameOriginRequest); | 345 ASSERT(!m_sameOriginRequest); |
| 334 ASSERT(m_options.crossOriginRequestPolicy == UseAccessControl); | 346 ASSERT(m_options.crossOriginRequestPolicy == UseAccessControl); |
| 335 preflightSuccess(); | 347 preflightSuccess(); |
| 336 } else | 348 } else |
| 337 m_client->didFinishLoading(identifier, finishTime); | 349 m_client->didFinishLoading(identifier, finishTime); |
| 338 } | 350 } |
| 339 | 351 |
| 340 void DocumentThreadableLoader::didFail(unsigned long identifier, const ResourceE
rror& error) | 352 void DocumentThreadableLoader::didFail(unsigned long identifier, const ResourceE
rror& error) |
| 341 { | 353 { |
| 342 if (m_actualRequest) | 354 if (m_actualRequest) |
| 343 InspectorInstrumentation::didFailLoading(m_document->frame(), identifier
, m_document->frame()->loader()->documentLoader(), error); | 355 InspectorInstrumentation::didFailLoading(m_document->frame(), identifier
, m_document->frame()->loader()->documentLoader(), error); |
| 344 | 356 |
| 345 m_client->didFail(error); | 357 m_client->didFail(error); |
| 346 } | 358 } |
| 347 | 359 |
| 360 void DocumentThreadableLoader::didTimeout(Timer<DocumentThreadableLoader>* timer
) |
| 361 { |
| 362 ASSERT_UNUSED(timer, timer == &m_timeoutTimer); |
| 363 |
| 364 // Using values from net/base/net_error_list.h ERR_TIMED_OUT, |
| 365 // Same as existing FIXME above - this error should be coming from FrameLoad
erClient to be identifiable. |
| 366 static const int timeoutError = -7; |
| 367 ResourceError error("net", timeoutError, m_resource->url(), String()); |
| 368 error.setIsTimeout(true); |
| 369 cancelWithError(error); |
| 370 } |
| 371 |
| 348 void DocumentThreadableLoader::preflightSuccess() | 372 void DocumentThreadableLoader::preflightSuccess() |
| 349 { | 373 { |
| 350 OwnPtr<ResourceRequest> actualRequest; | 374 OwnPtr<ResourceRequest> actualRequest; |
| 351 actualRequest.swap(m_actualRequest); | 375 actualRequest.swap(m_actualRequest); |
| 352 | 376 |
| 353 actualRequest->setHTTPOrigin(securityOrigin()->toString()); | 377 actualRequest->setHTTPOrigin(securityOrigin()->toString()); |
| 354 | 378 |
| 355 clearResource(); | 379 clearResource(); |
| 356 | 380 |
| 357 // It should be ok to skip the security check since we already asked about t
he preflight request. | 381 // It should be ok to skip the security check since we already asked about t
he preflight request. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 379 ThreadableLoaderOptions options = m_options; | 403 ThreadableLoaderOptions options = m_options; |
| 380 options.crossOriginCredentialPolicy = DoNotAskClientForCrossOriginCreden
tials; | 404 options.crossOriginCredentialPolicy = DoNotAskClientForCrossOriginCreden
tials; |
| 381 if (m_actualRequest) { | 405 if (m_actualRequest) { |
| 382 // Don't sniff content or send load callbacks for the preflight requ
est. | 406 // Don't sniff content or send load callbacks for the preflight requ
est. |
| 383 options.sendLoadCallbacks = DoNotSendCallbacks; | 407 options.sendLoadCallbacks = DoNotSendCallbacks; |
| 384 options.sniffContent = DoNotSniffContent; | 408 options.sniffContent = DoNotSniffContent; |
| 385 // Keep buffering the data for the preflight request. | 409 // Keep buffering the data for the preflight request. |
| 386 options.dataBufferingPolicy = BufferData; | 410 options.dataBufferingPolicy = BufferData; |
| 387 } | 411 } |
| 388 | 412 |
| 413 if (m_options.timeoutMilliseconds > 0) |
| 414 m_timeoutTimer.startOneShot(m_options.timeoutMilliseconds / 1000.0); |
| 415 |
| 389 CachedResourceRequest newRequest(request, m_options.initiator, options); | 416 CachedResourceRequest newRequest(request, m_options.initiator, options); |
| 390 ASSERT(!m_resource); | 417 ASSERT(!m_resource); |
| 391 m_resource = m_document->cachedResourceLoader()->requestRawResource(newR
equest); | 418 m_resource = m_document->cachedResourceLoader()->requestRawResource(newR
equest); |
| 392 if (m_resource) { | 419 if (m_resource) { |
| 393 if (m_resource->loader()) { | 420 if (m_resource->loader()) { |
| 394 unsigned long identifier = m_resource->identifier(); | 421 unsigned long identifier = m_resource->identifier(); |
| 395 InspectorInstrumentation::documentThreadableLoaderStartedLoading
ForClient(m_document, identifier, m_client); | 422 InspectorInstrumentation::documentThreadableLoaderStartedLoading
ForClient(m_document, identifier, m_client); |
| 396 } | 423 } |
| 397 m_resource->addClient(this); | 424 m_resource->addClient(this); |
| 398 } | 425 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 return true; | 480 return true; |
| 454 return m_document->contentSecurityPolicy()->allowConnectToSource(url); | 481 return m_document->contentSecurityPolicy()->allowConnectToSource(url); |
| 455 } | 482 } |
| 456 | 483 |
| 457 SecurityOrigin* DocumentThreadableLoader::securityOrigin() const | 484 SecurityOrigin* DocumentThreadableLoader::securityOrigin() const |
| 458 { | 485 { |
| 459 return m_options.securityOrigin ? m_options.securityOrigin.get() : m_documen
t->securityOrigin(); | 486 return m_options.securityOrigin ? m_options.securityOrigin.get() : m_documen
t->securityOrigin(); |
| 460 } | 487 } |
| 461 | 488 |
| 462 } // namespace WebCore | 489 } // namespace WebCore |
| OLD | NEW |