OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/browser/loader/async_resource_handler.h" | 5 #include "content/browser/loader/async_resource_handler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 backing_(backing) { | 72 backing_(backing) { |
73 } | 73 } |
74 private: | 74 private: |
75 virtual ~DependentIOBuffer() {} | 75 virtual ~DependentIOBuffer() {} |
76 scoped_refptr<ResourceBuffer> backing_; | 76 scoped_refptr<ResourceBuffer> backing_; |
77 }; | 77 }; |
78 | 78 |
79 AsyncResourceHandler::AsyncResourceHandler( | 79 AsyncResourceHandler::AsyncResourceHandler( |
80 net::URLRequest* request, | 80 net::URLRequest* request, |
81 ResourceDispatcherHostImpl* rdh) | 81 ResourceDispatcherHostImpl* rdh) |
82 : ResourceMessageDelegate(request), | 82 : ResourceHandler(request), |
83 request_(request), | 83 ResourceMessageDelegate(request), |
84 rdh_(rdh), | 84 rdh_(rdh), |
85 pending_data_count_(0), | 85 pending_data_count_(0), |
86 allocation_size_(0), | 86 allocation_size_(0), |
87 did_defer_(false), | 87 did_defer_(false), |
88 has_checked_for_sufficient_resources_(false), | 88 has_checked_for_sufficient_resources_(false), |
89 sent_received_response_msg_(false), | 89 sent_received_response_msg_(false), |
90 sent_first_data_msg_(false) { | 90 sent_first_data_msg_(false) { |
91 InitializeResourceBufferConstants(); | 91 InitializeResourceBufferConstants(); |
92 } | 92 } |
93 | 93 |
94 AsyncResourceHandler::~AsyncResourceHandler() { | 94 AsyncResourceHandler::~AsyncResourceHandler() { |
95 if (has_checked_for_sufficient_resources_) | 95 if (has_checked_for_sufficient_resources_) |
96 rdh_->FinishedWithResourcesForRequest(request_); | 96 rdh_->FinishedWithResourcesForRequest(request()); |
97 } | 97 } |
98 | 98 |
99 bool AsyncResourceHandler::OnMessageReceived(const IPC::Message& message, | 99 bool AsyncResourceHandler::OnMessageReceived(const IPC::Message& message, |
100 bool* message_was_ok) { | 100 bool* message_was_ok) { |
101 bool handled = true; | 101 bool handled = true; |
102 IPC_BEGIN_MESSAGE_MAP_EX(AsyncResourceHandler, message, *message_was_ok) | 102 IPC_BEGIN_MESSAGE_MAP_EX(AsyncResourceHandler, message, *message_was_ok) |
103 IPC_MESSAGE_HANDLER(ResourceHostMsg_FollowRedirect, OnFollowRedirect) | 103 IPC_MESSAGE_HANDLER(ResourceHostMsg_FollowRedirect, OnFollowRedirect) |
104 IPC_MESSAGE_HANDLER(ResourceHostMsg_DataReceived_ACK, OnDataReceivedACK) | 104 IPC_MESSAGE_HANDLER(ResourceHostMsg_DataReceived_ACK, OnDataReceivedACK) |
105 IPC_MESSAGE_UNHANDLED(handled = false) | 105 IPC_MESSAGE_UNHANDLED(handled = false) |
106 IPC_END_MESSAGE_MAP_EX() | 106 IPC_END_MESSAGE_MAP_EX() |
107 return handled; | 107 return handled; |
108 } | 108 } |
109 | 109 |
110 void AsyncResourceHandler::OnFollowRedirect( | 110 void AsyncResourceHandler::OnFollowRedirect( |
111 int request_id, | 111 int request_id, |
112 bool has_new_first_party_for_cookies, | 112 bool has_new_first_party_for_cookies, |
113 const GURL& new_first_party_for_cookies) { | 113 const GURL& new_first_party_for_cookies) { |
114 if (!request_->status().is_success()) { | 114 if (!request()->status().is_success()) { |
115 DVLOG(1) << "OnFollowRedirect for invalid request"; | 115 DVLOG(1) << "OnFollowRedirect for invalid request"; |
116 return; | 116 return; |
117 } | 117 } |
118 | 118 |
119 if (has_new_first_party_for_cookies) | 119 if (has_new_first_party_for_cookies) |
120 request_->set_first_party_for_cookies(new_first_party_for_cookies); | 120 request()->set_first_party_for_cookies(new_first_party_for_cookies); |
121 | 121 |
122 ResumeIfDeferred(); | 122 ResumeIfDeferred(); |
123 } | 123 } |
124 | 124 |
125 void AsyncResourceHandler::OnDataReceivedACK(int request_id) { | 125 void AsyncResourceHandler::OnDataReceivedACK(int request_id) { |
126 if (pending_data_count_) { | 126 if (pending_data_count_) { |
127 --pending_data_count_; | 127 --pending_data_count_; |
128 | 128 |
129 buffer_->RecycleLeastRecentlyAllocated(); | 129 buffer_->RecycleLeastRecentlyAllocated(); |
130 if (buffer_->CanAllocate()) | 130 if (buffer_->CanAllocate()) |
131 ResumeIfDeferred(); | 131 ResumeIfDeferred(); |
132 } | 132 } |
133 } | 133 } |
134 | 134 |
135 bool AsyncResourceHandler::OnUploadProgress(int request_id, | 135 bool AsyncResourceHandler::OnUploadProgress(int request_id, |
136 uint64 position, | 136 uint64 position, |
137 uint64 size) { | 137 uint64 size) { |
138 const ResourceRequestInfoImpl* info = | 138 ResourceMessageFilter* filter = GetFilter(); |
139 ResourceRequestInfoImpl::ForRequest(request_); | 139 if (!filter) |
140 if (!info->filter()) | |
141 return false; | 140 return false; |
142 return info->filter()->Send( | 141 return filter->Send( |
143 new ResourceMsg_UploadProgress(request_id, position, size)); | 142 new ResourceMsg_UploadProgress(request_id, position, size)); |
144 } | 143 } |
145 | 144 |
146 bool AsyncResourceHandler::OnRequestRedirected(int request_id, | 145 bool AsyncResourceHandler::OnRequestRedirected(int request_id, |
147 const GURL& new_url, | 146 const GURL& new_url, |
148 ResourceResponse* response, | 147 ResourceResponse* response, |
149 bool* defer) { | 148 bool* defer) { |
150 const ResourceRequestInfoImpl* info = | 149 const ResourceRequestInfoImpl* info = GetRequestInfo(); |
151 ResourceRequestInfoImpl::ForRequest(request_); | |
152 if (!info->filter()) | 150 if (!info->filter()) |
153 return false; | 151 return false; |
154 | 152 |
155 *defer = did_defer_ = true; | 153 *defer = did_defer_ = true; |
156 | 154 |
157 if (rdh_->delegate()) { | 155 if (rdh_->delegate()) { |
158 rdh_->delegate()->OnRequestRedirected( | 156 rdh_->delegate()->OnRequestRedirected( |
159 new_url, request_, info->GetContext(), response); | 157 new_url, request(), info->GetContext(), response); |
160 } | 158 } |
161 | 159 |
162 DevToolsNetLogObserver::PopulateResponseInfo(request_, response); | 160 DevToolsNetLogObserver::PopulateResponseInfo(request(), response); |
163 response->head.request_start = request_->creation_time(); | 161 response->head.request_start = request()->creation_time(); |
164 response->head.response_start = TimeTicks::Now(); | 162 response->head.response_start = TimeTicks::Now(); |
165 return info->filter()->Send(new ResourceMsg_ReceivedRedirect( | 163 return info->filter()->Send(new ResourceMsg_ReceivedRedirect( |
166 request_id, new_url, response->head)); | 164 request_id, new_url, response->head)); |
167 } | 165 } |
168 | 166 |
169 bool AsyncResourceHandler::OnResponseStarted(int request_id, | 167 bool AsyncResourceHandler::OnResponseStarted(int request_id, |
170 ResourceResponse* response, | 168 ResourceResponse* response, |
171 bool* defer) { | 169 bool* defer) { |
172 // For changes to the main frame, inform the renderer of the new URL's | 170 // For changes to the main frame, inform the renderer of the new URL's |
173 // per-host settings before the request actually commits. This way the | 171 // per-host settings before the request actually commits. This way the |
174 // renderer will be able to set these precisely at the time the | 172 // renderer will be able to set these precisely at the time the |
175 // request commits, avoiding the possibility of e.g. zooming the old content | 173 // request commits, avoiding the possibility of e.g. zooming the old content |
176 // or of having to layout the new content twice. | 174 // or of having to layout the new content twice. |
177 | 175 |
178 const ResourceRequestInfoImpl* info = | 176 const ResourceRequestInfoImpl* info = GetRequestInfo(); |
179 ResourceRequestInfoImpl::ForRequest(request_); | |
180 if (!info->filter()) | 177 if (!info->filter()) |
181 return false; | 178 return false; |
182 | 179 |
183 if (rdh_->delegate()) { | 180 if (rdh_->delegate()) { |
184 rdh_->delegate()->OnResponseStarted( | 181 rdh_->delegate()->OnResponseStarted( |
185 request_, info->GetContext(), response, info->filter()); | 182 request(), info->GetContext(), response, info->filter()); |
186 } | 183 } |
187 | 184 |
188 DevToolsNetLogObserver::PopulateResponseInfo(request_, response); | 185 DevToolsNetLogObserver::PopulateResponseInfo(request(), response); |
189 | 186 |
190 HostZoomMap* host_zoom_map = | 187 HostZoomMap* host_zoom_map = |
191 GetHostZoomMapForResourceContext(info->GetContext()); | 188 GetHostZoomMapForResourceContext(info->GetContext()); |
192 | 189 |
193 if (info->GetResourceType() == ResourceType::MAIN_FRAME && host_zoom_map) { | 190 if (info->GetResourceType() == ResourceType::MAIN_FRAME && host_zoom_map) { |
194 const GURL& request_url = request_->url(); | 191 const GURL& request_url = request()->url(); |
195 info->filter()->Send(new ViewMsg_SetZoomLevelForLoadingURL( | 192 info->filter()->Send(new ViewMsg_SetZoomLevelForLoadingURL( |
196 info->GetRouteID(), | 193 info->GetRouteID(), |
197 request_url, host_zoom_map->GetZoomLevelForHostAndScheme( | 194 request_url, host_zoom_map->GetZoomLevelForHostAndScheme( |
198 request_url.scheme(), | 195 request_url.scheme(), |
199 net::GetHostOrSpecFromURL(request_url)))); | 196 net::GetHostOrSpecFromURL(request_url)))); |
200 } | 197 } |
201 | 198 |
202 response->head.request_start = request_->creation_time(); | 199 response->head.request_start = request()->creation_time(); |
203 response->head.response_start = TimeTicks::Now(); | 200 response->head.response_start = TimeTicks::Now(); |
204 info->filter()->Send(new ResourceMsg_ReceivedResponse(request_id, | 201 info->filter()->Send(new ResourceMsg_ReceivedResponse(request_id, |
205 response->head)); | 202 response->head)); |
206 sent_received_response_msg_ = true; | 203 sent_received_response_msg_ = true; |
207 | 204 |
208 if (request_->response_info().metadata.get()) { | 205 if (request()->response_info().metadata.get()) { |
209 std::vector<char> copy(request_->response_info().metadata->data(), | 206 std::vector<char> copy(request()->response_info().metadata->data(), |
210 request_->response_info().metadata->data() + | 207 request()->response_info().metadata->data() + |
211 request_->response_info().metadata->size()); | 208 request()->response_info().metadata->size()); |
212 info->filter()->Send(new ResourceMsg_ReceivedCachedMetadata(request_id, | 209 info->filter()->Send(new ResourceMsg_ReceivedCachedMetadata(request_id, |
213 copy)); | 210 copy)); |
214 } | 211 } |
215 | 212 |
216 return true; | 213 return true; |
217 } | 214 } |
218 | 215 |
219 bool AsyncResourceHandler::OnWillStart(int request_id, | 216 bool AsyncResourceHandler::OnWillStart(int request_id, |
220 const GURL& url, | 217 const GURL& url, |
221 bool* defer) { | 218 bool* defer) { |
222 return true; | 219 return true; |
223 } | 220 } |
224 | 221 |
225 bool AsyncResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf, | 222 bool AsyncResourceHandler::OnWillRead(int request_id, |
226 int* buf_size, int min_size) { | 223 scoped_refptr<net::IOBuffer>* buf, |
| 224 int* buf_size, |
| 225 int min_size) { |
227 DCHECK_EQ(-1, min_size); | 226 DCHECK_EQ(-1, min_size); |
228 | 227 |
229 if (!EnsureResourceBufferIsInitialized()) | 228 if (!EnsureResourceBufferIsInitialized()) |
230 return false; | 229 return false; |
231 | 230 |
232 DCHECK(buffer_->CanAllocate()); | 231 DCHECK(buffer_->CanAllocate()); |
233 char* memory = buffer_->Allocate(&allocation_size_); | 232 char* memory = buffer_->Allocate(&allocation_size_); |
234 CHECK(memory); | 233 CHECK(memory); |
235 | 234 |
236 *buf = new DependentIOBuffer(buffer_.get(), memory); | 235 *buf = new DependentIOBuffer(buffer_.get(), memory); |
237 *buf_size = allocation_size_; | 236 *buf_size = allocation_size_; |
238 | 237 |
239 UMA_HISTOGRAM_CUSTOM_COUNTS( | 238 UMA_HISTOGRAM_CUSTOM_COUNTS( |
240 "Net.AsyncResourceHandler_SharedIOBuffer_Alloc", | 239 "Net.AsyncResourceHandler_SharedIOBuffer_Alloc", |
241 *buf_size, 0, kMaxAllocationSize, 100); | 240 *buf_size, 0, kMaxAllocationSize, 100); |
242 return true; | 241 return true; |
243 } | 242 } |
244 | 243 |
245 bool AsyncResourceHandler::OnReadCompleted(int request_id, int bytes_read, | 244 bool AsyncResourceHandler::OnReadCompleted(int request_id, int bytes_read, |
246 bool* defer) { | 245 bool* defer) { |
247 if (!bytes_read) | 246 if (!bytes_read) |
248 return true; | 247 return true; |
249 | 248 |
250 const ResourceRequestInfoImpl* info = | 249 ResourceMessageFilter* filter = GetFilter(); |
251 ResourceRequestInfoImpl::ForRequest(request_); | 250 if (!filter) |
252 if (!info->filter()) | |
253 return false; | 251 return false; |
254 | 252 |
255 buffer_->ShrinkLastAllocation(bytes_read); | 253 buffer_->ShrinkLastAllocation(bytes_read); |
256 | 254 |
257 UMA_HISTOGRAM_CUSTOM_COUNTS( | 255 UMA_HISTOGRAM_CUSTOM_COUNTS( |
258 "Net.AsyncResourceHandler_SharedIOBuffer_Used", | 256 "Net.AsyncResourceHandler_SharedIOBuffer_Used", |
259 bytes_read, 0, kMaxAllocationSize, 100); | 257 bytes_read, 0, kMaxAllocationSize, 100); |
260 UMA_HISTOGRAM_PERCENTAGE( | 258 UMA_HISTOGRAM_PERCENTAGE( |
261 "Net.AsyncResourceHandler_SharedIOBuffer_UsedPercentage", | 259 "Net.AsyncResourceHandler_SharedIOBuffer_UsedPercentage", |
262 CalcUsedPercentage(bytes_read, allocation_size_)); | 260 CalcUsedPercentage(bytes_read, allocation_size_)); |
263 | 261 |
264 if (!sent_first_data_msg_) { | 262 if (!sent_first_data_msg_) { |
265 base::SharedMemoryHandle handle; | 263 base::SharedMemoryHandle handle; |
266 int size; | 264 int size; |
267 if (!buffer_->ShareToProcess(info->filter()->PeerHandle(), &handle, &size)) | 265 if (!buffer_->ShareToProcess(filter->PeerHandle(), &handle, &size)) |
268 return false; | 266 return false; |
269 info->filter()->Send(new ResourceMsg_SetDataBuffer( | 267 filter->Send(new ResourceMsg_SetDataBuffer( |
270 request_id, handle, size, info->filter()->peer_pid())); | 268 request_id, handle, size, filter->peer_pid())); |
271 sent_first_data_msg_ = true; | 269 sent_first_data_msg_ = true; |
272 } | 270 } |
273 | 271 |
274 int data_offset = buffer_->GetLastAllocationOffset(); | 272 int data_offset = buffer_->GetLastAllocationOffset(); |
275 int encoded_data_length = | 273 int encoded_data_length = |
276 DevToolsNetLogObserver::GetAndResetEncodedDataLength(request_); | 274 DevToolsNetLogObserver::GetAndResetEncodedDataLength(request()); |
277 | 275 |
278 info->filter()->Send(new ResourceMsg_DataReceived( | 276 filter->Send(new ResourceMsg_DataReceived( |
279 request_id, data_offset, bytes_read, encoded_data_length)); | 277 request_id, data_offset, bytes_read, encoded_data_length)); |
280 ++pending_data_count_; | 278 ++pending_data_count_; |
281 UMA_HISTOGRAM_CUSTOM_COUNTS( | 279 UMA_HISTOGRAM_CUSTOM_COUNTS( |
282 "Net.AsyncResourceHandler_PendingDataCount", | 280 "Net.AsyncResourceHandler_PendingDataCount", |
283 pending_data_count_, 0, 100, 100); | 281 pending_data_count_, 0, 100, 100); |
284 | 282 |
285 if (!buffer_->CanAllocate()) { | 283 if (!buffer_->CanAllocate()) { |
286 UMA_HISTOGRAM_CUSTOM_COUNTS( | 284 UMA_HISTOGRAM_CUSTOM_COUNTS( |
287 "Net.AsyncResourceHandler_PendingDataCount_WhenFull", | 285 "Net.AsyncResourceHandler_PendingDataCount_WhenFull", |
288 pending_data_count_, 0, 100, 100); | 286 pending_data_count_, 0, 100, 100); |
289 *defer = did_defer_ = true; | 287 *defer = did_defer_ = true; |
290 } | 288 } |
291 | 289 |
292 return true; | 290 return true; |
293 } | 291 } |
294 | 292 |
295 void AsyncResourceHandler::OnDataDownloaded( | 293 void AsyncResourceHandler::OnDataDownloaded( |
296 int request_id, int bytes_downloaded) { | 294 int request_id, int bytes_downloaded) { |
297 int encoded_data_length = | 295 int encoded_data_length = |
298 DevToolsNetLogObserver::GetAndResetEncodedDataLength(request_); | 296 DevToolsNetLogObserver::GetAndResetEncodedDataLength(request()); |
299 | 297 |
300 const ResourceRequestInfoImpl* info = | 298 ResourceMessageFilter* filter = GetFilter(); |
301 ResourceRequestInfoImpl::ForRequest(request_); | 299 if (filter) { |
302 if (info->filter()) { | 300 filter->Send(new ResourceMsg_DataDownloaded( |
303 info->filter()->Send(new ResourceMsg_DataDownloaded( | |
304 request_id, bytes_downloaded, encoded_data_length)); | 301 request_id, bytes_downloaded, encoded_data_length)); |
305 } | 302 } |
306 } | 303 } |
307 | 304 |
308 bool AsyncResourceHandler::OnResponseCompleted( | 305 bool AsyncResourceHandler::OnResponseCompleted( |
309 int request_id, | 306 int request_id, |
310 const net::URLRequestStatus& status, | 307 const net::URLRequestStatus& status, |
311 const std::string& security_info) { | 308 const std::string& security_info) { |
312 const ResourceRequestInfoImpl* info = | 309 const ResourceRequestInfoImpl* info = GetRequestInfo(); |
313 ResourceRequestInfoImpl::ForRequest(request_); | |
314 if (!info->filter()) | 310 if (!info->filter()) |
315 return false; | 311 return false; |
316 | 312 |
317 // If we crash here, figure out what URL the renderer was requesting. | 313 // If we crash here, figure out what URL the renderer was requesting. |
318 // http://crbug.com/107692 | 314 // http://crbug.com/107692 |
319 char url_buf[128]; | 315 char url_buf[128]; |
320 base::strlcpy(url_buf, request_->url().spec().c_str(), arraysize(url_buf)); | 316 base::strlcpy(url_buf, request()->url().spec().c_str(), arraysize(url_buf)); |
321 base::debug::Alias(url_buf); | 317 base::debug::Alias(url_buf); |
322 | 318 |
323 // TODO(gavinp): Remove this CHECK when we figure out the cause of | 319 // TODO(gavinp): Remove this CHECK when we figure out the cause of |
324 // http://crbug.com/124680 . This check mirrors closely check in | 320 // http://crbug.com/124680 . This check mirrors closely check in |
325 // WebURLLoaderImpl::OnCompletedRequest that routes this message to a WebCore | 321 // WebURLLoaderImpl::OnCompletedRequest that routes this message to a WebCore |
326 // ResourceHandleInternal which asserts on its state and crashes. By crashing | 322 // ResourceHandleInternal which asserts on its state and crashes. By crashing |
327 // when the message is sent, we should get better crash reports. | 323 // when the message is sent, we should get better crash reports. |
328 CHECK(status.status() != net::URLRequestStatus::SUCCESS || | 324 CHECK(status.status() != net::URLRequestStatus::SUCCESS || |
329 sent_received_response_msg_); | 325 sent_received_response_msg_); |
330 | 326 |
331 TimeTicks completion_time = TimeTicks::Now(); | 327 TimeTicks completion_time = TimeTicks::Now(); |
332 | 328 |
333 int error_code = status.error(); | 329 int error_code = status.error(); |
334 bool was_ignored_by_handler = | 330 bool was_ignored_by_handler = info->WasIgnoredByHandler(); |
335 ResourceRequestInfoImpl::ForRequest(request_)->WasIgnoredByHandler(); | |
336 | 331 |
337 DCHECK(status.status() != net::URLRequestStatus::IO_PENDING); | 332 DCHECK(status.status() != net::URLRequestStatus::IO_PENDING); |
338 // If this check fails, then we're in an inconsistent state because all | 333 // If this check fails, then we're in an inconsistent state because all |
339 // requests ignored by the handler should be canceled (which should result in | 334 // requests ignored by the handler should be canceled (which should result in |
340 // the ERR_ABORTED error code). | 335 // the ERR_ABORTED error code). |
341 DCHECK(!was_ignored_by_handler || error_code == net::ERR_ABORTED); | 336 DCHECK(!was_ignored_by_handler || error_code == net::ERR_ABORTED); |
342 | 337 |
343 // TODO(mkosiba): Fix up cases where we create a URLRequestStatus | 338 // TODO(mkosiba): Fix up cases where we create a URLRequestStatus |
344 // with a status() != SUCCESS and an error_code() == net::OK. | 339 // with a status() != SUCCESS and an error_code() == net::OK. |
345 if (status.status() == net::URLRequestStatus::CANCELED && | 340 if (status.status() == net::URLRequestStatus::CANCELED && |
(...skipping 12 matching lines...) Expand all Loading... |
358 completion_time)); | 353 completion_time)); |
359 return true; | 354 return true; |
360 } | 355 } |
361 | 356 |
362 bool AsyncResourceHandler::EnsureResourceBufferIsInitialized() { | 357 bool AsyncResourceHandler::EnsureResourceBufferIsInitialized() { |
363 if (buffer_.get() && buffer_->IsInitialized()) | 358 if (buffer_.get() && buffer_->IsInitialized()) |
364 return true; | 359 return true; |
365 | 360 |
366 if (!has_checked_for_sufficient_resources_) { | 361 if (!has_checked_for_sufficient_resources_) { |
367 has_checked_for_sufficient_resources_ = true; | 362 has_checked_for_sufficient_resources_ = true; |
368 if (!rdh_->HasSufficientResourcesForRequest(request_)) { | 363 if (!rdh_->HasSufficientResourcesForRequest(request())) { |
369 controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); | 364 controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); |
370 return false; | 365 return false; |
371 } | 366 } |
372 } | 367 } |
373 | 368 |
374 buffer_ = new ResourceBuffer(); | 369 buffer_ = new ResourceBuffer(); |
375 return buffer_->Initialize(kBufferSize, | 370 return buffer_->Initialize(kBufferSize, |
376 kMinAllocationSize, | 371 kMinAllocationSize, |
377 kMaxAllocationSize); | 372 kMaxAllocationSize); |
378 } | 373 } |
379 | 374 |
380 void AsyncResourceHandler::ResumeIfDeferred() { | 375 void AsyncResourceHandler::ResumeIfDeferred() { |
381 if (did_defer_) { | 376 if (did_defer_) { |
382 did_defer_ = false; | 377 did_defer_ = false; |
383 controller()->Resume(); | 378 controller()->Resume(); |
384 } | 379 } |
385 } | 380 } |
386 | 381 |
387 } // namespace content | 382 } // namespace content |
OLD | NEW |