Index: headless/lib/headless_browser_browsertest.cc |
diff --git a/headless/lib/headless_browser_browsertest.cc b/headless/lib/headless_browser_browsertest.cc |
index 8b6e20c70a493b3d92a3dc25531eeb2e0a1c677d..cbb28c4e793ed1bdfb3c660936db8d271b2dd767 100644 |
--- a/headless/lib/headless_browser_browsertest.cc |
+++ b/headless/lib/headless_browser_browsertest.cc |
@@ -21,6 +21,7 @@ |
#include "headless/public/devtools/domains/inspector.h" |
#include "headless/public/devtools/domains/network.h" |
#include "headless/public/devtools/domains/page.h" |
+#include "headless/public/devtools/domains/tracing.h" |
#include "headless/public/headless_browser.h" |
#include "headless/public/headless_devtools_client.h" |
#include "headless/public/headless_devtools_target.h" |
@@ -789,4 +790,76 @@ IN_PROC_BROWSER_TEST_F(HeadlessBrowserTest, PermissionManagerAlwaysASK) { |
content::PermissionType::NOTIFICATIONS, url, url)); |
} |
+namespace { |
+ |
+class TraceHelper : public headless::tracing::ExperimentalObserver { |
+ public: |
+ TraceHelper(HeadlessBrowserTest* browser_test, HeadlessDevToolsTarget* target) |
+ : browser_test_(browser_test), |
+ target_(target), |
+ client_(HeadlessDevToolsClient::Create()), |
+ tracing_data_(base::MakeUnique<base::ListValue>()) { |
+ EXPECT_FALSE(target_->IsAttached()); |
+ target_->AttachClient(client_.get()); |
+ EXPECT_TRUE(target_->IsAttached()); |
+ |
+ client_->GetTracing()->GetExperimental()->AddObserver(this); |
+ |
+ client_->GetTracing()->GetExperimental()->Start( |
+ tracing::StartParams::Builder().Build(), |
+ base::Bind(&TraceHelper::OnTracingStarted, base::Unretained(this))); |
+ } |
+ |
+ ~TraceHelper() override { |
+ target_->DetachClient(client_.get()); |
+ EXPECT_FALSE(target_->IsAttached()); |
+ } |
+ |
+ std::unique_ptr<base::ListValue> TakeTracingData() { |
+ return std::move(tracing_data_); |
+ } |
+ |
+ private: |
+ void OnTracingStarted(std::unique_ptr<headless::tracing::StartResult>) { |
+ // We don't need the callback from End, but the OnTracingComplete event. |
+ client_->GetTracing()->GetExperimental()->End( |
+ headless::tracing::EndParams::Builder().Build()); |
+ } |
+ |
+ // headless::tracing::ExperimentalObserver implementation: |
+ void OnDataCollected( |
+ const headless::tracing::DataCollectedParams& params) override { |
+ for (const auto& value : *params.GetValue()) { |
+ tracing_data_->Append(value->CreateDeepCopy()); |
+ } |
+ } |
+ |
+ void OnTracingComplete( |
+ const headless::tracing::TracingCompleteParams& params) override { |
+ browser_test_->FinishAsynchronousTest(); |
+ } |
+ |
+ HeadlessBrowserTest* browser_test_; // Not owned. |
+ HeadlessDevToolsTarget* target_; // Not owned. |
+ std::unique_ptr<HeadlessDevToolsClient> client_; |
+ |
+ std::unique_ptr<base::ListValue> tracing_data_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TraceHelper); |
+}; |
+ |
+} // namespace |
+ |
+IN_PROC_BROWSER_TEST_F(HeadlessBrowserTest, TraceUsingBrowserDevToolsTarget) { |
+ HeadlessDevToolsTarget* target = browser()->GetDevToolsTarget(); |
+ EXPECT_NE(nullptr, target); |
+ |
+ TraceHelper helper(this, target); |
+ RunAsynchronousTest(); |
+ |
+ std::unique_ptr<base::ListValue> tracing_data = helper.TakeTracingData(); |
+ EXPECT_TRUE(tracing_data); |
+ EXPECT_LT(0u, tracing_data->GetSize()); |
+} |
+ |
} // namespace headless |