Chromium Code Reviews| Index: ui/wm/core/nested_accelerator_controller.cc |
| diff --git a/ui/wm/core/nested_accelerator_controller.cc b/ui/wm/core/nested_accelerator_controller.cc |
| index 782ac6d891cedc35fa0b7d6ff9c1ebb825f9d17d..e4ace4f777ad42177cdd89605133622ec5e91f98 100644 |
| --- a/ui/wm/core/nested_accelerator_controller.cc |
| +++ b/ui/wm/core/nested_accelerator_controller.cc |
| @@ -5,6 +5,7 @@ |
| #include "ui/wm/core/nested_accelerator_controller.h" |
| #include "base/auto_reset.h" |
| +#include "base/bind.h" |
| #include "base/run_loop.h" |
| #include "ui/wm/core/nested_accelerator_delegate.h" |
| #include "ui/wm/core/nested_accelerator_dispatcher.h" |
| @@ -20,28 +21,36 @@ NestedAcceleratorController::NestedAcceleratorController( |
| NestedAcceleratorController::~NestedAcceleratorController() { |
| } |
| -void NestedAcceleratorController::RunWithDispatcher( |
| - base::MessagePumpDispatcher* nested_dispatcher) { |
| - base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); |
| - base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop); |
| - |
| +void NestedAcceleratorController::PrepareNestedLoopClosures( |
| + base::MessagePumpDispatcher* nested_dispatcher, |
| + base::Closure* run_closure, |
| + base::Closure* quit_closure) { |
| scoped_ptr<NestedAcceleratorDispatcher> old_accelerator_dispatcher = |
| accelerator_dispatcher_.Pass(); |
| accelerator_dispatcher_ = NestedAcceleratorDispatcher::Create( |
| dispatcher_delegate_.get(), nested_dispatcher); |
| - // TODO(jbates) crbug.com/134753 Find quitters of this RunLoop and have them |
| - // use run_loop.QuitClosure(). |
| scoped_ptr<base::RunLoop> run_loop = accelerator_dispatcher_->CreateRunLoop(); |
| - base::AutoReset<base::Closure> reset_closure(&quit_closure_, |
| - run_loop->QuitClosure()); |
| + *quit_closure = |
| + base::Bind(&NestedAcceleratorController::QuitNestedMessageLoop, |
| + base::Unretained(this), |
| + run_loop->QuitClosure()); |
|
sky
2014/05/28 23:11:12
This is more of what I was thinking, but having to
sadrul
2014/05/29 00:25:39
I think that makes it possible for the wrong dispa
|
| + *run_closure = base::Bind(&NestedAcceleratorController::RunNestedMessageLoop, |
| + base::Unretained(this), |
| + base::Passed(&run_loop), |
| + base::Passed(&old_accelerator_dispatcher)); |
| +} |
| + |
| +void NestedAcceleratorController::RunNestedMessageLoop( |
| + scoped_ptr<base::RunLoop> run_loop, |
| + scoped_ptr<NestedAcceleratorDispatcher> old_accelerator_dispatcher) { |
| run_loop->Run(); |
| accelerator_dispatcher_ = old_accelerator_dispatcher.Pass(); |
| } |
| -void NestedAcceleratorController::QuitNestedMessageLoop() { |
| - CHECK(!quit_closure_.is_null()); |
| - quit_closure_.Run(); |
| +void NestedAcceleratorController::QuitNestedMessageLoop( |
| + const base::Closure& quit_runloop) { |
| + quit_runloop.Run(); |
| accelerator_dispatcher_.reset(); |
| } |