| 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 |