mirror of
https://github.com/gorhill/uBlock.git
synced 2024-10-06 09:37:12 +02:00
This commit is contained in:
parent
b63f55b7af
commit
6b73b8c38c
8
platform/chromium/is-webrtc-supported.html
Normal file
8
platform/chromium/is-webrtc-supported.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title></title>
|
||||||
|
<script src="js/is-webrtc-supported.js"></script>
|
||||||
|
</head>
|
||||||
|
<body></body>
|
||||||
|
</html>
|
52
platform/chromium/is-webrtc-supported.js
Normal file
52
platform/chromium/is-webrtc-supported.js
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
|
||||||
|
uBlock Origin - a browser extension to block requests.
|
||||||
|
Copyright (C) 2015 Raymond Hill
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see {http://www.gnu.org/licenses/}.
|
||||||
|
|
||||||
|
Home: https://github.com/gorhill/uBlock
|
||||||
|
*/
|
||||||
|
|
||||||
|
// https://github.com/gorhill/uBlock/issues/533#issuecomment-164292868
|
||||||
|
// If WebRTC is supported, there won't be an exception if we
|
||||||
|
// try to instanciate a peer connection object.
|
||||||
|
|
||||||
|
// https://github.com/gorhill/uBlock/issues/533#issuecomment-168097594
|
||||||
|
// Because Chromium leaks WebRTC connections after they have been closed
|
||||||
|
// and forgotten, we need to test for WebRTC support inside an iframe, this
|
||||||
|
// way the closed and forgottetn WebRTC connections are properly garbage
|
||||||
|
// collected.
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var pc = null;
|
||||||
|
try {
|
||||||
|
var PC = self.RTCPeerConnection || self.webkitRTCPeerConnection;
|
||||||
|
if ( PC ) {
|
||||||
|
pc = new PC(null);
|
||||||
|
}
|
||||||
|
} catch (ex) {
|
||||||
|
console.error(ex);
|
||||||
|
}
|
||||||
|
if ( pc !== null ) {
|
||||||
|
pc.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.top.postMessage(
|
||||||
|
pc !== null ? 'webRTCSupported' : 'webRTCNotSupported',
|
||||||
|
window.location.origin
|
||||||
|
);
|
||||||
|
})();
|
@ -19,8 +19,6 @@
|
|||||||
Home: https://github.com/gorhill/uBlock
|
Home: https://github.com/gorhill/uBlock
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* global self, µBlock */
|
|
||||||
|
|
||||||
// For background page
|
// For background page
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
@ -74,6 +72,71 @@ vAPI.storage = chrome.storage.local;
|
|||||||
// API threw an exception.
|
// API threw an exception.
|
||||||
|
|
||||||
vAPI.browserSettings = {
|
vAPI.browserSettings = {
|
||||||
|
webRTCSupported: undefined,
|
||||||
|
|
||||||
|
// https://github.com/gorhill/uBlock/issues/533
|
||||||
|
// We must first check wether this Chromium-based browser was compiled
|
||||||
|
// with WebRTC support. To do this, we use an iframe, this way the
|
||||||
|
// empty RTCPeerConnection object we create to test for support will
|
||||||
|
// be properly garbage collected. This prevents issues such as
|
||||||
|
// a computer unable to enter into sleep mode, as reported in the
|
||||||
|
// Chrome store:
|
||||||
|
// https://github.com/gorhill/uBlock/issues/533#issuecomment-167931681
|
||||||
|
setWebrtcIPAddress: function(setting) {
|
||||||
|
// We don't know yet whether this browser supports WebRTC: find out.
|
||||||
|
if ( this.webRTCSupported === undefined ) {
|
||||||
|
this.webRTCSupported = { setting: setting };
|
||||||
|
var iframe = document.createElement('iframe');
|
||||||
|
var me = this;
|
||||||
|
var messageHandler = function(ev) {
|
||||||
|
if ( ev.origin !== self.location.origin ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
window.removeEventListener('message', messageHandler);
|
||||||
|
var setting = me.webRTCSupported.setting;
|
||||||
|
me.webRTCSupported = ev.data === 'webRTCSupported';
|
||||||
|
me.setWebrtcIPAddress(setting);
|
||||||
|
iframe.parentNode.removeChild(iframe);
|
||||||
|
iframe = null;
|
||||||
|
};
|
||||||
|
window.addEventListener('message', messageHandler);
|
||||||
|
iframe.src = 'is-webrtc-supported.html';
|
||||||
|
document.body.appendChild(iframe);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are waiting for a response from our iframe. This makes the code
|
||||||
|
// safe to re-entrancy.
|
||||||
|
if ( typeof this.webRTCSupported === 'object' ) {
|
||||||
|
this.webRTCSupported.setting = setting;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/gorhill/uBlock/issues/533
|
||||||
|
// WebRTC not supported: `webRTCMultipleRoutesEnabled` can NOT be
|
||||||
|
// safely accessed. Accessing the property will cause full browser
|
||||||
|
// crash.
|
||||||
|
if ( this.webRTCSupported !== true ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Older version of Chromium do not support this setting.
|
||||||
|
if ( typeof chrome.privacy.network.webRTCMultipleRoutesEnabled !== 'object' ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
chrome.privacy.network.webRTCMultipleRoutesEnabled.set({
|
||||||
|
value: !!setting,
|
||||||
|
scope: 'regular'
|
||||||
|
}, function() {
|
||||||
|
void chrome.runtime.lastError;
|
||||||
|
});
|
||||||
|
} catch(ex) {
|
||||||
|
console.error(ex);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
set: function(details) {
|
set: function(details) {
|
||||||
// https://github.com/gorhill/uBlock/issues/875
|
// https://github.com/gorhill/uBlock/issues/875
|
||||||
// Must not leave `lastError` unchecked.
|
// Must not leave `lastError` unchecked.
|
||||||
@ -109,36 +172,7 @@ vAPI.browserSettings = {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'webrtcIPAddress':
|
case 'webrtcIPAddress':
|
||||||
// https://github.com/gorhill/uBlock/issues/533#issuecomment-164292868
|
this.setWebrtcIPAddress(details[setting]);
|
||||||
// If WebRTC is supported, there won't be an exception if we
|
|
||||||
// try to instanciate a peer connection object.
|
|
||||||
//var pc = null;
|
|
||||||
//try {
|
|
||||||
// var PC = self.RTCPeerConnection || self.webkitRTCPeerConnection;
|
|
||||||
// if ( PC ) {
|
|
||||||
// pc = new PC(null);
|
|
||||||
// }
|
|
||||||
//} catch (ex) {
|
|
||||||
// console.error(ex);
|
|
||||||
//}
|
|
||||||
//if ( pc === null ) {
|
|
||||||
// break;
|
|
||||||
//}
|
|
||||||
//pc.close();
|
|
||||||
|
|
||||||
// https://github.com/gorhill/uBlock/issues/533
|
|
||||||
// If we reach this point, the property
|
|
||||||
// `webRTCMultipleRoutesEnabled` can be safely accessed.
|
|
||||||
if ( typeof chrome.privacy.network.webRTCMultipleRoutesEnabled === 'object' ) {
|
|
||||||
try {
|
|
||||||
chrome.privacy.network.webRTCMultipleRoutesEnabled.set({
|
|
||||||
value: !!details[setting],
|
|
||||||
scope: 'regular'
|
|
||||||
}, callback);
|
|
||||||
} catch(ex) {
|
|
||||||
console.error(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user