diff options
author | haibinlu <haibinlu@chromium.org> | 2015-07-24 15:44:02 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-07-24 22:44:43 +0000 |
commit | f580a92a1fff8d909ed301a1286cf510dabb7921 (patch) | |
tree | a93e51fd4ffe98a100bcfaa1be1f7fed59239f48 | |
parent | 8eac6835a8a707c22e99c737c093d047d4a7c7e5 (diff) | |
download | chromium_src-f580a92a1fff8d909ed301a1286cf510dabb7921.zip chromium_src-f580a92a1fff8d909ed301a1286cf510dabb7921.tar.gz chromium_src-f580a92a1fff8d909ed301a1286cf510dabb7921.tar.bz2 |
[MediaRouter] Adds custom_controller field to MediaRoute object
so that a provider can have custom route detail/control via its own html page, which will be displayed at ExtensionView (to be done) when a route detail is shown.
BUG=
Review URL: https://codereview.chromium.org/1247593003
Cr-Commit-Position: refs/heads/master@{#340361}
17 files changed, 80 insertions, 27 deletions
diff --git a/chrome/browser/media/router/media_route.cc b/chrome/browser/media/router/media_route.cc index 15bf0bd4..8fab827 100644 --- a/chrome/browser/media/router/media_route.cc +++ b/chrome/browser/media/router/media_route.cc @@ -17,13 +17,14 @@ MediaRoute::MediaRoute(const MediaRoute::Id& media_route_id, const MediaSource& media_source, const MediaSink& media_sink, const std::string& description, - bool is_local) + bool is_local, + const std::string& custom_controller_path) : media_route_id_(media_route_id), media_source_(media_source), media_sink_(media_sink), description_(description), - is_local_(is_local) { -} + is_local_(is_local), + custom_controller_path_(custom_controller_path) {} MediaRoute::~MediaRoute() { } diff --git a/chrome/browser/media/router/media_route.h b/chrome/browser/media/router/media_route.h index 0cedee4..7c0fb52f 100644 --- a/chrome/browser/media/router/media_route.h +++ b/chrome/browser/media/router/media_route.h @@ -32,11 +32,14 @@ class MediaRoute { // |media_sink|: The sink that is receiving the media. // |description|: Description of the route to be displayed. // |is_local|: true if the route was created from this browser. + // |custom_controller_path|: custom controller path if it is given by route + // provider. empty otherwise. MediaRoute(const MediaRoute::Id& media_route_id, const MediaSource& media_source, const MediaSink& media_sink, const std::string& description, - bool is_local); + bool is_local, + const std::string& custom_controller_path); ~MediaRoute(); // The media route identifier. @@ -57,6 +60,13 @@ class MediaRoute { // by a media route provider.) bool is_local() const { return is_local_; } + // The custom controller path. This allows route provider to have custom route + // detail as well as its own route control features route control features in + // the media router dialog. + const std::string& custom_controller_path() const { + return custom_controller_path_; + } + bool Equals(const MediaRoute& other) const; private: @@ -65,6 +75,7 @@ class MediaRoute { MediaSink media_sink_; std::string description_; bool is_local_; + std::string custom_controller_path_; }; class MediaRouteIdToPresentationSessionMapping { diff --git a/chrome/browser/media/router/media_route_unittest.cc b/chrome/browser/media/router/media_route_unittest.cc index 31f221d..780b90a 100644 --- a/chrome/browser/media/router/media_route_unittest.cc +++ b/chrome/browser/media/router/media_route_unittest.cc @@ -19,28 +19,28 @@ namespace media_router { // Tests the == operator to ensure that only route ID equality is being checked. TEST(MediaRouteTest, Equals) { MediaRoute route1(kRouteId1, MediaSourceForCastApp("DialApp"), - MediaSink("sinkId", "sinkName"), "Description", false); + MediaSink("sinkId", "sinkName"), "Description", false, ""); // Same as route1 with different sink ID. MediaRoute route2(kRouteId1, MediaSourceForCastApp("DialApp"), MediaSink("differentSinkId", "different sink"), - "Description", false); + "Description", false, ""); EXPECT_TRUE(route1.Equals(route2)); // Same as route1 with different description. MediaRoute route3(kRouteId1, MediaSourceForCastApp("DialApp"), MediaSink("sinkId", "sinkName"), "differentDescription", - false); + false, ""); EXPECT_TRUE(route1.Equals(route3)); // Same as route1 with different is_local. MediaRoute route4(kRouteId1, MediaSourceForCastApp("DialApp"), - MediaSink("sinkId", "sinkName"), "Description", true); + MediaSink("sinkId", "sinkName"), "Description", true, ""); EXPECT_TRUE(route1.Equals(route4)); // The ID is different from route1's. MediaRoute route5(kRouteId2, MediaSourceForCastApp("DialApp"), - MediaSink("sinkId", "sinkName"), "Description", false); + MediaSink("sinkId", "sinkName"), "Description", false, ""); EXPECT_FALSE(route1.Equals(route5)); } diff --git a/chrome/browser/media/router/media_router.mojom b/chrome/browser/media/router/media_router.mojom index 071a3a1..5311bc8 100644 --- a/chrome/browser/media/router/media_router.mojom +++ b/chrome/browser/media/router/media_router.mojom @@ -26,6 +26,10 @@ struct MediaRoute { string description; // Specifies that the route is requested locally. bool is_local; + // An optional path to an HTML page bundled bundled with the media router + // component extension. When set, the route can have custom route detail as + // well as its own route controls in the media router dialog. + string? custom_controller_path; }; // Notifications or an actionable events to be shown to the user. diff --git a/chrome/browser/media/router/media_router_mojo_impl.h b/chrome/browser/media/router/media_router_mojo_impl.h index 52126da..167b8e3 100644 --- a/chrome/browser/media/router/media_router_mojo_impl.h +++ b/chrome/browser/media/router/media_router_mojo_impl.h @@ -83,6 +83,10 @@ class MediaRouterMojoImpl : public MediaRouter, void RegisterIssuesObserver(IssuesObserver* observer) override; void UnregisterIssuesObserver(IssuesObserver* observer) override; + const std::string& media_route_provider_extension_id() const { + return media_route_provider_extension_id_; + } + void set_instance_id_for_test(const std::string& instance_id) { instance_id_ = instance_id; } diff --git a/chrome/browser/media/router/media_router_mojo_impl_unittest.cc b/chrome/browser/media/router/media_router_mojo_impl_unittest.cc index c629269..eb51e83 100644 --- a/chrome/browser/media/router/media_router_mojo_impl_unittest.cc +++ b/chrome/browser/media/router/media_router_mojo_impl_unittest.cc @@ -142,7 +142,7 @@ class RegisterMediaRouteProviderHandler { TEST_F(MediaRouterMojoImplTest, CreateRoute) { MediaRoute expected_route(kRouteId, MediaSource(std::string(kSource)), - MediaSink(kSink, kSinkName), "", false); + MediaSink(kSink, kSinkName), "", false, ""); interfaces::MediaRoutePtr route = interfaces::MediaRoute::New(); route->media_source = kSource; route->media_sink = interfaces::MediaSink::New(); @@ -199,7 +199,7 @@ TEST_F(MediaRouterMojoImplTest, CreateRouteFails) { TEST_F(MediaRouterMojoImplTest, JoinRoute) { MediaRoute expected_route(kRouteId, MediaSource(std::string(kSource)), - MediaSink(kSink, kSinkName), "", false); + MediaSink(kSink, kSinkName), "", false, ""); interfaces::MediaRoutePtr route = interfaces::MediaRoute::New(); route->media_source = kSource; route->media_sink = interfaces::MediaSink::New(); @@ -333,10 +333,10 @@ TEST_F(MediaRouterMojoImplTest, RegisterAndUnregisterMediaRoutesObserver) { std::vector<MediaRoute> expected_routes; expected_routes.push_back(MediaRoute(kRouteId, MediaSource(kSource), MediaSink(kSink, kSink), kDescription, - false)); + false, "")); expected_routes.push_back(MediaRoute(kRouteId2, MediaSource(kSource), MediaSink(kSink, kSink), kDescription, - false)); + false, "")); mojo::Array<interfaces::MediaRoutePtr> mojo_routes(2); mojo_routes[0] = interfaces::MediaRoute::New(); diff --git a/chrome/browser/media/router/media_router_type_converters.cc b/chrome/browser/media/router/media_router_type_converters.cc index 0f74c79..c686a0c 100644 --- a/chrome/browser/media/router/media_router_type_converters.cc +++ b/chrome/browser/media/router/media_router_type_converters.cc @@ -33,7 +33,7 @@ TypeConverter<media_router::MediaRoute, MediaRoutePtr>::Convert( return media_router::MediaRoute( input->media_route_id, media_router::MediaSource(input->media_source), input->media_sink.To<media_router::MediaSink>(), input->description, - input->is_local); + input->is_local, input->custom_controller_path); } // static @@ -43,7 +43,7 @@ TypeConverter<scoped_ptr<media_router::MediaRoute>, MediaRoutePtr>::Convert( return make_scoped_ptr(new media_router::MediaRoute( input->media_route_id, media_router::MediaSource(input->media_source), input->media_sink.To<media_router::MediaSink>(), input->description, - input->is_local)); + input->is_local, input->custom_controller_path)); } // static @@ -58,6 +58,7 @@ MediaRoutePtr TypeConverter<MediaRoutePtr, media_router::MediaRoute>::Convert( input.media_sink()); output->description = input.description(); output->is_local = input.is_local(); + output->custom_controller_path = input.custom_controller_path(); return output.Pass(); } diff --git a/chrome/browser/media/router/media_router_type_converters_unittest.cc b/chrome/browser/media/router/media_router_type_converters_unittest.cc index 132445f..ba6989b 100644 --- a/chrome/browser/media/router/media_router_type_converters_unittest.cc +++ b/chrome/browser/media/router/media_router_type_converters_unittest.cc @@ -36,7 +36,7 @@ TEST(MediaRouterTypeConvertersTest, ConvertMediaRoute) { MediaSource expected_source(MediaSourceForTab(123)); MediaRoute expected_media_route("routeId1", expected_source, MediaSink("sinkId", "sinkName"), - "Description", false); + "Description", false, "cast_view.html"); interfaces::MediaRoutePtr expected_mojo_route(interfaces::MediaRoute::New()); expected_mojo_route->media_route_id = "routeId1"; expected_mojo_route->media_source = expected_source.id(); @@ -45,6 +45,7 @@ TEST(MediaRouterTypeConvertersTest, ConvertMediaRoute) { expected_mojo_route->media_sink->name = "sinkName"; expected_mojo_route->description = "Description"; expected_mojo_route->is_local = false; + expected_mojo_route->custom_controller_path = "cast_view.html"; interfaces::MediaRoutePtr mojo_route = mojo::TypeConverter< media_router::interfaces::MediaRoutePtr, @@ -63,12 +64,14 @@ TEST(MediaRouterTypeConvertersTest, ConvertMediaRoute) { EXPECT_EQ(expected_media_route.media_source().id(), media_route.media_source().id()); EXPECT_EQ(expected_media_route.is_local(), media_route.is_local()); + EXPECT_EQ(expected_media_route.custom_controller_path(), + media_route.custom_controller_path()); } TEST(MediaRouterTypeConvertersTest, ConvertMediaRouteWithoutOptionalFields) { MediaRoute expected_media_route("routeId1", MediaSource(), MediaSink("sinkId", "sinkName"), - "Description", false); + "Description", false, ""); interfaces::MediaRoutePtr expected_mojo_route(interfaces::MediaRoute::New()); // MediaRoute::media_source is omitted. expected_mojo_route->media_route_id = "routeId1"; diff --git a/chrome/browser/media/router/presentation_session_state_observer_unittest.cc b/chrome/browser/media/router/presentation_session_state_observer_unittest.cc index 3457020..9f05d26 100644 --- a/chrome/browser/media/router/presentation_session_state_observer_unittest.cc +++ b/chrome/browser/media/router/presentation_session_state_observer_unittest.cc @@ -92,7 +92,7 @@ TEST_F(PresentationSessionStateObserverTest, InvokeCallbackWithDisconnected) { std::vector<MediaRoute> routes; routes.push_back( MediaRoute(route_id, MediaSourceForPresentationUrl(kPresentationUrl), - MediaSink("sinkId", "A sink"), "Description", true)); + MediaSink("sinkId", "A sink"), "Description", true, "")); observer_->OnRoutesUpdated(routes); // New route list does not contain |route_id|, which means it is disconnected. @@ -120,7 +120,7 @@ TEST_F(PresentationSessionStateObserverTest, Reset) { std::vector<MediaRoute> routes; routes.push_back( MediaRoute(route_id, MediaSourceForPresentationUrl(kPresentationUrl), - MediaSink("sinkId", "A sink"), "Description", true)); + MediaSink("sinkId", "A sink"), "Description", true, "")); observer_->OnRoutesUpdated(routes); // |route_id| is no longer being tracked. diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js index 3d81f7d..e9314b3 100644 --- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js +++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js @@ -112,6 +112,15 @@ Polymer({ }, /** + * The ID of the media route provider extension. + * @type {string} + */ + routeProviderExtensionId: { + type: String, + value: '', + }, + + /** * The header text when the cast mode list is shown. * @private {string} */ diff --git a/chrome/browser/resources/media_router/media_router_data.js b/chrome/browser/resources/media_router/media_router_data.js index 4aca017..b6757f5 100644 --- a/chrome/browser/resources/media_router/media_router_data.js +++ b/chrome/browser/resources/media_router/media_router_data.js @@ -86,10 +86,13 @@ cr.define('media_router', function() { * @param {?number} tabId The ID of the tab in which web app is running and * accessing the route. * @param {boolean} isLocal True if this is a locally created route. + * @param {?string} customControllerPath non-empty if this route has custom + * controller. * @constructor * @struct */ - var Route = function(id, sinkId, title, tabId, isLocal) { + var Route = function(id, sinkId, title, tabId, isLocal, + customControllerPath) { /** @type {string} */ this.id = id; @@ -104,6 +107,9 @@ cr.define('media_router', function() { /** @type {boolean} */ this.isLocal = isLocal; + + /** @type {?string} */ + this.customControllerPath = customControllerPath; }; diff --git a/chrome/browser/resources/media_router/media_router_ui_interface.js b/chrome/browser/resources/media_router/media_router_ui_interface.js index f9437116..abfbc9e 100644 --- a/chrome/browser/resources/media_router/media_router_ui_interface.js +++ b/chrome/browser/resources/media_router/media_router_ui_interface.js @@ -49,12 +49,14 @@ cr.define('media_router.ui', function() { * sinks - list of sinks to be displayed. * routes - list of routes that are associated with the sinks. * castModes - list of available cast modes. + * routeProviderExtensionId - the ID of the media route provider extension. */ function setInitialData(data) { container.headerText = data['headerText']; container.sinkList = data['sinks']; container.routeList = data['routes']; container.castModeList = data['castModes']; + container.routeProviderExtensionId = data['routeProviderExtensionId']; } /** diff --git a/chrome/browser/ui/webui/media_router/media_router_ui.cc b/chrome/browser/ui/webui/media_router/media_router_ui.cc index c214dd2..21a43db 100644 --- a/chrome/browser/ui/webui/media_router/media_router_ui.cc +++ b/chrome/browser/ui/webui/media_router/media_router_ui.cc @@ -116,8 +116,8 @@ MediaRouterUI::MediaRouterUI(content::WebUI* web_ui) content::WebContents* wc = web_ui->GetWebContents(); DCHECK(wc); - router_ = MediaRouterFactory::GetApiForBrowserContext( - wc->GetBrowserContext()); + router_ = static_cast<MediaRouterMojoImpl*>( + MediaRouterFactory::GetApiForBrowserContext(wc->GetBrowserContext())); DCHECK(router_); AddLocalizedStrings(html_source.get()); @@ -350,4 +350,8 @@ std::string MediaRouterUI::GetFrameURLHost() const { return GetHostFromURL(frame_url_); } +const std::string& MediaRouterUI::GetRouteProviderExtensionId() const { + return router_->media_route_provider_extension_id(); +} + } // namespace media_router diff --git a/chrome/browser/ui/webui/media_router/media_router_ui.h b/chrome/browser/ui/webui/media_router/media_router_ui.h index e3cf8d1..0451665 100644 --- a/chrome/browser/ui/webui/media_router/media_router_ui.h +++ b/chrome/browser/ui/webui/media_router/media_router_ui.h @@ -32,6 +32,7 @@ class IssuesObserver; class MediaRoute; class MediaRouter; class MediaRouterDialogCallbacks; +class MediaRouterMojoImpl; class MediaRouterWebUIMessageHandler; class MediaRoutesObserver; class MediaSink; @@ -116,6 +117,8 @@ class MediaRouterUI const std::set<MediaCastMode>& cast_modes() const { return cast_modes_; } const content::WebContents* initiator() const { return initiator_; } + const std::string& GetRouteProviderExtensionId() const; + private: class UIIssuesObserver; class UIMediaRoutesObserver; @@ -193,8 +196,8 @@ class MediaRouterUI content::WebContents* initiator_; - // Cached pointer to the MediaRouter for this instance's BrowserContext. - MediaRouter* router_; + // Pointer to the MediaRouter for this instance's BrowserContext. + MediaRouterMojoImpl* router_; // NOTE: Weak pointers must be invalidated before all other member variables. // Therefore |weak_factory_| must be placed at the end. 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 03e9eca..87a139a 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 @@ -62,6 +62,7 @@ scoped_ptr<base::DictionaryValue> RouteToValue(const MediaRoute& route) { dictionary->SetString("sinkId", route.media_sink().id()); dictionary->SetString("title", route.description()); dictionary->SetBoolean("isLocal", route.is_local()); + dictionary->SetString("customControllerPath", route.custom_controller_path()); return dictionary.Pass(); } @@ -231,6 +232,9 @@ void MediaRouterWebUIMessageHandler::OnRequestInitialData( std::string())); initial_data.Set("castModes", cast_modes.release()); + initial_data.SetString("routeProviderExtensionId", + GetMediaRouterUI()->GetRouteProviderExtensionId()); + web_ui()->CallJavascriptFunction(kSetInitialData, initial_data); media_router_ui->UIInitialized(); } diff --git a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc index 105d0a1..eeae49c 100644 --- a/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc +++ b/chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc @@ -73,7 +73,7 @@ TEST_F(MediaRouterWebUIMessageHandlerTest, UpdateRoutes) { std::vector<MediaRoute> routes; routes.push_back(MediaRoute(route_id, MediaSource("mediaSource"), MediaSink(sink_id, "The sink"), description, - is_local)); + is_local, "")); handler_.UpdateRoutes(routes); EXPECT_EQ(1u, web_ui_.call_data().size()); @@ -105,7 +105,7 @@ TEST_F(MediaRouterWebUIMessageHandlerTest, AddRoute) { std::string description("This is a route"); bool is_local = true; MediaRoute route(route_id, MediaSource("mediaSource"), - MediaSink(sink_id, "The sink"), description, is_local); + MediaSink(sink_id, "The sink"), description, is_local, ""); handler_.AddRoute(route); EXPECT_EQ(1u, web_ui_.call_data().size()); diff --git a/extensions/renderer/resources/media_router_bindings.js b/extensions/renderer/resources/media_router_bindings.js index d1dccb6..75d8057 100644 --- a/extensions/renderer/resources/media_router_bindings.js +++ b/extensions/renderer/resources/media_router_bindings.js @@ -50,7 +50,8 @@ define('media_router_bindings', [ }), 'description': route.description, 'icon_url': route.iconUrl, - 'is_local': route.isLocal + 'is_local': route.isLocal, + 'custom_controller_path': route.customControllerPath, }); } |