summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhaibinlu <haibinlu@chromium.org>2015-06-25 19:35:17 -0700
committerCommit bot <commit-bot@chromium.org>2015-06-26 02:36:00 +0000
commit2a5675a6315369246d50ee9c74d5f6376c3240d8 (patch)
tree6557def6502847c88221d078a08aa0c782a7a289
parentfca25ba372bc2d5f8309dd9db837779b7faaffdd (diff)
downloadchromium_src-2a5675a6315369246d50ee9c74d5f6376c3240d8.zip
chromium_src-2a5675a6315369246d50ee9c74d5f6376c3240d8.tar.gz
chromium_src-2a5675a6315369246d50ee9c74d5f6376c3240d8.tar.bz2
Gets presentation ID from route ID upon route creation, and overrides previous presentation ID with this final ID.
This is a quick fix to get presentation ID to web app before we overhaul route/sink/source URN format. With https://codereview.chromium.org/1199933006/, https://codereview.chromium.org/1209473003/ and this CL, send/receive message works end to end. Review URL: https://codereview.chromium.org/1202963004 Cr-Commit-Position: refs/heads/master@{#336326}
-rw-r--r--chrome/browser/media/router/create_session_request.cc6
-rw-r--r--chrome/browser/media/router/create_session_request_unittest.cc8
-rw-r--r--chrome/browser/media/router/media_route.cc37
-rw-r--r--chrome/browser/media/router/media_route.h5
-rw-r--r--chrome/browser/media/router/media_route_unittest.cc32
-rw-r--r--chrome/browser/media/router/media_router_mojo_impl.cc6
-rw-r--r--chrome/browser/media/router/presentation_service_delegate_impl.cc5
-rw-r--r--content/browser/presentation/presentation_service_impl.cc15
-rw-r--r--content/renderer/presentation/presentation_dispatcher.cc6
-rw-r--r--extensions/renderer/resources/media_router_bindings.js12
10 files changed, 103 insertions, 29 deletions
diff --git a/chrome/browser/media/router/create_session_request.cc b/chrome/browser/media/router/create_session_request.cc
index faed210..c9516cd 100644
--- a/chrome/browser/media/router/create_session_request.cc
+++ b/chrome/browser/media/router/create_session_request.cc
@@ -31,7 +31,11 @@ CreateSessionRequest::~CreateSessionRequest() {
void CreateSessionRequest::MaybeInvokeSuccessCallback(
const MediaRoute::Id& route_id) {
if (!cb_invoked_) {
- success_cb_.Run(presentation_info_, route_id);
+ // Overwrite presentation ID.
+ success_cb_.Run(content::PresentationSessionInfo(
+ presentation_info_.presentation_url,
+ GetPresentationIdAndUrl(route_id).first),
+ route_id);
cb_invoked_ = true;
}
}
diff --git a/chrome/browser/media/router/create_session_request_unittest.cc b/chrome/browser/media/router/create_session_request_unittest.cc
index 8e8590b..322beac 100644
--- a/chrome/browser/media/router/create_session_request_unittest.cc
+++ b/chrome/browser/media/router/create_session_request_unittest.cc
@@ -12,8 +12,10 @@ namespace media_router {
namespace {
-const char kPresentationUrl[] = "http://fooUrl";
+const char kPresentationUrl[] = "http://foo.com";
const char kPresentationId[] = "presentationId";
+const char kRouteId[] =
+ "urn:x-org.chromium:media:route:presentationId/cast-sink1/http://foo.com";
} // namespace
@@ -79,7 +81,7 @@ TEST_F(CreateSessionRequestTest, SuccessCallback) {
session_info),
base::Bind(&CreateSessionRequestTest::FailOnError,
base::Unretained(this)));
- context.MaybeInvokeSuccessCallback("routeid");
+ context.MaybeInvokeSuccessCallback(kRouteId);
// No-op since success callback is already invoked.
context.MaybeInvokeErrorCallback(content::PresentationError(
content::PRESENTATION_ERROR_NO_AVAILABLE_SCREENS, "Error message"));
@@ -101,7 +103,7 @@ TEST_F(CreateSessionRequestTest, ErrorCallback) {
error));
context.MaybeInvokeErrorCallback(error);
// No-op since error callback is already invoked.
- context.MaybeInvokeSuccessCallback("routeid");
+ context.MaybeInvokeSuccessCallback(kRouteId);
EXPECT_TRUE(cb_invoked_);
}
diff --git a/chrome/browser/media/router/media_route.cc b/chrome/browser/media/router/media_route.cc
index 0aa126f..3defca4 100644
--- a/chrome/browser/media/router/media_route.cc
+++ b/chrome/browser/media/router/media_route.cc
@@ -7,6 +7,10 @@
#include "base/logging.h"
#include "chrome/browser/media/router/media_source.h"
+namespace {
+const char kRouteUrnPrefix[] = "urn:x-org.chromium:media:route:";
+}
+
namespace media_router {
MediaRoute::MediaRoute(const MediaRoute::Id& media_route_id,
@@ -29,4 +33,37 @@ bool MediaRoute::Equals(const MediaRoute& other) const {
return media_route_id_ == other.media_route_id_;
}
+// <route-id> =
+// urn:x-org.chromium:media:route:<presentation-id>/<sink>/<source>
+// <source> = <url>|<capture-source>
+// <sink> = <provider-name>-<sink-id>
+std::pair<std::string, std::string> GetPresentationIdAndUrl(
+ const MediaRoute::Id& id) {
+ if (id.find(kRouteUrnPrefix) != 0) {
+ LOG(ERROR) << "Invalid media route ID. Expecting prefix "
+ << kRouteUrnPrefix;
+ return std::make_pair(std::string(), std::string());
+ }
+ size_t prefix_len = arraysize(kRouteUrnPrefix) - 1;
+ size_t first_delim = id.find("/");
+ if (first_delim == std::string::npos || first_delim == prefix_len) {
+ LOG(ERROR) << "Invalid media route ID. Expecting presentation ID.";
+ return std::make_pair(std::string(), std::string());
+ }
+
+ std::string presentation_id = id.substr(prefix_len, first_delim - prefix_len);
+ size_t second_delim = id.find("/", first_delim + 1);
+ if (second_delim == std::string::npos || second_delim == first_delim + 1) {
+ LOG(ERROR) << "Invalid media route ID. Expecting sink.";
+ return std::make_pair(std::string(), std::string());
+ }
+
+ if (second_delim == id.size() - 1) {
+ LOG(ERROR) << "Invalid media route ID. Expecting source.";
+ return std::make_pair(std::string(), std::string());
+ }
+ std::string source = id.substr(second_delim + 1);
+ return std::make_pair(presentation_id, source);
+}
+
} // namespace media_router
diff --git a/chrome/browser/media/router/media_route.h b/chrome/browser/media/router/media_route.h
index e8d270a..8e47ee3 100644
--- a/chrome/browser/media/router/media_route.h
+++ b/chrome/browser/media/router/media_route.h
@@ -79,6 +79,11 @@ class MediaRoute {
MediaRouteState state_;
};
+// Return a pair of Presentation ID and URL. If the input route ID is invalid,
+// a pair of empty strings is returned.
+std::pair<std::string, std::string> GetPresentationIdAndUrl(
+ const MediaRoute::Id& id);
+
} // namespace media_router
#endif // CHROME_BROWSER_MEDIA_ROUTER_MEDIA_ROUTE_H_
diff --git a/chrome/browser/media/router/media_route_unittest.cc b/chrome/browser/media/router/media_route_unittest.cc
index e52b075..31f221d 100644
--- a/chrome/browser/media/router/media_route_unittest.cc
+++ b/chrome/browser/media/router/media_route_unittest.cc
@@ -7,34 +7,56 @@
#include "chrome/browser/media/router/media_source_helper.h"
#include "testing/gmock/include/gmock/gmock.h"
+namespace {
+const char kRouteId1[] =
+ "urn:x-org.chromium:media:route:1/cast-sink1/http://foo.com";
+const char kRouteId2[] =
+ "urn:x-org.chromium:media:route:2/cast-sink2/http://foo.com";
+} // namespace
+
namespace media_router {
// Tests the == operator to ensure that only route ID equality is being checked.
TEST(MediaRouteTest, Equals) {
- MediaRoute route1("routeId1", MediaSourceForCastApp("DialApp"),
+ MediaRoute route1(kRouteId1, MediaSourceForCastApp("DialApp"),
MediaSink("sinkId", "sinkName"), "Description", false);
// Same as route1 with different sink ID.
- MediaRoute route2("routeId1", MediaSourceForCastApp("DialApp"),
+ MediaRoute route2(kRouteId1, MediaSourceForCastApp("DialApp"),
MediaSink("differentSinkId", "different sink"),
"Description", false);
EXPECT_TRUE(route1.Equals(route2));
// Same as route1 with different description.
- MediaRoute route3("routeId1", MediaSourceForCastApp("DialApp"),
+ MediaRoute route3(kRouteId1, MediaSourceForCastApp("DialApp"),
MediaSink("sinkId", "sinkName"), "differentDescription",
false);
EXPECT_TRUE(route1.Equals(route3));
// Same as route1 with different is_local.
- MediaRoute route4("routeId1", MediaSourceForCastApp("DialApp"),
+ MediaRoute route4(kRouteId1, MediaSourceForCastApp("DialApp"),
MediaSink("sinkId", "sinkName"), "Description", true);
EXPECT_TRUE(route1.Equals(route4));
// The ID is different from route1's.
- MediaRoute route5("routeId2", MediaSourceForCastApp("DialApp"),
+ MediaRoute route5(kRouteId2, MediaSourceForCastApp("DialApp"),
MediaSink("sinkId", "sinkName"), "Description", false);
EXPECT_FALSE(route1.Equals(route5));
}
+TEST(MediaRouteTest, ParseId) {
+ EXPECT_EQ("1", GetPresentationIdAndUrl(kRouteId1).first);
+ EXPECT_EQ("http://foo.com", GetPresentationIdAndUrl(kRouteId1).second);
+ auto invalid = std::make_pair(std::string(), std::string());
+ EXPECT_EQ(invalid, GetPresentationIdAndUrl("invalid"));
+ EXPECT_EQ(invalid, GetPresentationIdAndUrl(
+ "urn:x-org.chromium:media:route:2"));
+ EXPECT_EQ(invalid, GetPresentationIdAndUrl(
+ "urn:x-org.chromium:media:route:2/"));
+ EXPECT_EQ(invalid, GetPresentationIdAndUrl(
+ "urn:x-org.chromium:media:route:2/cast-sink2/"));
+ EXPECT_EQ(invalid, GetPresentationIdAndUrl(
+ "urn:x-org.chromium:media:route:2//http://foo.com"));
+}
+
} // namespace media_router
diff --git a/chrome/browser/media/router/media_router_mojo_impl.cc b/chrome/browser/media/router/media_router_mojo_impl.cc
index ffadab0..b1b2e05 100644
--- a/chrome/browser/media/router/media_router_mojo_impl.cc
+++ b/chrome/browser/media/router/media_router_mojo_impl.cc
@@ -49,9 +49,9 @@ void EventPageWakeComplete(bool success) {
scoped_ptr<content::PresentationSessionMessage>
ConvertToPresentationSessionMessage(interfaces::RouteMessagePtr input) {
DCHECK(!input.is_null());
- // TODO(haibinlu): get presentation_url&id from route_id
- std::string presentation_url;
- std::string presentation_id;
+ const auto& id_and_url = GetPresentationIdAndUrl(input->route_id);
+ const std::string& presentation_id = id_and_url.first;
+ const std::string& presentation_url = id_and_url.second;
scoped_ptr<content::PresentationSessionMessage> output;
switch (input->type) {
case interfaces::RouteMessage::Type::TYPE_TEXT: {
diff --git a/chrome/browser/media/router/presentation_service_delegate_impl.cc b/chrome/browser/media/router/presentation_service_delegate_impl.cc
index 46649ae..d49c6f1 100644
--- a/chrome/browser/media/router/presentation_service_delegate_impl.cc
+++ b/chrome/browser/media/router/presentation_service_delegate_impl.cc
@@ -666,9 +666,8 @@ void PresentationServiceDelegateImpl::OnRouteCreated(const MediaRoute& route) {
if (!main_frame)
return;
RenderFrameHostId render_frame_host_id(GetRenderFrameHostId(main_frame));
- // TODO(imcheng): Pass in valid default presentation ID once it is
- // available from MediaRoute URN. BUG=493365
- std::string presentation_id;
+ std::string presentation_id =
+ GetPresentationIdAndUrl(route.media_route_id()).first;
frame_manager_->OnPresentationSessionStarted(
render_frame_host_id, true,
content::PresentationSessionInfo(PresentationUrlFromMediaSource(source),
diff --git a/content/browser/presentation/presentation_service_impl.cc b/content/browser/presentation/presentation_service_impl.cc
index f387097..6546c60 100644
--- a/content/browser/presentation/presentation_service_impl.cc
+++ b/content/browser/presentation/presentation_service_impl.cc
@@ -457,18 +457,23 @@ void PresentationServiceImpl::ListenForSessionMessages(
void PresentationServiceImpl::OnSessionMessages(
scoped_ptr<ScopedVector<PresentationSessionMessage>> messages) {
- DCHECK(messages.get() && !messages->empty());
if (!on_session_messages_callback_.get()) {
// The Reset method of this class was invoked.
return;
}
- mojo::Array<presentation::SessionMessagePtr> mojoMessages(messages->size());
- for (size_t i = 0; i < messages->size(); ++i) {
- mojoMessages[i] = ToMojoSessionMessage((*messages)[i]);
+ if (!messages.get() || messages->empty()) {
+ // Error handling. Session is either closed or in error state.
+ on_session_messages_callback_->Run(
+ mojo::Array<presentation::SessionMessagePtr>());
+ } else {
+ mojo::Array<presentation::SessionMessagePtr> mojoMessages(messages->size());
+ for (size_t i = 0; i < messages->size(); ++i) {
+ mojoMessages[i] = ToMojoSessionMessage((*messages)[i]);
+ }
+ on_session_messages_callback_->Run(mojoMessages.Pass());
}
- on_session_messages_callback_->Run(mojoMessages.Pass());
on_session_messages_callback_.reset();
}
diff --git a/content/renderer/presentation/presentation_dispatcher.cc b/content/renderer/presentation/presentation_dispatcher.cc
index 8100c03..2390967 100644
--- a/content/renderer/presentation/presentation_dispatcher.cc
+++ b/content/renderer/presentation/presentation_dispatcher.cc
@@ -344,6 +344,9 @@ void PresentationDispatcher::OnSessionCreated(
DCHECK(!session_info.is_null());
callback->onSuccess(new PresentationSessionClient(session_info.Pass()));
+ presentation_service_->ListenForSessionMessages(
+ base::Bind(&PresentationDispatcher::OnSessionMessagesReceived,
+ base::Unretained(this)));
}
void PresentationDispatcher::OnSessionStateChange(
@@ -404,9 +407,6 @@ void PresentationDispatcher::ConnectToPresentationServiceIfNeeded() {
presentation_service_->ListenForSessionStateChange(base::Bind(
&PresentationDispatcher::OnSessionStateChange,
base::Unretained(this)));
- presentation_service_->ListenForSessionMessages(
- base::Bind(&PresentationDispatcher::OnSessionMessagesReceived,
- base::Unretained(this)));
*/
}
diff --git a/extensions/renderer/resources/media_router_bindings.js b/extensions/renderer/resources/media_router_bindings.js
index ade2ee8..eb0d355 100644
--- a/extensions/renderer/resources/media_router_bindings.js
+++ b/extensions/renderer/resources/media_router_bindings.js
@@ -63,13 +63,13 @@ define('media_router_bindings', [
if ("string" == typeof message.message) {
return new mediaRouterMojom.RouteMessage({
'route_id': message.routeId,
- 'type': RouteMessage.Type.TEXT,
+ 'type': mediaRouterMojom.RouteMessage.Type.TEXT,
'message': message.message,
});
} else {
return new mediaRouterMojom.RouteMessage({
'route_id': message.routeId,
- 'type': RouteMessage.Type.BINARY,
+ 'type': mediaRouterMojom.RouteMessage.Type.BINARY,
'data': message.message,
});
}
@@ -470,7 +470,7 @@ define('media_router_bindings', [
*/
MediaRouteProvider.prototype.sendRouteMessage = function(
routeId, message) {
- this.handlers_.sendRouteMessage(routeId, message)
+ return this.handlers_.sendRouteMessage(routeId, message)
.then(function() {
return true;
}, function() {
@@ -485,11 +485,11 @@ define('media_router_bindings', [
* an empty list if an error occurred.
*/
MediaRouteProvider.prototype.listenForRouteMessages = function(routeIds) {
- this.handlers_.listenForRouteMessages(routeIds)
+ return this.handlers_.listenForRouteMessages(routeIds)
.then(function(messages) {
- return messages.map(messageToMojo_);
+ return {'messages': messages.map(messageToMojo_)};
}, function() {
- return [];
+ return {'messages': []};
});
};