summaryrefslogtreecommitdiffstats
path: root/dom/media/PeerConnection.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/PeerConnection.sys.mjs')
-rw-r--r--dom/media/PeerConnection.sys.mjs139
1 files changed, 80 insertions, 59 deletions
diff --git a/dom/media/PeerConnection.sys.mjs b/dom/media/PeerConnection.sys.mjs
index 1bebde8159..00b4023c2f 100644
--- a/dom/media/PeerConnection.sys.mjs
+++ b/dom/media/PeerConnection.sys.mjs
@@ -24,7 +24,7 @@ const PC_COREQUEST_CID = Components.ID(
"{74b2122d-65a8-4824-aa9e-3d664cb75dc2}"
);
-function logMsg(msg, file, line, flag, winID) {
+function logWebRTCMsg(msg, file, line, flag, win) {
let scriptErrorClass = Cc["@mozilla.org/scripterror;1"];
let scriptError = scriptErrorClass.createInstance(Ci.nsIScriptError);
scriptError.initWithWindowID(
@@ -35,9 +35,14 @@ function logMsg(msg, file, line, flag, winID) {
0,
flag,
"content javascript",
- winID
+ win.windowGlobalChild.innerWindowId
);
Services.console.logMessage(scriptError);
+ if (
+ Services.prefs.getBoolPref("media.peerconnection.treat_warnings_as_errors")
+ ) {
+ throw new win.TypeError(msg);
+ }
}
let setupPrototype = (_class, dict) => {
@@ -100,7 +105,7 @@ export class GlobalPCList {
if (this._list[winID] === undefined) {
return;
}
- this._list[winID] = this._list[winID].filter(function (e, i, a) {
+ this._list[winID] = this._list[winID].filter(function (e) {
return e.get() !== null;
});
@@ -237,14 +242,12 @@ export class RTCSessionDescription {
init(win) {
this._win = win;
this._winID = this._win.windowGlobalChild.innerWindowId;
+ this._legacyPref = Services.prefs.getBoolPref(
+ "media.peerconnection.description.legacy.enabled"
+ );
}
__init({ type, sdp }) {
- if (!type) {
- throw new this._win.TypeError(
- "Missing required 'type' member of RTCSessionDescriptionInit"
- );
- }
Object.assign(this, { _type: type, _sdp: sdp });
}
@@ -252,6 +255,10 @@ export class RTCSessionDescription {
return this._type;
}
set type(type) {
+ if (!this._legacyPref) {
+ // TODO: this throws even in sloppy mode. Remove in bug 1883992
+ throw new this._win.TypeError("setting getter-only property type");
+ }
this.warn();
this._type = type;
}
@@ -260,6 +267,10 @@ export class RTCSessionDescription {
return this._sdp;
}
set sdp(sdp) {
+ if (!this._legacyPref) {
+ // TODO: this throws even in sloppy mode. Remove in bug 1883992
+ throw new this._win.TypeError("setting getter-only property sdp");
+ }
this.warn();
this._sdp = sdp;
}
@@ -267,23 +278,26 @@ export class RTCSessionDescription {
warn() {
if (!this._warned) {
// Warn once per RTCSessionDescription about deprecated writable usage.
- this.logWarning(
- "RTCSessionDescription's members are readonly! " +
- "Writing to them is deprecated and will break soon!"
- );
+ if (this._legacyPref) {
+ this.logMsg(
+ "RTCSessionDescription's members are readonly! " +
+ "Writing to them is deprecated and will break soon!",
+ Ci.nsIScriptError.warningFlag
+ );
+ } else {
+ this.logMsg(
+ "RTCSessionDescription's members are readonly! " +
+ "Writing to them no longer works!",
+ Ci.nsIScriptError.errorFlag
+ );
+ }
this._warned = true;
}
}
- logWarning(msg) {
+ logMsg(msg, flag) {
let err = this._win.Error();
- logMsg(
- msg,
- err.fileName,
- err.lineNumber,
- Ci.nsIScriptError.warningFlag,
- this._winID
- );
+ logWebRTCMsg(msg, err.fileName, err.lineNumber, flag, this._win);
}
}
@@ -350,6 +364,13 @@ export class RTCPeerConnection {
constructor() {
this._pc = null;
this._closed = false;
+ this._pendingLocalDescription = null;
+ this._pendingRemoteDescription = null;
+ this._currentLocalDescription = null;
+ this._currentRemoteDescription = null;
+ this._legacyPref = Services.prefs.getBoolPref(
+ "media.peerconnection.description.legacy.enabled"
+ );
// http://rtcweb-wg.github.io/jsep/#rfc.section.4.1.9
// canTrickle == null means unknown; when a remote description is received it
@@ -723,7 +744,7 @@ export class RTCPeerConnection {
}
};
- var stunServers = 0;
+ let stunServers = 0;
iceServers.forEach(({ urls, username, credential, credentialType }) => {
if (!urls) {
@@ -788,11 +809,7 @@ export class RTCPeerConnection {
}
if (stunServers >= 5) {
this.logError(
- "Using five or more STUN/TURN servers causes problems"
- );
- } else if (stunServers > 2) {
- this.logWarning(
- "Using more than two STUN/TURN servers slows down discovery"
+ "Using five or more STUN/TURN servers slows down discovery"
);
}
});
@@ -861,7 +878,7 @@ export class RTCPeerConnection {
}
logMsg(msg, file, line, flag) {
- return logMsg(msg, file, line, flag, this._winID);
+ return logWebRTCMsg(msg, file, line, flag, this._win);
}
getEH(type) {
@@ -996,7 +1013,7 @@ export class RTCPeerConnection {
return this._async(() => this._createAnswer(optionsOrOnSucc));
}
- _createAnswer(options) {
+ _createAnswer() {
this._checkClosed();
return this._chain(() => this._createAnAnswer());
}
@@ -1192,11 +1209,6 @@ export class RTCPeerConnection {
}
_setRemoteDescription({ type, sdp }) {
- if (!type) {
- throw new this._win.TypeError(
- "Missing required 'type' member of RTCSessionDescriptionInit"
- );
- }
if (type == "pranswer") {
throw new this._win.DOMException(
"pranswer not yet implemented",
@@ -1541,24 +1553,36 @@ export class RTCPeerConnection {
return this.pendingLocalDescription || this.currentLocalDescription;
}
+ cacheDescription(name, type, sdp) {
+ if (
+ !this[name] ||
+ this[name].type != type ||
+ this[name].sdp != sdp ||
+ this._legacyPref
+ ) {
+ this[name] = sdp.length
+ ? new this._win.RTCSessionDescription({ type, sdp })
+ : null;
+ }
+ return this[name];
+ }
+
get currentLocalDescription() {
this._checkClosed();
- const sdp = this._pc.currentLocalDescription;
- if (!sdp.length) {
- return null;
- }
- const type = this._pc.currentOfferer ? "offer" : "answer";
- return new this._win.RTCSessionDescription({ type, sdp });
+ return this.cacheDescription(
+ "_currentLocalDescription",
+ this._pc.currentOfferer ? "offer" : "answer",
+ this._pc.currentLocalDescription
+ );
}
get pendingLocalDescription() {
this._checkClosed();
- const sdp = this._pc.pendingLocalDescription;
- if (!sdp.length) {
- return null;
- }
- const type = this._pc.pendingOfferer ? "offer" : "answer";
- return new this._win.RTCSessionDescription({ type, sdp });
+ return this.cacheDescription(
+ "_pendingLocalDescription",
+ this._pc.pendingOfferer ? "offer" : "answer",
+ this._pc.pendingLocalDescription
+ );
}
get remoteDescription() {
@@ -1567,22 +1591,20 @@ export class RTCPeerConnection {
get currentRemoteDescription() {
this._checkClosed();
- const sdp = this._pc.currentRemoteDescription;
- if (!sdp.length) {
- return null;
- }
- const type = this._pc.currentOfferer ? "answer" : "offer";
- return new this._win.RTCSessionDescription({ type, sdp });
+ return this.cacheDescription(
+ "_currentRemoteDescription",
+ this._pc.currentOfferer ? "answer" : "offer",
+ this._pc.currentRemoteDescription
+ );
}
get pendingRemoteDescription() {
this._checkClosed();
- const sdp = this._pc.pendingRemoteDescription;
- if (!sdp.length) {
- return null;
- }
- const type = this._pc.pendingOfferer ? "answer" : "offer";
- return new this._win.RTCSessionDescription({ type, sdp });
+ return this.cacheDescription(
+ "_pendingRemoteDescription",
+ this._pc.pendingOfferer ? "answer" : "offer",
+ this._pc.pendingRemoteDescription
+ );
}
get peerIdentity() {
@@ -1918,8 +1940,7 @@ export class PeerConnectionObserver {
switch (state) {
case "IceConnectionState":
- let connState = this._dompc._pc.iceConnectionState;
- this.handleIceConnectionStateChange(connState);
+ this.handleIceConnectionStateChange(this._dompc._pc.iceConnectionState);
break;
case "IceGatheringState":