Index: headless/lib/headless_devtools_client_browsertest.cc |
diff --git a/headless/lib/headless_devtools_client_browsertest.cc b/headless/lib/headless_devtools_client_browsertest.cc |
index cce4c045a9e5cbe33ba0a82be1f0231ce212a7ac..521c8b19253bb0565f3fe4cce1a2224a60d08e83 100644 |
--- a/headless/lib/headless_devtools_client_browsertest.cc |
+++ b/headless/lib/headless_devtools_client_browsertest.cc |
@@ -687,4 +687,63 @@ class HeadlessCrashObserverTest : public HeadlessAsyncDevTooledBrowserTest, |
HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessCrashObserverTest); |
+class HeadlessDevToolsClientAttachTest |
+ : public HeadlessAsyncDevTooledBrowserTest { |
+ public: |
+ void RunDevTooledTest() override { |
+ other_devtools_client_ = HeadlessDevToolsClient::Create(); |
+ HeadlessDevToolsTarget* devtools_target = |
+ 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()); |
+ // Detach the existing client, attach the other client. |
+ devtools_target->DetachClient(devtools_client_.get()); |
+ EXPECT_FALSE(devtools_target->IsAttached()); |
+ EXPECT_TRUE(devtools_target->AttachClient(other_devtools_client_.get())); |
+ EXPECT_TRUE(devtools_target->IsAttached()); |
+ |
+ // Now, let's make sure this devtools client works. |
+ other_devtools_client_->GetRuntime()->Evaluate( |
+ "24 * 7", base::Bind(&HeadlessDevToolsClientAttachTest::OnFirstResult, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnFirstResult(std::unique_ptr<runtime::EvaluateResult> result) { |
+ int value; |
+ EXPECT_TRUE(result->GetResult()->HasValue()); |
+ EXPECT_TRUE(result->GetResult()->GetValue()->GetAsInteger(&value)); |
+ EXPECT_EQ(24 * 7, value); |
+ |
+ HeadlessDevToolsTarget* devtools_target = |
+ web_contents_->GetDevToolsTarget(); |
+ |
+ // Try attach, then force-attach the original client. |
+ EXPECT_FALSE(devtools_target->AttachClient(devtools_client_.get())); |
+ devtools_target->ForceAttachClient(devtools_client_.get()); |
+ EXPECT_TRUE(devtools_target->IsAttached()); |
+ |
+ devtools_client_->GetRuntime()->Evaluate( |
+ "27 * 4", base::Bind(&HeadlessDevToolsClientAttachTest::OnSecondResult, |
+ base::Unretained(this))); |
+ } |
+ |
+ void OnSecondResult(std::unique_ptr<runtime::EvaluateResult> result) { |
+ int value; |
+ EXPECT_TRUE(result->GetResult()->HasValue()); |
+ EXPECT_TRUE(result->GetResult()->GetValue()->GetAsInteger(&value)); |
+ EXPECT_EQ(27 * 4, value); |
+ |
+ // If everything worked, this call will not crash, since it |
+ // detaches devtools_client_. |
+ FinishAsynchronousTest(); |
+ } |
+ |
+ protected: |
+ std::unique_ptr<HeadlessDevToolsClient> other_devtools_client_; |
+}; |
+ |
+HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessDevToolsClientAttachTest); |
+ |
} // namespace headless |