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

Side by Side Diff: chrome/browser/dom_ui/chrome_url_data_manager.cc

Issue 288005: First fix to minimize copying of image data. (Closed)
Patch Set: Modify gyp Created 11 years, 2 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
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 "chrome/browser/dom_ui/chrome_url_data_manager.h" 5 #include "chrome/browser/dom_ui/chrome_url_data_manager.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 virtual ~URLRequestChromeJob(); 43 virtual ~URLRequestChromeJob();
44 44
45 // URLRequestJob implementation. 45 // URLRequestJob implementation.
46 virtual void Start(); 46 virtual void Start();
47 virtual void Kill(); 47 virtual void Kill();
48 virtual bool ReadRawData(net::IOBuffer* buf, int buf_size, int *bytes_read); 48 virtual bool ReadRawData(net::IOBuffer* buf, int buf_size, int *bytes_read);
49 virtual bool GetMimeType(std::string* mime_type) const; 49 virtual bool GetMimeType(std::string* mime_type) const;
50 50
51 // Called by ChromeURLDataManager to notify us that the data blob is ready 51 // Called by ChromeURLDataManager to notify us that the data blob is ready
52 // for us. 52 // for us.
53 void DataAvailable(RefCountedBytes* bytes); 53 void DataAvailable(RefCountedMemory* bytes);
54 54
55 void SetMimeType(const std::string& mime_type) { 55 void SetMimeType(const std::string& mime_type) {
56 mime_type_ = mime_type; 56 mime_type_ = mime_type;
57 } 57 }
58 58
59 private: 59 private:
60 // Helper for Start(), to let us start asynchronously. 60 // Helper for Start(), to let us start asynchronously.
61 // (This pattern is shared by most URLRequestJob implementations.) 61 // (This pattern is shared by most URLRequestJob implementations.)
62 void StartAsync(); 62 void StartAsync();
63 63
64 // Do the actual copy from data_ (the data we're serving) into |buf|. 64 // Do the actual copy from data_ (the data we're serving) into |buf|.
65 // Separate from ReadRawData so we can handle async I/O. 65 // Separate from ReadRawData so we can handle async I/O.
66 void CompleteRead(net::IOBuffer* buf, int buf_size, int* bytes_read); 66 void CompleteRead(net::IOBuffer* buf, int buf_size, int* bytes_read);
67 67
68 // The actual data we're serving. NULL until it's been fetched. 68 // The actual data we're serving. NULL until it's been fetched.
69 scoped_refptr<RefCountedBytes> data_; 69 scoped_refptr<RefCountedMemory> data_;
70 // The current offset into the data that we're handing off to our 70 // The current offset into the data that we're handing off to our
71 // callers via the Read interfaces. 71 // callers via the Read interfaces.
72 int data_offset_; 72 int data_offset_;
73 73
74 // For async reads, we keep around a pointer to the buffer that 74 // For async reads, we keep around a pointer to the buffer that
75 // we're reading into. 75 // we're reading into.
76 scoped_refptr<net::IOBuffer> pending_buf_; 76 scoped_refptr<net::IOBuffer> pending_buf_;
77 int pending_buf_size_; 77 int pending_buf_size_;
78 std::string mime_type_; 78 std::string mime_type_;
79 79
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 i != pending_requests_.end(); ++i) { 251 i != pending_requests_.end(); ++i) {
252 if (i->second == job) { 252 if (i->second == job) {
253 pending_requests_.erase(i); 253 pending_requests_.erase(i);
254 return; 254 return;
255 } 255 }
256 } 256 }
257 } 257 }
258 258
259 void ChromeURLDataManager::DataAvailable( 259 void ChromeURLDataManager::DataAvailable(
260 RequestID request_id, 260 RequestID request_id,
261 scoped_refptr<RefCountedBytes> bytes) { 261 scoped_refptr<RefCountedMemory> bytes) {
262 // Forward this data on to the pending URLRequest, if it exists. 262 // Forward this data on to the pending URLRequest, if it exists.
263 PendingRequestMap::iterator i = pending_requests_.find(request_id); 263 PendingRequestMap::iterator i = pending_requests_.find(request_id);
264 if (i != pending_requests_.end()) { 264 if (i != pending_requests_.end()) {
265 // We acquire a reference to the job so that it doesn't disappear under the 265 // We acquire a reference to the job so that it doesn't disappear under the
266 // feet of any method invoked here (we could trigger a callback). 266 // feet of any method invoked here (we could trigger a callback).
267 scoped_refptr<URLRequestChromeJob> job = i->second; 267 scoped_refptr<URLRequestChromeJob> job = i->second;
268 pending_requests_.erase(i); 268 pending_requests_.erase(i);
269 job->DataAvailable(bytes); 269 job->DataAvailable(bytes);
270 } 270 }
271 } 271 }
272 272
273 void ChromeURLDataManager::DataSource::SendResponse( 273 void ChromeURLDataManager::DataSource::SendResponse(
274 RequestID request_id, 274 RequestID request_id,
275 RefCountedBytes* bytes) { 275 RefCountedMemory* bytes) {
276 ChromeThread::GetMessageLoop(ChromeThread::IO)->PostTask(FROM_HERE, 276 ChromeThread::GetMessageLoop(ChromeThread::IO)->PostTask(FROM_HERE,
277 NewRunnableMethod(&chrome_url_data_manager, 277 NewRunnableMethod(&chrome_url_data_manager,
278 &ChromeURLDataManager::DataAvailable, 278 &ChromeURLDataManager::DataAvailable,
279 request_id, scoped_refptr<RefCountedBytes>(bytes))); 279 request_id, scoped_refptr<RefCountedMemory>(bytes)));
280 } 280 }
281 281
282 MessageLoop* ChromeURLDataManager::DataSource::MessageLoopForRequestPath( 282 MessageLoop* ChromeURLDataManager::DataSource::MessageLoopForRequestPath(
283 const std::string& path) const { 283 const std::string& path) const {
284 return message_loop_; 284 return message_loop_;
285 } 285 }
286 286
287 // static 287 // static
288 void ChromeURLDataManager::DataSource::SetFontAndTextDirection( 288 void ChromeURLDataManager::DataSource::SetFontAndTextDirection(
289 DictionaryValue* localized_strings) { 289 DictionaryValue* localized_strings) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 361
362 void URLRequestChromeJob::Kill() { 362 void URLRequestChromeJob::Kill() {
363 chrome_url_data_manager.RemoveRequest(this); 363 chrome_url_data_manager.RemoveRequest(this);
364 } 364 }
365 365
366 bool URLRequestChromeJob::GetMimeType(std::string* mime_type) const { 366 bool URLRequestChromeJob::GetMimeType(std::string* mime_type) const {
367 *mime_type = mime_type_; 367 *mime_type = mime_type_;
368 return !mime_type_.empty(); 368 return !mime_type_.empty();
369 } 369 }
370 370
371 void URLRequestChromeJob::DataAvailable(RefCountedBytes* bytes) { 371 void URLRequestChromeJob::DataAvailable(RefCountedMemory* bytes) {
372 if (bytes) { 372 if (bytes) {
373 // The request completed, and we have all the data. 373 // The request completed, and we have all the data.
374 // Clear any IO pending status. 374 // Clear any IO pending status.
375 SetStatus(URLRequestStatus()); 375 SetStatus(URLRequestStatus());
376 376
377 data_ = bytes; 377 data_ = bytes;
378 int bytes_read; 378 int bytes_read;
379 if (pending_buf_.get()) { 379 if (pending_buf_.get()) {
380 CHECK(pending_buf_->data()); 380 CHECK(pending_buf_->data());
381 CompleteRead(pending_buf_, pending_buf_size_, &bytes_read); 381 CompleteRead(pending_buf_, pending_buf_size_, &bytes_read);
(...skipping 17 matching lines...) Expand all
399 return false; // Tell the caller we're still waiting for data. 399 return false; // Tell the caller we're still waiting for data.
400 } 400 }
401 401
402 // Otherwise, the data is available. 402 // Otherwise, the data is available.
403 CompleteRead(buf, buf_size, bytes_read); 403 CompleteRead(buf, buf_size, bytes_read);
404 return true; 404 return true;
405 } 405 }
406 406
407 void URLRequestChromeJob::CompleteRead(net::IOBuffer* buf, int buf_size, 407 void URLRequestChromeJob::CompleteRead(net::IOBuffer* buf, int buf_size,
408 int* bytes_read) { 408 int* bytes_read) {
409 int remaining = static_cast<int>(data_->data.size()) - data_offset_; 409 int remaining = static_cast<int>(data_->size()) - data_offset_;
410 if (buf_size > remaining) 410 if (buf_size > remaining)
411 buf_size = remaining; 411 buf_size = remaining;
412 if (buf_size > 0) { 412 if (buf_size > 0) {
413 memcpy(buf->data(), &data_->data[0] + data_offset_, buf_size); 413 memcpy(buf->data(), data_->front() + data_offset_, buf_size);
414 data_offset_ += buf_size; 414 data_offset_ += buf_size;
415 } 415 }
416 *bytes_read = buf_size; 416 *bytes_read = buf_size;
417 } 417 }
418 418
419 void URLRequestChromeJob::StartAsync() { 419 void URLRequestChromeJob::StartAsync() {
420 if (!request_) 420 if (!request_)
421 return; 421 return;
422 422
423 if (chrome_url_data_manager.StartRequest(request_->url(), this)) { 423 if (chrome_url_data_manager.StartRequest(request_->url(), this)) {
424 NotifyHeadersComplete(); 424 NotifyHeadersComplete();
425 } else { 425 } else {
426 NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED, 426 NotifyStartError(URLRequestStatus(URLRequestStatus::FAILED,
427 net::ERR_INVALID_URL)); 427 net::ERR_INVALID_URL));
428 } 428 }
429 } 429 }
430 430
431 URLRequestChromeFileJob::URLRequestChromeFileJob(URLRequest* request, 431 URLRequestChromeFileJob::URLRequestChromeFileJob(URLRequest* request,
432 const FilePath& path) 432 const FilePath& path)
433 : URLRequestFileJob(request, path) { 433 : URLRequestFileJob(request, path) {
434 } 434 }
435 435
436 URLRequestChromeFileJob::~URLRequestChromeFileJob() { } 436 URLRequestChromeFileJob::~URLRequestChromeFileJob() { }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698