summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/frame_host/cross_process_frame_connector.cc37
-rw-r--r--content/browser/frame_host/cross_process_frame_connector.h5
-rw-r--r--content/common/frame_messages.h7
-rw-r--r--content/common/swapped_out_messages.cc2
-rw-r--r--content/renderer/render_frame_impl.cc4
-rw-r--r--content/renderer/render_frame_impl.h2
6 files changed, 56 insertions, 1 deletions
diff --git a/content/browser/frame_host/cross_process_frame_connector.cc b/content/browser/frame_host/cross_process_frame_connector.cc
index 520eeb60..f386df8 100644
--- a/content/browser/frame_host/cross_process_frame_connector.cc
+++ b/content/browser/frame_host/cross_process_frame_connector.cc
@@ -6,9 +6,11 @@
#include "content/browser/frame_host/render_frame_host_impl.h"
#include "content/browser/frame_host/render_widget_host_view_child_frame.h"
+#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/common/frame_messages.h"
#include "content/common/gpu/gpu_messages.h"
+#include "third_party/WebKit/public/web/WebInputEvent.h"
namespace content {
@@ -16,7 +18,7 @@ CrossProcessFrameConnector::CrossProcessFrameConnector(
RenderFrameHostImpl* frame_proxy_in_parent_renderer)
: frame_proxy_in_parent_renderer_(frame_proxy_in_parent_renderer),
view_(NULL) {
- frame_proxy_in_parent_renderer->set_cross_process_frame_connector(this);
+ frame_proxy_in_parent_renderer->set_cross_process_frame_connector(this);
}
CrossProcessFrameConnector::~CrossProcessFrameConnector() {
@@ -34,6 +36,7 @@ bool CrossProcessFrameConnector::OnMessageReceived(const IPC::Message& msg) {
OnCompositorFrameSwappedACK)
IPC_MESSAGE_HANDLER(FrameHostMsg_ReclaimCompositorResources,
OnReclaimCompositorResources)
+ IPC_MESSAGE_HANDLER(FrameHostMsg_ForwardInputEvent, OnForwardInputEvent)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP_EX()
@@ -120,4 +123,36 @@ gfx::Rect CrossProcessFrameConnector::ChildFrameRect() {
return child_frame_rect_;
}
+void CrossProcessFrameConnector::OnForwardInputEvent(
+ const blink::WebInputEvent* event) {
+ if (!view_)
+ return;
+
+ RenderWidgetHostImpl* child_widget =
+ RenderWidgetHostImpl::From(view_->GetRenderWidgetHost());
+ RenderWidgetHostImpl* parent_widget =
+ frame_proxy_in_parent_renderer_->render_view_host();
+
+ if (blink::WebInputEvent::isKeyboardEventType(event->type)) {
+ if (!parent_widget->GetLastKeyboardEvent())
+ return;
+ NativeWebKeyboardEvent keyboard_event(
+ *parent_widget->GetLastKeyboardEvent());
+ child_widget->ForwardKeyboardEvent(keyboard_event);
+ return;
+ }
+
+ if (blink::WebInputEvent::isMouseEventType(event->type)) {
+ child_widget->ForwardMouseEvent(
+ *static_cast<const blink::WebMouseEvent*>(event));
+ return;
+ }
+
+ if (event->type == blink::WebInputEvent::MouseWheel) {
+ child_widget->ForwardWheelEvent(
+ *static_cast<const blink::WebMouseWheelEvent*>(event));
+ return;
+ }
+}
+
} // namespace content
diff --git a/content/browser/frame_host/cross_process_frame_connector.h b/content/browser/frame_host/cross_process_frame_connector.h
index 4ab8e02..61103f6 100644
--- a/content/browser/frame_host/cross_process_frame_connector.h
+++ b/content/browser/frame_host/cross_process_frame_connector.h
@@ -8,6 +8,10 @@
#include "cc/output/compositor_frame.h"
#include "ui/gfx/rect.h"
+namespace blink {
+class WebInputEvent;
+}
+
namespace IPC {
class Message;
}
@@ -94,6 +98,7 @@ class CrossProcessFrameConnector {
const FrameHostMsg_CompositorFrameSwappedACK_Params& params);
void OnReclaimCompositorResources(
const FrameHostMsg_ReclaimCompositorResources_Params& params);
+ void OnForwardInputEvent(const blink::WebInputEvent* event);
// The RenderFrameHost that routes messages to the parent frame's renderer
// process.
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 625b0e0..9ebf35a 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -6,6 +6,7 @@
// Multiply-included message file, hence no include guard.
#include "content/common/content_export.h"
+#include "content/common/content_param_traits.h"
#include "content/common/frame_param.h"
#include "content/public/common/common_param_traits.h"
#include "content/public/common/context_menu_params.h"
@@ -224,6 +225,12 @@ IPC_MESSAGE_ROUTED0(FrameHostMsg_SwapOut_ACK)
IPC_MESSAGE_ROUTED1(FrameHostMsg_ReclaimCompositorResources,
FrameHostMsg_ReclaimCompositorResources_Params /* params */)
+// Forwards an input event to a child.
+// TODO(nick): Temporary bridge, revisit once the browser process can route
+// input directly to subframes. http://crbug.com/339659
+IPC_MESSAGE_ROUTED1(FrameHostMsg_ForwardInputEvent,
+ IPC::WebInputEventPointer /* event */)
+
// Instructs the frame to swap out for a cross-site transition, including
// running the unload event handler. Expects a SwapOut_ACK message when
// finished.
diff --git a/content/common/swapped_out_messages.cc b/content/common/swapped_out_messages.cc
index e2e920e..6572ad0 100644
--- a/content/common/swapped_out_messages.cc
+++ b/content/common/swapped_out_messages.cc
@@ -43,6 +43,8 @@ bool SwappedOutMessages::CanSendWhileSwappedOut(const IPC::Message* msg) {
case FrameHostMsg_CompositorFrameSwappedACK::ID:
case FrameHostMsg_BuffersSwappedACK::ID:
case FrameHostMsg_ReclaimCompositorResources::ID:
+ // Input events propagate from parent to child.
+ case FrameHostMsg_ForwardInputEvent::ID:
return true;
default:
break;
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 5aa6180..b5c52da 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -1629,6 +1629,10 @@ void RenderFrameImpl::showContextMenu(const blink::WebContextMenuData& data) {
Send(new FrameHostMsg_ContextMenu(routing_id_, params));
}
+void RenderFrameImpl::forwardInputEvent(const blink::WebInputEvent* event) {
+ Send(new FrameHostMsg_ForwardInputEvent(routing_id_, event));
+}
+
void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) {
observers_.AddObserver(observer);
}
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 48e564b..ba75851 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -26,6 +26,7 @@ struct FrameMsg_BuffersSwapped_Params;
struct FrameMsg_CompositorFrameSwapped_Params;
namespace blink {
+class WebInputEvent;
class WebMouseEvent;
struct WebCompositionUnderline;
struct WebContextMenuData;
@@ -326,6 +327,7 @@ class CONTENT_EXPORT RenderFrameImpl
virtual bool allowWebGL(blink::WebFrame* frame, bool default_value);
virtual void didLoseWebGLContext(blink::WebFrame* frame,
int arb_robustness_status_code);
+ virtual void forwardInputEvent(const blink::WebInputEvent* event);
// TODO(jam): move this to WebFrameClient
virtual void showContextMenu(const blink::WebContextMenuData& data);