Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(483)

Side by Side Diff: chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc

Issue 2859953002: Reland [Media Router] Custom Controls 3 - add plumbing through MRUI and MRWebUIMessageHandler (Closed)
Patch Set: Fix test failures Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698