summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhaibinlu <haibinlu@chromium.org>2015-07-24 15:44:02 -0700
committerCommit bot <commit-bot@chromium.org>2015-07-24 22:44:43 +0000
commitf580a92a1fff8d909ed301a1286cf510dabb7921 (patch)
treea93e51fd4ffe98a100bcfaa1be1f7fed59239f48
parent8eac6835a8a707c22e99c737c093d047d4a7c7e5 (diff)
downloadchromium_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}
-rw-r--r--chrome/browser/media/router/media_route.cc7
-rw-r--r--chrome/browser/media/router/media_route.h13
-rw-r--r--chrome/browser/media/router/media_route_unittest.cc10
-rw-r--r--chrome/browser/media/router/media_router.mojom4
-rw-r--r--chrome/browser/media/router/media_router_mojo_impl.h4
-rw-r--r--chrome/browser/media/router/media_router_mojo_impl_unittest.cc8
-rw-r--r--chrome/browser/media/router/media_router_type_converters.cc5
-rw-r--r--chrome/browser/media/router/media_router_type_converters_unittest.cc7
-rw-r--r--chrome/browser/media/router/presentation_session_state_observer_unittest.cc4
-rw-r--r--chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js9
-rw-r--r--chrome/browser/resources/media_router/media_router_data.js8
-rw-r--r--chrome/browser/resources/media_router/media_router_ui_interface.js2
-rw-r--r--chrome/browser/ui/webui/media_router/media_router_ui.cc8
-rw-r--r--chrome/browser/ui/webui/media_router/media_router_ui.h7
-rw-r--r--chrome/browser/ui/webui/media_router/media_router_webui_message_handler.cc4
-rw-r--r--chrome/browser/ui/webui/media_router/media_router_webui_message_handler_unittest.cc4
-rw-r--r--extensions/renderer/resources/media_router_bindings.js3
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,
});
}