summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorapacible <apacible@chromium.org>2016-01-11 18:39:04 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-12 02:40:20 +0000
commit9c1122c7163411be938195ba546460ba54d33b00 (patch)
treeda86c7f14c3704c7dfcaab895aa9ea9af269091e
parent3d24f096b250b2364f75e6247e8a6d8ac7ec811b (diff)
downloadchromium_src-9c1122c7163411be938195ba546460ba54d33b00.zip
chromium_src-9c1122c7163411be938195ba546460ba54d33b00.tar.gz
chromium_src-9c1122c7163411be938195ba546460ba54d33b00.tar.bz2
Add P2 UMA metrics for Media Router device click latency.
This change adds the following metric: - The time it takes for the user to select a device after viewing a populated device list. BUG=547977 Review URL: https://codereview.chromium.org/1555353002 Cr-Commit-Position: refs/heads/master@{#368775}
-rw-r--r--chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js42
-rw-r--r--chrome/browser/resources/media_router/media_router.js14
-rw-r--r--chrome/browser/resources/media_router/media_router_ui_interface.js11
-rw-r--r--chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc17
-rw-r--r--chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h1
-rw-r--r--tools/metrics/histograms/histograms.xml9
6 files changed, 94 insertions, 0 deletions
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
index 66ee578..c69d71e 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
@@ -162,6 +162,17 @@ Polymer({
},
/**
+ * The time the sink list was shown and populated with at least one sink.
+ * This is reset whenever the user switches views or there are no sinks
+ * available for display.
+ * @private {number}
+ */
+ populatedSinkListSeenTimeMs_: {
+ type: Number,
+ value: -1,
+ },
+
+ /**
* The list of current routes.
* @type {!Array<!media_router.Route>}
*/
@@ -271,6 +282,10 @@ Polymer({
'mouseenter': 'onMouseEnter_',
},
+ observers: [
+ 'maybeUpdateStartSinkDisplayStartTime_(currentView_, sinksToShow_)',
+ ],
+
ready: function() {
this.showSinkList_();
},
@@ -658,6 +673,29 @@ Polymer({
},
/**
+ * May update |populatedSinkListSeenTimeMs_| depending on |currentView| and
+ * |sinksToShow|.
+ * Called when |currentView_| or |sinksToShow_| is updated.
+ *
+ * @param {?media_router.MediaRouterView} currentView The current view of the
+ * dialog.
+ * @param {!Array<!media_router.Sink>} sinksToShow The sinks to display.
+ * @private
+ */
+ maybeUpdateStartSinkDisplayStartTime_: function(currentView, sinksToShow) {
+ if (currentView == media_router.MediaRouterView.SINK_LIST &&
+ sinksToShow.length != 0) {
+ // Only set |populatedSinkListSeenTimeMs_| if it has not already been set.
+ if (this.populatedSinkListSeenTimeMs_ == -1)
+ this.populatedSinkListSeenTimeMs_ = performance.now();
+ } else {
+ // Reset |populatedSinkListLastSeen_| if the sink list isn't being shown
+ // or if there aren't any sinks available for display.
+ this.populatedSinkListSeenTimeMs_ = -1;
+ }
+ },
+
+ /**
* Handles a cast mode selection. Updates |headerText|, |headerTextTooltip|,
* and |shownCastModeValue_|.
*
@@ -892,6 +930,10 @@ Polymer({
sink.castModes & -sink.castModes : this.shownCastModeValue_
});
this.currentLaunchingSinkId_ = sink.id;
+
+ var timeToSelectSink =
+ performance.now() - this.populatedSinkListSeenTimeMs_;
+ this.fire('report-sink-click-time', {timeMs: timeToSelectSink});
}
},
diff --git a/chrome/browser/resources/media_router/media_router.js b/chrome/browser/resources/media_router/media_router.js
index 9d7ca18..2f497b9 100644
--- a/chrome/browser/resources/media_router/media_router.js
+++ b/chrome/browser/resources/media_router/media_router.js
@@ -36,6 +36,8 @@ cr.define('media_router', function() {
onNavigateToDetails);
container.addEventListener('navigate-to-cast-mode-list',
onNavigateToCastMode);
+ container.addEventListener('report-sink-click-time',
+ onSinkClickTimeReported);
container.addEventListener('report-sink-count', onSinkCountReported);
container.addEventListener('show-initial-state', onShowInitialState);
container.addEventListener('sink-click', onSinkClick);
@@ -193,6 +195,18 @@ cr.define('media_router', function() {
}
/**
+ * Reports the time it took for the user to select a sink to create a route
+ * after the list was popuated and shown.
+ *
+ * @param {{detail: {timeMs: number}}} data
+ * Paramters in |data|.detail:
+ * timeMs - the time it took for the user to select a sink.
+ */
+ function onSinkClickTimeReported(data) {
+ media_router.browserApi.reportTimeToClickSink(data.detail.timeMs);
+ }
+
+ /**
* Reports the current sink count.
* Called 3 seconds after the dialog is initially opened.
*
diff --git a/chrome/browser/resources/media_router/media_router_ui_interface.js b/chrome/browser/resources/media_router/media_router_ui_interface.js
index 4639335..c160475 100644
--- a/chrome/browser/resources/media_router/media_router_ui_interface.js
+++ b/chrome/browser/resources/media_router/media_router_ui_interface.js
@@ -212,6 +212,16 @@ cr.define('media_router.browserApi', function() {
}
/**
+ * Reports the time it took for the user to select a sink after the sink list
+ * is populated and shown.
+ *
+ * @param {number} timeMs
+ */
+ function reportTimeToClickSink(timeMs) {
+ chrome.send('reportTimeToClickSink', [timeMs]);
+ }
+
+ /**
* Requests data to initialize the WebUI with.
* The data will be returned via media_router.ui.setInitialData.
*/
@@ -243,6 +253,7 @@ cr.define('media_router.browserApi', function() {
reportNavigateToView: reportNavigateToView,
reportSelectedCastMode: reportSelectedCastMode,
reportSinkCount: reportSinkCount,
+ reportTimeToClickSink: reportTimeToClickSink,
requestInitialData: requestInitialData,
requestRoute: requestRoute,
};
diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc
index f0c8a2e..79ab56a 100644
--- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc
+++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc
@@ -40,6 +40,7 @@ const char kReportInitialState[] = "reportInitialState";
const char kReportNavigateToView[] = "reportNavigateToView";
const char kReportSelectedCastMode[] = "reportSelectedCastMode";
const char kReportSinkCount[] = "reportSinkCount";
+const char kReportTimeToClickSink[] = "reportTimeToClickSink";
const char kOnInitialDataReceived[] = "onInitialDataReceived";
// JS function names.
@@ -293,6 +294,10 @@ void MediaRouterWebUIMessageHandler::RegisterMessages() {
base::Bind(&MediaRouterWebUIMessageHandler::OnReportSinkCount,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
+ kReportTimeToClickSink,
+ base::Bind(&MediaRouterWebUIMessageHandler::OnReportTimeToClickSink,
+ base::Unretained(this)));
+ web_ui()->RegisterMessageCallback(
kOnInitialDataReceived,
base::Bind(&MediaRouterWebUIMessageHandler::OnInitialDataReceived,
base::Unretained(this)));
@@ -551,6 +556,18 @@ void MediaRouterWebUIMessageHandler::OnReportSinkCount(
UMA_HISTOGRAM_COUNTS_100("MediaRouter.Ui.Device.Count", sink_count);
}
+void MediaRouterWebUIMessageHandler::OnReportTimeToClickSink(
+ const base::ListValue* args) {
+ DVLOG(1) << "OnReportTimeToClickSink";
+ double time_to_click;
+ if (!args->GetDouble(0, &time_to_click)) {
+ DVLOG(1) << "Unable to extract args.";
+ return;
+ }
+ UMA_HISTOGRAM_TIMES("MediaRouter.Ui.Action.StartLocal.Latency",
+ base::TimeDelta::FromMillisecondsD(time_to_click));
+}
+
void MediaRouterWebUIMessageHandler::OnInitialDataReceived(
const base::ListValue* args) {
DVLOG(1) << "OnInitialDataReceived";
diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h
index 673be24..936a20d 100644
--- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h
+++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler.h
@@ -64,6 +64,7 @@ class MediaRouterWebUIMessageHandler : public content::WebUIMessageHandler {
void OnReportNavigateToView(const base::ListValue* args);
void OnReportSelectedCastMode(const base::ListValue* args);
void OnReportSinkCount(const base::ListValue* args);
+ void OnReportTimeToClickSink(const base::ListValue* args);
void OnInitialDataReceived(const base::ListValue* args);
// Performs an action for an Issue of |type|.
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index f4e0cc9..b49e196 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -19704,6 +19704,15 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
</summary>
</histogram>
+<histogram name="MediaRouter.Ui.Action.StartLocal.Latency" units="ms">
+ <owner>apacible@chromium.org</owner>
+ <summary>
+ Duration in milliseconds taken from the Media Router dialog showing the sink
+ list and being populated with at least one device to the user selecting a
+ device immediately after to create a new route.
+ </summary>
+</histogram>
+
<histogram name="MediaRouter.Ui.Action.StartLocalPosition"
enum="MediaRouterSinkPositionLabel">
<owner>apacible@chromium.org</owner>