Commit 353d1a14 authored by Ken Buchanan's avatar Ken Buchanan Committed by Commit Bot

RenderWidget captures mouse input when frameset is being resized

Dragging the frame dividers of a frameset should cause that RenderWidget
to receive all mouse input until a MouseUp is received, otherwise
the mouse moving over cross-process content, such as a PDF or an OOPIF,
will cause the resize to stop.

This CL triggers mouse capture in that case.

Bug: 878007
Change-Id: I96c4855954799c5f03d7dfc697ad399a31a561dd
Reviewed-on: https://chromium-review.googlesource.com/c/1298222
Commit-Queue: Ken Buchanan <kenrb@chromium.org>
Reviewed-by: default avatarDave Tapuska <dtapuska@chromium.org>
Cr-Commit-Position: refs/heads/master@{#602476}
parent 5e70c69e
...@@ -3062,6 +3062,35 @@ IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest, ...@@ -3062,6 +3062,35 @@ IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest,
EXPECT_FALSE(interceptor->Capturing()); EXPECT_FALSE(interceptor->Capturing());
} }
// Verify that when a divider within a frameset is clicked, mouse capture is
// initiated.
IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest,
MouseCaptureOnFramesetResize) {
GURL main_url(embedded_test_server()->GetURL("/page_with_frameset.html"));
EXPECT_TRUE(NavigateToURL(shell(), main_url));
FrameTreeNode* root = web_contents()->GetFrameTree()->root();
RenderWidgetHost* widget_host =
root->current_frame_host()->GetRenderWidgetHost();
RenderWidgetHostViewBase* rwhv_root =
static_cast<RenderWidgetHostViewBase*>(widget_host->GetView());
scoped_refptr<SetMouseCaptureInterceptor> interceptor =
new SetMouseCaptureInterceptor(
static_cast<RenderWidgetHostImpl*>(widget_host));
gfx::PointF click_point =
gfx::PointF(rwhv_root->GetViewBounds().width() / 2, 20);
// Click on the divider bar that initiates resize.
DispatchMouseEventAndWaitUntilDispatch(web_contents(), rwhv_root, click_point,
rwhv_root, click_point);
// Wait for the mouse capture message.
interceptor->Wait();
EXPECT_TRUE(interceptor->Capturing());
}
// There are no cursors on Android. // There are no cursors on Android.
#if !defined(OS_ANDROID) #if !defined(OS_ANDROID)
class CursorMessageFilter : public content::BrowserMessageFilter { class CursorMessageFilter : public content::BrowserMessageFilter {
......
<html>
<frameset cols="50%,50%">
<frame src="title1.html"/>
<frame src="title1.html"/>
</frameset>
</html>
\ No newline at end of file
...@@ -1013,6 +1013,7 @@ WebInputEventResult EventHandler::HandleMouseReleaseEvent( ...@@ -1013,6 +1013,7 @@ WebInputEventResult EventHandler::HandleMouseReleaseEvent(
mouse_event_manager_->HandleSvgPanIfNeeded(true); mouse_event_manager_->HandleSvgPanIfNeeded(true);
if (frame_set_being_resized_) { if (frame_set_being_resized_) {
CaptureMouseEventsToWidget(false);
return mouse_event_manager_->SetMousePositionAndDispatchMouseEvent( return mouse_event_manager_->SetMousePositionAndDispatchMouseEvent(
EffectiveMouseEventTargetNode(frame_set_being_resized_.Get()), String(), EffectiveMouseEventTargetNode(frame_set_being_resized_.Get()), String(),
EventTypeNames::mouseup, mouse_event); EventTypeNames::mouseup, mouse_event);
...@@ -2034,6 +2035,7 @@ void EventHandler::MayUpdateHoverAfterScroll( ...@@ -2034,6 +2035,7 @@ void EventHandler::MayUpdateHoverAfterScroll(
} }
void EventHandler::SetResizingFrameSet(HTMLFrameSetElement* frame_set) { void EventHandler::SetResizingFrameSet(HTMLFrameSetElement* frame_set) {
CaptureMouseEventsToWidget(true);
frame_set_being_resized_ = frame_set; frame_set_being_resized_ = frame_set;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment