| 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 9c9092ec8a6cba272760df5e17922870690fdfb4..f079e149fa98e11be6096e222aa96f26a2930b41 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
|
| @@ -27,6 +27,7 @@ const char kRequestInitialData[] = "requestInitialData";
|
| const char kCreateRoute[] = "requestRoute";
|
| const char kActOnIssue[] = "actOnIssue";
|
| const char kCloseRoute[] = "closeRoute";
|
| +const char kJoinRoute[] = "joinRoute";
|
| const char kCloseDialog[] = "closeDialog";
|
| const char kReportSinkCount[] = "reportSinkCount";
|
|
|
| @@ -88,6 +89,17 @@ scoped_ptr<base::DictionaryValue> RouteToValue(
|
| return dictionary.Pass();
|
| }
|
|
|
| +scoped_ptr<base::ListValue> RouteIdsToValue(
|
| + const std::vector<MediaRoute::Id>& route_ids) {
|
| + scoped_ptr<base::ListValue> value(new base::ListValue);
|
| +
|
| + for (const MediaRoute::Id& route_id : route_ids) {
|
| + value->Append(new base::StringValue(route_id));
|
| + }
|
| +
|
| + return value.Pass();
|
| +}
|
| +
|
| scoped_ptr<base::ListValue> RoutesToValue(
|
| const std::vector<MediaRoute>& routes, const std::string& extension_id) {
|
| scoped_ptr<base::ListValue> value(new base::ListValue);
|
| @@ -179,11 +191,14 @@ void MediaRouterWebUIMessageHandler::UpdateSinks(
|
| }
|
|
|
| void MediaRouterWebUIMessageHandler::UpdateRoutes(
|
| - const std::vector<MediaRoute>& routes) {
|
| - DVLOG(2) << "UpdateRoutes";
|
| + const std::vector<MediaRoute>& routes,
|
| + const std::vector<MediaRoute::Id>& joinable_route_ids) {
|
| scoped_ptr<base::ListValue> routes_val(RoutesToValue(routes,
|
| media_router_ui_->GetRouteProviderExtensionId()));
|
| - web_ui()->CallJavascriptFunction(kSetRouteList, *routes_val);
|
| + scoped_ptr<base::ListValue> joinable_routes_ids_val(
|
| + RouteIdsToValue(joinable_route_ids));
|
| + web_ui()->CallJavascriptFunction(
|
| + kSetRouteList, *routes_val, *joinable_routes_ids_val);
|
| }
|
|
|
| void MediaRouterWebUIMessageHandler::UpdateCastModes(
|
| @@ -249,6 +264,10 @@ void MediaRouterWebUIMessageHandler::RegisterMessages() {
|
| base::Bind(&MediaRouterWebUIMessageHandler::OnCloseRoute,
|
| base::Unretained(this)));
|
| web_ui()->RegisterMessageCallback(
|
| + kJoinRoute,
|
| + base::Bind(&MediaRouterWebUIMessageHandler::OnJoinRoute,
|
| + base::Unretained(this)));
|
| + web_ui()->RegisterMessageCallback(
|
| kCloseDialog,
|
| base::Bind(&MediaRouterWebUIMessageHandler::OnCloseDialog,
|
| base::Unretained(this)));
|
| @@ -274,6 +293,11 @@ void MediaRouterWebUIMessageHandler::OnRequestInitialData(
|
| media_router_ui_->GetRouteProviderExtensionId()));
|
| initial_data.Set("routes", routes.release());
|
|
|
| +
|
| + scoped_ptr<base::ListValue> joinable_route_ids(
|
| + RouteIdsToValue(media_router_ui_->joinable_route_ids()));
|
| + initial_data.Set("joinableRouteIds", joinable_route_ids.release());
|
| +
|
| const std::set<MediaCastMode> cast_modes = media_router_ui_->cast_modes();
|
| scoped_ptr<base::ListValue> cast_modes_list(
|
| CastModesToValue(cast_modes, media_router_ui_->GetFrameURLHost()));
|
| @@ -360,8 +384,52 @@ void MediaRouterWebUIMessageHandler::OnActOnIssue(
|
| media_router_ui_->ClearIssue(issue_id);
|
| }
|
|
|
| -void MediaRouterWebUIMessageHandler::OnCloseRoute(
|
| - const base::ListValue* args) {
|
| +void MediaRouterWebUIMessageHandler::OnJoinRoute(const base::ListValue* args) {
|
| + DVLOG(1) << "OnJoinRoute";
|
| + const base::DictionaryValue* args_dict = nullptr;
|
| + std::string route_id;
|
| + std::string sink_id;
|
| + if (!args->GetDictionary(0, &args_dict) ||
|
| + !args_dict->GetString("sinkId", &sink_id) ||
|
| + !args_dict->GetString("routeId", &route_id)) {
|
| + DVLOG(1) << "Unable to extract args.";
|
| + return;
|
| + }
|
| +
|
| + if (sink_id.empty()) {
|
| + DVLOG(1) << "Media Route UI did not respond with a "
|
| + << "valid sink ID. Aborting.";
|
| + return;
|
| + }
|
| +
|
| + if (route_id.empty()) {
|
| + DVLOG(1) << "Media Route UI did not respond with a "
|
| + << "valid route ID. Aborting.";
|
| + return;
|
| + }
|
| +
|
| + MediaRouterUI* media_router_ui =
|
| + static_cast<MediaRouterUI*>(web_ui()->GetController());
|
| + if (media_router_ui->HasPendingRouteRequest()) {
|
| + DVLOG(1) << "UI already has pending route request. Ignoring.";
|
| + Issue issue(
|
| + l10n_util::GetStringUTF8(IDS_MEDIA_ROUTER_ISSUE_PENDING_ROUTE),
|
| + std::string(), IssueAction(IssueAction::TYPE_DISMISS),
|
| + std::vector<IssueAction>(), std::string(), Issue::NOTIFICATION,
|
| + false, std::string());
|
| + media_router_ui_->AddIssue(issue);
|
| + return;
|
| + }
|
| +
|
| + DVLOG(2) << __FUNCTION__ << ": sink id: " << sink_id
|
| + << ", route id: " << route_id;
|
| +
|
| + if (!media_router_ui_->JoinRoute(sink_id, route_id)) {
|
| + DVLOG(1) << "Error initiating route join request.";
|
| + }
|
| +}
|
| +
|
| +void MediaRouterWebUIMessageHandler::OnCloseRoute(const base::ListValue* args) {
|
| DVLOG(1) << "OnCloseRoute";
|
| const base::DictionaryValue* args_dict = nullptr;
|
| std::string route_id;
|
|
|