| Index: content/public/test/test_browser_thread_bundle.cc | 
| diff --git a/content/public/test/test_browser_thread_bundle.cc b/content/public/test/test_browser_thread_bundle.cc | 
| index 211ecdfa4ab099dc04ba6b1c6f5f2ce8704b6ab9..e9251c3fa1b39ee33064fc8ba8965e1ee9ddaf70 100644 | 
| --- a/content/public/test/test_browser_thread_bundle.cc | 
| +++ b/content/public/test/test_browser_thread_bundle.cc | 
| @@ -17,11 +17,13 @@ TestBrowserThreadBundle::TestBrowserThreadBundle() | 
| : TestBrowserThreadBundle(DEFAULT) {} | 
|  | 
| TestBrowserThreadBundle::TestBrowserThreadBundle(int options) | 
| -    : options_(options), threads_started_(false) { | 
| +    : options_(options), threads_created_(false) { | 
| Init(); | 
| } | 
|  | 
| TestBrowserThreadBundle::~TestBrowserThreadBundle() { | 
| +  DCHECK(threads_created_); | 
| + | 
| // To avoid memory leaks, we must ensure that any tasks posted to the blocking | 
| // pool via PostTaskAndReply are able to reply back to the originating thread. | 
| // Thus we must flush the blocking pool while the browser threads still exist. | 
| @@ -65,23 +67,34 @@ TestBrowserThreadBundle::~TestBrowserThreadBundle() { | 
| void TestBrowserThreadBundle::Init() { | 
| // Check for conflicting options can't have two IO threads. | 
| CHECK(!(options_ & IO_MAINLOOP) || !(options_ & REAL_IO_THREAD)); | 
| -  // There must be a thread to start to use DONT_START_THREADS | 
| -  CHECK((options_ & ~IO_MAINLOOP) != DONT_START_THREADS); | 
| +  // There must be a thread to start to use DONT_CREATE_THREADS | 
| +  CHECK((options_ & ~IO_MAINLOOP) != DONT_CREATE_THREADS); | 
|  | 
| +  // Create the UI thread. In production, this work is done in | 
| +  // BrowserMainLoop::MainMessageLoopStart(). | 
| if (options_ & IO_MAINLOOP) { | 
| message_loop_.reset(new base::MessageLoopForIO()); | 
| } else { | 
| message_loop_.reset(new base::MessageLoopForUI()); | 
| } | 
|  | 
| -  task_scheduler_.reset( | 
| -      new base::test::ScopedTaskScheduler(message_loop_.get())); | 
| - | 
| ui_thread_.reset( | 
| new TestBrowserThread(BrowserThread::UI, message_loop_.get())); | 
|  | 
| +  if (!(options_ & DONT_CREATE_THREADS)) | 
| +    CreateThreads(); | 
| +} | 
| + | 
| +// This method mimics the work done in BrowserMainLoop::CreateThreads(). | 
| +void TestBrowserThreadBundle::CreateThreads() { | 
| +  DCHECK(!threads_created_); | 
| + | 
| +  task_scheduler_.reset( | 
| +      new base::test::ScopedTaskScheduler(message_loop_.get())); | 
| + | 
| if (options_ & REAL_DB_THREAD) { | 
| db_thread_.reset(new TestBrowserThread(BrowserThread::DB)); | 
| +    db_thread_->Start(); | 
| } else { | 
| db_thread_.reset( | 
| new TestBrowserThread(BrowserThread::DB, message_loop_.get())); | 
| @@ -89,6 +102,7 @@ void TestBrowserThreadBundle::Init() { | 
|  | 
| if (options_ & REAL_FILE_THREAD) { | 
| file_thread_.reset(new TestBrowserThread(BrowserThread::FILE)); | 
| +    file_thread_->Start(); | 
| } else { | 
| file_thread_.reset( | 
| new TestBrowserThread(BrowserThread::FILE, message_loop_.get())); | 
| @@ -103,28 +117,13 @@ void TestBrowserThreadBundle::Init() { | 
|  | 
| if (options_ & REAL_IO_THREAD) { | 
| io_thread_.reset(new TestBrowserThread(BrowserThread::IO)); | 
| +    io_thread_->StartIOThread(); | 
| } else { | 
| io_thread_.reset( | 
| new TestBrowserThread(BrowserThread::IO, message_loop_.get())); | 
| } | 
|  | 
| -  if (!(options_ & DONT_START_THREADS)) | 
| -    Start(); | 
| -} | 
| - | 
| -void TestBrowserThreadBundle::Start() { | 
| -  DCHECK(!threads_started_); | 
| - | 
| -  if (options_ & REAL_DB_THREAD) | 
| -    db_thread_->Start(); | 
| - | 
| -  if (options_ & REAL_FILE_THREAD) | 
| -    file_thread_->Start(); | 
| - | 
| -  if (options_ & REAL_IO_THREAD) | 
| -    io_thread_->StartIOThread(); | 
| - | 
| -  threads_started_ = true; | 
| +  threads_created_ = true; | 
| } | 
|  | 
| }  // namespace content | 
|  |