| 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 7346b300e8d6172baf7679efd98a43671c7faeae..0b8a30b9a8ac456b26f105deb9598a3ac57570b4 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
 | 
| @@ -94,8 +94,7 @@ const char kWindowOpen[] = "window.open";
 | 
|  std::unique_ptr<base::DictionaryValue> SinksAndIdentityToValue(
 | 
|      const std::vector<MediaSinkWithCastModes>& sinks,
 | 
|      const AccountInfo& account_info) {
 | 
| -  std::unique_ptr<base::DictionaryValue> sink_list_and_identity(
 | 
| -      new base::DictionaryValue);
 | 
| +  auto sink_list_and_identity = base::MakeUnique<base::DictionaryValue>();
 | 
|    bool show_email = false;
 | 
|    bool show_domain = false;
 | 
|    std::string user_domain;
 | 
| @@ -104,10 +103,10 @@ std::unique_ptr<base::DictionaryValue> SinksAndIdentityToValue(
 | 
|      sink_list_and_identity->SetString("userEmail", account_info.email);
 | 
|    }
 | 
|  
 | 
| -  std::unique_ptr<base::ListValue> sinks_val(new base::ListValue);
 | 
| +  auto sinks_val = base::MakeUnique<base::ListValue>();
 | 
|  
 | 
|    for (const MediaSinkWithCastModes& sink_with_cast_modes : sinks) {
 | 
| -    std::unique_ptr<base::DictionaryValue> sink_val(new base::DictionaryValue);
 | 
| +    auto sink_val = base::MakeUnique<base::DictionaryValue>();
 | 
|  
 | 
|      const MediaSink& sink = sink_with_cast_modes.sink;
 | 
|      sink_val->SetString("id", sink.id());
 | 
| @@ -157,12 +156,16 @@ std::unique_ptr<base::DictionaryValue> RouteToValue(
 | 
|      bool can_join,
 | 
|      const std::string& extension_id,
 | 
|      bool incognito,
 | 
| -    int current_cast_mode) {
 | 
| -  std::unique_ptr<base::DictionaryValue> dictionary(new base::DictionaryValue);
 | 
| +    int current_cast_mode,
 | 
| +    bool is_web_ui_route_controller_available) {
 | 
| +  auto dictionary = base::MakeUnique<base::DictionaryValue>();
 | 
|    dictionary->SetString("id", route.media_route_id());
 | 
|    dictionary->SetString("sinkId", route.media_sink_id());
 | 
|    dictionary->SetString("description", route.description());
 | 
|    dictionary->SetBoolean("isLocal", route.is_local());
 | 
| +  dictionary->SetBoolean("supportsWebUiController",
 | 
| +                         is_web_ui_route_controller_available &&
 | 
| +                             route.supports_media_route_controller());
 | 
|    dictionary->SetBoolean("canJoin", can_join);
 | 
|    if (current_cast_mode > 0) {
 | 
|      dictionary->SetInteger("currentCastMode", current_cast_mode);
 | 
| @@ -184,11 +187,10 @@ std::unique_ptr<base::ListValue> CastModesToValue(
 | 
|      const CastModeSet& cast_modes,
 | 
|      const std::string& source_host,
 | 
|      base::Optional<MediaCastMode> forced_cast_mode) {
 | 
| -  std::unique_ptr<base::ListValue> value(new base::ListValue);
 | 
| +  auto value = base::MakeUnique<base::ListValue>();
 | 
|  
 | 
|    for (const MediaCastMode& cast_mode : cast_modes) {
 | 
| -    std::unique_ptr<base::DictionaryValue> cast_mode_val(
 | 
| -        new base::DictionaryValue);
 | 
| +    auto cast_mode_val = base::MakeUnique<base::DictionaryValue>();
 | 
|      cast_mode_val->SetInteger("type", cast_mode);
 | 
|      cast_mode_val->SetString(
 | 
|          "description", MediaCastModeToDescription(cast_mode, source_host));
 | 
| @@ -204,7 +206,7 @@ std::unique_ptr<base::ListValue> CastModesToValue(
 | 
|  // Returns an Issue dictionary created from |issue| that can be used in WebUI.
 | 
|  std::unique_ptr<base::DictionaryValue> IssueToValue(const Issue& issue) {
 | 
|    const IssueInfo& issue_info = issue.info();
 | 
| -  std::unique_ptr<base::DictionaryValue> dictionary(new base::DictionaryValue);
 | 
| +  auto dictionary = base::MakeUnique<base::DictionaryValue>();
 | 
|    dictionary->SetInteger("id", issue.id());
 | 
|    dictionary->SetString("title", issue_info.title);
 | 
|    dictionary->SetString("message", issue_info.message);
 | 
| @@ -256,6 +258,8 @@ MediaRouterWebUIMessageHandler::MediaRouterWebUIMessageHandler(
 | 
|      : incognito_(
 | 
|            Profile::FromWebUI(media_router_ui->web_ui())->IsOffTheRecord()),
 | 
|        dialog_closing_(false),
 | 
| +      is_web_ui_route_controller_available_(base::FeatureList::IsEnabled(
 | 
| +          features::kMediaRouterUIRouteController)),
 | 
|        media_router_ui_(media_router_ui) {}
 | 
|  
 | 
|  MediaRouterWebUIMessageHandler::~MediaRouterWebUIMessageHandler() {}
 | 
| @@ -298,7 +302,7 @@ void MediaRouterWebUIMessageHandler::OnCreateRouteResponseReceived(
 | 
|          route->media_route_id(), media_router_ui_->routes_and_cast_modes());
 | 
|      std::unique_ptr<base::DictionaryValue> route_value(RouteToValue(
 | 
|          *route, false, media_router_ui_->GetRouteProviderExtensionId(),
 | 
| -        incognito_, current_cast_mode));
 | 
| +        incognito_, current_cast_mode, is_web_ui_route_controller_available_));
 | 
|      web_ui()->CallJavascriptFunctionUnsafe(kOnCreateRouteResponseReceived,
 | 
|                                             base::Value(sink_id), *route_value,
 | 
|                                             base::Value(route->for_display()));
 | 
| @@ -513,10 +517,6 @@ void MediaRouterWebUIMessageHandler::OnRequestInitialData(
 | 
|        media_router_ui_->UserSelectedTabMirroringForCurrentOrigin();
 | 
|    initial_data.SetBoolean("useTabMirroring", use_tab_mirroring);
 | 
|  
 | 
| -  initial_data.SetBoolean(
 | 
| -      "useWebUiRouteControls",
 | 
| -      base::FeatureList::IsEnabled(features::kMediaRouterUIRouteController));
 | 
| -
 | 
|    web_ui()->CallJavascriptFunctionUnsafe(kSetInitialData, initial_data);
 | 
|    media_router_ui_->UIInitialized();
 | 
|  }
 | 
| @@ -977,7 +977,7 @@ bool MediaRouterWebUIMessageHandler::ActOnIssueType(
 | 
|      std::string learn_more_url = GetLearnMoreUrl(args);
 | 
|      if (learn_more_url.empty())
 | 
|        return false;
 | 
| -    std::unique_ptr<base::ListValue> open_args(new base::ListValue);
 | 
| +    auto open_args = base::MakeUnique<base::ListValue>();
 | 
|      open_args->AppendString(learn_more_url);
 | 
|      web_ui()->CallJavascriptFunctionUnsafe(kWindowOpen, *open_args);
 | 
|      return true;
 | 
| @@ -1060,7 +1060,7 @@ std::unique_ptr<base::ListValue> MediaRouterWebUIMessageHandler::RoutesToValue(
 | 
|      const std::vector<MediaRoute::Id>& joinable_route_ids,
 | 
|      const std::unordered_map<MediaRoute::Id, MediaCastMode>& current_cast_modes)
 | 
|      const {
 | 
| -  std::unique_ptr<base::ListValue> value(new base::ListValue);
 | 
| +  auto value = base::MakeUnique<base::ListValue>();
 | 
|    const std::string& extension_id =
 | 
|        media_router_ui_->GetRouteProviderExtensionId();
 | 
|  
 | 
| @@ -1069,8 +1069,9 @@ std::unique_ptr<base::ListValue> MediaRouterWebUIMessageHandler::RoutesToValue(
 | 
|          base::ContainsValue(joinable_route_ids, route.media_route_id());
 | 
|      int current_cast_mode =
 | 
|          CurrentCastModeForRouteId(route.media_route_id(), current_cast_modes);
 | 
| -    std::unique_ptr<base::DictionaryValue> route_val(RouteToValue(
 | 
| -        route, can_join, extension_id, incognito_, current_cast_mode));
 | 
| +    std::unique_ptr<base::DictionaryValue> route_val(
 | 
| +        RouteToValue(route, can_join, extension_id, incognito_,
 | 
| +                     current_cast_mode, is_web_ui_route_controller_available_));
 | 
|      value->Append(std::move(route_val));
 | 
|    }
 | 
|  
 | 
| 
 |