summaryrefslogtreecommitdiffstats
path: root/browser/components/preferences/dialogs/blocklists.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/preferences/dialogs/blocklists.js')
-rw-r--r--browser/components/preferences/dialogs/blocklists.js175
1 files changed, 175 insertions, 0 deletions
diff --git a/browser/components/preferences/dialogs/blocklists.js b/browser/components/preferences/dialogs/blocklists.js
new file mode 100644
index 0000000000..c28ee09f96
--- /dev/null
+++ b/browser/components/preferences/dialogs/blocklists.js
@@ -0,0 +1,175 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const BASE_LIST_ID = "base";
+const CONTENT_LIST_ID = "content";
+const TRACK_SUFFIX = "-track-digest256";
+const TRACKING_TABLE_PREF = "urlclassifier.trackingTable";
+const LISTS_PREF_BRANCH = "browser.safebrowsing.provider.mozilla.lists.";
+
+var gBlocklistManager = {
+ _type: "",
+ _blockLists: [],
+ _tree: null,
+
+ _view: {
+ _rowCount: 0,
+ get rowCount() {
+ return this._rowCount;
+ },
+ getCellText(row, column) {
+ if (column.id == "listCol") {
+ let list = gBlocklistManager._blockLists[row];
+ return list.name;
+ }
+ return "";
+ },
+
+ isSeparator(index) {
+ return false;
+ },
+ isSorted() {
+ return false;
+ },
+ isContainer(index) {
+ return false;
+ },
+ setTree(tree) {},
+ getImageSrc(row, column) {},
+ getCellValue(row, column) {
+ if (column.id == "selectionCol") {
+ return gBlocklistManager._blockLists[row].selected;
+ }
+ return undefined;
+ },
+ cycleHeader(column) {},
+ getRowProperties(row) {
+ return "";
+ },
+ getColumnProperties(column) {
+ return "";
+ },
+ getCellProperties(row, column) {
+ if (column.id == "selectionCol") {
+ return "checkmark";
+ }
+
+ return "";
+ },
+ },
+
+ onLoad() {
+ this.init();
+ document.addEventListener("dialogaccept", () => this.onApplyChanges());
+ },
+
+ init() {
+ if (this._type) {
+ // reusing an open dialog, clear the old observer
+ this.uninit();
+ }
+
+ this._type = "tracking";
+
+ this._loadBlockLists();
+ },
+
+ uninit() {},
+
+ onListSelected() {
+ for (let list of this._blockLists) {
+ list.selected = false;
+ }
+ this._blockLists[this._tree.currentIndex].selected = true;
+
+ this._updateTree();
+ },
+
+ onApplyChanges() {
+ let activeList = this._getActiveList();
+ let selected = null;
+ for (let list of this._blockLists) {
+ if (list.selected) {
+ selected = list;
+ break;
+ }
+ }
+
+ if (activeList !== selected.id) {
+ let trackingTable = Services.prefs.getCharPref(TRACKING_TABLE_PREF);
+ if (selected.id != CONTENT_LIST_ID) {
+ trackingTable = trackingTable.replace(
+ "," + CONTENT_LIST_ID + TRACK_SUFFIX,
+ ""
+ );
+ } else {
+ trackingTable += "," + CONTENT_LIST_ID + TRACK_SUFFIX;
+ }
+ Services.prefs.setCharPref(TRACKING_TABLE_PREF, trackingTable);
+
+ // Force an update after changing the tracking protection table.
+ let listmanager = Cc[
+ "@mozilla.org/url-classifier/listmanager;1"
+ ].getService(Ci.nsIUrlListManager);
+ if (listmanager) {
+ listmanager.forceUpdates(trackingTable);
+ }
+ }
+ },
+
+ async _loadBlockLists() {
+ this._blockLists = [];
+
+ // Load blocklists into a table.
+ let branch = Services.prefs.getBranch(LISTS_PREF_BRANCH);
+ let itemArray = branch.getChildList("");
+ for (let itemName of itemArray) {
+ try {
+ let list = await this._createBlockList(itemName);
+ this._blockLists.push(list);
+ } catch (e) {
+ // Ignore bogus or missing list name.
+ continue;
+ }
+ }
+
+ this._updateTree();
+ },
+
+ async _createBlockList(id) {
+ let branch = Services.prefs.getBranch(LISTS_PREF_BRANCH);
+ let l10nKey = branch.getCharPref(id);
+
+ // eslint-disable-next-line mozilla/prefer-formatValues
+ let [listName, description] = await document.l10n.formatValues([
+ { id: `blocklist-item-${l10nKey}-listName` },
+ { id: `blocklist-item-${l10nKey}-description` },
+ ]);
+
+ // eslint-disable-next-line mozilla/prefer-formatValues
+ let name = await document.l10n.formatValue("blocklist-item-list-template", {
+ listName,
+ description,
+ });
+
+ return {
+ id,
+ name,
+ selected: this._getActiveList() === id,
+ };
+ },
+
+ _updateTree() {
+ this._tree = document.getElementById("blocklistsTree");
+ this._view._rowCount = this._blockLists.length;
+ this._tree.view = this._view;
+ },
+
+ _getActiveList() {
+ let trackingTable = Services.prefs.getCharPref(TRACKING_TABLE_PREF);
+ return trackingTable.includes(CONTENT_LIST_ID)
+ ? CONTENT_LIST_ID
+ : BASE_LIST_ID;
+ },
+};