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

Side by Side Diff: chrome/browser/ui/webui/chrome_url_data_manager_backend.cc

Issue 10454044: Added support for animated/nonanimated user image. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Small fixes to comments. Created 8 years, 6 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) 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 "chrome/browser/ui/webui/chrome_url_data_manager_backend.h" 5 #include "chrome/browser/ui/webui/chrome_url_data_manager_backend.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/compiler_specific.h" 12 #include "base/compiler_specific.h"
13 #include "base/debug/trace_event.h" 13 #include "base/debug/trace_event.h"
14 #include "base/file_util.h" 14 #include "base/file_util.h"
15 #include "base/lazy_instance.h" 15 #include "base/lazy_instance.h"
16 #include "base/memory/ref_counted.h"
16 #include "base/memory/ref_counted_memory.h" 17 #include "base/memory/ref_counted_memory.h"
17 #include "base/memory/weak_ptr.h" 18 #include "base/memory/weak_ptr.h"
18 #include "base/message_loop.h" 19 #include "base/message_loop.h"
19 #include "base/path_service.h" 20 #include "base/path_service.h"
20 #include "base/string_util.h" 21 #include "base/string_util.h"
21 #include "chrome/browser/net/chrome_url_request_context.h" 22 #include "chrome/browser/net/chrome_url_request_context.h"
22 #include "chrome/browser/ui/webui/shared_resources_data_source.h" 23 #include "chrome/browser/ui/webui/shared_resources_data_source.h"
23 #include "chrome/common/chrome_paths.h" 24 #include "chrome/common/chrome_paths.h"
24 #include "chrome/common/chrome_switches.h" 25 #include "chrome/common/chrome_switches.h"
25 #include "chrome/common/url_constants.h" 26 #include "chrome/common/url_constants.h"
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 164
164 // net::URLRequestJob implementation. 165 // net::URLRequestJob implementation.
165 virtual void Start() OVERRIDE; 166 virtual void Start() OVERRIDE;
166 virtual void Kill() OVERRIDE; 167 virtual void Kill() OVERRIDE;
167 virtual bool ReadRawData(net::IOBuffer* buf, 168 virtual bool ReadRawData(net::IOBuffer* buf,
168 int buf_size, 169 int buf_size,
169 int* bytes_read) OVERRIDE; 170 int* bytes_read) OVERRIDE;
170 virtual bool GetMimeType(std::string* mime_type) const OVERRIDE; 171 virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
171 virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE; 172 virtual void GetResponseInfo(net::HttpResponseInfo* info) OVERRIDE;
172 173
174 // Used to notify us that the data mime type is ready for us.
James Hawkins 2012/06/04 15:50:13 nit: Don't use pronouns (us) in comments; pronouns
James Hawkins 2012/06/04 15:50:13 s/mime type/|mime_type|/
ygorshenin1 2012/06/09 09:34:26 Done.
ygorshenin1 2012/06/09 09:34:26 Done.
175 void MimeTypeAvailable(const std::string& mime_type);
176
173 // Called by ChromeURLDataManager to notify us that the data blob is ready 177 // Called by ChromeURLDataManager to notify us that the data blob is ready
174 // for us. 178 // for us.
175 void DataAvailable(base::RefCountedMemory* bytes); 179 void DataAvailable(base::RefCountedMemory* bytes);
176 180
177 void set_mime_type(const std::string& mime_type) { 181 void set_mime_type(const std::string& mime_type) {
178 mime_type_ = mime_type; 182 mime_type_ = mime_type;
179 } 183 }
180 184
181 void set_allow_caching(bool allow_caching) { 185 void set_allow_caching(bool allow_caching) {
182 allow_caching_ = allow_caching; 186 allow_caching_ = allow_caching;
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 DCHECK(!info->headers); 260 DCHECK(!info->headers);
257 // Set the headers so that requests serviced by ChromeURLDataManager return a 261 // Set the headers so that requests serviced by ChromeURLDataManager return a
258 // status code of 200. Without this they return a 0, which makes the status 262 // status code of 200. Without this they return a 0, which makes the status
259 // indistiguishable from other error types. Instant relies on getting a 200. 263 // indistiguishable from other error types. Instant relies on getting a 200.
260 info->headers = new net::HttpResponseHeaders("HTTP/1.1 200 OK"); 264 info->headers = new net::HttpResponseHeaders("HTTP/1.1 200 OK");
261 AddContentSecurityPolicyHeader(request_->url(), info->headers); 265 AddContentSecurityPolicyHeader(request_->url(), info->headers);
262 if (!allow_caching_) 266 if (!allow_caching_)
263 info->headers->AddHeader("Cache-Control: no-cache"); 267 info->headers->AddHeader("Cache-Control: no-cache");
264 } 268 }
265 269
270 void URLRequestChromeJob::MimeTypeAvailable(const std::string& mime_type) {
271 set_mime_type(mime_type);
272 NotifyHeadersComplete();
273 }
274
266 void URLRequestChromeJob::DataAvailable(base::RefCountedMemory* bytes) { 275 void URLRequestChromeJob::DataAvailable(base::RefCountedMemory* bytes) {
267 TRACE_EVENT_ASYNC_END0("browser", "DataManager:Request", this); 276 TRACE_EVENT_ASYNC_END0("browser", "DataManager:Request", this);
268 if (bytes) { 277 if (bytes) {
269 // The request completed, and we have all the data. 278 // The request completed, and we have all the data.
270 // Clear any IO pending status. 279 // Clear any IO pending status.
271 SetStatus(net::URLRequestStatus()); 280 SetStatus(net::URLRequestStatus());
272 281
273 data_ = bytes; 282 data_ = bytes;
274 int bytes_read; 283 int bytes_read;
275 if (pending_buf_.get()) { 284 if (pending_buf_.get()) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 memcpy(buf->data(), data_->front() + data_offset_, buf_size); 319 memcpy(buf->data(), data_->front() + data_offset_, buf_size);
311 data_offset_ += buf_size; 320 data_offset_ += buf_size;
312 } 321 }
313 *bytes_read = buf_size; 322 *bytes_read = buf_size;
314 } 323 }
315 324
316 void URLRequestChromeJob::StartAsync() { 325 void URLRequestChromeJob::StartAsync() {
317 if (!request_) 326 if (!request_)
318 return; 327 return;
319 328
320 if (backend_->StartRequest(request_->url(), this)) { 329 if (!backend_->StartRequest(request_->url(), this)) {
321 NotifyHeadersComplete();
322 } else {
323 NotifyStartError(net::URLRequestStatus(net::URLRequestStatus::FAILED, 330 NotifyStartError(net::URLRequestStatus(net::URLRequestStatus::FAILED,
324 net::ERR_INVALID_URL)); 331 net::ERR_INVALID_URL));
325 } 332 }
326 } 333 }
327 334
328 namespace { 335 namespace {
James Hawkins 2012/06/04 15:50:13 There's already an unnamed namespace at the top of
ygorshenin1 2012/06/09 09:34:26 It can't be moved before URLRequestChromeJob decla
329 336
337 void GetMimeTypeOnUI(ChromeURLDataManager::DataSource* source,
James Hawkins 2012/06/04 15:50:13 nit: Document method and parameters.
ygorshenin1 2012/06/09 09:34:26 Done.
338 const std::string& path,
339 URLRequestChromeJob* job) {
340 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
341 std::string mime_type = source->GetMimeType(path);
342 BrowserThread::PostTask(
343 BrowserThread::IO, FROM_HERE,
344 base::Bind(&URLRequestChromeJob::MimeTypeAvailable, job, mime_type));
345 }
346
347 } // namespace
348
349 namespace {
350
330 class ChromeProtocolHandler 351 class ChromeProtocolHandler
331 : public net::URLRequestJobFactory::ProtocolHandler { 352 : public net::URLRequestJobFactory::ProtocolHandler {
332 public: 353 public:
333 explicit ChromeProtocolHandler(ChromeURLDataManagerBackend* backend); 354 explicit ChromeProtocolHandler(ChromeURLDataManagerBackend* backend);
334 ~ChromeProtocolHandler(); 355 ~ChromeProtocolHandler();
335 356
336 virtual net::URLRequestJob* MaybeCreateJob( 357 virtual net::URLRequestJob* MaybeCreateJob(
337 net::URLRequest* request) const OVERRIDE; 358 net::URLRequest* request) const OVERRIDE;
338 359
339 private: 360 private:
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 DataSourceMap::iterator i = data_sources_.find(source_name); 435 DataSourceMap::iterator i = data_sources_.find(source_name);
415 if (i == data_sources_.end()) 436 if (i == data_sources_.end())
416 return false; 437 return false;
417 438
418 ChromeURLDataManager::DataSource* source = i->second; 439 ChromeURLDataManager::DataSource* source = i->second;
419 440
420 // Save this request so we know where to send the data. 441 // Save this request so we know where to send the data.
421 RequestID request_id = next_request_id_++; 442 RequestID request_id = next_request_id_++;
422 pending_requests_.insert(std::make_pair(request_id, job)); 443 pending_requests_.insert(std::make_pair(request_id, job));
423 444
424 // TODO(eroman): would be nicer if the mimetype were set at the same time
425 // as the data blob. For now do it here, since NotifyHeadersComplete() is
426 // going to get called once we return.
427 job->set_mime_type(source->GetMimeType(path));
428 job->set_allow_caching(source->AllowCaching()); 445 job->set_allow_caching(source->AllowCaching());
429 446
430 const ChromeURLRequestContext* context = 447 const ChromeURLRequestContext* context =
431 static_cast<const ChromeURLRequestContext*>(job->request()->context()); 448 static_cast<const ChromeURLRequestContext*>(job->request()->context());
432 449
433 // Forward along the request to the data source. 450 // Forward along the request to the data source.
434 MessageLoop* target_message_loop = source->MessageLoopForRequestPath(path); 451 MessageLoop* target_message_loop = source->MessageLoopForRequestPath(path);
435 if (!target_message_loop) { 452 if (!target_message_loop) {
453 job->MimeTypeAvailable(source->GetMimeType(path));
454
436 // The DataSource is agnostic to which thread StartDataRequest is called 455 // The DataSource is agnostic to which thread StartDataRequest is called
437 // on for this path. Call directly into it from this thread, the IO 456 // on for this path. Call directly into it from this thread, the IO
438 // thread. 457 // thread.
439 source->StartDataRequest(path, context->is_incognito(), request_id); 458 source->StartDataRequest(path, context->is_incognito(), request_id);
440 } else { 459 } else {
460 // URLRequestChromeJob should receive mime type before data. This
461 // is guaranteed because request for mime type is placed in the
462 // message loop before request for data. And correspondingly their
463 // replies are put on the IO thread in the same order.
464 target_message_loop->PostTask(
465 FROM_HERE,
466 base::Bind(&GetMimeTypeOnUI,
467 scoped_refptr<ChromeURLDataManager::DataSource>(source),
468 path,
469 scoped_refptr<URLRequestChromeJob>(job)));
470
441 // The DataSource wants StartDataRequest to be called on a specific thread, 471 // The DataSource wants StartDataRequest to be called on a specific thread,
442 // usually the UI thread, for this path. 472 // usually the UI thread, for this path.
443 target_message_loop->PostTask( 473 target_message_loop->PostTask(
444 FROM_HERE, 474 FROM_HERE,
445 base::Bind(&ChromeURLDataManager::DataSource::StartDataRequest, source, 475 base::Bind(&ChromeURLDataManager::DataSource::StartDataRequest, source,
446 path, context->is_incognito(), request_id)); 476 path, context->is_incognito(), request_id));
447 } 477 }
448 return true; 478 return true;
449 } 479 }
450 480
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 593
564 return new URLRequestChromeJob(request, backend_); 594 return new URLRequestChromeJob(request, backend_);
565 } 595 }
566 596
567 } // namespace 597 } // namespace
568 598
569 net::URLRequestJobFactory::ProtocolHandler* 599 net::URLRequestJobFactory::ProtocolHandler*
570 CreateDevToolsProtocolHandler(ChromeURLDataManagerBackend* backend) { 600 CreateDevToolsProtocolHandler(ChromeURLDataManagerBackend* backend) {
571 return new DevToolsJobFactory(backend); 601 return new DevToolsJobFactory(backend);
572 } 602 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698