Commit 2b55031d authored by Pavel Feldman's avatar Pavel Feldman Committed by Commit Bot

DevTools: dispatch mouse events into the main frame when inspector overlay is engaged.

Bug: 944907
Change-Id: I04eac380703adb886cd90751fdd706f9f62107a4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1534651Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Commit-Queue: Pavel Feldman <pfeldman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#644129}
parent fd19ef8f
......@@ -258,6 +258,8 @@ jumbo_source_set("browser") {
"$target_gen_dir/devtools/protocol/memory.h",
"$target_gen_dir/devtools/protocol/network.cc",
"$target_gen_dir/devtools/protocol/network.h",
"$target_gen_dir/devtools/protocol/overlay.cc",
"$target_gen_dir/devtools/protocol/overlay.h",
"$target_gen_dir/devtools/protocol/page.cc",
"$target_gen_dir/devtools/protocol/page.h",
"$target_gen_dir/devtools/protocol/protocol.cc",
......@@ -717,6 +719,8 @@ jumbo_source_set("browser") {
"devtools/protocol/native_input_event_builder_mac.mm",
"devtools/protocol/network_handler.cc",
"devtools/protocol/network_handler.h",
"devtools/protocol/overlay_handler.cc",
"devtools/protocol/overlay_handler.h",
"devtools/protocol/page_handler.cc",
"devtools/protocol/page_handler.h",
"devtools/protocol/schema_handler.cc",
......
......@@ -99,6 +99,8 @@ inspector_protocol_generate("protocol_sources") {
"protocol/memory.h",
"protocol/network.cc",
"protocol/network.h",
"protocol/overlay.cc",
"protocol/overlay.h",
"protocol/page.cc",
"protocol/page.h",
"protocol/protocol.cc",
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/devtools/protocol/overlay_handler.h"
#include "content/browser/renderer_host/render_widget_host_input_event_router.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include <stdint.h>
#include <utility>
namespace content {
namespace protocol {
OverlayHandler::OverlayHandler()
: DevToolsDomainHandler(Overlay::Metainfo::domainName) {}
OverlayHandler::~OverlayHandler() = default;
void OverlayHandler::Wire(UberDispatcher* dispatcher) {
Overlay::Dispatcher::wire(dispatcher, this);
}
void OverlayHandler::SetRenderer(int process_host_id,
RenderFrameHostImpl* frame_host) {
if (host_ == frame_host)
return;
host_ = frame_host;
UpdateCaptureInputEvents();
}
Response OverlayHandler::SetInspectMode(
const String& in_mode,
Maybe<protocol::Overlay::HighlightConfig> in_highlightConfig) {
inspect_mode_ = in_mode;
UpdateCaptureInputEvents();
return Response::FallThrough();
}
Response OverlayHandler::SetPausedInDebuggerMessage(Maybe<String> message) {
paused_message_ = message.fromMaybe(std::string());
UpdateCaptureInputEvents();
return Response::FallThrough();
}
Response OverlayHandler::Disable() {
inspect_mode_ = std::string();
paused_message_ = std::string();
UpdateCaptureInputEvents();
return Response::FallThrough();
}
void OverlayHandler::UpdateCaptureInputEvents() {
if (!host_)
return;
auto* web_contents =
WebContentsImpl::FromFrameTreeNode(host_->frame_tree_node());
if (!web_contents)
return;
bool capture_input =
inspect_mode_ == Overlay::InspectModeEnum::CaptureAreaScreenshot ||
!paused_message_.empty();
if (!web_contents->GetInputEventRouter())
return;
web_contents->GetInputEventRouter()->set_route_to_root_for_devtools(
capture_input);
}
} // namespace protocol
} // namespace content
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_DEVTOOLS_PROTOCOL_OVERLAY_HANDLER_H_
#define CONTENT_BROWSER_DEVTOOLS_PROTOCOL_OVERLAY_HANDLER_H_
#include <set>
#include "base/macros.h"
#include "content/browser/devtools/protocol/devtools_domain_handler.h"
#include "content/browser/devtools/protocol/overlay.h"
namespace content {
class RenderFrameHostImpl;
namespace protocol {
class OverlayHandler : public DevToolsDomainHandler, public Overlay::Backend {
public:
OverlayHandler();
~OverlayHandler() override;
void Wire(UberDispatcher* dispatcher) override;
void SetRenderer(int process_host_id,
RenderFrameHostImpl* frame_host) override;
Response SetInspectMode(
const String& in_mode,
Maybe<protocol::Overlay::HighlightConfig> in_highlightConfig) override;
Response SetPausedInDebuggerMessage(Maybe<String> in_message) override;
Response Disable() override;
private:
void UpdateCaptureInputEvents();
RenderFrameHostImpl* host_ = nullptr;
std::string inspect_mode_;
std::string paused_message_;
DISALLOW_COPY_AND_ASSIGN(OverlayHandler);
};
} // namespace protocol
} // namespace content
#endif // CONTENT_BROWSER_DEVTOOLS_PROTOCOL_OVERLAY_HANDLER_H_
......@@ -49,6 +49,10 @@
"include_events": ["requestWillBeSent", "responseReceived", "loadingFinished", "loadingFailed", "requestIntercepted", "signedExchangeReceived"],
"async": ["clearBrowserCookies", "clearBrowserCache", "getCookies", "getAllCookies", "deleteCookies", "setCookie", "setCookies", "continueInterceptedRequest", "getResponseBodyForInterception", "takeResponseBodyForInterceptionAsStream"]
},
{
"domain": "Overlay",
"include": ["setInspectMode", "setPausedInDebuggerMessage"]
},
{
"domain": "Page",
"include": ["enable", "disable", "reload", "navigate", "stopLoading", "getNavigationHistory", "navigateToHistoryEntry", "resetNavigationHistory", "captureScreenshot",
......
......@@ -30,6 +30,7 @@
#include "content/browser/devtools/protocol/io_handler.h"
#include "content/browser/devtools/protocol/memory_handler.h"
#include "content/browser/devtools/protocol/network_handler.h"
#include "content/browser/devtools/protocol/overlay_handler.h"
#include "content/browser/devtools/protocol/page_handler.h"
#include "content/browser/devtools/protocol/protocol.h"
#include "content/browser/devtools/protocol/schema_handler.h"
......@@ -287,6 +288,8 @@ bool RenderFrameDevToolsAgentHost::AttachSession(DevToolsSession* session) {
session->AddHandler(std::make_unique<protocol::InspectorHandler>());
session->AddHandler(std::make_unique<protocol::IOHandler>(GetIOContext()));
session->AddHandler(std::make_unique<protocol::MemoryHandler>());
if (!frame_tree_node_ || !frame_tree_node_->parent())
session->AddHandler(std::make_unique<protocol::OverlayHandler>());
session->AddHandler(std::make_unique<protocol::NetworkHandler>(
GetId(),
frame_tree_node_ ? frame_tree_node_->devtools_frame_token()
......
......@@ -467,7 +467,12 @@ RenderWidgetTargetResult RenderWidgetHostInputEventRouter::FindMouseEventTarget(
bool needs_transform_point = true;
bool latched_target = true;
bool should_verify_result = false;
if (root_view->IsMouseLocked()) {
// Allow devtools to route events into the root view based on the
// browser-side inspector overlay state.
if (route_to_root_for_devtools_)
target = root_view;
if (!target && root_view->IsMouseLocked()) {
target = root_view->host()->delegate()->GetMouseLockWidget()->GetView();
}
......
......@@ -171,6 +171,10 @@ class CONTENT_EXPORT RenderWidgetHostInputEventRouter
size_t TouchEventAckQueueLengthForTesting() const;
size_t RegisteredViewCountForTesting() const;
void set_route_to_root_for_devtools(bool route) {
route_to_root_for_devtools_ = route;
}
private:
FRIEND_TEST_ALL_PREFIXES(BrowserSideFlingBrowserTest,
InertialGSUBubblingStopsWhenParentCannotScroll);
......@@ -362,6 +366,10 @@ class CONTENT_EXPORT RenderWidgetHostInputEventRouter
int active_touches_;
// Route all input events into the root view while devtools is showing a full
// page overlay.
bool route_to_root_for_devtools_ = false;
// Touchscreen gesture pinch events must be routed to the main frame. This
// keeps track of ongoing scroll and pinch gestures so we know when to divert
// gesture events to the main frame and whether additional scroll begin/end
......
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