Commit 04985846 authored by cfredric's avatar cfredric Committed by Commit Bot

Emit UKM events for SharedWorker SourceIDs.

Bug: 1085645
Change-Id: Ie50ebdc503ae238644e7e9679942696e79763c84
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2308889Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarRobert Kaplow <rkaplow@chromium.org>
Commit-Queue: Chris Fredrickson <cfredric@google.com>
Cr-Commit-Position: refs/heads/master@{#796200}
parent bfe60e5a
...@@ -45,6 +45,7 @@ per-file chrome_service_worker_browsertest.cc=file://content/browser/service_wor ...@@ -45,6 +45,7 @@ per-file chrome_service_worker_browsertest.cc=file://content/browser/service_wor
per-file chrome_webusb_browser_client*=file://chrome/browser/usb/OWNERS per-file chrome_webusb_browser_client*=file://chrome/browser/usb/OWNERS
per-file chrome_worker_browsertest.cc=file://content/browser/worker_host/OWNERS per-file chrome_worker_browsertest.cc=file://content/browser/worker_host/OWNERS
per-file ukm_worker_browsertest.cc=file://content/browser/worker_host/OWNERS
per-file exo_parts.*=dcastagna@chromium.org per-file exo_parts.*=dcastagna@chromium.org
per-file exo_parts.*=oshima@chromium.org per-file exo_parts.*=oshima@chromium.org
......
// Copyright 2020 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 "base/bind.h"
#include "build/build_config.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/chrome_test_utils.h"
#include "components/ukm/test_ukm_recorder.h"
#include "content/public/browser/worker_type.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
#include "services/metrics/public/cpp/ukm_builders.h"
#include "testing/gtest/include/gtest/gtest.h"
#if defined(OS_ANDROID)
#include "chrome/test/base/android/android_browser_test.h"
#else
#include "chrome/test/base/in_process_browser_test.h"
#endif
namespace {
class UkmWorkerBrowserTest : public PlatformBrowserTest {
public:
void SetUpOnMainThread() override {
test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>();
}
content::WebContents* web_contents() {
return chrome_test_utils::GetActiveWebContents(this);
}
const ukm::TestAutoSetUkmRecorder& test_ukm_recorder() const {
return *test_ukm_recorder_;
}
private:
std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_ukm_recorder_;
};
} // namespace
IN_PROC_BROWSER_TEST_F(UkmWorkerBrowserTest, DocumentClientIdIsPlumbed) {
using DocumentCreatedEntry = ukm::builders::DocumentCreated;
using AddedEntry = ukm::builders::Worker_ClientAdded;
embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
[](const net::test_server::HttpRequest& request)
-> std::unique_ptr<net::test_server::HttpResponse> {
if (request.GetURL().path() != "/worker_script")
return nullptr;
auto response = std::make_unique<net::test_server::BasicHttpResponse>();
response->set_content_type("text/javascript");
response->set_content(
R"(self.onconnect = e => { e.ports[0].postMessage('DONE'); };)");
return response;
}));
ASSERT_TRUE(embedded_test_server()->Start());
content::DOMMessageQueue messages;
ASSERT_TRUE(content::NavigateToURL(
web_contents(),
embedded_test_server()->GetURL(
"/workers/create_shared_worker.html?worker_url=/worker_script")));
// Wait until the worker script is loaded and executed, to ensure the UKM is
// logged.
EXPECT_EQ("DONE", content::EvalJs(
browser()->tab_strip_model()->GetActiveWebContents(),
"waitForMessage();"));
std::vector<const ukm::mojom::UkmEntry*> doc_created_entries =
test_ukm_recorder().GetEntriesByName(DocumentCreatedEntry::kEntryName);
EXPECT_EQ(1u, doc_created_entries.size());
const ukm::SourceId document_source_id = doc_created_entries[0]->source_id;
// Check that we got the WorkerClientConnected event.
std::vector<const ukm::mojom::UkmEntry*> connected_entries =
test_ukm_recorder().GetEntriesByName(AddedEntry::kEntryName);
EXPECT_EQ(1u, connected_entries.size());
const ukm::SourceId client_source_id = *test_ukm_recorder().GetEntryMetric(
connected_entries[0], AddedEntry::kClientSourceIdName);
const ukm::SourceId worker_source_id = connected_entries[0]->source_id;
const int64_t worker_type = *test_ukm_recorder().GetEntryMetric(
connected_entries[0], AddedEntry::kWorkerTypeName);
// Check that we have two source IDs in play (namely that of the
// client/document, and the SharedWorker) and that they are different.
EXPECT_EQ(document_source_id, client_source_id);
EXPECT_NE(worker_source_id, client_source_id);
EXPECT_EQ(static_cast<int64_t>(WorkerType::kSharedWorker), worker_type);
}
...@@ -1418,6 +1418,7 @@ if (!is_android) { ...@@ -1418,6 +1418,7 @@ if (!is_android) {
"../browser/ui/webui/webui_load_timer_browsertest.cc", "../browser/ui/webui/webui_load_timer_browsertest.cc",
"../browser/ui/webui/webui_webview_browsertest.cc", "../browser/ui/webui/webui_webview_browsertest.cc",
"../browser/ui/zoom/zoom_controller_browsertest.cc", "../browser/ui/zoom/zoom_controller_browsertest.cc",
"../browser/ukm_worker_browsertest.cc",
"../browser/unload_browsertest.cc", "../browser/unload_browsertest.cc",
"../browser/usb/usb_browsertest.cc", "../browser/usb/usb_browsertest.cc",
"../browser/wake_lock/wake_lock_browsertest.cc", "../browser/wake_lock/wake_lock_browsertest.cc",
......
...@@ -27,10 +27,13 @@ ...@@ -27,10 +27,13 @@
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h" #include "content/public/browser/content_browser_client.h"
#include "content/public/browser/service_worker_context.h" #include "content/public/browser/service_worker_context.h"
#include "content/public/browser/worker_type.h"
#include "content/public/common/content_client.h" #include "content/public/common/content_client.h"
#include "mojo/public/cpp/bindings/pending_associated_remote.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h"
#include "net/base/isolation_info.h" #include "net/base/isolation_info.h"
#include "net/cookies/site_for_cookies.h" #include "net/cookies/site_for_cookies.h"
#include "services/metrics/public/cpp/delegating_ukm_recorder.h"
#include "services/metrics/public/cpp/ukm_builders.h"
#include "third_party/blink/public/common/loader/url_loader_factory_bundle.h" #include "third_party/blink/public/common/loader/url_loader_factory_bundle.h"
#include "third_party/blink/public/common/messaging/message_port_channel.h" #include "third_party/blink/public/common/messaging/message_port_channel.h"
#include "third_party/blink/public/mojom/appcache/appcache.mojom.h" #include "third_party/blink/public/mojom/appcache/appcache.mojom.h"
...@@ -124,9 +127,6 @@ SharedWorkerHost::SharedWorkerHost(SharedWorkerServiceImpl* service, ...@@ -124,9 +127,6 @@ SharedWorkerHost::SharedWorkerHost(SharedWorkerServiceImpl* service,
service_->NotifyWorkerCreated(token_, worker_process_host_->GetID(), service_->NotifyWorkerCreated(token_, worker_process_host_->GetID(),
devtools_handle_->dev_tools_token()); devtools_handle_->dev_tools_token());
// TODO(crbug.com/1085645): Emit UKM event notifying of the creation of the
// |ukm_source_id_| source.
} }
SharedWorkerHost::~SharedWorkerHost() { SharedWorkerHost::~SharedWorkerHost() {
...@@ -469,8 +469,13 @@ void SharedWorkerHost::AddClient( ...@@ -469,8 +469,13 @@ void SharedWorkerHost::AddClient(
info.client.set_disconnect_handler(base::BindOnce( info.client.set_disconnect_handler(base::BindOnce(
&SharedWorkerHost::OnClientConnectionLost, weak_factory_.GetWeakPtr())); &SharedWorkerHost::OnClientConnectionLost, weak_factory_.GetWeakPtr()));
// TODO(crbug.com/1085645): Emit UKM event linking |client_ukm_source_id| and ukm::DelegatingUkmRecorder* ukm_recorder = ukm::DelegatingUkmRecorder::Get();
// |ukm_source_id_|. if (ukm_recorder) {
ukm::builders::Worker_ClientAdded(ukm_source_id_)
.SetClientSourceId(client_ukm_source_id)
.SetWorkerType(static_cast<int64_t>(WorkerType::kSharedWorker))
.Record(ukm_recorder);
}
worker_->Connect(info.connection_request_id, port.ReleaseHandle()); worker_->Connect(info.connection_request_id, port.ReleaseHandle());
......
...@@ -402,6 +402,7 @@ source_set("browser_sources") { ...@@ -402,6 +402,7 @@ source_set("browser_sources") {
"webrtc_log.cc", "webrtc_log.cc",
"webrtc_log.h", "webrtc_log.h",
"websocket_handshake_request_info.h", "websocket_handshake_request_info.h",
"worker_type.h",
] ]
configs += [ configs += [
"//build/config:precompiled_headers", "//build/config:precompiled_headers",
......
// Copyright 2020 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_PUBLIC_BROWSER_WORKER_TYPE_H_
#define CONTENT_PUBLIC_BROWSER_WORKER_TYPE_H_
// Should correspond to "WorkerType" in enums.xml.
enum class WorkerType {
kSharedWorker = 0,
kServiceWorker = 1,
kMaxValue = kServiceWorker,
};
#endif // CONTENT_PUBLIC_BROWSER_WORKER_TYPE_H_
...@@ -76419,6 +76419,11 @@ Called by update_scheduler_enums.py.--> ...@@ -76419,6 +76419,11 @@ Called by update_scheduler_enums.py.-->
<int value="3" label="cross-origin (others)"/> <int value="3" label="cross-origin (others)"/>
</enum> </enum>
<enum name="WorkerType">
<int value="0" label="SharedWorker"/>
<int value="1" label="ServiceWorker"/>
</enum>
<enum name="WrenchMenuAction"> <enum name="WrenchMenuAction">
<int value="0" label="New tab"/> <int value="0" label="New tab"/>
<int value="1" label="New window"/> <int value="1" label="New window"/>
...@@ -13248,6 +13248,25 @@ be describing additional metrics about the same event. ...@@ -13248,6 +13248,25 @@ be describing additional metrics about the same event.
</metric> </metric>
</event> </event>
<event name="Worker.ClientAdded">
<owner>cfredric@google.com</owner>
<summary>
Recorded when a client connects to an existing SharedWorker; records the
source IDs of the client (which may be a document or another worker), and
the type of the worker being connected to.
</summary>
<metric name="ClientSourceId">
<summary>
The UKM source ID of the connecting client, as an integer.
</summary>
</metric>
<metric name="WorkerType" enum="WorkerType">
<summary>
The type of the worker that was connected to.
</summary>
</metric>
</event>
<event name="XR.PageSession" singular="True"> <event name="XR.PageSession" singular="True">
<obsolete> <obsolete>
Removed 2/2020 Removed 2/2020
......
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