diff --git a/platform/webext/bootstrap.js b/platform/webext/bootstrap.js
deleted file mode 100644
index 3f770948e..000000000
--- a/platform/webext/bootstrap.js
+++ /dev/null
@@ -1,276 +0,0 @@
-/*******************************************************************************
-
- uBlock Origin - a browser extension to block requests.
- Copyright (C) 2014-2017 The uBlock Origin authors
-
- 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
-*/
-
-/* exported startup, shutdown, install, uninstall */
-
-'use strict';
-
-/******************************************************************************/
-
-const hostName = 'ublock0';
-
-/******************************************************************************/
-
-function startup({ webExtension }, reason) {
- webExtension.startup(reason).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,
- };
-};
-
-/******************************************************************************/
diff --git a/platform/webext/chrome.manifest b/platform/webext/chrome.manifest
deleted file mode 100644
index 75781cd6f..000000000
--- a/platform/webext/chrome.manifest
+++ /dev/null
@@ -1 +0,0 @@
-content ublock0 ./
diff --git a/platform/webext/from-legacy.js b/platform/webext/from-legacy.js
deleted file mode 100644
index cf0fd4927..000000000
--- a/platform/webext/from-legacy.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
-
- uBlock Origin - a browser extension to block 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/uBlock
-*/
-
-// For background page
-
-'use strict';
-
-/******************************************************************************/
-
-(function() {
- let µb = µBlock;
- let migratedKeys = new Set();
- let reCacheStorageKeys = /^(?:assetCacheRegistry|assetSourceRegistry|cache\/.+|selfie)$/;
-
- let migrateAll = function(callback) {
- let migrateKeyValue = function(details, callback) {
- // https://github.com/gorhill/uBlock/issues/2653
- // Be ready to deal graciously with corrupted DB.
- if ( migratedKeys.has(details.key) ) {
- callback();
- return;
- }
- migratedKeys.add(details.key);
- let bin = {};
- bin[details.key] = JSON.parse(details.value);
- if ( reCacheStorageKeys.test(details.key) ) {
- vAPI.cacheStorage.set(bin, callback);
- } else {
- vAPI.storage.set(bin, callback);
- }
- };
-
- let migrateNext = function() {
- self.browser.runtime.sendMessage({ what: 'webext:storageMigrateNext' }, response => {
- if ( response.key === undefined ) {
- if ( migratedKeys.size !== 0 ) {
- 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();
- }
- vAPI.storage.set({ legacyStorageMigrated: true });
- migrateNext();
- });
- };
-
- µb.onBeforeStartQueue.push(migrateAll);
-})();
-
-/******************************************************************************/
diff --git a/platform/webext/install.rdf b/platform/webext/install.rdf
deleted file mode 100644
index cc8a8b258..000000000
--- a/platform/webext/install.rdf
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
- uBlock0@raymondhill.net
- {version}
- {name}
- {description}
- https://github.com/gorhill/uBlock
- {author}
- Deathamns
- Alex Vallat
- Manuel Reimer
- 2
- true
- true
- true
-{localized}
-
-
-
-
- {{ec8030f7-c20a-464f-9b0e-13a3a9e97384}}
- 54.0
- 56.*
-
-
-
-
-
-
- {{aa3c5121-dab2-40e2-81ca-7ea25febc110}}
- 54.0
- 56.*
-
-
-
-
-
diff --git a/tools/make-webext-hybrid-meta.py b/tools/make-webext-hybrid-meta.py
deleted file mode 100644
index 5e3a22b4c..000000000
--- a/tools/make-webext-hybrid-meta.py
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/usr/bin/env python3
-
-import os
-import json
-import re
-import sys
-from io import open as uopen
-from collections import OrderedDict
-
-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/uBlock'
-webext_manifest['description'] = 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 + '\n' +
- t3 + '' + alpha2 + '\n' +
- t3 + '' + webext_manifest['name'] + '\n' +
- t3 + '' + descriptions[alpha2] + '\n' +
- t3 + '' + webext_manifest['author'] + '\n' +
- # t3 + '' + ??? + '\n' +
- t3 + '' + webext_manifest['homepage'] + '\n' +
- t*2 + ''
- )
-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()
diff --git a/tools/make-webext-hybrid.sh b/tools/make-webext-hybrid.sh
deleted file mode 100755
index 728570410..000000000
--- a/tools/make-webext-hybrid.sh
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/env bash
-#
-# This script assumes a linux environment
-
-echo "*** uBlock0.webext-hybrid: Creating web store package"
-echo "*** uBlock0.webext-hybrid: Copying files"
-
-DES=dist/build/uBlock0.webext-hybrid
-rm -rf $DES
-mkdir -p $DES/webextension
-
-bash ./tools/make-assets.sh $DES/webextension
-
-cp -R src/css $DES/webextension/
-cp -R src/img $DES/webextension/
-cp -R src/js $DES/webextension/
-cp -R src/lib $DES/webextension/
-cp -R src/_locales $DES/webextension/
-cp -R $DES/webextension/_locales/nb $DES/webextension/_locales/no
-cp src/*.html $DES/webextension/
-cp platform/chromium/*.js $DES/webextension/js/
-cp -R platform/chromium/img $DES/webextension/
-cp platform/chromium/*.html $DES/webextension/
-cp platform/chromium/*.json $DES/webextension/
-cp LICENSE.txt $DES/webextension/
-
-cp platform/webext/manifest.json $DES/webextension/
-cp platform/webext/background.html $DES/webextension/
-cp platform/webext/options_ui.html $DES/webextension/
-cp platform/webext/polyfill.js $DES/webextension/js/
-cp platform/webext/vapi-usercss.js $DES/webextension/js/
-cp platform/webext/vapi-cachestorage.js $DES/webextension/js/
-cp platform/webext/from-legacy.js $DES/webextension/js/
-rm $DES/webextension/js/options_ui.js
-
-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 "*** uBlock0.webext-hybrid: Generating meta..."
-python tools/make-webext-hybrid-meta.py $DES/
-
-if [ "$1" = all ]; then
- echo "*** uBlock0.webext-hybrid: Creating package..."
- pushd $DES > /dev/null
- zip ../$(basename $DES).xpi -qr *
- popd > /dev/null
-fi
-
-echo "*** uBlock0.webext-hybrid: Package done."