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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 #include "core/loader/ThreadableLoaderClient.h" | 48 #include "core/loader/ThreadableLoaderClient.h" |
49 #include "core/page/ChromeClient.h" | 49 #include "core/page/ChromeClient.h" |
50 #include "core/page/Page.h" | 50 #include "core/page/Page.h" |
51 #include "platform/SharedBuffer.h" | 51 #include "platform/SharedBuffer.h" |
52 #include "platform/network/ResourceRequest.h" | 52 #include "platform/network/ResourceRequest.h" |
53 #include "platform/weborigin/SchemeRegistry.h" | 53 #include "platform/weborigin/SchemeRegistry.h" |
54 #include "platform/weborigin/SecurityOrigin.h" | 54 #include "platform/weborigin/SecurityOrigin.h" |
55 #include "public/platform/Platform.h" | 55 #include "public/platform/Platform.h" |
56 #include "public/platform/WebURLRequest.h" | 56 #include "public/platform/WebURLRequest.h" |
57 #include "wtf/Assertions.h" | 57 #include "wtf/Assertions.h" |
| 58 #include "wtf/PtrUtil.h" |
| 59 #include <memory> |
58 | 60 |
59 namespace blink { | 61 namespace blink { |
60 | 62 |
61 namespace { | 63 namespace { |
62 | 64 |
63 class EmptyDataHandle final : public WebDataConsumerHandle { | 65 class EmptyDataHandle final : public WebDataConsumerHandle { |
64 private: | 66 private: |
65 class EmptyDataReader final : public WebDataConsumerHandle::Reader { | 67 class EmptyDataReader final : public WebDataConsumerHandle::Reader { |
66 public: | 68 public: |
67 explicit EmptyDataReader(WebDataConsumerHandle::Client* client) : m_fact
ory(this) | 69 explicit EmptyDataReader(WebDataConsumerHandle::Client* client) : m_fact
ory(this) |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 // Max number of CORS redirects handled in DocumentThreadableLoader. | 119 // Max number of CORS redirects handled in DocumentThreadableLoader. |
118 // Same number as net/url_request/url_request.cc, and | 120 // Same number as net/url_request/url_request.cc, and |
119 // same number as https://fetch.spec.whatwg.org/#concept-http-fetch, Step 4. | 121 // same number as https://fetch.spec.whatwg.org/#concept-http-fetch, Step 4. |
120 // FIXME: currently the number of redirects is counted and limited here and in | 122 // FIXME: currently the number of redirects is counted and limited here and in |
121 // net/url_request/url_request.cc separately. | 123 // net/url_request/url_request.cc separately. |
122 static const int kMaxCORSRedirects = 20; | 124 static const int kMaxCORSRedirects = 20; |
123 | 125 |
124 void DocumentThreadableLoader::loadResourceSynchronously(Document& document, con
st ResourceRequest& request, ThreadableLoaderClient& client, const ThreadableLoa
derOptions& options, const ResourceLoaderOptions& resourceLoaderOptions) | 126 void DocumentThreadableLoader::loadResourceSynchronously(Document& document, con
st ResourceRequest& request, ThreadableLoaderClient& client, const ThreadableLoa
derOptions& options, const ResourceLoaderOptions& resourceLoaderOptions) |
125 { | 127 { |
126 // The loader will be deleted as soon as this function exits. | 128 // The loader will be deleted as soon as this function exits. |
127 OwnPtr<DocumentThreadableLoader> loader = adoptPtr(new DocumentThreadableLoa
der(document, &client, LoadSynchronously, options, resourceLoaderOptions)); | 129 std::unique_ptr<DocumentThreadableLoader> loader = wrapUnique(new DocumentTh
readableLoader(document, &client, LoadSynchronously, options, resourceLoaderOpti
ons)); |
128 loader->start(request); | 130 loader->start(request); |
129 } | 131 } |
130 | 132 |
131 PassOwnPtr<DocumentThreadableLoader> DocumentThreadableLoader::create(Document&
document, ThreadableLoaderClient* client, const ThreadableLoaderOptions& options
, const ResourceLoaderOptions& resourceLoaderOptions) | 133 std::unique_ptr<DocumentThreadableLoader> DocumentThreadableLoader::create(Docum
ent& document, ThreadableLoaderClient* client, const ThreadableLoaderOptions& op
tions, const ResourceLoaderOptions& resourceLoaderOptions) |
132 { | 134 { |
133 return adoptPtr(new DocumentThreadableLoader(document, client, LoadAsynchron
ously, options, resourceLoaderOptions)); | 135 return wrapUnique(new DocumentThreadableLoader(document, client, LoadAsynchr
onously, options, resourceLoaderOptions)); |
134 } | 136 } |
135 | 137 |
136 DocumentThreadableLoader::DocumentThreadableLoader(Document& document, Threadabl
eLoaderClient* client, BlockingBehavior blockingBehavior, const ThreadableLoader
Options& options, const ResourceLoaderOptions& resourceLoaderOptions) | 138 DocumentThreadableLoader::DocumentThreadableLoader(Document& document, Threadabl
eLoaderClient* client, BlockingBehavior blockingBehavior, const ThreadableLoader
Options& options, const ResourceLoaderOptions& resourceLoaderOptions) |
137 : m_client(client) | 139 : m_client(client) |
138 , m_document(&document) | 140 , m_document(&document) |
139 , m_options(options) | 141 , m_options(options) |
140 , m_resourceLoaderOptions(resourceLoaderOptions) | 142 , m_resourceLoaderOptions(resourceLoaderOptions) |
141 , m_forceDoNotAllowStoredCredentials(false) | 143 , m_forceDoNotAllowStoredCredentials(false) |
142 , m_securityOrigin(m_resourceLoaderOptions.securityOrigin) | 144 , m_securityOrigin(m_resourceLoaderOptions.securityOrigin) |
143 , m_sameOriginRequest(false) | 145 , m_sameOriginRequest(false) |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 // We use |m_redirectMode| to check the original redirect mode. | 446 // We use |m_redirectMode| to check the original redirect mode. |
445 // |request| is a new request for redirect. So we don't set the redirect | 447 // |request| is a new request for redirect. So we don't set the redirect |
446 // mode of it in WebURLLoaderImpl::Context::OnReceivedRedirect(). | 448 // mode of it in WebURLLoaderImpl::Context::OnReceivedRedirect(). |
447 ASSERT(request.useStreamOnResponse()); | 449 ASSERT(request.useStreamOnResponse()); |
448 // There is no need to read the body of redirect response because there | 450 // There is no need to read the body of redirect response because there |
449 // is no way to read the body of opaque-redirect filtered response's | 451 // is no way to read the body of opaque-redirect filtered response's |
450 // internal response. | 452 // internal response. |
451 // TODO(horo): If we support any API which expose the internal body, we | 453 // TODO(horo): If we support any API which expose the internal body, we |
452 // will have to read the body. And also HTTPCache changes will be needed | 454 // will have to read the body. And also HTTPCache changes will be needed |
453 // because it doesn't store the body of redirect responses. | 455 // because it doesn't store the body of redirect responses. |
454 responseReceived(resource, redirectResponse, adoptPtr(new EmptyDataHandl
e())); | 456 responseReceived(resource, redirectResponse, wrapUnique(new EmptyDataHan
dle())); |
455 | 457 |
456 if (!self) { | 458 if (!self) { |
457 request = ResourceRequest(); | 459 request = ResourceRequest(); |
458 return; | 460 return; |
459 } | 461 } |
460 | 462 |
461 if (m_client) { | 463 if (m_client) { |
462 ASSERT(m_actualRequest.isNull()); | 464 ASSERT(m_actualRequest.isNull()); |
463 notifyFinished(resource); | 465 notifyFinished(resource); |
464 } | 466 } |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 void DocumentThreadableLoader::didReceiveResourceTiming(Resource* resource, cons
t ResourceTimingInfo& info) | 591 void DocumentThreadableLoader::didReceiveResourceTiming(Resource* resource, cons
t ResourceTimingInfo& info) |
590 { | 592 { |
591 ASSERT(m_client); | 593 ASSERT(m_client); |
592 ASSERT_UNUSED(resource, resource == this->resource()); | 594 ASSERT_UNUSED(resource, resource == this->resource()); |
593 ASSERT(m_async); | 595 ASSERT(m_async); |
594 | 596 |
595 m_client->didReceiveResourceTiming(info); | 597 m_client->didReceiveResourceTiming(info); |
596 // |this| may be dead here. | 598 // |this| may be dead here. |
597 } | 599 } |
598 | 600 |
599 void DocumentThreadableLoader::responseReceived(Resource* resource, const Resour
ceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle) | 601 void DocumentThreadableLoader::responseReceived(Resource* resource, const Resour
ceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) |
600 { | 602 { |
601 ASSERT_UNUSED(resource, resource == this->resource()); | 603 ASSERT_UNUSED(resource, resource == this->resource()); |
602 ASSERT(m_async); | 604 ASSERT(m_async); |
603 | 605 |
604 if (handle) | 606 if (handle) |
605 m_isUsingDataConsumerHandle = true; | 607 m_isUsingDataConsumerHandle = true; |
606 | 608 |
607 handleResponse(resource->identifier(), response, std::move(handle)); | 609 handleResponse(resource->identifier(), response, std::move(handle)); |
608 // |this| may be dead here. | 610 // |this| may be dead here. |
609 } | 611 } |
(...skipping 13 matching lines...) Expand all Loading... |
623 // |this| may be dead here in async mode. | 625 // |this| may be dead here in async mode. |
624 return; | 626 return; |
625 } | 627 } |
626 | 628 |
627 if (m_actualRequest.isExternalRequest() && !passesExternalPreflightCheck(res
ponse, accessControlErrorDescription)) { | 629 if (m_actualRequest.isExternalRequest() && !passesExternalPreflightCheck(res
ponse, accessControlErrorDescription)) { |
628 handlePreflightFailure(response.url().getString(), accessControlErrorDes
cription); | 630 handlePreflightFailure(response.url().getString(), accessControlErrorDes
cription); |
629 // |this| may be dead here in async mode. | 631 // |this| may be dead here in async mode. |
630 return; | 632 return; |
631 } | 633 } |
632 | 634 |
633 OwnPtr<CrossOriginPreflightResultCacheItem> preflightResult = adoptPtr(new C
rossOriginPreflightResultCacheItem(effectiveAllowCredentials())); | 635 std::unique_ptr<CrossOriginPreflightResultCacheItem> preflightResult = wrapU
nique(new CrossOriginPreflightResultCacheItem(effectiveAllowCredentials())); |
634 if (!preflightResult->parse(response, accessControlErrorDescription) | 636 if (!preflightResult->parse(response, accessControlErrorDescription) |
635 || !preflightResult->allowsCrossOriginMethod(m_actualRequest.httpMethod(
), accessControlErrorDescription) | 637 || !preflightResult->allowsCrossOriginMethod(m_actualRequest.httpMethod(
), accessControlErrorDescription) |
636 || !preflightResult->allowsCrossOriginHeaders(m_actualRequest.httpHeader
Fields(), accessControlErrorDescription)) { | 638 || !preflightResult->allowsCrossOriginHeaders(m_actualRequest.httpHeader
Fields(), accessControlErrorDescription)) { |
637 handlePreflightFailure(response.url().getString(), accessControlErrorDes
cription); | 639 handlePreflightFailure(response.url().getString(), accessControlErrorDes
cription); |
638 // |this| may be dead here in async mode. | 640 // |this| may be dead here in async mode. |
639 return; | 641 return; |
640 } | 642 } |
641 | 643 |
642 CrossOriginPreflightResultCache::shared().appendEntry(getSecurityOrigin()->t
oString(), m_actualRequest.url(), std::move(preflightResult)); | 644 CrossOriginPreflightResultCache::shared().appendEntry(getSecurityOrigin()->t
oString(), m_actualRequest.url(), std::move(preflightResult)); |
643 } | 645 } |
644 | 646 |
645 void DocumentThreadableLoader::reportResponseReceived(unsigned long identifier,
const ResourceResponse& response) | 647 void DocumentThreadableLoader::reportResponseReceived(unsigned long identifier,
const ResourceResponse& response) |
646 { | 648 { |
647 LocalFrame* frame = document().frame(); | 649 LocalFrame* frame = document().frame(); |
648 // We are seeing crashes caused by nullptr (crbug.com/578849). But the frame | 650 // We are seeing crashes caused by nullptr (crbug.com/578849). But the frame |
649 // must be set here. TODO(horo): Find the root cause of the unset frame. | 651 // must be set here. TODO(horo): Find the root cause of the unset frame. |
650 ASSERT(frame); | 652 ASSERT(frame); |
651 if (!frame) | 653 if (!frame) |
652 return; | 654 return; |
653 DocumentLoader* loader = frame->loader().documentLoader(); | 655 DocumentLoader* loader = frame->loader().documentLoader(); |
654 TRACE_EVENT_INSTANT1("devtools.timeline", "ResourceReceiveResponse", TRACE_E
VENT_SCOPE_THREAD, "data", InspectorReceiveResponseEvent::data(identifier, frame
, response)); | 656 TRACE_EVENT_INSTANT1("devtools.timeline", "ResourceReceiveResponse", TRACE_E
VENT_SCOPE_THREAD, "data", InspectorReceiveResponseEvent::data(identifier, frame
, response)); |
655 InspectorInstrumentation::didReceiveResourceResponse(frame, identifier, load
er, response, resource()); | 657 InspectorInstrumentation::didReceiveResourceResponse(frame, identifier, load
er, response, resource()); |
656 frame->console().reportResourceResponseReceived(loader, identifier, response
); | 658 frame->console().reportResourceResponseReceived(loader, identifier, response
); |
657 } | 659 } |
658 | 660 |
659 void DocumentThreadableLoader::handleResponse(unsigned long identifier, const Re
sourceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle) | 661 void DocumentThreadableLoader::handleResponse(unsigned long identifier, const Re
sourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle) |
660 { | 662 { |
661 ASSERT(m_client); | 663 ASSERT(m_client); |
662 | 664 |
663 if (!m_actualRequest.isNull()) { | 665 if (!m_actualRequest.isNull()) { |
664 reportResponseReceived(identifier, response); | 666 reportResponseReceived(identifier, response); |
665 handlePreflightResponse(response); | 667 handlePreflightResponse(response); |
666 // |this| may be dead here in async mode. | 668 // |this| may be dead here in async mode. |
667 return; | 669 return; |
668 } | 670 } |
669 | 671 |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
991 return m_securityOrigin ? m_securityOrigin.get() : document().getSecurityOri
gin(); | 993 return m_securityOrigin ? m_securityOrigin.get() : document().getSecurityOri
gin(); |
992 } | 994 } |
993 | 995 |
994 Document& DocumentThreadableLoader::document() const | 996 Document& DocumentThreadableLoader::document() const |
995 { | 997 { |
996 ASSERT(m_document); | 998 ASSERT(m_document); |
997 return *m_document; | 999 return *m_document; |
998 } | 1000 } |
999 | 1001 |
1000 } // namespace blink | 1002 } // namespace blink |
OLD | NEW |