diff --git a/accessible/atk/nsMaiInterfaceText.cpp b/accessible/atk/nsMaiInterfaceText.cpp index ee3f995018c9..3468fc1ea1d0 100644 --- a/accessible/atk/nsMaiInterfaceText.cpp +++ b/accessible/atk/nsMaiInterfaceText.cpp @@ -330,12 +330,17 @@ static gint getCharacterCountCB(AtkText *aText) { AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText)); - if (!accWrap) - return 0; + if (accWrap) { + HyperTextAccessible* textAcc = accWrap->AsHyperText(); + return + textAcc->IsDefunct() ? 0 : static_cast(textAcc->CharacterCount()); + } - HyperTextAccessible* textAcc = accWrap->AsHyperText(); - return textAcc->IsDefunct() ? - 0 : static_cast(textAcc->CharacterCount()); + if (ProxyAccessible* proxy = GetProxy(ATK_OBJECT(aText))) { + return proxy->CharacterCount(); + } + + return 0; } static gint @@ -362,14 +367,20 @@ static gint getTextSelectionCountCB(AtkText *aText) { AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText)); - if (!accWrap) - return 0; + if (accWrap) { + HyperTextAccessible* text = accWrap->AsHyperText(); + if (!text || !text->IsTextRole()) { + return 0; + } - HyperTextAccessible* text = accWrap->AsHyperText(); - if (!text || !text->IsTextRole()) - return 0; + return text->SelectionCount(); + } - return text->SelectionCount(); + if (ProxyAccessible* proxy = GetProxy(ATK_OBJECT(aText))) { + return proxy->SelectionCount(); + } + + return 0; } static gchar* diff --git a/accessible/ipc/DocAccessibleChild.cpp b/accessible/ipc/DocAccessibleChild.cpp index af0f890e3be4..2d7b413c604f 100644 --- a/accessible/ipc/DocAccessibleChild.cpp +++ b/accessible/ipc/DocAccessibleChild.cpp @@ -207,6 +207,22 @@ DocAccessibleChild::RecvRelations(const uint64_t& aID, return true; } +bool +DocAccessibleChild::RecvCharacterCount(const uint64_t& aID, int32_t* aCount) +{ + HyperTextAccessible* acc = IdToHyperTextAccessible(aID); + *aCount = acc ? acc->CharacterCount() : 0; + return true; +} + +bool +DocAccessibleChild::RecvSelectionCount(const uint64_t& aID, int32_t* aCount) +{ + HyperTextAccessible* acc = IdToHyperTextAccessible(aID); + *aCount = acc ? acc->SelectionCount() : 0; + return true; +} + bool DocAccessibleChild::RecvTextSubstring(const uint64_t& aID, const int32_t& aStartOffset, diff --git a/accessible/ipc/DocAccessibleChild.h b/accessible/ipc/DocAccessibleChild.h index a9626bbd504b..3b798f69980b 100644 --- a/accessible/ipc/DocAccessibleChild.h +++ b/accessible/ipc/DocAccessibleChild.h @@ -63,6 +63,12 @@ public: virtual bool RecvAttributes(const uint64_t& aID, nsTArray *aAttributes) MOZ_OVERRIDE; + + virtual bool RecvCharacterCount(const uint64_t& aID, int32_t* aCount) + MOZ_OVERRIDE; + virtual bool RecvSelectionCount(const uint64_t& aID, int32_t* aCount) + MOZ_OVERRIDE; + virtual bool RecvTextSubstring(const uint64_t& aID, const int32_t& aStartOffset, const int32_t& aEndOffset, nsString* aText) diff --git a/accessible/ipc/PDocAccessible.ipdl b/accessible/ipc/PDocAccessible.ipdl index 7464787cd25f..21be62a09227 100644 --- a/accessible/ipc/PDocAccessible.ipdl +++ b/accessible/ipc/PDocAccessible.ipdl @@ -65,6 +65,8 @@ child: // AccessibleText // TextSubstring is getText in IDL. + prio(high) sync CharacterCount(uint64_t aID) returns(int32_t aCount); + prio(high) sync SelectionCount(uint64_t aID) returns(int32_t aCount); prio(high) sync TextSubstring(uint64_t aID, int32_t aStartOffset, int32_t aEndOffset) returns(nsString aText); prio(high) sync GetTextAfterOffset(uint64_t aID, int32_t aOffset, int32_t aBoundaryType) diff --git a/accessible/ipc/ProxyAccessible.cpp b/accessible/ipc/ProxyAccessible.cpp index 8dd034c50572..3ef225ff06c1 100644 --- a/accessible/ipc/ProxyAccessible.cpp +++ b/accessible/ipc/ProxyAccessible.cpp @@ -149,6 +149,22 @@ ProxyAccessible::Relations(nsTArray* aTypes, } } +int32_t +ProxyAccessible::CharacterCount() +{ + int32_t count = 0; + unused << mDoc->SendCharacterCount(mID, &count); + return count; +} + +int32_t +ProxyAccessible::SelectionCount() +{ + int32_t count = 0; + unused << mDoc->SendSelectionCount(mID, &count); + return count; +} + void ProxyAccessible::TextSubstring(int32_t aStartOffset, int32_t aEndOfset, nsString& aText) const diff --git a/accessible/ipc/ProxyAccessible.h b/accessible/ipc/ProxyAccessible.h index 83fae3b88921..7c89f3dd8524 100644 --- a/accessible/ipc/ProxyAccessible.h +++ b/accessible/ipc/ProxyAccessible.h @@ -99,6 +99,9 @@ public: void Relations(nsTArray* aTypes, nsTArray>* aTargetSets) const; + int32_t CharacterCount(); + int32_t SelectionCount(); + /** * Get the text between the given offsets. */ diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 20fd6f382b3f..904dbfb80c44 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1226,8 +1226,8 @@ pref("security.sandbox.windows.log.stackTraceDepth", 0); // 2 -> "an ideal sandbox which may break many things" // This setting is read when the content process is started. On Mac the content // process is killed when all windows are closed, so a change will take effect -// when the 1st window is opened. It was decided to default this setting to 1. -pref("security.sandbox.macos.content.level", 1); +// when the 1st window is opened. +pref("security.sandbox.macos.content.level", 0); #endif // This pref governs whether we attempt to work around problems caused by diff --git a/browser/base/content/browser-sidebar.js b/browser/base/content/browser-sidebar.js index 258205e7c1f6..3a76e5507548 100644 --- a/browser/base/content/browser-sidebar.js +++ b/browser/base/content/browser-sidebar.js @@ -32,11 +32,7 @@ let SidebarUI = { this._title = document.getElementById("sidebar-title"); this._splitter = document.getElementById("sidebar-splitter"); - if (window.opener && !window.opener.closed && - window.opener.document.documentURIObject.schemeIs("chrome") && - PrivateBrowsingUtils.isWindowPrivate(window) == PrivateBrowsingUtils.isWindowPrivate(window.opener)) { - this.adoptFromWindow(window.opener); - } else { + if (!this.adoptFromWindow(window.opener)) { let commandID = this._box.getAttribute("sidebarcommand"); if (commandID) { let command = document.getElementById(commandID); @@ -67,24 +63,40 @@ let SidebarUI = { }, /** - * Adopt the status of the sidebar from another window. + * Try and adopt the status of the sidebar from another window. * @param {Window} sourceWindow - Window to use as a source for sidebar status. + * @return true if we adopted the state, or false if the caller should + * initialize the state itself. */ adoptFromWindow(sourceWindow) { + // No source window, or it being closed, or not chrome, or in a different + // private-browsing context means we can't adopt. + if (!sourceWindow || sourceWindow.closed || + !sourceWindow.document.documentURIObject.schemeIs("chrome") || + PrivateBrowsingUtils.isWindowPrivate(window) != PrivateBrowsingUtils.isWindowPrivate(sourceWindow)) { + return false; + } + // If the opener had a sidebar, open the same sidebar in our window. // The opener can be the hidden window too, if we're coming from the state // where no windows are open, and the hidden window has no sidebar box. let sourceUI = sourceWindow.SidebarUI; - if (!sourceUI || sourceUI._box.hidden) { - return; + if (!sourceUI || !sourceUI._box) { + // no source UI or no _box means we also can't adopt the state. + return false; + } + if (sourceUI._box.hidden) { + // just hidden means we have adopted the hidden state. + return true; } let commandID = sourceUI._box.getAttribute("sidebarcommand"); let commandElem = document.getElementById(commandID); - // dynamically generated sidebars will fail this check. + // dynamically generated sidebars will fail this check, but we still + // consider it adopted. if (!commandElem) { - return; + return true; } this._title.setAttribute("value", @@ -101,6 +113,7 @@ let SidebarUI = { this._box.hidden = false; this._splitter.hidden = false; commandElem.setAttribute("checked", "true"); + return true; }, /** diff --git a/browser/components/loop/test/functional/config.py b/browser/components/loop/test/functional/config.py index ed95163322ab..940ef234419e 100644 --- a/browser/components/loop/test/functional/config.py +++ b/browser/components/loop/test/functional/config.py @@ -16,5 +16,7 @@ FIREFOX_PREFERENCES = { "loop.seenToS": "seen", # this dialog is fragile, and likely to introduce intermittent failures - "media.navigator.permission.disabled": True + "media.navigator.permission.disabled": True, + # Use fake streams only + "media.navigator.streams.fake": True } diff --git a/browser/components/loop/test/functional/test_1_browser_call.py b/browser/components/loop/test/functional/test_1_browser_call.py index 70c17b7456db..54281267178a 100644 --- a/browser/components/loop/test/functional/test_1_browser_call.py +++ b/browser/components/loop/test/functional/test_1_browser_call.py @@ -1,12 +1,18 @@ from marionette_test import MarionetteTestCase -from by import By -import urlparse -from errors import NoSuchElementException, StaleElementException -# noinspection PyUnresolvedReferences -from wait import Wait +try: + from by import By + from errors import NoSuchElementException, StaleElementException + # noinspection PyUnresolvedReferences + from wait import Wait +except ImportError: + from marionette_driver.by import By + from marionette_driver.errors import NoSuchElementException, StaleElementException + # noinspection PyUnresolvedReferences + from marionette_driver import Wait import os import sys +import urlparse sys.path.insert(1, os.path.dirname(os.path.abspath(__file__))) import pyperclip diff --git a/browser/components/loop/test/shared/frontend_tester.py b/browser/components/loop/test/shared/frontend_tester.py index 7835fae0b9d4..d5364853a173 100644 --- a/browser/components/loop/test/shared/frontend_tester.py +++ b/browser/components/loop/test/shared/frontend_tester.py @@ -1,5 +1,5 @@ from marionette_test import MarionetteTestCase -from errors import NoSuchElementException +from marionette_driver.errors import NoSuchElementException import threading import SimpleHTTPServer import SocketServer diff --git a/browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js b/browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js index 2dd215e3afdf..1ad6cff88fd2 100644 --- a/browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js +++ b/browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js @@ -37,6 +37,7 @@ add_task(function* setup_server() { add_task(function* error_offline() { Services.io.offline = true; + Services.prefs.setBoolPref("network.dns.offline-localhost", false); yield MozLoopServiceInternal.hawkRequestInternal(LOOP_SESSION_TYPE.GUEST, "/offline", "GET").then( () => Assert.ok(false, "Should have rejected"), (error) => { @@ -179,6 +180,7 @@ function run_test() { Services.prefs.clearUserPref("loop.hawk-session-token"); Services.prefs.clearUserPref("loop.hawk-session-token.fxa"); Services.prefs.clearUserPref("loop.urlsExpiryTimeSeconds"); + Services.prefs.clearUserPref("network.dns.offline-localhost"); MozLoopService.errors.clear(); }); diff --git a/browser/components/preferences/permissions.js b/browser/components/preferences/permissions.js index 0c0b6620a495..219ab8dfe1c1 100644 --- a/browser/components/preferences/permissions.js +++ b/browser/components/preferences/permissions.js @@ -3,12 +3,14 @@ * 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 nsIPermissionManager = Components.interfaces.nsIPermissionManager; const nsICookiePermission = Components.interfaces.nsICookiePermission; const NOTIFICATION_FLUSH_PERMISSIONS = "flush-pending-permissions"; -function Permission(host, rawHost, type, capability) +function Permission(host, rawHost, type, capability) { this.host = host; this.rawHost = rawHost; @@ -17,18 +19,19 @@ function Permission(host, rawHost, type, capability) } var gPermissionManager = { - _type : "", - _permissions : [], - _pm : Components.classes["@mozilla.org/permissionmanager;1"] - .getService(Components.interfaces.nsIPermissionManager), - _bundle : null, - _tree : null, - + _type : "", + _permissions : [], + _permissionsToAdd : new Map(), + _permissionsToDelete : new Map(), + _bundle : null, + _tree : null, + _observerRemoved : false, + _view: { _rowCount: 0, - get rowCount() - { - return this._rowCount; + get rowCount() + { + return this._rowCount; }, getCellText: function (aRow, aColumn) { @@ -56,7 +59,7 @@ var gPermissionManager = { return ""; } }, - + _getCapabilityString: function (aCapability) { var stringKey = null; @@ -76,44 +79,47 @@ var gPermissionManager = { } return this._bundle.getString(stringKey); }, - + addPermission: function (aCapability) { var textbox = document.getElementById("url"); var host = textbox.value.replace(/^\s*([-\w]*:\/+)?/, ""); // trim any leading space and scheme try { - var ioService = Components.classes["@mozilla.org/network/io-service;1"] - .getService(Components.interfaces.nsIIOService); - var uri = ioService.newURI("http://"+host, null, null); + var uri = Services.io.newURI("http://"+host, null, null); host = uri.host; } catch(ex) { - var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] - .getService(Components.interfaces.nsIPromptService); var message = this._bundle.getString("invalidURI"); var title = this._bundle.getString("invalidURITitle"); - promptService.alert(window, title, message); + Services.prompt.alert(window, title, message); return; } var capabilityString = this._getCapabilityString(aCapability); // check whether the permission already exists, if not, add it - var exists = false; + let hostExists = false; + let capabilityExists = false; for (var i = 0; i < this._permissions.length; ++i) { if (this._permissions[i].rawHost == host) { - // Avoid calling the permission manager if the capability settings are - // the same. Otherwise allow the call to the permissions manager to - // update the listbox for us. - exists = this._permissions[i].capability == capabilityString; + hostExists = true; + capabilityExists = this._permissions[i].capability == capabilityString; + if (!capabilityExists) { + this._permissions[i].capability = capabilityString; + } break; } } - - if (!exists) { - host = (host.charAt(0) == ".") ? host.substring(1,host.length) : host; - var uri = ioService.newURI("http://" + host, null, null); - this._pm.add(uri, this._type, aCapability); + + let permissionParams = {host: host, type: this._type, capability: aCapability}; + if (!hostExists) { + this._permissionsToAdd.set(host, permissionParams); + this._addPermission(permissionParams); } + else if (!capabilityExists) { + this._permissionsToAdd.set(host, permissionParams); + this._handleCapabilityChange(); + } + textbox.value = ""; textbox.focus(); @@ -123,14 +129,57 @@ var gPermissionManager = { // enable "remove all" button as needed document.getElementById("removeAllPermissions").disabled = this._permissions.length == 0; }, - + + _removePermission: function(aPermission) + { + this._removePermissionFromList(aPermission.host); + + // If this permission was added during this session, let's remove + // it from the pending adds list to prevent calls to the + // permission manager. + let isNewPermission = this._permissionsToAdd.delete(aPermission.host); + + if (!isNewPermission) { + this._permissionsToDelete.set(aPermission.host, aPermission); + } + + }, + + _handleCapabilityChange: function () + { + // Re-do the sort, if the status changed from Block to Allow + // or vice versa, since if we're sorted on status, we may no + // longer be in order. + if (this._lastPermissionSortColumn.id == "statusCol") { + this._resortPermissions(); + } + this._tree.treeBoxObject.invalidate(); + }, + + _addPermission: function(aPermission) + { + this._addPermissionToList(aPermission); + ++this._view._rowCount; + this._tree.treeBoxObject.rowCountChanged(this._view.rowCount - 1, 1); + // Re-do the sort, since we inserted this new item at the end. + this._resortPermissions(); + }, + + _resortPermissions: function() + { + gTreeUtils.sort(this._tree, this._view, this._permissions, + this._permissionsComparator, + this._lastPermissionSortColumn, + this._lastPermissionSortAscending); + }, + onHostInput: function (aSiteField) { document.getElementById("btnSession").disabled = !aSiteField.value; document.getElementById("btnBlock").disabled = !aSiteField.value; document.getElementById("btnAllow").disabled = !aSiteField.value; }, - + onWindowKeyPress: function (aEvent) { if (aEvent.keyCode == KeyEvent.DOM_VK_ESCAPE) @@ -142,14 +191,14 @@ var gPermissionManager = { if (aEvent.keyCode == KeyEvent.DOM_VK_RETURN) document.getElementById("btnAllow").click(); }, - + onLoad: function () { this._bundle = document.getElementById("bundlePreferences"); var params = window.arguments[0]; this.init(params); }, - + init: function (aParams) { if (this._type) { @@ -159,14 +208,14 @@ var gPermissionManager = { this._type = aParams.permissionType; this._manageCapability = aParams.manageCapability; - + var permissionsText = document.getElementById("permissionsText"); while (permissionsText.hasChildNodes()) permissionsText.removeChild(permissionsText.firstChild); permissionsText.appendChild(document.createTextNode(aParams.introText)); document.title = aParams.windowTitle; - + document.getElementById("btnBlock").hidden = !aParams.blockVisible; document.getElementById("btnSession").hidden = !aParams.sessionVisible; document.getElementById("btnAllow").hidden = !aParams.allowVisible; @@ -182,23 +231,23 @@ var gPermissionManager = { var urlLabel = document.getElementById("urlLabel"); urlLabel.hidden = !urlFieldVisible; - var os = Components.classes["@mozilla.org/observer-service;1"] - .getService(Components.interfaces.nsIObserverService); - os.notifyObservers(null, NOTIFICATION_FLUSH_PERMISSIONS, this._type); - os.addObserver(this, "perm-changed", false); + Services.obs.notifyObservers(null, NOTIFICATION_FLUSH_PERMISSIONS, this._type); + Services.obs.addObserver(this, "perm-changed", false); this._loadPermissions(); - + urlField.focus(); }, - + uninit: function () { - var os = Components.classes["@mozilla.org/observer-service;1"] - .getService(Components.interfaces.nsIObserverService); - os.removeObserver(this, "perm-changed"); + if (!this._observerRemoved) { + Services.obs.removeObserver(this, "perm-changed"); + + this._observerRemoved = true; + } }, - + observe: function (aSubject, aTopic, aData) { if (aTopic == "perm-changed") { @@ -209,14 +258,7 @@ var gPermissionManager = { return; if (aData == "added") { - this._addPermissionToList(permission); - ++this._view._rowCount; - this._tree.treeBoxObject.rowCountChanged(this._view.rowCount - 1, 1); - // Re-do the sort, since we inserted this new item at the end. - gTreeUtils.sort(this._tree, this._view, this._permissions, - this._permissionsComparator, - this._lastPermissionSortColumn, - this._lastPermissionSortAscending); + this._addPermission(permission); } else if (aData == "changed") { for (var i = 0; i < this._permissions.length; ++i) { @@ -225,31 +267,14 @@ var gPermissionManager = { break; } } - // Re-do the sort, if the status changed from Block to Allow - // or vice versa, since if we're sorted on status, we may no - // longer be in order. - if (this._lastPermissionSortColumn.id == "statusCol") { - gTreeUtils.sort(this._tree, this._view, this._permissions, - this._permissionsComparator, - this._lastPermissionSortColumn, - this._lastPermissionSortAscending); - } - this._tree.treeBoxObject.invalidate(); + this._handleCapabilityChange(); } else if (aData == "deleted") { - for (var i = 0; i < this._permissions.length; i++) { - if (this._permissions[i].host == permission.host) { - this._permissions.splice(i, 1); - this._view._rowCount--; - this._tree.treeBoxObject.rowCountChanged(this._view.rowCount - 1, -1); - this._tree.treeBoxObject.invalidate(); - break; - } - } + this._removePermissionFromList(permission); } } }, - + onPermissionSelected: function () { var hasSelection = this._tree.view.selection.count > 0; @@ -257,7 +282,7 @@ var gPermissionManager = { document.getElementById("removePermission").disabled = !hasRows || !hasSelection; document.getElementById("removeAllPermissions").disabled = !hasRows; }, - + onPermissionDeleted: function () { if (!this._view.rowCount) @@ -266,12 +291,12 @@ var gPermissionManager = { gTreeUtils.deleteSelectedItems(this._tree, this._view, this._permissions, removedPermissions); for (var i = 0; i < removedPermissions.length; ++i) { var p = removedPermissions[i]; - this._pm.remove(p.host, p.type); - } + this._removePermission(p); + } document.getElementById("removePermission").disabled = !this._permissions.length; document.getElementById("removeAllPermissions").disabled = !this._permissions.length; }, - + onAllPermissionsDeleted: function () { if (!this._view.rowCount) @@ -280,12 +305,12 @@ var gPermissionManager = { gTreeUtils.deleteAll(this._tree, this._view, this._permissions, removedPermissions); for (var i = 0; i < removedPermissions.length; ++i) { var p = removedPermissions[i]; - this._pm.remove(p.host, p.type); - } + this._removePermission(p); + } document.getElementById("removePermission").disabled = true; document.getElementById("removeAllPermissions").disabled = true; }, - + onPermissionKeyPress: function (aEvent) { if (aEvent.keyCode == KeyEvent.DOM_VK_DELETE @@ -295,7 +320,7 @@ var gPermissionManager = { ) this.onPermissionDeleted(); }, - + _lastPermissionSortColumn: "", _lastPermissionSortAscending: false, _permissionsComparator : function (a, b) @@ -303,19 +328,38 @@ var gPermissionManager = { return a.toLowerCase().localeCompare(b.toLowerCase()); }, - + onPermissionSort: function (aColumn) { - this._lastPermissionSortAscending = gTreeUtils.sort(this._tree, - this._view, + this._lastPermissionSortAscending = gTreeUtils.sort(this._tree, + this._view, this._permissions, aColumn, this._permissionsComparator, - this._lastPermissionSortColumn, + this._lastPermissionSortColumn, this._lastPermissionSortAscending); this._lastPermissionSortColumn = aColumn; }, - + + onApplyChanges: function() + { + // Stop observing permission changes since we are about + // to write out the pending adds/deletes and don't need + // to update the UI + this.uninit(); + + for (let permissionParams of this._permissionsToAdd.values()) { + let uri = Services.io.newURI("http://" + permissionParams.host, null, null); + Services.perms.add(uri, permissionParams.type, permissionParams.capability); + } + + for (let p of this._permissionsToDelete.values()) { + Services.perms.remove(p.host, p.type); + } + + window.close(); + }, + _loadPermissions: function () { this._tree = document.getElementById("permissionsTree"); @@ -323,12 +367,12 @@ var gPermissionManager = { // load permissions into a table var count = 0; - var enumerator = this._pm.enumerator; + var enumerator = Services.perms.enumerator; while (enumerator.hasMoreElements()) { var nextPermission = enumerator.getNext().QueryInterface(Components.interfaces.nsIPermission); this._addPermissionToList(nextPermission); } - + this._view._rowCount = this._permissions.length; // sort and display the table @@ -338,7 +382,7 @@ var gPermissionManager = { // disable "remove all" button if there are none document.getElementById("removeAllPermissions").disabled = this._permissions.length == 0; }, - + _addPermissionToList: function (aPermission) { if (aPermission.type == this._type && @@ -352,9 +396,22 @@ var gPermissionManager = { aPermission.type, capabilityString); this._permissions.push(p); - } + } }, - + + _removePermissionFromList: function (aHost) + { + for (let i = 0; i < this._permissions.length; ++i) { + if (this._permissions[i].host == aHost) { + this._permissions.splice(i, 1); + this._view._rowCount--; + this._tree.treeBoxObject.rowCountChanged(this._view.rowCount - 1, -1); + this._tree.treeBoxObject.invalidate(); + break; + } + } + }, + setHost: function (aHost) { document.getElementById("url").value = aHost; diff --git a/browser/components/preferences/permissions.xul b/browser/components/preferences/permissions.xul index 22ec2f10581c..e8c5ba56a049 100644 --- a/browser/components/preferences/permissions.xul +++ b/browser/components/preferences/permissions.xul @@ -61,8 +61,8 @@ - - + +