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 @@ + + + + + + + + + + + +