diff --git a/b2g/config/aries/sources.xml b/b2g/config/aries/sources.xml index 14fcb8f20b0d..fc4fdd2f51fe 100644 --- a/b2g/config/aries/sources.xml +++ b/b2g/config/aries/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/dolphin/sources.xml b/b2g/config/dolphin/sources.xml index 9da4a44f7f7c..1324f67553eb 100644 --- a/b2g/config/dolphin/sources.xml +++ b/b2g/config/dolphin/sources.xml @@ -15,7 +15,7 @@ - + @@ -128,7 +128,7 @@ - + diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index f957517a30eb..49eca3d14f90 100644 --- a/b2g/config/emulator-ics/sources.xml +++ b/b2g/config/emulator-ics/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/emulator-jb/sources.xml b/b2g/config/emulator-jb/sources.xml index 7effa8af8dd7..814b88f0dbe2 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/emulator-kk/sources.xml b/b2g/config/emulator-kk/sources.xml index f8355ff80370..9169f6cf5d99 100644 --- a/b2g/config/emulator-kk/sources.xml +++ b/b2g/config/emulator-kk/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/emulator-l/sources.xml b/b2g/config/emulator-l/sources.xml index e5e2cb66f29b..a4063cf578b1 100644 --- a/b2g/config/emulator-l/sources.xml +++ b/b2g/config/emulator-l/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index f957517a30eb..49eca3d14f90 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -19,7 +19,7 @@ - + diff --git a/b2g/config/flame-kk/sources.xml b/b2g/config/flame-kk/sources.xml index b8a3fabc3109..7ce1c07068c0 100644 --- a/b2g/config/flame-kk/sources.xml +++ b/b2g/config/flame-kk/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index 82378628feea..a59c4a92e292 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,9 +1,9 @@ { "git": { - "git_revision": "59ce66c60e71b434061aeaf11e945814b234c355", + "git_revision": "68d369c2a2b0cd16db028f0c2e660107c52ce113", "remote": "https://git.mozilla.org/releases/gaia.git", "branch": "" }, - "revision": "8ab354e8ef85b6ee872eb7eb1710a8e094c93b18", + "revision": "041d99d0bd97e84219626c711c4c709e9558dfaa", "repo_path": "integration/gaia-central" } diff --git a/b2g/config/nexus-4/sources.xml b/b2g/config/nexus-4/sources.xml index 454cc144eb7d..310930f1c7ed 100644 --- a/b2g/config/nexus-4/sources.xml +++ b/b2g/config/nexus-4/sources.xml @@ -17,7 +17,7 @@ - + diff --git a/b2g/config/nexus-5-l/sources.xml b/b2g/config/nexus-5-l/sources.xml index 975dff4d4b77..86ccffaee836 100644 --- a/b2g/config/nexus-5-l/sources.xml +++ b/b2g/config/nexus-5-l/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 80037169ebec..16f6451ec371 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -6678,12 +6678,10 @@ var gIdentityHandler = { IDENTITY_MODE_MIXED_ACTIVE_BLOCKED : "verifiedDomain mixedContent mixedActiveBlocked", // SSL with unauthenticated active content blocked; no unauthenticated display content IDENTITY_MODE_MIXED_ACTIVE_BLOCKED_IDENTIFIED : "verifiedIdentity mixedContent mixedActiveBlocked", // SSL with unauthenticated active content blocked; no unauthenticated display content IDENTITY_MODE_CHROMEUI : "chromeUI", // Part of the product's UI - IDENTITY_MODE_FILE_URI : "fileURI", // File path - // Cache the most recent SSLStatus and Location seen in checkIdentity - _lastStatus : null, - _lastUri : null, - _mode : "unknownIdentity", + _isChromeUI: false, + _sslStatus: null, + _uri: null, // smart getters get _identityPopup () { @@ -6714,20 +6712,10 @@ var gIdentityHandler = { return this._identityPopupContentVerif = document.getElementById("identity-popup-content-verifier"); }, - get _identityPopupSecurityContent () { - delete this._identityPopupSecurityContent; - return this._identityPopupSecurityContent = - document.getElementById("identity-popup-security-content"); - }, - get _identityPopupSecurityView () { - delete this._identityPopupSecurityView; - return this._identityPopupSecurityView = - document.getElementById("identity-popup-securityView"); - }, - get _identityPopupMainView () { - delete this._identityPopupMainView; - return this._identityPopupMainView = - document.getElementById("identity-popup-mainView"); + get _identityPopupMixedContentLearnMore () { + delete this._identityPopupMixedContentLearnMore; + return this._identityPopupMixedContentLearnMore = + document.getElementById("identity-popup-mcb-learn-more"); }, get _identityIconLabel () { delete this._identityIconLabel; @@ -6806,13 +6794,33 @@ var gIdentityHandler = { } }, + disableMixedContentProtection() { + // Use telemetry to measure how often unblocking happens + const kMIXED_CONTENT_UNBLOCK_EVENT = 2; + let histogram = + Services.telemetry.getHistogramById( + "MIXED_CONTENT_UNBLOCK_COUNTER"); + histogram.add(kMIXED_CONTENT_UNBLOCK_EVENT); + // Reload the page with the content unblocked + BrowserReloadWithFlags( + Ci.nsIWebNavigation.LOAD_FLAGS_ALLOW_MIXED_CONTENT); + this._identityPopup.hidePopup(); + }, + + enableMixedContentProtection() { + gBrowser.selectedBrowser.messageManager.sendAsyncMessage( + "MixedContent:ReenableProtection", {}); + BrowserReload(); + this._identityPopup.hidePopup(); + }, + /** - * Helper to parse out the important parts of _lastStatus (of the SSL cert in + * Helper to parse out the important parts of _sslStatus (of the SSL cert in * particular) for use in constructing identity UI strings */ getIdentityData : function() { var result = {}; - var status = this._lastStatus.QueryInterface(Components.interfaces.nsISSLStatus); + var status = this._sslStatus.QueryInterface(Ci.nsISSLStatus); var cert = status.serverCert; // Human readable name of Subject @@ -6848,16 +6856,11 @@ var gIdentityHandler = { * @param nsIURI uri The address for which the UI should be updated. */ checkIdentity : function(state, uri) { - var currentStatus = gBrowser.securityUI - .QueryInterface(Components.interfaces.nsISSLStatusProvider) - .SSLStatus; - this._lastStatus = currentStatus; - this._lastUri = uri; - let nsIWebProgressListener = Ci.nsIWebProgressListener; - // For some URIs like data: we can't get a host and so can't do - // anything useful here. + // For some URIs like data: we can't get a host. URIs without a host will + // usually be treated as a non-secure connection if they're not on the + // whitelist below and don't resolve to file:// URIs internally. let unknown = false; try { uri.host; @@ -6867,49 +6870,54 @@ var gIdentityHandler = { // whitelisted to provide a positive security signal to the user. let whitelist = /^about:(accounts|addons|app-manager|config|crashes|customizing|downloads|healthreport|home|license|newaddon|permissions|preferences|privatebrowsing|rights|sessionrestore|support|welcomeback)/i; let isChromeUI = uri.schemeIs("about") && whitelist.test(uri.spec); + let mode = this.IDENTITY_MODE_UNKNOWN; + if (isChromeUI) { - this.setMode(this.IDENTITY_MODE_CHROMEUI); + mode = this.IDENTITY_MODE_CHROMEUI; } else if (unknown) { - this.setMode(this.IDENTITY_MODE_UNKNOWN); + // Use default mode. } else if (state & nsIWebProgressListener.STATE_IDENTITY_EV_TOPLEVEL) { if (state & nsIWebProgressListener.STATE_BLOCKED_MIXED_ACTIVE_CONTENT) { - this.setMode(this.IDENTITY_MODE_MIXED_ACTIVE_BLOCKED_IDENTIFIED); + mode = this.IDENTITY_MODE_MIXED_ACTIVE_BLOCKED_IDENTIFIED; } else { - this.setMode(this.IDENTITY_MODE_IDENTIFIED); + mode = this.IDENTITY_MODE_IDENTIFIED; } } else if (state & nsIWebProgressListener.STATE_IS_SECURE) { if (state & nsIWebProgressListener.STATE_BLOCKED_MIXED_ACTIVE_CONTENT) { - this.setMode(this.IDENTITY_MODE_MIXED_ACTIVE_BLOCKED); + mode = this.IDENTITY_MODE_MIXED_ACTIVE_BLOCKED; } else { - this.setMode(this.IDENTITY_MODE_DOMAIN_VERIFIED); + mode = this.IDENTITY_MODE_DOMAIN_VERIFIED; } } else if (state & nsIWebProgressListener.STATE_IS_BROKEN) { if (state & nsIWebProgressListener.STATE_LOADED_MIXED_ACTIVE_CONTENT) { - this.setMode(this.IDENTITY_MODE_MIXED_ACTIVE_LOADED); + mode = this.IDENTITY_MODE_MIXED_ACTIVE_LOADED; } else if (state & nsIWebProgressListener.STATE_BLOCKED_MIXED_ACTIVE_CONTENT) { - this.setMode(this.IDENTITY_MODE_MIXED_DISPLAY_LOADED_ACTIVE_BLOCKED); + mode = this.IDENTITY_MODE_MIXED_DISPLAY_LOADED_ACTIVE_BLOCKED; } else if (state & nsIWebProgressListener.STATE_LOADED_MIXED_DISPLAY_CONTENT) { - this.setMode(this.IDENTITY_MODE_MIXED_DISPLAY_LOADED); + mode = this.IDENTITY_MODE_MIXED_DISPLAY_LOADED; } else { - this.setMode(this.IDENTITY_MODE_USES_WEAK_CIPHER); - } - } else { - // Create a channel for the sole purpose of getting the resolved URI - // of the request to determine if it's loaded from the file system. - let resolvedURI = NetUtil.newChannel({uri,loadUsingSystemPrincipal:true}).URI; - if (resolvedURI.schemeIs("jar")) { - // Given a URI "jar:!/" - // create a new URI using !/ - resolvedURI = NetUtil.newURI(resolvedURI.path); - } - - if (resolvedURI.schemeIs("file")) { - this.setMode(this.IDENTITY_MODE_FILE_URI); - } else { - this.setMode(this.IDENTITY_MODE_UNKNOWN); + mode = this.IDENTITY_MODE_USES_WEAK_CIPHER; } } + // We need those values later when populating the control center. + this._uri = uri; + this._state = state; + this._isChromeUI = isChromeUI; + this._sslStatus = + gBrowser.securityUI.QueryInterface(Ci.nsISSLStatusProvider).SSLStatus; + + // Update the identity block. + if (this._identityBox) { + this._identityBox.className = mode; + this.refreshIdentityBlock(mode); + } + + // NOTE: We do NOT update the identity popup (the control center) when + // we receive a new security state. If the user opened the popup and looks + // at the provided information we don't want to suddenly change the panel + // contents. + // Show the doorhanger when: // - mixed active content is blocked // - mixed active content is loaded (detected but not blocked) @@ -6961,46 +6969,22 @@ var gIdentityHandler = { .getService(Ci.nsIIDNService); try { let baseDomain = - Services.eTLD.getBaseDomainFromHost(this._lastUri.host); + Services.eTLD.getBaseDomainFromHost(this._uri.host); return this._IDNService.convertToDisplayIDN(baseDomain, {}); } catch (e) { // If something goes wrong (e.g. host is an IP address) just fail back // to the full domain. - return this._lastUri.host; + return this._uri.host; } }, - /** - * Update the UI to reflect the specified mode, which should be one of the - * IDENTITY_MODE_* constants. - */ - setMode : function(newMode) { - if (!this._identityBox) { - // No identity box means the identity box is not visible, in which - // case there's nothing to do. - return; - } - - this._identityPopup.className = newMode; - this._identityBox.className = newMode; - this.setIdentityMessages(newMode); - - // Update the popup too, if it's open - if (this._identityPopup.state == "open") { - this.setPopupMessages(newMode); - this.updateSitePermissions(); - } - - this._mode = newMode; - }, - /** * Set up the messages for the primary identity UI based on the specified mode, * and the details of the SSL cert, where applicable * * @param newMode The newly set identity mode. Should be one of the IDENTITY_MODE_* constants. */ - setIdentityMessages : function(newMode) { + refreshIdentityBlock(newMode) { let icon_label = ""; let tooltip = ""; let icon_country_label = ""; @@ -7017,11 +7001,11 @@ var gIdentityHandler = { [iData.caOrg]); // This can't throw, because URI's with a host that throw don't end up in this case. - let host = this._lastUri.host; + let host = this._uri.host; let port = 443; try { - if (this._lastUri.port > 0) - port = this._lastUri.port; + if (this._uri.port > 0) + port = this._uri.port; } catch (e) {} if (this._overrideService.hasMatchingOverride(host, port, iData.cert, {}, {})) @@ -7070,15 +7054,78 @@ var gIdentityHandler = { * Set up the title and content messages for the identity message popup, * based on the specified mode, and the details of the SSL cert, where * applicable - * - * @param newMode The newly set identity mode. Should be one of the IDENTITY_MODE_* constants. */ - setPopupMessages : function(newMode) { + refreshIdentityPopup() { + // Update the "Learn More" hrefs for Mixed Content Blocking. + let baseURL = Services.urlFormatter.formatURLPref("app.support.baseURL"); + let learnMoreHref = `${baseURL}mixed-content`; + this._identityPopupMixedContentLearnMore.setAttribute("href", learnMoreHref); - this._identityPopup.className = newMode; - this._identityPopupMainView.className = newMode; - this._identityPopupSecurityView.className = newMode; - this._identityPopupSecurityContent.className = newMode; + // Basic connection properties. + let isBroken = this._state & Ci.nsIWebProgressListener.STATE_IS_BROKEN; + let isSecure = this._state & Ci.nsIWebProgressListener.STATE_IS_SECURE; + let isEV = this._state & Ci.nsIWebProgressListener.STATE_IDENTITY_EV_TOPLEVEL; + + // Determine connection security information. + let connection = "not-secure"; + if (this._isChromeUI) { + connection = "chrome"; + } else if (this._isURILoadedFromFile(this._uri)) { + connection = "file"; + } else if (isEV) { + connection = "secure-ev"; + } else if (isSecure) { + connection = "secure"; + } + + // Mixed content flags. + let isMixedActiveContentLoaded = + this._state & Ci.nsIWebProgressListener.STATE_LOADED_MIXED_ACTIVE_CONTENT; + let isMixedActiveContentBlocked = + this._state & Ci.nsIWebProgressListener.STATE_BLOCKED_MIXED_ACTIVE_CONTENT; + let isMixedPassiveContentLoaded = + this._state & Ci.nsIWebProgressListener.STATE_LOADED_MIXED_DISPLAY_CONTENT; + + // Determine the mixed content state. + let mixedcontent = []; + if (isMixedPassiveContentLoaded) { + mixedcontent.push("passive-loaded"); + } + if (isMixedActiveContentLoaded) { + mixedcontent.push("active-loaded"); + } else if (isMixedActiveContentBlocked) { + mixedcontent.push("active-blocked"); + } + mixedcontent = mixedcontent.join(" "); + + // We have no specific flags for weak ciphers (yet). If a connection is + // broken and we can't detect any mixed active content loaded then it's + // a weak cipher. + let ciphers = ""; + if (isBroken && !isMixedActiveContentLoaded) { + ciphers = "weak"; + } + + // Update all elements. + let elementIDs = [ + "identity-popup", + "identity-popup-securityView-body", + ]; + + function updateAttribute(elem, attr, value) { + if (value) { + elem.setAttribute(attr, value); + } else { + elem.removeAttribute(attr); + } + } + + for (let id of elementIDs) { + let element = document.getElementById(id); + updateAttribute(element, "connection", connection); + updateAttribute(element, "ciphers", ciphers); + updateAttribute(element, "mixedcontent", mixedcontent); + } // Initialize the optional strings to empty values let supplemental = ""; @@ -7092,19 +7139,18 @@ var gIdentityHandler = { // Some URIs might have no hosts. } + // Fallback for special protocols. if (!host) { - // Fallback for special protocols. - host = this._lastUri.specIgnoringRef; + host = this._uri.specIgnoringRef; } - switch (newMode) { - case this.IDENTITY_MODE_DOMAIN_VERIFIED: - case this.IDENTITY_MODE_MIXED_ACTIVE_BLOCKED: + // Fill in the CA name if we have a valid TLS certificate. + if (isSecure) { verifier = this._identityBox.tooltipText; - break; - case this.IDENTITY_MODE_IDENTIFIED: - case this.IDENTITY_MODE_MIXED_ACTIVE_BLOCKED_IDENTIFIED: { - // If it's identified, then we can populate the dialog with credentials + } + + // Fill in organization information if we have a valid EV certificate. + if (isEV) { let iData = this.getIdentityData(); host = owner = iData.subjectOrg; verifier = this._identityBox.tooltipText; @@ -7119,21 +7165,6 @@ var gIdentityHandler = { supplemental += iData.state; else if (iData.country) // Country only supplemental += iData.country; - break; - } - case this.IDENTITY_MODE_UNKNOWN: - supplemental = gNavigatorBundle.getString("identity.not_secure"); - break; - case this.IDENTITY_MODE_USES_WEAK_CIPHER: - supplemental = gNavigatorBundle.getString("identity.uses_weak_cipher"); - break; - case this.IDENTITY_MODE_MIXED_DISPLAY_LOADED: - case this.IDENTITY_MODE_MIXED_DISPLAY_LOADED_ACTIVE_BLOCKED: - supplemental = gNavigatorBundle.getString("identity.mixed_display_loaded"); - break; - case this.IDENTITY_MODE_MIXED_ACTIVE_LOADED: - supplemental = gNavigatorBundle.getString("identity.mixed_active_loaded2"); - break; } // Push the appropriate strings out to the UI. Need to use |value| for the @@ -7144,8 +7175,23 @@ var gIdentityHandler = { this._identityPopupContentSupp.textContent = supplemental; this._identityPopupContentVerif.textContent = verifier; - // Hide subviews when updating panel information. - document.getElementById("identity-popup-multiView").showMainView(); + // Update per-site permissions section. + this.updateSitePermissions(); + }, + + _isURILoadedFromFile(uri) { + // Create a channel for the sole purpose of getting the resolved URI + // of the request to determine if it's loaded from the file system. + let chanOptions = {uri, loadUsingSystemPrincipal: true}; + let resolvedURI = NetUtil.newChannel(chanOptions).URI; + if (resolvedURI.schemeIs("jar")) { + // Given a URI "jar:!/" + // create a new URI using !/ + resolvedURI = NetUtil.newURI(resolvedURI.path); + } + + // Check the URI again after resolving. + return resolvedURI.schemeIs("file"); }, /** @@ -7170,9 +7216,7 @@ var gIdentityHandler = { this._identityPopup.hidden = false; // Update the popup strings - this.setPopupMessages(this._identityBox.className); - - this.updateSitePermissions(); + this.refreshIdentityPopup(); // Add the "open" attribute to the identity box for styling this._identityBox.setAttribute("open", "true"); diff --git a/browser/base/content/test/general/browser_bug590206.js b/browser/base/content/test/general/browser_bug590206.js index 30e1c3ccf5ca..43f5429f3997 100644 --- a/browser/base/content/test/general/browser_bug590206.js +++ b/browser/base/content/test/general/browser_bug590206.js @@ -2,6 +2,8 @@ * Test the identity mode UI for a variety of page types */ +"use strict"; + const DUMMY = "browser/browser/base/content/test/general/dummy_page.html"; function loadNewTab(url) { @@ -12,6 +14,11 @@ function getIdentityMode() { return document.getElementById("identity-box").className; } +function getConnectionState() { + gIdentityHandler.refreshIdentityPopup(); + return document.getElementById("identity-popup").getAttribute("connection"); +} + // This test is slow on Linux debug e10s requestLongerTimeout(2); @@ -49,13 +56,13 @@ add_task(function* test_chrome() { let oldTab = gBrowser.selectedTab; let newTab = yield loadNewTab("chrome://mozapps/content/extensions/extensions.xul"); - is(getIdentityMode(), "fileURI", "Identity should be file"); + is(getConnectionState(), "file", "Connection should be file"); gBrowser.selectedTab = oldTab; is(getIdentityMode(), "unknownIdentity", "Identity should be unknown"); gBrowser.selectedTab = newTab; - is(getIdentityMode(), "fileURI", "Identity should be file"); + is(getConnectionState(), "file", "Connection should be file"); gBrowser.removeTab(newTab); }); @@ -95,30 +102,30 @@ add_task(function* test_file() { let fileURI = getTestFilePath(""); let newTab = yield loadNewTab(fileURI); - is(getIdentityMode(), "fileURI", "Identity should be file"); + is(getConnectionState(), "file", "Connection should be file"); gBrowser.selectedTab = oldTab; is(getIdentityMode(), "unknownIdentity", "Identity should be unknown"); gBrowser.selectedTab = newTab; - is(getIdentityMode(), "fileURI", "Identity should be file"); + is(getConnectionState(), "file", "Connection should be file"); gBrowser.removeTab(newTab); }); add_task(function test_resource_uri() { let oldTab = gBrowser.selectedTab; - let dataURI = "resource://gre/modules/Services.jsm" + let dataURI = "resource://gre/modules/Services.jsm"; let newTab = yield loadNewTab(dataURI); - is(getIdentityMode(), "fileURI", "Identity should be unknown"); + is(getConnectionState(), "file", "Connection should be file"); gBrowser.selectedTab = oldTab; is(getIdentityMode(), "unknownIdentity", "Identity should be unknown"); gBrowser.selectedTab = newTab; - is(getIdentityMode(), "fileURI", "Identity should be unknown"); + is(getConnectionState(), "file", "Connection should be file"); gBrowser.removeTab(newTab); }); @@ -138,3 +145,19 @@ add_task(function test_data_uri() { gBrowser.removeTab(newTab); }); + +add_task(function test_about_uri() { + let oldTab = gBrowser.selectedTab; + let aboutURI = "about:robots" + + let newTab = yield loadNewTab(aboutURI); + is(getConnectionState(), "file", "Connection should be file"); + + gBrowser.selectedTab = oldTab; + is(getIdentityMode(), "unknownIdentity", "Identity should be unknown"); + + gBrowser.selectedTab = newTab; + is(getConnectionState(), "file", "Connection should be file"); + + gBrowser.removeTab(newTab); +}); diff --git a/browser/base/content/test/general/browser_identity_UI.js b/browser/base/content/test/general/browser_identity_UI.js index 7a7f34bdac3a..3305447019c4 100644 --- a/browser/base/content/test/general/browser_identity_UI.js +++ b/browser/base/content/test/general/browser_identity_UI.js @@ -43,7 +43,6 @@ var tests = [ { name: "subdomain HTTPS", location: "https://test1.example.com/", - effectiveHost: "example.com", isHTTPS: true }, @@ -104,12 +103,14 @@ function nextTest() { function checkResult() { // Sanity check other values, and the value of gIdentityHandler.getEffectiveHost() - is(gIdentityHandler._lastUri.spec, gCurrentTest.location, "location matches for test " + gTestDesc); + is(gIdentityHandler._uri.spec, gCurrentTest.location, "location matches for test " + gTestDesc); // getEffectiveHost can't be called for all modes - if (gCurrentTest.effectiveHost === null) - is(gIdentityHandler._mode == gIdentityHandler.IDENTITY_MODE_UNKNOWN || gIdentityHandler._mode == gIdentityHandler.IDENTITY_MODE_CHROMEUI, true, "mode matched"); - else + if (gCurrentTest.effectiveHost === null) { + let identityBox = document.getElementById("identity-box"); + is(identityBox.className == gIdentityHandler.IDENTITY_MODE_UNKNOWN || identityBox.className == gIdentityHandler.IDENTITY_MODE_CHROMEUI, true, "mode matched"); + } else { is(gIdentityHandler.getEffectiveHost(), gCurrentTest.effectiveHost, "effectiveHost matches for test " + gTestDesc); + } executeSoon(nextTest); } diff --git a/browser/components/controlcenter/content/panel.inc.xul b/browser/components/controlcenter/content/panel.inc.xul index c3e6b05f2029..cf386cad98f8 100644 --- a/browser/components/controlcenter/content/panel.inc.xul +++ b/browser/components/controlcenter/content/panel.inc.xul @@ -10,7 +10,8 @@ orient="vertical"> - + + - + - - -