gorhill
7 years ago
8 changed files with 0 additions and 533 deletions
-
1.travis.yml
-
36platform/webext/background.html
-
276platform/webext/bootstrap.js
-
1platform/webext/chrome.manifest
-
68platform/webext/from-legacy.js
-
28platform/webext/install.rdf
-
84tools/make-webext-hybrid-meta.py
-
39tools/make-webext-hybrid.sh
@ -1,36 +0,0 @@ |
|||
<!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> |
@ -1,276 +0,0 @@ |
|||
/******************************************************************************* |
|||
|
|||
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, |
|||
}; |
|||
}; |
|||
|
|||
/******************************************************************************/ |
@ -1 +0,0 @@ |
|||
content umatrix ./ |
@ -1,68 +0,0 @@ |
|||
/******************************************************************************* |
|||
|
|||
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); |
|||
})(); |
|||
|
|||
/******************************************************************************/ |
@ -1,28 +0,0 @@ |
|||
<?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@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>56.*</em:maxVersion> |
|||
</Description> |
|||
</em:targetApplication> |
|||
|
|||
</Description> |
|||
</RDF> |
@ -1,84 +0,0 @@ |
|||
#!/usr/bin/env python3 |
|||
|
|||
import os |
|||
import json |
|||
import re |
|||
import sys |
|||
from io import open as uopen |
|||
from collections import OrderedDict |
|||
from xml.sax.saxutils import escape |
|||
|
|||
if len(sys.argv) == 1 or not sys.argv[1]: |
|||
raise SystemExit('Build dir missing.') |
|||
|
|||
proj_dir = os.path.join(os.path.split(os.path.abspath(__file__))[0], '..') |
|||
build_dir = os.path.abspath(sys.argv[1]) |
|||
|
|||
# Import data from chromium platform |
|||
chromium_manifest = {} |
|||
webext_manifest = {} |
|||
|
|||
chromium_manifest_file = os.path.join(proj_dir, 'platform', 'chromium', 'manifest.json') |
|||
with open(chromium_manifest_file) as f1: |
|||
chromium_manifest = json.load(f1) |
|||
|
|||
# WebExtension part |
|||
webext_manifest_file = os.path.join(build_dir, 'webextension', 'manifest.json') |
|||
with open(webext_manifest_file) as f2: |
|||
webext_manifest = json.load(f2) |
|||
|
|||
webext_manifest['version'] = chromium_manifest['version'] |
|||
|
|||
with open(webext_manifest_file, 'w') as f2: |
|||
json.dump(webext_manifest, f2, indent=2, separators=(',', ': '), sort_keys=True) |
|||
f2.write('\n') |
|||
|
|||
# Legacy part |
|||
descriptions = OrderedDict({}) |
|||
source_locale_dir = os.path.join(build_dir, 'webextension', '_locales') |
|||
for alpha2 in sorted(os.listdir(source_locale_dir)): |
|||
locale_path = os.path.join(source_locale_dir, alpha2, 'messages.json') |
|||
with uopen(locale_path, encoding='utf-8') as f: |
|||
strings = json.load(f, object_pairs_hook=OrderedDict) |
|||
alpha2 = alpha2.replace('_', '-') |
|||
descriptions[alpha2] = strings['extShortDesc']['message'] |
|||
|
|||
webext_manifest['author'] = chromium_manifest['author']; |
|||
webext_manifest['name'] = chromium_manifest['name'] + '/webext-hybrid'; |
|||
webext_manifest['homepage'] = 'https://github.com/gorhill/uMatrix' |
|||
webext_manifest['description'] = escape(descriptions['en']) |
|||
del descriptions['en'] |
|||
|
|||
match = re.search('^(\d+\.\d+\.\d+)(\.\d+)$', chromium_manifest['version']) |
|||
if match: |
|||
buildtype = int(match.group(2)[1:]) |
|||
if buildtype < 100: |
|||
builttype = 'b' + str(buildtype) |
|||
else: |
|||
builttype = 'rc' + str(buildtype - 100) |
|||
webext_manifest['version'] = match.group(1) + builttype |
|||
|
|||
webext_manifest['localized'] = [] |
|||
t = ' ' |
|||
t3 = 3 * t |
|||
for alpha2 in descriptions: |
|||
if alpha2 == 'en': |
|||
continue |
|||
webext_manifest['localized'].append( |
|||
'\n' + t*2 + '<em:localized><Description>\n' + |
|||
t3 + '<em:locale>' + alpha2 + '</em:locale>\n' + |
|||
t3 + '<em:name>' + webext_manifest['name'] + '</em:name>\n' + |
|||
t3 + '<em:description>' + escape(descriptions[alpha2]) + '</em:description>\n' + |
|||
t3 + '<em:creator>' + webext_manifest['author'] + '</em:creator>\n' + |
|||
# t3 + '<translator>' + ??? + '</translator>\n' + |
|||
t3 + '<em:homepageURL>' + webext_manifest['homepage'] + '</em:homepageURL>\n' + |
|||
t*2 + '</Description></em:localized>' |
|||
) |
|||
webext_manifest['localized'] = '\n'.join(webext_manifest['localized']) |
|||
|
|||
install_rdf = os.path.join(build_dir, 'install.rdf') |
|||
with uopen(install_rdf, 'r+t', encoding='utf-8', newline='\n') as f: |
|||
install_rdf = f.read() |
|||
f.seek(0) |
|||
f.write(install_rdf.format(**webext_manifest)) |
|||
f.truncate() |
@ -1,39 +0,0 @@ |
|||
#!/usr/bin/env bash |
|||
# |
|||
# This script assumes a linux environment |
|||
|
|||
echo "*** uMatrix.webext-hybrid: Creating web store package" |
|||
echo "*** uMatrix.webext-hybrid: Copying files" |
|||
|
|||
DES=dist/build/uMatrix.webext-hybrid |
|||
rm -rf $DES |
|||
mkdir -p $DES/webextension |
|||
|
|||
cp -R ./assets $DES/webextension/ |
|||
cp -R ./src/* $DES/webextension/ |
|||
cp platform/chromium/*.html $DES/webextension/ |
|||
cp platform/chromium/*.js $DES/webextension/js/ |
|||
cp -R platform/chromium/img/* $DES/webextension/img/ |
|||
cp LICENSE.txt $DES/webextension/ |
|||
|
|||
cp platform/webext/background.html $DES/webextension/ |
|||
cp platform/webext/polyfill.js $DES/webextension/js/ |
|||
cp platform/webext/vapi-cachestorage.js $DES/webextension/js/ |
|||
cp platform/webext/from-legacy.js $DES/webextension/js/ |
|||
cp platform/webext/manifest.json $DES/webextension/ |
|||
cp platform/webext/bootstrap.js $DES/ |
|||
cp platform/webext/chrome.manifest $DES/ |
|||
cp platform/webext/install.rdf $DES/ |
|||
mv $DES/webextension/img/icon_128.png $DES/icon.png |
|||
|
|||
echo "*** uMatrix.webext-hybrid: Generating meta..." |
|||
python tools/make-webext-hybrid-meta.py $DES/ |
|||
|
|||
if [ "$1" = all ]; then |
|||
echo "*** uMatrix.webext-hybrid: Creating package..." |
|||
pushd $DES > /dev/null |
|||
zip ../$(basename $DES).xpi -qr * |
|||
popd > /dev/null |
|||
fi |
|||
|
|||
echo "*** uMatrix.webext-hybrid: Package done." |
Write
Preview
Loading…
Cancel
Save
Reference in new issue