mirror of
https://github.com/gorhill/uBlock.git
synced 2024-10-04 16:47:15 +02:00
Code styling
This commit is contained in:
parent
9169388849
commit
5e55ba772d
@ -295,7 +295,7 @@ vAPI.messaging.onPortMessage = function(request, port) {
|
||||
}
|
||||
port.postMessage({
|
||||
requestId: request.requestId,
|
||||
portName: request.portName,
|
||||
channelName: request.channelName,
|
||||
msg: response !== undefined ? response : null
|
||||
});
|
||||
};
|
||||
@ -303,7 +303,7 @@ vAPI.messaging.onPortMessage = function(request, port) {
|
||||
|
||||
// Specific handler
|
||||
var r = vAPI.messaging.UNHANDLED;
|
||||
var listener = vAPI.messaging.listeners[request.portName];
|
||||
var listener = vAPI.messaging.listeners[request.channelName];
|
||||
if ( typeof listener === 'function' ) {
|
||||
r = listener(request.msg, port.sender, callback);
|
||||
}
|
||||
@ -383,7 +383,7 @@ vAPI.net = {
|
||||
'onHeadersReceived'
|
||||
];
|
||||
|
||||
for (var i = 0; i < listeners.length; ++i) {
|
||||
for ( var i = 0; i < listeners.length; i++ ) {
|
||||
chrome.webRequest[listeners[i]].addListener(
|
||||
this[listeners[i]].callback,
|
||||
{
|
||||
|
@ -55,7 +55,7 @@ var messagingConnector = function(response) {
|
||||
var channels = vAPI.messaging.channels;
|
||||
var channel, listener;
|
||||
|
||||
if ( response.broadcast === true && !response.portName ) {
|
||||
if ( response.broadcast === true && !response.channelName ) {
|
||||
for ( channel in channels ) {
|
||||
if ( channels.hasOwnProperty(channel) === false ) {
|
||||
continue;
|
||||
@ -75,7 +75,7 @@ var messagingConnector = function(response) {
|
||||
}
|
||||
|
||||
if ( !listener ) {
|
||||
channel = channels[response.portName];
|
||||
channel = channels[response.channelName];
|
||||
listener = channel && channel.listener;
|
||||
}
|
||||
|
||||
@ -121,7 +121,7 @@ vAPI.messaging = {
|
||||
}
|
||||
|
||||
this.channels[channelName] = {
|
||||
portName: channelName,
|
||||
channelName: channelName,
|
||||
listener: typeof callback === 'function' ? callback : null,
|
||||
send: function(message, callback) {
|
||||
if ( vAPI.messaging.port === null ) {
|
||||
@ -129,7 +129,7 @@ vAPI.messaging = {
|
||||
}
|
||||
|
||||
message = {
|
||||
portName: this.portName,
|
||||
channelName: this.channelName,
|
||||
msg: message
|
||||
};
|
||||
|
||||
@ -141,7 +141,7 @@ vAPI.messaging = {
|
||||
vAPI.messaging.port.postMessage(message);
|
||||
},
|
||||
close: function() {
|
||||
delete vAPI.messaging.channels[this.portName];
|
||||
delete vAPI.messaging.channels[this.channelName];
|
||||
}
|
||||
};
|
||||
|
||||
|
26
platform/firefox/bootstrap.js
vendored
26
platform/firefox/bootstrap.js
vendored
@ -26,12 +26,7 @@
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
let bgProcess;
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
function startup(data, reason) {
|
||||
bgProcess = function(e) {
|
||||
let bgProcess = function(e) {
|
||||
if ( e ) {
|
||||
this.removeEventListener('DOMContentLoaded', bgProcess);
|
||||
}
|
||||
@ -46,7 +41,14 @@ function startup(data, reason) {
|
||||
bgProcess.setAttribute('src', 'chrome://ublock/content/background.html');
|
||||
};
|
||||
|
||||
if (reason === APP_STARTUP) {
|
||||
/******************************************************************************/
|
||||
|
||||
function startup(data, reason) {
|
||||
if ( reason !== APP_STARTUP ) {
|
||||
bgProcess();
|
||||
return;
|
||||
}
|
||||
|
||||
let ww = Components.classes['@mozilla.org/embedcomp/window-watcher;1']
|
||||
.getService(Components.interfaces.nsIWindowWatcher);
|
||||
|
||||
@ -57,17 +59,15 @@ function startup(data, reason) {
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
bgProcess();
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
function shutdown(data, reason) {
|
||||
if (reason !== APP_SHUTDOWN) {
|
||||
bgProcess.parentNode.removeChild(bgProcess);
|
||||
if ( reason === APP_SHUTDOWN ) {
|
||||
return;
|
||||
}
|
||||
|
||||
bgProcess.parentNode.removeChild(bgProcess);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
@ -54,18 +54,22 @@ const contentPolicy = {
|
||||
contractID: '@' + appName + '/content-policy;1',
|
||||
ACCEPT: Ci.nsIContentPolicy.ACCEPT,
|
||||
messageName: appName + ':shouldLoad',
|
||||
|
||||
get componentRegistrar() {
|
||||
return Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
|
||||
},
|
||||
|
||||
get categoryManager() {
|
||||
return Components.classes['@mozilla.org/categorymanager;1']
|
||||
.getService(Ci.nsICategoryManager);
|
||||
},
|
||||
|
||||
QueryInterface: XPCOMUtils.generateQI([
|
||||
Ci.nsIFactory,
|
||||
Ci.nsIContentPolicy,
|
||||
Ci.nsISupportsWeakReference
|
||||
]),
|
||||
|
||||
createInstance: function(outer, iid) {
|
||||
if ( outer ) {
|
||||
throw Components.results.NS_ERROR_NO_AGGREGATION;
|
||||
@ -88,6 +92,7 @@ const contentPolicy = {
|
||||
true
|
||||
);
|
||||
},
|
||||
|
||||
unregister: function() {
|
||||
this.componentRegistrar.unregisterFactory(this.classID, this);
|
||||
this.categoryManager.deleteCategoryEntry(
|
||||
@ -96,6 +101,7 @@ const contentPolicy = {
|
||||
false
|
||||
);
|
||||
},
|
||||
|
||||
// https://bugzil.la/612921
|
||||
shouldLoad: function(type, location, origin, context) {
|
||||
// If we don't know what initiated the request, probably it's not a tab
|
||||
@ -128,10 +134,12 @@ const contentPolicy = {
|
||||
|
||||
const docObserver = {
|
||||
contentBaseURI: 'chrome://' + appName + '/content/js/',
|
||||
|
||||
QueryInterface: XPCOMUtils.generateQI([
|
||||
Ci.nsIObserver,
|
||||
Ci.nsISupportsWeakReference
|
||||
]),
|
||||
|
||||
initContext: function(win, sandbox) {
|
||||
let messager = getMessageManager(win);
|
||||
|
||||
@ -164,12 +172,15 @@ const docObserver = {
|
||||
|
||||
return win;
|
||||
},
|
||||
|
||||
register: function() {
|
||||
Services.obs.addObserver(this, 'document-element-inserted', true);
|
||||
},
|
||||
|
||||
unregister: function() {
|
||||
Services.obs.removeObserver(this, 'document-element-inserted');
|
||||
},
|
||||
|
||||
observe: function(doc) {
|
||||
let win = doc.defaultView;
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
Home: https://github.com/gorhill/uBlock
|
||||
*/
|
||||
|
||||
/* globals Services, sendAsyncMessage, addMessageListener, removeMessageListener */
|
||||
/* globals addMessageListener, removeMessageListener */
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
|
@ -55,8 +55,8 @@ vAPI.app.restart = function() {};
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// list of things that needs to be destroyed when disabling the extension
|
||||
// only functions should be added to it
|
||||
// List of things that needs to be destroyed when disabling the extension
|
||||
// Only functions should be added to it
|
||||
|
||||
vAPI.unload = [];
|
||||
|
||||
@ -88,6 +88,7 @@ var SQLite = {
|
||||
SQLite.db.asyncClose();
|
||||
});
|
||||
},
|
||||
|
||||
run: function(query, values, callback) {
|
||||
if ( !this.db ) {
|
||||
this.open();
|
||||
@ -135,6 +136,7 @@ var SQLite = {
|
||||
|
||||
vAPI.storage = {
|
||||
QUOTA_BYTES: 100 * 1024 * 1024,
|
||||
|
||||
sqlWhere: function(col, params) {
|
||||
if ( params > 0 ) {
|
||||
params = Array(params + 1).join('?, ').slice(0, -2);
|
||||
@ -143,6 +145,7 @@ vAPI.storage = {
|
||||
|
||||
return '';
|
||||
},
|
||||
|
||||
get: function(details, callback) {
|
||||
if ( typeof callback !== 'function' ) {
|
||||
return;
|
||||
@ -153,12 +156,10 @@ vAPI.storage = {
|
||||
if ( details !== null ) {
|
||||
if ( Array.isArray(details) ) {
|
||||
values = details;
|
||||
}
|
||||
else if (typeof details === 'object') {
|
||||
} else if ( typeof details === 'object' ) {
|
||||
defaults = true;
|
||||
values = Object.keys(details);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
values = [details.toString()];
|
||||
}
|
||||
}
|
||||
@ -185,6 +186,7 @@ vAPI.storage = {
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
set: function(details, callback) {
|
||||
var key, values = [], placeholders = [];
|
||||
|
||||
@ -205,6 +207,7 @@ vAPI.storage = {
|
||||
callback
|
||||
);
|
||||
},
|
||||
|
||||
remove: function(keys, callback) {
|
||||
if ( typeof keys === 'string' ) {
|
||||
keys = [keys];
|
||||
@ -216,10 +219,12 @@ vAPI.storage = {
|
||||
callback
|
||||
);
|
||||
},
|
||||
|
||||
clear: function(callback) {
|
||||
SQLite.run('DELETE FROM settings');
|
||||
SQLite.run('VACUUM', null, callback);
|
||||
},
|
||||
|
||||
getBytesInUse: function(keys, callback) {
|
||||
if ( typeof callback !== 'function' ) {
|
||||
return;
|
||||
@ -244,12 +249,14 @@ var windowWatcher = {
|
||||
vAPI.tabs.onClosed(tabId);
|
||||
delete vAPI.tabIcons[tabId];
|
||||
},
|
||||
|
||||
onTabSelect: function(e) {
|
||||
vAPI.setIcon(
|
||||
vAPI.tabs.getTabId(e.target),
|
||||
e.target.ownerDocument.defaultView
|
||||
);
|
||||
},
|
||||
|
||||
onReady: function(e) {
|
||||
if ( e ) {
|
||||
this.removeEventListener(e.type, windowWatcher.onReady);
|
||||
@ -276,6 +283,7 @@ var windowWatcher = {
|
||||
|
||||
// when new window is opened TabSelect doesn't run on the selected tab?
|
||||
},
|
||||
|
||||
observe: function(win, topic) {
|
||||
if ( topic === 'domwindowopened' ) {
|
||||
win.addEventListener('DOMContentLoaded', this.onReady);
|
||||
@ -299,8 +307,7 @@ var tabsProgressListener = {
|
||||
tabId: tabId,
|
||||
url: browser.currentURI.spec
|
||||
});
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
vAPI.tabs.onNavigation({
|
||||
frameId: 0,
|
||||
tabId: tabId,
|
||||
@ -386,8 +393,7 @@ vAPI.tabs.get = function(tabId, callback) {
|
||||
if ( tabId === null ) {
|
||||
tab = Services.wm.getMostRecentWindow('navigator:browser').gBrowser.selectedTab;
|
||||
tabId = vAPI.tabs.getTabId(tab);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
windows = this.getWindows();
|
||||
|
||||
for ( var win of windows ) {
|
||||
@ -402,7 +408,7 @@ vAPI.tabs.get = function(tabId, callback) {
|
||||
}
|
||||
|
||||
// for internal use
|
||||
if (tab && callback === undefined) {
|
||||
if ( tab && typeof callback !== 'function' ) {
|
||||
return tab;
|
||||
}
|
||||
|
||||
@ -477,7 +483,7 @@ vAPI.tabs.open = function(details) {
|
||||
return null;
|
||||
}
|
||||
// extension pages
|
||||
if (!/^[\w-]{2,}:/.test(details.url)) {
|
||||
if ( /^[\w-]{2,}:/.test(details.url) === false ) {
|
||||
details.url = vAPI.getURL(details.url);
|
||||
}
|
||||
|
||||
@ -568,7 +574,7 @@ vAPI.tabs.injectScript = function(tabId, details, callback) {
|
||||
location.host + ':broadcast',
|
||||
JSON.stringify({
|
||||
broadcast: true,
|
||||
portName: 'vAPI',
|
||||
channelName: 'vAPI',
|
||||
msg: {
|
||||
cmd: 'injectScript',
|
||||
details: details
|
||||
@ -594,8 +600,7 @@ vAPI.setIcon = function(tabId, iconStatus, badge) {
|
||||
// from 'TabSelect' event
|
||||
if ( tabId === undefined ) {
|
||||
tabId = curTabId;
|
||||
}
|
||||
else if (badge !== undefined) {
|
||||
} else if ( badge !== undefined ) {
|
||||
vAPI.tabIcons[tabId] = {
|
||||
badge: badge,
|
||||
img: iconStatus === 'on'
|
||||
@ -793,9 +798,9 @@ vAPI.messaging.onMessage = function({target, data}) {
|
||||
.chromeEventHandler.ownerDocument.defaultView.messageManager;
|
||||
}
|
||||
|
||||
var listenerId = data.portName.split('|');
|
||||
var listenerId = data.channelName.split('|');
|
||||
var requestId = data.requestId;
|
||||
var portName = listenerId[1];
|
||||
var channelName = listenerId[1];
|
||||
listenerId = listenerId[0];
|
||||
|
||||
var callback = vAPI.messaging.NOOPFUNC;
|
||||
@ -803,14 +808,13 @@ vAPI.messaging.onMessage = function({target, data}) {
|
||||
callback = function(response) {
|
||||
var message = JSON.stringify({
|
||||
requestId: requestId,
|
||||
portName: portName,
|
||||
channelName: channelName,
|
||||
msg: response !== undefined ? response : null
|
||||
});
|
||||
|
||||
if ( messageManager.sendAsyncMessage ) {
|
||||
messageManager.sendAsyncMessage(listenerId, message);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
messageManager.broadcastAsyncMessage(listenerId, message);
|
||||
}
|
||||
};
|
||||
@ -824,7 +828,7 @@ vAPI.messaging.onMessage = function({target, data}) {
|
||||
|
||||
// Specific handler
|
||||
var r = vAPI.messaging.UNHANDLED;
|
||||
var listener = vAPI.messaging.listeners[portName];
|
||||
var listener = vAPI.messaging.listeners[channelName];
|
||||
if ( typeof listener === 'function' ) {
|
||||
r = listener(data.msg, sender, callback);
|
||||
}
|
||||
@ -897,6 +901,7 @@ var httpObserver = {
|
||||
frameId: null,
|
||||
parentFrameId: null
|
||||
},
|
||||
|
||||
QueryInterface: (function() {
|
||||
var {XPCOMUtils} = Cu['import']('resource://gre/modules/XPCOMUtils.jsm', {});
|
||||
return XPCOMUtils.generateQI([
|
||||
@ -904,16 +909,19 @@ var httpObserver = {
|
||||
Ci.nsISupportsWeakReference
|
||||
]);
|
||||
})(),
|
||||
|
||||
register: function() {
|
||||
Services.obs.addObserver(httpObserver, 'http-on-opening-request', true);
|
||||
// Services.obs.addObserver(httpObserver, 'http-on-modify-request', true);
|
||||
Services.obs.addObserver(httpObserver, 'http-on-examine-response', true);
|
||||
},
|
||||
|
||||
unregister: function() {
|
||||
Services.obs.removeObserver(httpObserver, 'http-on-opening-request');
|
||||
// Services.obs.removeObserver(httpObserver, 'http-on-modify-request');
|
||||
Services.obs.removeObserver(httpObserver, 'http-on-examine-response');
|
||||
},
|
||||
|
||||
observe: function(httpChannel, topic) {
|
||||
// No need for QueryInterface if this check is performed?
|
||||
if ( !(httpChannel instanceof Ci.nsIHttpChannel) ) {
|
||||
@ -1003,8 +1011,7 @@ var httpObserver = {
|
||||
|
||||
if ( result.cancel === true ) {
|
||||
httpChannel.cancel(this.ABORT);
|
||||
}
|
||||
else if (result.redirectUrl) {
|
||||
} else if ( result.redirectUrl ) {
|
||||
httpChannel.redirectionLimit = 1;
|
||||
httpChannel.redirectTo(
|
||||
Services.io.newURI(result.redirectUrl, null, null)
|
||||
@ -1079,7 +1086,7 @@ vAPI.contextMenu.displayMenuItem = function(e) {
|
||||
var gContextMenu = doc.defaultView.gContextMenu;
|
||||
var menuitem = doc.getElementById(vAPI.contextMenu.menuItemId);
|
||||
|
||||
if (!/^https?$/.test(gContextMenu.browser.currentURI.scheme)) {
|
||||
if ( /^https?$/.test(gContextMenu.browser.currentURI.scheme) === false) {
|
||||
menuitem.hidden = true;
|
||||
return;
|
||||
}
|
||||
@ -1155,8 +1162,7 @@ vAPI.contextMenu.create = function(details, callback) {
|
||||
|
||||
if ( Array.isArray(this.contexts) && this.contexts.length ) {
|
||||
this.contexts = this.contexts.indexOf('all') === -1 ? this.contexts : null;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// default in Chrome
|
||||
this.contexts = ['page'];
|
||||
}
|
||||
@ -1170,13 +1176,9 @@ vAPI.contextMenu.create = function(details, callback) {
|
||||
|
||||
if ( gContextMenu.inFrame ) {
|
||||
details.frameUrl = gContextMenu.focusedWindow.location.href;
|
||||
}
|
||||
else if (gContextMenu.onImage
|
||||
|| gContextMenu.onAudio
|
||||
|| gContextMenu.onVideo) {
|
||||
} else if ( gContextMenu.onImage || gContextMenu.onAudio || gContextMenu.onVideo ) {
|
||||
details.srcUrl = gContextMenu.mediaURL;
|
||||
}
|
||||
else if (gContextMenu.onLink) {
|
||||
} else if ( gContextMenu.onLink ) {
|
||||
details.linkUrl = gContextMenu.linkURL;
|
||||
}
|
||||
|
||||
|
@ -44,7 +44,7 @@ var messagingConnector = function(response) {
|
||||
var channels = vAPI.messaging.channels;
|
||||
var channel, listener;
|
||||
|
||||
if ( response.broadcast === true && !response.portName ) {
|
||||
if ( response.broadcast === true && !response.channelName ) {
|
||||
for ( channel in channels ) {
|
||||
if ( channels.hasOwnProperty(channel) === false ) {
|
||||
continue;
|
||||
@ -64,7 +64,7 @@ var messagingConnector = function(response) {
|
||||
}
|
||||
|
||||
if ( !listener ) {
|
||||
channel = channels[response.portName];
|
||||
channel = channels[response.channelName];
|
||||
listener = channel && channel.listener;
|
||||
}
|
||||
|
||||
@ -124,7 +124,7 @@ vAPI.messaging = {
|
||||
}
|
||||
|
||||
this.channels[channelName] = {
|
||||
portName: channelName,
|
||||
channelName: channelName,
|
||||
listener: typeof callback === 'function' ? callback : null,
|
||||
send: function(message, callback) {
|
||||
if ( !vAPI.messaging.connector ) {
|
||||
@ -132,7 +132,7 @@ vAPI.messaging = {
|
||||
}
|
||||
|
||||
message = {
|
||||
portName: vAPI.messaging.connectorId + '|' + this.portName,
|
||||
channelName: vAPI.messaging.connectorId + '|' + this.channelName,
|
||||
msg: message
|
||||
};
|
||||
|
||||
@ -144,7 +144,7 @@ vAPI.messaging = {
|
||||
sendAsyncMessage('ublock:background', message);
|
||||
},
|
||||
close: function() {
|
||||
delete vAPI.messaging.channels[this.portName];
|
||||
delete vAPI.messaging.channels[this.channelName];
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
Home: https://github.com/gorhill/uBlock
|
||||
*/
|
||||
|
||||
/* global ytspf */
|
||||
'use strict';
|
||||
|
||||
/******************************************************************************/
|
||||
@ -37,8 +38,12 @@ if (/^www\.youtube(-nocookie)?\.com/.test(location.host)) {
|
||||
window.ytspf = {};
|
||||
Object.defineProperty(ytspf, 'enabled', {'value': false});
|
||||
|
||||
// based on ExtendTube's ad removing solution
|
||||
var p, yt = {}, config_ = {}, ytplayer = {}, playerConfig = { args: {} };
|
||||
// Based on ExtendTube's ad removing solution
|
||||
var p;
|
||||
var yt = {};
|
||||
var config_ = {};
|
||||
var ytplayer = {};
|
||||
var playerConfig = { args: {} };
|
||||
|
||||
Object.defineProperties(yt, {
|
||||
'playerConfig': {
|
||||
|
@ -66,7 +66,10 @@ safari.extension.addContentScriptFromURL(
|
||||
|
||||
safari.extension.settings.addEventListener('change', function(e) {
|
||||
if ( e.key === 'open_prefs' ) {
|
||||
vAPI.tabs.open({url: 'dashboard.html', active: true});
|
||||
vAPI.tabs.open({
|
||||
url: 'dashboard.html',
|
||||
active: true
|
||||
});
|
||||
}
|
||||
}, false);
|
||||
|
||||
@ -75,6 +78,7 @@ safari.extension.settings.addEventListener('change', function(e) {
|
||||
vAPI.storage = {
|
||||
_storage: safari.extension.settings,
|
||||
QUOTA_BYTES: 52428800, // copied from Info.plist
|
||||
|
||||
get: function(keys, callback) {
|
||||
if ( typeof callback !== 'function' ) {
|
||||
return;
|
||||
@ -90,31 +94,27 @@ vAPI.storage = {
|
||||
result[i] = JSON.parse(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (typeof keys === 'string') {
|
||||
} else if ( typeof keys === 'string' ) {
|
||||
value = this._storage[keys];
|
||||
|
||||
if ( typeof value === 'string' ) {
|
||||
result[keys] = JSON.parse(value);
|
||||
}
|
||||
}
|
||||
else if (Array.isArray(keys)) {
|
||||
for ( i = 0; i < keys.length; ++i) {
|
||||
} else if ( Array.isArray(keys) ) {
|
||||
for ( i = 0; i < keys.length; i++ ) {
|
||||
value = this._storage[i];
|
||||
|
||||
if ( typeof value === 'string' ) {
|
||||
result[keys[i]] = JSON.parse(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (typeof keys === 'object') {
|
||||
} else if ( typeof keys === 'object' ) {
|
||||
for ( i in keys ) {
|
||||
value = this._storage[i];
|
||||
|
||||
if ( typeof value === 'string' ) {
|
||||
result[i] = JSON.parse(value);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
result[i] = keys[i];
|
||||
}
|
||||
}
|
||||
@ -122,6 +122,7 @@ vAPI.storage = {
|
||||
|
||||
callback(result);
|
||||
},
|
||||
|
||||
set: function(details, callback) {
|
||||
for ( var key in details ) {
|
||||
this._storage.setItem(key, JSON.stringify(details[key]));
|
||||
@ -131,19 +132,22 @@ vAPI.storage = {
|
||||
callback();
|
||||
}
|
||||
},
|
||||
|
||||
remove: function(keys) {
|
||||
if ( typeof keys === 'string' ) {
|
||||
keys = [keys];
|
||||
}
|
||||
|
||||
for (var i = 0; i < keys.length; ++i) {
|
||||
for ( var i = 0; i < keys.length; i++ ) {
|
||||
this._storage.removeItem(keys[i]);
|
||||
}
|
||||
},
|
||||
|
||||
clear: function(callback) {
|
||||
this._storage.clear();
|
||||
callback();
|
||||
},
|
||||
|
||||
getBytesInUse: function(keys, callback) {
|
||||
if ( typeof callback !== 'function' ) {
|
||||
return;
|
||||
@ -155,13 +159,12 @@ vAPI.storage = {
|
||||
for ( key in this._storage ) {
|
||||
size += (this._storage[key] || '').length;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
if ( typeof keys === 'string' ) {
|
||||
keys = [keys];
|
||||
}
|
||||
|
||||
for (key = 0; key < keys.length; ++key) {
|
||||
for ( key = 0; key < keys.length; key++ ) {
|
||||
size += (this._storage[keys[key]] || '').length;
|
||||
}
|
||||
}
|
||||
@ -182,7 +185,6 @@ vAPI.tabs = {
|
||||
vAPI.tabs.registerListeners = function() {
|
||||
var onNavigation = this.onNavigation;
|
||||
|
||||
if (typeof onNavigation === 'function') {
|
||||
this.onNavigation = function(e) {
|
||||
// e.url is not present for local files or data URIs,
|
||||
// or probably for those URLs which we don't have access to
|
||||
@ -198,7 +200,6 @@ vAPI.tabs.registerListeners = function() {
|
||||
};
|
||||
|
||||
safari.application.addEventListener('navigate', this.onNavigation, true);
|
||||
}
|
||||
|
||||
// onClosed handled in the main tab-close event
|
||||
// onUpdated handled via monitoring the history.pushState on web-pages
|
||||
@ -225,8 +226,7 @@ vAPI.tabs.get = function(tabId, callback) {
|
||||
if ( tabId === null ) {
|
||||
tab = safari.application.activeBrowserWindow.activeTab;
|
||||
tabId = this.getTabId(tab);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
tab = this.stack[tabId];
|
||||
}
|
||||
|
||||
@ -259,7 +259,7 @@ vAPI.tabs.open = function(details) {
|
||||
return null;
|
||||
}
|
||||
// extension pages
|
||||
if (!/^[\w-]{2,}:/.test(details.url)) {
|
||||
if ( /^[\w-]{2,}:/.test(details.url) === false ) {
|
||||
details.url = vAPI.getURL(details.url);
|
||||
}
|
||||
|
||||
@ -271,7 +271,7 @@ vAPI.tabs.open = function(details) {
|
||||
// this is questionable
|
||||
var url = details.url.replace(rgxHash, '');
|
||||
|
||||
for (var i = 0; i < win.tabs.length; ++i) {
|
||||
for ( var i = 0; i < win.tabs.length; i++ ) {
|
||||
if ( win.tabs[i].url.replace(rgxHash, '') === url ) {
|
||||
win.tabs[i].activate();
|
||||
return true;
|
||||
@ -331,8 +331,7 @@ vAPI.tabs.injectScript = function(tabId, details, callback) {
|
||||
|
||||
if ( tabId ) {
|
||||
tab = this.stack[tabId];
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
tab = safari.application.activeBrowserWindow.activeTab;
|
||||
}
|
||||
|
||||
@ -345,7 +344,7 @@ vAPI.tabs.injectScript = function(tabId, details, callback) {
|
||||
}
|
||||
|
||||
tab.page.dispatchMessage('broadcast', {
|
||||
portName: 'vAPI',
|
||||
channelName: 'vAPI',
|
||||
msg: {
|
||||
cmd: 'injectScript',
|
||||
details: details
|
||||
@ -436,9 +435,8 @@ vAPI.setIcon = function(tabId, iconStatus, badge) {
|
||||
// from 'activate' event
|
||||
if ( tabId === undefined ) {
|
||||
tabId = curTabId;
|
||||
}
|
||||
else {
|
||||
if (badge && typeof badge !== 'number') {
|
||||
} else {
|
||||
if ( badge && /\D/.test(badge) ) {
|
||||
badge = 999;
|
||||
}
|
||||
|
||||
@ -454,7 +452,7 @@ vAPI.setIcon = function(tabId, iconStatus, badge) {
|
||||
|
||||
// if the selected tab has the same ID, then update the badge too,
|
||||
// or always update it when changing tabs ('activate' event)
|
||||
var items = safari.extension.toolbarItems
|
||||
var items = safari.extension.toolbarItems;
|
||||
var i = items.length;
|
||||
|
||||
while ( i-- ) {
|
||||
@ -493,7 +491,7 @@ vAPI.messaging.onMessage = function(request) {
|
||||
request.name,
|
||||
{
|
||||
requestId: request.message.requestId,
|
||||
portName: request.message.portName,
|
||||
channelName: request.message.channelName,
|
||||
msg: response !== undefined ? response : null
|
||||
}
|
||||
);
|
||||
@ -508,7 +506,7 @@ vAPI.messaging.onMessage = function(request) {
|
||||
|
||||
// Specific handler
|
||||
var r = vAPI.messaging.UNHANDLED;
|
||||
var listener = vAPI.messaging.listeners[request.message.portName];
|
||||
var listener = vAPI.messaging.listeners[request.message.channelName];
|
||||
if ( typeof listener === 'function' ) {
|
||||
r = listener(request.message.msg, sender, callback);
|
||||
}
|
||||
@ -565,17 +563,17 @@ vAPI.messaging.broadcast = function(message) {
|
||||
/******************************************************************************/
|
||||
|
||||
safari.application.addEventListener('beforeNavigate', function(e) {
|
||||
if (!vAPI.tabs.expectPopUpFrom || e.url === 'about:blank') {
|
||||
if ( !vAPI.tabs.popupCandidate || e.url === 'about:blank' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var details = {
|
||||
url: e.url,
|
||||
tabId: vAPI.tabs.getTabId(e.target),
|
||||
sourceTabId: vAPI.tabs.expectPopUpFrom
|
||||
sourceTabId: vAPI.tabs.popupCandidate
|
||||
};
|
||||
|
||||
vAPI.tabs.expectPopUpFrom = null;
|
||||
vAPI.tabs.popupCandidate = null;
|
||||
|
||||
if ( vAPI.tabs.onPopup(details) ) {
|
||||
e.preventDefault();
|
||||
@ -595,7 +593,6 @@ vAPI.net = {};
|
||||
vAPI.net.registerListeners = function() {
|
||||
var onBeforeRequest = this.onBeforeRequest;
|
||||
|
||||
if (typeof onBeforeRequest.callback === 'function') {
|
||||
if ( !Array.isArray(onBeforeRequest.types) ) {
|
||||
onBeforeRequest.types = [];
|
||||
}
|
||||
@ -608,19 +605,19 @@ vAPI.net.registerListeners = function() {
|
||||
return;
|
||||
}
|
||||
|
||||
// no stopPropagation if it was called from beforeNavigate event
|
||||
// No stopPropagation if it was called from beforeNavigate event
|
||||
if ( e.stopPropagation ) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
|
||||
if (e.message.isWhiteListed) {
|
||||
block = µBlock.URI.hostnameFromURI(e.message.isWhiteListed);
|
||||
if ( e.message.isURLWhiteListed ) {
|
||||
block = µBlock.URI.hostnameFromURI(e.message.isURLWhiteListed);
|
||||
block = µBlock.URI.domainFromHostname(block) || block;
|
||||
e.message = !!µBlock.netWhitelist[block];
|
||||
return e.message;
|
||||
}
|
||||
|
||||
// when the URL changes, but the document doesn't
|
||||
// When the URL changes, but the document doesn't
|
||||
if ( e.message.type === 'popstate' ) {
|
||||
vAPI.tabs.onUpdated(
|
||||
vAPI.tabs.getTabId(e.target),
|
||||
@ -628,11 +625,10 @@ vAPI.net.registerListeners = function() {
|
||||
{url: e.message.url}
|
||||
);
|
||||
return;
|
||||
}
|
||||
} else if ( e.message.type === 'popup' ) {
|
||||
// blocking unwanted pop-ups
|
||||
else if (e.message.type === 'popup') {
|
||||
if ( e.message.url === 'about:blank' ) {
|
||||
vAPI.tabs.expectPopUpFrom = vAPI.tabs.getTabId(e.target);
|
||||
vAPI.tabs.popupCandidate = vAPI.tabs.getTabId(e.target);
|
||||
e.message = true;
|
||||
return;
|
||||
}
|
||||
@ -647,28 +643,25 @@ vAPI.net.registerListeners = function() {
|
||||
|
||||
block = vAPI.net.onBeforeRequest;
|
||||
|
||||
if (block.types.indexOf(e.message.type) < 0) {
|
||||
if ( block.types.indexOf(e.message.type) === -1 ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
e.message.tabId = vAPI.tabs.getTabId(e.target);
|
||||
block = onBeforeRequest(e.message);
|
||||
|
||||
// truthy return value will allow the request,
|
||||
// Truthy return value will allow the request,
|
||||
// except when redirectUrl is present
|
||||
if ( block && typeof block === 'object' ) {
|
||||
if ( block.cancel === true ) {
|
||||
e.message = false;
|
||||
}
|
||||
else if (e.message.type === 'script'
|
||||
} else if ( e.message.type === 'script'
|
||||
&& typeof block.redirectUrl === 'string' ) {
|
||||
e.message = block.redirectUrl;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
e.message = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
e.message = true;
|
||||
}
|
||||
|
||||
@ -680,7 +673,6 @@ vAPI.net.registerListeners = function() {
|
||||
this.onBeforeRequest.callback,
|
||||
true
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
/******************************************************************************/
|
||||
@ -703,8 +695,7 @@ vAPI.contextMenu.create = function(details, callback) {
|
||||
|
||||
if ( Array.isArray(contexts) && contexts.length ) {
|
||||
contexts = contexts.indexOf('all') === -1 ? contexts : null;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// default in Chrome
|
||||
contexts = ['page'];
|
||||
}
|
||||
@ -712,12 +703,15 @@ vAPI.contextMenu.create = function(details, callback) {
|
||||
this.onContextMenu = function(e) {
|
||||
var uI = e.userInfo;
|
||||
|
||||
if (uI && /^https?:\/\//i.test(uI.pageUrl)) {
|
||||
if ( !uI || /^https?:\/\//i.test(uI.pageUrl) === false ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( contexts ) {
|
||||
var invalidContext = true;
|
||||
var ctxMap = vAPI.contextMenu.contextMap;
|
||||
|
||||
for (var i = 0; i < contexts.length; ++i) {
|
||||
for ( var i = 0; i < contexts.length; i++ ) {
|
||||
var ctx = contexts[i];
|
||||
|
||||
if ( ctx === 'audio' || ctx === 'video' ) {
|
||||
@ -725,12 +719,10 @@ vAPI.contextMenu.create = function(details, callback) {
|
||||
invalidContext = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (uI[ctxMap[ctx]]) {
|
||||
} else if ( uI[ctxMap[ctx]] ) {
|
||||
invalidContext = false;
|
||||
break;
|
||||
}
|
||||
else if (ctx === 'page') {
|
||||
} else if ( ctx === 'page' ) {
|
||||
if ( !(uI.insideFrame || uI.linkHref
|
||||
|| uI.mediaType || uI.editable) ) {
|
||||
invalidContext = false;
|
||||
@ -745,7 +737,6 @@ vAPI.contextMenu.create = function(details, callback) {
|
||||
}
|
||||
|
||||
e.contextMenu.appendContextMenuItem(menuItemId, menuTitle);
|
||||
}
|
||||
};
|
||||
|
||||
this.onContextMenuCmd = function(e) {
|
||||
|
@ -42,7 +42,7 @@ var messagingConnector = function(response) {
|
||||
var channels = vAPI.messaging.channels;
|
||||
var channel, listener;
|
||||
|
||||
if ( response.broadcast === true && !response.portName ) {
|
||||
if ( response.broadcast === true && !response.channelName ) {
|
||||
for ( channel in channels ) {
|
||||
if ( channels.hasOwnProperty(channel) === false ) {
|
||||
continue;
|
||||
@ -62,7 +62,7 @@ var messagingConnector = function(response) {
|
||||
}
|
||||
|
||||
if ( !listener ) {
|
||||
channel = channels[response.portName];
|
||||
channel = channels[response.channelName];
|
||||
listener = channel && channel.listener;
|
||||
}
|
||||
|
||||
@ -79,7 +79,7 @@ var uniqueId = function() {
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// relevant?
|
||||
// Relevant?
|
||||
// https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/MessagesandProxies/MessagesandProxies.html#//apple_ref/doc/uid/TP40009977-CH14-SW12
|
||||
vAPI.messaging = {
|
||||
channels: {},
|
||||
@ -107,6 +107,7 @@ vAPI.messaging = {
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
close: function() {
|
||||
if ( this.connector ) {
|
||||
safari.self.removeEventListener('message', this.connector, false);
|
||||
@ -115,13 +116,14 @@ vAPI.messaging = {
|
||||
this.listeners = {};
|
||||
}
|
||||
},
|
||||
|
||||
channel: function(channelName, callback) {
|
||||
if ( !channelName ) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.channels[channelName] = {
|
||||
portName: channelName,
|
||||
channelName: channelName,
|
||||
listener: typeof callback === 'function' ? callback : null,
|
||||
send: function(message, callback) {
|
||||
if ( !vAPI.messaging.connector ) {
|
||||
@ -129,7 +131,7 @@ vAPI.messaging = {
|
||||
}
|
||||
|
||||
message = {
|
||||
portName: this.portName,
|
||||
channelName: this.channelName,
|
||||
msg: message
|
||||
};
|
||||
|
||||
@ -156,8 +158,7 @@ vAPI.messaging = {
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
safari.self.tab.dispatchMessage(
|
||||
vAPI.messaging.connectorId,
|
||||
message
|
||||
@ -165,7 +166,7 @@ vAPI.messaging = {
|
||||
}
|
||||
},
|
||||
close: function() {
|
||||
delete vAPI.messaging.channels[this.portName];
|
||||
delete vAPI.messaging.channels[this.channelName];
|
||||
}
|
||||
};
|
||||
|
||||
@ -193,7 +194,7 @@ if (location.protocol === 'safari-extension:') {
|
||||
window.MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
|
||||
|
||||
if ( !window.MutationObserver ) {
|
||||
// dummy, minimalistic shim for older versions (<6)
|
||||
// Dummy, minimalistic shim for older versions (<6)
|
||||
// only supports node insertions, but currently we don't use it for anything else
|
||||
window.MutationObserver = function(handler) {
|
||||
this.observe = function(target) {
|
||||
@ -220,14 +221,15 @@ var onBeforeLoad = function(e, details) {
|
||||
|
||||
linkHelper.href = details ? details.url : e.url;
|
||||
|
||||
if (!(/^https?:/.test(linkHelper.protocol) || (details && details.type === 'popup'))) {
|
||||
if ( linkHelper.protocol !== 'http:' && linkHelper.protocol !== 'https:' ) {
|
||||
if ( !(details && details.type === 'popup') ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ( details ) {
|
||||
details.url = linkHelper.href;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
details = {
|
||||
url: linkHelper.href
|
||||
};
|
||||
@ -251,11 +253,10 @@ var onBeforeLoad = function(e, details) {
|
||||
case 'link':
|
||||
var rel = e.target.rel.trim().toLowerCase();
|
||||
|
||||
if (rel.indexOf('icon') > -1) {
|
||||
if ( rel.indexOf('icon') !== -1 ) {
|
||||
details.type = 'image';
|
||||
break;
|
||||
}
|
||||
else if (rel === 'stylesheet') {
|
||||
} else if ( rel === 'stylesheet' ) {
|
||||
details.type = 'stylesheet';
|
||||
break;
|
||||
}
|
||||
@ -263,11 +264,12 @@ var onBeforeLoad = function(e, details) {
|
||||
details.type = 'other';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// This can run even before the first DOMSubtreeModified event fired
|
||||
if ( firstMutation ) {
|
||||
firstMutation();
|
||||
}
|
||||
}
|
||||
|
||||
// tabId is determined in the background script
|
||||
// details.tabId = null;
|
||||
@ -280,15 +282,18 @@ var onBeforeLoad = function(e, details) {
|
||||
if ( !response ) {
|
||||
if ( details.type === 'main_frame' ) {
|
||||
window.stop();
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
// local mirroring, response is a data: URL here
|
||||
else if (typeof response === 'string' && details.type === 'script') {
|
||||
|
||||
// Local mirroring, response should be a data: URL here
|
||||
if ( typeof response !== 'string' || details.type !== 'script' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Content Security Policy with disallowed inline scripts may break things
|
||||
e.preventDefault();
|
||||
details = document.createElement('script');
|
||||
@ -301,12 +306,10 @@ var onBeforeLoad = function(e, details) {
|
||||
};
|
||||
|
||||
document.addEventListener('DOMContentLoaded', jsOnLoad, true);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
e.target.parentNode.insertBefore(details, e.target);
|
||||
details.parentNode.removeChild(details);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener('beforeload', onBeforeLoad, true);
|
||||
@ -317,7 +320,8 @@ document.addEventListener('beforeload', onBeforeLoad, true);
|
||||
var firstMutation = function() {
|
||||
document.removeEventListener('DOMSubtreeModified', firstMutation, true);
|
||||
firstMutation = null;
|
||||
var randEventName = parseInt(Math.random() * 1e15, 10).toString(36);
|
||||
|
||||
var randEventName = uniqueId();
|
||||
|
||||
window.addEventListener(randEventName, function(e) {
|
||||
var result = onBeforeLoad(beforeLoadEvent, e.detail);
|
||||
@ -334,15 +338,18 @@ var firstMutation = function() {
|
||||
'var block = function(u, t) {',
|
||||
'var e = document.createEvent("CustomEvent"),',
|
||||
'd = {url: u, type: t};',
|
||||
'e.initCustomEvent("' + randEventName + '", !1, !1, d);',
|
||||
'e.initCustomEvent("' + randEventName + '", false, false, d);',
|
||||
'dispatchEvent(e);',
|
||||
'return d.url === !1;',
|
||||
'return d.url === false;',
|
||||
'}, wo = open, xo = XMLHttpRequest.prototype.open;',
|
||||
'open = function(u) {',
|
||||
'return block(u, "popup") ? null : wo.apply(this, arguments);',
|
||||
'};',
|
||||
'XMLHttpRequest.prototype.open = function(m, u, s) {',
|
||||
'return xo.apply(this, block(u, "xmlhttprequest") ? ["HEAD", u, s] : arguments);',
|
||||
'return xo.apply(',
|
||||
'this,',
|
||||
'block(u, "xmlhttprequest") ? ["HEAD", u, s] : arguments',
|
||||
');',
|
||||
'};'
|
||||
];
|
||||
|
||||
@ -367,7 +374,7 @@ var firstMutation = function() {
|
||||
}
|
||||
|
||||
var block = safari.self.tab.canLoad(beforeLoadEvent, {
|
||||
isWhiteListed: location.href
|
||||
isURLWhiteListed: location.href
|
||||
});
|
||||
|
||||
if ( vAPI.sitePatch && !block ) {
|
||||
@ -376,7 +383,9 @@ var firstMutation = function() {
|
||||
|
||||
tmpScript.push('})();');
|
||||
tmpJS.textContent = tmpScript.join('');
|
||||
document.documentElement.removeChild(document.documentElement.appendChild(tmpJS));
|
||||
document.documentElement.removeChild(
|
||||
document.documentElement.appendChild(tmpJS)
|
||||
);
|
||||
};
|
||||
|
||||
document.addEventListener('DOMSubtreeModified', firstMutation, true);
|
||||
@ -384,29 +393,29 @@ document.addEventListener('DOMSubtreeModified', firstMutation, true);
|
||||
/******************************************************************************/
|
||||
|
||||
var onContextMenu = function(e) {
|
||||
var target = e.target;
|
||||
var details = {
|
||||
tagName: e.target.tagName.toLowerCase(),
|
||||
tagName: target.tagName.toLowerCase(),
|
||||
pageUrl: location.href,
|
||||
insideFrame: window !== window.top
|
||||
};
|
||||
|
||||
details.editable = details.tagName === 'textarea' || details.tagName === 'input';
|
||||
|
||||
if (e.target.hasOwnProperty('checked')) {
|
||||
details.checked = e.target.checked;
|
||||
if ( target.hasOwnProperty('checked') ) {
|
||||
details.checked = target.checked;
|
||||
}
|
||||
|
||||
if ( details.tagName === 'a' ) {
|
||||
details.linkUrl = e.target.href;
|
||||
details.linkUrl = target.href;
|
||||
}
|
||||
|
||||
if (e.target.hasOwnProperty('src')) {
|
||||
details.srcUrl = e.target.src;
|
||||
if ( target.hasOwnProperty('src') ) {
|
||||
details.srcUrl = target.src;
|
||||
|
||||
if ( details.tagName === 'img' ) {
|
||||
details.mediaType = 'image';
|
||||
}
|
||||
else if (details.tagName === 'video' || details.tagName === 'audio') {
|
||||
} else if ( details.tagName === 'video' || details.tagName === 'audio' ) {
|
||||
details.mediaType = details.tagName;
|
||||
}
|
||||
}
|
||||
|
@ -394,7 +394,7 @@ var gotoPick = function() {
|
||||
/******************************************************************************/
|
||||
|
||||
var gotoURL = function(ev) {
|
||||
if (!this.hasAttribute('href')) {
|
||||
if ( this.hasAttribute('href') === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user