Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/gpu/compositor_thread.h" | 5 #include "content/renderer/gpu/compositor_thread.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "content/renderer/gpu/input_event_filter.h" | 8 #include "content/renderer/gpu/input_event_filter.h" |
| 9 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositor.h" | 9 #include "third_party/WebKit/Source/WebKit/chromium/public/WebActiveWheelFlingPa rameters.h" |
| 10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositorClient.h " | 10 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositorInputHan dlerClient.h" |
| 11 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositorInputHan dler.h" | 11 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositorInputHan dler.h" |
| 12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | |
| 12 | 13 |
| 13 using WebKit::WebCompositorInputHandler; | 14 using WebKit::WebCompositorInputHandler; |
| 14 using WebKit::WebInputEvent; | 15 using WebKit::WebInputEvent; |
| 15 | 16 |
| 16 //------------------------------------------------------------------------------ | 17 //------------------------------------------------------------------------------ |
| 17 | 18 |
| 18 class CompositorThread::InputHandlerWrapper | 19 class CompositorThread::InputHandlerWrapper |
| 19 : public WebKit::WebCompositorClient { | 20 : public WebKit::WebCompositorInputHandlerClient, |
| 21 public base::RefCountedThreadSafe<InputHandlerWrapper> { | |
| 20 public: | 22 public: |
| 21 InputHandlerWrapper(CompositorThread* compositor_thread, | 23 InputHandlerWrapper(CompositorThread* compositor_thread, |
| 22 int routing_id, | 24 int routing_id, |
| 23 WebKit::WebCompositorInputHandler* input_handler) | 25 WebKit::WebCompositorInputHandler* input_handler, |
| 26 scoped_refptr<base::MessageLoopProxy> main_loop, | |
| 27 base::WeakPtr<RenderViewImpl> render_view_impl) | |
| 24 : compositor_thread_(compositor_thread), | 28 : compositor_thread_(compositor_thread), |
| 25 routing_id_(routing_id), | 29 routing_id_(routing_id), |
| 26 input_handler_(input_handler) { | 30 input_handler_(input_handler), |
| 31 main_loop_(main_loop), | |
| 32 render_view_impl_(render_view_impl) { | |
| 27 input_handler_->setClient(this); | 33 input_handler_->setClient(this); |
| 28 } | 34 } |
| 29 | 35 |
| 36 virtual void transferActiveWheelFlingAnimation( | |
| 37 const WebKit::WebActiveWheelFlingParameters& params) { | |
| 38 main_loop_->PostTask( | |
| 39 FROM_HERE, | |
| 40 base::Bind(&CompositorThread::InputHandlerWrapper:: | |
| 41 TransferActiveWheelFlingAnimation, | |
| 42 this, params)); | |
| 43 } | |
| 44 | |
| 30 virtual ~InputHandlerWrapper() { | 45 virtual ~InputHandlerWrapper() { |
| 31 input_handler_->setClient(NULL); | 46 input_handler_->setClient(NULL); |
| 32 } | 47 } |
| 33 | 48 |
| 34 int routing_id() const { return routing_id_; } | 49 int routing_id() const { return routing_id_; } |
| 35 WebKit::WebCompositorInputHandler* input_handler() const { | 50 WebKit::WebCompositorInputHandler* input_handler() const { |
| 36 return input_handler_; | 51 return input_handler_; |
| 37 } | 52 } |
| 38 | 53 |
| 39 // WebCompositorClient methods: | 54 // WebCompositorInputHandlerClient methods: |
| 40 | 55 |
| 41 virtual void willShutdown() { | 56 virtual void willShutdown() { |
| 42 compositor_thread_->RemoveInputHandler(routing_id_); | 57 compositor_thread_->RemoveInputHandler(routing_id_); |
| 43 } | 58 } |
| 44 | 59 |
| 45 virtual void didHandleInputEvent() { | 60 virtual void didHandleInputEvent() { |
| 46 compositor_thread_->filter_->DidHandleInputEvent(); | 61 compositor_thread_->filter_->DidHandleInputEvent(); |
| 47 } | 62 } |
| 48 | 63 |
| 49 virtual void didNotHandleInputEvent(bool send_to_widget) { | 64 virtual void didNotHandleInputEvent(bool send_to_widget) { |
| 50 compositor_thread_->filter_->DidNotHandleInputEvent(send_to_widget); | 65 compositor_thread_->filter_->DidNotHandleInputEvent(send_to_widget); |
| 51 } | 66 } |
| 52 | 67 |
| 53 private: | 68 private: |
| 69 void TransferActiveWheelFlingAnimation( | |
|
darin (slow to review)
2012/03/27 03:47:54
Another approach would be to define this as a publ
| |
| 70 WebKit::WebActiveWheelFlingParameters params) { | |
| 71 DCHECK(main_loop_->BelongsToCurrentThread()); | |
| 72 if (render_view_impl_.get() && render_view_impl_->webview()) | |
| 73 render_view_impl_->webview()->transferActiveWheelFlingAnimation(params); | |
|
darin (slow to review)
2012/03/27 03:47:54
nit: indentation
| |
| 74 } | |
| 75 | |
| 54 CompositorThread* compositor_thread_; | 76 CompositorThread* compositor_thread_; |
| 55 int routing_id_; | 77 int routing_id_; |
| 56 WebKit::WebCompositorInputHandler* input_handler_; | 78 WebKit::WebCompositorInputHandler* input_handler_; |
| 79 scoped_refptr<base::MessageLoopProxy> main_loop_; | |
| 80 | |
| 81 // Can only be accessed on the main thread. | |
| 82 base::WeakPtr<RenderViewImpl> render_view_impl_; | |
| 57 | 83 |
| 58 DISALLOW_COPY_AND_ASSIGN(InputHandlerWrapper); | 84 DISALLOW_COPY_AND_ASSIGN(InputHandlerWrapper); |
| 59 }; | 85 }; |
| 60 | 86 |
| 61 //------------------------------------------------------------------------------ | 87 //------------------------------------------------------------------------------ |
| 62 | 88 |
| 63 CompositorThread::CompositorThread(IPC::Channel::Listener* main_listener) | 89 CompositorThread::CompositorThread(IPC::Channel::Listener* main_listener) |
| 64 : thread_("Compositor") { | 90 : thread_("Compositor") { |
| 65 filter_ = | 91 filter_ = |
| 66 new InputEventFilter(main_listener, | 92 new InputEventFilter(main_listener, |
| 67 thread_.message_loop()->message_loop_proxy(), | 93 thread_.message_loop()->message_loop_proxy(), |
| 68 base::Bind(&CompositorThread::HandleInputEvent, | 94 base::Bind(&CompositorThread::HandleInputEvent, |
| 69 base::Unretained(this))); | 95 base::Unretained(this))); |
| 70 } | 96 } |
| 71 | 97 |
| 72 CompositorThread::~CompositorThread() { | 98 CompositorThread::~CompositorThread() { |
| 73 } | 99 } |
| 74 | 100 |
| 75 IPC::ChannelProxy::MessageFilter* CompositorThread::GetMessageFilter() const { | 101 IPC::ChannelProxy::MessageFilter* CompositorThread::GetMessageFilter() const { |
| 76 return filter_; | 102 return filter_; |
| 77 } | 103 } |
| 78 | 104 |
| 79 void CompositorThread::AddInputHandler(int routing_id, int input_handler_id) { | 105 void CompositorThread::AddInputHandler( |
| 80 if (thread_.message_loop() != MessageLoop::current()) { | 106 int routing_id, int input_handler_id, |
| 81 thread_.message_loop()->PostTask( | 107 base::WeakPtr<RenderViewImpl> render_view_impl) { |
|
darin (slow to review)
2012/03/27 03:47:54
nit: pass WeakPtr by const ref
| |
| 82 FROM_HERE, | 108 DCHECK_NE(thread_.message_loop(), MessageLoop::current()); |
| 83 base::Bind(&CompositorThread::AddInputHandler, base::Unretained(this), | 109 |
| 84 routing_id, input_handler_id)); | 110 thread_.message_loop()->PostTask( |
| 85 return; | 111 FROM_HERE, |
| 86 } | 112 base::Bind(&CompositorThread::AddInputHandlerOnCompositorThread, |
| 113 base::Unretained(this), | |
| 114 routing_id, | |
| 115 input_handler_id, | |
| 116 base::MessageLoopProxy::current(), | |
| 117 render_view_impl)); | |
| 118 } | |
| 119 | |
| 120 void CompositorThread::AddInputHandlerOnCompositorThread( | |
| 121 int routing_id, int input_handler_id, | |
| 122 scoped_refptr<base::MessageLoopProxy> main_loop, | |
| 123 base::WeakPtr<RenderViewImpl> render_view_impl) { | |
|
darin (slow to review)
2012/03/27 03:47:54
nit: pass WeakPtr by const ref
| |
| 124 | |
| 125 DCHECK_EQ(thread_.message_loop(), MessageLoop::current()); | |
| 87 | 126 |
| 88 WebCompositorInputHandler* input_handler = | 127 WebCompositorInputHandler* input_handler = |
| 89 WebCompositorInputHandler::fromIdentifier(input_handler_id); | 128 WebCompositorInputHandler::fromIdentifier(input_handler_id); |
| 90 if (!input_handler) | 129 if (!input_handler) |
| 91 return; | 130 return; |
| 92 | 131 |
| 93 if (input_handlers_.count(routing_id) != 0) { | 132 if (input_handlers_.count(routing_id) != 0) { |
| 94 // It's valid to call AddInputHandler() for the same routing id with the | 133 // It's valid to call AddInputHandler() for the same routing id with the |
| 95 // same input_handler many times, but it's not valid to change the | 134 // same input_handler many times, but it's not valid to change the |
| 96 // input_handler for a route. | 135 // input_handler for a route. |
| 97 DCHECK_EQ(input_handlers_[routing_id]->input_handler(), input_handler); | 136 DCHECK_EQ(input_handlers_[routing_id]->input_handler(), input_handler); |
| 98 return; | 137 return; |
| 99 } | 138 } |
| 100 | 139 |
| 101 filter_->AddRoute(routing_id); | 140 filter_->AddRoute(routing_id); |
| 102 input_handlers_[routing_id] = | 141 input_handlers_[routing_id] = |
| 103 make_linked_ptr(new InputHandlerWrapper(this, routing_id, input_handler)); | 142 make_scoped_refptr(new InputHandlerWrapper(this, |
| 143 routing_id, input_handler, main_loop, render_view_impl)); | |
| 104 } | 144 } |
| 105 | 145 |
| 106 void CompositorThread::RemoveInputHandler(int routing_id) { | 146 void CompositorThread::RemoveInputHandler(int routing_id) { |
| 107 DCHECK(thread_.message_loop() == MessageLoop::current()); | 147 DCHECK_EQ(MessageLoop::current(), thread_.message_loop()); |
| 108 | 148 |
| 109 filter_->RemoveRoute(routing_id); | 149 filter_->RemoveRoute(routing_id); |
| 110 input_handlers_.erase(routing_id); | 150 input_handlers_.erase(routing_id); |
| 111 } | 151 } |
| 112 | 152 |
| 113 void CompositorThread::HandleInputEvent( | 153 void CompositorThread::HandleInputEvent( |
| 114 int routing_id, | 154 int routing_id, |
| 115 const WebInputEvent* input_event) { | 155 const WebInputEvent* input_event) { |
| 116 DCHECK_EQ(MessageLoop::current(), thread_.message_loop()); | 156 DCHECK_EQ(MessageLoop::current(), thread_.message_loop()); |
| 117 | 157 |
| 118 InputHandlerMap::iterator it = input_handlers_.find(routing_id); | 158 InputHandlerMap::iterator it = input_handlers_.find(routing_id); |
| 119 if (it == input_handlers_.end()) { | 159 if (it == input_handlers_.end()) { |
| 120 // Oops, we no longer have an interested input handler.. | 160 // Oops, we no longer have an interested input handler.. |
| 121 filter_->DidNotHandleInputEvent(true); | 161 filter_->DidNotHandleInputEvent(true); |
| 122 return; | 162 return; |
| 123 } | 163 } |
| 124 | 164 |
| 125 it->second->input_handler()->handleInputEvent(*input_event); | 165 it->second->input_handler()->handleInputEvent(*input_event); |
| 126 } | 166 } |
| OLD | NEW |