diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index ca8992be389e..a08acdd6fee4 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1380,8 +1380,6 @@ pref("devtools.inspector.showUserAgentStyles", false);
pref("devtools.inspector.showAllAnonymousContent", false);
// Enable the MDN docs tooltip
pref("devtools.inspector.mdnDocsTooltip.enabled", true);
-// Show the new animation inspector UI
-pref("devtools.inspector.animationInspectorV3", false);
// DevTools default color unit
pref("devtools.defaultColorUnit", "hex");
diff --git a/browser/base/content/test/general/browser_parsable_css.js b/browser/base/content/test/general/browser_parsable_css.js
index 3954858f42f4..56c8947506f4 100644
--- a/browser/base/content/test/general/browser_parsable_css.js
+++ b/browser/base/content/test/general/browser_parsable_css.js
@@ -22,13 +22,8 @@ const kWhitelist = [
// Loop standalone client CSS uses placeholder cross browser pseudo-element
{sourceName: /loop\/.*\.css/i,
errorMessage: /Unknown pseudo-class.*placeholder/i},
- // Loop issues that crept in since this test was broken, see bug ...
- {sourceName: /loop\/.*shared\/css\/conversation.css/i,
- errorMessage: /Error in parsing value for 'display'/i},
{sourceName: /loop\/.*shared\/css\/common.css/i,
errorMessage: /Unknown property 'user-select'/i},
- {sourceName: /loop\/.*css\/panel.css/i,
- errorMessage: /Expected color but found 'none'/i},
// Highlighter CSS uses chrome-only pseudo-class, see bug 985597.
{sourceName: /highlighter\.css/i,
errorMessage: /Unknown pseudo-class.*moz-native-anonymous/i},
diff --git a/browser/components/loop/content/css/panel.css b/browser/components/loop/content/css/panel.css
index e2b62fb1102a..fac7a48f8474 100644
--- a/browser/components/loop/content/css/panel.css
+++ b/browser/components/loop/content/css/panel.css
@@ -1068,7 +1068,6 @@ html[dir="rtl"] .settings-menu .dropdown-menu {
border: none;
color: #fff;
background-color: #00a9dc;
- border-color: none;
line-height: 43px;
margin: 0 15px;
padding: 0;
diff --git a/browser/components/loop/content/shared/css/conversation.css b/browser/components/loop/content/shared/css/conversation.css
index 624a66626371..e26ae0a645dc 100644
--- a/browser/components/loop/content/shared/css/conversation.css
+++ b/browser/components/loop/content/shared/css/conversation.css
@@ -1386,7 +1386,6 @@ html[dir="rtl"] .room-context-btn-close {
.media-wrapper > .focus-stream > .local {
position: absolute;
- display:fixed;
right: 0;
left: auto;
/* 30% is the height of the text chat. As we have a margin,
diff --git a/browser/components/preferences/blocklists.js b/browser/components/preferences/blocklists.js
new file mode 100644
index 000000000000..19159c1e4876
--- /dev/null
+++ b/browser/components/preferences/blocklists.js
@@ -0,0 +1,204 @@
+/* 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/. */
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+const TEST_LIST = "test-track-simple";
+const TRACK_SUFFIX = "-track-digest256";
+const TRACKING_TABLE_PREF = "urlclassifier.trackingTable";
+const LISTS_PREF_BRANCH = "browser.safebrowsing.provider.mozilla.lists.";
+
+let gBlocklistManager = {
+ _type: "",
+ _blockLists: [],
+ _brandShortName : null,
+ _bundle: null,
+ _tree: null,
+
+ _view: {
+ _rowCount: 0,
+ get rowCount() {
+ return this._rowCount;
+ },
+ getCellText: function (row, column) {
+ if (column.id == "listCol") {
+ let list = gBlocklistManager._blockLists[row];
+ let desc = list.description ? list.description : "";
+ let text = gBlocklistManager._bundle.getFormattedString("mozNameTemplate",
+ [list.name, desc]);
+ return text;
+ }
+ return "";
+ },
+
+ isSeparator: function(index) { return false; },
+ isSorted: function() { return false; },
+ isContainer: function(index) { return false; },
+ setTree: function(tree) {},
+ getImageSrc: function(row, column) {},
+ getProgressMode: function(row, column) {},
+ getCellValue: function(row, column) {
+ if (column.id == "selectionCol")
+ return gBlocklistManager._blockLists[row].selected;
+ return undefined;
+ },
+ cycleHeader: function(column) {},
+ getRowProperties: function(row) { return ""; },
+ getColumnProperties: function(column) { return ""; },
+ getCellProperties: function(row, column) {
+ if (column.id == "selectionCol") {
+ return "checkmark";
+ }
+
+ return "";
+ }
+ },
+
+ onWindowKeyPress: function (event) {
+ if (event.keyCode == KeyEvent.DOM_VK_ESCAPE) {
+ window.close();
+ } else if (event.keyCode == KeyEvent.DOM_VK_RETURN) {
+ gBlocklistManager.onApplyChanges();
+ }
+ },
+
+ onLoad: function () {
+ this._bundle = document.getElementById("bundlePreferences");
+ let params = window.arguments[0];
+ this.init(params);
+ },
+
+ init: function (params) {
+ if (this._type) {
+ // reusing an open dialog, clear the old observer
+ this.uninit();
+ }
+
+ this._type = "tracking";
+ this._brandShortName = params.brandShortName;
+
+ let blocklistsText = document.getElementById("blocklistsText");
+ while (blocklistsText.hasChildNodes()) {
+ blocklistsText.removeChild(blocklistsText.firstChild);
+ }
+ blocklistsText.appendChild(document.createTextNode(params.introText));
+
+ document.title = params.windowTitle;
+
+ let treecols = document.getElementsByTagName("treecols")[0];
+ treecols.addEventListener("click", event => {
+ if (event.target.nodeName != "treecol" || event.button != 0) {
+ return;
+ }
+ });
+
+ this._loadBlockLists();
+ },
+
+ uninit: function () {},
+
+ onListSelected: function () {
+ for (let list of this._blockLists) {
+ list.selected = false;
+ }
+ this._blockLists[this._tree.currentIndex].selected = true;
+
+ this._updateTree();
+ },
+
+ onApplyChanges: function () {
+ let activeList = this._getActiveList();
+ let selected = null;
+ for (let list of this._blockLists) {
+ if (list.selected) {
+ selected = list;
+ break;
+ }
+ }
+
+ if (activeList !== selected.id) {
+ const Cc = Components.classes, Ci = Components.interfaces;
+ let msg = this._bundle.getFormattedString("blocklistChangeRequiresRestart",
+ [this._brandShortName]);
+ let title = this._bundle.getFormattedString("shouldRestartTitle",
+ [this._brandShortName]);
+ let shouldProceed = Services.prompt.confirm(window, title, msg);
+ if (shouldProceed) {
+ let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"]
+ .createInstance(Ci.nsISupportsPRBool);
+ Services.obs.notifyObservers(cancelQuit, "quit-application-requested",
+ "restart");
+ shouldProceed = !cancelQuit.data;
+
+ if (shouldProceed) {
+ let trackingTable = TEST_LIST + "," + selected.id + TRACK_SUFFIX;
+ Services.prefs.setCharPref(TRACKING_TABLE_PREF, trackingTable);
+
+ Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit |
+ Ci.nsIAppStartup.eRestart);
+ }
+ }
+
+ // Don't close the dialog in case we didn't quit.
+ return;
+ }
+ window.close();
+ },
+
+ _loadBlockLists: function () {
+ 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 {
+ this._createOrUpdateBlockList(itemName);
+ } catch (e) {
+ // Ignore bogus or missing list name.
+ continue;
+ }
+ }
+
+ this._updateTree();
+ },
+
+ _createOrUpdateBlockList: function (itemName) {
+ let branch = Services.prefs.getBranch(LISTS_PREF_BRANCH);
+ let key = branch.getCharPref(itemName);
+ let value = this._bundle.getString(key);
+
+ let suffix = itemName.slice(itemName.lastIndexOf("."));
+ let id = itemName.replace(suffix, "");
+ let list = this._blockLists.find(el => el.id === id);
+ if (!list) {
+ list = { id };
+ this._blockLists.push(list);
+ }
+ list.selected = this._getActiveList() === id;
+
+ // Get the property name from the suffix (e.g. ".name" -> "name").
+ let prop = suffix.slice(1);
+ list[prop] = value;
+
+ return list;
+ },
+
+ _updateTree: function () {
+ this._tree = document.getElementById("blocklistsTree");
+ this._view._rowCount = this._blockLists.length;
+ this._tree.view = this._view;
+ },
+
+ _getActiveList: function () {
+ let activeList = Services.prefs.getCharPref(TRACKING_TABLE_PREF);
+ activeList = activeList.replace(TEST_LIST, "");
+ activeList = activeList.replace(",", "");
+ activeList = activeList.replace(TRACK_SUFFIX, "");
+ return activeList.trim();
+ }
+};
+
+function initWithParams(params) {
+ gBlocklistManager.init(params);
+}
diff --git a/browser/components/preferences/blocklists.xul b/browser/components/preferences/blocklists.xul
new file mode 100644
index 000000000000..523c2081081e
--- /dev/null
+++ b/browser/components/preferences/blocklists.xul
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/browser/components/preferences/in-content/privacy.js b/browser/components/preferences/in-content/privacy.js
index 52faac075e1f..a10e1c7b2cd4 100644
--- a/browser/components/preferences/in-content/privacy.js
+++ b/browser/components/preferences/in-content/privacy.js
@@ -116,6 +116,8 @@ var gPrivacyPane = {
gPrivacyPane.showCookies);
setEventListener("clearDataSettings", "command",
gPrivacyPane.showClearPrivateDataSettings);
+ setEventListener("changeBlockList", "command",
+ gPrivacyPane.showBlockLists);
},
// HISTORY MODE
@@ -365,6 +367,21 @@ var gPrivacyPane = {
this._shouldPromptForRestart = true;
},
+ /**
+ * Displays the available block lists for tracking protection.
+ */
+ showBlockLists: function ()
+ {
+ var bundlePreferences = document.getElementById("bundlePreferences");
+ let brandName = document.getElementById("bundleBrand")
+ .getString("brandShortName");
+ var params = { brandShortName: brandName,
+ windowTitle: bundlePreferences.getString("blockliststitle"),
+ introText: bundlePreferences.getString("blockliststext") };
+ gSubDialog.open("chrome://browser/content/preferences/blocklists.xul",
+ null, params);
+ },
+
// HISTORY
/*
diff --git a/browser/components/preferences/in-content/privacy.xul b/browser/components/preferences/in-content/privacy.xul
index 8f5c85b5c896..e12bc86996b4 100644
--- a/browser/components/preferences/in-content/privacy.xul
+++ b/browser/components/preferences/in-content/privacy.xul
@@ -27,6 +27,9 @@
+
-
+
@@ -116,6 +119,10 @@
+
+
diff --git a/browser/components/preferences/jar.mn b/browser/components/preferences/jar.mn
index 2a184e6849b6..28fac1e50f10 100644
--- a/browser/components/preferences/jar.mn
+++ b/browser/components/preferences/jar.mn
@@ -9,6 +9,8 @@ browser.jar:
content/browser/preferences/aboutPermissions.xml
content/browser/preferences/applicationManager.xul
* content/browser/preferences/applicationManager.js
+ content/browser/preferences/blocklists.xul
+ content/browser/preferences/blocklists.js
* content/browser/preferences/colors.xul
* content/browser/preferences/cookies.xul
* content/browser/preferences/cookies.js
diff --git a/browser/components/search/content/search.xml b/browser/components/search/content/search.xml
index 8ee47044a836..552f422ac9ff 100644
--- a/browser/components/search/content/search.xml
+++ b/browser/components/search/content/search.xml
@@ -1046,7 +1046,7 @@
class="search-panel-one-offs"/>
@@ -1091,6 +1091,16 @@
.engine = currentEngine;
]]>