Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: content/child/web_url_loader_impl.cc

Issue 1700233003: [WIP][SVG 2/4] Make data URL handling in ResourceFetcher and WebURLLoaderImpl consistent Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: auto-Rebase Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/child/web_url_loader_impl.h ('k') | third_party/WebKit/Source/core/fetch/Resource.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/child/web_url_loader_impl.h" 5 #include "content/child/web_url_loader_impl.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 void run() override { 329 void run() override {
330 context_->HandleDataURL(); 330 context_->HandleDataURL();
331 } 331 }
332 332
333 private: 333 private:
334 scoped_refptr<Context> context_; 334 scoped_refptr<Context> context_;
335 }; 335 };
336 336
337 // Called when the body data stream is detached from the reader side. 337 // Called when the body data stream is detached from the reader side.
338 void CancelBodyStreaming(); 338 void CancelBodyStreaming();
339 // We can optimize the handling of data URLs in most cases.
340 bool CanHandleDataURLRequestLocally() const;
341 void HandleDataURL(); 339 void HandleDataURL();
342 340
343 WebURLLoaderImpl* loader_; 341 WebURLLoaderImpl* loader_;
344 WebURLRequest request_; 342 WebURLRequest request_;
345 WebURLLoaderClient* client_; 343 WebURLLoaderClient* client_;
346 ResourceDispatcher* resource_dispatcher_; 344 ResourceDispatcher* resource_dispatcher_;
347 scoped_ptr<blink::WebTaskRunner> web_task_runner_; 345 scoped_ptr<blink::WebTaskRunner> web_task_runner_;
348 WebReferrerPolicy referrer_policy_; 346 WebReferrerPolicy referrer_policy_;
349 scoped_ptr<FtpDirectoryListingResponseDelegate> ftp_listing_delegate_; 347 scoped_ptr<FtpDirectoryListingResponseDelegate> ftp_listing_delegate_;
350 scoped_ptr<MultipartResponseDelegate> multipart_delegate_; 348 scoped_ptr<MultipartResponseDelegate> multipart_delegate_;
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 DCHECK(request_id_ == -1); 459 DCHECK(request_id_ == -1);
462 request_ = request; // Save the request. 460 request_ = request; // Save the request.
463 if (request.extraData()) { 461 if (request.extraData()) {
464 RequestExtraData* extra_data = 462 RequestExtraData* extra_data =
465 static_cast<RequestExtraData*>(request.extraData()); 463 static_cast<RequestExtraData*>(request.extraData());
466 stream_override_ = extra_data->TakeStreamOverrideOwnership(); 464 stream_override_ = extra_data->TakeStreamOverrideOwnership();
467 } 465 }
468 466
469 GURL url = request.url(); 467 GURL url = request.url();
470 468
471 if (CanHandleDataURLRequestLocally()) { 469 if (CanHandleDataURLRequestLocally(request_,
470 resource_dispatcher_ != nullptr)) {
472 if (sync_load_response) { 471 if (sync_load_response) {
473 // This is a sync load. Do the work now. 472 // This is a sync load. Do the work now.
474 sync_load_response->url = url; 473 sync_load_response->url = url;
475 sync_load_response->error_code = 474 sync_load_response->error_code =
476 GetInfoFromDataURL(sync_load_response->url, sync_load_response, 475 GetInfoFromDataURL(sync_load_response->url, sync_load_response,
477 &sync_load_response->data); 476 &sync_load_response->data);
478 } else { 477 } else {
479 // TODO(alexclarke): Find a way to let blink and chromium FROM_HERE 478 // TODO(alexclarke): Find a way to let blink and chromium FROM_HERE
480 // coexist. 479 // coexist.
481 web_task_runner_->postTask( 480 web_task_runner_->postTask(
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
804 if (client_) { 803 if (client_) {
805 // TODO(yhirano): Set |stale_copy_in_cache| appropriately if possible. 804 // TODO(yhirano): Set |stale_copy_in_cache| appropriately if possible.
806 client_->didFail( 805 client_->didFail(
807 loader_, CreateWebURLError(request_.url(), false, net::ERR_ABORTED)); 806 loader_, CreateWebURLError(request_.url(), false, net::ERR_ABORTED));
808 } 807 }
809 808
810 // Notify the browser process that the request is canceled. 809 // Notify the browser process that the request is canceled.
811 Cancel(); 810 Cancel();
812 } 811 }
813 812
814 bool WebURLLoaderImpl::Context::CanHandleDataURLRequestLocally() const { 813 bool WebURLLoaderImpl::CanHandleDataURLRequestLocally(
815 GURL url = request_.url(); 814 const WebURLRequest& request,
815 bool resource_dispatcher_exists) {
816 GURL url = request.url();
816 if (!url.SchemeIs(url::kDataScheme)) 817 if (!url.SchemeIs(url::kDataScheme))
817 return false; 818 return false;
818 819
819 // The fast paths for data URL, Start() and HandleDataURL(), don't support 820 // The fast paths for data URL, Start() and HandleDataURL(), don't support
820 // the downloadToFile option. 821 // the downloadToFile option.
821 if (request_.downloadToFile()) 822 if (request.downloadToFile())
822 return false; 823 return false;
823 824
824 // Data url requests from object tags may need to be intercepted as streams 825 // Data url requests from object tags may need to be intercepted as streams
825 // and so need to be sent to the browser. 826 // and so need to be sent to the browser.
826 if (request_.getRequestContext() == WebURLRequest::RequestContextObject) 827 if (request.getRequestContext() == WebURLRequest::RequestContextObject)
827 return false; 828 return false;
828 829
829 // Optimize for the case where we can handle a data URL locally. We must 830 // Optimize for the case where we can handle a data URL locally. We must
830 // skip this for data URLs targetted at frames since those could trigger a 831 // skip this for data URLs targetted at frames since those could trigger a
831 // download. 832 // download.
832 // 833 //
833 // NOTE: We special case MIME types we can render both for performance 834 // NOTE: We special case MIME types we can render both for performance
834 // reasons as well as to support unit tests. 835 // reasons as well as to support unit tests.
835 836
836 #if defined(OS_ANDROID) 837 #if defined(OS_ANDROID)
837 // For compatibility reasons on Android we need to expose top-level data:// 838 // For compatibility reasons on Android we need to expose top-level data://
838 // to the browser. In tests resource_dispatcher_ can be null, and test pages 839 // to the browser. In tests resource_dispatcher_ can be null, and test pages
839 // need to be loaded locally. 840 // need to be loaded locally.
840 if (resource_dispatcher_ && 841 if (resource_dispatcher_exists &&
841 request_.getFrameType() == WebURLRequest::FrameTypeTopLevel) 842 request.getFrameType() == WebURLRequest::FrameTypeTopLevel)
842 return false; 843 return false;
843 #endif 844 #endif
844 845
845 if (request_.getFrameType() != WebURLRequest::FrameTypeTopLevel && 846 if (request.getFrameType() != WebURLRequest::FrameTypeTopLevel &&
846 request_.getFrameType() != WebURLRequest::FrameTypeNested) 847 request.getFrameType() != WebURLRequest::FrameTypeNested)
847 return true; 848 return true;
848 849
849 std::string mime_type, unused_charset; 850 std::string mime_type, unused_charset;
850 if (net::DataURL::Parse(request_.url(), &mime_type, &unused_charset, NULL) && 851 if (net::DataURL::Parse(request.url(), &mime_type, &unused_charset, NULL) &&
851 mime_util::IsSupportedMimeType(mime_type)) 852 mime_util::IsSupportedMimeType(mime_type))
852 return true; 853 return true;
853 854
854 return false; 855 return false;
855 } 856 }
856 857
857 void WebURLLoaderImpl::Context::HandleDataURL() { 858 void WebURLLoaderImpl::Context::HandleDataURL() {
858 DCHECK_NE(defers_loading_, DEFERRED_DATA); 859 DCHECK_NE(defers_loading_, DEFERRED_DATA);
859 if (defers_loading_ == SHOULD_DEFER) { 860 if (defers_loading_ == SHOULD_DEFER) {
860 defers_loading_ = DEFERRED_DATA; 861 defers_loading_ = DEFERRED_DATA;
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 } 1155 }
1155 1156
1156 void WebURLLoaderImpl::setLoadingTaskRunner( 1157 void WebURLLoaderImpl::setLoadingTaskRunner(
1157 blink::WebTaskRunner* loading_task_runner) { 1158 blink::WebTaskRunner* loading_task_runner) {
1158 // There's no guarantee on the lifetime of |loading_task_runner| so we take a 1159 // There's no guarantee on the lifetime of |loading_task_runner| so we take a
1159 // copy. 1160 // copy.
1160 context_->SetWebTaskRunner(make_scoped_ptr(loading_task_runner->clone())); 1161 context_->SetWebTaskRunner(make_scoped_ptr(loading_task_runner->clone()));
1161 } 1162 }
1162 1163
1163 } // namespace content 1164 } // namespace content
OLDNEW
« no previous file with comments | « content/child/web_url_loader_impl.h ('k') | third_party/WebKit/Source/core/fetch/Resource.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698