OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/webui/media_router/media_router_webui_message_handle
r.h" | 5 #include "chrome/browser/ui/webui/media_router/media_router_webui_message_handle
r.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
13 #include "base/metrics/sparse_histogram.h" | 13 #include "base/metrics/sparse_histogram.h" |
14 #include "base/metrics/user_metrics.h" | 14 #include "base/metrics/user_metrics.h" |
15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
16 #include "base/strings/stringprintf.h" | 16 #include "base/strings/stringprintf.h" |
17 #include "base/values.h" | 17 #include "base/values.h" |
18 #include "chrome/browser/media/router/media_router_metrics.h" | 18 #include "chrome/browser/media/router/media_router_metrics.h" |
19 #include "chrome/browser/profiles/profile.h" | 19 #include "chrome/browser/profiles/profile.h" |
20 #include "chrome/browser/signin/signin_manager_factory.h" | 20 #include "chrome/browser/signin/signin_manager_factory.h" |
21 #include "chrome/browser/sync/profile_sync_service_factory.h" | 21 #include "chrome/browser/sync/profile_sync_service_factory.h" |
22 #include "chrome/browser/ui/webui/media_router/media_cast_mode.h" | 22 #include "chrome/browser/ui/webui/media_router/media_cast_mode.h" |
23 #include "chrome/browser/ui/webui/media_router/media_router_ui.h" | 23 #include "chrome/browser/ui/webui/media_router/media_router_ui.h" |
24 #include "chrome/common/media_router/issue.h" | 24 #include "chrome/common/chrome_features.h" |
25 #include "chrome/common/pref_names.h" | 25 #include "chrome/common/pref_names.h" |
26 #include "chrome/grit/generated_resources.h" | 26 #include "chrome/grit/generated_resources.h" |
27 #include "components/browser_sync/profile_sync_service.h" | 27 #include "components/browser_sync/profile_sync_service.h" |
28 #include "components/prefs/pref_service.h" | 28 #include "components/prefs/pref_service.h" |
29 #include "components/signin/core/browser/signin_manager.h" | 29 #include "components/signin/core/browser/signin_manager.h" |
30 #include "content/public/browser/web_ui.h" | 30 #include "content/public/browser/web_ui.h" |
31 #include "extensions/common/constants.h" | 31 #include "extensions/common/constants.h" |
32 #include "ui/base/l10n/l10n_util.h" | 32 #include "ui/base/l10n/l10n_util.h" |
33 | 33 |
34 namespace media_router { | 34 namespace media_router { |
(...skipping 20 matching lines...) Expand all Loading... |
55 const char kReportInitialState[] = "reportInitialState"; | 55 const char kReportInitialState[] = "reportInitialState"; |
56 const char kReportNavigateToView[] = "reportNavigateToView"; | 56 const char kReportNavigateToView[] = "reportNavigateToView"; |
57 const char kReportRouteCreationOutcome[] = "reportRouteCreationOutcome"; | 57 const char kReportRouteCreationOutcome[] = "reportRouteCreationOutcome"; |
58 const char kReportRouteCreation[] = "reportRouteCreation"; | 58 const char kReportRouteCreation[] = "reportRouteCreation"; |
59 const char kReportSelectedCastMode[] = "reportSelectedCastMode"; | 59 const char kReportSelectedCastMode[] = "reportSelectedCastMode"; |
60 const char kReportSinkCount[] = "reportSinkCount"; | 60 const char kReportSinkCount[] = "reportSinkCount"; |
61 const char kReportTimeToClickSink[] = "reportTimeToClickSink"; | 61 const char kReportTimeToClickSink[] = "reportTimeToClickSink"; |
62 const char kReportTimeToInitialActionClose[] = "reportTimeToInitialActionClose"; | 62 const char kReportTimeToInitialActionClose[] = "reportTimeToInitialActionClose"; |
63 const char kSearchSinksAndCreateRoute[] = "searchSinksAndCreateRoute"; | 63 const char kSearchSinksAndCreateRoute[] = "searchSinksAndCreateRoute"; |
64 const char kOnInitialDataReceived[] = "onInitialDataReceived"; | 64 const char kOnInitialDataReceived[] = "onInitialDataReceived"; |
| 65 const char kOnMediaControllerAvailable[] = "onMediaControllerAvailable"; |
| 66 const char kOnMediaControllerClosed[] = "onMediaControllerClosed"; |
| 67 const char kPauseCurrentMedia[] = "pauseCurrentMedia"; |
| 68 const char kPlayCurrentMedia[] = "playCurrentMedia"; |
| 69 const char kSeekCurrentMedia[] = "seekCurrentMedia"; |
| 70 const char kSetCurrentMediaMute[] = "setCurrentMediaMute"; |
| 71 const char kSetCurrentMediaVolume[] = "setCurrentMediaVolume"; |
65 | 72 |
66 // JS function names. | 73 // JS function names. |
67 const char kSetInitialData[] = "media_router.ui.setInitialData"; | 74 const char kSetInitialData[] = "media_router.ui.setInitialData"; |
68 const char kOnCreateRouteResponseReceived[] = | 75 const char kOnCreateRouteResponseReceived[] = |
69 "media_router.ui.onCreateRouteResponseReceived"; | 76 "media_router.ui.onCreateRouteResponseReceived"; |
| 77 const char kOnRouteControllerInvalidated[] = |
| 78 "media_router.ui.onRouteControllerInvalidated"; |
70 const char kReceiveSearchResult[] = "media_router.ui.receiveSearchResult"; | 79 const char kReceiveSearchResult[] = "media_router.ui.receiveSearchResult"; |
71 const char kSetFirstRunFlowData[] = "media_router.ui.setFirstRunFlowData"; | 80 const char kSetFirstRunFlowData[] = "media_router.ui.setFirstRunFlowData"; |
72 const char kSetIssue[] = "media_router.ui.setIssue"; | 81 const char kSetIssue[] = "media_router.ui.setIssue"; |
73 const char kSetSinkListAndIdentity[] = "media_router.ui.setSinkListAndIdentity"; | 82 const char kSetSinkListAndIdentity[] = "media_router.ui.setSinkListAndIdentity"; |
74 const char kSetRouteList[] = "media_router.ui.setRouteList"; | 83 const char kSetRouteList[] = "media_router.ui.setRouteList"; |
75 const char kSetCastModeList[] = "media_router.ui.setCastModeList"; | 84 const char kSetCastModeList[] = "media_router.ui.setCastModeList"; |
76 const char kUpdateMaxHeight[] = "media_router.ui.updateMaxHeight"; | 85 const char kUpdateMaxHeight[] = "media_router.ui.updateMaxHeight"; |
| 86 const char kUpdateRouteStatus[] = "media_router.ui.updateRouteStatus"; |
77 const char kWindowOpen[] = "window.open"; | 87 const char kWindowOpen[] = "window.open"; |
78 | 88 |
79 std::unique_ptr<base::DictionaryValue> SinksAndIdentityToValue( | 89 std::unique_ptr<base::DictionaryValue> SinksAndIdentityToValue( |
80 const std::vector<MediaSinkWithCastModes>& sinks, | 90 const std::vector<MediaSinkWithCastModes>& sinks, |
81 const AccountInfo& account_info) { | 91 const AccountInfo& account_info) { |
82 std::unique_ptr<base::DictionaryValue> sink_list_and_identity( | 92 std::unique_ptr<base::DictionaryValue> sink_list_and_identity( |
83 new base::DictionaryValue); | 93 new base::DictionaryValue); |
84 bool show_email = false; | 94 bool show_email = false; |
85 bool show_domain = false; | 95 bool show_domain = false; |
86 std::string user_domain; | 96 std::string user_domain; |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 void MediaRouterWebUIMessageHandler::ClearIssue() { | 317 void MediaRouterWebUIMessageHandler::ClearIssue() { |
308 DVLOG(2) << "ClearIssue"; | 318 DVLOG(2) << "ClearIssue"; |
309 web_ui()->CallJavascriptFunctionUnsafe(kSetIssue, base::Value()); | 319 web_ui()->CallJavascriptFunctionUnsafe(kSetIssue, base::Value()); |
310 } | 320 } |
311 | 321 |
312 void MediaRouterWebUIMessageHandler::UpdateMaxDialogHeight(int height) { | 322 void MediaRouterWebUIMessageHandler::UpdateMaxDialogHeight(int height) { |
313 DVLOG(2) << "UpdateMaxDialogHeight"; | 323 DVLOG(2) << "UpdateMaxDialogHeight"; |
314 web_ui()->CallJavascriptFunctionUnsafe(kUpdateMaxHeight, base::Value(height)); | 324 web_ui()->CallJavascriptFunctionUnsafe(kUpdateMaxHeight, base::Value(height)); |
315 } | 325 } |
316 | 326 |
| 327 void MediaRouterWebUIMessageHandler::UpdateMediaRouteStatus( |
| 328 const MediaStatus& status) { |
| 329 current_media_status_ = base::make_optional<MediaStatus>(MediaStatus(status)); |
| 330 |
| 331 base::DictionaryValue status_value; |
| 332 status_value.SetString("title", status.title); |
| 333 status_value.SetString("description", status.description); |
| 334 status_value.SetBoolean("canPlayPause", status.can_play_pause); |
| 335 status_value.SetBoolean("canMute", status.can_mute); |
| 336 status_value.SetBoolean("canSetVolume", status.can_set_volume); |
| 337 status_value.SetBoolean("canSeek", status.can_seek); |
| 338 status_value.SetBoolean("isPaused", status.is_paused); |
| 339 status_value.SetBoolean("isMuted", status.is_muted); |
| 340 status_value.SetInteger("duration", status.duration.InSeconds()); |
| 341 status_value.SetInteger("currentTime", status.current_time.InSeconds()); |
| 342 status_value.SetDouble("volume", status.volume); |
| 343 web_ui()->CallJavascriptFunctionUnsafe(kUpdateRouteStatus, |
| 344 std::move(status_value)); |
| 345 } |
| 346 |
| 347 void MediaRouterWebUIMessageHandler::OnRouteControllerInvalidated() { |
| 348 web_ui()->CallJavascriptFunctionUnsafe(kOnRouteControllerInvalidated); |
| 349 } |
| 350 |
317 void MediaRouterWebUIMessageHandler::RegisterMessages() { | 351 void MediaRouterWebUIMessageHandler::RegisterMessages() { |
318 web_ui()->RegisterMessageCallback( | 352 web_ui()->RegisterMessageCallback( |
319 kRequestInitialData, | 353 kRequestInitialData, |
320 base::Bind(&MediaRouterWebUIMessageHandler::OnRequestInitialData, | 354 base::Bind(&MediaRouterWebUIMessageHandler::OnRequestInitialData, |
321 base::Unretained(this))); | 355 base::Unretained(this))); |
322 web_ui()->RegisterMessageCallback( | 356 web_ui()->RegisterMessageCallback( |
323 kCreateRoute, | 357 kCreateRoute, |
324 base::Bind(&MediaRouterWebUIMessageHandler::OnCreateRoute, | 358 base::Bind(&MediaRouterWebUIMessageHandler::OnCreateRoute, |
325 base::Unretained(this))); | 359 base::Unretained(this))); |
326 web_ui()->RegisterMessageCallback( | 360 web_ui()->RegisterMessageCallback( |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 &MediaRouterWebUIMessageHandler::OnReportTimeToInitialActionClose, | 427 &MediaRouterWebUIMessageHandler::OnReportTimeToInitialActionClose, |
394 base::Unretained(this))); | 428 base::Unretained(this))); |
395 web_ui()->RegisterMessageCallback( | 429 web_ui()->RegisterMessageCallback( |
396 kSearchSinksAndCreateRoute, | 430 kSearchSinksAndCreateRoute, |
397 base::Bind(&MediaRouterWebUIMessageHandler::OnSearchSinksAndCreateRoute, | 431 base::Bind(&MediaRouterWebUIMessageHandler::OnSearchSinksAndCreateRoute, |
398 base::Unretained(this))); | 432 base::Unretained(this))); |
399 web_ui()->RegisterMessageCallback( | 433 web_ui()->RegisterMessageCallback( |
400 kOnInitialDataReceived, | 434 kOnInitialDataReceived, |
401 base::Bind(&MediaRouterWebUIMessageHandler::OnInitialDataReceived, | 435 base::Bind(&MediaRouterWebUIMessageHandler::OnInitialDataReceived, |
402 base::Unretained(this))); | 436 base::Unretained(this))); |
| 437 web_ui()->RegisterMessageCallback( |
| 438 kOnMediaControllerAvailable, |
| 439 base::Bind(&MediaRouterWebUIMessageHandler::OnMediaControllerAvailable, |
| 440 base::Unretained(this))); |
| 441 web_ui()->RegisterMessageCallback( |
| 442 kOnMediaControllerClosed, |
| 443 base::Bind(&MediaRouterWebUIMessageHandler::OnMediaControllerClosed, |
| 444 base::Unretained(this))); |
| 445 web_ui()->RegisterMessageCallback( |
| 446 kPauseCurrentMedia, |
| 447 base::Bind(&MediaRouterWebUIMessageHandler::OnPauseCurrentMedia, |
| 448 base::Unretained(this))); |
| 449 web_ui()->RegisterMessageCallback( |
| 450 kPlayCurrentMedia, |
| 451 base::Bind(&MediaRouterWebUIMessageHandler::OnPlayCurrentMedia, |
| 452 base::Unretained(this))); |
| 453 web_ui()->RegisterMessageCallback( |
| 454 kSeekCurrentMedia, |
| 455 base::Bind(&MediaRouterWebUIMessageHandler::OnSeekCurrentMedia, |
| 456 base::Unretained(this))); |
| 457 web_ui()->RegisterMessageCallback( |
| 458 kSetCurrentMediaMute, |
| 459 base::Bind(&MediaRouterWebUIMessageHandler::OnSetCurrentMediaMute, |
| 460 base::Unretained(this))); |
| 461 web_ui()->RegisterMessageCallback( |
| 462 kSetCurrentMediaVolume, |
| 463 base::Bind(&MediaRouterWebUIMessageHandler::OnSetCurrentMediaVolume, |
| 464 base::Unretained(this))); |
403 } | 465 } |
404 | 466 |
405 void MediaRouterWebUIMessageHandler::OnRequestInitialData( | 467 void MediaRouterWebUIMessageHandler::OnRequestInitialData( |
406 const base::ListValue* args) { | 468 const base::ListValue* args) { |
407 DVLOG(1) << "OnRequestInitialData"; | 469 DVLOG(1) << "OnRequestInitialData"; |
408 media_router_ui_->OnUIInitiallyLoaded(); | 470 media_router_ui_->OnUIInitiallyLoaded(); |
409 base::DictionaryValue initial_data; | 471 base::DictionaryValue initial_data; |
410 | 472 |
411 // "No Cast devices found?" Chromecast help center page. | 473 // "No Cast devices found?" Chromecast help center page. |
412 initial_data.SetString("deviceMissingUrl", | 474 initial_data.SetString("deviceMissingUrl", |
(...skipping 14 matching lines...) Expand all Loading... |
427 initial_data.Set("castModes", std::move(cast_modes_list)); | 489 initial_data.Set("castModes", std::move(cast_modes_list)); |
428 | 490 |
429 // If the cast mode last chosen for the current origin is tab mirroring, | 491 // If the cast mode last chosen for the current origin is tab mirroring, |
430 // that should be the cast mode initially selected in the dialog. Otherwise | 492 // that should be the cast mode initially selected in the dialog. Otherwise |
431 // the initial cast mode should be chosen automatically by the dialog. | 493 // the initial cast mode should be chosen automatically by the dialog. |
432 bool use_tab_mirroring = | 494 bool use_tab_mirroring = |
433 base::ContainsKey(cast_modes, MediaCastMode::TAB_MIRROR) && | 495 base::ContainsKey(cast_modes, MediaCastMode::TAB_MIRROR) && |
434 media_router_ui_->UserSelectedTabMirroringForCurrentOrigin(); | 496 media_router_ui_->UserSelectedTabMirroringForCurrentOrigin(); |
435 initial_data.SetBoolean("useTabMirroring", use_tab_mirroring); | 497 initial_data.SetBoolean("useTabMirroring", use_tab_mirroring); |
436 | 498 |
| 499 initial_data.SetBoolean( |
| 500 "useNewRouteControls", |
| 501 base::FeatureList::IsEnabled(features::kMediaRouterUIRouteController)); |
| 502 |
437 web_ui()->CallJavascriptFunctionUnsafe(kSetInitialData, initial_data); | 503 web_ui()->CallJavascriptFunctionUnsafe(kSetInitialData, initial_data); |
438 media_router_ui_->UIInitialized(); | 504 media_router_ui_->UIInitialized(); |
439 } | 505 } |
440 | 506 |
441 void MediaRouterWebUIMessageHandler::OnCreateRoute( | 507 void MediaRouterWebUIMessageHandler::OnCreateRoute( |
442 const base::ListValue* args) { | 508 const base::ListValue* args) { |
443 DVLOG(1) << "OnCreateRoute"; | 509 DVLOG(1) << "OnCreateRoute"; |
444 const base::DictionaryValue* args_dict = nullptr; | 510 const base::DictionaryValue* args_dict = nullptr; |
445 std::string sink_id; | 511 std::string sink_id; |
446 int cast_mode_num = -1; | 512 int cast_mode_num = -1; |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 static_cast<MediaCastMode>(cast_mode_num)); | 848 static_cast<MediaCastMode>(cast_mode_num)); |
783 } | 849 } |
784 | 850 |
785 void MediaRouterWebUIMessageHandler::OnInitialDataReceived( | 851 void MediaRouterWebUIMessageHandler::OnInitialDataReceived( |
786 const base::ListValue* args) { | 852 const base::ListValue* args) { |
787 DVLOG(1) << "OnInitialDataReceived"; | 853 DVLOG(1) << "OnInitialDataReceived"; |
788 media_router_ui_->OnUIInitialDataReceived(); | 854 media_router_ui_->OnUIInitialDataReceived(); |
789 MaybeUpdateFirstRunFlowData(); | 855 MaybeUpdateFirstRunFlowData(); |
790 } | 856 } |
791 | 857 |
| 858 void MediaRouterWebUIMessageHandler::OnMediaControllerAvailable( |
| 859 const base::ListValue* args) { |
| 860 const base::DictionaryValue* args_dict = nullptr; |
| 861 std::string route_id; |
| 862 if (!args->GetDictionary(0, &args_dict) || |
| 863 !args_dict->GetString("routeId", &route_id)) { |
| 864 DVLOG(1) << "Unable to extract media route ID"; |
| 865 return; |
| 866 } |
| 867 media_router_ui_->OnMediaControllerUIAvailable(route_id); |
| 868 } |
| 869 |
| 870 void MediaRouterWebUIMessageHandler::OnMediaControllerClosed( |
| 871 const base::ListValue* args) { |
| 872 current_media_status_.reset(); |
| 873 media_router_ui_->OnMediaControllerUIClosed(); |
| 874 } |
| 875 |
| 876 void MediaRouterWebUIMessageHandler::OnPauseCurrentMedia( |
| 877 const base::ListValue* args) { |
| 878 const MediaRouteController* route_controller = |
| 879 media_router_ui_->GetMediaRouteController(); |
| 880 if (route_controller) |
| 881 route_controller->Pause(); |
| 882 } |
| 883 |
| 884 void MediaRouterWebUIMessageHandler::OnPlayCurrentMedia( |
| 885 const base::ListValue* args) { |
| 886 const MediaRouteController* route_controller = |
| 887 media_router_ui_->GetMediaRouteController(); |
| 888 if (route_controller) |
| 889 route_controller->Play(); |
| 890 } |
| 891 |
| 892 void MediaRouterWebUIMessageHandler::OnSeekCurrentMedia( |
| 893 const base::ListValue* args) { |
| 894 const base::DictionaryValue* args_dict = nullptr; |
| 895 int time; |
| 896 if (!args->GetDictionary(0, &args_dict) || |
| 897 !args_dict->GetInteger("time", &time)) { |
| 898 DVLOG(1) << "Unable to extract time"; |
| 899 return; |
| 900 } |
| 901 base::TimeDelta time_delta = base::TimeDelta::FromSeconds(time); |
| 902 const MediaRouteController* route_controller = |
| 903 media_router_ui_->GetMediaRouteController(); |
| 904 if (route_controller && current_media_status_ && |
| 905 time_delta >= base::TimeDelta() && |
| 906 time_delta <= current_media_status_->duration) { |
| 907 route_controller->Seek(time_delta); |
| 908 } |
| 909 } |
| 910 |
| 911 void MediaRouterWebUIMessageHandler::OnSetCurrentMediaMute( |
| 912 const base::ListValue* args) { |
| 913 const base::DictionaryValue* args_dict = nullptr; |
| 914 bool mute; |
| 915 if (!args->GetDictionary(0, &args_dict) || |
| 916 !args_dict->GetBoolean("mute", &mute)) { |
| 917 DVLOG(1) << "Unable to extract mute"; |
| 918 return; |
| 919 } |
| 920 const MediaRouteController* route_controller = |
| 921 media_router_ui_->GetMediaRouteController(); |
| 922 if (route_controller) |
| 923 route_controller->SetMute(mute); |
| 924 } |
| 925 |
| 926 void MediaRouterWebUIMessageHandler::OnSetCurrentMediaVolume( |
| 927 const base::ListValue* args) { |
| 928 const base::DictionaryValue* args_dict = nullptr; |
| 929 double volume; |
| 930 if (!args->GetDictionary(0, &args_dict) || |
| 931 !args_dict->GetDouble("volume", &volume)) { |
| 932 DVLOG(1) << "Unable to extract volume"; |
| 933 return; |
| 934 } |
| 935 const MediaRouteController* route_controller = |
| 936 media_router_ui_->GetMediaRouteController(); |
| 937 if (route_controller && volume >= 0 && volume <= 1) |
| 938 route_controller->SetVolume(volume); |
| 939 } |
| 940 |
792 bool MediaRouterWebUIMessageHandler::ActOnIssueType( | 941 bool MediaRouterWebUIMessageHandler::ActOnIssueType( |
793 IssueInfo::Action action_type, | 942 IssueInfo::Action action_type, |
794 const base::DictionaryValue* args) { | 943 const base::DictionaryValue* args) { |
795 if (action_type == IssueInfo::Action::LEARN_MORE) { | 944 if (action_type == IssueInfo::Action::LEARN_MORE) { |
796 std::string learn_more_url = GetLearnMoreUrl(args); | 945 std::string learn_more_url = GetLearnMoreUrl(args); |
797 if (learn_more_url.empty()) | 946 if (learn_more_url.empty()) |
798 return false; | 947 return false; |
799 std::unique_ptr<base::ListValue> open_args(new base::ListValue); | 948 std::unique_ptr<base::ListValue> open_args(new base::ListValue); |
800 open_args->AppendString(learn_more_url); | 949 open_args->AppendString(learn_more_url); |
801 web_ui()->CallJavascriptFunctionUnsafe(kWindowOpen, *open_args); | 950 web_ui()->CallJavascriptFunctionUnsafe(kWindowOpen, *open_args); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
894 } | 1043 } |
895 | 1044 |
896 return value; | 1045 return value; |
897 } | 1046 } |
898 | 1047 |
899 void MediaRouterWebUIMessageHandler::SetWebUIForTest(content::WebUI* web_ui) { | 1048 void MediaRouterWebUIMessageHandler::SetWebUIForTest(content::WebUI* web_ui) { |
900 set_web_ui(web_ui); | 1049 set_web_ui(web_ui); |
901 } | 1050 } |
902 | 1051 |
903 } // namespace media_router | 1052 } // namespace media_router |
OLD | NEW |