| Index: content/public/test/test_browser_thread.cc
|
| diff --git a/content/public/test/test_browser_thread.cc b/content/public/test/test_browser_thread.cc
|
| index ae83f78f78aad1455f8a9f98aa6c4f003ef4499b..54db8953941918246ff1cecda725c13340a1ca65 100644
|
| --- a/content/public/test/test_browser_thread.cc
|
| +++ b/content/public/test/test_browser_thread.cc
|
| @@ -40,15 +40,34 @@ class TestBrowserThreadImpl : public BrowserThreadImpl {
|
| };
|
|
|
| TestBrowserThread::TestBrowserThread(BrowserThread::ID identifier)
|
| - : impl_(new TestBrowserThreadImpl(identifier)) {
|
| -}
|
| + : impl_(new TestBrowserThreadImpl(identifier)), identifier_(identifier) {}
|
|
|
| TestBrowserThread::TestBrowserThread(BrowserThread::ID identifier,
|
| base::MessageLoop* message_loop)
|
| - : impl_(new TestBrowserThreadImpl(identifier, message_loop)) {}
|
| + : impl_(new TestBrowserThreadImpl(identifier, message_loop)),
|
| + identifier_(identifier) {}
|
|
|
| TestBrowserThread::~TestBrowserThread() {
|
| - Stop();
|
| + // The upcoming BrowserThreadImpl::ResetGlobalsForTesting() call requires that
|
| + // |impl_| have triggered the shutdown phase for its BrowserThread::ID. This
|
| + // either happens when the thread is stopped (if real) or destroyed (when fake
|
| + // -- i.e. using an externally provided MessageLoop).
|
| + impl_.reset();
|
| +
|
| + // Resets BrowserThreadImpl's globals so that |impl_| is no longer bound to
|
| + // |identifier_|. This is fine since the underlying MessageLoop has already
|
| + // been flushed and deleted in Stop(). In the case of an externally provided
|
| + // MessageLoop however, this means that TaskRunners obtained through
|
| + // |BrowserThreadImpl::GetTaskRunnerForThread(identifier_)| will no longer
|
| + // recognize their BrowserThreadImpl for RunsTasksOnCurrentThread(). This
|
| + // happens most often when such verifications are made from
|
| + // MessageLoop::DestructionObservers. Callers that care to work around that
|
| + // should instead use this shutdown sequence:
|
| + // 1) TestBrowserThread::Stop()
|
| + // 2) ~MessageLoop()
|
| + // 3) ~TestBrowserThread()
|
| + // (~TestBrowserThreadBundle() does this).
|
| + BrowserThreadImpl::ResetGlobalsForTesting(identifier_);
|
| }
|
|
|
| bool TestBrowserThread::Start() {
|
|
|