OLD | NEW |
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 "mojo/examples/html_viewer/weburlloader_impl.h" | 5 #include "mojo/examples/html_viewer/weburlloader_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/thread_task_runner_handle.h" | 9 #include "base/thread_task_runner_handle.h" |
10 #include "mojo/services/public/interfaces/network/network_service.mojom.h" | 10 #include "mojo/services/public/interfaces/network/network_service.mojom.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 WebURLRequestExtraData::WebURLRequestExtraData() { | 40 WebURLRequestExtraData::WebURLRequestExtraData() { |
41 } | 41 } |
42 | 42 |
43 WebURLRequestExtraData::~WebURLRequestExtraData() { | 43 WebURLRequestExtraData::~WebURLRequestExtraData() { |
44 } | 44 } |
45 | 45 |
46 WebURLLoaderImpl::WebURLLoaderImpl(NetworkService* network_service) | 46 WebURLLoaderImpl::WebURLLoaderImpl(NetworkService* network_service) |
47 : client_(NULL), | 47 : client_(NULL), |
48 weak_factory_(this) { | 48 weak_factory_(this) { |
49 network_service->CreateURLLoader(Get(&url_loader_)); | 49 network_service->CreateURLLoader(Get(&url_loader_)); |
50 url_loader_.set_client(this); | |
51 } | 50 } |
52 | 51 |
53 WebURLLoaderImpl::~WebURLLoaderImpl() { | 52 WebURLLoaderImpl::~WebURLLoaderImpl() { |
54 } | 53 } |
55 | 54 |
56 void WebURLLoaderImpl::loadSynchronously( | 55 void WebURLLoaderImpl::loadSynchronously( |
57 const blink::WebURLRequest& request, | 56 const blink::WebURLRequest& request, |
58 blink::WebURLResponse& response, | 57 blink::WebURLResponse& response, |
59 blink::WebURLError& error, | 58 blink::WebURLError& error, |
60 blink::WebData& data) { | 59 blink::WebData& data) { |
61 NOTIMPLEMENTED(); | 60 NOTIMPLEMENTED(); |
62 } | 61 } |
63 | 62 |
64 void WebURLLoaderImpl::loadAsynchronously(const blink::WebURLRequest& request, | 63 void WebURLLoaderImpl::loadAsynchronously(const blink::WebURLRequest& request, |
65 blink::WebURLLoaderClient* client) { | 64 blink::WebURLLoaderClient* client) { |
66 client_ = client; | 65 client_ = client; |
| 66 url_ = request.url(); |
67 | 67 |
68 URLRequestPtr url_request(URLRequest::New()); | 68 URLRequestPtr url_request(URLRequest::New()); |
69 url_request->url = request.url().spec(); | 69 url_request->url = url_.spec(); |
70 url_request->auto_follow_redirects = false; | 70 url_request->auto_follow_redirects = false; |
71 // TODO(darin): Copy other fields. | 71 // TODO(darin): Copy other fields. |
72 | 72 |
73 if (request.extraData()) { | 73 if (request.extraData()) { |
74 WebURLRequestExtraData* extra_data = | 74 WebURLRequestExtraData* extra_data = |
75 static_cast<WebURLRequestExtraData*>(request.extraData()); | 75 static_cast<WebURLRequestExtraData*>(request.extraData()); |
76 response_body_stream_ = extra_data->synthetic_response_body_stream.Pass(); | |
77 base::ThreadTaskRunnerHandle::Get()->PostTask( | 76 base::ThreadTaskRunnerHandle::Get()->PostTask( |
78 FROM_HERE, | 77 FROM_HERE, |
79 base::Bind(&WebURLLoaderImpl::OnReceivedResponse, | 78 base::Bind(&WebURLLoaderImpl::OnReceivedResponse, |
80 weak_factory_.GetWeakPtr(), | 79 weak_factory_.GetWeakPtr(), |
81 base::Passed(&extra_data->synthetic_response))); | 80 base::Passed(&extra_data->synthetic_response))); |
82 } else { | 81 } else { |
83 DataPipe pipe; | 82 url_loader_->Start(url_request.Pass(), |
84 url_loader_->Start(url_request.Pass(), pipe.producer_handle.Pass()); | 83 base::Bind(&WebURLLoaderImpl::OnReceivedResponse, |
85 response_body_stream_ = pipe.consumer_handle.Pass(); | 84 weak_factory_.GetWeakPtr())); |
86 } | 85 } |
87 } | 86 } |
88 | 87 |
89 void WebURLLoaderImpl::cancel() { | 88 void WebURLLoaderImpl::cancel() { |
90 url_loader_.reset(); | 89 url_loader_.reset(); |
91 response_body_stream_.reset(); | 90 response_body_stream_.reset(); |
92 | 91 |
93 NetworkErrorPtr network_error(NetworkError::New()); | 92 URLResponsePtr failed_response(URLResponse::New()); |
94 network_error->code = net::ERR_ABORTED; | 93 failed_response->url = url_.spec(); |
| 94 failed_response->error = NetworkError::New(); |
| 95 failed_response->error->code = net::ERR_ABORTED; |
95 | 96 |
96 base::ThreadTaskRunnerHandle::Get()->PostTask( | 97 base::ThreadTaskRunnerHandle::Get()->PostTask( |
97 FROM_HERE, | 98 FROM_HERE, |
98 base::Bind(&WebURLLoaderImpl::OnReceivedError, | 99 base::Bind(&WebURLLoaderImpl::OnReceivedResponse, |
99 weak_factory_.GetWeakPtr(), | 100 weak_factory_.GetWeakPtr(), |
100 base::Passed(&network_error))); | 101 base::Passed(&failed_response))); |
101 } | 102 } |
102 | 103 |
103 void WebURLLoaderImpl::setDefersLoading(bool defers_loading) { | 104 void WebURLLoaderImpl::setDefersLoading(bool defers_loading) { |
104 NOTIMPLEMENTED(); | 105 NOTIMPLEMENTED(); |
105 } | 106 } |
106 | 107 |
107 void WebURLLoaderImpl::OnReceivedRedirect(URLResponsePtr url_response, | 108 void WebURLLoaderImpl::OnReceivedResponse(URLResponsePtr url_response) { |
108 const String& new_url, | 109 url_ = GURL(url_response->url); |
109 const String& new_method) { | 110 |
| 111 if (url_response->error) { |
| 112 OnReceivedError(url_response.Pass()); |
| 113 } else if (url_response->redirect_url) { |
| 114 OnReceivedRedirect(url_response.Pass()); |
| 115 } else { |
| 116 client_->didReceiveResponse(this, ToWebURLResponse(url_response)); |
| 117 |
| 118 // Start streaming data |
| 119 response_body_stream_ = url_response->body.Pass(); |
| 120 ReadMore(); |
| 121 } |
| 122 } |
| 123 |
| 124 void WebURLLoaderImpl::OnReceivedError(URLResponsePtr url_response) { |
| 125 blink::WebURLError web_error; |
| 126 web_error.domain = blink::WebString::fromUTF8(net::kErrorDomain); |
| 127 web_error.reason = url_response->error->code; |
| 128 web_error.unreachableURL = GURL(url_response->url); |
| 129 web_error.staleCopyInCache = false; |
| 130 web_error.isCancellation = |
| 131 url_response->error->code == net::ERR_ABORTED ? true : false; |
| 132 |
| 133 client_->didFail(this, web_error); |
| 134 } |
| 135 |
| 136 void WebURLLoaderImpl::OnReceivedRedirect(URLResponsePtr url_response) { |
110 blink::WebURLRequest new_request; | 137 blink::WebURLRequest new_request; |
111 new_request.initialize(); | 138 new_request.initialize(); |
112 new_request.setURL(GURL(new_url)); | 139 new_request.setURL(GURL(url_response->redirect_url)); |
| 140 new_request.setHTTPMethod( |
| 141 blink::WebString::fromUTF8(url_response->redirect_method)); |
113 | 142 |
114 client_->willSendRequest(this, new_request, ToWebURLResponse(url_response)); | 143 client_->willSendRequest(this, new_request, ToWebURLResponse(url_response)); |
115 // TODO(darin): Check if new_request was rejected. | 144 // TODO(darin): Check if new_request was rejected. |
116 | 145 |
117 url_loader_->FollowRedirect(); | 146 url_loader_->FollowRedirect( |
118 } | 147 base::Bind(&WebURLLoaderImpl::OnReceivedResponse, |
119 | 148 weak_factory_.GetWeakPtr())); |
120 void WebURLLoaderImpl::OnReceivedResponse(URLResponsePtr url_response) { | |
121 client_->didReceiveResponse(this, ToWebURLResponse(url_response)); | |
122 | |
123 // Start streaming data | |
124 ReadMore(); | |
125 } | |
126 | |
127 void WebURLLoaderImpl::OnReceivedError(NetworkErrorPtr error) { | |
128 blink::WebURLError web_error; | |
129 web_error.domain = blink::WebString::fromUTF8(net::kErrorDomain); | |
130 web_error.reason = error->code; | |
131 web_error.unreachableURL = GURL(); // TODO(darin): Record this. | |
132 web_error.staleCopyInCache = false; | |
133 web_error.isCancellation = error->code == net::ERR_ABORTED ? true : false; | |
134 | |
135 client_->didFail(this, web_error); | |
136 } | |
137 | |
138 void WebURLLoaderImpl::OnReceivedEndOfResponseBody() { | |
139 // This is the signal that the response body was not truncated. | |
140 } | 149 } |
141 | 150 |
142 void WebURLLoaderImpl::ReadMore() { | 151 void WebURLLoaderImpl::ReadMore() { |
143 const void* buf; | 152 const void* buf; |
144 uint32_t buf_size; | 153 uint32_t buf_size; |
145 MojoResult rv = BeginReadDataRaw(response_body_stream_.get(), | 154 MojoResult rv = BeginReadDataRaw(response_body_stream_.get(), |
146 &buf, | 155 &buf, |
147 &buf_size, | 156 &buf_size, |
148 MOJO_READ_DATA_FLAG_NONE); | 157 MOJO_READ_DATA_FLAG_NONE); |
149 if (rv == MOJO_RESULT_OK) { | 158 if (rv == MOJO_RESULT_OK) { |
(...skipping 22 matching lines...) Expand all Loading... |
172 base::Bind(&WebURLLoaderImpl::OnResponseBodyStreamReady, | 181 base::Bind(&WebURLLoaderImpl::OnResponseBodyStreamReady, |
173 weak_factory_.GetWeakPtr())); | 182 weak_factory_.GetWeakPtr())); |
174 } | 183 } |
175 | 184 |
176 void WebURLLoaderImpl::OnResponseBodyStreamReady(MojoResult result) { | 185 void WebURLLoaderImpl::OnResponseBodyStreamReady(MojoResult result) { |
177 ReadMore(); | 186 ReadMore(); |
178 } | 187 } |
179 | 188 |
180 } // namespace examples | 189 } // namespace examples |
181 } // namespace mojo | 190 } // namespace mojo |
OLD | NEW |