Index: ash/accelerators/nested_dispatcher_controller.cc |
diff --git a/ash/accelerators/nested_dispatcher_controller.cc b/ash/accelerators/nested_dispatcher_controller.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d963db07c81b9632e822a3bb221b1c6ddb7b24ef |
--- /dev/null |
+++ b/ash/accelerators/nested_dispatcher_controller.cc |
@@ -0,0 +1,44 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ash/accelerators/nested_dispatcher_controller.h" |
+ |
+#include "ash/accelerators/accelerator_dispatcher.h" |
+#include "ash/shell.h" |
+#include "base/auto_reset.h" |
+#include "base/run_loop.h" |
+ |
+namespace ash { |
+ |
+NestedDispatcherController::NestedDispatcherController() { |
+} |
+ |
+NestedDispatcherController::~NestedDispatcherController() { |
+} |
+ |
+void NestedDispatcherController::RunWithDispatcher( |
+ base::MessagePumpDispatcher* nested_dispatcher) { |
+ base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); |
+ base::MessageLoopForUI::ScopedNestableTaskAllower allow_nested(loop); |
+ |
+ scoped_ptr<AcceleratorDispatcher> old_accelerator_dispatcher = |
+ accelerator_dispatcher_.Pass(); |
+ accelerator_dispatcher_ = AcceleratorDispatcher::Create(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()); |
+ run_loop->Run(); |
+ accelerator_dispatcher_ = old_accelerator_dispatcher.Pass(); |
+} |
+ |
+void NestedDispatcherController::QuitNestedMessageLoop() { |
+ CHECK(!quit_closure_.is_null()); |
+ quit_closure_.Run(); |
+ accelerator_dispatcher_.reset(); |
+} |
+ |
+} // namespace ash |