Chromium Code Reviews| Index: chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc |
| 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 1e22dd81652226a9da6b7aee4cf05b898a4ac8c9..9b537efe5ad534ea3a50c3094bbca51c94602648 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 |
| @@ -21,7 +21,7 @@ |
| #include "chrome/browser/sync/profile_sync_service_factory.h" |
| #include "chrome/browser/ui/webui/media_router/media_cast_mode.h" |
| #include "chrome/browser/ui/webui/media_router/media_router_ui.h" |
| -#include "chrome/common/media_router/issue.h" |
| +#include "chrome/common/chrome_features.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "components/browser_sync/profile_sync_service.h" |
| @@ -62,11 +62,20 @@ const char kReportTimeToClickSink[] = "reportTimeToClickSink"; |
| const char kReportTimeToInitialActionClose[] = "reportTimeToInitialActionClose"; |
| const char kSearchSinksAndCreateRoute[] = "searchSinksAndCreateRoute"; |
| const char kOnInitialDataReceived[] = "onInitialDataReceived"; |
| +const char kOnMediaControllerAvailable[] = "onMediaControllerAvailable"; |
| +const char kOnMediaControllerClosed[] = "onMediaControllerClosed"; |
| +const char kPauseCurrentMedia[] = "pauseCurrentMedia"; |
| +const char kPlayCurrentMedia[] = "playCurrentMedia"; |
| +const char kSeekCurrentMedia[] = "seekCurrentMedia"; |
| +const char kSetCurrentMediaMute[] = "setCurrentMediaMute"; |
| +const char kSetCurrentMediaVolume[] = "setCurrentMediaVolume"; |
| // JS function names. |
| const char kSetInitialData[] = "media_router.ui.setInitialData"; |
| const char kOnCreateRouteResponseReceived[] = |
| "media_router.ui.onCreateRouteResponseReceived"; |
| +const char kOnRouteControllerInvalidated[] = |
| + "media_router.ui.onRouteControllerInvalidated"; |
| const char kReceiveSearchResult[] = "media_router.ui.receiveSearchResult"; |
| const char kSetFirstRunFlowData[] = "media_router.ui.setFirstRunFlowData"; |
| const char kSetIssue[] = "media_router.ui.setIssue"; |
| @@ -74,6 +83,7 @@ const char kSetSinkListAndIdentity[] = "media_router.ui.setSinkListAndIdentity"; |
| const char kSetRouteList[] = "media_router.ui.setRouteList"; |
| const char kSetCastModeList[] = "media_router.ui.setCastModeList"; |
| const char kUpdateMaxHeight[] = "media_router.ui.updateMaxHeight"; |
| +const char kUpdateRouteStatus[] = "media_router.ui.updateRouteStatus"; |
| const char kWindowOpen[] = "window.open"; |
| std::unique_ptr<base::DictionaryValue> SinksAndIdentityToValue( |
| @@ -314,6 +324,30 @@ void MediaRouterWebUIMessageHandler::UpdateMaxDialogHeight(int height) { |
| web_ui()->CallJavascriptFunctionUnsafe(kUpdateMaxHeight, base::Value(height)); |
| } |
| +void MediaRouterWebUIMessageHandler::UpdateMediaRouteStatus( |
| + const MediaStatus& status) { |
| + current_media_status_ = base::make_optional<MediaStatus>(MediaStatus(status)); |
| + |
| + base::DictionaryValue status_value; |
| + status_value.SetString("title", status.title); |
| + status_value.SetString("description", status.description); |
| + status_value.SetBoolean("canPlayPause", status.can_play_pause); |
| + status_value.SetBoolean("canMute", status.can_mute); |
| + status_value.SetBoolean("canSetVolume", status.can_set_volume); |
| + status_value.SetBoolean("canSeek", status.can_seek); |
| + status_value.SetBoolean("isPaused", status.is_paused); |
| + status_value.SetBoolean("isMuted", status.is_muted); |
| + status_value.SetInteger("duration", status.duration.InSeconds()); |
| + status_value.SetInteger("currentTime", status.current_time.InSeconds()); |
| + status_value.SetDouble("volume", status.volume); |
| + web_ui()->CallJavascriptFunctionUnsafe(kUpdateRouteStatus, |
| + std::move(status_value)); |
| +} |
| + |
| +void MediaRouterWebUIMessageHandler::OnRouteControllerInvalidated() { |
| + web_ui()->CallJavascriptFunctionUnsafe(kOnRouteControllerInvalidated); |
| +} |
| + |
| void MediaRouterWebUIMessageHandler::RegisterMessages() { |
| web_ui()->RegisterMessageCallback( |
| kRequestInitialData, |
| @@ -400,6 +434,34 @@ void MediaRouterWebUIMessageHandler::RegisterMessages() { |
| kOnInitialDataReceived, |
| base::Bind(&MediaRouterWebUIMessageHandler::OnInitialDataReceived, |
| base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| + kOnMediaControllerAvailable, |
| + base::Bind(&MediaRouterWebUIMessageHandler::OnMediaControllerAvailable, |
| + base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| + kOnMediaControllerClosed, |
| + base::Bind(&MediaRouterWebUIMessageHandler::OnMediaControllerClosed, |
| + base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| + kPauseCurrentMedia, |
| + base::Bind(&MediaRouterWebUIMessageHandler::OnPauseCurrentMedia, |
| + base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| + kPlayCurrentMedia, |
| + base::Bind(&MediaRouterWebUIMessageHandler::OnPlayCurrentMedia, |
| + base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| + kSeekCurrentMedia, |
| + base::Bind(&MediaRouterWebUIMessageHandler::OnSeekCurrentMedia, |
| + base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| + kSetCurrentMediaMute, |
| + base::Bind(&MediaRouterWebUIMessageHandler::OnSetCurrentMediaMute, |
| + base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| + kSetCurrentMediaVolume, |
| + base::Bind(&MediaRouterWebUIMessageHandler::OnSetCurrentMediaVolume, |
| + base::Unretained(this))); |
| } |
| void MediaRouterWebUIMessageHandler::OnRequestInitialData( |
| @@ -434,6 +496,10 @@ void MediaRouterWebUIMessageHandler::OnRequestInitialData( |
| media_router_ui_->UserSelectedTabMirroringForCurrentOrigin(); |
| initial_data.SetBoolean("useTabMirroring", use_tab_mirroring); |
| + initial_data.SetBoolean( |
| + "useNewRouteControls", |
| + base::FeatureList::IsEnabled(features::kMediaRouterUIRouteController)); |
| + |
| web_ui()->CallJavascriptFunctionUnsafe(kSetInitialData, initial_data); |
| media_router_ui_->UIInitialized(); |
| } |
| @@ -789,6 +855,89 @@ void MediaRouterWebUIMessageHandler::OnInitialDataReceived( |
| MaybeUpdateFirstRunFlowData(); |
| } |
| +void MediaRouterWebUIMessageHandler::OnMediaControllerAvailable( |
| + const base::ListValue* args) { |
| + const base::DictionaryValue* args_dict = nullptr; |
| + std::string route_id; |
| + if (!args->GetDictionary(0, &args_dict) || |
| + !args_dict->GetString("routeId", &route_id)) { |
| + DVLOG(1) << "Unable to extract media route ID"; |
| + return; |
| + } |
| + media_router_ui_->OnMediaControllerUIAvailable(route_id); |
| +} |
| + |
| +void MediaRouterWebUIMessageHandler::OnMediaControllerClosed( |
| + const base::ListValue* args) { |
| + current_media_status_.reset(); |
| + media_router_ui_->OnMediaControllerUIClosed(); |
| +} |
| + |
| +void MediaRouterWebUIMessageHandler::OnPauseCurrentMedia( |
| + const base::ListValue* args) { |
| + const MediaRouteController* route_controller = |
| + media_router_ui_->GetMediaRouteController(); |
| + if (route_controller) |
| + route_controller->Pause(); |
| +} |
| + |
| +void MediaRouterWebUIMessageHandler::OnPlayCurrentMedia( |
| + const base::ListValue* args) { |
| + const MediaRouteController* route_controller = |
| + media_router_ui_->GetMediaRouteController(); |
| + if (route_controller) |
| + route_controller->Play(); |
| +} |
| + |
| +void MediaRouterWebUIMessageHandler::OnSeekCurrentMedia( |
| + const base::ListValue* args) { |
| + const base::DictionaryValue* args_dict = nullptr; |
| + int time; |
| + if (!args->GetDictionary(0, &args_dict) || |
| + !args_dict->GetInteger("time", &time)) { |
| + DVLOG(1) << "Unable to extract time"; |
| + return; |
| + } |
| + base::TimeDelta time_delta = base::TimeDelta::FromSeconds(time); |
| + const MediaRouteController* route_controller = |
| + media_router_ui_->GetMediaRouteController(); |
| + if (route_controller && current_media_status_ && |
| + time_delta >= base::TimeDelta() && |
| + time_delta <= current_media_status_->duration) { |
|
imcheng
2017/05/02 19:16:10
Is this validation necessary or can it be done in
takumif
2017/05/02 21:37:37
Yes, we could do the validation in the extension,
|
| + route_controller->Seek(time_delta); |
| + } |
| +} |
| + |
| +void MediaRouterWebUIMessageHandler::OnSetCurrentMediaMute( |
| + const base::ListValue* args) { |
| + const base::DictionaryValue* args_dict = nullptr; |
| + bool mute; |
| + if (!args->GetDictionary(0, &args_dict) || |
| + !args_dict->GetBoolean("mute", &mute)) { |
| + DVLOG(1) << "Unable to extract mute"; |
| + return; |
| + } |
| + const MediaRouteController* route_controller = |
| + media_router_ui_->GetMediaRouteController(); |
| + if (route_controller) |
| + route_controller->SetMute(mute); |
| +} |
| + |
| +void MediaRouterWebUIMessageHandler::OnSetCurrentMediaVolume( |
| + const base::ListValue* args) { |
| + const base::DictionaryValue* args_dict = nullptr; |
| + double volume; |
| + if (!args->GetDictionary(0, &args_dict) || |
| + !args_dict->GetDouble("volume", &volume)) { |
| + DVLOG(1) << "Unable to extract volume"; |
| + return; |
| + } |
| + const MediaRouteController* route_controller = |
| + media_router_ui_->GetMediaRouteController(); |
| + if (route_controller && volume >= 0 && volume <= 1) |
| + route_controller->SetVolume(volume); |
| +} |
| + |
| bool MediaRouterWebUIMessageHandler::ActOnIssueType( |
| IssueInfo::Action action_type, |
| const base::DictionaryValue* args) { |