| Index: base/task_scheduler/scheduler_worker_unittest.cc | 
| diff --git a/base/task_scheduler/scheduler_worker_unittest.cc b/base/task_scheduler/scheduler_worker_unittest.cc | 
| index 0d29bcd16c5bd46215e41eb2e9004fbe6db0267c..22847580e328d163ef93b3d0d33adebcc3f91156 100644 | 
| --- a/base/task_scheduler/scheduler_worker_unittest.cc | 
| +++ b/base/task_scheduler/scheduler_worker_unittest.cc | 
| @@ -41,8 +41,7 @@ class SchedulerWorkerDefaultDelegate : public SchedulerWorker::Delegate { | 
| SchedulerWorkerDefaultDelegate() = default; | 
|  | 
| // SchedulerWorker::Delegate: | 
| -  void OnMainEntry(SchedulerWorker* worker, | 
| -                   const TimeDelta& detach_duration) override {} | 
| +  void OnMainEntry(SchedulerWorker* worker) override {} | 
| scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override { | 
| return nullptr; | 
| } | 
| @@ -55,6 +54,7 @@ class SchedulerWorkerDefaultDelegate : public SchedulerWorker::Delegate { | 
| } | 
| TimeDelta GetSleepTimeout() override { return TimeDelta::Max(); } | 
| bool CanDetach(SchedulerWorker* worker) override { return false; } | 
| +  void OnDetach() override { ADD_FAILURE() << "Unexpected call to OnDetach()"; } | 
|  | 
| private: | 
| DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerDefaultDelegate); | 
| @@ -131,8 +131,7 @@ class TaskSchedulerWorkerTest : public testing::TestWithParam<size_t> { | 
| } | 
|  | 
| // SchedulerWorker::Delegate: | 
| -    void OnMainEntry(SchedulerWorker* worker, | 
| -                     const TimeDelta& detach_duration) override { | 
| +    void OnMainEntry(SchedulerWorker* worker) override { | 
| outer_->worker_set_.Wait(); | 
| EXPECT_EQ(outer_->worker_.get(), worker); | 
| EXPECT_FALSE(IsCallToDidRunTaskWithPriorityExpected()); | 
| @@ -363,15 +362,16 @@ class ControllableDetachDelegate : public SchedulerWorkerDefaultDelegate { | 
| work_processed_(WaitableEvent::ResetPolicy::MANUAL, | 
| WaitableEvent::InitialState::NOT_SIGNALED), | 
| detach_requested_(WaitableEvent::ResetPolicy::MANUAL, | 
| -                          WaitableEvent::InitialState::NOT_SIGNALED) { | 
| +                          WaitableEvent::InitialState::NOT_SIGNALED), | 
| +        detached_(WaitableEvent::ResetPolicy::MANUAL, | 
| +                  WaitableEvent::InitialState::NOT_SIGNALED) { | 
| EXPECT_TRUE(task_tracker_); | 
| } | 
|  | 
| ~ControllableDetachDelegate() override = default; | 
|  | 
| // SchedulerWorker::Delegate: | 
| -  MOCK_METHOD2(OnMainEntry, | 
| -               void(SchedulerWorker* worker, const TimeDelta& detach_duration)); | 
| +  MOCK_METHOD1(OnMainEntry, void(SchedulerWorker* worker)); | 
|  | 
| scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) | 
| override { | 
| @@ -398,6 +398,12 @@ class ControllableDetachDelegate : public SchedulerWorkerDefaultDelegate { | 
| return can_detach_; | 
| } | 
|  | 
| +  void OnDetach() override { | 
| +    EXPECT_TRUE(can_detach_); | 
| +    EXPECT_TRUE(detach_requested_.IsSignaled()); | 
| +    detached_.Signal(); | 
| +  } | 
| + | 
| void WaitForWorkToRun() { | 
| work_processed_.Wait(); | 
| } | 
| @@ -406,6 +412,8 @@ class ControllableDetachDelegate : public SchedulerWorkerDefaultDelegate { | 
| detach_requested_.Wait(); | 
| } | 
|  | 
| +  void WaitForDetach() { detached_.Wait(); } | 
| + | 
| void ResetState() { | 
| work_requested_ = false; | 
| work_processed_.Reset(); | 
| @@ -420,6 +428,7 @@ class ControllableDetachDelegate : public SchedulerWorkerDefaultDelegate { | 
| bool can_detach_ = false; | 
| WaitableEvent work_processed_; | 
| WaitableEvent detach_requested_; | 
| +  WaitableEvent detached_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(ControllableDetachDelegate); | 
| }; | 
| @@ -432,7 +441,7 @@ TEST(TaskSchedulerWorkerTest, WorkerDetaches) { | 
| ControllableDetachDelegate* delegate = | 
| new StrictMock<ControllableDetachDelegate>(&task_tracker); | 
| delegate->set_can_detach(true); | 
| -  EXPECT_CALL(*delegate, OnMainEntry(_, TimeDelta::Max())); | 
| +  EXPECT_CALL(*delegate, OnMainEntry(_)); | 
| std::unique_ptr<SchedulerWorker> worker = | 
| SchedulerWorker::Create( | 
| ThreadPriority::NORMAL, WrapUnique(delegate), &task_tracker, | 
| @@ -441,8 +450,7 @@ TEST(TaskSchedulerWorkerTest, WorkerDetaches) { | 
| delegate->WaitForWorkToRun(); | 
| Mock::VerifyAndClear(delegate); | 
| delegate->WaitForDetachRequest(); | 
| -  // Sleep to give a chance for the detach to happen. A yield is too short. | 
| -  PlatformThread::Sleep(TimeDelta::FromMilliseconds(50)); | 
| +  delegate->WaitForDetach(); | 
| ASSERT_FALSE(worker->ThreadAliveForTesting()); | 
| } | 
|  | 
| @@ -452,7 +460,7 @@ TEST(TaskSchedulerWorkerTest, WorkerDetachesAndWakes) { | 
| ControllableDetachDelegate* delegate = | 
| new StrictMock<ControllableDetachDelegate>(&task_tracker); | 
| delegate->set_can_detach(true); | 
| -  EXPECT_CALL(*delegate, OnMainEntry(_, TimeDelta::Max())); | 
| +  EXPECT_CALL(*delegate, OnMainEntry(_)); | 
| std::unique_ptr<SchedulerWorker> worker = | 
| SchedulerWorker::Create( | 
| ThreadPriority::NORMAL, WrapUnique(delegate), &task_tracker, | 
| @@ -461,20 +469,19 @@ TEST(TaskSchedulerWorkerTest, WorkerDetachesAndWakes) { | 
| delegate->WaitForWorkToRun(); | 
| Mock::VerifyAndClear(delegate); | 
| delegate->WaitForDetachRequest(); | 
| -  // Sleep to give a chance for the detach to happen. A yield is too short. | 
| -  PlatformThread::Sleep(TimeDelta::FromMilliseconds(50)); | 
| +  delegate->WaitForDetach(); | 
| ASSERT_FALSE(worker->ThreadAliveForTesting()); | 
|  | 
| delegate->ResetState(); | 
| delegate->set_can_detach(false); | 
| -  // When SchedulerWorker recreates its thread, expect OnMainEntry() to be | 
| -  // called with a detach duration which is not TimeDelta::Max(). | 
| -  EXPECT_CALL(*delegate, OnMainEntry(worker.get(), Ne(TimeDelta::Max()))); | 
| +  // Expect OnMainEntry() to be called when SchedulerWorker recreates its | 
| +  // thread. | 
| +  EXPECT_CALL(*delegate, OnMainEntry(worker.get())); | 
| worker->WakeUp(); | 
| delegate->WaitForWorkToRun(); | 
| Mock::VerifyAndClear(delegate); | 
| delegate->WaitForDetachRequest(); | 
| -  PlatformThread::Sleep(TimeDelta::FromMilliseconds(50)); | 
| +  delegate->WaitForDetach(); | 
| ASSERT_TRUE(worker->ThreadAliveForTesting()); | 
| worker->JoinForTesting(); | 
| } | 
| @@ -489,7 +496,7 @@ TEST(TaskSchedulerWorkerTest, CreateDetached) { | 
| ThreadPriority::NORMAL, WrapUnique(delegate), &task_tracker, | 
| SchedulerWorker::InitialState::DETACHED); | 
| ASSERT_FALSE(worker->ThreadAliveForTesting()); | 
| -  EXPECT_CALL(*delegate, OnMainEntry(worker.get(), TimeDelta::Max())); | 
| +  EXPECT_CALL(*delegate, OnMainEntry(worker.get())); | 
| worker->WakeUp(); | 
| delegate->WaitForWorkToRun(); | 
| Mock::VerifyAndClear(delegate); | 
| @@ -517,10 +524,7 @@ class ExpectThreadPriorityDelegate : public SchedulerWorkerDefaultDelegate { | 
| } | 
|  | 
| // SchedulerWorker::Delegate: | 
| -  void OnMainEntry(SchedulerWorker* worker, | 
| -                   const TimeDelta& detach_duration) override { | 
| -    VerifyThreadPriority(); | 
| -  } | 
| +  void OnMainEntry(SchedulerWorker* worker) override { VerifyThreadPriority(); } | 
| scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override { | 
| VerifyThreadPriority(); | 
| priority_verified_in_get_work_event_.Signal(); | 
|  |