Index: chrome/browser/media/router/media_source_helper.cc |
diff --git a/chrome/browser/media/router/media_source_helper.cc b/chrome/browser/media/router/media_source_helper.cc |
index 9cf7620fe58bc83fab8aab13a3dcf98356488cba..73517d2c9fb12df6b15bdb9076b6e8e246785647 100644 |
--- a/chrome/browser/media/router/media_source_helper.cc |
+++ b/chrome/browser/media/router/media_source_helper.cc |
@@ -4,21 +4,36 @@ |
#include "chrome/browser/media/router/media_source_helper.h" |
+#include <stdio.h> |
+ |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
#include "chrome/browser/media/router/media_source.h" |
+#include "chrome/browser/sessions/session_tab_helper.h" |
#include "url/gurl.h" |
namespace media_router { |
+namespace { |
+ |
// Prefixes used to format and detect various protocols' media source URNs. |
// See: https://www.ietf.org/rfc/rfc3406.txt |
-const char kTabMediaUrnPrefix[] = "urn:x-org.chromium.media:source:tab"; |
-const char kDesktopMediaUrn[] = "urn:x-org.chromium.media:source:desktop"; |
-const char kCastUrnPrefix[] = "urn:x-com.google.cast:application:"; |
+constexpr char kTabMediaUrnFormat[] = "urn:x-org.chromium.media:source:tab:%d"; |
+constexpr char kDesktopMediaUrn[] = "urn:x-org.chromium.media:source:desktop"; |
+constexpr char kCastUrnPrefix[] = "urn:x-com.google.cast:application:"; |
+constexpr char kTabRemotingUrnFormat[] = |
+ "urn:x-org.chromium.media:source:tab_content_remoting:%d"; |
+ |
+} // namespace |
MediaSource MediaSourceForTab(int tab_id) { |
- return MediaSource(base::StringPrintf("%s:%d", kTabMediaUrnPrefix, tab_id)); |
+ return MediaSource(base::StringPrintf(kTabMediaUrnFormat, tab_id)); |
+} |
+ |
+MediaSource MediaSourceForTabContentRemoting(content::WebContents* contents) { |
+ DCHECK(contents); |
+ return MediaSource(base::StringPrintf(kTabRemotingUrnFormat, |
+ SessionTabHelper::IdForTab(contents))); |
} |
MediaSource MediaSourceForDesktop() { |
@@ -39,8 +54,9 @@ bool IsDesktopMirroringMediaSource(const MediaSource& source) { |
} |
bool IsTabMirroringMediaSource(const MediaSource& source) { |
- return base::StartsWith(source.id(), kTabMediaUrnPrefix, |
- base::CompareCase::SENSITIVE); |
+ int tab_id; |
+ return sscanf(source.id().c_str(), kTabMediaUrnFormat, &tab_id) == 1 && |
+ tab_id > 0; |
} |
bool IsMirroringMediaSource(const MediaSource& source) { |
@@ -48,14 +64,22 @@ bool IsMirroringMediaSource(const MediaSource& source) { |
IsTabMirroringMediaSource(source); |
} |
+int TabIdFromMediaSource(const MediaSource& source) { |
+ int tab_id; |
+ if (sscanf(source.id().c_str(), kTabMediaUrnFormat, &tab_id) == 1) |
+ return tab_id; |
+ else if (sscanf(source.id().c_str(), kTabRemotingUrnFormat, &tab_id) == 1) |
+ return tab_id; |
+ else |
+ return -1; |
+} |
+ |
bool IsValidMediaSource(const MediaSource& source) { |
- if (IsMirroringMediaSource(source) || |
- base::StartsWith(source.id(), kCastUrnPrefix, |
- base::CompareCase::SENSITIVE)) { |
- return true; |
- } |
- GURL url(source.id()); |
- return url.is_valid() && url.SchemeIsHTTPOrHTTPS(); |
+ return (TabIdFromMediaSource(source) > 0 || |
+ IsDesktopMirroringMediaSource(source) || |
+ base::StartsWith(source.id(), kCastUrnPrefix, |
+ base::CompareCase::SENSITIVE) || |
+ IsValidPresentationUrl(source.id())); |
} |
std::string PresentationUrlFromMediaSource(const MediaSource& source) { |