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() { |