blob: 2b29b3acd5d85f93da129dca123595532b6b5db1 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview The media source URN related utilities methods.
*/
goog.provide('mr.MediaSourceUtils');
goog.require('mr.Config');
/**
* @param {string} sourceUrn
* @return {boolean} True if it is a mirror URN.
*/
mr.MediaSourceUtils.isMirrorSource = function(sourceUrn) {
return mr.MediaSourceUtils.isTabMirrorSource(sourceUrn) ||
mr.MediaSourceUtils.isDesktopMirrorSource(sourceUrn);
};
/**
* @param {string} sourceUrn
* @return {boolean} True if it is a two UA mode presentation source.
* A presentation source has a sourceUrn that is a valid uri and
* is not a Cast custom receiver app.
*/
mr.MediaSourceUtils.isPresentationSource = function(sourceUrn) {
try {
const url = new URL(sourceUrn);
// Protocol must be http or https.
if (url.protocol != 'http:' && url.protocol != 'https:') {
return false;
}
// Must not be a custom Cast receiver app.
return url.hash.indexOf(mr.MediaSourceUtils.CAST_APP_ID_) == -1;
} catch (err) {
// Invalid URL.
return false;
}
};
/** @const {string} */
mr.MediaSourceUtils.CAST_STREAMING_APP_ID = '0F5096E8';
/** @const {string} */
mr.MediaSourceUtils.TAB_MIRROR_URN_PREFIX =
'urn:x-org.chromium.media:source:tab:';
/** @const {string} */
mr.MediaSourceUtils.TAB_REMOTING_URN_PREFIX =
'urn:x-org.chromium.media:source:tab_content_remoting:';
/** @const {string} */
mr.MediaSourceUtils.DESKTOP_MIRROR_URN =
'urn:x-org.chromium.media:source:desktop';
/** @private @const {string} */
mr.MediaSourceUtils.CAST_APP_ID_ = '__castAppId__';
/**
* @private @const {!Array<string>}
*/
mr.MediaSourceUtils.MIRROR_APP_ID_ORIGIN_WHITELIST_ = [
'https://docs.google.com', // slides
];
/**
* @param {string} sourceUrn
* @return {?Array<string>} array of origins whitelisted for the sourceUrn or
* |null| if any origin is allowed for the sourceUrn.
*/
mr.MediaSourceUtils.getWhitelistedOrigins = function(sourceUrn) {
if (mr.Config.isDebugChannel &&
window.localStorage['debug.allowAllOrigins']) {
return null;
}
return sourceUrn.indexOf(mr.MediaSourceUtils.CAST_STREAMING_APP_ID) != -1 ?
mr.MediaSourceUtils.MIRROR_APP_ID_ORIGIN_WHITELIST_ :
null;
};
/**
* @param {string} sourceUrn
* @return {boolean} True if it is a tab mirror URN.
*/
mr.MediaSourceUtils.isTabMirrorSource = function(sourceUrn) {
return sourceUrn.startsWith(mr.MediaSourceUtils.TAB_MIRROR_URN_PREFIX) ||
sourceUrn.indexOf(mr.MediaSourceUtils.CAST_STREAMING_APP_ID) != -1;
};
/**
* @param {string} sourceUrn
* @return {boolean} True if it is a desktop mirror URN.
*/
mr.MediaSourceUtils.isDesktopMirrorSource = function(sourceUrn) {
return sourceUrn == mr.MediaSourceUtils.DESKTOP_MIRROR_URN;
};
/**
* Get the tab ID from |sourceUrn|. Returns null if the sourceUrn is not a tab
* mirror URN or if it doesn't contain a valid tab ID.
* @param {string} sourceUrn
* @return {?number}
*/
mr.MediaSourceUtils.getMirrorTabId = function(sourceUrn) {
const pos = sourceUrn.search(mr.MediaSourceUtils.TAB_MIRROR_URN_PREFIX);
if (pos == -1) return null;
const tabIdStr =
sourceUrn.substr(pos + mr.MediaSourceUtils.TAB_MIRROR_URN_PREFIX.length);
return parseInt(tabIdStr, 10) || null;
};