diff options
author | lambroslambrou@chromium.org <lambroslambrou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-21 23:46:57 +0000 |
---|---|---|
committer | lambroslambrou@chromium.org <lambroslambrou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-21 23:46:57 +0000 |
commit | 825c4281c36b790e25a9f1f74fb9bd75a0d2ba42 (patch) | |
tree | 4924d9a9098dd19a238078d68472e1778bb04178 | |
parent | 3fd22d99af8d466699b3078a72e15446b5bcbfe6 (diff) | |
download | chromium_src-825c4281c36b790e25a9f1f74fb9bd75a0d2ba42.zip chromium_src-825c4281c36b790e25a9f1f74fb9bd75a0d2ba42.tar.gz chromium_src-825c4281c36b790e25a9f1f74fb9bd75a0d2ba42.tar.bz2 |
Use AutoTaskRunner to run tasks automatically, even if validation checks fail.
BUG=None
TEST=Send invalid key/mouse event, verify host continues to process inputs.
Review URL: http://codereview.chromium.org/6882121
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@82583 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | remoting/host/event_executor_linux.cc | 18 | ||||
-rw-r--r-- | remoting/host/event_executor_mac.cc | 10 | ||||
-rw-r--r-- | remoting/host/event_executor_win.cc | 16 | ||||
-rw-r--r-- | remoting/host/screen_recorder.cc | 28 | ||||
-rw-r--r-- | remoting/host/screen_recorder.h | 1 |
5 files changed, 32 insertions, 41 deletions
diff --git a/remoting/host/event_executor_linux.cc b/remoting/host/event_executor_linux.cc index efbdcd9..5f0ef92 100644 --- a/remoting/host/event_executor_linux.cc +++ b/remoting/host/event_executor_linux.cc @@ -14,6 +14,7 @@ #include "base/logging.h" #include "base/message_loop.h" #include "base/task.h" +#include "media/base/callback.h" #include "remoting/proto/internal.pb.h" namespace remoting { @@ -277,13 +278,16 @@ bool EventExecutorLinux::Init() { } void EventExecutorLinux::InjectKeyEvent(const KeyEvent* event, Task* done) { + media::AutoTaskRunner done_runner(done); + if (MessageLoop::current() != message_loop_) { message_loop_->PostTask( FROM_HERE, NewRunnableMethod(this, &EventExecutorLinux::InjectKeyEvent, - event, done)); + event, done_runner.release())); return; } + // TODO(ajwong): This will only work for QWERTY keyboards. int keysym = ChromotocolKeycodeToX11Keysym(event->keycode()); @@ -304,20 +308,20 @@ void EventExecutorLinux::InjectKeyEvent(const KeyEvent* event, Task* done) { << " sending keysym: " << keysym << " to keycode: " << keycode; XTestFakeKeyEvent(display_, keycode, event->pressed(), CurrentTime); - - done->Run(); - delete done; } void EventExecutorLinux::InjectMouseEvent(const MouseEvent* event, Task* done) { + media::AutoTaskRunner done_runner(done); + if (MessageLoop::current() != message_loop_) { message_loop_->PostTask( FROM_HERE, NewRunnableMethod(this, &EventExecutorLinux::InjectMouseEvent, - event, done)); + event, done_runner.release())); return; } + if (event->has_x() && event->has_y()) { if (event->x() < 0 || event->y() < 0 || event->x() > width_ || event->y() > height_) { @@ -352,9 +356,6 @@ void EventExecutorLinux::InjectMouseEvent(const MouseEvent* event, if (event->has_wheel_offset_x() && event->has_wheel_offset_y()) { NOTIMPLEMENTED() << "No scroll wheel support yet."; } - - done->Run(); - delete done; } } // namespace @@ -367,4 +368,3 @@ EventExecutor* EventExecutor::Create(MessageLoopForUI* message_loop, } // namespace remoting DISABLE_RUNNABLE_METHOD_REFCOUNT(remoting::EventExecutorLinux); - diff --git a/remoting/host/event_executor_mac.cc b/remoting/host/event_executor_mac.cc index e38f514..96c8b01 100644 --- a/remoting/host/event_executor_mac.cc +++ b/remoting/host/event_executor_mac.cc @@ -12,6 +12,7 @@ #include "base/mac/scoped_cftyperef.h" #include "base/message_loop.h" #include "base/task.h" +#include "media/base/callback.h" #include "remoting/host/capturer.h" #include "remoting/proto/internal.pb.h" #include "remoting/protocol/message_decoder.h" @@ -214,6 +215,8 @@ const int kUsVkeyToKeysym[256] = { }; void EventExecutorMac::InjectKeyEvent(const KeyEvent* event, Task* done) { + media::AutoTaskRunner done_runner(done); + int key_code = event->keycode(); if (key_code >= 0 && key_code < 256) { int key_sym = kUsVkeyToKeysym[key_code]; @@ -245,11 +248,11 @@ void EventExecutorMac::InjectKeyEvent(const KeyEvent* event, Task* done) { CGEventPost(kCGSessionEventTap, kbd_event); } } - done->Run(); - delete done; } void EventExecutorMac::InjectMouseEvent(const MouseEvent* event, Task* done) { + media::AutoTaskRunner done_runner(done); + if (event->has_x() && event->has_y()) { // TODO(wez): Checking the validity of the MouseEvent should be done in core // cross-platform code, not here! @@ -301,9 +304,6 @@ void EventExecutorMac::InjectMouseEvent(const MouseEvent* event, Task* done) { // CGEventCreateScrollWheelEvent() to inject scroll events. NOTIMPLEMENTED() << "No scroll wheel support yet."; } - - done->Run(); - delete done; } } // namespace diff --git a/remoting/host/event_executor_win.cc b/remoting/host/event_executor_win.cc index 53c550a..2991ace 100644 --- a/remoting/host/event_executor_win.cc +++ b/remoting/host/event_executor_win.cc @@ -8,6 +8,7 @@ #include "base/compiler_specific.h" #include "base/message_loop.h" +#include "media/base/callback.h" #include "remoting/host/capturer.h" #include "remoting/proto/event.pb.h" #include "ui/base/keycodes/keyboard_codes.h" @@ -45,29 +46,31 @@ EventExecutorWin::EventExecutorWin(MessageLoopForUI* message_loop, } void EventExecutorWin::InjectKeyEvent(const KeyEvent* event, Task* done) { + media::AutoTaskRunner done_runner(done); + if (MessageLoop::current() != message_loop_) { message_loop_->PostTask( FROM_HERE, NewRunnableMethod(this, &EventExecutorWin::InjectKeyEvent, - event, done)); + event, done_runner.release())); return; } + HandleKey(event); - done->Run(); - delete done; } void EventExecutorWin::InjectMouseEvent(const MouseEvent* event, Task* done) { + media::AutoTaskRunner done_runner(done); + if (MessageLoop::current() != message_loop_) { message_loop_->PostTask( FROM_HERE, NewRunnableMethod(this, &EventExecutorWin::InjectMouseEvent, - event, done)); + event, done_runner.release())); return; } + HandleMouse(event); - done->Run(); - delete done; } void EventExecutorWin::HandleKey(const KeyEvent* event) { @@ -176,4 +179,3 @@ EventExecutor* EventExecutor::Create(MessageLoopForUI* message_loop, } // namespace remoting DISABLE_RUNNABLE_METHOD_REFCOUNT(remoting::EventExecutorWin); - diff --git a/remoting/host/screen_recorder.cc b/remoting/host/screen_recorder.cc index f4730c1..2db2608 100644 --- a/remoting/host/screen_recorder.cc +++ b/remoting/host/screen_recorder.cc @@ -11,6 +11,7 @@ #include "base/stl_util-inl.h" #include "base/task.h" #include "base/time.h" +#include "media/base/callback.h" #include "remoting/base/capture_data.h" #include "remoting/base/tracer.h" #include "remoting/proto/control.pb.h" @@ -136,35 +137,25 @@ void ScreenRecorder::DoStart() { void ScreenRecorder::DoStop(Task* done_task) { DCHECK_EQ(capture_loop_, MessageLoop::current()); + media::AutoTaskRunner done_runner(done_task); + // We might have not started when we receive a stop command, simply run the // task and then return. - if (!is_recording_) { - DoCompleteStop(done_task); + if (!is_recording_) return; - } capture_timer_.Stop(); is_recording_ = false; DCHECK_GE(recordings_, 0); if (recordings_) { - network_loop_->PostTask( + network_loop_->PostTask( FROM_HERE, NewTracedMethod(this, - &ScreenRecorder::DoStopOnNetworkThread, done_task)); + &ScreenRecorder::DoStopOnNetworkThread, + done_runner.release())); return; } - - DoCompleteStop(done_task); -} - -void ScreenRecorder::DoCompleteStop(Task* done_task) { - DCHECK_EQ(capture_loop_, MessageLoop::current()); - - if (done_task) { - done_task->Run(); - delete done_task; - } } void ScreenRecorder::DoSetMaxRate(double max_rate) { @@ -371,9 +362,8 @@ void ScreenRecorder::DoStopOnEncodeThread(Task* done_task) { // When this method is being executed there are no more tasks on encode thread // for this object. We can then post a task to capture thread to finish the // stop sequence. - capture_loop_->PostTask( - FROM_HERE, - NewTracedMethod(this, &ScreenRecorder::DoCompleteStop, done_task)); + if (done_task) + capture_loop_->PostTask(FROM_HERE, done_task); } void ScreenRecorder::EncodedDataAvailableCallback(VideoPacket* packet) { diff --git a/remoting/host/screen_recorder.h b/remoting/host/screen_recorder.h index 79eacc7..ce3e5ce 100644 --- a/remoting/host/screen_recorder.h +++ b/remoting/host/screen_recorder.h @@ -113,7 +113,6 @@ class ScreenRecorder : public base::RefCountedThreadSafe<ScreenRecorder> { void DoStart(); void DoStop(Task* done_task); - void DoCompleteStop(Task* done_task); void DoSetMaxRate(double max_rate); |