|
|
@ -19,7 +19,7 @@ |
|
|
|
Home: https://github.com/gorhill/uBlock
|
|
|
|
*/ |
|
|
|
|
|
|
|
/* global Services */ |
|
|
|
/* global Services, XPCOMUtils */ |
|
|
|
|
|
|
|
// For background page
|
|
|
|
|
|
|
@ -34,6 +34,7 @@ |
|
|
|
const {classes: Cc, interfaces: Ci, utils: Cu} = Components; |
|
|
|
|
|
|
|
Cu['import']('resource://gre/modules/Services.jsm'); |
|
|
|
Cu['import']('resource://gre/modules/XPCOMUtils.jsm'); |
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
@ -45,11 +46,18 @@ vAPI.firefox = true; |
|
|
|
|
|
|
|
vAPI.app = { |
|
|
|
name: 'µBlock', |
|
|
|
cleanName: 'ublock', |
|
|
|
version: '0.7.2.0' |
|
|
|
}; |
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
vAPI.app.restart = function() { |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
var SQLite = { |
|
|
|
open: function() { |
|
|
|
var path = Services.dirsvc.get('ProfD', Ci.nsIFile); |
|
|
@ -63,7 +71,7 @@ var SQLite = { |
|
|
|
throw Error('Should be a directory...'); |
|
|
|
} |
|
|
|
|
|
|
|
path.append('uBlock.sqlite'); |
|
|
|
path.append(vAPI.app.cleanName + '.sqlite'); |
|
|
|
this.db = Services.storage.openDatabase(path); |
|
|
|
this.db.executeSimpleSQL( |
|
|
|
'CREATE TABLE IF NOT EXISTS settings' + |
|
|
@ -229,7 +237,6 @@ var windowWatcher = { |
|
|
|
vAPI.tabs.onClosed(vAPI.tabs.getTabId(e.target)); |
|
|
|
}, |
|
|
|
onTabSelect: function(e) { |
|
|
|
console.log(vAPI.tabs.getTabId(e.target)); |
|
|
|
// vAPI.setIcon();
|
|
|
|
}, |
|
|
|
onLoad: function(e) { |
|
|
@ -243,7 +250,7 @@ var windowWatcher = { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (!this.gBrowser || this.gBrowser.tabContainer) { |
|
|
|
if (!this.gBrowser || !this.gBrowser.tabContainer) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
@ -513,9 +520,15 @@ vAPI.tabs.close = function(tabIds) { |
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
vAPI.setIcon = function() { |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
vAPI.messaging = { |
|
|
|
gmm: Cc['@mozilla.org/globalmessagemanager;1'].getService(Ci.nsIMessageListenerManager), |
|
|
|
frameScript: 'chrome://ublock/content/frameScript.js', |
|
|
|
frameScript: 'chrome://' + vAPI.app.cleanName + '/content/frameScript.js', |
|
|
|
listeners: {}, |
|
|
|
defaultHandler: null, |
|
|
|
NOOPFUNC: function(){}, |
|
|
@ -598,14 +611,17 @@ vAPI.messaging.setup = function(defaultHandler) { |
|
|
|
} |
|
|
|
this.defaultHandler = defaultHandler; |
|
|
|
|
|
|
|
this.gmm.addMessageListener(vAPI.app.name + ':background', this.onMessage); |
|
|
|
this.gmm.addMessageListener( |
|
|
|
vAPI.app.cleanName + ':background', |
|
|
|
this.onMessage |
|
|
|
); |
|
|
|
}; |
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
vAPI.messaging.broadcast = function(message) { |
|
|
|
this.gmm.broadcastAsyncMessage( |
|
|
|
vAPI.app.name + ':broadcast', |
|
|
|
vAPI.app.cleanName + ':broadcast', |
|
|
|
JSON.stringify({broadcast: true, msg: message}) |
|
|
|
); |
|
|
|
}; |
|
|
@ -614,7 +630,7 @@ vAPI.messaging.broadcast = function(message) { |
|
|
|
|
|
|
|
vAPI.messaging.unload = function() { |
|
|
|
this.gmm.removeMessageListener( |
|
|
|
vAPI.app.name + ':background', |
|
|
|
vAPI.app.cleanName + ':background', |
|
|
|
this.onMessage |
|
|
|
); |
|
|
|
this.gmm.removeDelayedFrameScript(this.frameScript); |
|
|
@ -628,15 +644,137 @@ vAPI.lastError = function() { |
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
var conentPolicy = { |
|
|
|
classDescription: vAPI.app.name + ' ContentPolicy', |
|
|
|
classID: Components.ID('{e6d173c8-8dbf-4189-a6fd-189e8acffd27}'), |
|
|
|
contractID: '@' + vAPI.app.cleanName + '/content-policy;1', |
|
|
|
ACCEPT: Ci.nsIContentPolicy.ACCEPT, |
|
|
|
REJECT: Ci.nsIContentPolicy.REJECT_REQUEST, |
|
|
|
types: { |
|
|
|
7: 'sub_frame', |
|
|
|
4: 'stylesheet', |
|
|
|
2: 'script', |
|
|
|
3: 'image', |
|
|
|
5: 'object', |
|
|
|
11: 'xmlhttprequest' |
|
|
|
}, |
|
|
|
get registrar() { |
|
|
|
return Components.manager.QueryInterface(Ci.nsIComponentRegistrar); |
|
|
|
}, |
|
|
|
get catManager() { |
|
|
|
return Cc['@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; |
|
|
|
} |
|
|
|
|
|
|
|
return this.QueryInterface(iid); |
|
|
|
}, |
|
|
|
shouldLoad: function(type, location, origin, context) { |
|
|
|
if (type === 6 || !context || !/^https?$/.test(location.scheme)) { |
|
|
|
return this.ACCEPT; |
|
|
|
} |
|
|
|
|
|
|
|
var win = (context.ownerDocument || context).defaultView; |
|
|
|
|
|
|
|
if (!win) { |
|
|
|
return this.ACCEPT; |
|
|
|
} |
|
|
|
|
|
|
|
var block = vAPI.net.onBeforeRequest; |
|
|
|
|
|
|
|
type = this.types[type] || 'other'; |
|
|
|
|
|
|
|
if (block.types.indexOf(type) === -1) { |
|
|
|
return this.ACCEPT; |
|
|
|
} |
|
|
|
|
|
|
|
var browser = win.top.QueryInterface(Ci.nsIInterfaceRequestor) |
|
|
|
.getInterface(Ci.nsIWebNavigation) |
|
|
|
.QueryInterface(Ci.nsIDocShell) |
|
|
|
.chromeEventHandler; |
|
|
|
|
|
|
|
if (!browser) { |
|
|
|
return this.ACCEPT; |
|
|
|
} |
|
|
|
|
|
|
|
block = block.callback({ |
|
|
|
url: location.spec, |
|
|
|
type: type, |
|
|
|
tabId: vAPI.tabs.getTabId(browser), |
|
|
|
frameId: win === win.top ? 0 : 1, |
|
|
|
parentFrameId: win === win.top ? -1 : 0 |
|
|
|
}); |
|
|
|
|
|
|
|
if (block && typeof block === 'object') { |
|
|
|
if (block.cancel === true) { |
|
|
|
return this.REJECT; |
|
|
|
} |
|
|
|
else if (block.redirectURL) { |
|
|
|
location.spec = block.redirectURL; |
|
|
|
return this.REJECT; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return this.ACCEPT; |
|
|
|
},/* |
|
|
|
shouldProcess: function() { |
|
|
|
return this.ACCEPT; |
|
|
|
}*/ |
|
|
|
}; |
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
vAPI.net = {}; |
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
vAPI.net.registerListeners = function() { |
|
|
|
conentPolicy.registrar.registerFactory( |
|
|
|
conentPolicy.classID, |
|
|
|
conentPolicy.classDescription, |
|
|
|
conentPolicy.contractID, |
|
|
|
conentPolicy |
|
|
|
); |
|
|
|
conentPolicy.catManager.addCategoryEntry( |
|
|
|
'content-policy', |
|
|
|
conentPolicy.contractID, |
|
|
|
conentPolicy.contractID, |
|
|
|
false, |
|
|
|
true |
|
|
|
); |
|
|
|
}; |
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
vAPI.net.unregisterListeners = function() { |
|
|
|
conentPolicy.registrar.unregisterFactory(conentPolicy.classID, conentPolicy); |
|
|
|
conentPolicy.catManager.deleteCategoryEntry( |
|
|
|
'content-policy', |
|
|
|
conentPolicy.contractID, |
|
|
|
false |
|
|
|
); |
|
|
|
}; |
|
|
|
|
|
|
|
/******************************************************************************/ |
|
|
|
|
|
|
|
// clean up when the extension is disabled
|
|
|
|
|
|
|
|
window.addEventListener('unload', function() { |
|
|
|
SQLite.close(); |
|
|
|
windowWatcher.unregister(); |
|
|
|
vAPI.messaging.unload(); |
|
|
|
vAPI.net.unregisterListeners(); |
|
|
|
|
|
|
|
// close extension tabs
|
|
|
|
var extURI, win, tab, host = 'ublock'; |
|
|
|
var extURI, win, tab, host = vAPI.app.cleanName; |
|
|
|
|
|
|
|
for (win of vAPI.tabs.getWindows()) { |
|
|
|
for (tab of win.gBrowser.tabs) { |
|
|
|