mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
merge fx-team to mozilla-central a=merge
This commit is contained in:
commit
d9df5fe009
@ -1277,6 +1277,12 @@ var gBrowserInit = {
|
||||
Services.telemetry.getHistogramById("MASTER_PASSWORD_ENABLED").add(mpEnabled);
|
||||
}
|
||||
}, 5000);
|
||||
|
||||
// Telemetry for tracking protection.
|
||||
let tpEnabled = gPrefService
|
||||
.getBoolPref("privacy.trackingprotection.enabled");
|
||||
Services.telemetry.getHistogramById("TRACKING_PROTECTION_ENABLED")
|
||||
.add(tpEnabled);
|
||||
});
|
||||
this.delayedStartupFinished = true;
|
||||
|
||||
@ -6494,6 +6500,10 @@ var gIdentityHandler = {
|
||||
nsIWebProgressListener.STATE_BLOCKED_TRACKING_CONTENT |
|
||||
nsIWebProgressListener.STATE_LOADED_TRACKING_CONTENT)) {
|
||||
this.showBadContentDoorhanger(state);
|
||||
} else {
|
||||
// We didn't show the shield
|
||||
Services.telemetry.getHistogramById("TRACKING_PROTECTION_SHIELD")
|
||||
.add(0);
|
||||
}
|
||||
},
|
||||
|
||||
@ -6515,6 +6525,19 @@ var gIdentityHandler = {
|
||||
// default
|
||||
let iconState = "bad-content-blocked-notification-icon";
|
||||
|
||||
// Telemetry for whether the shield was due to tracking protection or not
|
||||
let histogram = Services.telemetry.getHistogramById
|
||||
("TRACKING_PROTECTION_SHIELD");
|
||||
if (state & Ci.nsIWebProgressListener.STATE_LOADED_TRACKING_CONTENT) {
|
||||
histogram.add(1);
|
||||
} else if (state &
|
||||
Ci.nsIWebProgressListener.STATE_BLOCKED_TRACKING_CONTENT) {
|
||||
histogram.add(2);
|
||||
} else {
|
||||
// The shield is due to mixed content, just keep a count so we can
|
||||
// normalize later.
|
||||
histogram.add(3);
|
||||
}
|
||||
if (state &
|
||||
(Ci.nsIWebProgressListener.STATE_LOADED_MIXED_ACTIVE_CONTENT |
|
||||
Ci.nsIWebProgressListener.STATE_LOADED_TRACKING_CONTENT)) {
|
||||
|
@ -1819,6 +1819,10 @@
|
||||
// places this host on the tracking protection white list.
|
||||
Services.perms.add(normalizedUrl,
|
||||
"trackingprotection", Services.perms.ALLOW_ACTION);
|
||||
// Telemetry for disable protection
|
||||
let histogram = Services.telemetry.getHistogramById(
|
||||
"TRACKING_PROTECTION_EVENTS");
|
||||
histogram.add(1);
|
||||
BrowserReload();
|
||||
]]></body>
|
||||
</method>
|
||||
@ -1829,6 +1833,10 @@
|
||||
// from the tracking protection white list (any list actually).
|
||||
Services.perms.remove(gBrowser.selectedBrowser.currentURI.host,
|
||||
"trackingprotection");
|
||||
// Telemetry for enable protection
|
||||
let histogram = Services.telemetry.getHistogramById(
|
||||
"TRACKING_PROTECTION_EVENTS");
|
||||
histogram.add(2);
|
||||
BrowserReload();
|
||||
]]></body>
|
||||
</method>
|
||||
|
@ -13,6 +13,8 @@ Cu.import("resource:///modules/loop/LoopContacts.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "hookWindowCloseForPanelClose",
|
||||
"resource://gre/modules/MozSocialAPI.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "PluralForm",
|
||||
"resource://gre/modules/PluralForm.jsm");
|
||||
XPCOMUtils.defineLazyGetter(this, "appInfo", function() {
|
||||
return Cc["@mozilla.org/xre/app-info;1"]
|
||||
.getService(Ci.nsIXULAppInfo)
|
||||
@ -150,6 +152,23 @@ function injectLoopAPI(targetWindow) {
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the correct form of a semi-colon separated string
|
||||
* based on the value of the `num` argument and the current locale.
|
||||
*
|
||||
* @param {Integer} num The number used to find the plural form.
|
||||
* @param {String} str The semi-colon separated string of word forms.
|
||||
* @returns {String} The correct word form based on the value of the number
|
||||
* and the current locale.
|
||||
*/
|
||||
getPluralForm: {
|
||||
enumerable: true,
|
||||
writable: true,
|
||||
value: function(num, str) {
|
||||
return PluralForm.get(num, str);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Call to ensure that any necessary registrations for the Loop Service
|
||||
* have taken place.
|
||||
|
@ -13,11 +13,16 @@
|
||||
var gLanguage = '';
|
||||
|
||||
// fetch an l10n objects
|
||||
function getL10nData(key) {
|
||||
function getL10nData(key, num) {
|
||||
var response = gL10nDetails.getStrings(key);
|
||||
var data = JSON.parse(response);
|
||||
if (!data)
|
||||
console.warn('[l10n] #' + key + ' missing for [' + gLanguage + ']');
|
||||
if (num !== undefined) {
|
||||
for (var prop in data) {
|
||||
data[prop] = gL10nDetails.getPluralForm(num, data[prop]);
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
@ -33,7 +38,11 @@
|
||||
|
||||
// translate a string
|
||||
function translateString(key, args, fallback) {
|
||||
var data = getL10nData(key);
|
||||
if (args && args.num) {
|
||||
var num = args && args.num;
|
||||
delete args.num;
|
||||
}
|
||||
var data = getL10nData(key, num);
|
||||
if (!data && fallback)
|
||||
data = {textContent: fallback};
|
||||
if (!data)
|
||||
|
@ -550,7 +550,8 @@ loop.shared.views = (function(_, OT, l10n) {
|
||||
FeedbackLayout({title: l10n.get("feedback_thank_you_heading")},
|
||||
React.DOM.p({className: "info thank-you"},
|
||||
l10n.get("feedback_window_will_close_in", {
|
||||
countdown: this.state.countdown
|
||||
countdown: this.state.countdown,
|
||||
num: this.state.countdown
|
||||
}))
|
||||
)
|
||||
);
|
||||
|
@ -550,7 +550,8 @@ loop.shared.views = (function(_, OT, l10n) {
|
||||
<FeedbackLayout title={l10n.get("feedback_thank_you_heading")}>
|
||||
<p className="info thank-you">{
|
||||
l10n.get("feedback_window_will_close_in", {
|
||||
countdown: this.state.countdown
|
||||
countdown: this.state.countdown,
|
||||
num: this.state.countdown
|
||||
})}</p>
|
||||
</FeedbackLayout>
|
||||
);
|
||||
|
@ -12,3 +12,4 @@ skip-if = !debug
|
||||
[browser_mozLoop_prefs.js]
|
||||
[browser_mozLoop_doNotDisturb.js]
|
||||
skip-if = buildapp == 'mulet'
|
||||
[browser_mozLoop_pluralStrings.js]
|
||||
|
@ -0,0 +1,19 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/**
|
||||
* This is an integration test from navigator.mozLoop through to the end
|
||||
* effects - rather than just testing MozLoopAPI alone.
|
||||
*/
|
||||
|
||||
add_task(loadLoopPanel);
|
||||
|
||||
add_task(function* test_mozLoop_pluralStrings() {
|
||||
Assert.ok(gMozLoopAPI, "mozLoop should exist");
|
||||
|
||||
var strings = JSON.parse(gMozLoopAPI.getStrings("feedback_window_will_close_in"));
|
||||
Assert.equal(gMozLoopAPI.getPluralForm(0, strings.textContent),
|
||||
"This window will close in {{countdown}} seconds");
|
||||
Assert.equal(gMozLoopAPI.getPluralForm(1, strings.textContent),
|
||||
"This window will close in {{countdown}} second");
|
||||
});
|
@ -65,6 +65,8 @@ function AutocompletePopup(aDocument, aOptions = {})
|
||||
if (!aOptions.onKeypress) {
|
||||
this._panel.setAttribute("ignorekeys", "true");
|
||||
}
|
||||
// Stop this appearing as an alert to accessibility.
|
||||
this._panel.setAttribute("role", "presentation");
|
||||
|
||||
let mainPopupSet = this._document.getElementById("mainPopupSet");
|
||||
if (mainPopupSet) {
|
||||
@ -106,6 +108,7 @@ function AutocompletePopup(aDocument, aOptions = {})
|
||||
if (this.onKeypress) {
|
||||
this._list.addEventListener("keypress", this.onKeypress, false);
|
||||
}
|
||||
this._itemIdCounter = 0;
|
||||
}
|
||||
exports.AutocompletePopup = AutocompletePopup;
|
||||
|
||||
@ -148,6 +151,8 @@ AutocompletePopup.prototype = {
|
||||
*/
|
||||
hidePopup: function AP_hidePopup()
|
||||
{
|
||||
// Return accessibility focus to the input.
|
||||
this._document.activeElement.removeAttribute("aria-activedescendant");
|
||||
this._panel.hidePopup();
|
||||
},
|
||||
|
||||
@ -295,6 +300,23 @@ AutocompletePopup.prototype = {
|
||||
this._list.ensureIndexIsVisible(this._list.selectedIndex);
|
||||
},
|
||||
|
||||
/**
|
||||
* Update accessibility appropriately when the selected item is changed.
|
||||
*
|
||||
* @private
|
||||
*/
|
||||
_updateAriaActiveDescendant: function AP__updateAriaActiveDescendant()
|
||||
{
|
||||
if (!this._list.selectedItem) {
|
||||
// Return accessibility focus to the input.
|
||||
this._document.activeElement.removeAttribute("aria-activedescendant");
|
||||
return;
|
||||
}
|
||||
// Focus this for accessibility so users know about the selected item.
|
||||
this._document.activeElement.setAttribute("aria-activedescendant",
|
||||
this._list.selectedItem.id);
|
||||
},
|
||||
|
||||
/**
|
||||
* Clear all the items from the autocomplete list.
|
||||
*/
|
||||
@ -340,6 +362,7 @@ AutocompletePopup.prototype = {
|
||||
if (this.isOpen && this._list.ensureIndexIsVisible) {
|
||||
this._list.ensureIndexIsVisible(this._list.selectedIndex);
|
||||
}
|
||||
this._updateAriaActiveDescendant();
|
||||
},
|
||||
|
||||
/**
|
||||
@ -362,6 +385,7 @@ AutocompletePopup.prototype = {
|
||||
if (this.isOpen) {
|
||||
this._list.ensureIndexIsVisible(this._list.selectedIndex);
|
||||
}
|
||||
this._updateAriaActiveDescendant();
|
||||
},
|
||||
|
||||
/**
|
||||
@ -383,6 +407,8 @@ AutocompletePopup.prototype = {
|
||||
appendItem: function AP_appendItem(aItem)
|
||||
{
|
||||
let listItem = this._document.createElementNS(XUL_NS, "richlistitem");
|
||||
// Items must have an id for accessibility.
|
||||
listItem.id = this._panel.id + "_item_" + this._itemIdCounter++;
|
||||
if (this.direction) {
|
||||
listItem.setAttribute("dir", this.direction);
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ skip-if = os == "linux" || "mac" # bug 949355
|
||||
[browser_styleeditor_bug_851132_middle_click.js]
|
||||
[browser_styleeditor_bug_870339.js]
|
||||
[browser_styleeditor_cmd_edit.js]
|
||||
skip-if = e10s # Bug 1055333 - style editor tests disabled with e10s
|
||||
[browser_styleeditor_enabled.js]
|
||||
[browser_styleeditor_fetch-from-cache.js]
|
||||
[browser_styleeditor_filesave.js]
|
||||
|
@ -22,7 +22,14 @@ function consoleOpened(HUD) {
|
||||
|
||||
let popup = HUD.jsterm.autocompletePopup;
|
||||
|
||||
let input = popup._document.activeElement;
|
||||
function getActiveDescendant() {
|
||||
return input.ownerDocument.getElementById(
|
||||
input.getAttribute("aria-activedescendant"));
|
||||
}
|
||||
|
||||
ok(!popup.isOpen, "popup is not open");
|
||||
ok(!input.hasAttribute("aria-activedescendant"), "no aria-activedescendant");
|
||||
|
||||
popup._panel.addEventListener("popupshown", function() {
|
||||
popup._panel.removeEventListener("popupshown", arguments.callee, false);
|
||||
@ -30,6 +37,8 @@ function consoleOpened(HUD) {
|
||||
ok(popup.isOpen, "popup is open");
|
||||
|
||||
is(popup.itemCount, 0, "no items");
|
||||
ok(!input.hasAttribute("aria-activedescendant"),
|
||||
"no aria-activedescendant");
|
||||
|
||||
popup.setItems(items);
|
||||
|
||||
@ -43,31 +52,37 @@ function consoleOpened(HUD) {
|
||||
is(popup.selectedIndex, 2,
|
||||
"Index of the first item from bottom is selected.");
|
||||
is(popup.selectedItem, items[2], "First item from bottom is selected");
|
||||
ok(getActiveDescendant().selected, "aria-activedescendant is correct");
|
||||
|
||||
popup.selectedIndex = 1;
|
||||
|
||||
is(popup.selectedIndex, 1, "index 1 is selected");
|
||||
is(popup.selectedItem, items[1], "item1 is selected");
|
||||
ok(getActiveDescendant().selected, "aria-activedescendant is correct");
|
||||
|
||||
popup.selectedItem = items[2];
|
||||
|
||||
is(popup.selectedIndex, 2, "index 2 is selected");
|
||||
is(popup.selectedItem, items[2], "item2 is selected");
|
||||
ok(getActiveDescendant().selected, "aria-activedescendant is correct");
|
||||
|
||||
is(popup.selectPreviousItem(), items[1], "selectPreviousItem() works");
|
||||
|
||||
is(popup.selectedIndex, 1, "index 1 is selected");
|
||||
is(popup.selectedItem, items[1], "item1 is selected");
|
||||
ok(getActiveDescendant().selected, "aria-activedescendant is correct");
|
||||
|
||||
is(popup.selectNextItem(), items[2], "selectPreviousItem() works");
|
||||
|
||||
is(popup.selectedIndex, 2, "index 2 is selected");
|
||||
is(popup.selectedItem, items[2], "item2 is selected");
|
||||
ok(getActiveDescendant().selected, "aria-activedescendant is correct");
|
||||
|
||||
ok(popup.selectNextItem(), "selectPreviousItem() works");
|
||||
|
||||
is(popup.selectedIndex, 0, "index 0 is selected");
|
||||
is(popup.selectedItem, items[0], "item0 is selected");
|
||||
ok(getActiveDescendant().selected, "aria-activedescendant is correct");
|
||||
|
||||
items.push({label: "label3", value: "value3"});
|
||||
popup.appendItem(items[3]);
|
||||
@ -76,15 +91,19 @@ function consoleOpened(HUD) {
|
||||
|
||||
popup.selectedIndex = 3;
|
||||
is(popup.selectedItem, items[3], "item3 is selected");
|
||||
ok(getActiveDescendant().selected, "aria-activedescendant is correct");
|
||||
|
||||
popup.removeItem(items[2]);
|
||||
|
||||
is(popup.selectedIndex, 2, "index2 is selected");
|
||||
is(popup.selectedItem, items[3], "item3 is still selected");
|
||||
ok(getActiveDescendant().selected, "aria-activedescendant is correct");
|
||||
is(popup.itemCount, items.length - 1, "item2 removed");
|
||||
|
||||
popup.clearItems();
|
||||
is(popup.itemCount, 0, "items cleared");
|
||||
ok(!input.hasAttribute("aria-activedescendant"),
|
||||
"no aria-activedescendant");
|
||||
|
||||
popup.hidePopup();
|
||||
finishTest();
|
||||
|
@ -183,7 +183,8 @@ function goUpdateConsoleCommands() {
|
||||
<textbox class="jsterm-complete-node devtools-monospace"
|
||||
multiline="true" rows="1" tabindex="-1"/>
|
||||
<textbox class="jsterm-input-node devtools-monospace"
|
||||
multiline="true" rows="1" tabindex="0"/>
|
||||
multiline="true" rows="1" tabindex="0"
|
||||
aria-autocomplete="list"/>
|
||||
</stack>
|
||||
</hbox>
|
||||
</notificationbox>
|
||||
|
@ -55,9 +55,11 @@ feedback_category_other=Other:
|
||||
feedback_custom_category_text_placeholder=What went wrong?
|
||||
feedback_submit_button=Submit
|
||||
feedback_back_button=Back
|
||||
## LOCALIZATION NOTE (feedback_window_will_close_in): In this item, don't
|
||||
## translate the part between {{..}}
|
||||
feedback_window_will_close_in=This window will close in {{countdown}} seconds
|
||||
## LOCALIZATION NOTE (feedback_window_will_close_in):
|
||||
## Semicolon-separated list of plural forms. See:
|
||||
## http://developer.mozilla.org/en/docs/Localization_and_Plurals
|
||||
## In this item, don't translate the part between {{..}}
|
||||
feedback_window_will_close_in=This window will close in {{countdown}} second;This window will close in {{countdown}} seconds
|
||||
|
||||
share_email_subject2=Invitation to chat
|
||||
## LOCALIZATION NOTE (share_email_body2): In this item, don't translate the
|
||||
|
@ -1630,7 +1630,9 @@ var BrowserApp = {
|
||||
break;
|
||||
|
||||
case "Browser:Quit":
|
||||
this.quit(aData ? JSON.parse(aData) : null);
|
||||
// Add-ons like QuitNow and CleanQuit provide aData as an empty-string ("").
|
||||
// Pass undefined to invoke the methods default parms.
|
||||
this.quit(aData ? JSON.parse(aData) : undefined);
|
||||
break;
|
||||
|
||||
case "SaveAs:PDF":
|
||||
|
@ -117,6 +117,9 @@ SessionStore.prototype = {
|
||||
}
|
||||
|
||||
Services.obs.notifyObservers(null, "sessionstore-state-purge-complete", "");
|
||||
if (this._notifyClosedTabs) {
|
||||
this._sendClosedTabsToJava(Services.wm.getMostRecentWindow("navigator:browser"));
|
||||
}
|
||||
break;
|
||||
case "timer-callback":
|
||||
// Timer call back for delayed saving
|
||||
|
@ -163,7 +163,18 @@ AccountState.prototype = {
|
||||
},
|
||||
|
||||
getKeyPair: function(mustBeValidUntil) {
|
||||
if (this.keyPair && (this.keyPair.validUntil > mustBeValidUntil)) {
|
||||
// If the debugging pref to ignore cached authentication credentials is set for Sync,
|
||||
// then don't use any cached key pair, i.e., generate a new one and get it signed.
|
||||
// The purpose of this pref is to expedite any auth errors as the result of a
|
||||
// expired or revoked FxA session token, e.g., from resetting or changing the FxA
|
||||
// password.
|
||||
let ignoreCachedAuthCredentials = false;
|
||||
try {
|
||||
ignoreCachedAuthCredentials = Services.prefs.getBoolPref("services.sync.debug.ignoreCachedAuthCredentials");
|
||||
} catch(e) {
|
||||
// Pref doesn't exist
|
||||
}
|
||||
if (!ignoreCachedAuthCredentials && this.keyPair && (this.keyPair.validUntil > mustBeValidUntil)) {
|
||||
log.debug("getKeyPair: already have a keyPair");
|
||||
return this.resolve(this.keyPair.keyPair);
|
||||
}
|
||||
|
@ -475,6 +475,17 @@ this.BrowserIDManager.prototype = {
|
||||
* signed in?
|
||||
*/
|
||||
hasValidToken: function() {
|
||||
// If pref is set to ignore cached authentication credentials for debugging,
|
||||
// then return false to force the fetching of a new token.
|
||||
let ignoreCachedAuthCredentials = false;
|
||||
try {
|
||||
ignoreCachedAuthCredentials = Svc.Prefs.get("debug.ignoreCachedAuthCredentials");
|
||||
} catch(e) {
|
||||
// Pref doesn't exist
|
||||
}
|
||||
if (ignoreCachedAuthCredentials) {
|
||||
return false;
|
||||
}
|
||||
if (!this._token) {
|
||||
return false;
|
||||
}
|
||||
|
@ -6506,5 +6506,22 @@
|
||||
"high": "10000000",
|
||||
"n_buckets": 10,
|
||||
"description": "Sidebar showing: seconds that the sidebar has been opened"
|
||||
},
|
||||
"TRACKING_PROTECTION_ENABLED": {
|
||||
"expires_in_version": "never",
|
||||
"kind": "boolean",
|
||||
"description": "Whether or not a session has tracking protection enabled"
|
||||
},
|
||||
"TRACKING_PROTECTION_SHIELD": {
|
||||
"expires_in_version": "never",
|
||||
"kind": "enumerated",
|
||||
"n_values": 4,
|
||||
"description": "Tracking protection shield (0 = not shown, 1 = blocked, 2 = loaded, 3 = due to mixed content"
|
||||
},
|
||||
"TRACKING_PROTECTION_EVENTS": {
|
||||
"expires_in_version": "never",
|
||||
"kind": "enumerated",
|
||||
"n_values": 3,
|
||||
"description": "Doorhanger shown = 0, Disable = 1, Enable = 2"
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user