OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/media/router/media_source_helper.h" | 5 #include "chrome/browser/media/router/media_source_helper.h" |
6 | 6 |
| 7 #include <stdio.h> |
| 8 |
7 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
8 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
9 #include "chrome/browser/media/router/media_source.h" | 11 #include "chrome/browser/media/router/media_source.h" |
| 12 #include "chrome/browser/sessions/session_tab_helper.h" |
10 #include "url/gurl.h" | 13 #include "url/gurl.h" |
11 | 14 |
12 namespace media_router { | 15 namespace media_router { |
13 | 16 |
| 17 namespace { |
| 18 |
14 // Prefixes used to format and detect various protocols' media source URNs. | 19 // Prefixes used to format and detect various protocols' media source URNs. |
15 // See: https://www.ietf.org/rfc/rfc3406.txt | 20 // See: https://www.ietf.org/rfc/rfc3406.txt |
16 const char kTabMediaUrnPrefix[] = "urn:x-org.chromium.media:source:tab"; | 21 constexpr char kTabMediaUrnFormat[] = "urn:x-org.chromium.media:source:tab:%d"; |
17 const char kDesktopMediaUrn[] = "urn:x-org.chromium.media:source:desktop"; | 22 constexpr char kDesktopMediaUrn[] = "urn:x-org.chromium.media:source:desktop"; |
18 const char kCastUrnPrefix[] = "urn:x-com.google.cast:application:"; | 23 constexpr char kCastUrnPrefix[] = "urn:x-com.google.cast:application:"; |
| 24 constexpr char kTabRemotingUrnFormat[] = |
| 25 "urn:x-org.chromium.media:source:tab_content_remoting:%d"; |
| 26 |
| 27 } // namespace |
19 | 28 |
20 MediaSource MediaSourceForTab(int tab_id) { | 29 MediaSource MediaSourceForTab(int tab_id) { |
21 return MediaSource(base::StringPrintf("%s:%d", kTabMediaUrnPrefix, tab_id)); | 30 return MediaSource(base::StringPrintf(kTabMediaUrnFormat, tab_id)); |
| 31 } |
| 32 |
| 33 MediaSource MediaSourceForTabContentRemoting(content::WebContents* contents) { |
| 34 DCHECK(contents); |
| 35 return MediaSource(base::StringPrintf(kTabRemotingUrnFormat, |
| 36 SessionTabHelper::IdForTab(contents))); |
22 } | 37 } |
23 | 38 |
24 MediaSource MediaSourceForDesktop() { | 39 MediaSource MediaSourceForDesktop() { |
25 return MediaSource(std::string(kDesktopMediaUrn)); | 40 return MediaSource(std::string(kDesktopMediaUrn)); |
26 } | 41 } |
27 | 42 |
28 MediaSource MediaSourceForCastApp(const std::string& app_id) { | 43 MediaSource MediaSourceForCastApp(const std::string& app_id) { |
29 return MediaSource(kCastUrnPrefix + app_id); | 44 return MediaSource(kCastUrnPrefix + app_id); |
30 } | 45 } |
31 | 46 |
32 MediaSource MediaSourceForPresentationUrl(const std::string& presentation_url) { | 47 MediaSource MediaSourceForPresentationUrl(const std::string& presentation_url) { |
33 return MediaSource(presentation_url); | 48 return MediaSource(presentation_url); |
34 } | 49 } |
35 | 50 |
36 bool IsDesktopMirroringMediaSource(const MediaSource& source) { | 51 bool IsDesktopMirroringMediaSource(const MediaSource& source) { |
37 return base::StartsWith(source.id(), kDesktopMediaUrn, | 52 return base::StartsWith(source.id(), kDesktopMediaUrn, |
38 base::CompareCase::SENSITIVE); | 53 base::CompareCase::SENSITIVE); |
39 } | 54 } |
40 | 55 |
41 bool IsTabMirroringMediaSource(const MediaSource& source) { | 56 bool IsTabMirroringMediaSource(const MediaSource& source) { |
42 return base::StartsWith(source.id(), kTabMediaUrnPrefix, | 57 int tab_id; |
43 base::CompareCase::SENSITIVE); | 58 return sscanf(source.id().c_str(), kTabMediaUrnFormat, &tab_id) == 1 && |
| 59 tab_id > 0; |
44 } | 60 } |
45 | 61 |
46 bool IsMirroringMediaSource(const MediaSource& source) { | 62 bool IsMirroringMediaSource(const MediaSource& source) { |
47 return IsDesktopMirroringMediaSource(source) || | 63 return IsDesktopMirroringMediaSource(source) || |
48 IsTabMirroringMediaSource(source); | 64 IsTabMirroringMediaSource(source); |
49 } | 65 } |
50 | 66 |
| 67 int TabIdFromMediaSource(const MediaSource& source) { |
| 68 int tab_id; |
| 69 if (sscanf(source.id().c_str(), kTabMediaUrnFormat, &tab_id) == 1) |
| 70 return tab_id; |
| 71 else if (sscanf(source.id().c_str(), kTabRemotingUrnFormat, &tab_id) == 1) |
| 72 return tab_id; |
| 73 else |
| 74 return -1; |
| 75 } |
| 76 |
51 bool IsValidMediaSource(const MediaSource& source) { | 77 bool IsValidMediaSource(const MediaSource& source) { |
52 if (IsMirroringMediaSource(source) || | 78 return (TabIdFromMediaSource(source) > 0 || |
53 base::StartsWith(source.id(), kCastUrnPrefix, | 79 IsDesktopMirroringMediaSource(source) || |
54 base::CompareCase::SENSITIVE)) { | 80 base::StartsWith(source.id(), kCastUrnPrefix, |
55 return true; | 81 base::CompareCase::SENSITIVE) || |
56 } | 82 IsValidPresentationUrl(source.id())); |
57 GURL url(source.id()); | |
58 return url.is_valid() && url.SchemeIsHTTPOrHTTPS(); | |
59 } | 83 } |
60 | 84 |
61 std::string PresentationUrlFromMediaSource(const MediaSource& source) { | 85 std::string PresentationUrlFromMediaSource(const MediaSource& source) { |
62 return IsValidPresentationUrl(source.id()) ? source.id() : ""; | 86 return IsValidPresentationUrl(source.id()) ? source.id() : ""; |
63 } | 87 } |
64 | 88 |
65 bool IsValidPresentationUrl(const std::string& url) { | 89 bool IsValidPresentationUrl(const std::string& url) { |
66 GURL gurl(url); | 90 GURL gurl(url); |
67 return gurl.is_valid() && gurl.SchemeIsHTTPOrHTTPS(); | 91 return gurl.is_valid() && gurl.SchemeIsHTTPOrHTTPS(); |
68 } | 92 } |
69 | 93 |
70 } // namespace media_router | 94 } // namespace media_router |
OLD | NEW |