This CL adds accelerators to the Linux toolkit views.
The MessageLoop had to be modified to support Dispatchers on Linux.

BUG=None
TEST=On Windows and Linux, make sure the accelerators still work as expected. On Linux toolkit views, build and run the unit-tests.

Review URL: http://codereview.chromium.org/159046

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@22210 0039d316-1c4b-4281-b951-d872f2087c98


CrOS-Libchrome-Original-Commit: 148d105e27c7c8c2cda0c81292690b9edafcae1f
diff --git a/base/message_loop.cc b/base/message_loop.cc
index 4c91b1f..5464670 100644
--- a/base/message_loop.cc
+++ b/base/message_loop.cc
@@ -188,9 +188,10 @@
 
   StartHistogrammer();
 
-#if defined(OS_WIN)
-  if (state_->dispatcher) {
-    pump_win()->RunWithDispatcher(this, state_->dispatcher);
+#if defined(OS_WIN) || defined(OS_LINUX)
+  if (state_->dispatcher && type() == TYPE_UI) {
+    static_cast<base::MessagePumpForUI*>(pump_.get())->
+        RunWithDispatcher(this, state_->dispatcher);
     return;
   }
 #endif
@@ -480,7 +481,7 @@
 
   // Initialize the other fields:
   quit_received = false;
-#if defined(OS_WIN)
+#if defined(OS_WIN) || defined(OS_LINUX)
   dispatcher = NULL;
 #endif
 }
@@ -570,26 +571,7 @@
 //------------------------------------------------------------------------------
 // MessageLoopForUI
 
-#if defined(OS_LINUX) || defined(OS_WIN)
-
-void MessageLoopForUI::AddObserver(Observer* observer) {
-  pump_ui()->AddObserver(observer);
-}
-
-void MessageLoopForUI::RemoveObserver(Observer* observer) {
-  pump_ui()->RemoveObserver(observer);
-}
-
-#endif
-
 #if defined(OS_WIN)
-
-void MessageLoopForUI::Run(Dispatcher* dispatcher) {
-  AutoRunState save_state(this);
-  state_->dispatcher = dispatcher;
-  RunHandler();
-}
-
 void MessageLoopForUI::WillProcessMessage(const MSG& message) {
   pump_win()->WillProcessMessage(message);
 }
@@ -602,6 +584,22 @@
 
 #endif  // defined(OS_WIN)
 
+#if defined(OS_LINUX) || defined(OS_WIN)
+void MessageLoopForUI::AddObserver(Observer* observer) {
+  pump_ui()->AddObserver(observer);
+}
+
+void MessageLoopForUI::RemoveObserver(Observer* observer) {
+  pump_ui()->RemoveObserver(observer);
+}
+
+void MessageLoopForUI::Run(Dispatcher* dispatcher) {
+  AutoRunState save_state(this);
+  state_->dispatcher = dispatcher;
+  RunHandler();
+}
+#endif  // defined(OS_LINUX) || defined(OS_WIN)
+
 //------------------------------------------------------------------------------
 // MessageLoopForIO