Index: inject.preload.js |
diff --git a/inject.preload.js b/inject.preload.js |
index 109f31ab1f88b79f5e3ef5d5d34423e8ed7e53aa..8c1e312cdc4cd17fe800810dd2157f2e3e472457 100644 |
--- a/inject.preload.js |
+++ b/inject.preload.js |
@@ -225,167 +225,174 @@ function injected(eventName, injectedIntoContentWindow) |
*/ |
let RealRTCPeerConnection = window.RTCPeerConnection || |
window.webkitRTCPeerConnection; |
- let closeRTCPeerConnection = Function.prototype.call.bind( |
- RealRTCPeerConnection.prototype.close |
- ); |
- let RealArray = Array; |
- let RealString = String; |
- let {create: createObject, defineProperty} = Object; |
- |
- function normalizeUrl(url) |
- { |
- if (typeof url != "undefined") |
- return RealString(url); |
- } |
- function safeCopyArray(originalArray, transform) |
+ // Firefox has the option (media.peerconnection.enabled) to disable WebRTC |
+ // in which case RealRTCPeerConnection is undefined. |
+ if (typeof RealRTCPeerConnection != "undefined") |
{ |
- if (originalArray == null || typeof originalArray != "object") |
- return originalArray; |
+ let closeRTCPeerConnection = Function.prototype.call.bind( |
+ RealRTCPeerConnection.prototype.close |
+ ); |
+ let RealArray = Array; |
+ let RealString = String; |
+ let {create: createObject, defineProperty} = Object; |
- let safeArray = RealArray(originalArray.length); |
- for (let i = 0; i < safeArray.length; i++) |
+ let normalizeUrl = url => |
kzar
2017/11/14 11:36:35
This change - and several like it below - are nece
|
{ |
- defineProperty(safeArray, i, { |
- configurable: false, enumerable: false, writable: false, |
- value: transform(originalArray[i]) |
- }); |
- } |
- defineProperty(safeArray, "length", { |
- configurable: false, enumerable: false, writable: false, |
- value: safeArray.length |
- }); |
- return safeArray; |
- } |
+ if (typeof url != "undefined") |
+ return RealString(url); |
+ }; |
- // It would be much easier to use the .getConfiguration method to obtain |
- // the normalized and safe configuration from the RTCPeerConnection |
- // instance. Unfortunately its not implemented as of Chrome unstable 59. |
- // See https://www.chromestatus.com/feature/5271355306016768 |
- function protectConfiguration(configuration) |
- { |
- if (configuration == null || typeof configuration != "object") |
- return configuration; |
+ let safeCopyArray = (originalArray, transform) => |
+ { |
+ if (originalArray == null || typeof originalArray != "object") |
+ return originalArray; |
- let iceServers = safeCopyArray( |
- configuration.iceServers, |
- iceServer => |
+ let safeArray = RealArray(originalArray.length); |
+ for (let i = 0; i < safeArray.length; i++) |
{ |
- let {url, urls} = iceServer; |
- |
- // RTCPeerConnection doesn't iterate through pseudo Arrays of urls. |
- if (typeof urls != "undefined" && !(urls instanceof RealArray)) |
- urls = [urls]; |
- |
- return createObject(iceServer, { |
- url: { |
- configurable: false, enumerable: false, writable: false, |
- value: normalizeUrl(url) |
- }, |
- urls: { |
- configurable: false, enumerable: false, writable: false, |
- value: safeCopyArray(urls, normalizeUrl) |
- } |
+ defineProperty(safeArray, i, { |
+ configurable: false, enumerable: false, writable: false, |
+ value: transform(originalArray[i]) |
}); |
} |
- ); |
- |
- return createObject(configuration, { |
- iceServers: { |
+ defineProperty(safeArray, "length", { |
configurable: false, enumerable: false, writable: false, |
- value: iceServers |
- } |
- }); |
- } |
+ value: safeArray.length |
+ }); |
+ return safeArray; |
+ }; |
- function checkUrl(peerconnection, url) |
- { |
- checkRequest("webrtc", url, blocked => |
+ // It would be much easier to use the .getConfiguration method to obtain |
+ // the normalized and safe configuration from the RTCPeerConnection |
+ // instance. Unfortunately its not implemented as of Chrome unstable 59. |
+ // See https://www.chromestatus.com/feature/5271355306016768 |
+ let protectConfiguration = configuration => |
{ |
- if (blocked) |
- { |
- // Calling .close() throws if already closed. |
- try |
+ if (configuration == null || typeof configuration != "object") |
+ return configuration; |
+ |
+ let iceServers = safeCopyArray( |
+ configuration.iceServers, |
+ iceServer => |
{ |
- closeRTCPeerConnection(peerconnection); |
+ let {url, urls} = iceServer; |
+ |
+ // RTCPeerConnection doesn't iterate through pseudo Arrays of urls. |
+ if (typeof urls != "undefined" && !(urls instanceof RealArray)) |
+ urls = [urls]; |
+ |
+ return createObject(iceServer, { |
+ url: { |
+ configurable: false, enumerable: false, writable: false, |
+ value: normalizeUrl(url) |
+ }, |
+ urls: { |
+ configurable: false, enumerable: false, writable: false, |
+ value: safeCopyArray(urls, normalizeUrl) |
+ } |
+ }); |
} |
- catch (e) {} |
- } |
- }); |
- } |
+ ); |
- function checkConfiguration(peerconnection, configuration) |
- { |
- if (configuration && configuration.iceServers) |
+ return createObject(configuration, { |
+ iceServers: { |
+ configurable: false, enumerable: false, writable: false, |
+ value: iceServers |
+ } |
+ }); |
+ }; |
+ |
+ let checkUrl = (peerconnection, url) => |
{ |
- for (let i = 0; i < configuration.iceServers.length; i++) |
+ checkRequest("webrtc", url, blocked => |
{ |
- let iceServer = configuration.iceServers[i]; |
- if (iceServer) |
+ if (blocked) |
{ |
- if (iceServer.url) |
- checkUrl(peerconnection, iceServer.url); |
- |
- if (iceServer.urls) |
+ // Calling .close() throws if already closed. |
+ try |
{ |
- for (let j = 0; j < iceServer.urls.length; j++) |
- checkUrl(peerconnection, iceServer.urls[j]); |
+ closeRTCPeerConnection(peerconnection); |
} |
+ catch (e) {} |
} |
- } |
- } |
- } |
- |
- // Chrome unstable (tested with 59) has already implemented |
- // setConfiguration, so we need to wrap that if it exists too. |
- // https://www.chromestatus.com/feature/5596193748942848 |
- if (RealRTCPeerConnection.prototype.setConfiguration) |
- { |
- let realSetConfiguration = Function.prototype.call.bind( |
- RealRTCPeerConnection.prototype.setConfiguration |
- ); |
+ }); |
+ }; |
- RealRTCPeerConnection.prototype.setConfiguration = function(configuration) |
+ let checkConfiguration = (peerconnection, configuration) => |
{ |
- configuration = protectConfiguration(configuration); |
- |
- // Call the real method first, so that validates the configuration for |
- // us. Also we might as well since checkRequest is asynchronous anyway. |
- realSetConfiguration(this, configuration); |
- checkConfiguration(this, configuration); |
+ if (configuration && configuration.iceServers) |
+ { |
+ for (let i = 0; i < configuration.iceServers.length; i++) |
+ { |
+ let iceServer = configuration.iceServers[i]; |
+ if (iceServer) |
+ { |
+ if (iceServer.url) |
+ checkUrl(peerconnection, iceServer.url); |
+ |
+ if (iceServer.urls) |
+ { |
+ for (let j = 0; j < iceServer.urls.length; j++) |
+ checkUrl(peerconnection, iceServer.urls[j]); |
+ } |
+ } |
+ } |
+ } |
}; |
- } |
- function WrappedRTCPeerConnection(...args) |
- { |
- if (!(this instanceof WrappedRTCPeerConnection)) |
- return RealRTCPeerConnection(); |
+ // Chrome unstable (tested with 59) has already implemented |
+ // setConfiguration, so we need to wrap that if it exists too. |
+ // https://www.chromestatus.com/feature/5596193748942848 |
+ if (RealRTCPeerConnection.prototype.setConfiguration) |
+ { |
+ let realSetConfiguration = Function.prototype.call.bind( |
+ RealRTCPeerConnection.prototype.setConfiguration |
+ ); |
- let configuration = protectConfiguration(args[0]); |
+ RealRTCPeerConnection.prototype.setConfiguration = function(configuration) |
+ { |
+ configuration = protectConfiguration(configuration); |
- // Since the old webkitRTCPeerConnection constructor takes an optional |
- // second argument we need to take care to pass that through. Necessary |
- // for older versions of Chrome such as 49. |
- let constraints = undefined; |
- if (args.length > 1) |
- constraints = args[1]; |
+ // Call the real method first, so that validates the configuration for |
+ // us. Also we might as well since checkRequest is asynchronous anyway. |
+ realSetConfiguration(this, configuration); |
+ checkConfiguration(this, configuration); |
+ }; |
+ } |
- let peerconnection = new RealRTCPeerConnection(configuration, constraints); |
- checkConfiguration(peerconnection, configuration); |
- return peerconnection; |
- } |
+ let WrappedRTCPeerConnection = function(...args) |
+ { |
+ if (!(this instanceof WrappedRTCPeerConnection)) |
+ return RealRTCPeerConnection(); |
+ |
+ let configuration = protectConfiguration(args[0]); |
+ |
+ // Since the old webkitRTCPeerConnection constructor takes an optional |
+ // second argument we need to take care to pass that through. Necessary |
+ // for older versions of Chrome such as 49. |
+ let constraints = undefined; |
+ if (args.length > 1) |
+ constraints = args[1]; |
+ |
+ let peerconnection = new RealRTCPeerConnection(configuration, |
+ constraints); |
+ checkConfiguration(peerconnection, configuration); |
+ return peerconnection; |
+ }; |
- WrappedRTCPeerConnection.prototype = RealRTCPeerConnection.prototype; |
+ WrappedRTCPeerConnection.prototype = RealRTCPeerConnection.prototype; |
- let boundWrappedRTCPeerConnection = WrappedRTCPeerConnection.bind(); |
- copyProperties(RealRTCPeerConnection, boundWrappedRTCPeerConnection, |
- ["generateCertificate", "name", "prototype"]); |
- RealRTCPeerConnection.prototype.constructor = boundWrappedRTCPeerConnection; |
+ let boundWrappedRTCPeerConnection = WrappedRTCPeerConnection.bind(); |
+ copyProperties(RealRTCPeerConnection, boundWrappedRTCPeerConnection, |
+ ["generateCertificate", "name", "prototype"]); |
+ RealRTCPeerConnection.prototype.constructor = boundWrappedRTCPeerConnection; |
- if ("RTCPeerConnection" in window) |
- window.RTCPeerConnection = boundWrappedRTCPeerConnection; |
- if ("webkitRTCPeerConnection" in window) |
- window.webkitRTCPeerConnection = boundWrappedRTCPeerConnection; |
+ if ("RTCPeerConnection" in window) |
+ window.RTCPeerConnection = boundWrappedRTCPeerConnection; |
+ if ("webkitRTCPeerConnection" in window) |
+ window.webkitRTCPeerConnection = boundWrappedRTCPeerConnection; |
+ } |
} |
if (document instanceof HTMLDocument) |