Commit f5bfcdd1 authored by Pavel Feldman's avatar Pavel Feldman Committed by Commit Bot

Headless: enable multiclient access to headless targets.

Change-Id: I7008b98fbf392801b796517a9a442c34815b13c4
Reviewed-on: https://chromium-review.googlesource.com/1040988Reviewed-by: default avatarAlex Clarke <alexclarke@chromium.org>
Reviewed-by: default avatarEric Seckler <eseckler@chromium.org>
Commit-Queue: Pavel Feldman <pfeldman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#555886}
parent ee7b0b18
...@@ -208,16 +208,6 @@ bool DevToolsAgentHostImpl::AttachRestrictedClient( ...@@ -208,16 +208,6 @@ bool DevToolsAgentHostImpl::AttachRestrictedClient(
return InnerAttachClient(client, true /* restricted */); return InnerAttachClient(client, true /* restricted */);
} }
void DevToolsAgentHostImpl::ForceAttachClient(DevToolsAgentHostClient* client) {
if (SessionByClient(client))
return;
scoped_refptr<DevToolsAgentHostImpl> protect(this);
if (!sessions_.empty())
ForceDetachAllSessions();
DCHECK(sessions_.empty());
InnerAttachClient(client, false /* restricted */);
}
bool DevToolsAgentHostImpl::DetachClient(DevToolsAgentHostClient* client) { bool DevToolsAgentHostImpl::DetachClient(DevToolsAgentHostClient* client) {
if (!SessionByClient(client)) if (!SessionByClient(client))
return false; return false;
......
...@@ -38,7 +38,6 @@ class CONTENT_EXPORT DevToolsAgentHostImpl : public DevToolsAgentHost { ...@@ -38,7 +38,6 @@ class CONTENT_EXPORT DevToolsAgentHostImpl : public DevToolsAgentHost {
// DevToolsAgentHost implementation. // DevToolsAgentHost implementation.
void AttachClient(DevToolsAgentHostClient* client) override; void AttachClient(DevToolsAgentHostClient* client) override;
bool AttachRestrictedClient(DevToolsAgentHostClient* client) override; bool AttachRestrictedClient(DevToolsAgentHostClient* client) override;
void ForceAttachClient(DevToolsAgentHostClient* client) override;
bool DetachClient(DevToolsAgentHostClient* client) override; bool DetachClient(DevToolsAgentHostClient* client) override;
bool DispatchProtocolMessage(DevToolsAgentHostClient* client, bool DispatchProtocolMessage(DevToolsAgentHostClient* client,
const std::string& message) override; const std::string& message) override;
......
...@@ -55,12 +55,6 @@ void ForwardingAgentHost::AttachClient(DevToolsAgentHostClient* client) { ...@@ -55,12 +55,6 @@ void ForwardingAgentHost::AttachClient(DevToolsAgentHostClient* client) {
session_proxies_[client].reset(new SessionProxy(this, client)); session_proxies_[client].reset(new SessionProxy(this, client));
} }
void ForwardingAgentHost::ForceAttachClient(DevToolsAgentHostClient* client) {
while (!session_proxies_.empty())
session_proxies_.begin()->second->ConnectionClosed();
AttachClient(client);
}
bool ForwardingAgentHost::DetachClient(DevToolsAgentHostClient* client) { bool ForwardingAgentHost::DetachClient(DevToolsAgentHostClient* client) {
auto it = session_proxies_.find(client); auto it = session_proxies_.find(client);
if (it == session_proxies_.end()) if (it == session_proxies_.end())
......
...@@ -28,7 +28,6 @@ class ForwardingAgentHost : public DevToolsAgentHostImpl { ...@@ -28,7 +28,6 @@ class ForwardingAgentHost : public DevToolsAgentHostImpl {
// DevToolsAgentHost implementation // DevToolsAgentHost implementation
void AttachClient(DevToolsAgentHostClient* client) override; void AttachClient(DevToolsAgentHostClient* client) override;
void ForceAttachClient(DevToolsAgentHostClient* client) override;
bool DetachClient(DevToolsAgentHostClient* client) override; bool DetachClient(DevToolsAgentHostClient* client) override;
bool DispatchProtocolMessage(DevToolsAgentHostClient* client, bool DispatchProtocolMessage(DevToolsAgentHostClient* client,
const std::string& message) override; const std::string& message) override;
......
...@@ -121,10 +121,6 @@ class CONTENT_EXPORT DevToolsAgentHost ...@@ -121,10 +121,6 @@ class CONTENT_EXPORT DevToolsAgentHost
// Returns |true| on success. // Returns |true| on success.
virtual bool AttachRestrictedClient(DevToolsAgentHostClient* client) = 0; virtual bool AttachRestrictedClient(DevToolsAgentHostClient* client) = 0;
// Attaches |client| to this agent host to start debugging. Disconnects
// any existing clients.
virtual void ForceAttachClient(DevToolsAgentHostClient* client) = 0;
// Already attached client detaches from this agent host to stop debugging it. // Already attached client detaches from this agent host to stop debugging it.
// Returns true iff detach succeeded. // Returns true iff detach succeeded.
virtual bool DetachClient(DevToolsAgentHostClient* client) = 0; virtual bool DetachClient(DevToolsAgentHostClient* client) = 0;
......
...@@ -260,16 +260,9 @@ HeadlessDevToolsTarget* HeadlessBrowserImpl::GetDevToolsTarget() { ...@@ -260,16 +260,9 @@ HeadlessDevToolsTarget* HeadlessBrowserImpl::GetDevToolsTarget() {
return agent_host_ ? this : nullptr; return agent_host_ ? this : nullptr;
} }
bool HeadlessBrowserImpl::AttachClient(HeadlessDevToolsClient* client) { void HeadlessBrowserImpl::AttachClient(HeadlessDevToolsClient* client) {
DCHECK(agent_host_); DCHECK(agent_host_);
return HeadlessDevToolsClientImpl::From(client)->AttachToHost( HeadlessDevToolsClientImpl::From(client)->AttachToHost(agent_host_.get());
agent_host_.get());
}
void HeadlessBrowserImpl::ForceAttachClient(HeadlessDevToolsClient* client) {
DCHECK(agent_host_);
HeadlessDevToolsClientImpl::From(client)->ForceAttachToHost(
agent_host_.get());
} }
void HeadlessBrowserImpl::DetachClient(HeadlessDevToolsClient* client) { void HeadlessBrowserImpl::DetachClient(HeadlessDevToolsClient* client) {
......
...@@ -63,8 +63,7 @@ class HEADLESS_EXPORT HeadlessBrowserImpl : public HeadlessBrowser, ...@@ -63,8 +63,7 @@ class HEADLESS_EXPORT HeadlessBrowserImpl : public HeadlessBrowser,
HeadlessDevToolsTarget* GetDevToolsTarget() override; HeadlessDevToolsTarget* GetDevToolsTarget() override;
// HeadlessDevToolsTarget implementation: // HeadlessDevToolsTarget implementation:
bool AttachClient(HeadlessDevToolsClient* client) override; void AttachClient(HeadlessDevToolsClient* client) override;
void ForceAttachClient(HeadlessDevToolsClient* client) override;
void DetachClient(HeadlessDevToolsClient* client) override; void DetachClient(HeadlessDevToolsClient* client) override;
bool IsAttached() override; bool IsAttached() override;
......
...@@ -74,21 +74,11 @@ HeadlessDevToolsClientImpl::HeadlessDevToolsClientImpl() ...@@ -74,21 +74,11 @@ HeadlessDevToolsClientImpl::HeadlessDevToolsClientImpl()
HeadlessDevToolsClientImpl::~HeadlessDevToolsClientImpl() = default; HeadlessDevToolsClientImpl::~HeadlessDevToolsClientImpl() = default;
bool HeadlessDevToolsClientImpl::AttachToHost( void HeadlessDevToolsClientImpl::AttachToHost(
content::DevToolsAgentHost* agent_host) { content::DevToolsAgentHost* agent_host) {
DCHECK(!agent_host_); DCHECK(!agent_host_);
if (agent_host->IsAttached())
return false;
agent_host->AttachClient(this); agent_host->AttachClient(this);
agent_host_ = agent_host; agent_host_ = agent_host;
return true;
}
void HeadlessDevToolsClientImpl::ForceAttachToHost(
content::DevToolsAgentHost* agent_host) {
DCHECK(!agent_host_);
agent_host_ = agent_host;
agent_host_->ForceAttachClient(this);
} }
void HeadlessDevToolsClientImpl::DetachFromHost( void HeadlessDevToolsClientImpl::DetachFromHost(
......
...@@ -514,15 +514,8 @@ HeadlessDevToolsTarget* HeadlessWebContentsImpl::GetDevToolsTarget() { ...@@ -514,15 +514,8 @@ HeadlessDevToolsTarget* HeadlessWebContentsImpl::GetDevToolsTarget() {
return web_contents()->GetMainFrame()->IsRenderFrameLive() ? this : nullptr; return web_contents()->GetMainFrame()->IsRenderFrameLive() ? this : nullptr;
} }
bool HeadlessWebContentsImpl::AttachClient(HeadlessDevToolsClient* client) { void HeadlessWebContentsImpl::AttachClient(HeadlessDevToolsClient* client) {
return HeadlessDevToolsClientImpl::From(client)->AttachToHost( HeadlessDevToolsClientImpl::From(client)->AttachToHost(agent_host_.get());
agent_host_.get());
}
void HeadlessWebContentsImpl::ForceAttachClient(
HeadlessDevToolsClient* client) {
HeadlessDevToolsClientImpl::From(client)->ForceAttachToHost(
agent_host_.get());
} }
void HeadlessWebContentsImpl::DetachClient(HeadlessDevToolsClient* client) { void HeadlessWebContentsImpl::DetachClient(HeadlessDevToolsClient* client) {
......
...@@ -71,8 +71,7 @@ class HEADLESS_EXPORT HeadlessWebContentsImpl ...@@ -71,8 +71,7 @@ class HEADLESS_EXPORT HeadlessWebContentsImpl
std::string GetMainFrameDevToolsId() const override; std::string GetMainFrameDevToolsId() const override;
// HeadlessDevToolsTarget implementation: // HeadlessDevToolsTarget implementation:
bool AttachClient(HeadlessDevToolsClient* client) override; void AttachClient(HeadlessDevToolsClient* client) override;
void ForceAttachClient(HeadlessDevToolsClient* client) override;
void DetachClient(HeadlessDevToolsClient* client) override; void DetachClient(HeadlessDevToolsClient* client) override;
bool IsAttached() override; bool IsAttached() override;
......
...@@ -945,13 +945,11 @@ class HeadlessDevToolsClientAttachTest ...@@ -945,13 +945,11 @@ class HeadlessDevToolsClientAttachTest
HeadlessDevToolsTarget* devtools_target = HeadlessDevToolsTarget* devtools_target =
web_contents_->GetDevToolsTarget(); web_contents_->GetDevToolsTarget();
// Try attaching: there's already a client attached.
EXPECT_FALSE(devtools_target->AttachClient(other_devtools_client_.get()));
EXPECT_TRUE(devtools_target->IsAttached()); EXPECT_TRUE(devtools_target->IsAttached());
// Detach the existing client, attach the other client. // Detach the existing client, attach the other client.
devtools_target->DetachClient(devtools_client_.get()); devtools_target->DetachClient(devtools_client_.get());
EXPECT_FALSE(devtools_target->IsAttached()); EXPECT_FALSE(devtools_target->IsAttached());
EXPECT_TRUE(devtools_target->AttachClient(other_devtools_client_.get())); devtools_target->AttachClient(other_devtools_client_.get());
EXPECT_TRUE(devtools_target->IsAttached()); EXPECT_TRUE(devtools_target->IsAttached());
// Now, let's make sure this devtools client works. // Now, let's make sure this devtools client works.
...@@ -968,9 +966,10 @@ class HeadlessDevToolsClientAttachTest ...@@ -968,9 +966,10 @@ class HeadlessDevToolsClientAttachTest
HeadlessDevToolsTarget* devtools_target = HeadlessDevToolsTarget* devtools_target =
web_contents_->GetDevToolsTarget(); web_contents_->GetDevToolsTarget();
// Try attach, then force-attach the original client. EXPECT_TRUE(devtools_target->IsAttached());
EXPECT_FALSE(devtools_target->AttachClient(devtools_client_.get())); devtools_target->DetachClient(other_devtools_client_.get());
devtools_target->ForceAttachClient(devtools_client_.get()); EXPECT_FALSE(devtools_target->IsAttached());
devtools_target->AttachClient(devtools_client_.get());
EXPECT_TRUE(devtools_target->IsAttached()); EXPECT_TRUE(devtools_target->IsAttached());
devtools_client_->GetRuntime()->Evaluate( devtools_client_->GetRuntime()->Evaluate(
......
...@@ -20,16 +20,9 @@ class HEADLESS_EXPORT HeadlessDevToolsTarget { ...@@ -20,16 +20,9 @@ class HEADLESS_EXPORT HeadlessDevToolsTarget {
// Attach or detach a client to this target. A client must be attached in // Attach or detach a client to this target. A client must be attached in
// order to send commands or receive notifications from the target. // order to send commands or receive notifications from the target.
// //
// A single client may be attached to at most one target at a time. If // A single client may be attached to at most one target at a time.
// the target already has a client attached, AttachClient will return false.
// ForceAttachClient will detach any existing connection before attaching
// |client|.
// Note that currently also only one client may be attached to a single target
// at a time.
//
// |client| must outlive this target. // |client| must outlive this target.
virtual bool AttachClient(HeadlessDevToolsClient* client) = 0; virtual void AttachClient(HeadlessDevToolsClient* client) = 0;
virtual void ForceAttachClient(HeadlessDevToolsClient* client) = 0;
virtual void DetachClient(HeadlessDevToolsClient* client) = 0; virtual void DetachClient(HeadlessDevToolsClient* client) = 0;
// Returns true if a devtools client is attached. // Returns true if a devtools client is attached.
......
...@@ -124,8 +124,7 @@ class HEADLESS_EXPORT HeadlessDevToolsClientImpl ...@@ -124,8 +124,7 @@ class HEADLESS_EXPORT HeadlessDevToolsClientImpl
const char* method, const char* method,
base::RepeatingCallback<void(const base::Value&)> callback) override; base::RepeatingCallback<void(const base::Value&)> callback) override;
bool AttachToHost(content::DevToolsAgentHost* agent_host); void AttachToHost(content::DevToolsAgentHost* agent_host);
void ForceAttachToHost(content::DevToolsAgentHost* agent_host);
void DetachFromHost(content::DevToolsAgentHost* agent_host); void DetachFromHost(content::DevToolsAgentHost* agent_host);
void SetTaskRunnerForTests( void SetTaskRunnerForTests(
......
...@@ -53,7 +53,6 @@ class CompositorControllerTest : public ::testing::Test { ...@@ -53,7 +53,6 @@ class CompositorControllerTest : public ::testing::Test {
client_.SetTaskRunnerForTests(task_runner_); client_.SetTaskRunnerForTests(task_runner_);
mock_host_ = base::MakeRefCounted<MockDevToolsAgentHost>(); mock_host_ = base::MakeRefCounted<MockDevToolsAgentHost>();
EXPECT_CALL(*mock_host_, IsAttached()).WillOnce(Return(false));
EXPECT_CALL(*mock_host_, AttachClient(&client_)); EXPECT_CALL(*mock_host_, AttachClient(&client_));
client_.AttachToHost(mock_host_.get()); client_.AttachToHost(mock_host_.get());
virtual_time_controller_ = virtual_time_controller_ =
......
...@@ -19,8 +19,6 @@ class MockDevToolsAgentHost : public content::DevToolsAgentHost { ...@@ -19,8 +19,6 @@ class MockDevToolsAgentHost : public content::DevToolsAgentHost {
MOCK_METHOD1(AttachClient, void(content::DevToolsAgentHostClient* client)); MOCK_METHOD1(AttachClient, void(content::DevToolsAgentHostClient* client));
MOCK_METHOD1(AttachRestrictedClient, MOCK_METHOD1(AttachRestrictedClient,
bool(content::DevToolsAgentHostClient* client)); bool(content::DevToolsAgentHostClient* client));
MOCK_METHOD1(ForceAttachClient,
void(content::DevToolsAgentHostClient* client));
MOCK_METHOD1(DetachClient, bool(content::DevToolsAgentHostClient* client)); MOCK_METHOD1(DetachClient, bool(content::DevToolsAgentHostClient* client));
MOCK_METHOD2(DispatchProtocolMessage, MOCK_METHOD2(DispatchProtocolMessage,
bool(content::DevToolsAgentHostClient* client, bool(content::DevToolsAgentHostClient* client,
......
...@@ -30,7 +30,6 @@ class VirtualTimeControllerTest : public ::testing::Test { ...@@ -30,7 +30,6 @@ class VirtualTimeControllerTest : public ::testing::Test {
client_.SetTaskRunnerForTests(task_runner_); client_.SetTaskRunnerForTests(task_runner_);
mock_host_ = base::MakeRefCounted<MockDevToolsAgentHost>(); mock_host_ = base::MakeRefCounted<MockDevToolsAgentHost>();
EXPECT_CALL(*mock_host_, IsAttached()).WillOnce(Return(false));
EXPECT_CALL(*mock_host_, AttachClient(&client_)); EXPECT_CALL(*mock_host_, AttachClient(&client_));
client_.AttachToHost(mock_host_.get()); client_.AttachToHost(mock_host_.get());
controller_ = std::make_unique<VirtualTimeController>(&client_, 0); controller_ = std::make_unique<VirtualTimeController>(&client_, 0);
......
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