diff options
author | apacible <apacible@chromium.org> | 2016-01-11 18:39:04 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-12 02:40:20 +0000 |
commit | 9c1122c7163411be938195ba546460ba54d33b00 (patch) | |
tree | da86c7f14c3704c7dfcaab895aa9ea9af269091e | |
parent | 3d24f096b250b2364f75e6247e8a6d8ac7ec811b (diff) | |
download | chromium_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}
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> |