[DevTools] Implement mojom::DevToolsAgent for workers
1) Use blink::DevToolsAgent in WorkerInspectorController.
This replaces the ad-hoc interface for communicating with worker's debugger with
a mojo interface used for frames and shared/service worker's shadow pages.
2) Create WorkerDevToolsAgentHost. This is similar to other
agent hosts, keeps itself alive while the corresponding worker is alive,
and reuses DevToolsSession machinery for inspection.
3) Report dedicated workers to the browser process when auto attach is on.
mojom::DevToolsAgentHost is now notified about child workers and gets
their DevToolsAgent interfaces to debug in the future.
4) Add TargetHandler to service/shared/dedicated worker sessions, to handle
communication with nested dedicated workers.
5) Retire WorkerInspectorProxy and ExecutionContextWorkerRegistry.
These are covered by DevToolsAgent now, which reports to it's host.
6) Retire InspectorWorkerAgent, which is replaced by WorkerDevToolsAgentHost
on the browser side.
The benefits are:
- unified interface for inspecting any entity including workers;
- workers now support flatten mode of operations;
- all inspection targets are now listed on the browser side and
represented with DevToolsAgentHost, which allows for further
simplification;
- less abstractions - we can even get rid of InspectorSession now.
Bug: 775132
Change-Id: Ib4f58677a81ce48d4c2382f05d1166f730a2e2c3
Reviewed-on: https://chromium-review.googlesource.com/c/1183589
Commit-Queue: Dmitry Gozman <[email protected]>
Reviewed-by: Kinuko Yasuda <[email protected]>
Reviewed-by: Daniel Cheng <[email protected]>
Reviewed-by: Andrey Kosyakov <[email protected]>
Reviewed-by: Hiroki Nakagawa <[email protected]>
Reviewed-by: Aleksey Kozyatinskiy <[email protected]>
Reviewed-by: Pavel Feldman <[email protected]>
Cr-Commit-Position: refs/heads/master@{#603652}
diff --git a/content/browser/devtools/devtools_renderer_channel.h b/content/browser/devtools/devtools_renderer_channel.h
index 1e39045..10ec64a 100644
--- a/content/browser/devtools/devtools_renderer_channel.h
+++ b/content/browser/devtools/devtools_renderer_channel.h
@@ -5,7 +5,9 @@
#ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_RENDERER_CHANNEL_H_
#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_RENDERER_CHANNEL_H_
+#include "base/containers/flat_set.h"
#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
#include "content/common/content_export.h"
#include "mojo/public/cpp/bindings/associated_binding.h"
#include "mojo/public/cpp/bindings/binding.h"
@@ -21,9 +23,14 @@
class DevToolsSession;
class RenderFrameHostImpl;
+namespace protocol {
+class TargetAutoAttacher;
+}
+
// This class encapsulates a connection to blink::mojom::DevToolsAgent
-// in the renderer.
-// When the renderer changes, different DevToolsAgentHostImpl subclasses
+// in the renderer (either RenderFrame or some kind of worker).
+// When the renderer changes (e.g. worker restarts or a new RenderFrame
+// is used for the frame), different DevToolsAgentHostImpl subclasses
// retrieve a new blink::mojom::DevToolsAgent pointer, and this channel
// starts using it for all existing and future sessions.
class CONTENT_EXPORT DevToolsRendererChannel
@@ -32,7 +39,14 @@
explicit DevToolsRendererChannel(DevToolsAgentHostImpl* owner);
~DevToolsRendererChannel() override;
- void SetRenderer(
+ // Dedicated workers use non-associated version,
+ // while frames and other workers use DevToolsAgent associated
+ // with respective control interfraces. See mojom for details.
+ void SetRenderer(blink::mojom::DevToolsAgentPtr agent_ptr,
+ blink::mojom::DevToolsAgentHostRequest host_request,
+ int process_id,
+ RenderFrameHostImpl* frame_host);
+ void SetRendererAssociated(
blink::mojom::DevToolsAgentAssociatedPtr agent_ptr,
blink::mojom::DevToolsAgentHostAssociatedRequest host_request,
int process_id,
@@ -40,12 +54,35 @@
void AttachSession(DevToolsSession* session);
void InspectElement(const gfx::Point& point);
+ void SetReportChildWorkers(protocol::TargetAutoAttacher* attacher,
+ bool report,
+ bool wait_for_debugger);
+
private:
+ // blink::mojom::DevToolsAgentHost implementation.
+ void ChildWorkerCreated(blink::mojom::DevToolsAgentPtr worker_devtools_agent,
+ blink::mojom::DevToolsAgentHostRequest host_request,
+ const GURL& url,
+ const base::UnguessableToken& devtools_worker_token,
+ bool waiting_for_debugger) override;
+ void ChildWorkerDestroyed(DevToolsAgentHostImpl*);
+
+ void CleanupConnection();
+ void SetRendererInternal(blink::mojom::DevToolsAgent* agent,
+ int process_id,
+ RenderFrameHostImpl* frame_host);
+
DevToolsAgentHostImpl* owner_;
- mojo::AssociatedBinding<blink::mojom::DevToolsAgentHost> binding_;
- blink::mojom::DevToolsAgentAssociatedPtr agent_ptr_;
+ mojo::Binding<blink::mojom::DevToolsAgentHost> binding_;
+ mojo::AssociatedBinding<blink::mojom::DevToolsAgentHost> associated_binding_;
+ blink::mojom::DevToolsAgentPtr agent_ptr_;
+ blink::mojom::DevToolsAgentAssociatedPtr associated_agent_ptr_;
int process_id_;
RenderFrameHostImpl* frame_host_ = nullptr;
+ base::flat_set<protocol::TargetAutoAttacher*> report_attachers_;
+ base::flat_set<protocol::TargetAutoAttacher*> wait_for_debugger_attachers_;
+ base::flat_set<DevToolsAgentHostImpl*> child_workers_;
+ base::WeakPtrFactory<DevToolsRendererChannel> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(DevToolsRendererChannel);
};