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) { |
+ 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) { |