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

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

Issue 11885021: Don't derive from ChromeURLDataManager::DataSource, and instead have these classes implement a dele… (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: nits Created 7 years, 11 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 | Annotate | Revision Log
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"
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 net::ERR_INVALID_URL)); 383 net::ERR_INVALID_URL));
384 } 384 }
385 } 385 }
386 386
387 namespace { 387 namespace {
388 388
389 // Gets mime type for data that is available from |source| by |path|. 389 // Gets mime type for data that is available from |source| by |path|.
390 // After that, notifies |job| that mime type is available. This method 390 // After that, notifies |job| that mime type is available. This method
391 // should be called on the UI thread, but notification is performed on 391 // should be called on the UI thread, but notification is performed on
392 // the IO thread. 392 // the IO thread.
393 void GetMimeTypeOnUI(ChromeURLDataManager::DataSource* source, 393 void GetMimeTypeOnUI(URLDataSource* source,
394 const std::string& path, 394 const std::string& path,
395 const base::WeakPtr<URLRequestChromeJob>& job) { 395 const base::WeakPtr<URLRequestChromeJob>& job) {
396 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 396 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
397 std::string mime_type = source->GetMimeType(path); 397 std::string mime_type = source->delegate()->GetMimeType(path);
398 BrowserThread::PostTask( 398 BrowserThread::PostTask(
399 BrowserThread::IO, FROM_HERE, 399 BrowserThread::IO, FROM_HERE,
400 base::Bind(&URLRequestChromeJob::MimeTypeAvailable, job, mime_type)); 400 base::Bind(&URLRequestChromeJob::MimeTypeAvailable, job, mime_type));
401 } 401 }
402 402
403 } // namespace 403 } // namespace
404 404
405 namespace { 405 namespace {
406 406
407 class ChromeProtocolHandler 407 class ChromeProtocolHandler
(...skipping 24 matching lines...) Expand all
432 DCHECK(request); 432 DCHECK(request);
433 433
434 // Fall back to using a custom handler 434 // Fall back to using a custom handler
435 return new URLRequestChromeJob(request, network_delegate, backend_); 435 return new URLRequestChromeJob(request, network_delegate, backend_);
436 } 436 }
437 437
438 } // namespace 438 } // namespace
439 439
440 ChromeURLDataManagerBackend::ChromeURLDataManagerBackend() 440 ChromeURLDataManagerBackend::ChromeURLDataManagerBackend()
441 : next_request_id_(0) { 441 : next_request_id_(0) {
442 AddDataSource(new SharedResourcesDataSource()); 442 content::URLDataSourceDelegate* shared_source =
443 new SharedResourcesDataSource();
444 shared_source->url_data_source_ =
445 new URLDataSource(shared_source->GetSource(), shared_source);
446 AddDataSource(shared_source->url_data_source_);
443 } 447 }
444 448
445 ChromeURLDataManagerBackend::~ChromeURLDataManagerBackend() { 449 ChromeURLDataManagerBackend::~ChromeURLDataManagerBackend() {
446 for (DataSourceMap::iterator i = data_sources_.begin(); 450 for (DataSourceMap::iterator i = data_sources_.begin();
447 i != data_sources_.end(); ++i) { 451 i != data_sources_.end(); ++i) {
448 i->second->backend_ = NULL; 452 i->second->backend_ = NULL;
449 } 453 }
450 data_sources_.clear(); 454 data_sources_.clear();
451 } 455 }
452 456
453 // static 457 // static
454 net::URLRequestJobFactory::ProtocolHandler* 458 net::URLRequestJobFactory::ProtocolHandler*
455 ChromeURLDataManagerBackend::CreateProtocolHandler( 459 ChromeURLDataManagerBackend::CreateProtocolHandler(
456 ChromeURLDataManagerBackend* backend) { 460 ChromeURLDataManagerBackend* backend) {
457 DCHECK(backend); 461 DCHECK(backend);
458 return new ChromeProtocolHandler(backend); 462 return new ChromeProtocolHandler(backend);
459 } 463 }
460 464
461 void ChromeURLDataManagerBackend::AddDataSource( 465 void ChromeURLDataManagerBackend::AddDataSource(
462 ChromeURLDataManager::DataSource* source) { 466 URLDataSource* source) {
463 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 467 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
464 DataSourceMap::iterator i = data_sources_.find(source->source_name()); 468 DataSourceMap::iterator i = data_sources_.find(source->source_name());
465 if (i != data_sources_.end()) { 469 if (i != data_sources_.end()) {
466 if (!source->ShouldReplaceExistingSource()) 470 if (!source->delegate()->ShouldReplaceExistingSource())
467 return; 471 return;
468 i->second->backend_ = NULL; 472 i->second->backend_ = NULL;
469 } 473 }
470 data_sources_[source->source_name()] = source; 474 data_sources_[source->source_name()] = source;
471 source->backend_ = this; 475 source->backend_ = this;
472 } 476 }
473 477
474 bool ChromeURLDataManagerBackend::HasPendingJob( 478 bool ChromeURLDataManagerBackend::HasPendingJob(
475 URLRequestChromeJob* job) const { 479 URLRequestChromeJob* job) const {
476 for (PendingRequestMap::const_iterator i = pending_requests_.begin(); 480 for (PendingRequestMap::const_iterator i = pending_requests_.begin();
477 i != pending_requests_.end(); ++i) { 481 i != pending_requests_.end(); ++i) {
478 if (i->second == job) 482 if (i->second == job)
479 return true; 483 return true;
480 } 484 }
481 return false; 485 return false;
482 } 486 }
483 487
484 bool ChromeURLDataManagerBackend::StartRequest(const GURL& url, 488 bool ChromeURLDataManagerBackend::StartRequest(const GURL& url,
485 URLRequestChromeJob* job) { 489 URLRequestChromeJob* job) {
486 // Parse the URL into a request for a source and path. 490 // Parse the URL into a request for a source and path.
487 std::string source_name; 491 std::string source_name;
488 std::string path; 492 std::string path;
489 URLToRequest(url, &source_name, &path); 493 URLToRequest(url, &source_name, &path);
490 494
491 // Look up the data source for the request. 495 // Look up the data source for the request.
492 DataSourceMap::iterator i = data_sources_.find(source_name); 496 DataSourceMap::iterator i = data_sources_.find(source_name);
493 if (i == data_sources_.end()) 497 if (i == data_sources_.end())
494 return false; 498 return false;
495 499
496 ChromeURLDataManager::DataSource* source = i->second; 500 URLDataSource* source = i->second;
497 501
498 // Save this request so we know where to send the data. 502 // Save this request so we know where to send the data.
499 RequestID request_id = next_request_id_++; 503 RequestID request_id = next_request_id_++;
500 pending_requests_.insert(std::make_pair(request_id, job)); 504 pending_requests_.insert(std::make_pair(request_id, job));
501 505
502 job->set_allow_caching(source->AllowCaching()); 506 job->set_allow_caching(source->delegate()->AllowCaching());
503 507
504 const ChromeURLRequestContext* context = 508 const ChromeURLRequestContext* context =
505 static_cast<const ChromeURLRequestContext*>(job->request()->context()); 509 static_cast<const ChromeURLRequestContext*>(job->request()->context());
506 510
507 // Forward along the request to the data source. 511 // Forward along the request to the data source.
508 MessageLoop* target_message_loop = source->MessageLoopForRequestPath(path); 512 MessageLoop* target_message_loop =
513 source->delegate()->MessageLoopForRequestPath(path);
509 if (!target_message_loop) { 514 if (!target_message_loop) {
510 job->MimeTypeAvailable(source->GetMimeType(path)); 515 job->MimeTypeAvailable(source->delegate()->GetMimeType(path));
511 516
512 // The DataSource is agnostic to which thread StartDataRequest is called 517 // The DataSource is agnostic to which thread StartDataRequest is called
513 // on for this path. Call directly into it from this thread, the IO 518 // on for this path. Call directly into it from this thread, the IO
514 // thread. 519 // thread.
515 source->StartDataRequest(path, context->is_incognito(), request_id); 520 source->delegate()->StartDataRequest(
521 path, context->is_incognito(), request_id);
516 } else { 522 } else {
517 // URLRequestChromeJob should receive mime type before data. This 523 // URLRequestChromeJob should receive mime type before data. This
518 // is guaranteed because request for mime type is placed in the 524 // is guaranteed because request for mime type is placed in the
519 // message loop before request for data. And correspondingly their 525 // message loop before request for data. And correspondingly their
520 // replies are put on the IO thread in the same order. 526 // replies are put on the IO thread in the same order.
521 target_message_loop->PostTask( 527 target_message_loop->PostTask(
522 FROM_HERE, 528 FROM_HERE,
523 base::Bind(&GetMimeTypeOnUI, 529 base::Bind(&GetMimeTypeOnUI,
524 scoped_refptr<ChromeURLDataManager::DataSource>(source), 530 scoped_refptr<URLDataSource>(source),
525 path, job->AsWeakPtr())); 531 path, job->AsWeakPtr()));
526 532
527 // The DataSource wants StartDataRequest to be called on a specific thread, 533 // The DataSource wants StartDataRequest to be called on a specific thread,
528 // usually the UI thread, for this path. 534 // usually the UI thread, for this path.
529 target_message_loop->PostTask( 535 target_message_loop->PostTask(
530 FROM_HERE, 536 FROM_HERE,
531 base::Bind(&ChromeURLDataManager::DataSource::StartDataRequest, source, 537 base::Bind(&ChromeURLDataManagerBackend::CallStartRequest,
532 path, context->is_incognito(), request_id)); 538 make_scoped_refptr(source), path, context->is_incognito(),
539 request_id));
533 } 540 }
534 return true; 541 return true;
535 } 542 }
536 543
544 void ChromeURLDataManagerBackend::CallStartRequest(
545 scoped_refptr<URLDataSource> source,
546 const std::string& path,
547 bool is_incognito,
548 int request_id) {
549 source->delegate()->StartDataRequest(path, is_incognito, request_id);
550 }
551
537 void ChromeURLDataManagerBackend::RemoveRequest(URLRequestChromeJob* job) { 552 void ChromeURLDataManagerBackend::RemoveRequest(URLRequestChromeJob* job) {
538 // Remove the request from our list of pending requests. 553 // Remove the request from our list of pending requests.
539 // If/when the source sends the data that was requested, the data will just 554 // If/when the source sends the data that was requested, the data will just
540 // be thrown away. 555 // be thrown away.
541 for (PendingRequestMap::iterator i = pending_requests_.begin(); 556 for (PendingRequestMap::iterator i = pending_requests_.begin();
542 i != pending_requests_.end(); ++i) { 557 i != pending_requests_.end(); ++i) {
543 if (i->second == job) { 558 if (i->second == job) {
544 pending_requests_.erase(i); 559 pending_requests_.erase(i);
545 return; 560 return;
546 } 561 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 return new URLRequestChromeJob(request, network_delegate, backend_); 658 return new URLRequestChromeJob(request, network_delegate, backend_);
644 } 659 }
645 660
646 } // namespace 661 } // namespace
647 662
648 net::URLRequestJobFactory::ProtocolHandler* 663 net::URLRequestJobFactory::ProtocolHandler*
649 CreateDevToolsProtocolHandler(ChromeURLDataManagerBackend* backend, 664 CreateDevToolsProtocolHandler(ChromeURLDataManagerBackend* backend,
650 net::NetworkDelegate* network_delegate) { 665 net::NetworkDelegate* network_delegate) {
651 return new DevToolsJobFactory(backend, network_delegate); 666 return new DevToolsJobFactory(backend, network_delegate);
652 } 667 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698