Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 0 additions & 31 deletions src/extension/screen-sharing-chrome-extension/manifest.json

This file was deleted.

36 changes: 0 additions & 36 deletions src/extension/screen-sharing-chrome-extension/script.js

This file was deleted.

Binary file not shown.
Binary file not shown.
Binary file not shown.
173 changes: 53 additions & 120 deletions src/sdk/base/mediastream-factory.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export class VideoTrackConstraints {
// eslint-disable-next-line require-jsdoc
constructor(source) {
if (!Object.values(MediaFormatModule.VideoSourceInfo)
.some((v) => v === source)) {
.some((v) => v === source)) {
throw new TypeError('Invalid source.');
}
/**
Expand Down Expand Up @@ -94,7 +94,6 @@ export class VideoTrackConstraints {
* @constructor
* @param {?Owt.Base.AudioTrackConstraints} audioConstraints
* @param {?Owt.Base.VideoTrackConstraints} videoConstraints
* @param {?string} extensionId The ID of Chrome screen sharing extension.
*/
export class StreamConstraints {
// eslint-disable-next-line require-jsdoc
Expand All @@ -111,19 +110,13 @@ export class StreamConstraints {
* @instance
*/
this.video = videoConstraints;
/**
* @member {string} extensionId
* @memberof Owt.Base.MediaStreamDeviceConstraints
* @desc The ID of Chrome Extension for screen sharing.
* @instance
*/
}
}

// eslint-disable-next-line require-jsdoc
function isVideoConstrainsForScreenCast(constraints) {
return (typeof constraints.video === 'object' && constraints.video.source ===
MediaFormatModule.VideoSourceInfo.SCREENCAST);
MediaFormatModule.VideoSourceInfo.SCREENCAST);
}

/**
Expand Down Expand Up @@ -170,123 +163,63 @@ export class MediaStreamFactory {
'Cannot capture video from screen cast while capture audio from'
+ ' other source.'));
}
// Screen sharing on Chrome does not work with the latest constraints
// format.
if (isVideoConstrainsForScreenCast(constraints) && utils.isChrome()) {
if (!constraints.extensionId) {
return Promise.reject(new TypeError(
'Extension ID must be specified for screen sharing on Chrome.'));
}
const desktopCaptureSources = ['screen', 'window', 'tab'];
if (constraints.audio) {
desktopCaptureSources.push('audio');

// Check and convert constraints.
if (!constraints.audio && !constraints.video) {
return Promise.reject(new TypeError(
'At least one of audio and video must be requested.'));
}
const mediaConstraints = Object.create({});
if (typeof constraints.audio === 'object' &&
constraints.audio.source === MediaFormatModule.AudioSourceInfo.MIC) {
mediaConstraints.audio = Object.create({});
if (utils.isEdge()) {
mediaConstraints.audio.deviceId = constraints.audio.deviceId;
} else {
mediaConstraints.audio.deviceId = {
exact: constraints.audio.deviceId,
};
}
return new Promise((resolve, reject) => {
chrome.runtime.sendMessage(
constraints.extensionId, {
getStream: desktopCaptureSources,
},
function(response) {
if (response === undefined) {
return reject(new Error(chrome.runtime.lastError.message));
}
if (constraints.audio && typeof response.options !== 'object') {
Logger.warning(
'Desktop sharing with audio requires the latest Chrome' +
' extension. Your audio constraints will be ignored.');
}
const mediaConstraints = Object.create({});
if (constraints.audio && (typeof response.options === 'object')) {
if (response.options.canRequestAudioTrack) {
mediaConstraints.audio = {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: response.streamId,
},
};
} else {
Logger.warning(
'Sharing screen with audio was not selected by user.');
}
}
mediaConstraints.video = Object.create({});
mediaConstraints.video.mandatory = Object.create({});
mediaConstraints.video.mandatory.chromeMediaSource = 'desktop';
mediaConstraints.video.mandatory.chromeMediaSourceId =
response.streamId;
// Transform new constraint format to the old style. Because
// chromeMediaSource only supported in the old style, and mix new
// and old style will result type error: "Cannot use both
// optional/mandatory and specific or advanced constraints.".
if (constraints.video.resolution) {
mediaConstraints.video.mandatory.maxHeight =
mediaConstraints.video.mandatory.minHeight =
constraints.video.resolution.height;
mediaConstraints.video.mandatory.maxWidth =
mediaConstraints.video.mandatory.minWidth =
constraints.video.resolution.width;
}
if (constraints.video.frameRate) {
mediaConstraints.video.mandatory.minFrameRate =
constraints.video.frameRate;
mediaConstraints.video.mandatory.maxFrameRate =
constraints.video.frameRate;
}
resolve(navigator.mediaDevices.getUserMedia(mediaConstraints));
});
});
} else {
if (!constraints.audio && !constraints.video) {
return Promise.reject(new TypeError(
'At least one of audio and video must be requested.'));
mediaConstraints.audio = constraints.audio;
}
if (typeof constraints.audio === 'object' &&
constraints.audio.source ===
MediaFormatModule.AudioSourceInfo.SCREENCAST) {
Logger.warning(
'Screen sharing with audio is not supported in Firefox.');
mediaConstraints.audio = false;
}
if (typeof constraints.video === 'object') {
mediaConstraints.video = Object.create({});
if (typeof constraints.video.frameRate === 'number') {
mediaConstraints.video.frameRate = constraints.video.frameRate;
}
const mediaConstraints = Object.create({});
if (typeof constraints.audio === 'object' &&
constraints.audio.source === MediaFormatModule.AudioSourceInfo.MIC) {
mediaConstraints.audio = Object.create({});
if (utils.isEdge()) {
mediaConstraints.audio.deviceId = constraints.audio.deviceId;
} else {
mediaConstraints.audio.deviceId = {
exact: constraints.audio.deviceId,
};
}
} else {
mediaConstraints.audio = constraints.audio;
if (constraints.video.resolution &&
constraints.video.resolution.width &&
constraints.video.resolution.height) {
mediaConstraints.video.width = Object.create({});
mediaConstraints.video.width.exact =
constraints.video.resolution.width;
mediaConstraints.video.height = Object.create({});
mediaConstraints.video.height.exact =
constraints.video.resolution.height;
}
if (typeof constraints.audio === 'object' &&
constraints.audio.source ===
MediaFormatModule.AudioSourceInfo.SCREENCAST) {
Logger.warning(
'Screen sharing with audio is not supported in Firefox.');
mediaConstraints.audio = false;
if (typeof constraints.video.deviceId === 'string') {
mediaConstraints.video.deviceId = { exact: constraints.video.deviceId };
}
if (typeof constraints.video === 'object') {
mediaConstraints.video = Object.create({});
if (typeof constraints.video.frameRate === 'number') {
mediaConstraints.video.frameRate = constraints.video.frameRate;
}
if (constraints.video.resolution &&
constraints.video.resolution.width &&
constraints.video.resolution.height) {
mediaConstraints.video.width = Object.create({});
mediaConstraints.video.width.exact =
constraints.video.resolution.width;
mediaConstraints.video.height = Object.create({});
mediaConstraints.video.height.exact =
constraints.video.resolution.height;
}
if (typeof constraints.video.deviceId === 'string') {
mediaConstraints.video.deviceId = {exact: constraints.video.deviceId};
}
if (utils.isFirefox() &&
constraints.video.source ===
MediaFormatModule.VideoSourceInfo.SCREENCAST) {
mediaConstraints.video.mediaSource = 'screen';
}
} else {
mediaConstraints.video = constraints.video;
if (utils.isFirefox() &&
constraints.video.source ===
MediaFormatModule.VideoSourceInfo.SCREENCAST) {
mediaConstraints.video.mediaSource = 'screen';
}
} else {
mediaConstraints.video = constraints.video;
}

if (isVideoConstrainsForScreenCast(constraints)) {
return navigator.mediaDevices.getDisplayMedia(mediaConstraints);
} else {
return navigator.mediaDevices.getUserMedia(mediaConstraints);
}
}
Expand Down