gorhill
8 years ago
11 changed files with 504 additions and 19 deletions
-
36platform/webext/background.html
-
276platform/webext/bootstrap.js
-
1platform/webext/chrome.manifest
-
68platform/webext/from-legacy.js
-
28platform/webext/install.rdf
-
2src/js/assets.js
-
4src/js/background.js
-
19src/js/start.js
-
2tools/make-firefox-meta.py
-
59tools/make-webext-meta.py
-
26tools/make-webext.sh
@ -0,0 +1,36 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html> |
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<title>uBlock Origin</title> |
||||
|
</head> |
||||
|
<body> |
||||
|
<script src="js/polyfill.js"></script> |
||||
|
<script src="lib/punycode.js"></script> |
||||
|
<script src="lib/publicsuffixlist.js"></script> |
||||
|
<script src="js/vapi-common.js"></script> |
||||
|
<script src="js/vapi-background.js"></script> |
||||
|
<script src="js/background.js"></script> |
||||
|
<script src="js/xal.js"></script> |
||||
|
<script src="js/usersettings.js"></script> |
||||
|
<script src="js/liquid-dict.js"></script> |
||||
|
<script src="js/matrix.js"></script> |
||||
|
<script src="js/utils.js"></script> |
||||
|
<script src="js/assets.js"></script> |
||||
|
<script src="js/httpsb.js"></script> |
||||
|
<script src="js/uritools.js"></script> |
||||
|
<script src="js/cookies.js"></script> |
||||
|
<script src="js/logger.js"></script> |
||||
|
<script src="js/messaging.js"></script> |
||||
|
<script src="js/profiler.js"></script> |
||||
|
<script src="js/storage.js"></script> |
||||
|
<script src="js/pagestats.js"></script> |
||||
|
<script src="js/tab.js"></script> |
||||
|
<script src="js/traffic.js"></script> |
||||
|
<script src="js/useragent.js"></script> |
||||
|
<script src="js/browsercache.js"></script> |
||||
|
<script src="js/from-legacy.js"></script> |
||||
|
<script src="js/start.js"></script> |
||||
|
<script src="js/commands.js"></script> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,276 @@ |
|||||
|
/******************************************************************************* |
||||
|
|
||||
|
uMatrix - a browser extension to black/white list requests. |
||||
|
Copyright (C) 2014-2017 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/uMatrix
|
||||
|
*/ |
||||
|
|
||||
|
/* exported startup, shutdown, install, uninstall */ |
||||
|
|
||||
|
'use strict'; |
||||
|
|
||||
|
/******************************************************************************/ |
||||
|
|
||||
|
const hostName = 'umatrix'; |
||||
|
|
||||
|
/******************************************************************************/ |
||||
|
|
||||
|
function startup({ webExtension }) { |
||||
|
webExtension.startup().then(api => { |
||||
|
let { browser } = api, |
||||
|
storageMigrator; |
||||
|
let onMessage = function(message, sender, callback) { |
||||
|
if ( message.what === 'webext:storageMigrateNext' ) { |
||||
|
storageMigrator = storageMigrator || getStorageMigrator(); |
||||
|
storageMigrator.getNext((key, value) => { |
||||
|
if ( key === undefined ) { |
||||
|
storageMigrator.markAsDone(); |
||||
|
storageMigrator = undefined; |
||||
|
browser.runtime.onMessage.removeListener(onMessage); |
||||
|
} |
||||
|
callback({ key: key, value: JSON.stringify(value) }); |
||||
|
}); |
||||
|
return true; |
||||
|
} |
||||
|
if ( message.what === 'webext:storageMigrateDone' ) { |
||||
|
browser.runtime.onMessage.removeListener(onMessage); |
||||
|
} |
||||
|
if ( typeof callback === 'function' ) { |
||||
|
callback(); |
||||
|
} |
||||
|
}; |
||||
|
browser.runtime.onMessage.addListener(onMessage); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
function shutdown() { |
||||
|
} |
||||
|
|
||||
|
function install() { |
||||
|
} |
||||
|
|
||||
|
function uninstall() { |
||||
|
} |
||||
|
|
||||
|
/******************************************************************************/ |
||||
|
|
||||
|
var getStorageMigrator = function() { |
||||
|
var db = null; |
||||
|
var dbOpenError = ''; |
||||
|
|
||||
|
var close = function() { |
||||
|
if ( db !== null ) { |
||||
|
db.asyncClose(); |
||||
|
} |
||||
|
db = null; |
||||
|
}; |
||||
|
|
||||
|
var open = function() { |
||||
|
if ( db !== null ) { |
||||
|
return db; |
||||
|
} |
||||
|
|
||||
|
// Create path
|
||||
|
var { Services } = Components.utils.import('resource://gre/modules/Services.jsm', null), |
||||
|
path = Services.dirsvc.get('ProfD', Components.interfaces.nsIFile); |
||||
|
path.append('extension-data'); |
||||
|
path.append(hostName + '.sqlite'); |
||||
|
if ( !path.exists() || !path.isFile() ) { |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
// Open database.
|
||||
|
try { |
||||
|
db = Services.storage.openDatabase(path); |
||||
|
if ( db.connectionReady === false ) { |
||||
|
db.asyncClose(); |
||||
|
db = null; |
||||
|
} |
||||
|
} catch (ex) { |
||||
|
if ( dbOpenError === '' ) { |
||||
|
dbOpenError = ex.name; |
||||
|
if ( ex.name === 'NS_ERROR_FILE_CORRUPTED' ) { |
||||
|
close(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if ( db === null ) { |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
// Since database could be opened successfully, reset error flag (its
|
||||
|
// purpose is to avoid spamming console with error messages).
|
||||
|
dbOpenError = ''; |
||||
|
|
||||
|
return db; |
||||
|
}; |
||||
|
|
||||
|
// Execute a query
|
||||
|
var runStatement = function(stmt, callback) { |
||||
|
var result = {}; |
||||
|
|
||||
|
stmt.executeAsync({ |
||||
|
handleResult: function(rows) { |
||||
|
if ( !rows || typeof callback !== 'function' ) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
var row; |
||||
|
|
||||
|
while ( (row = rows.getNextRow()) ) { |
||||
|
// we assume that there will be two columns, since we're
|
||||
|
// using it only for preferences
|
||||
|
result[row.getResultByIndex(0)] = row.getResultByIndex(1); |
||||
|
} |
||||
|
}, |
||||
|
handleCompletion: function(reason) { |
||||
|
if ( typeof callback === 'function' && reason === 0 ) { |
||||
|
callback(result); |
||||
|
} |
||||
|
result = null; |
||||
|
}, |
||||
|
handleError: function(error) { |
||||
|
// Caller expects an answer regardless of failure.
|
||||
|
if ( typeof callback === 'function' ) { |
||||
|
callback({}); |
||||
|
} |
||||
|
result = null; |
||||
|
// https://github.com/gorhill/uBlock/issues/1768
|
||||
|
// Error cases which warrant a removal of the SQL file, so far:
|
||||
|
// - SQLLite error 11 database disk image is malformed
|
||||
|
// Can't find doc on MDN about the type of error.result, so I
|
||||
|
// force a string comparison.
|
||||
|
if ( error.result.toString() === '11' ) { |
||||
|
close(); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
var bindNames = function(stmt, names) { |
||||
|
if ( Array.isArray(names) === false || names.length === 0 ) { |
||||
|
return; |
||||
|
} |
||||
|
var params = stmt.newBindingParamsArray(); |
||||
|
var i = names.length, bp; |
||||
|
while ( i-- ) { |
||||
|
bp = params.newBindingParams(); |
||||
|
bp.bindByName('name', names[i]); |
||||
|
params.addParams(bp); |
||||
|
} |
||||
|
stmt.bindParameters(params); |
||||
|
}; |
||||
|
|
||||
|
var read = function(details, callback) { |
||||
|
if ( typeof callback !== 'function' ) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
var prepareResult = function(result) { |
||||
|
var key; |
||||
|
for ( key in result ) { |
||||
|
if ( result.hasOwnProperty(key) === false ) { |
||||
|
continue; |
||||
|
} |
||||
|
result[key] = JSON.parse(result[key]); |
||||
|
} |
||||
|
if ( typeof details === 'object' && details !== null ) { |
||||
|
for ( key in details ) { |
||||
|
if ( result.hasOwnProperty(key) === false ) { |
||||
|
result[key] = details[key]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
callback(result); |
||||
|
}; |
||||
|
|
||||
|
if ( open() === null ) { |
||||
|
prepareResult({}); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
var names = []; |
||||
|
if ( details !== null ) { |
||||
|
if ( Array.isArray(details) ) { |
||||
|
names = details; |
||||
|
} else if ( typeof details === 'object' ) { |
||||
|
names = Object.keys(details); |
||||
|
} else { |
||||
|
names = [details.toString()]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
var stmt; |
||||
|
if ( names.length === 0 ) { |
||||
|
stmt = db.createAsyncStatement('SELECT * FROM "settings"'); |
||||
|
} else { |
||||
|
stmt = db.createAsyncStatement('SELECT * FROM "settings" WHERE "name" = :name'); |
||||
|
bindNames(stmt, names); |
||||
|
} |
||||
|
|
||||
|
runStatement(stmt, prepareResult); |
||||
|
}; |
||||
|
|
||||
|
let allKeys; |
||||
|
|
||||
|
let readNext = function(key, callback) { |
||||
|
if ( key === undefined ) { |
||||
|
callback(); |
||||
|
return; |
||||
|
} |
||||
|
read(key, bin => { |
||||
|
if ( bin instanceof Object && bin.hasOwnProperty(key) ) { |
||||
|
callback(key, bin[key]); |
||||
|
} else { |
||||
|
callback(key); |
||||
|
} |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
let getNext = function(callback) { |
||||
|
if ( Array.isArray(allKeys) ) { |
||||
|
readNext(allKeys.pop(), callback); |
||||
|
return; |
||||
|
} |
||||
|
if ( open() === null ) { |
||||
|
callback(); |
||||
|
return; |
||||
|
} |
||||
|
let stmt = db.createAsyncStatement('SELECT "name",\'dummy\' FROM "settings"'); |
||||
|
runStatement(stmt, result => { |
||||
|
allKeys = []; |
||||
|
for ( let key in result ) { |
||||
|
if ( result.hasOwnProperty(key) ) { |
||||
|
allKeys.push(key); |
||||
|
} |
||||
|
} |
||||
|
readNext(allKeys.pop(), callback); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
let markAsDone = function() { |
||||
|
close(); |
||||
|
}; |
||||
|
|
||||
|
return { |
||||
|
getNext: getNext, |
||||
|
markAsDone: markAsDone, |
||||
|
}; |
||||
|
}; |
||||
|
|
||||
|
/******************************************************************************/ |
@ -0,0 +1 @@ |
|||||
|
content umatrix ./ |
@ -0,0 +1,68 @@ |
|||||
|
/******************************************************************************* |
||||
|
|
||||
|
uMatrix - a browser extension to black/white list requests. |
||||
|
Copyright (C) 2017 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/uMatrix
|
||||
|
*/ |
||||
|
|
||||
|
// For background page
|
||||
|
|
||||
|
'use strict'; |
||||
|
|
||||
|
/******************************************************************************/ |
||||
|
|
||||
|
(function() { |
||||
|
let µm = µMatrix; |
||||
|
|
||||
|
let migrateAll = function(callback) { |
||||
|
let mustRestart = false; |
||||
|
|
||||
|
let migrateKeyValue = function(details, callback) { |
||||
|
let bin = {}; |
||||
|
bin[details.key] = JSON.parse(details.value); |
||||
|
self.browser.storage.local.set(bin, callback); |
||||
|
mustRestart = true; |
||||
|
}; |
||||
|
|
||||
|
let migrateNext = function() { |
||||
|
self.browser.runtime.sendMessage({ what: 'webext:storageMigrateNext' }, response => { |
||||
|
if ( response.key === undefined ) { |
||||
|
if ( mustRestart ) { |
||||
|
self.browser.runtime.reload(); |
||||
|
} else { |
||||
|
callback(); |
||||
|
} |
||||
|
return; |
||||
|
} |
||||
|
migrateKeyValue(response, migrateNext); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
self.browser.storage.local.get('legacyStorageMigrated', bin => { |
||||
|
if ( bin && bin.legacyStorageMigrated ) { |
||||
|
self.browser.runtime.sendMessage({ what: 'webext:storageMigrateDone' }); |
||||
|
return callback(); |
||||
|
} |
||||
|
self.browser.storage.local.set({ legacyStorageMigrated: true }); |
||||
|
migrateNext(); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
µm.onBeforeStartQueue.push(migrateAll); |
||||
|
})(); |
||||
|
|
||||
|
/******************************************************************************/ |
@ -0,0 +1,28 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> |
||||
|
<Description about="urn:mozilla:install-manifest"> |
||||
|
<em:id>uMatrix-webext@raymondhill.net</em:id> |
||||
|
<em:version>{version}</em:version> |
||||
|
<em:name>{name}</em:name> |
||||
|
<em:description>{description}</em:description> |
||||
|
<em:homepageURL>https://github.com/gorhill/uMatrix</em:homepageURL> |
||||
|
<em:creator>{author}</em:creator> |
||||
|
<em:developer>Deathamns</em:developer> |
||||
|
<em:developer>Alex Vallat</em:developer> |
||||
|
<em:type>2</em:type> |
||||
|
<em:bootstrap>true</em:bootstrap> |
||||
|
<em:multiprocessCompatible>true</em:multiprocessCompatible> |
||||
|
<em:hasEmbeddedWebExtension>true</em:hasEmbeddedWebExtension> |
||||
|
{localized} |
||||
|
|
||||
|
<!-- Firefox --> |
||||
|
<em:targetApplication> |
||||
|
<Description> |
||||
|
<em:id>{{ec8030f7-c20a-464f-9b0e-13a3a9e97384}}</em:id> |
||||
|
<em:minVersion>53.0a1</em:minVersion> |
||||
|
<em:maxVersion>*</em:maxVersion> |
||||
|
</Description> |
||||
|
</em:targetApplication> |
||||
|
|
||||
|
</Description> |
||||
|
</RDF> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue