Commit 52531c3d authored by Yao Xiao's avatar Yao Xiao Committed by Commit Bot

Log JS dialog dismissal cause to UKM

Bug: 864194
Change-Id: I84311118bdfc6921875741fa6ba31ba38bcf1fb6
Reviewed-on: https://chromium-review.googlesource.com/1185217Reviewed-by: default avatarRobert Kaplow (slow) <rkaplow@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Commit-Queue: Yao Xiao <yaoxia@chromium.org>
Cr-Commit-Position: refs/heads/master@{#586377}
parent 42c5126c
...@@ -13,10 +13,16 @@ ...@@ -13,10 +13,16 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_switches.h"
#include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/ukm/content/source_url_recorder.h"
#include "components/ukm/test_ukm_recorder.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h" #include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_utils.h" #include "content/public/test/test_utils.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "services/metrics/public/cpp/ukm_builders.h"
#include "services/metrics/public/cpp/ukm_source.h"
using DismissalCause = JavaScriptDialogTabHelper::DismissalCause; using DismissalCause = JavaScriptDialogTabHelper::DismissalCause;
...@@ -349,3 +355,24 @@ IN_PROC_BROWSER_TEST_F(JavaScriptDialogTest, NoDismissalAlertTabHidden) { ...@@ -349,3 +355,24 @@ IN_PROC_BROWSER_TEST_F(JavaScriptDialogTest, NoDismissalAlertTabHidden) {
chrome::NewTab(browser()); chrome::NewTab(browser());
histogram_tester.ExpectTotalCount("JSDialogs.DismissalCause.Alert", 0); histogram_tester.ExpectTotalCount("JSDialogs.DismissalCause.Alert", 0);
} }
IN_PROC_BROWSER_TEST_F(JavaScriptDialogTest, DismissalCauseUkm) {
ukm::TestAutoSetUkmRecorder ukm_recorder;
EXPECT_TRUE(embedded_test_server()->Start());
GURL url = embedded_test_server()->GetURL("/title1.html");
ui_test_utils::NavigateToURL(browser(), url);
JavaScriptDialogDismissalCauseTester tester(this);
tester.PopupDialog(content::JAVASCRIPT_DIALOG_TYPE_CONFIRM);
tester.ClickDialogButton(true, base::string16());
auto entries = ukm_recorder.GetEntriesByName(
ukm::builders::AbusiveExperienceHeuristic_JavaScriptDialog::kEntryName);
EXPECT_EQ(1u, entries.size());
ukm_recorder.ExpectEntrySourceHasUrl(entries.front(), url);
ukm_recorder.ExpectEntryMetric(
entries.front(),
ukm::builders::AbusiveExperienceHeuristic_JavaScriptDialog::
kDismissalCauseName,
static_cast<int64_t>(DismissalCause::kDialogButtonClicked));
}
...@@ -18,9 +18,12 @@ ...@@ -18,9 +18,12 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "components/app_modal/javascript_dialog_manager.h" #include "components/app_modal/javascript_dialog_manager.h"
#include "components/navigation_metrics/navigation_metrics.h" #include "components/navigation_metrics/navigation_metrics.h"
#include "components/ukm/content/source_url_recorder.h"
#include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_agent_host.h"
#include "content/public/browser/navigation_handle.h" #include "content/public/browser/navigation_handle.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "services/metrics/public/cpp/ukm_builders.h"
#include "services/metrics/public/cpp/ukm_recorder.h"
#include "ui/gfx/text_elider.h" #include "ui/gfx/text_elider.h"
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
...@@ -476,7 +479,7 @@ void JavaScriptDialogTabHelper::TabDetachedAt(content::WebContents* contents, ...@@ -476,7 +479,7 @@ void JavaScriptDialogTabHelper::TabDetachedAt(content::WebContents* contents,
#endif #endif
void JavaScriptDialogTabHelper::LogDialogDismissalCause(DismissalCause cause) { void JavaScriptDialogTabHelper::LogDialogDismissalCause(DismissalCause cause) {
// Log to UMA // Log to UMA.
switch (dialog_type_) { switch (dialog_type_) {
case content::JAVASCRIPT_DIALOG_TYPE_ALERT: case content::JAVASCRIPT_DIALOG_TYPE_ALERT:
UMA_HISTOGRAM_ENUMERATION("JSDialogs.DismissalCause.Alert", cause); UMA_HISTOGRAM_ENUMERATION("JSDialogs.DismissalCause.Alert", cause);
...@@ -488,6 +491,20 @@ void JavaScriptDialogTabHelper::LogDialogDismissalCause(DismissalCause cause) { ...@@ -488,6 +491,20 @@ void JavaScriptDialogTabHelper::LogDialogDismissalCause(DismissalCause cause) {
UMA_HISTOGRAM_ENUMERATION("JSDialogs.DismissalCause.Prompt", cause); UMA_HISTOGRAM_ENUMERATION("JSDialogs.DismissalCause.Prompt", cause);
break; break;
} }
// Log to UKM.
//
// Note that this will return the outermost WebContents, not necessarily the
// WebContents that had the alert call in it. For 99.9999% of cases they're
// the same, but for instances like the <webview> tag in extensions and PDF
// files that alert they may differ.
ukm::SourceId source_id = ukm::GetSourceIdForWebContentsDocument(
WebContentsObserver::web_contents());
if (source_id != ukm::kInvalidSourceId) {
ukm::builders::AbusiveExperienceHeuristic_JavaScriptDialog(source_id)
.SetDismissalCause(static_cast<int64_t>(cause))
.Record(ukm::UkmRecorder::Get());
}
} }
void JavaScriptDialogTabHelper::HandleTabSwitchAway(DismissalCause cause) { void JavaScriptDialogTabHelper::HandleTabSwitchAway(DismissalCause cause) {
......
...@@ -42,6 +42,18 @@ be describing additional metrics about the same event. ...@@ -42,6 +42,18 @@ be describing additional metrics about the same event.
</metric> </metric>
</event> </event>
<event name="AbusiveExperienceHeuristic.JavaScriptDialog">
<owner>yaoxia@chromium.org</owner>
<metric name="DismissalCause">
<summary>
An enum that specifies the dismissal reason for JavaScript popup dialog
that can be triggered by window.alert(), window.confirm() or
window.prompt(). See JavaScriptDialogTabHelper::DismissalCause for the
enum elements.
</summary>
</metric>
</event>
<event name="Autofill.CardUploadDecision"> <event name="Autofill.CardUploadDecision">
<owner>sebsg@chromium.org</owner> <owner>sebsg@chromium.org</owner>
<metric name="UploadDecision"> <metric name="UploadDecision">
......
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