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

Unified Diff: content/browser/frame_host/cross_process_frame_connector.cc

Issue 2123843002: Make RWHInputEventRouter manage cross-process scroll bubbling (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Test fix, take 2 Created 4 years, 5 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
Index: content/browser/frame_host/cross_process_frame_connector.cc
diff --git a/content/browser/frame_host/cross_process_frame_connector.cc b/content/browser/frame_host/cross_process_frame_connector.cc
index 2dd42ddd496727a10c357837480c3f8b74b7a314..8fd9e8744467c42385c1c367f2032333418d864b 100644
--- a/content/browser/frame_host/cross_process_frame_connector.cc
+++ b/content/browser/frame_host/cross_process_frame_connector.cc
@@ -15,6 +15,7 @@
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_delegate.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
+#include "content/browser/renderer_host/render_widget_host_input_event_router.h"
#include "content/browser/renderer_host/render_widget_host_view_base.h"
#include "content/common/frame_messages.h"
#include "gpu/ipc/common/gpu_messages.h"
@@ -26,12 +27,12 @@ CrossProcessFrameConnector::CrossProcessFrameConnector(
RenderFrameProxyHost* frame_proxy_in_parent_renderer)
: frame_proxy_in_parent_renderer_(frame_proxy_in_parent_renderer),
view_(nullptr),
- device_scale_factor_(1) {
-}
+ device_scale_factor_(1),
+ is_scroll_bubbling_(false) {}
CrossProcessFrameConnector::~CrossProcessFrameConnector() {
- if (view_)
- view_->SetCrossProcessFrameConnector(nullptr);
+ // Notify the view of this object being destroyed, if the view still exists.
+ set_view(nullptr);
}
bool CrossProcessFrameConnector::OnMessageReceived(const IPC::Message& msg) {
@@ -54,8 +55,17 @@ bool CrossProcessFrameConnector::OnMessageReceived(const IPC::Message& msg) {
void CrossProcessFrameConnector::set_view(
RenderWidgetHostViewChildFrame* view) {
// Detach ourselves from the previous |view_|.
- if (view_)
+ if (view_) {
+ if (is_scroll_bubbling_ && GetParentRenderWidgetHostView()) {
+ RenderWidgetHostImpl::From(
+ GetParentRenderWidgetHostView()->GetRenderWidgetHost())
+ ->delegate()
+ ->GetInputEventRouter()
+ ->CancelScrollBubbling(view_);
+ is_scroll_bubbling_ = false;
+ }
view_->SetCrossProcessFrameConnector(nullptr);
+ }
view_ = view;
@@ -144,40 +154,32 @@ void CrossProcessFrameConnector::ForwardProcessAckedTouchEvent(
}
void CrossProcessFrameConnector::BubbleScrollEvent(
- const blink::WebInputEvent& event) {
+ const blink::WebGestureEvent& event) {
+ DCHECK(event.type == blink::WebInputEvent::GestureScrollUpdate ||
+ event.type == blink::WebInputEvent::GestureScrollEnd);
auto parent_view = GetParentRenderWidgetHostView();
if (!parent_view)
return;
+ auto event_router =
+ RenderWidgetHostImpl::From(parent_view->GetRenderWidgetHost())
+ ->delegate()
+ ->GetInputEventRouter();
+
gfx::Vector2d offset_from_parent = child_frame_rect_.OffsetFromOrigin();
+ blink::WebGestureEvent resent_gesture_event(event);
+ // TODO(kenrb, wjmaclean): Do we need to account for transforms here?
+ // See https://crbug.com/626020.
+ resent_gesture_event.x += offset_from_parent.x();
+ resent_gesture_event.y += offset_from_parent.y();
if (event.type == blink::WebInputEvent::GestureScrollUpdate) {
- blink::WebGestureEvent resent_gesture_event;
- memcpy(&resent_gesture_event, &event, sizeof(resent_gesture_event));
- resent_gesture_event.x += offset_from_parent.x();
- resent_gesture_event.y += offset_from_parent.y();
- // TODO(wjmaclean, kenrb): The resendingPluginId field is used by
- // BrowserPlugin to associate bubbled events with each plugin, which is
- // not needed for OOPIFs. However the field needs to be set in order
- // to prompt the parent frame's RenderWidgetHostImpl to
- // manage the gesture scroll event lifetime (in particular creating the
- // GestureScrollBegin and GestureScrollEnd events). This can be converted
- // to a flag or otherwise refactored out when BrowserPlugin supporting
- // code is eventually removed (https://crbug.com/533069).
- resent_gesture_event.resendingPluginId = 1;
- ui::LatencyInfo latency_info;
- parent_view->ProcessGestureEvent(resent_gesture_event, latency_info);
- } else if (event.type == blink::WebInputEvent::MouseWheel) {
- blink::WebMouseWheelEvent resent_wheel_event;
- memcpy(&resent_wheel_event, &event, sizeof(resent_wheel_event));
- resent_wheel_event.x += offset_from_parent.x();
- resent_wheel_event.y += offset_from_parent.y();
- // TODO(wjmaclean): Initialize latency info correctly for OOPIFs.
- // https://crbug.com/613628
- ui::LatencyInfo latency_info;
- parent_view->ProcessMouseWheelEvent(resent_wheel_event, latency_info);
- } else {
- NOTIMPLEMENTED();
+ event_router->BubbleScrollEvent(parent_view, resent_gesture_event);
+ is_scroll_bubbling_ = true;
+ } else if (event.type == blink::WebInputEvent::GestureScrollEnd &&
+ is_scroll_bubbling_) {
+ event_router->BubbleScrollEvent(parent_view, resent_gesture_event);
+ is_scroll_bubbling_ = false;
}
}

Powered by Google App Engine
This is Rietveld 408576698