Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1638)

Unified Diff: content/renderer/gpu/compositor_thread.cc

Issue 9817001: Implement active wheel fling transfer via WebCompositorInputHandlerClient (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Really builds Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/gpu/compositor_thread.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/gpu/compositor_thread.cc
diff --git a/content/renderer/gpu/compositor_thread.cc b/content/renderer/gpu/compositor_thread.cc
index d4c790c297ff3a5973b22bd3abf1c52fa328617b..287d35a938cffa9834d2378c8f48a27ebbe30bd7 100644
--- a/content/renderer/gpu/compositor_thread.cc
+++ b/content/renderer/gpu/compositor_thread.cc
@@ -6,9 +6,12 @@
#include "base/bind.h"
#include "content/renderer/gpu/input_event_filter.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositor.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositorClient.h"
+#include "content/public/renderer/render_view.h"
+#include "content/public/renderer/render_view_visitor.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebActiveWheelFlingParameters.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositorInputHandlerClient.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositorInputHandler.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
using WebKit::WebCompositorInputHandler;
using WebKit::WebInputEvent;
@@ -16,17 +19,29 @@ using WebKit::WebInputEvent;
//------------------------------------------------------------------------------
class CompositorThread::InputHandlerWrapper
- : public WebKit::WebCompositorClient {
+ : public WebKit::WebCompositorInputHandlerClient {
public:
InputHandlerWrapper(CompositorThread* compositor_thread,
int routing_id,
- WebKit::WebCompositorInputHandler* input_handler)
+ WebKit::WebCompositorInputHandler* input_handler,
+ scoped_refptr<base::MessageLoopProxy> main_loop)
: compositor_thread_(compositor_thread),
routing_id_(routing_id),
- input_handler_(input_handler) {
+ input_handler_(input_handler),
+ main_loop_(main_loop),
+ render_view_finder_(routing_id) {
input_handler_->setClient(this);
}
+ virtual void transferActiveWheelFlingAnimation(
+ const WebKit::WebActiveWheelFlingParameters& params) {
+ main_loop_->PostTask(
+ FROM_HERE,
+ base::Bind(&CompositorThread::InputHandlerWrapper
+ ::TransferActiveWheelFlingAnimation,
+ base::Unretained(this), params));
+ }
+
virtual ~InputHandlerWrapper() {
input_handler_->setClient(NULL);
}
@@ -36,7 +51,7 @@ class CompositorThread::InputHandlerWrapper
return input_handler_;
}
- // WebCompositorClient methods:
+ // WebCompositorInputHandlerClient methods:
virtual void willShutdown() {
compositor_thread_->RemoveInputHandler(routing_id_);
@@ -51,9 +66,46 @@ class CompositorThread::InputHandlerWrapper
}
private:
+ // TODO(jamesr): There's got to be a better way to do this. Do we have a map
+ // from routing_id -> RenderView / RenderViewImpl somewhere?
+ class FindRenderViewByRoutingIDVisitor : public content::RenderViewVisitor {
+ public:
+ explicit FindRenderViewByRoutingIDVisitor(int routing_id)
+ : routing_id_(routing_id) ,
+ render_view_(NULL) {
+ }
+
+ content::RenderView* FindRenderView() {
+ if (!render_view_)
+ content::RenderView::ForEach(this);
+ return render_view_;
+ }
+
+ virtual bool Visit(content::RenderView* render_view) OVERRIDE {
+ if (render_view->GetRoutingID() == routing_id_)
+ return false;
+ return true;
+ }
+
+ private:
+ int routing_id_;
+ // We will always destroy the CompositorWrapper through
jamesr 2012/03/21 14:38:31 note: I haven't fully convinced myself that this i
+ // CompositorThread::RemoveCompositor before the view goes away, so it's
+ // safe to stash a raw pointer here.
+ content::RenderView* render_view_;
+ };
+
+ void TransferActiveWheelFlingAnimation(
+ WebKit::WebActiveWheelFlingParameters params) {
+ render_view_finder_.FindRenderView()->
+ GetWebView()->transferActiveWheelFlingAnimation(params);
+ }
+
CompositorThread* compositor_thread_;
int routing_id_;
WebKit::WebCompositorInputHandler* input_handler_;
+ scoped_refptr<base::MessageLoopProxy> main_loop_;
+ FindRenderViewByRoutingIDVisitor render_view_finder_;
DISALLOW_COPY_AND_ASSIGN(InputHandlerWrapper);
};
@@ -77,13 +129,22 @@ IPC::ChannelProxy::MessageFilter* CompositorThread::GetMessageFilter() const {
}
void CompositorThread::AddInputHandler(int routing_id, int input_handler_id) {
- if (thread_.message_loop() != MessageLoop::current()) {
- thread_.message_loop()->PostTask(
- FROM_HERE,
- base::Bind(&CompositorThread::AddInputHandler, base::Unretained(this),
- routing_id, input_handler_id));
- return;
- }
+ DCHECK_NE(thread_.message_loop(), MessageLoop::current());
+
+ thread_.message_loop()->PostTask(
+ FROM_HERE,
+ base::Bind(&CompositorThread::AddInputHandlerOnCompositorThread,
+ base::Unretained(this),
+ routing_id,
+ input_handler_id,
+ base::MessageLoopProxy::current()));
+}
+
+void CompositorThread::AddInputHandlerOnCompositorThread(
+ int routing_id, int input_handler_id,
+ scoped_refptr<base::MessageLoopProxy> main_loop) {
+
+ DCHECK_EQ(thread_.message_loop(), MessageLoop::current());
WebCompositorInputHandler* input_handler =
WebCompositorInputHandler::fromIdentifier(input_handler_id);
@@ -100,11 +161,12 @@ void CompositorThread::AddInputHandler(int routing_id, int input_handler_id) {
filter_->AddRoute(routing_id);
input_handlers_[routing_id] =
- make_linked_ptr(new InputHandlerWrapper(this, routing_id, input_handler));
+ make_linked_ptr(new InputHandlerWrapper(this,
+ routing_id, input_handler, main_loop));
}
void CompositorThread::RemoveInputHandler(int routing_id) {
- DCHECK(thread_.message_loop() == MessageLoop::current());
+ DCHECK_EQ(MessageLoop::current(), thread_.message_loop());
filter_->RemoveRoute(routing_id);
input_handlers_.erase(routing_id);
« no previous file with comments | « content/renderer/gpu/compositor_thread.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698