Merge autoland to mozilla-central r=merge a=merge

This commit is contained in:
Cosmin Sabou 2017-12-06 00:03:36 +02:00
Родитель 4df7f01104 e323f51349
Коммит 151060af3e
388 изменённых файлов: 12997 добавлений и 6085 удалений

Просмотреть файл

@ -24,5 +24,27 @@ module.exports = {
"rules": {
"eol-last": "off",
}
}, {
// XXX Bug 1421969. These files/directories are still being fixed,
// so turn off mozilla/use-services for them for now.
"files": [
"accessible/**",
// Browser: Bug 1421379
"browser/extensions/shield-recipe-client/test/browser/head.js",
"browser/modules/offlineAppCache.jsm",
"chrome/**",
"devtools/**",
"dom/indexedDB/**",
"dom/media/**",
"extensions/pref/**",
"mobile/android/**",
"security/**",
"testing/**",
"tools/profiler/**",
"xpcom/**"
],
"rules": {
"mozilla/use-services": "off",
}
}]
};

Просмотреть файл

@ -149,3 +149,52 @@ RootAccessibleWrap::accNavigate(
pvarEndUpAt->vt = VT_DISPATCH;
return S_OK;
}
STDMETHODIMP
RootAccessibleWrap::get_accFocus(
/* [retval][out] */ VARIANT __RPC_FAR *pvarChild)
{
HRESULT hr = DocAccessibleWrap::get_accFocus(pvarChild);
if (FAILED(hr) || pvarChild->vt != VT_EMPTY) {
// We got a definite result (either failure or an accessible).
return hr;
}
// The base implementation reported no focus.
// Focus might be in a remote document.
// (The base implementation can't handle this.)
// Get the document in the active tab.
ProxyAccessible* docProxy = GetPrimaryRemoteTopLevelContentDoc();
if (!docProxy) {
return hr;
}
Accessible* docAcc = WrapperFor(docProxy);
if (!docAcc) {
return E_FAIL;
}
RefPtr<IDispatch> docDisp = NativeAccessible(docAcc);
if (!docDisp) {
return E_FAIL;
}
RefPtr<IAccessible> docIa;
hr = docDisp->QueryInterface(IID_IAccessible, (void**)getter_AddRefs(docIa));
MOZ_ASSERT(SUCCEEDED(hr));
MOZ_ASSERT(docIa);
// Ask this document for its focused descendant.
// We return this as is to the client except for CHILDID_SELF (see below).
hr = docIa->get_accFocus(pvarChild);
if (FAILED(hr)) {
return hr;
}
if (pvarChild->vt == VT_I4 && pvarChild->lVal == CHILDID_SELF) {
// The document itself has focus.
// We're handling a call to accFocus on the root accessible,
// so replace CHILDID_SELF with the document accessible.
pvarChild->vt = VT_DISPATCH;
docDisp.forget(&pvarChild->pdispVal);
}
return S_OK;
}

Просмотреть файл

@ -43,6 +43,9 @@ public:
/* [optional][in] */ VARIANT varStart,
/* [retval][out] */ VARIANT __RPC_FAR *pvarEndUpAt) override;
virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accFocus(
/* [retval][out] */ VARIANT __RPC_FAR *pvarChild) override;
private:
// DECLARE_AGGREGATABLE declares the internal IUnknown methods as well as
// mInternalUnknown.

Просмотреть файл

@ -5,7 +5,5 @@ module.exports = {
// XXX Bug 1326071 - This should be reduced down - probably to 20 or to
// be removed & synced with the mozilla/recommended value.
"complexity": ["error", 61],
"mozilla/use-services": "error",
}
};

Просмотреть файл

@ -2204,11 +2204,7 @@ BrowserGlue.prototype = {
if (currentEngine._loadPath.startsWith("[https]")) {
Services.prefs.setCharPref("browser.search.reset.status", "pending");
} else {
// Can't call resetToOriginalDefaultEngine because it doesn't
// unhide the engine.
let defaultEngine = Services.search.originalDefaultEngine;
defaultEngine.hidden = false;
Services.search.currentEngine = defaultEngine;
Services.search.resetToOriginalDefaultEngine();
Services.prefs.setCharPref("browser.search.reset.status", "silent");
}
});

Просмотреть файл

@ -73,6 +73,11 @@ SyncedTabsDeckComponent.prototype = {
Services.obs.addObserver(this, this._SyncedTabs.TOPIC_TABS_CHANGED);
Services.obs.addObserver(this, FxAccountsCommon.ONLOGIN_NOTIFICATION);
Services.obs.addObserver(this, "weave:service:login:change");
// If the Sync service is not ready, in init() > updatePanel() we will
// show a blank screen. If tab syncing is disabled, we will not get any other
// ui-refreshing notifications! We listen to :ready in order to check again
// if this engine is disabled and refresh the UI one last time.
Services.obs.addObserver(this, "weave:service:ready");
// Go ahead and trigger sync
this._SyncedTabs.syncTabs()
@ -95,6 +100,7 @@ SyncedTabsDeckComponent.prototype = {
Services.obs.removeObserver(this, this._SyncedTabs.TOPIC_TABS_CHANGED);
Services.obs.removeObserver(this, FxAccountsCommon.ONLOGIN_NOTIFICATION);
Services.obs.removeObserver(this, "weave:service:login:change");
Services.obs.removeObserver(this, "weave:service:ready");
this._deckView.destroy();
},
@ -104,6 +110,9 @@ SyncedTabsDeckComponent.prototype = {
this._syncedTabsListStore.getData();
this.updatePanel();
break;
case "weave:service:ready":
Services.obs.removeObserver(this, "weave:service:ready");
// Intended fallthrough.
case FxAccountsCommon.ONLOGIN_NOTIFICATION:
case "weave:service:login:change":
this.updatePanel();

Просмотреть файл

@ -111,6 +111,7 @@ AutofillProfileAutoCompleteSearch.prototype = {
let searchPermitted = isAddressField ?
FormAutofillUtils.isAutofillAddressesEnabled :
FormAutofillUtils.isAutofillCreditCardsEnabled;
let AutocompleteResult = isAddressField ? AddressResult : CreditCardResult;
ProfileAutocomplete.lastProfileAutoCompleteFocusedInput = focusedInput;
// Fallback to form-history if ...
@ -122,8 +123,8 @@ AutofillProfileAutoCompleteSearch.prototype = {
(!isInputAutofilled && filledRecordGUID) || (isAddressField &&
allFieldNames.filter(field => savedFieldNames.has(field)).length < FormAutofillUtils.AUTOFILL_FIELDS_THRESHOLD)) {
if (focusedInput.autocomplete == "off") {
// Create a dummy AddressResult as an empty search result.
let result = new AddressResult("", "", [], [], {});
// Create a dummy result as an empty search result.
let result = new AutocompleteResult("", "", [], [], {});
listener.onSearchResult(this, result);
return;
}
@ -138,6 +139,13 @@ AutofillProfileAutoCompleteSearch.prototype = {
return;
}
if (isInputAutofilled) {
let result = new AutocompleteResult(searchString, "", [], [], {isInputAutofilled});
listener.onSearchResult(this, result);
ProfileAutocomplete.lastProfileAutoCompleteResult = result;
return;
}
let infoWithoutElement = Object.assign({}, info);
delete infoWithoutElement.elementWeakRef;
@ -156,21 +164,13 @@ AutofillProfileAutoCompleteSearch.prototype = {
let adaptedRecords = handler.getAdaptedProfiles(records, focusedInput);
let result = null;
if (isAddressField) {
result = new AddressResult(searchString,
info.fieldName,
allFieldNames,
adaptedRecords,
{isInputAutofilled});
} else {
let isSecure = InsecurePasswordUtils.isFormSecure(handler.form);
let isSecure = InsecurePasswordUtils.isFormSecure(handler.form);
result = new CreditCardResult(searchString,
result = new AutocompleteResult(searchString,
info.fieldName,
allFieldNames,
adaptedRecords,
{isSecure, isInputAutofilled});
}
listener.onSearchResult(this, result);
ProfileAutocomplete.lastProfileAutoCompleteResult = result;
});

Просмотреть файл

@ -53,6 +53,11 @@ class ProfileAutoCompleteResult {
return fieldSet;
}, new Set())].filter(field => allFieldNames.includes(field));
// Force return success code if the focused field is auto-filled in order
// to show clear form button popup.
if (isInputAutofilled) {
resultCode = Ci.nsIAutoCompleteResult.RESULT_SUCCESS;
}
// The result code of this result object.
if (resultCode) {
this.searchResult = resultCode;

Просмотреть файл

@ -21,7 +21,7 @@ Form autofill test: clear form button
const MOCK_STORAGE = [{
organization: "Sesame Street",
"street-address": "123 Sesame Street.",
"street-address": "2 Harrison St\nline2\nline3",
tel: "+13453453456",
}, {
organization: "Mozilla",
@ -59,6 +59,15 @@ add_task(async function simple_clear() {
checkIsFormCleared();
});
add_task(async function clear_adapted_record() {
await triggerPopupAndHoverItem("#street-address", 0);
await triggerAutofillAndCheckProfile(MOCK_STORAGE[0]);
await triggerPopupAndHoverItem("#street-address", 0);
doKey("return");
checkIsFormCleared();
});
add_task(async function clear_modified_form() {
await triggerPopupAndHoverItem("#organization", 0);
await triggerAutofillAndCheckProfile(MOCK_STORAGE[0]);

Просмотреть файл

@ -37,7 +37,7 @@ viewlist = اعرض القائمة
pocket-button.label = Pocket
pocket-button.tooltiptext = احفظ في Pocket
saveToPocketCmd.label = احفظ الصفحة في Pocket
saveToPocketCmd.accesskey = ت
saveLinkToPocketCmd.label = احفظ الوصلة في Pocket
saveLinkToPocketCmd.accesskey = ص
saveToPocketCmd.accesskey = ظ
saveLinkToPocketCmd.label = احفظ الرابط في Pocket
saveLinkToPocketCmd.accesskey = ف
pocketMenuitem.label = اعرض قائمة Pocket

Просмотреть файл

@ -19,10 +19,10 @@ processingtags = Добавяне на етикети…
removepage = Премахване на страница
save = Запазване
saving = Запазване…
signupemail = Регистриране с мейл
signupemail = Регистриране с електронна поща
signuptosave = Регистрирайте се в Pocket. Безплатно е.
suggestedtags = Предложени етикети
tagline = Запазвайте статии и видеота от Firefox и можете да ги преглеждате в Pocket на всяко устройство по всяко време.
tagline = Запазвайте статии и видео от Firefox и можете да ги преглеждате в Pocket на всяко устройство по всяко време.
taglinestory_one = Щракнете на бутона на Pocket за запазване на статия, видео или страница от Firefox.
taglinestory_two = Преглеждайте в Pocket на всяко устройство и по всяко време.
tagssaved = Етикетите са добавени

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = Ouzhpennañ skritelligoù
alreadyhaveacct = Un arveriad Pocket oc'h endeo ?
continueff = Kenderc'hel gant Firefox
errorgeneric = Ur fazi a zo bet en ur enrollañ davet Pocket.
learnmore = Gouzout hiroc'h
loginnow = Kennaskañ
maxtaglength = Bevennet eo ar skritelligoù da 25 arouezenn
mustbeconnected = Ret eo deoc'h bezañ kennasket d'ar genrouedad evit bezañ gouest da enrollañ davet Pocket. Gwiriekait ho kennask ha klaskit en-dro.
onlylinkssaved = N'haller enrollañ ereoù nemetken
pagenotsaved = N'eo ket bet enrollet ar bajenn
pageremoved = Dilamet ar bajenn
pagesaved = Enrollet davet Pocket
processingremove = O tilemel ar bajenn...
processingtags = Oc'h ouzhpennañ skritelligoù...
removepage = Dilemel ar bajenn
save = Enrollañ
saving = Oc'h enrollañ…
signupemail = Krouiñ ur gont gant ar chomlec'h postel
signuptosave = Krouit ur gont Pocket. Digoust eo.
suggestedtags = Skritelligoù kinniget
tagline = Enrollit pennadoù ha videoioù adalek Firefox evit gwelet anezho war Pocket war forzh peseurt trevnad, p'ho peus c'hoant.
taglinestory_one = Klikit war an afell Pocket evit enrollañ ur pennad, video pe pajenn adalek Firefox.
taglinestory_two = Sellit anezhañ e Pocket war forzh peseurt trevnad, p'ho peus c'hoant.
tagssaved = Ouzhpennet ur skritellig
tos = En ur genderc'hel e asantit da <a href="%1$S" target="_blank">Divizoù Arver</a> ha <a href="%2$S" target="_blank">Reolennoù a-fet buhez prevez</a> Pocket
tryitnow = Amprouit bremañ
signinfirefox = Kennaskañ gant Firefox
signupfirefox = Krouiñ ur gont gant Firefox
viewlist = Gwelout ar roll
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Enrollañ davet Pocket
saveToPocketCmd.label = Enrollañ ar bajenn davet Pocket
saveToPocketCmd.accesskey = c
saveLinkToPocketCmd.label = Enrollañ an ere davet Pocket
saveLinkToPocketCmd.accesskey = v
pocketMenuitem.label = Gwelout ar roll Pocket

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = Dodaj tagove
alreadyhaveacct = Već ste Pocket korisnik?
continueff = Nastavi sa Firefoxom
errorgeneric = Došlo je do greške prilikom spašavanja u Pocket.
learnmore = Saznajte više
loginnow = Prijava
maxtaglength = Tagovi su ograničeni na 25 znakova
mustbeconnected = Trebate biti konektovani na Internet da biste spasili u Pocket. Molimo da provjerite vašu konekciju i pokušate ponovo.
onlylinkssaved = Jedino linkovi mogu biti spašeni
pagenotsaved = Stranica nije spašena
pageremoved = Stranica uklonjena
pagesaved = Spašeno u Pocket
processingremove = Uklanjam stranicu…
processingtags = Dodajem tagove…
removepage = Ukloni stranicu
save = Spasi
saving = Spašavam…
signupemail = Registrujte se pomoću emaila
signuptosave = Registrujte se na Pocket. Besplatan je.
suggestedtags = Preporučeni tagovi
tagline = Spasite članke i video klipove iz Firefoxa za pregled u Pocketu na bilo kojem uređaju u bilo koje vrijeme.
taglinestory_one = Kliknite Pocket dugme da spasite bilo koji članak, video ili stranicu iz Firefoxa.
taglinestory_two = Pregledajte u Pocketu na bilo kojem uređaju u bilo koje vrijeme.
tagssaved = Tagovi dodani
tos = Nastavljanjem, prihvatate Pocketove <a href="%1$S" target="_blank">Uslove korištenja</a> i <a href="%2$S" target="_blank">Policu privatnosti</a>
tryitnow = Probajte odmah
signinfirefox = Prijavite se pomoću Firefoxa
signupfirefox = Registrujte se pomoću Firefoxa
viewlist = Prikaži listu
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Spasi u Pocket
saveToPocketCmd.label = Spasi stranicu u Pocket
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = Spasi link u Pocket
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Prikaži Pocket listu

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = Afegeix etiquetes
alreadyhaveacct = Ja teniu un compte al Pocket?
continueff = Continua amb el Firefox
errorgeneric = S'ha produït un error en intentar desar al Pocket.
learnmore = Més informació
loginnow = Inicia la sessió
maxtaglength = Les etiquetes tenen un límit de 25 caràcters
mustbeconnected = Heu d'estar connectat a Internet per poder desar al Pocket. Comproveu la connexió i torneu-ho a provar.
onlylinkssaved = Només es poden desar enllaços
pagenotsaved = No s'ha desat la pàgina
pageremoved = S'ha eliminat la pàgina
pagesaved = S'ha desat al Pocket
processingremove = S'està eliminant la pàgina…
processingtags = S'estan afegint les etiquetes…
removepage = Elimina la pàgina
save = Desa
saving = S'està desant…
signupemail = Registre amb correu electrònic
signuptosave = Registreu-vos al Pocket. És gratuït.
suggestedtags = Etiquetes recomanades
tagline = Deseu articles i vídeos des del Firefox per veure'ls al Pocket en qualsevol dispositiu i a qualsevol hora.
taglinestory_one = Feu clic al botó del Pocket per desar un article, vídeo o pàgina des del Firefox.
taglinestory_two = Vegeu-lo al Pocket en qualsevol dispositiu, a qualsevol hora.
tagssaved = Etiquetes afegides
tos = Si continueu, accepteu les <a href="%1$S" target="_blank">condicions del servei</a> i la <a href="%2$S" target="_blank">política de privadesa</a> del Pocket
tryitnow = Proveu-ho ara
signinfirefox = Inicia la sessió amb el Firefox
signupfirefox = Registre amb el Firefox
viewlist = Mostra la llista
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Desa al Pocket
saveToPocketCmd.label = Desa la pàgina al Pocket
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = Desa l'enllaç al Pocket
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Mostra la llista del Pocket

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = Ketz'aqatisäx Taq Etal
alreadyhaveacct = ¿La at ruwinaq chik ri Pocket?
continueff = K'a kisamäj na pa Firefox
errorgeneric = Xuk'ulun pe jun sachoj toq xatojtob'ej yayakon pa Pocket.
learnmore = Tetamäx ch'aqa' chik
loginnow = Titikirisäx molojri'ïl
maxtaglength = Xa xe 25 tz'ib' richin yetz'ib'äx ri taq etal
mustbeconnected = K'o chi atokinäq pa K'amaya'l richin yatikïr yayakon pa Pocket. Tanik'oj ri awokem richin natojtob'ej chik.
onlylinkssaved = Xa xe yeyak ri taq ximonel
pagenotsaved = Man Yakon ta re Ruxaq
pageremoved = Yujun Ruxaq
pagesaved = Yakon pa Pocket
processingremove = Tajin Niyuj Ruxaq…
processingtags = Tajin yetz'aqatisäx taq etal…
removepage = Tiyuj Ruxaq
save = Tiyak
saving = Tajin niyak…
signupemail = Tatikirisaj molojri'ïl rik'in taqoya'l
signuptosave = Tatz'ib'aj ab'i' rik'in Pocket. Majun rajil.
suggestedtags = Chilab'en taq Etal
tagline = Ke'ayaka' ri taq rucholna'oj chuqa' taq rusilowachib'äl Firefox richin natz'ët pa Pocket pa jun chik okisaxel, xab'achike ramaj.
taglinestory_one = Tapitz'a' rupitz'b'al Pocket richin nayäk jun rucholna'oj, rusilowachib'äl o jun ruxaq Firefox.
taglinestory_two = Titz'et pa Pocket pa jun chik okisaxel, xab'achike ramaj.
tagssaved = Xetz'aqatisäx Taq Etal
tos = Toq yatojqan el, nanimaj chi ri Pocket <a href="%1$S" target="_blank">Rojqanem richin Nokisäx</a> chuqa' <a href="%2$S" target="_blank">Ichinan Na'oj</a>
tryitnow = Tatojtob'ej Wakami
signinfirefox = Titikirisäx molojri'ïl rik'in Firefox
signupfirefox = Tatz'ib'aj ab'i' rik'in Firefox
viewlist = Titz'et Cholb'äl
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Tiyak pa Pocket
saveToPocketCmd.label = Tiyak Ruxaq pa Pocket
saveToPocketCmd.accesskey = T
saveLinkToPocketCmd.label = Tiyak Ximonel pa Pocket
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Titz'et Rucholb'al Pocket

Просмотреть файл

@ -7,7 +7,7 @@ alreadyhaveacct = ¿Ya eres usuario de Pocket?
continueff = Continuar con Firefox
errorgeneric = Hubo un error al intentar guardarla en Pocket.
learnmore = Aprender más
loginnow = Conectarse
loginnow = Conéctate
maxtaglength = Las etiquetas están limitadas a 25 caracteres
mustbeconnected = Debes estar conectado a Internet para guardar en Pocket. Por favor, revisa tu conexión y vuelve a intentarlo.
onlylinkssaved = Solo se pueden guardar enlaces
@ -20,11 +20,11 @@ removepage = Eliminar página
save = Guardar
saving = Guardando…
signupemail = Registrarse usando un email
signuptosave = Registrarse en Pocket. Es gratis.
signuptosave = Regístrate en Pocket. Es gratis.
suggestedtags = Etiquetas sugeridas
tagline = Guarda artículos y videos desde Firefox para verlos en Pocket en cualquier dispositivo y momento.
taglinestory_one = Aprieta el botón Pocket para guardar cualquier artículo, video o página de Firefox.
taglinestory_two = Mírala en Pocket en cualquier dispositivo y momento
taglinestory_two = Mírala en Pocket en cualquier dispositivo y momento.
tagssaved = Etiquetas añadidas
tos = Al continuar, aceptas los <a href="%1$S" target="_blank">Términos del servicio</a> y la <a href="%2$S" target="_blank">Política de privacidad</a> de Pocket.
tryitnow = Probarlo ahora

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = Gehitu etiketak
alreadyhaveacct = Pocket erabiltzailea zara jada?
continueff = Jarraitu Firefoxekin
errorgeneric = Errorea gertatu da Pocket-en gordetzen saiatzean.
learnmore = Argibide gehiago
loginnow = Hasi saioa
maxtaglength = Etiketak 25 karakterera daude mugatuta
mustbeconnected = Internetera konektatuta egon behar zara Pocket-en gorde ahal izateko. Egiaztatu zure konektagarritasuna eta saiatu berriro.
onlylinkssaved = Loturak gorde daitezke soilik
pagenotsaved = Ez da orria gorde
pageremoved = Orria kenduta
pagesaved = Pocket-en gordeta
processingremove = Orria kentzen…
processingtags = Etiketak gehitzen…
removepage = Kendu orria
save = Gorde
saving = Gordetzen…
signupemail = Eman izena posta elektronikoa erabiliz
signuptosave = Eman izena Pocket-en. Doakoa da.
suggestedtags = Iradokitako etiketak
tagline = Gorde Firefoxetik artikuluak eta bideoak edozein gailutan Pocket-en ikusteko, noiznahi.
taglinestory_one = Egin klik Pocket botoian Firefoxetik edozein artikulu, bideo edo orri gordetzeko.
taglinestory_two = Ikusi edozein gailutan Pocket-en, noiznahi.
tagssaved = Etiketak gehituta
tos = Jarraitzearekin bat, Pocket <a href="%1$S" target="_blank">zerbitzuaren baldintzak</a> eta <a href="%2$S" target="_blank">pribatutasun politika</a> onartzen dituzu
tryitnow = Probatu orain
signinfirefox = Hasi saioa Firefoxekin
signupfirefox = Eman izena Firefoxekin
viewlist = Ikusi zerrenda
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Gorde Pocket-en
saveToPocketCmd.label = Gorde orria Pocket-en
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = Gorde lotura Pocket-en
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Ikusi Pocket zerrenda

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = Engadir etiquetas
alreadyhaveacct = Xa é usuario de Pocket?
continueff = Continuar con Firefox
errorgeneric = Produciuse un erro ao tentar gardar en Pocket.
learnmore = Máis información
loginnow = Identificarse
maxtaglength = As etiquetas está limitadas a 25 caracteres
mustbeconnected = É necesario estar conectado á Internet para poder gardar en Pocket. Comprobe a súa conexión e tente de novo.
onlylinkssaved = Só se poden gardar ligazóns
pagenotsaved = Non se gardou a páxina
pageremoved = Retirouse a páxina
pagesaved = Gardouse en Pocket
processingremove = Retirando páxina…
processingtags = Engadindo etiquetas…
removepage = Retirar páxina
save = Gardar
saving = Gardando…
signupemail = Rexístrese co seu correo
signuptosave = Rexístrese en Pocket. É de balde.
suggestedtags = Etiquetas suxeridas
tagline = Garde artigos e vídeos dende Firefox para velos en Pocket en calquera dispositivo, en calquera momento.
taglinestory_one = Prema no botón Pocket para gardar calquera artigo, vídeo ou páxina dende Firefox.
taglinestory_two = Véxao en Pocket en calquera dispositivo, en calquera momento.
tagssaved = Engadíronse as etiquetas
tos = Se continúa, acepta os <a href="%1$S" target="_blank">termos do servizo</a> e <a href="%2$S" target="_blank">política de privacidade</a> de Pocket
tryitnow = Próbeo xa
signinfirefox = Acceda con Firefox
signupfirefox = Rexístrese con Firefox
viewlist = Ver lista
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Gardar en Pocket
saveToPocketCmd.label = Gardar páxina en Pocket
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = Gardar ligazón en Pocket
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Ver a lista de Pocket

Просмотреть файл

@ -28,7 +28,7 @@ taglinestory_two = Nézze meg a Pocketen bármely eszközön, bármikor.
tagssaved = Címkék hozzáadva
tos = A folytatással elfogadja a Pocket <a href="%1$S" target="_blank">Szolgáltatási feltételeit</a> és az <a href="%2$S" target="_blank">Adatvédelmi nyilatkozatot</a>
tryitnow = Próbálja ki most
signinfirefox = Bejelentkezés a Firefoxszal
signinfirefox = Firefox bejelentkezés
signupfirefox = Regisztráció a Firefoxszal
viewlist = Lista megjelenítése

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = Bæta við flokkum
alreadyhaveacct = Ertu þegar Pocket notandi?
continueff = Halda áfram með Firefox
errorgeneric = Upp kom villa við að vista á Pocket.
learnmore = Fræðast meira
loginnow = Innskráning
maxtaglength = Tög eru takmörkuð við 25 stafi
mustbeconnected = Þú verður að vera tengdur netinu til að vista Pocket. Athugaðu tengingu og reyndu aftur.
onlylinkssaved = Aðeins er hægt að vista tengla
pagenotsaved = Ekki tókst að vista síðu
pageremoved = Síða fjarlægð
pagesaved = Vistað í Pocket
processingremove = Fjarlægi síðu…
processingtags = Bæti við flokkum…
removepage = Fjarlægja síðu
save = Vista
saving = Vista…
signupemail = Skrá inn með tölvupóstfangi
signuptosave = Skrá sig inn með Pocket. Það er ókeypis.
suggestedtags = Flokkar sem mælt er með
tagline = Vista síður og myndbönd frá Firefox til að skoða í Pocket á hvaða tæki sem er, hvenær sem er.
taglinestory_one = Smelltu á Pocket hnappinn til að vista grein, myndband eða síðu frá Firefox.
taglinestory_two = Skoðaðu í Pocket á hvaða tæki sem er, hvenær sem er.
tagssaved = Bætti við flokkum
tos = Þú ert að samþykkja <a href="%1$S" target="_blank">skilmála</a> hjá Pocket og <a href="%2$S" target="_blank">reglur um persónugögn</a> með því að halda áfram
tryitnow = Reyndu það núna
signinfirefox = Skrá sig inn með Firefox
signupfirefox = Skrá sig með Firefox
viewlist = Skoða lista
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Vista í Pocket
saveToPocketCmd.label = Vista síðu í Pocket
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = Vista tengil í Pocket
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Skoða Pocket lista

Просмотреть файл

@ -19,6 +19,7 @@
#define hi_IN hi-IN
#define hy_AM hy-AM
#define nb_NO nb-NO
#define ne_NP ne-NP
#define nn_NO nn-NO
#define pa_IN pa-IN
#define pt_BR pt-BR
@ -32,7 +33,7 @@
# For locales we support, include the file from the locale's directory in the
# source tree.
# For other locales (and en-US) fallback to the en-US directory.
#if AB_CD == ach || AB_CD == ar || AB_CD == ast || AB_CD == az || AB_CD == be || AB_CD == bg || AB_CD == bn_BD || AB_CD == bn_IN || AB_CD == cs || AB_CD == cy || AB_CD == da || AB_CD == de || AB_CD == dsb || AB_CD == el || AB_CD == en_GB || AB_CD == en_US || AB_CD == eo || AB_CD == es_AR || AB_CD == es_CL || AB_CD == es_ES || AB_CD == es_MX || AB_CD == et || AB_CD == fa || AB_CD == ff || AB_CD == fi || AB_CD == fr || AB_CD == fy_NL || AB_CD == ga_IE || AB_CD == gd || AB_CD == gu_IN || AB_CD == he || AB_CD == hi_IN || AB_CD == hr || AB_CD == hsb || AB_CD == hu || AB_CD == hy_AM || AB_CD == id || AB_CD == it || AB_CD == ja || AB_CD == ka || AB_CD == kab || AB_CD == kk || AB_CD == km || AB_CD == ko || AB_CD == lij || AB_CD == lt || AB_CD == lv || AB_CD == mr || AB_CD == ms || AB_CD == nb_NO || AB_CD == nl || AB_CD == nn_NO || AB_CD == or || AB_CD == pa_IN || AB_CD == pl || AB_CD == pt_BR || AB_CD == pt_PT || AB_CD == rm || AB_CD == ro || AB_CD == ru || AB_CD == sk || AB_CD == sl || AB_CD == sq || AB_CD == sr || AB_CD == sv_SE || AB_CD == te || AB_CD == th || AB_CD == tl || AB_CD == tr || AB_CD == uk || AB_CD == zh_CN || AB_CD == zh_TW
#if AB_CD == ach || AB_CD == ar || AB_CD == ast || AB_CD == az || AB_CD == be || AB_CD == bg || AB_CD == bn_BD || AB_CD == bn_IN || AB_CD == br || AB_CD == bs || AB_CD == ca || AB_CD == cak || AB_CD == cs || AB_CD == cy || AB_CD == da || AB_CD == de || AB_CD == dsb || AB_CD == el || AB_CD == en_GB || AB_CD == en_US || AB_CD == eo || AB_CD == es_AR || AB_CD == es_CL || AB_CD == es_ES || AB_CD == es_MX || AB_CD == et || AB_CD == eu || AB_CD == fa || AB_CD == ff || AB_CD == fi || AB_CD == fr || AB_CD == fy_NL || AB_CD == ga_IE || AB_CD == gd || AB_CD == gl || AB_CD == gu_IN || AB_CD == he || AB_CD == hi_IN || AB_CD == hr || AB_CD == hsb || AB_CD == hu || AB_CD == hy_AM || AB_CD == id || AB_CD == is || AB_CD == it || AB_CD == ja || AB_CD == ka || AB_CD == kab || AB_CD == kk || AB_CD == km || AB_CD == kn || AB_CD == ko || AB_CD == lij || AB_CD == lt || AB_CD == ltg || AB_CD == lv || AB_CD == mk || AB_CD == ml || AB_CD == mr || AB_CD == ms || AB_CD == my || AB_CD == nb_NO || AB_CD == ne_NP || AB_CD == nl || AB_CD == nn_NO || AB_CD == oc || AB_CD == or || AB_CD == pa_IN || AB_CD == pl || AB_CD == pt_BR || AB_CD == pt_PT || AB_CD == rm || AB_CD == ro || AB_CD == ru || AB_CD == sk || AB_CD == sl || AB_CD == sq || AB_CD == sr || AB_CD == sv_SE || AB_CD == ta || AB_CD == te || AB_CD == th || AB_CD == tl || AB_CD == tr || AB_CD == uk || AB_CD == ur || AB_CD == vi || AB_CD == zh_CN || AB_CD == zh_TW
locale/@AB_CD@/ (@AB_CD@/*)
#else
locale/@AB_CD@/ (en-US/*)

Просмотреть файл

@ -2,31 +2,31 @@
# 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/.
addtags = იარლიყების დამატება
addtags = ჭდეების დამატება
alreadyhaveacct = უკვე იყენებთ Pocket-ს?
continueff = Firefox-ით გაგრძელება
errorgeneric = Pocket-ში შენახვისას დაფიქსირდა შეცდომა.
learnmore = დაწვრილებით
loginnow = შესვლა
maxtaglength = იარლიყები შეზღუდულია 25 ასომდე
maxtaglength = ჭდე უნდა შედგებოდეს არაუმეტეს 25 სიმბოლოსგან
mustbeconnected = Pocket-ში შესანახად საჭიროა ინტერნეთთან კავშირი. გთხოვთ შეამოწმეთ თქვენი კავშირი და ხელახლა ცადეთ.
onlylinkssaved = შესაძლებელია მხოლოდ ბმულების შენახვა
pagenotsaved = გვერდი არ შეინახა
pageremoved = გვერდი წაიშალა
pagesaved = შეინახა Pocket-ში
processingremove = იშლება გვერდი…
processingtags = ემატება იარლიყები…
processingtags = ემატება ჭდეები…
removepage = გვერდის წაშლა
save = შენახვა
saving = ინახება…
signupemail = რეგისტრაცია ელ-ფოსტით
signuptosave = დარეგისტრირდით Pocket-ზე. ეს უფასოა.
suggestedtags = შემოთავაზებული იარლიყები
tagline = შეინახეთ სტატიები და ვიდეოეი Firefox-იდან მათ Pocket-ში სანახავად ნებისმიერ მოწყობილობაზე, ნებისმიერ დროს.
taglinestory_one = Firefox-იდან ნებისმიერი სტატიის, ვიდეოს ან გვერდის შესანახად დააწკაპეთ Pocket-ის ღილაკს.
suggestedtags = შემოთავაზებული ჭდეები
tagline = შეინახეთ სტატიები და ვიდეოი Firefox-იდან მათ Pocket-ში სანახავად ნებისმიერ მოწყობილობაზე, ნებისმიერ დროს.
taglinestory_one = Firefox-იდან ნებისმიერი სტატიის, ვიდეოს ან გვერდის შესანახად დააწკაპეთ Pocket ღილაკს.
taglinestory_two = დაათვალიერეთ Pocket-ში ნებისმიერ მოწყობილობაზე, ნებისმიერ დროს.
tagssaved = იარლიყები დაემატ
tos = გაგრძელების შემთხვევაში თქვენ ეთანხმებით Pocket-ის <a href="%1$S" target="_blank">მომსახურების პირობებს</a> და <a href="%2$S" target="_blank">პრივატულობის პოლიტიკას</a>
tagssaved = ჭდეები დამატებული
tos = გაგრძელების შემთხვევაში, თქვენ ეთანხმებით Pocket-ის <a href="%1$S" target="_blank">მომსახურების პირობებს</a> და <a href="%2$S" target="_blank">პირადულობის დაცვის დებულებას</a>
tryitnow = სცადეთ ახლავე
signinfirefox = შესვლა Firefox-ით
signupfirefox = რეგისრაცია Firefox-ით
@ -37,7 +37,7 @@ viewlist = სიის ნახვა
pocket-button.label = Pocket
pocket-button.tooltiptext = Pocket-ში შენახვა
saveToPocketCmd.label = გვერდის შენახვა Pocket-ში
saveToPocketCmd.accesskey = k
saveToPocketCmd.accesskey =
saveLinkToPocketCmd.label = ბმულის შენახვა Pocket-ში
saveLinkToPocketCmd.accesskey = o
saveLinkToPocketCmd.accesskey =
pocketMenuitem.label = Pocket სიის ნახვა

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = ಟ್ಯಾಗ್‌ಗಳನ್ನು ಸೇರಿಸು
alreadyhaveacct = ನೀವು ಈಗಾಗಲೇ ಪಾಕೆಟ್ ಬಳಕೆದಾರರೆ?
continueff = Firefox ಜೊತೆ ಮುಂದುವರೆಯಿರಿ
errorgeneric = ಪಾಕೆಟ್‌ನಲ್ಲಿ ಉಳಿಸಲು ಪ್ರಯತ್ನಿಸಿದಾಗ ದೋಷ ಉಂಟಾಗಿದೆ.
learnmore = ಇನ್ನಷ್ಟು ಅರಿತುಕೊಳ್ಳಿ
loginnow = ಪ್ರವೇಶಿಸು
maxtaglength = ಟ್ಯಾಗ್‌ಗಳು 25 ಅಕ್ಷರಗಳಿಗೆ ಸೀಮಿತವಾಗಿವೆ
mustbeconnected = ನೀವು Pocket ನಲ್ಲಿ ಉಳಿಸಲು ಅಂತರ್ಜಾಲಕ್ಕೆ ಸಂಪರ್ಕ ಹೊಂದಿರಬೇಕಾಗುತ್ತದೆ. ದಯವಿಟ್ಟು ಅಂತರಜಾಲಕ್ಕೆ ಸಂಪರ್ಕಿತಗೊಂಡಿದ್ದೀರಿ ಎಂದು ಪರೀಕ್ಷಿಸಿ ನಂತರ ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.
onlylinkssaved = ಕೇವಲ ಕೊಂಡಿಗಳನ್ನು ಮಾತ್ರ ಉಳಿಸಬಹುದು
pagenotsaved = ಪುಟವನ್ನು ಉಳಿಸಲಾಗಲಿಲ್ಲ
pageremoved = ಪುಟವನ್ನು ತೆಗೆಯಲಾಗಿದೆ
pagesaved = ಪಾಕೆಟ್‌ನಲ್ಲಿ ಉಳಿಸಲಾಗಿದೆ
processingremove = ಪುಟವನ್ನು ತೆಗೆಯಲಾಗುತ್ತಿದೆ...
processingtags = ಟ್ಯಾಗ್‌ಗಳನ್ನು ಸೇರಿಸಲಾಗುತ್ತಿದೆ...
removepage = ಪುಟವನ್ನು ತೆಗೆದುಹಾಕು
save = ಉಳಿಸು
saving = ಉಳಿಸಲಾಗುತ್ತಿದೆ…‍
signupemail = ಇಮೇಲ್‌ನಿಂದ ಸೈನ್ ಅಪ್ ಮಾಡಿ
signuptosave = ಪಾಕೆಟ್‌ಗೆ ಸೈನ್ ಅಪ್ ಆಗಿ. ಇದು ಉಚಿತ.
suggestedtags = ಸೂಚಿಸಿದ ಟ್ಯಾಗ್‌ಗಳು
tagline = Firefox ನಿಂದ ಲೇಖನಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ಉಳಿಸಿರಿ ಮತ್ತು ಅವನ್ನು ಯಾವುದೇ ಸಾಧನದಲ್ಲಿ, ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಪಾಕೆಟ್‌ನಿಂದ ನೋಡಿರಿ.
taglinestory_one = ಯಾವುದೇ ಲೇಖನ, ವೀಡಿಯೋ ಅಥವಾ ಪುಟವನ್ನು Firefox ನಿಂದ ಉಳಿಸಲು ಪಾಕೆಟ್ ಬಟನ್ ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡಿ.
taglinestory_two = ಯಾವದೇ ಸಾಧನದಿಂದ, ಯಾವುದೇ ಸಮಯದಲಿ ಪಾಕೆಟ್‌ನಲ್ಲಿ ನೋಡಿರಿ.
tagssaved = ಸೇರಿಸಿದ ಟ್ಯಾಗ್‌ಗಳು‍
tos = ಮುಂದುವರೆಯುವುದರಿಂದ, ನೀವು Pocket ನ <a href="%1$S" target="_blank">‍‍ಸೇವಾ ನಿಯಮಗಳು</a> ಮತ್ತು <a href="%2$S" target="_blank">ಗೌಪ್ಯತಾ ನೀತಿ</a> ಒಪ್ಪುತ್ತೀರಿ‍‍
tryitnow = ಈಗ ಪ್ರಯತ್ನಿಸು
signinfirefox = Firefox ಜೊತೆ ಸೈನ್ ಇನ್ ಆಗಿ
signupfirefox = Firefox ಜೊತೆ ಸೈನ್ ಅಪ್ ಆಗಿ
viewlist = ಪಟ್ಟಿಯನ್ನು ನೋಡಿ
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = ಪಾಕೆಟ್
pocket-button.tooltiptext = ಪಾಕೆಟ್‌ನಲ್ಲಿ ಉಳಿಸಿ‍
saveToPocketCmd.label = Pocketಗೆ ಪುಟವನ್ನು ಉಳಿಸಿ
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = ಕೊಂಡಿಯನ್ನು ಪಾಕೆಟ್‌ಗೆ ಉಳಿಸಿ
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = ಪಾಕೆಟ್ ಪಟ್ಟಿಯನ್ನು ನೋಡಿ

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = Davīnōt birkas
alreadyhaveacct = Jau esi Pocket lītōtōjs?
continueff = Turpynōt ar Firefox
errorgeneric = Klaida saglobojūt Pocket.
learnmore = Vaira
loginnow = Pīsazaceit
maxtaglength = Birkas navar byut garōkas par 25 simbolim
mustbeconnected = Kab saglobōt Pocket, jōbyun savīnotam ar Internetu. Lyudzu porbaudi savīnojumu un paraugi vāļ reizi.
onlylinkssaved = Var saglobōt viņ saites
pagenotsaved = Lopa nav saglobōta
pageremoved = Lopa nūjimta
pagesaved = Saglobōts Pocket
processingremove = Izjem lopu…
processingtags = Davīnoj birkas…
removepage = Izjimt lopu
save = Saglobōt
saving = Sagloboj…
signupemail = Pīzarakstēt ar e-postu
signuptosave = Pīzariģistrēt Pocket. Tys ir par darma.
suggestedtags = Īsaceitōs birkas
tagline = Sagloboj rokstus voi video nu Firefox, kab vērtīs ar Pocket jebkurā īreicē un laikā.
taglinestory_one = Damīdz Pocket pūgu, kab saglobōt Firefox rokstus, video voi lopys.
taglinestory_two = Verīs Pocket uz jebkuras īreices jebkurā laikā.
tagssaved = Birkas pīvīnōtas
tos = Turpynojūt, tu piekreiti Pocket <a href="%1$S" target="_blank">Nūteikumim</a> un <a href="%2$S" target="_blank">Privātuma politikai</a>
tryitnow = Paraugi parreizi
signinfirefox = Pīzaslēgt ar Firefox kontu
signupfirefox = Pīzareģistrēt ar Firefox kontu
viewlist = Rōdēt sarokstu
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Saglobōt Pocket
saveToPocketCmd.label = Saglobōt lopu Pocket
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = Saglobōt saiti Pocket
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Rōdēt Pocket sarokstu

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = Додај етикети
alreadyhaveacct = Веќе користите Pocket?
continueff = Продолжи со Firefox
errorgeneric = Се појави грешка кога се обидов да зачувам на Pocket.
learnmore = Дознајте повеќе
loginnow = Најавете се
maxtaglength = Етикетите се ограничени на 25 знаци
mustbeconnected = Мора да сте поврзани на Интернет за да зачувате во Pocket. Ве молам проверете ја Вашата врска и обидете се повторно.
onlylinkssaved = Може да се зачувуваат само врски до мрежни места
pagenotsaved = Страницата не е зачувана
pageremoved = Страницата е отстранета
pagesaved = Зачувано во Pocket
processingremove = Страницата се отстранува…
processingtags = Додавам етикети …
removepage = Отстрани страница
save = Сними
saving = Се снима…
signupemail = Регистрирајте се со е-пошта
signuptosave = Регистрирајте се на Pocket. Бесплатно е.
suggestedtags = Предложени етикети
tagline = Зачувајте написи и видеа од Firefox за преглед во Pocket на било кој уред, во било кое време.
taglinestory_one = Кликнете на копчето Pocket за да зачувате напис, видео или страница од Firefox.
taglinestory_two = Прегледајте во Pocket на било кој уред, во било кое време.
tagssaved = Додадени етикети
tos = Доколку продолжите, се согласувате со <a href="%1$S" target="_blank">Условите за користење</a> и <a href="%2$S" target="_blank">Политиката за приватност</a> на Pocket
tryitnow = Пробајте го сега
signinfirefox = Најавете се со Firefox
signupfirefox = Регистрирајте се со Firefox
viewlist = Види листа
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Зачувај во Pocket
saveToPocketCmd.label = Зачувај страница во Pocket
saveToPocketCmd.accesskey = к
saveLinkToPocketCmd.label = Зачувај врска во Pocket
saveLinkToPocketCmd.accesskey = о
pocketMenuitem.label = Види листа на Pocket

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = ടാഗുകള്‍ ചേര്‍ക്കുക
alreadyhaveacct = നിലവില്‍ പോക്കറ്റ് ഉപയോക്താവാണോ?
continueff = ഫയര്‍ഫോക്സില്‍ തുടരുക
errorgeneric = 'പോക്കറ്റ്' ലേക്ക് സംരക്ഷിക്കാൻ ശ്രമിക്കുമ്പോൾ ഒരു പിശക് സംഭവിച്ചു.
learnmore = കൂടുതലറിയാം
loginnow = പ്രവേശിക്കുക
maxtaglength = ടാഗുകള്‍ 25 അക്ഷരങ്ങളിലേക്ക് പരിമിതപ്പെടുത്തിയിരിക്കുന്നു
mustbeconnected = പോക്കറ്റിലേക്ക് സേവ് ചെയ്യാൻ നിങ്ങൾ ഇന്റർനെറ്റിൽ കണക്റ്റു ചെയ്തിരിക്കണം. നിങ്ങളുടെ കണക്ഷൻ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.
onlylinkssaved = കണ്ണികള്‍ മാത്രമേ സൂക്ഷിക്കാന്‍ പറ്റു
pagenotsaved = പേജ് സംരക്ഷിച്ചില്ല
pageremoved = താള്‍ നീക്കം ചെയ്തു
pagesaved = ' പോക്കറ്റിലേക്ക് 'സംരക്ഷിച്ചു
processingremove = താള്‍ കളയുന്നു…
processingtags = ടാഗ് ചേര്‍ക്കുന്നു…
removepage = താള്‍ നീക്കം ചെയ്യുക
save = സൂക്ഷിക്കുക
saving = സൂക്ഷിയ്ക്കുന്നു..
signupemail = ഇമെയിൽ കൊണ്ട് പങ്ക് ചേരുക
signuptosave = പോക്കറ്റിൽ പങ്കുചേരുക. തികച്ചും സൗജന്യമായി.
suggestedtags = നിര്‍ദ്ദേശിച്ച ടാഗുകള്‍
tagline = ഫയർഫോക്സിൽ നിന്ന് പോക്കറ്റിൽ ഏത് ഉപായത്തിലും, ഏത് സമയത്തും ലേഖനങ്ങളും വീഡിയോകളും സംരക്ഷിച്ച് കാണാം.
taglinestory_one = ഫയർഫോക്സിൽ നിന്ന് ഏതെങ്കിലും ലേഖനം, വീഡിയോ അല്ലെങ്കിൽ താള് പോക്കറ്റ് ബട്ടൺ അടിച്ച് സംരക്ഷിക്കാം.
taglinestory_two = പോക്കറ്റിൽ ഏത് ഉപായത്തിലും, ഏത് സമയത്തും കാണുക.
tagssaved = ടാഗുകൾ ചേർത്തു
tos = തുടരുന്നതിലൂടെ, നിങ്ങൾ പോക്കറ്റിന്റെ <a href="%1$S" target="_blank">സേവന നിബന്ധനകളോടും</a><a href="%2$S" target="_blank">സ്വകാര്യ വ്യവസ്ഥകളോടും</a> സമ്മതിക്കുന്നു
tryitnow = ഇപ്പോൾ പരീക്ഷിക്കുക
signinfirefox = ഫയർഫോക്സിൽ പ്രവേശിയ്ക്കുക
signupfirefox = ഫയർഫോക്സിൽ പങ്ക് ചേരുക
viewlist = പട്ടിക കാണുക
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = പോക്കറ്റ്
pocket-button.tooltiptext = 'പോക്കറ്റിലേക്ക്' സംരക്ഷിച്ചു
saveToPocketCmd.label = 'പോക്കറ്റിലേക്ക്' താള്‍ സംരക്ഷിക്കുക
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = 'പോക്കറ്റിലേക്ക്' ലിങ്ക് സംരക്ഷിക്കുക
saveLinkToPocketCmd.accesskey =
pocketMenuitem.label = പോക്കറ്റ് പട്ടിക കാണുക

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = စာအမှတ်များ ထည့်ပါ
alreadyhaveacct = ပေါ့ကတ် အကောင့်ရှိပြီးပြီလား။
continueff = မီးမြေခွေးကို အသုံးပြုပြီး ဆက်လက်လုပ်ဆောင်မည်
errorgeneric = ပေါ့ကတ်သို့ သိမ်းရန်ကြိုးစားရာတွင် ပြသာနာတစ်ခု တွေ့ရှိခဲ့သည်။
learnmore = ဆက်လက်လေ့လာ
loginnow = ဝင်ပါ
maxtaglength = စာမှတ်များ၏ စာလုံးရေကန့်သတ်ချက်သည် ၂၅ လုံးဖြစ်သည်
mustbeconnected = ပေါ့ကတ်သို့သိမ်းဆည်းရန်အတွက် သင်အင်တာနက်သို့ ချိတ်ဆက်ထားရမည်ဖြစ်သည်။ ကျေးဇူးပြု၍ သင့် အင်တာနက်ကို ချိတ်ဆက်ပြီး ထပ်မံကြိုးစားကြည့်ပါ။
onlylinkssaved = လင်ခ့်များကိုသာ သိမ်းထားနိုင်သည်
pagenotsaved = စာမျက်နှာကို မသိမ်းလိုက်ရပါ
pageremoved = စာမျက်နှာကို ဖယ်ရှားပြီး
pagesaved = ပေါ့ကတ်သို့သိမ်းပြီး
processingremove = စာမျက်နှာကို ဖယ်ရှားနေသည်…
processingtags = စာမှတ်များကို ထည့်နေသည်...
removepage = စာမျက်နှာကို ဖျက်ရန်
save = သိမ်းရန်
saving = သိမ်းဆည်းနေသည်…
signupemail = အီးမေးလ်ဖြင့် မှတ်ပုံတင်ပါ
signuptosave = ပေါ့ကတ်အတွက် မှတ်ပုံတင်ပါ။ အခမဲ့ဖြစ်ပါသည်။
suggestedtags = အကြံပေးထားသော စာတိုများ
tagline = မည်သည့်ကိရိယာ၊ မည်သည့်အချိန်တွင်မဆို ပေါ့ကတ်ထဲတွင် ကြည့်ရန် မီးမြေခွေးမှ စာစုများနှင့် ဗွီဒီယိုများကို သိမ်းပါ။
taglinestory_one = မီးမြေခွေးမှ မည်သည့်စာစု၊ ဗွီဒီယို သို့မဟုတ် စာမျက်နှာကို သိမ်းရန် ပေါ့ကတ်ခလုတ်ကို နှိပ်ပါ။
taglinestory_two = မည်သည့် ကိရိယာ၊ မည်သည့် အချိန်တွင်မဆို ပေါ့ကတ်ထဲတွင် ကြည့်ပါ။
tagssaved = စာမှတ်များ ထည့်ပြီး
tos = ဆက်လက်ဆောင်ရွက်ခြင်းအားဖြင့် သင်သည် Pocket ရဲ့<a href="%1$S" target="_blank">စည်းမျဉ်းစည်းကမ်းများ</a>နှင့်<a href="%2$S" target="_blank">ကိုယ်ရေးဆိုင်ရာမူဝါဒ</a>ကိုသ​ဘောတူပါသည်
tryitnow = ယခုပင် စမ်းကြည့်ပါ
signinfirefox = မီးမြေခွေးအကောင့်ဖြင့် ဝင်ရောက်ပါ
signupfirefox = မီးမြေခွေးအကောင့်ဖြင့် မှတ်ပုံတင်ပါ
viewlist = စာရင်းကို ကြည့်ရန်
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Pocket သို့ သိမ်းရန်
saveToPocketCmd.label = စာမျက်နှာကို Pocket ထဲသို့ သိမ်းပါ
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = လင့်ခ်ကို Pocket ထဲသို့(o) သိမ်းပါ
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Pocket စာရင်းကို ကြည့်ရန်

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = ट्याग थप्नुहोस्
alreadyhaveacct = के तपाईँ पकेट प्रयोगकर्ता हो?
continueff = Firefox सँग जारी राख्नुहोस्
errorgeneric = Pocket मा सङ्ग्रह गर्न प्रयास गर्दा, एउटा त्रुटी भयो।
learnmore = अझ जान्नुहोस्
loginnow = लग इन
maxtaglength = ट्याग २५ अक्षर सम्म सिमित हुन्छन
mustbeconnected = तपाईँ Pocket मा सङ्ग्रह गर्न इन्टरनेटसँग जोडिएको हुनुपर्छ। आफ्नो जडान जाँच र फेरि प्रयास गर्नुहोस्।
onlylinkssaved = लिङ्कहरू मात्र सङ्ग्रह गर्न सकिन्छ
pagenotsaved = पृष्ठ सङ्ग्रह गरिएको छैन
pageremoved = पृष्ठ हटाइयो
pagesaved = Pocket मा सङ्ग्रह गरियो
processingremove = पृष्ठ हटाउँदै ...
processingtags = ट्यागहरू थप्दै…
removepage = पृष्ठ हटाउनुहोस्
save = सङ्ग्रह गर्नुहोस्
saving = सङ्ग्रह गरिँदै…
signupemail = इमेल प्रयोग गरेर साइन अप गर्नुहोस्
signuptosave = Pocket मा साइन अप गर्नुहोस् । यो निःशुल्क छ ।\u0020
suggestedtags = सिफारिस गरिएका ट्यागहरू
tagline = कुनै पनि उपकरणमा, कुनै पनि समयमा Pocket हेर्न Firefox बाट लेख र भिडियो सङ्ग्रह गर्नुहोस्।
taglinestory_one = Firefox बाट कुनै पनि लेख, भिडियो वा पृष्ठ सङ्ग्रह गर्न Pocket Button थिच्नुहोस्।
taglinestory_two = कुनै पनि उपकरण, कुनै पनि समय Pocket मा हेर्नुहोस्।
tagssaved = ट्यागहरू थिपियो
tos = अघि बढेर, तपाईँ Pocket को <a href="%1$S" target="_blank">सेवा सर्तहरू</a> र <a href="%2$S" target="_blank">गोपनीयता नीति</a> स्विकार्दै हुनुहुन्छ
tryitnow = अहिले नै परीक्षण गर्नुहोस्
signinfirefox = Firefox प्रयोग गरेर साइन इन गर्नुहोस्
signupfirefox = Firefox प्रयोग गरेर साइन अप गर्नुहोस्
viewlist = सुची हेर्नुहोस्
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Pocket मा सङ्ग्र गर्नुहोस्
saveToPocketCmd.label = पृष्ठलाई Pocket मा सङ्ग्रह गर्नुहोस्
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = Pocket मा लिङ्क सङ्ग्रह गर्नुहोस्
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Poket को सुची हेर्नुहोस्

Просмотреть файл

@ -2,30 +2,30 @@
# 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/.
addtags = Legg til merkelapp-stikkord
addtags = Legg til etikettar
alreadyhaveacct = Allereie ein Pocket-brukar?
continueff = Hald fram med Firefox
errorgeneric = Eit problem oppstod ved lagring til Pocket.
learnmore = Les meir
loginnow = Logg inn
maxtaglength = Merkelapp-stikkord er avgrensa til 25 teikn
maxtaglength = Etikettar er avgrensa til 25 teikn
mustbeconnected = Du må vera kopla til nettet for å lagra til Pocket. Kontroller tilkoplinga og prøv igjen.
onlylinkssaved = Berre lenker kan lagrast
pagenotsaved = Sida ikkje lagra
pageremoved = Sida fjerna
pagesaved = Lagrar til Pocket
processingremove = Fjernar sida …
processingtags = Legg til merkelapp-stikkord
processingtags = Legg til etikettar
removepage = Fjern sida
save = Lagra
saving = Lagrar …
signupemail = Logg inn med e-postadresse
signuptosave = Registrer deg på Pocket. Det er gratis.
suggestedtags = Føreslåtte merkelapp-stikkord
suggestedtags = Føreslåtte etikettar
tagline = Lagra artiklar og videoar frå Firefox for å visa dei i Pocket på kva som helst eining, når som helst.
taglinestory_one = Trykk på Pocket-knappen for å lagra kva som helst artikkel, video eller side frå Firefox.
taglinestory_one = Trykk på Pocket-knappen for å lagra artiklar, videoar eller sider frå Firefox.
taglinestory_two = Vis i Pocket, på kva som helst eining, når som helst.
tagssaved = Merkelapp-stikkord lagt til
tagssaved = Etikettar lagt til
tos = Ved å fortsetta godtek du Pocket sine <a href="%1$S" target="_blank">tenestevilkår</a> og <a href="%2$S" target="_blank">personvernpraksis</a>
tryitnow = Prøv no
signinfirefox = Logg inn med Firefox

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = Apondre d'etiquetas
alreadyhaveacct = Avètz ja un compte dins Pocket ?
continueff = Contunhar amb Firefox
errorgeneric = Una error s'es produita en ensajant d'enregistrar dins Pocket.
learnmore = Ne saber mai
loginnow = Dobrir una session
maxtaglength = Las etiquetas an un limit de 25 caractèrs
mustbeconnected = Vos cal èsser connectat a Internet per salvar de ligams a Pocket. Verificatz vòstre connexion e tornatz ensajar.
onlylinkssaved = Se pòdon pas enregistrar que los ligams
pagenotsaved = La pagina es pas estada enregistrada
pageremoved = La pagina es estada suprimida
pagesaved = Es estat enregistrat dins Pocket
processingremove = Supression de la pagina...
processingtags = Apondon de las etiquetas...
removepage = Suprimir la pagina
save = Enregistrar
saving = Enregistrament...
signupemail = S'inscriure amb lo corrièr electronic
signuptosave = Inscrivètz-vos a Pocket. Es gratuit.
suggestedtags = Etiquetas recomandadas
tagline = Salvatz d'articles e vidèos de Firefox per los veire en Pocket de quin que siá periferic quand volatz.
taglinestory_one = Clicatz lo boton Pocket per salvar d'articles, vidèos o paginas de Firefox.
taglinestory_two = Vejatz en Pocket de quin que siá periferic quand volatz.
tagssaved = Etiquetas apondudas
tos = Per contunhar, vos cal acceptar las <a href="%1$S" target="_blank">condicions de servici</a> e <a href="%2$S" target="_blank">politicas de confidencialitat</a> de Pocket
tryitnow = Ensajatz-lo ara
signinfirefox = Connectatz-vos amb Firefox
signupfirefox = Se marcar amb Firefox
viewlist = Afichar la lista
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Es estat enregistrat dins Pocket
saveToPocketCmd.label = Salvar pagina dins Pocket
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = Salvar ligam dins Pocket
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Mostrar la lista de Pocket

Просмотреть файл

@ -28,8 +28,8 @@ taglinestory_two = Ver no Pocket em qualquer dispositivo, a qualquer altura.
tagssaved = Etiquetas adicionadas
tos = Ao continuar, concorda com os <a href="%1$S" target="_blank">termos do serviço</a> e <a href="%2$S" target="_blank">política de privacidade</a> do Pocket
tryitnow = Experimente-o agora
signinfirefox = Iniciar sessão com Firefox
signupfirefox = Registar com Firefox
signinfirefox = Iniciar sessão com o Firefox
signupfirefox = Registar com o Firefox
viewlist = Ver lista
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):

Просмотреть файл

@ -38,6 +38,6 @@ pocket-button.label = Pocket
pocket-button.tooltiptext = Spara till Pocket
saveToPocketCmd.label = Spara sida till Pocket
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = Spara Länk till Pocket
saveLinkToPocketCmd.accesskey = l
saveLinkToPocketCmd.label = Spara länk till Pocket
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Visa Pocket Lista\u0020

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = குறிகளைச் சேர்
alreadyhaveacct = ஏற்கனவே கணக்கு இருக்கா?
continueff = பயர்பாக்ஸ் உடன் தொடரவும்
errorgeneric = பாக்கெட்டில் சேமிக்கும்போது பிழை ஏற்பட்டது.
learnmore = மேலும் அறிக
loginnow = உள் நுழை
maxtaglength = குறிகள் 25 எழுத்துக்குமேல் இருக்கக்கூடாது
mustbeconnected = தங்களது பாகெட்டில் சேமிக்க நீங்கள் இணையத் தொடர்பில் இருக்க வேண்டும். தங்களது தொடர்பைச் சரிபார்த்துவிட்டு மீண்டும் முயற்சி செய்யவும்.
onlylinkssaved = தொடுப்புகள் மட்டுமே சேமிக்க முடியும்
pagenotsaved = சேமிக்கப்படவில்லை
pageremoved = பக்கம் நீக்கப்பட்டது
pagesaved = பாக்கெட்டில் சேமத்தது
processingremove = பக்கம் நீக்கப்படுகிறது…
processingtags = குறிச்சொற்கள் சேர்க்கப்படுகின்றன…
removepage = பக்கத்தை நீக்கு
save = சேமி
saving = சேமிக்கிறது…
signupemail = மின்னஞ்சல் கொண்டு உள்நுழையுங்கள்
signuptosave = பாக்கெட்டில் புகுப்பதிக. இது இலவசமே.
suggestedtags = பரிந்துரைக்கப்பட்ட குறிகள்
tagline = பயர்பாக்ஸ் உலாவியின் மூலம் கட்டுரைகள் மற்றும் காணொளிகளை பாகெட்டில் சேமித்து எந்நேரத்தில் எக்கருவில் இருந்தும் பாருங்கள்.
taglinestory_one = பாக்கெட் பொத்தானை அழுத்தி எந்த கட்டுரையையும் பக்கத்தையும் பயர்பாக்ஸிலிருந்து சேமிக்க முடியும்.
taglinestory_two = பாக்கெட்டை எங்கிருந்தும் எந்நேரத்திலும் பார்க்கலாம்.
tagssaved = குறிகள் சேர்க்கப்பட்டன
tos = தொடர்வதன் மூலம், நீங்கள் பாக்கெட்டின் <a href="%1$S" target="_blank">சேவை நிபந்தனைகள்</a> மற்றும்<a href="%2$S" target="_blank">தனியுரிம கொள்கைகளையும்</a> ஏற்கிறீர்கள்
tryitnow = இப்போது முயற்சி
signinfirefox = பயர்பாக்ஸ் கொண்டு உள்நுழை
signupfirefox = பயர்பாக்ஸ் கொண்டு உள்நுழை
viewlist = பட்டியலைப் பார்
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = பாக்கெட்
pocket-button.tooltiptext = பாக்கெட்டில் சேமி
saveToPocketCmd.label = பாக்கெட்டில் சேமி
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = தொடுப்பை பாக்கெட்டில் சேமி
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = பாக்கெட் பட்டியலைப் பார்

Просмотреть файл

@ -6,7 +6,7 @@ addtags = ట్యాగులను చేర్చు
alreadyhaveacct = ఇప్పటికే ఒక పాకెట్ వాడుకరా?
continueff = Firefoxతో కొనసాగించండి
errorgeneric = పాకెట్ కు సేవ్ చేయడానికి ప్రయత్నిస్తున్నప్పుడు లోపం ఉంది.
learnmore = మరింత తెలుసుకోండి
learnmore = ఇంకా తెలుసుకోండి
loginnow = లాగ్ ఇన్
maxtaglength = టాగ్లు 25 అక్షరాలకు పరిమితం చేయబడ్డాయి
mustbeconnected = మీరు పాకెట్ కు సేవ్ చేయడానికి ఇంటర్నెట్ కనెక్ట్ చేయక తప్పదు. మీ కనెక్షన్ను తనిఖీ చేసి, మళ్ళీ ప్రయత్నించండి.

Просмотреть файл

@ -29,7 +29,7 @@ tagssaved = ป้ายกำกับถูกเพิ่มแล้ว
tos = หากตกลง หมายความว่า คุณยอมรับ<a href="%1$S" target="_blank">เงื่อนไขการให้บริการ</a> และ<a href="%2$S" target="_blank">นโยบายความเป็นส่วนตัว</a>ของ Pocket
tryitnow = ลองเลย
signinfirefox = ลงชื่อเข้าด้วย Firefox
signupfirefox = ลงทะเบียนกับ Firefox
signupfirefox = ลงทะเบียนด้วย Firefox
viewlist = ดูรายการ
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = ٹيگز کا اضافہ کريں
alreadyhaveacct = پہلے سے ہی Pocket صارف ہیں؟
continueff = Firefox کے ساتھ جاری رکھیں
errorgeneric = جب Pocket میں محفوظ کرنے کی کوشش کی گئی تو ایک نقص پایا گیا۔
learnmore = مزید سیکھیں
loginnow = لاگ ان
maxtaglength = ٹیگز 25 حروف تک محدود ہیں
mustbeconnected = آپکو Pocket میں محفوظ کرنے کے لیئے انٹرنیٹ سے جڑنا ظروری ہے۔ براہ مہربانی اپنے انٹرنیٹ کنکشن کی بڑتال کریں اور دوبارہ کوشش کریں۔
onlylinkssaved = صرف ربط محفوط ہو سکتے ہیں
pagenotsaved = صفحہ محفوظ نہیں ہوا
pageremoved = صفحہ ہٹا دیا گیا
pagesaved = Pocket میں محفوظ شدہ
processingremove = صفحہ ہٹا رہے ہیں…
processingtags = ٹیگز اضافہ کر رہے ہیں...
removepage = صفحہ ہٹائیں
save = محفوظ
saving = محفوظ کر رہا ہے…
signupemail = ای میل کے ساتھ سائن اپ کریں
signuptosave = Pocket کے لیئے سائن اپ کریں۔ یہ بلکل مفت ہے۔
suggestedtags = تجویز شدہ ٹیگز
tagline = Firefox سے مظامین اور وڈیوذ کو محفوظ کریں تاکہ Pocket میں کسی بھی آلہ پر کسی بھی وقت نظارہ کر سکیں
taglinestory_one = Firefox سے کسی بھی مظمون، وڈیو کو محفوظ کرنے کے لیئے Pocket کے بٹن پر کلک کریں۔
taglinestory_two = Pocket میں نظارہ کریں کسی بھی آلہ پر، کس بھی وقت۔
tagssaved = ٹیگز کا اظافہ کر دیا گیا
tos = جاری رکھتے ہوئے، آپ Pocket کی <a href="%1$S" target="_blank">شرائط و ضوابط</a> اور <a href="%2$S" target="_blank">راز داری کی پالیسی</a> سے متفق ہیں
tryitnow = ابھی آزمائیں
signinfirefox = Firefox کے ساتھ سائن ان کریں
signupfirefox = Firefox کے ساتھ سائن اپ کریں
viewlist = فہرست کا نظارہ کریں
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Pocket میں محفوظ کریں
saveToPocketCmd.label = Pocket میں صفحات محوظ کریں
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = ربط کو Pocket میں محفوظ کرِیں
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Pocket فہرست کا نظارہ کریں

Просмотреть файл

@ -0,0 +1,43 @@
# 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/.
addtags = Thêm các tag
alreadyhaveacct = Bạn đã có tài khoản Pocket?
continueff = Tiếp tục với Firefox
errorgeneric = Đã xảy ra lỗi khi đang lưu vào Pocket.
learnmore = Tìm hiểu thêm
loginnow = Đăng nhập
maxtaglength = Các tag được giới hạn trong 25 ký tự
mustbeconnected = Bạn phải kết nối đến Internet để lưu vào Pocket. Xin hãy kiểm tra kết nối của bạn và thử lại.
onlylinkssaved = Chỉ các các liên kết mới có thể được lưu lại
pagenotsaved = Trang chưa được lưu
pageremoved = Trang đã bị xóa
pagesaved = Đã được lưu vào Pocket
processingremove = Đang xóa trang...
processingtags = Đang thêm các tag...
removepage = Xóa trang
save = Lưu lại
saving = Đang lưu lại...
signupemail = Đăng ký bằng email
signuptosave = Đăng ký Pocket. Hoàn toàn miễn phí.
suggestedtags = Các tag được đề xuất
tagline = Lưu bài viết và video từ Firefox để xem trên Pocket trên bất kỳ thiết bị nào, bất cứ lúc nào.
taglinestory_one = Nhấp vào nút Pocket để lưu bất kỳ bài viết, video hoặc trang nào từ Firefox.
taglinestory_two = Xem trên Pocket ở bất cứ thiết bị và thời gian nào.
tagssaved = Các tag đã được thêm vào
tos = Nếu tiếp tục, bạn đã đồng với <a href="%1$S" target="_blank">Điều khoản dịch vụ</a> và <a href="%2$S" target="_blank">Chính sách bảo mật</a> của Pocket
tryitnow = Thử nó ngay
signinfirefox = Đăng nhập với Firefox
signupfirefox = Đăng ký với Firefox
viewlist = Xem danh sách
# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
# "Pocket" is a brand name.
pocket-button.label = Pocket
pocket-button.tooltiptext = Lưu vào Pocket
saveToPocketCmd.label = Lưu trang vào Pocket
saveToPocketCmd.accesskey = k
saveLinkToPocketCmd.label = Lưu liên kết vào Pocket
saveLinkToPocketCmd.accesskey = o
pocketMenuitem.label = Xem danh sách Pocket

Просмотреть файл

@ -89,6 +89,7 @@ endif
@$(MAKE) -C ../../devtools/shim/locales AB_CD=$* XPI_NAME=locale-$* XPI_ROOT_APPID='$(XPI_ROOT_APPID)'
@$(MAKE) -B searchplugins AB_CD=$* XPI_NAME=locale-$*
@$(MAKE) libs AB_CD=$* XPI_NAME=locale-$* PREF_DIR=$(PREF_DIR)
@$(MAKE) multilocale.json-$* AB_CD=$* XPI_NAME=locale-$*
@$(MAKE) -C $(DEPTH)/$(MOZ_BRANDING_DIRECTORY)/locales AB_CD=$* XPI_NAME=locale-$*
chrome-%: AB_CD=$*

Просмотреть файл

@ -580,6 +580,14 @@ toolbarpaletteitem[place=toolbar] > toolbarspring {
margin: 0 -7px;
}
%ifdef XP_UNIX
%ifndef XP_MACOSX
#customization-palette[whimsypong] > toolbarpaletteitem > toolbarspring {
font-size: 12px;
}
%endif
%endif
#wp-lives,
#wp-ball {
/* Don't need HiDPI versions since the size used will be scaled down to 20x20. */

Просмотреть файл

@ -26,11 +26,8 @@
}
#emptyDownloads {
padding: 16px 25px;
padding: 16px 16px;
margin: 0;
/* The panel can be wider than this description after the blocked subview is
shown, so center the text. */
text-align: center;
}
.downloadsPanelFooter {

Просмотреть файл

@ -32,9 +32,7 @@ is(secMan.isSystemPrincipal(sysPrincipal), true,
"Should have system principal here");
var ioService = SpecialPowers.Cc["@mozilla.org/network/io-service;1"].
getService(SpecialPowers.Ci.nsIIOService);
var inheritingURI = ioService.newURI("javascript:1+1");
var inheritingURI = SpecialPowers.Services.io.newURI("javascript:1+1");
// First try a normal call to checkLoadURIWithPrincipal
try {

Просмотреть файл

@ -205,9 +205,12 @@ COMPILE_CXXFLAGS = $(COMPUTED_CXXFLAGS) $(PGO_CFLAGS) $(_DEPEND_CFLAGS) $(MK_COM
COMPILE_CMFLAGS = $(OS_COMPILE_CMFLAGS) $(MOZBUILD_CMFLAGS)
COMPILE_CMMFLAGS = $(OS_COMPILE_CMMFLAGS) $(MOZBUILD_CMMFLAGS)
ASFLAGS = $(COMPUTED_ASFLAGS)
SFLAGS = $(COMPUTED_SFLAGS)
HOST_CFLAGS = $(COMPUTED_HOST_CFLAGS) $(_DEPEND_CFLAGS)
HOST_CXXFLAGS = $(COMPUTED_HOST_CXXFLAGS) $(_DEPEND_CFLAGS)
HOST_C_LDFLAGS = $(COMPUTED_HOST_C_LDFLAGS)
HOST_CXX_LDFLAGS = $(COMPUTED_HOST_CXX_LDFLAGS)
# We only add color flags if neither the flag to disable color
# (e.g. "-fno-color-diagnostics" nor a flag to control color

Просмотреть файл

@ -185,6 +185,8 @@ HOST_PDBFILE=$(basename $(@F)).pdb
HOST_PDB_FLAG ?= -Fd$(HOST_PDBFILE)
HOST_CFLAGS += $(HOST_PDB_FLAG)
HOST_CXXFLAGS += $(HOST_PDB_FLAG)
HOST_C_LDFLAGS += $(HOST_PDB_FLAG)
HOST_CXX_LDFLAGS += $(HOST_PDB_FLAG)
endif
# Don't build SIMPLE_PROGRAMS during the MOZ_PROFILE_GENERATE pass, and do not
@ -606,9 +608,9 @@ ifdef MSMANIFEST_TOOL
endif # MSVC with manifest tool
else
ifeq ($(HOST_CPP_PROG_LINK),1)
$(EXPAND_LIBS_EXEC) -- $(HOST_CXX) -o $@ $(HOST_CXXFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
$(EXPAND_LIBS_EXEC) -- $(HOST_CXX) -o $@ $(HOST_CXX_LDFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
else
$(EXPAND_LIBS_EXEC) -- $(HOST_CC) -o $@ $(HOST_CFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
$(EXPAND_LIBS_EXEC) -- $(HOST_CC) -o $@ $(HOST_C_LDFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
endif # HOST_CPP_PROG_LINK
endif
ifndef CROSS_COMPILE
@ -651,9 +653,9 @@ ifeq (WINNT_,$(HOST_OS_ARCH)_$(GNU_CC))
$(EXPAND_LIBS_EXEC) -- $(LINK) -NOLOGO -OUT:$@ -PDB:$(HOST_PDBFILE) $< $(WIN32_EXE_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
else
ifneq (,$(HOST_CPPSRCS)$(USE_HOST_CXX))
$(EXPAND_LIBS_EXEC) -- $(HOST_CXX) $(HOST_OUTOPTION)$@ $(HOST_CXXFLAGS) $(INCLUDES) $< $(HOST_LIBS) $(HOST_EXTRA_LIBS)
$(EXPAND_LIBS_EXEC) -- $(HOST_CXX) $(HOST_OUTOPTION)$@ $(HOST_CXX_LDFLAGS) $< $(HOST_LIBS) $(HOST_EXTRA_LIBS)
else
$(EXPAND_LIBS_EXEC) -- $(HOST_CC) $(HOST_OUTOPTION)$@ $(HOST_CFLAGS) $(INCLUDES) $< $(HOST_LIBS) $(HOST_EXTRA_LIBS)
$(EXPAND_LIBS_EXEC) -- $(HOST_CC) $(HOST_OUTOPTION)$@ $(HOST_C_LDFLAGS) $< $(HOST_LIBS) $(HOST_EXTRA_LIBS)
endif
endif
ifndef CROSS_COMPILE
@ -752,20 +754,20 @@ $(OBJS) $(HOST_OBJS) $(PROGOBJS) $(HOST_PROGOBJS): $(GLOBAL_DEPS)
# Rules for building native targets must come first because of the host_ prefix
$(HOST_COBJS):
$(REPORT_BUILD_VERBOSE)
$(ELOG) $(HOST_CC) $(HOST_OUTOPTION)$@ -c $(HOST_CPPFLAGS) $(HOST_CFLAGS) $(INCLUDES) $(NSPR_CFLAGS) $(_VPATH_SRCS)
$(ELOG) $(HOST_CC) $(HOST_OUTOPTION)$@ -c $(HOST_CPPFLAGS) $(HOST_CFLAGS) $(NSPR_CFLAGS) $(_VPATH_SRCS)
$(HOST_CPPOBJS):
$(REPORT_BUILD_VERBOSE)
$(call BUILDSTATUS,OBJECT_FILE $@)
$(ELOG) $(HOST_CXX) $(HOST_OUTOPTION)$@ -c $(HOST_CPPFLAGS) $(HOST_CXXFLAGS) $(INCLUDES) $(NSPR_CFLAGS) $(_VPATH_SRCS)
$(ELOG) $(HOST_CXX) $(HOST_OUTOPTION)$@ -c $(HOST_CPPFLAGS) $(HOST_CXXFLAGS) $(NSPR_CFLAGS) $(_VPATH_SRCS)
$(HOST_CMOBJS):
$(REPORT_BUILD_VERBOSE)
$(ELOG) $(HOST_CC) $(HOST_OUTOPTION)$@ -c $(HOST_CPPFLAGS) $(HOST_CFLAGS) $(HOST_CMFLAGS) $(INCLUDES) $(NSPR_CFLAGS) $(_VPATH_SRCS)
$(ELOG) $(HOST_CC) $(HOST_OUTOPTION)$@ -c $(HOST_CPPFLAGS) $(HOST_CFLAGS) $(HOST_CMFLAGS) $(NSPR_CFLAGS) $(_VPATH_SRCS)
$(HOST_CMMOBJS):
$(REPORT_BUILD_VERBOSE)
$(ELOG) $(HOST_CXX) $(HOST_OUTOPTION)$@ -c $(HOST_CPPFLAGS) $(HOST_CXXFLAGS) $(HOST_CMMFLAGS) $(INCLUDES) $(NSPR_CFLAGS) $(_VPATH_SRCS)
$(ELOG) $(HOST_CXX) $(HOST_OUTOPTION)$@ -c $(HOST_CPPFLAGS) $(HOST_CXXFLAGS) $(HOST_CMMFLAGS) $(NSPR_CFLAGS) $(_VPATH_SRCS)
$(COBJS):
$(REPORT_BUILD_VERBOSE)
@ -1022,7 +1024,7 @@ endif # HOST_RUST_PROGRAMS
$(SOBJS):
$(REPORT_BUILD)
$(AS) -o $@ $(DEFINES) $(ASFLAGS) $($(notdir $<)_FLAGS) $(LOCAL_INCLUDES) -c $<
$(AS) -o $@ $(SFLAGS) $($(notdir $<)_FLAGS) -c $<
$(CPPOBJS):
$(REPORT_BUILD_VERBOSE)

Просмотреть файл

@ -4,10 +4,6 @@
function getSplitConsole(dbg) {
const { toolbox, win } = dbg;
registerCleanupFunction(() => {
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
});
if (!win) {
win = toolbox.win;
}

Просмотреть файл

@ -4,10 +4,6 @@
function getSplitConsole(dbg) {
const { toolbox, win } = dbg;
registerCleanupFunction(() => {
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
});
if (!win) {
win = toolbox.win;
}

Просмотреть файл

@ -62,6 +62,5 @@ function* runTests() {
"Got the expected split console log on $_ executed on resumed debugger"
);
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
yield closeDebuggerAndFinish(panel);
}

Просмотреть файл

@ -1222,10 +1222,6 @@ function source(sourceClient) {
// console if necessary. This cleans up the split console pref so
// it won't pollute other tests.
function getSplitConsole(toolbox, win) {
registerCleanupFunction(() => {
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
});
if (!win) {
win = toolbox.win;
}

Просмотреть файл

@ -77,8 +77,6 @@ function* testUseKeyWithSplitConsoleWrongTool() {
}
function* cleanup() {
// We don't want the open split console to confuse other tests..
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
yield gToolbox.destroy();
gBrowser.removeCurrentTab();
gToolbox = panelWin = null;

Просмотреть файл

@ -118,6 +118,7 @@ registerCleanupFunction(() => {
Services.prefs.clearUserPref("devtools.toolbox.host");
Services.prefs.clearUserPref("devtools.toolbox.previousHost");
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleHeight");
});
registerCleanupFunction(function* cleanup() {

Просмотреть файл

@ -7,10 +7,6 @@ http://creativecommons.org/publicdomain/zero/1.0/ */
const TEST_URL = URL_ROOT + "doc_inspector_menu.html";
registerCleanupFunction(() => {
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
});
// Use the old webconsole since the node isn't being rendered as an HTML tag
// in the new one (Bug 1304794)
Services.prefs.setBoolPref("devtools.webconsole.new-frontend-enabled", false);

Просмотреть файл

@ -12,7 +12,9 @@ const { L10N } = require("../utils/l10n");
const { propertiesEqual } = require("../utils/request-utils");
const { div } = dom;
const SIZE_CACHED = L10N.getStr("networkMenu.sizeCached");
const SIZE_SERVICE_WORKER = L10N.getStr("networkMenu.sizeServiceWorker");
const SIZE_UNAVAILABLE = L10N.getStr("networkMenu.sizeUnavailable");
const UPDATED_TRANSFERRED_PROPS = [
"transferredSize",
"fromCache",
@ -35,13 +37,13 @@ class RequestListColumnTransferredSize extends Component {
let text;
if (fromCache || status === "304") {
text = L10N.getStr("networkMenu.sizeCached");
text = SIZE_CACHED;
} else if (fromServiceWorker) {
text = L10N.getStr("networkMenu.sizeServiceWorker");
text = SIZE_SERVICE_WORKER;
} else if (typeof transferredSize == "number") {
text = getFormattedSize(transferredSize);
} else if (transferredSize === null) {
text = L10N.getStr("networkMenu.sizeUnavailable");
text = SIZE_UNAVAILABLE;
}
return (

Просмотреть файл

@ -107,7 +107,7 @@ class RequestListHeader extends Component {
className: "devtools-toolbar requests-list-headers",
onContextMenu: this.onContextMenu
},
HEADERS.filter((header) => columns.get(header.name)).map((header) => {
HEADERS.filter((header) => columns[header.name]).map((header) => {
let name = header.name;
let boxName = header.boxName || name;
let label = header.noLocalization

Просмотреть файл

@ -7,7 +7,6 @@
const { Component, createFactory } = require("devtools/client/shared/vendor/react");
const dom = require("devtools/client/shared/vendor/react-dom-factories");
const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
const I = require("devtools/client/shared/vendor/immutable");
const { propertiesEqual } = require("../utils/request-utils");
const { RESPONSE_HEADERS } = require("../constants");
@ -100,7 +99,7 @@ class RequestListItem extends Component {
shouldComponentUpdate(nextProps) {
return !propertiesEqual(UPDATED_REQ_ITEM_PROPS, this.props.item, nextProps.item) ||
!propertiesEqual(UPDATED_REQ_PROPS, this.props, nextProps) ||
!I.is(this.props.columns, nextProps.columns);
this.props.columns !== nextProps.columns;
}
componentDidUpdate(prevProps) {
@ -141,32 +140,32 @@ class RequestListItem extends Component {
onContextMenu,
onMouseDown,
},
columns.get("status") && RequestListColumnStatus({ item }),
columns.get("method") && RequestListColumnMethod({ item }),
columns.get("file") && RequestListColumnFile({ item }),
columns.get("protocol") && RequestListColumnProtocol({ item }),
columns.get("scheme") && RequestListColumnScheme({ item }),
columns.get("domain") && RequestListColumnDomain({ item,
onSecurityIconMouseDown }),
columns.get("remoteip") && RequestListColumnRemoteIP({ item }),
columns.get("cause") && RequestListColumnCause({ item, onCauseBadgeMouseDown }),
columns.get("type") && RequestListColumnType({ item }),
columns.get("cookies") && RequestListColumnCookies({ connector, item }),
columns.get("setCookies") && RequestListColumnSetCookies({ connector, item }),
columns.get("transferred") && RequestListColumnTransferredSize({ item }),
columns.get("contentSize") && RequestListColumnContentSize({ item }),
columns.get("startTime") &&
columns.status && RequestListColumnStatus({ item }),
columns.method && RequestListColumnMethod({ item }),
columns.file && RequestListColumnFile({ item }),
columns.protocol && RequestListColumnProtocol({ item }),
columns.scheme && RequestListColumnScheme({ item }),
columns.domain && RequestListColumnDomain({ item,
onSecurityIconMouseDown }),
columns.remoteip && RequestListColumnRemoteIP({ item }),
columns.cause && RequestListColumnCause({ item, onCauseBadgeMouseDown }),
columns.type && RequestListColumnType({ item }),
columns.cookies && RequestListColumnCookies({ connector, item }),
columns.setCookies && RequestListColumnSetCookies({ connector, item }),
columns.transferred && RequestListColumnTransferredSize({ item }),
columns.contentSize && RequestListColumnContentSize({ item }),
columns.startTime &&
RequestListColumnStartTime({ item, firstRequestStartedMillis }),
columns.get("endTime") &&
columns.endTime &&
RequestListColumnEndTime({ item, firstRequestStartedMillis }),
columns.get("responseTime") &&
columns.responseTime &&
RequestListColumnResponseTime({ item, firstRequestStartedMillis }),
columns.get("duration") && RequestListColumnDuration({ item }),
columns.get("latency") && RequestListColumnLatency({ item }),
...RESPONSE_HEADERS.filter(header => columns.get(header)).map(
columns.duration && RequestListColumnDuration({ item }),
columns.latency && RequestListColumnLatency({ item }),
...RESPONSE_HEADERS.filter(header => columns[header]).map(
header => RequestListColumnResponseHeader({ item, header }),
),
columns.get("waterfall") &&
columns.waterfall &&
RequestListColumnWaterfall({ item, firstRequestStartedMillis,
onWaterfallMouseDown }),
)

Просмотреть файл

@ -42,9 +42,13 @@ function prefsMiddleware(store) {
break;
case TOGGLE_COLUMN:
case RESET_COLUMNS:
let visibleColumns = [...store.getState().ui.columns]
.filter(([column, shown]) => shown)
.map(([column, shown]) => column);
let visibleColumns = [];
let columns = store.getState().ui.columns;
for (let column in columns) {
if (columns[column]) {
visibleColumns.push(column);
}
}
Services.prefs.setCharPref(
"devtools.netmonitor.visibleColumns", JSON.stringify(visibleColumns));
break;

Просмотреть файл

@ -4,7 +4,6 @@
"use strict";
const I = require("devtools/client/shared/vendor/immutable");
const Services = require("Services");
const {
CLEAR_REQUESTS,
@ -44,65 +43,92 @@ const cols = {
latency: false,
waterfall: true,
};
const Columns = I.Record(
Object.assign(
function Columns() {
return Object.assign(
cols,
RESPONSE_HEADERS.reduce((acc, header) => Object.assign(acc, { [header]: false }), {})
)
);
);
}
const UI = I.Record({
columns: new Columns(),
detailsPanelSelectedTab: PANELS.HEADERS,
networkDetailsOpen: false,
persistentLogsEnabled: Services.prefs.getBoolPref("devtools.netmonitor.persistlog"),
browserCacheDisabled: Services.prefs.getBoolPref("devtools.cache.disabled"),
statisticsOpen: false,
waterfallWidth: null,
});
function UI(initialState = {}) {
return {
columns: Columns(),
detailsPanelSelectedTab: PANELS.HEADERS,
networkDetailsOpen: false,
persistentLogsEnabled: Services.prefs.getBoolPref("devtools.netmonitor.persistlog"),
browserCacheDisabled: Services.prefs.getBoolPref("devtools.cache.disabled"),
statisticsOpen: false,
waterfallWidth: null,
...initialState,
};
}
function resetColumns(state) {
return state.set("columns", new Columns());
return {
...state,
columns: Columns()
};
}
function resizeWaterfall(state, action) {
return state.set("waterfallWidth", action.width);
return {
...state,
waterfallWidth: action.width
};
}
function openNetworkDetails(state, action) {
return state.set("networkDetailsOpen", action.open);
return {
...state,
networkDetailsOpen: action.open
};
}
function enablePersistentLogs(state, action) {
return state.set("persistentLogsEnabled", action.enabled);
return {
...state,
persistentLogsEnabled: action.enabled
};
}
function disableBrowserCache(state, action) {
return state.set("browserCacheDisabled", action.disabled);
return {
...state,
browserCacheDisabled: action.disabled
};
}
function openStatistics(state, action) {
return state.set("statisticsOpen", action.open);
return {
...state,
statisticsOpen: action.open
};
}
function setDetailsPanelTab(state, action) {
return state.set("detailsPanelSelectedTab", action.id);
return {
...state,
detailsPanelSelectedTab: action.id
};
}
function toggleColumn(state, action) {
let { column } = action;
if (!state.has(column)) {
if (!state.columns.hasOwnProperty(column)) {
return state;
}
let newState = state.withMutations(columns => {
columns.set(column, !state.get(column));
});
return newState;
return {
...state,
columns: {
...state.columns,
[column]: !state.columns[column]
}
};
}
function ui(state = new UI(), action) {
function ui(state = UI(), action) {
switch (action.type) {
case CLEAR_REQUESTS:
return openNetworkDetails(state, { open: false });
@ -124,7 +150,7 @@ function ui(state = new UI(), action) {
case SELECT_REQUEST:
return openNetworkDetails(state, { open: true });
case TOGGLE_COLUMN:
return state.set("columns", toggleColumn(state.columns, action));
return toggleColumn(state, action);
case WATERFALL_RESIZE:
return resizeWaterfall(state, action);
default:

Просмотреть файл

@ -11,6 +11,7 @@ const { saveAs } = require("devtools/client/shared/file-saver");
const { copyString } = require("devtools/shared/platform/clipboard");
const { showMenu } = require("devtools/client/netmonitor/src/utils/menu");
const { HarExporter } = require("./har/har-exporter");
const { openRequestInTab } = require("devtools/client/netmonitor/src/utils/firefox/open-request-in-tab");
const {
getSelectedRequest,
getSortedRequests,
@ -182,7 +183,7 @@ class RequestListContextMenu {
label: L10N.getStr("netmonitor.context.newTab"),
accesskey: L10N.getStr("netmonitor.context.newTab.accesskey"),
visible: !!selectedRequest,
click: () => this.openRequestInTab(url),
click: () => this.openRequestInTab(selectedRequest),
});
menu.push({
@ -217,9 +218,8 @@ class RequestListContextMenu {
/**
* Opens selected item in a new tab.
*/
openRequestInTab(url) {
let win = Services.wm.getMostRecentWindow(gDevTools.chromeWindowType);
win.openUILinkIn(url, "tab", { relatedToCurrent: true });
openRequestInTab(selectedRequest) {
openRequestInTab(selectedRequest);
}
/**

Просмотреть файл

@ -33,7 +33,13 @@ class RequestListHeaderContextMenu {
}
get visibleColumns() {
return [...this.columns].filter(([_, shown]) => shown);
let visible = [];
for (let column in this.columns) {
if (this.columns[column]) {
visible.push(column);
}
}
return visible;
}
/**
@ -44,7 +50,8 @@ class RequestListHeaderContextMenu {
let subMenu = { timings: [], responseHeaders: [] };
let onlyOneColumn = this.visibleColumns.length === 1;
for (let [column, shown] of this.columns) {
for (let column in this.columns) {
let shown = this.columns[column];
let label = nonLocalizedHeaders.includes(column)
? stringMap[column] || column
: L10N.getStr(`netmonitor.toolbar.${stringMap[column] || column}`);

Просмотреть файл

@ -33,7 +33,7 @@ function configureStore(connector) {
requests: new Requests(),
sort: new Sort(),
timingMarkers: new TimingMarkers(),
ui: new UI({
ui: UI({
columns: getColumnState()
}),
};
@ -55,16 +55,15 @@ function configureStore(connector) {
* Get column state from preferences.
*/
function getColumnState() {
let columns = new Columns();
let columns = Columns();
let visibleColumns = getPref("devtools.netmonitor.visibleColumns");
for (let [col] of columns) {
columns = columns.withMutations((state) => {
state.set(col, visibleColumns.includes(col));
});
const state = {};
for (let col in columns) {
state[col] = visibleColumns.includes(col);
}
return columns;
return state;
}
/**

Просмотреть файл

@ -1,11 +1,8 @@
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# 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/.
SharedLibrary('logalloc_minimal')
include('../logalloc.mozbuild')
DEFINES['LOGALLOC_MINIMAL'] = True
DevToolsModules(
'open-request-in-tab.js',
)

Просмотреть файл

@ -0,0 +1,40 @@
/* 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/. */
/* eslint-disable mozilla/reject-some-requires */
"use strict";
let { Cc, Ci } = require("chrome");
const Services = require("Services");
const { gDevTools } = require("devtools/client/framework/devtools");
/**
* Opens given request in a new tab.
*/
function openRequestInTab(request) {
let win = Services.wm.getMostRecentWindow(gDevTools.chromeWindowType);
let rawData = request.requestPostData ? request.requestPostData.postData : null;
let postData;
if (rawData && rawData.text) {
let stringStream = getInputStreamFromString(rawData.text);
postData = Cc["@mozilla.org/network/mime-input-stream;1"]
.createInstance(Ci.nsIMIMEInputStream);
postData.addHeader("Content-Type", "application/x-www-form-urlencoded");
postData.setData(stringStream);
}
win.gBrowser.selectedTab = win.gBrowser.addTab(request.url, null, null, postData);
}
function getInputStreamFromString(data) {
let stringStream = Cc["@mozilla.org/io/string-input-stream;1"]
.createInstance(Ci.nsIStringInputStream);
stringStream.data = data;
return stringStream;
}
module.exports = {
openRequestInTab,
};

Просмотреть файл

@ -3,6 +3,10 @@
# 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/.
DIRS += [
'firefox',
]
DevToolsModules(
'create-store.js',
'filter-autocomplete-provider.js',
@ -12,6 +16,7 @@ DevToolsModules(
'l10n.js',
'mdn-utils.js',
'menu.js',
'open-request-in-tab.js',
'prefs.js',
'request-utils.js',
'sort-predicates.js',

Просмотреть файл

@ -0,0 +1,51 @@
/* 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/. */
"use strict";
const Services = require("Services");
const { gDevTools } = require("devtools/client/framework/devtools");
/**
* Opens given request in a new tab.
*/
function openRequestInTab(request) {
let win = Services.wm.getMostRecentWindow(gDevTools.chromeWindowType);
if (request.method.toLowerCase() !== "get") {
win.openUILinkIn(this.selectedRequest.url, "tab", {
relatedToCurrent: true
});
} else {
openRequestInTabHelper({
url: request.url,
method: request.method,
data: request.requestPostData ? request.requestPostData.postData : null,
});
}
}
function openRequestInTabHelper({url, method, data}) {
let form = document.createElement("form");
form.target = "_blank";
form.action = url;
form.method = method;
if (data) {
for (let key in data) {
let input = document.createElement("input");
input.name = key;
input.value = data[key];
form.appendChild(input);
}
}
form.hidden = true;
document.body.appendChild(form);
form.submit();
form.remove();
}
module.exports = {
openRequestInTab,
};

Просмотреть файл

@ -13,9 +13,17 @@ add_task(function* () {
let { document, store, parent } = monitor.panelWin;
for (let [column, shown] of store.getState().ui.columns) {
let visibleColumns = [...store.getState().ui.columns]
.filter(([_, visible]) => visible);
let initialColumns = store.getState().ui.columns;
for (let column in initialColumns) {
let shown = initialColumns[column];
let columns = store.getState().ui.columns;
let visibleColumns = [];
for (let c in columns) {
if (columns[c]) {
visibleColumns.push(c);
}
}
if (visibleColumns.length === 1) {
if (!shown) {

Просмотреть файл

@ -24,15 +24,23 @@ add_task(function* () {
yield hideColumn("status");
yield hideColumn("contentSize");
ok(!Services.prefs.getCharPref("devtools.netmonitor.visibleColumns").includes("status"),
"Pref should be synced for status");
ok(!Services.prefs.getCharPref("devtools.netmonitor.visibleColumns")
.includes("contentSize"), "Pref should be synced for contentSize");
let visibleColumns = JSON.parse(
Services.prefs.getCharPref("devtools.netmonitor.visibleColumns")
);
ok(!visibleColumns.includes("status"),
"Pref should be synced for status");
ok(!visibleColumns.includes("contentSize"),
"Pref should be synced for contentSize");
yield showColumn("status");
ok(Services.prefs.getCharPref("devtools.netmonitor.visibleColumns").includes("status"),
"Pref should be synced for status");
visibleColumns = JSON.parse(
Services.prefs.getCharPref("devtools.netmonitor.visibleColumns")
);
ok(visibleColumns.includes("status"),
"Pref should be synced for status");
function* hideColumn(column) {
info(`Clicking context-menu item for ${column}`);

Просмотреть файл

@ -24,7 +24,7 @@ add_task(function* () {
parent.document.querySelector("#request-list-header-reset-columns").click();
is(JSON.stringify(prefBefore), JSON.stringify(Prefs.visibleColumns),
ok(JSON.stringify(prefBefore) === JSON.stringify(Prefs.visibleColumns),
"Reset columns item should reset columns pref");
function* hideColumn(column) {

Просмотреть файл

@ -13,8 +13,9 @@ add_task(function* () {
let { document, store, parent } = monitor.panelWin;
for (let [column, shown] of store.getState().ui.columns) {
if (shown) {
let columns = store.getState().ui.columns;
for (let column in columns) {
if (columns[column]) {
yield testVisibleColumnContextMenuItem(column, document, parent);
yield testHiddenColumnContextMenuItem(column, document, parent);
} else {
@ -23,8 +24,9 @@ add_task(function* () {
}
}
for (let [column, shown] of store.getState().ui.columns) {
if (shown) {
columns = store.getState().ui.columns;
for (let column in columns) {
if (columns[column]) {
yield testVisibleColumnContextMenuItem(column, document, parent);
// Right click on the white-space for the context menu to appear
// and toggle column visibility

Просмотреть файл

@ -86,6 +86,7 @@ let webpackConfig = {
"devtools/shared/old-event-emitter": "devtools-modules/src/utils/event-emitter",
"devtools/shared/fronts/timeline": path.join(__dirname, "../../client/shared/webpack/shims/fronts-timeline-shim"),
"devtools/shared/platform/clipboard": path.join(__dirname, "../../client/shared/webpack/shims/platform-clipboard-stub"),
"devtools/client/netmonitor/src/utils/firefox/open-request-in-tab": path.join(__dirname, "src/utils/open-request-in-tab"),
// Locales need to be explicitly mapped to the en-US subfolder
"devtools/client/locales": path.join(__dirname, "../../client/locales/en-US"),

Просмотреть файл

@ -18,10 +18,6 @@ const TEST_URI = "data:text/html;charset=utf-8,<html><style>" +
"};" +
"</style><div></div></html>";
registerCleanupFunction(() => {
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
});
addRDMTask(TEST_URI, function* ({ ui, manager }) {
info("Open the responsive design mode and set its size to 500x500 to start");
yield setViewportSize(ui, manager, 500, 500);

Просмотреть файл

@ -13,7 +13,6 @@ Services.scriptloader.loadSubScript(
this);
const {TableWidget} = require("devtools/client/shared/widgets/TableWidget");
const SPLIT_CONSOLE_PREF = "devtools.toolbox.splitconsoleEnabled";
const STORAGE_PREF = "devtools.storage.enabled";
const DOM_CACHE = "dom.caches.enabled";
const DUMPEMIT_PREF = "devtools.dump.emit";
@ -44,7 +43,6 @@ registerCleanupFunction(() => {
Services.prefs.clearUserPref(DEBUGGERLOG_PREF);
Services.prefs.clearUserPref(DOM_CACHE);
Services.prefs.clearUserPref(DUMPEMIT_PREF);
Services.prefs.clearUserPref(SPLIT_CONSOLE_PREF);
Services.prefs.clearUserPref(STORAGE_PREF);
});

Просмотреть файл

@ -391,7 +391,6 @@ skip-if = true # Bug 1404359
[browser_webconsole_sourcemap_invalid.js]
[browser_webconsole_sourcemap_nosource.js]
[browser_webconsole_split.js]
skip-if = true # Bug 1408949
[browser_webconsole_split_escape_key.js]
skip-if = true # Bug 1405647
[browser_webconsole_split_focus.js]

Просмотреть файл

@ -6,71 +6,68 @@
"use strict";
const TEST_URI = "data:text/html;charset=utf-8,Web Console test for splitting";
const {Toolbox} = require("devtools/client/framework/toolbox");
function test() {
waitForExplicitFinish();
// Test is slow on Linux EC2 instances - Bug 962931
requestLongerTimeout(2);
// Test is slow on Linux EC2 instances - Bug 962931
requestLongerTimeout(2);
let {Toolbox} = require("devtools/client/framework/toolbox");
add_task(async function () {
let toolbox;
loadTab(TEST_URI).then(testConsoleLoadOnDifferentPanel);
await addTab(TEST_URI);
await testConsoleLoadOnDifferentPanel();
await testKeyboardShortcuts();
await checkAllTools();
function testConsoleLoadOnDifferentPanel() {
info("Testing host types");
checkHostType(Toolbox.HostType.BOTTOM);
checkToolboxUI();
await toolbox.switchHost(Toolbox.HostType.SIDE);
checkHostType(Toolbox.HostType.SIDE);
checkToolboxUI();
await toolbox.switchHost(Toolbox.HostType.WINDOW);
checkHostType(Toolbox.HostType.WINDOW);
checkToolboxUI();
await toolbox.switchHost(Toolbox.HostType.BOTTOM);
async function testConsoleLoadOnDifferentPanel() {
info("About to check console loads even when non-webconsole panel is open");
openPanel("inspector").then(() => {
toolbox.on("webconsole-ready", () => {
ok(true, "Webconsole has been triggered as loaded while another tool " +
"is active");
testKeyboardShortcuts();
});
// Opens split console.
toolbox.toggleSplitConsole();
});
await openPanel("inspector");
let webconsoleReady = toolbox.once("webconsole-ready");
toolbox.toggleSplitConsole();
await webconsoleReady;
ok(true, "Webconsole has been triggered as loaded while another tool is active");
}
function testKeyboardShortcuts() {
async function testKeyboardShortcuts() {
info("About to check that panel responds to ESCAPE keyboard shortcut");
toolbox.once("split-console", () => {
ok(true, "Split console has been triggered via ESCAPE keypress");
checkAllTools();
});
// Closes split console.
let splitConsoleReady = toolbox.once("split-console");
EventUtils.sendKey("ESCAPE", toolbox.win);
await splitConsoleReady;
ok(true, "Split console has been triggered via ESCAPE keypress");
}
function checkAllTools() {
async function checkAllTools() {
info("About to check split console with each panel individually.");
await openAndCheckPanel("jsdebugger");
await openAndCheckPanel("inspector");
await openAndCheckPanel("styleeditor");
await openAndCheckPanel("performance");
await openAndCheckPanel("netmonitor");
Task.spawn(function* () {
yield openAndCheckPanel("jsdebugger");
yield openAndCheckPanel("inspector");
yield openAndCheckPanel("styleeditor");
yield openAndCheckPanel("performance");
yield openAndCheckPanel("netmonitor");
yield checkWebconsolePanelOpened();
testBottomHost();
});
await checkWebconsolePanelOpened();
}
function getCurrentUIState() {
let win = toolbox.win;
let deck = toolbox.doc.querySelector("#toolbox-deck");
let webconsolePanel = toolbox.webconsolePanel;
let splitter = toolbox.doc.querySelector("#toolbox-console-splitter");
let containerHeight = parseFloat(win.getComputedStyle(deck.parentNode)
.getPropertyValue("height"));
let deckHeight = parseFloat(win.getComputedStyle(deck)
.getPropertyValue("height"));
let webconsoleHeight = parseFloat(win.getComputedStyle(webconsolePanel)
.getPropertyValue("height"));
let containerHeight = deck.parentNode.getBoundingClientRect().height;
let deckHeight = deck.getBoundingClientRect().height;
let webconsoleHeight = webconsolePanel.getBoundingClientRect().height;
let splitterVisibility = !splitter.getAttribute("hidden");
let openedConsolePanel = toolbox.currentToolId === "webconsole";
let cmdButton = toolbox.doc.querySelector("#command-button-splitconsole");
@ -85,11 +82,11 @@ function test() {
};
}
const checkWebconsolePanelOpened = Task.async(function* () {
async function checkWebconsolePanelOpened() {
info("About to check special cases when webconsole panel is open.");
// Start with console split, so we can test for transition to main panel.
yield toolbox.toggleSplitConsole();
await toolbox.toggleSplitConsole();
let currentUIState = getCurrentUIState();
@ -103,7 +100,7 @@ function test() {
"The console panel is not the current tool");
ok(currentUIState.buttonSelected, "The command button is selected");
yield openPanel("webconsole");
await openPanel("webconsole");
currentUIState = getCurrentUIState();
ok(!currentUIState.splitterVisibility,
@ -118,7 +115,7 @@ function test() {
"The command button is still selected.");
// Make sure splitting console does nothing while webconsole is opened
yield toolbox.toggleSplitConsole();
await toolbox.toggleSplitConsole();
currentUIState = getCurrentUIState();
@ -134,7 +131,7 @@ function test() {
"The command button is still selected.");
// Make sure that split state is saved after opening another panel
yield openPanel("inspector");
await openPanel("inspector");
currentUIState = getCurrentUIState();
ok(currentUIState.splitterVisibility,
"Splitter is visible when console is split");
@ -147,10 +144,10 @@ function test() {
ok(currentUIState.buttonSelected,
"The command button is still selected.");
yield toolbox.toggleSplitConsole();
});
await toolbox.toggleSplitConsole();
}
const checkToolboxUI = Task.async(function* () {
async function checkToolboxUI() {
let currentUIState = getCurrentUIState();
ok(!currentUIState.splitterVisibility, "Splitter is hidden by default");
@ -162,7 +159,7 @@ function test() {
"The console panel is not the current tool");
ok(!currentUIState.buttonSelected, "The command button is not selected.");
yield toolbox.toggleSplitConsole();
await toolbox.toggleSplitConsole();
currentUIState = getCurrentUIState();
@ -179,7 +176,7 @@ function test() {
"The console panel is not the current tool");
ok(currentUIState.buttonSelected, "The command button is selected.");
yield toolbox.toggleSplitConsole();
await toolbox.toggleSplitConsole();
currentUIState = getCurrentUIState();
@ -191,47 +188,16 @@ function test() {
ok(!currentUIState.openedConsolePanel,
"The console panel is not the current tool");
ok(!currentUIState.buttonSelected, "The command button is not selected.");
});
}
function openPanel(toolId) {
let deferred = defer();
async function openPanel(toolId) {
let target = TargetFactory.forTab(gBrowser.selectedTab);
gDevTools.showToolbox(target, toolId).then(function (box) {
toolbox = box;
deferred.resolve();
}).catch(console.error);
return deferred.promise;
toolbox = await gDevTools.showToolbox(target, toolId);
}
function openAndCheckPanel(toolId) {
return openPanel(toolId).then(() => {
info("Checking toolbox for " + toolId);
return checkToolboxUI(toolbox.getCurrentPanel());
});
}
function testBottomHost() {
checkHostType(Toolbox.HostType.BOTTOM);
checkToolboxUI();
toolbox.switchHost(Toolbox.HostType.SIDE).then(testSidebarHost);
}
function testSidebarHost() {
checkHostType(Toolbox.HostType.SIDE);
checkToolboxUI();
toolbox.switchHost(Toolbox.HostType.WINDOW).then(testWindowHost);
}
function testWindowHost() {
checkHostType(Toolbox.HostType.WINDOW);
checkToolboxUI();
toolbox.switchHost(Toolbox.HostType.BOTTOM).then(testDestroy);
async function openAndCheckPanel(toolId) {
await openPanel(toolId);
await checkToolboxUI(toolbox.getCurrentPanel());
}
function checkHostType(hostType) {
@ -240,16 +206,4 @@ function test() {
let pref = Services.prefs.getCharPref("devtools.toolbox.host");
is(pref, hostType, "host pref is " + hostType);
}
function testDestroy() {
toolbox.destroy().then(function () {
let target = TargetFactory.forTab(gBrowser.selectedTab);
gDevTools.showToolbox(target).then(finish);
});
}
function finish() {
toolbox = null;
finishTest();
}
}
});

Просмотреть файл

@ -59,8 +59,6 @@
function finish() {
toolbox = TEST_URI = null;
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleHeight");
finishTest();
}
}

Просмотреть файл

@ -112,8 +112,6 @@
function finish() {
toolbox = TEST_URI = null;
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleHeight");
finishTest();
}
}

Просмотреть файл

@ -59,8 +59,6 @@
function finish() {
toolbox = TEST_URI = null;
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleHeight");
finishTest();
}
}

Просмотреть файл

@ -112,8 +112,6 @@
function finish() {
toolbox = TEST_URI = null;
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleEnabled");
Services.prefs.clearUserPref("devtools.toolbox.splitconsoleHeight");
finishTest();
}
}

Просмотреть файл

@ -11,6 +11,7 @@
#include "mozilla/RangedArray.h"
#include "mozilla/ServoBindings.h"
#include "mozilla/ServoBindingTypes.h"
#include "mozilla/ServoCSSParser.h"
#include "mozilla/StyleAnimationValue.h"
#include "mozilla/TimingParams.h"
#include "mozilla/dom/BaseKeyframeTypesBinding.h" // For FastBaseKeyframe etc.
@ -560,26 +561,6 @@ KeyframeUtils::IsAnimatableProperty(nsCSSPropertyID aProperty,
return false;
}
/* static */ already_AddRefed<RawServoDeclarationBlock>
KeyframeUtils::ParseProperty(nsCSSPropertyID aProperty,
const nsAString& aValue,
nsIDocument* aDocument)
{
MOZ_ASSERT(aDocument);
NS_ConvertUTF16toUTF8 value(aValue);
// FIXME this is using the wrong base uri (bug 1343919)
RefPtr<URLExtraData> data = new URLExtraData(aDocument->GetDocumentURI(),
aDocument->GetDocumentURI(),
aDocument->NodePrincipal());
return Servo_ParseProperty(aProperty,
&value,
data,
ParsingMode::Default,
aDocument->GetCompatibilityMode(),
aDocument->CSSLoader()).Consume();
}
// ------------------------------------------------------------------
//
// Internal helpers
@ -903,8 +884,10 @@ MakePropertyValuePair(nsCSSPropertyID aProperty, const nsAString& aStringValue,
Maybe<PropertyValuePair> result;
if (aDocument->GetStyleBackendType() == StyleBackendType::Servo) {
ServoCSSParser::ParsingEnvironment env =
ServoCSSParser::GetParsingEnvironment(aDocument);
RefPtr<RawServoDeclarationBlock> servoDeclarationBlock =
KeyframeUtils::ParseProperty(aProperty, aStringValue, aDocument);
ServoCSSParser::ParseProperty(aProperty, aStringValue, env);
if (servoDeclarationBlock) {
result.emplace(aProperty, Move(servoDeclarationBlock));

Просмотреть файл

@ -107,22 +107,6 @@ public:
*/
static bool IsAnimatableProperty(nsCSSPropertyID aProperty,
StyleBackendType aBackend);
/**
* Parse a string representing a CSS property value into a
* RawServoDeclarationBlock.
*
* @param aProperty The property to be parsed.
* @param aValue The specified value.
* @param aDocument The current document.
* @return The parsed value as a RawServoDeclarationBlock. We put the value
* in a declaration block since that is how we represent specified values
* in Servo.
*/
static already_AddRefed<RawServoDeclarationBlock> ParseProperty(
nsCSSPropertyID aProperty,
const nsAString& aValue,
nsIDocument* aDocument);
};
} // namespace mozilla

Просмотреть файл

@ -10,7 +10,7 @@
#include "mozilla/dom/AnimatableBinding.h"
#include "mozilla/dom/KeyframeAnimationOptionsBinding.h"
#include "mozilla/dom/KeyframeEffectBinding.h"
#include "mozilla/ServoBindings.h"
#include "mozilla/ServoCSSParser.h"
#include "nsCSSParser.h" // For nsCSSParser
#include "nsIDocument.h"
#include "nsRuleNode.h"
@ -119,11 +119,8 @@ TimingParams::ParseEasing(const nsAString& aEasing,
if (aDocument->IsStyledByServo()) {
nsTimingFunction timingFunction;
// FIXME this is using the wrong base uri (bug 1343919)
RefPtr<URLExtraData> data = new URLExtraData(aDocument->GetDocumentURI(),
aDocument->GetDocumentURI(),
aDocument->NodePrincipal());
if (!Servo_ParseEasing(&aEasing, data, &timingFunction)) {
RefPtr<URLExtraData> url = ServoCSSParser::GetURLExtraData(aDocument);
if (!ServoCSSParser::ParseEasing(aEasing, url, timingFunction)) {
aRv.ThrowTypeError<dom::MSG_INVALID_EASING_ERROR>(aEasing);
return Nothing();
}

Просмотреть файл

@ -12,7 +12,7 @@
#include "mozilla/dom/DOMPointBinding.h"
#include "mozilla/dom/BindingDeclarations.h"
#include "mozilla/dom/ToJSValue.h"
#include "mozilla/ServoBindings.h"
#include "mozilla/ServoCSSParser.h"
#include "nsCSSParser.h"
#include "nsStyleTransformMatrix.h"
@ -676,10 +676,9 @@ DOMMatrix::SetMatrixValue(const nsAString& aTransformList, ErrorResult& aRv)
gfx::Matrix4x4 transform;
bool contains3dTransform = false;
if (mIsServo) {
bool status = Servo_ParseTransformIntoMatrix(&aTransformList,
&contains3dTransform,
&transform.components);
if (!status) {
if (!ServoCSSParser::ParseTransformIntoMatrix(aTransformList,
contains3dTransform,
transform.components)) {
aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
return nullptr;
}

Просмотреть файл

@ -2984,31 +2984,6 @@ Element::GetEventListenerManagerForAttr(nsAtom* aAttrName,
return GetOrCreateListenerManager();
}
BorrowedAttrInfo
Element::GetAttrInfo(int32_t aNamespaceID, nsAtom* aName) const
{
NS_ASSERTION(nullptr != aName, "must have attribute name");
NS_ASSERTION(aNamespaceID != kNameSpaceID_Unknown,
"must have a real namespace ID!");
int32_t index = mAttrsAndChildren.IndexOfAttr(aName, aNamespaceID);
if (index < 0) {
return BorrowedAttrInfo(nullptr, nullptr);
}
return mAttrsAndChildren.AttrInfoAt(index);
}
BorrowedAttrInfo
Element::GetAttrInfoAt(uint32_t aIndex) const
{
if (aIndex >= mAttrsAndChildren.AttrCount()) {
return BorrowedAttrInfo(nullptr, nullptr);
}
return mAttrsAndChildren.AttrInfoAt(aIndex);
}
bool
Element::GetAttr(int32_t aNameSpaceID, nsAtom* aName,
nsAString& aResult) const
@ -3166,18 +3141,6 @@ Element::UnsetAttr(int32_t aNameSpaceID, nsAtom* aName,
return NS_OK;
}
const nsAttrName*
Element::GetAttrNameAt(uint32_t aIndex) const
{
return mAttrsAndChildren.GetSafeAttrNameAt(aIndex);
}
uint32_t
Element::GetAttrCount() const
{
return mAttrsAndChildren.AttrCount();
}
void
Element::DescribeAttribute(uint32_t index, nsAString& aOutDescription) const
{

Просмотреть файл

@ -783,9 +783,26 @@ public:
nsCaseTreatment aCaseSensitive) const override;
virtual nsresult UnsetAttr(int32_t aNameSpaceID, nsAtom* aAttribute,
bool aNotify) override;
virtual const nsAttrName* GetAttrNameAt(uint32_t aIndex) const override;
virtual BorrowedAttrInfo GetAttrInfoAt(uint32_t aIndex) const override;
virtual uint32_t GetAttrCount() const override;
virtual const nsAttrName* GetAttrNameAt(uint32_t aIndex) const final override
{
return mAttrsAndChildren.GetSafeAttrNameAt(aIndex);
}
virtual BorrowedAttrInfo GetAttrInfoAt(uint32_t aIndex) const final override
{
if (aIndex >= mAttrsAndChildren.AttrCount()) {
return BorrowedAttrInfo(nullptr, nullptr);
}
return mAttrsAndChildren.AttrInfoAt(aIndex);
}
virtual uint32_t GetAttrCount() const final override
{
return mAttrsAndChildren.AttrCount();
}
virtual bool IsNodeOfType(uint32_t aFlags) const override;
/**
@ -1326,7 +1343,19 @@ public:
* is, this should only be called from methods that only care about attrs
* that effectively live in mAttrsAndChildren.
*/
virtual BorrowedAttrInfo GetAttrInfo(int32_t aNamespaceID, nsAtom* aName) const;
BorrowedAttrInfo GetAttrInfo(int32_t aNamespaceID, nsAtom* aName) const
{
NS_ASSERTION(aName, "must have attribute name");
NS_ASSERTION(aNamespaceID != kNameSpaceID_Unknown,
"must have a real namespace ID!");
int32_t index = mAttrsAndChildren.IndexOfAttr(aName, aNamespaceID);
if (index < 0) {
return BorrowedAttrInfo(nullptr, nullptr);
}
return mAttrsAndChildren.AttrInfoAt(index);
}
/**
* Called when we have been adopted, and the information of the

Просмотреть файл

@ -9873,7 +9873,7 @@ nsDocument::ForgetImagePreload(nsIURI* aURI)
}
void
nsDocument::UpdatePossiblyStaleDocumentState()
nsIDocument::UpdatePossiblyStaleDocumentState()
{
if (!mGotDocumentState.HasState(NS_DOCUMENT_STATE_RTL_LOCALE)) {
if (IsDocumentRightToLeft()) {
@ -9891,19 +9891,6 @@ nsDocument::UpdatePossiblyStaleDocumentState()
}
}
EventStates
nsDocument::ThreadSafeGetDocumentState() const
{
return mDocumentState;
}
EventStates
nsDocument::GetDocumentState()
{
UpdatePossiblyStaleDocumentState();
return ThreadSafeGetDocumentState();
}
namespace {
/**

Просмотреть файл

@ -843,13 +843,6 @@ public:
virtual nsISupports* GetCurrentContentSink() override;
virtual mozilla::EventStates GetDocumentState() final;
// GetDocumentState() mutates the state due to lazy resolution;
// and can't be used during parallel traversal. Use this instead,
// and ensure GetDocumentState() has been called first.
// This will assert if the state is stale.
virtual mozilla::EventStates ThreadSafeGetDocumentState() const final;
// Only BlockOnload should call this!
void AsyncBlockOnload();
@ -1182,8 +1175,6 @@ protected:
// Do not use this value directly. Call the |IsThirdParty()| method, which
// caches its result here.
mozilla::Maybe<bool> mIsThirdParty;
private:
void UpdatePossiblyStaleDocumentState();
public:
RefPtr<mozilla::EventListenerManager> mListenerManager;
@ -1270,9 +1261,6 @@ public:
nsCOMPtr<nsIContent> mFirstBaseNodeWithHref;
mozilla::EventStates mDocumentState;
mozilla::EventStates mGotDocumentState;
RefPtr<nsDOMNavigationTiming> mTiming;
private:
friend class nsUnblockOnloadEvent;

Просмотреть файл

@ -2641,8 +2641,20 @@ public:
* Document state bits have the form NS_DOCUMENT_STATE_* and are declared in
* nsIDocument.h.
*/
virtual mozilla::EventStates GetDocumentState() = 0;
virtual mozilla::EventStates ThreadSafeGetDocumentState() const = 0;
mozilla::EventStates GetDocumentState()
{
UpdatePossiblyStaleDocumentState();
return ThreadSafeGetDocumentState();
}
// GetDocumentState() mutates the state due to lazy resolution;
// and can't be used during parallel traversal. Use this instead,
// and ensure GetDocumentState() has been called first.
// This will assert if the state is stale.
mozilla::EventStates ThreadSafeGetDocumentState() const
{
return mDocumentState;
}
virtual nsISupports* GetCurrentContentSink() = 0;
@ -3263,6 +3275,8 @@ protected:
}
private:
void UpdatePossiblyStaleDocumentState();
mutable std::bitset<eDeprecatedOperationCount> mDeprecationWarnedAbout;
mutable std::bitset<eDocumentWarningCount> mDocWarningWarnedAbout;
@ -3422,6 +3436,9 @@ protected:
// focus has never occurred then mLastFocusTime.IsNull() will be true.
mozilla::TimeStamp mLastFocusTime;
mozilla::EventStates mDocumentState;
mozilla::EventStates mGotDocumentState;
// True if BIDI is enabled.
bool mBidiEnabled : 1;
// True if a MathML element has ever been owned by this document.

Просмотреть файл

@ -43,15 +43,12 @@ public:
// Returns the atom for the namespace URI associated with the given ID. The
// ID must be within range and not be kNameSpaceID_None (i.e. zero);
//
// NB: The requirement of mapping from the first entry to the empty atom is
// necessary for Servo, though it can be removed if needed adding a branch in
// GeckoElement::get_namespace().
nsAtom* NameSpaceURIAtom(int32_t aNameSpaceID) {
MOZ_ASSERT(aNameSpaceID > 0);
return NameSpaceURIAtomForServo(aNameSpaceID);
}
// NB: This function should only be called by Servo code (and the above
// accessor), which uses the empty atom to represent kNameSpaceID_None.
nsAtom* NameSpaceURIAtomForServo(int32_t aNameSpaceID) {
MOZ_ASSERT(aNameSpaceID >= 0);
MOZ_ASSERT((int64_t) aNameSpaceID < (int64_t) mURIArray.Length());
return mURIArray.ElementAt(aNameSpaceID);
}

Просмотреть файл

@ -1163,13 +1163,34 @@ bool
CanvasRenderingContext2D::ParseColor(const nsAString& aString,
nscolor* aColor)
{
nsIDocument* document = mCanvasElement
? mCanvasElement->OwnerDoc()
: nullptr;
nsIDocument* document = mCanvasElement ? mCanvasElement->OwnerDoc() : nullptr;
css::Loader* loader = document ? document->CSSLoader() : nullptr;
// FIXME(bug 1420026).
if (false) {
nsCOMPtr<nsIPresShell> presShell = GetPresShell();
ServoStyleSet* set = presShell ? presShell->StyleSet()->AsServo() : nullptr;
// First, try computing the color without handling currentcolor.
bool wasCurrentColor = false;
if (!ServoCSSParser::ComputeColor(set, NS_RGB(0, 0, 0), aString, aColor,
&wasCurrentColor, loader)) {
return false;
}
if (wasCurrentColor) {
// Otherwise, get the value of the color property, flushing style
// if necessary.
RefPtr<nsStyleContext> canvasStyle =
nsComputedDOMStyle::GetStyleContext(mCanvasElement, nullptr, presShell);
*aColor = canvasStyle->StyleColor()->mColor;
}
return true;
}
// Pass the CSS Loader object to the parser, to allow parser error
// reports to include the outer window ID.
nsCSSParser parser(document ? document->CSSLoader() : nullptr);
nsCSSParser parser(loader);
nsCSSValue value;
if (!parser.ParseColorString(aString, nullptr, 0, value)) {
return false;
@ -2821,15 +2842,11 @@ CreateDeclarationForServo(nsCSSPropertyID aProperty,
aDocument->GetDocumentURI(),
aDocument->NodePrincipal());
NS_ConvertUTF16toUTF8 value(aPropertyValue);
ServoCSSParser::ParsingEnvironment env(data,
aDocument->GetCompatibilityMode(),
aDocument->CSSLoader());
RefPtr<RawServoDeclarationBlock> servoDeclarations =
Servo_ParseProperty(aProperty,
&value,
data,
ParsingMode::Default,
aDocument->GetCompatibilityMode(),
aDocument->CSSLoader()).Consume();
ServoCSSParser::ParseProperty(aProperty, aPropertyValue, env);
if (!servoDeclarations) {
// We got a syntax error. The spec says this value must be ignored.

Просмотреть файл

@ -18,11 +18,32 @@ using mozilla::intl::LocaleService;
namespace mozilla {
namespace dom {
static constexpr nsUConvProp localesFallbacks[] = {
struct EncodingProp
{
const char* const mKey;
NotNull<const Encoding*> mValue;
};
template <int32_t N>
static NotNull<const Encoding*>
SearchEncodingProp(const EncodingProp (&aProperties)[N],
const nsACString& aKey)
{
const nsCString& flat = PromiseFlatCString(aKey);
size_t index;
if (!BinarySearchIf(aProperties, 0, ArrayLength(aProperties),
[&flat](const EncodingProp& aProperty)
{ return flat.Compare(aProperty.mKey); }, &index)) {
return WINDOWS_1252_ENCODING;
}
return aProperties[index].mValue;
}
static const EncodingProp localesFallbacks[] = {
#include "localesfallbacks.properties.h"
};
static constexpr nsUConvProp domainsFallbacks[] = {
static const EncodingProp domainsFallbacks[] = {
#include "domainsfallbacks.properties.h"
};
@ -91,15 +112,10 @@ FallbackEncoding::Get()
locale.Truncate(index);
}
nsAutoCString fallback;
if (NS_FAILED(nsUConvPropertySearch::SearchPropertyValue(
localesFallbacks, ArrayLength(localesFallbacks), locale, fallback))) {
mFallback = WINDOWS_1252_ENCODING;
} else {
mFallback = Encoding::ForName(fallback);
}
auto fallback = SearchEncodingProp(localesFallbacks, locale);
mFallback = fallback;
return WrapNotNull(mFallback);
return fallback;
}
NotNull<const Encoding*>
@ -176,12 +192,7 @@ FallbackEncoding::IsParticipatingTopLevelDomain(const nsACString& aTLD)
NotNull<const Encoding*>
FallbackEncoding::FromTopLevelDomain(const nsACString& aTLD)
{
nsAutoCString fallback;
if (NS_FAILED(nsUConvPropertySearch::SearchPropertyValue(
domainsFallbacks, ArrayLength(domainsFallbacks), aTLD, fallback))) {
return WINDOWS_1252_ENCODING;
}
return Encoding::ForName(fallback);
return SearchEncodingProp(domainsFallbacks, aTLD);
}
} // namespace dom

Просмотреть файл

@ -0,0 +1,27 @@
# 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/.
import sys
def main(header, propFile):
mappings = {}
with open(propFile, 'r') as f:
for line in f:
line = line.strip()
if not line.startswith('#'):
parts = line.split("=", 1)
if len(parts) == 2 and len(parts[0]) > 0:
mappings[parts[0].strip()] = parts[1].strip()
keys = mappings.keys()
keys.sort()
header.write("// This is a generated file. Please do not edit.\n")
header.write("// Please edit the corresponding .properties file instead.\n")
entries = ['{ "%s", %s }'
% (key, mappings[key].replace('-', '_').upper() + '_ENCODING') for key in keys]
header.write(',\n'.join(entries) + '\n')

Просмотреть файл

@ -24,12 +24,11 @@ LOCAL_INCLUDES += [
'/intl/locale',
]
props2arrays = '/intl/locale/props2arrays.py'
props2arrays = 'encodings2arrays.py'
prefixes = (
'domainsfallbacks',
'labelsencodings',
'localesfallbacks',
'nonparticipatingdomains',
)
for prefix in prefixes:
@ -40,6 +39,13 @@ for prefix in prefixes:
props.script = props2arrays
props.inputs = [input_file]
input_file = 'nonparticipatingdomains.properties'
header = input_file + '.h'
GENERATED_FILES += [header]
props = GENERATED_FILES[header]
props.script = '../../intl/locale/props2arrays.py'
props.inputs = [input_file]
MOCHITEST_MANIFESTS += [
'test/mochitest.ini',
]

Просмотреть файл

@ -981,11 +981,11 @@
mid: "sdparta_0"
}
]);
await negotiationNeeded(pc1);
trickle(pc2, pc1);
await pc2.setLocalDescription(answer);
await negotiationNeeded(pc1);
await iceConnected(pc1);
await iceConnected(pc2);

Просмотреть файл

@ -18,6 +18,7 @@
#include "nsPresContext.h"
#include "mozilla/ServoBindings.h"
#include "mozilla/StyleAnimationValue.h" // For AnimationValue
#include "mozilla/ServoCSSParser.h"
#include "mozilla/StyleSetHandleInlines.h"
#include "mozilla/dom/BaseKeyframeTypesBinding.h" // For CompositeOperation
#include "mozilla/dom/Element.h"
@ -712,19 +713,12 @@ ValueFromStringHelper(nsCSSPropertyID aPropID,
}
// Parse property
// FIXME this is using the wrong base uri (bug 1343919)
RefPtr<URLExtraData> data = new URLExtraData(doc->GetDocumentURI(),
doc->GetDocumentURI(),
doc->NodePrincipal());
NS_ConvertUTF16toUTF8 value(aString);
ServoCSSParser::ParsingEnvironment env =
ServoCSSParser::GetParsingEnvironment(doc);
RefPtr<RawServoDeclarationBlock> servoDeclarationBlock =
Servo_ParseProperty(aPropID,
&value,
data,
ParsingMode::AllowUnitlessLength |
ParsingMode::AllowAllNumericValues,
doc->GetCompatibilityMode(),
doc->CSSLoader()).Consume();
ServoCSSParser::ParseProperty(aPropID, aString, env,
ParsingMode::AllowUnitlessLength |
ParsingMode::AllowAllNumericValues);
if (!servoDeclarationBlock) {
return result;
}

Просмотреть файл

@ -110,8 +110,8 @@ if use_mmx:
if CONFIG['GNU_CC']:
SOURCES['pixman-mmx.c'].flags += [
'-Winline',
'--param inline-unit-growth=10000',
'--param large-function-growth=10000',
'--param', 'inline-unit-growth=10000',
'--param', 'large-function-growth=10000',
]
if use_sse2:

Просмотреть файл

@ -175,4 +175,4 @@ Troubleshooting tips:
-------------------------------------------------------------------------------
The version of WebRender currently in the tree is:
e3dd85359580074f4ca4a554d9a3c85779f8de64
b7714b1d4348c00682b5643ea0e3f0b15adaeda5

Просмотреть файл

@ -96,9 +96,9 @@ TryAllocAlignedBytes(size_t aSize)
void* ptr;
// Try to align for fast alpha recovery. This should only help
// cairo too, can't hurt.
return moz_posix_memalign(&ptr,
1 << gfxAlphaRecovery::GoodAlignmentLog2(),
aSize) ?
return posix_memalign(&ptr,
1 << gfxAlphaRecovery::GoodAlignmentLog2(),
aSize) ?
nullptr : ptr;
#else
// Oh well, hope that luck is with us in the allocator

Просмотреть файл

@ -77,6 +77,10 @@ VRDisplayHost::VRDisplayHost(VRDeviceType aType)
VRDisplayHost::~VRDisplayHost()
{
if (mSubmitThread) {
mSubmitThread->Shutdown();
mSubmitThread = nullptr;
}
MOZ_COUNT_DTOR(VRDisplayHost);
}
@ -253,23 +257,14 @@ VRDisplayHost::NotifyVSync()
}
void
VRDisplayHost::SubmitFrame(VRLayerParent* aLayer,
const layers::SurfaceDescriptor &aTexture,
uint64_t aFrameId,
const gfx::Rect& aLeftEyeRect,
const gfx::Rect& aRightEyeRect)
VRDisplayHost::SubmitFrameInternal(const layers::SurfaceDescriptor &aTexture,
uint64_t aFrameId,
const gfx::Rect& aLeftEyeRect,
const gfx::Rect& aRightEyeRect)
{
MOZ_ASSERT(mSubmitThread->GetThread() == NS_GetCurrentThread());
AUTO_PROFILER_TRACING("VR", "SubmitFrameAtVRDisplayHost");
if ((mDisplayInfo.mGroupMask & aLayer->GetGroup()) == 0) {
// Suppress layers hidden by the group mask
return;
}
// Ensure that we only accept the first SubmitFrame call per RAF cycle.
if (!mFrameStarted || aFrameId != mDisplayInfo.mFrameId) {
return;
}
mFrameStarted = false;
switch (aTexture.type()) {
@ -336,11 +331,11 @@ VRDisplayHost::SubmitFrame(VRLayerParent* aLayer,
}
#elif defined(MOZ_ANDROID_GOOGLE_VR)
case SurfaceDescriptor::TEGLImageDescriptor: {
const EGLImageDescriptor& desc = aTexture.get_EGLImageDescriptor();
if (!SubmitFrame(&desc, aLeftEyeRect, aRightEyeRect)) {
return;
}
break;
const EGLImageDescriptor& desc = aTexture.get_EGLImageDescriptor();
if (!SubmitFrame(&desc, aLeftEyeRect, aRightEyeRect)) {
return;
}
break;
}
#endif
default: {
@ -371,6 +366,35 @@ VRDisplayHost::SubmitFrame(VRLayerParent* aLayer,
#endif
}
void
VRDisplayHost::SubmitFrame(VRLayerParent* aLayer,
const layers::SurfaceDescriptor &aTexture,
uint64_t aFrameId,
const gfx::Rect& aLeftEyeRect,
const gfx::Rect& aRightEyeRect)
{
if (!mSubmitThread) {
mSubmitThread = new VRThread(NS_LITERAL_CSTRING("VR_SubmitFrame"));
}
if ((mDisplayInfo.mGroupMask & aLayer->GetGroup()) == 0) {
// Suppress layers hidden by the group mask
return;
}
// Ensure that we only accept the first SubmitFrame call per RAF cycle.
if (!mFrameStarted || aFrameId != mDisplayInfo.mFrameId) {
return;
}
mSubmitThread->Start();
mSubmitThread->PostTask(
NewRunnableMethod<StoreCopyPassByConstLRef<layers::SurfaceDescriptor>, uint64_t,
StoreCopyPassByConstLRef<gfx::Rect>, StoreCopyPassByConstLRef<gfx::Rect>>(
"gfx::VRDisplayHost::SubmitFrameInternal", this, &VRDisplayHost::SubmitFrameInternal,
aTexture, aFrameId, aLeftEyeRect, aRightEyeRect));
}
bool
VRDisplayHost::CheckClearDisplayInfoDirty()
{

Просмотреть файл

@ -27,6 +27,7 @@ class MacIOSurface;
#endif
namespace mozilla {
namespace gfx {
class VRThread;
class VRLayerParent;
class VRDisplayHost {
@ -100,7 +101,13 @@ protected:
protected:
virtual VRHMDSensorState GetSensorState() = 0;
RefPtr<VRThread> mSubmitThread;
private:
void SubmitFrameInternal(const layers::SurfaceDescriptor& aTexture,
uint64_t aFrameId,
const gfx::Rect& aLeftEyeRect,
const gfx::Rect& aRightEyeRect);
VRDisplayInfo mLastUpdateDisplayInfo;
TimeStamp mLastFrameStart;
bool mFrameStarted;

Просмотреть файл

@ -4,7 +4,6 @@
* 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/. */
#include "VRThread.h"
#include "nsThreadUtils.h"
@ -14,6 +13,8 @@ namespace gfx {
static StaticRefPtr<VRListenerThreadHolder> sVRListenerThreadHolder;
static bool sFinishedVRListenerShutDown = false;
static const uint32_t kDefaultThreadLifeTime = 60; // in 60 seconds.
static const uint32_t kDelayPostTaskTime = 20000; // in 20000 ms.
VRListenerThreadHolder* GetVRListenerThreadHolder()
{
@ -114,11 +115,128 @@ VRListenerThreadHolder::IsInVRListenerThread()
VRListenerThread()->thread_id() == PlatformThread::CurrentId();
}
} // namespace gfx
} // namespace mozilla
VRThread::VRThread(const nsCString& aName)
: mThread(nullptr)
, mLifeTime(kDefaultThreadLifeTime)
, mStarted(false)
{
mName = aName;
}
VRThread::~VRThread()
{
Shutdown();
}
void
VRThread::Start()
{
MOZ_ASSERT(VRListenerThreadHolder::IsInVRListenerThread());
if (!mThread) {
nsresult rv = NS_NewNamedThread(mName, getter_AddRefs(mThread));
MOZ_ASSERT(mThread);
if (NS_FAILED(rv)) {
MOZ_ASSERT(false, "Failed to create a vr thread.");
}
RefPtr<Runnable> runnable =
NewRunnableMethod<TimeStamp>(
"gfx::VRThread::CheckLife", this, &VRThread::CheckLife, TimeStamp::Now());
// Post it to the main thread for tracking the lifetime.
nsCOMPtr<nsIThread> mainThread;
rv = NS_GetMainThread(getter_AddRefs(mainThread));
if (NS_FAILED(rv)) {
NS_WARNING("VRThread::Start() could not get Main thread");
return;
}
mainThread->DelayedDispatch(runnable.forget(), kDelayPostTaskTime);
}
mStarted = true;
mLastActiveTime = TimeStamp::Now();
}
void
VRThread::Shutdown()
{
if (mThread) {
mThread->Shutdown();
mThread = nullptr;
}
mStarted = false;
}
const nsCOMPtr<nsIThread>
VRThread::GetThread() const
{
return mThread;
}
void
VRThread::PostTask(already_AddRefed<Runnable> aTask)
{
PostDelayedTask(Move(aTask), 0);
}
void
VRThread::PostDelayedTask(already_AddRefed<Runnable> aTask,
uint32_t aTime)
{
MOZ_ASSERT(mStarted, "Must call Start() before posting tasks.");
MOZ_ASSERT(mThread);
mLastActiveTime = TimeStamp::Now();
if (!aTime) {
mThread->Dispatch(Move(aTask), NS_DISPATCH_NORMAL);
} else {
mThread->DelayedDispatch(Move(aTask), aTime);
}
}
void
VRThread::CheckLife(TimeStamp aCheckTimestamp)
{
// VR system is going to shutdown.
if (!mStarted) {
Shutdown();
return;
}
const TimeDuration timeout = TimeDuration::FromSeconds(mLifeTime);
if ((aCheckTimestamp - mLastActiveTime) > timeout) {
Shutdown();
} else {
RefPtr<Runnable> runnable =
NewRunnableMethod<TimeStamp>(
"gfx::VRThread::CheckLife", this, &VRThread::CheckLife, TimeStamp::Now());
// Post it to the main thread for tracking the lifetime.
nsCOMPtr<nsIThread> mainThread;
nsresult rv = NS_GetMainThread(getter_AddRefs(mainThread));
if (NS_FAILED(rv)) {
NS_WARNING("VRThread::CheckLife() could not get Main thread");
return;
}
mainThread->DelayedDispatch(runnable.forget(), kDelayPostTaskTime);
}
}
void
VRThread::SetLifeTime(uint32_t aLifeTime)
{
mLifeTime = aLifeTime;
}
uint32_t
VRThread::GetLifeTime()
{
return mLifeTime;
}
bool
NS_IsInVRListenerThread()
VRThread::IsActive()
{
return mozilla::gfx::VRListenerThreadHolder::IsInVRListenerThread();
}
return !!mThread;
}
} // namespace gfx
} // namespace mozilla

Просмотреть файл

@ -46,6 +46,34 @@ private:
base::Thread* VRListenerThread();
class VRThread final
{
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VRThread)
public:
explicit VRThread(const nsCString& aName);
void Start();
void Shutdown();
void SetLifeTime(uint32_t aLifeTime);
uint32_t GetLifeTime();
void CheckLife(TimeStamp aCheckTimestamp);
void PostTask(already_AddRefed<Runnable> aTask);
void PostDelayedTask(already_AddRefed<Runnable> aTask, uint32_t aTime);
const nsCOMPtr<nsIThread> GetThread() const;
bool IsActive();
protected:
~VRThread();
private:
nsCOMPtr<nsIThread> mThread;
TimeStamp mLastActiveTime;
nsCString mName;
uint32_t mLifeTime;
Atomic<bool> mStarted;
};
} // namespace gfx
} // namespace mozilla

Просмотреть файл

@ -354,6 +354,7 @@ VRDisplayOSVR::SubmitFrame(MacIOSurface* aMacIOSurface,
const gfx::Rect& aRightEyeRect)
{
// XXX Add code to submit frame
MOZ_ASSERT(mSubmitThread->GetThread() == NS_GetCurrentThread());
return false;
}
@ -365,6 +366,7 @@ VRDisplayOSVR::SubmitFrame(const mozilla::layers::EGLImageDescriptor*,
const gfx::Rect& aRightEyeRect)
{
// XXX Add code to submit frame
MOZ_ASSERT(mSubmitThread->GetThread() == NS_GetCurrentThread());
return false;
}

Просмотреть файл

@ -284,6 +284,7 @@ VROculusSession::StopPresentation()
VROculusSession::~VROculusSession()
{
mSubmitThread = nullptr;
Uninitialize(true);
}
@ -356,16 +357,19 @@ VROculusSession::Refresh(bool aForceRefresh)
// fill the HMD with black / no layers.
if (mSession && mTextureSet) {
if (!aForceRefresh) {
// ovr_SubmitFrame is only allowed been run at Compositor thread,
// so we post this task to Compositor thread and let it determine
// if reloading library.
// VROculusSession didn't start submitting frames yet.
if (!mSubmitThread) {
return;
}
// ovr_SubmitFrame is running at VR Submit thread,
// so we post this task to VR Submit thread and let it paint
// a black frame.
mDrawBlack = true;
MessageLoop* loop = layers::CompositorThreadHolder::Loop();
loop->PostTask(NewRunnableMethod<bool>(
MOZ_ASSERT(mSubmitThread->IsActive());
mSubmitThread->PostTask(NewRunnableMethod<bool>(
"gfx::VROculusSession::Refresh",
this,
&VROculusSession::Refresh, true));
return;
}
ovrLayerEyeFov layer;
@ -1095,6 +1099,7 @@ VRDisplayOculus::SubmitFrame(ID3D11Texture2D* aSource,
const gfx::Rect& aLeftEyeRect,
const gfx::Rect& aRightEyeRect)
{
MOZ_ASSERT(mSubmitThread->GetThread() == NS_GetCurrentThread());
if (!CreateD3DObjects()) {
return false;
}
@ -1245,6 +1250,7 @@ VRDisplayOculus::SubmitFrame(ID3D11Texture2D* aSource,
return false;
}
mSession->mSubmitThread = mSubmitThread;
return true;
}
@ -1347,7 +1353,7 @@ VRControllerOculus::UpdateVibrateHaptic(ovrSession aSession,
const VRManagerPromise& aPromise)
{
// UpdateVibrateHaptic() only can be called by mVibrateThread
MOZ_ASSERT(mVibrateThread == NS_GetCurrentThread());
MOZ_ASSERT(mVibrateThread->GetThread() == NS_GetCurrentThread());
// It has been interrupted by loss focus.
if (mIsVibrateStopped) {
@ -1406,8 +1412,7 @@ VRControllerOculus::UpdateVibrateHaptic(ovrSession aSession,
"VRControllerOculus::UpdateVibrateHaptic",
this, &VRControllerOculus::UpdateVibrateHaptic, aSession,
aHapticIndex, aIntensity, (duration > kVibrateRate) ? remainingTime : 0, aVibrateIndex, aPromise);
NS_DelayedDispatchToCurrentThread(runnable.forget(),
(duration > kVibrateRate) ? kVibrateRate : remainingTime);
mVibrateThread->PostDelayedTask(runnable.forget(), (duration > kVibrateRate) ? kVibrateRate : remainingTime);
} else {
VibrateHapticComplete(aSession, aPromise, true);
}
@ -1457,23 +1462,19 @@ VRControllerOculus::VibrateHaptic(ovrSession aSession,
{
// Spinning up the haptics thread at the first haptics call.
if (!mVibrateThread) {
nsresult rv = NS_NewThread(getter_AddRefs(mVibrateThread));
MOZ_ASSERT(mVibrateThread);
if (NS_FAILED(rv)) {
MOZ_ASSERT(false, "Failed to create async thread.");
}
mVibrateThread = new VRThread(NS_LITERAL_CSTRING("Oculus_Vibration"));
}
mVibrateThread->Start();
++mVibrateIndex;
mIsVibrateStopped = false;
RefPtr<Runnable> runnable =
NewRunnableMethod<ovrSession, uint32_t, double, double, uint64_t,
StoreCopyPassByConstLRef<VRManagerPromise>>(
"VRControllerOculus::UpdateVibrateHaptic",
this, &VRControllerOculus::UpdateVibrateHaptic, aSession,
aHapticIndex, aIntensity, aDuration, mVibrateIndex, aPromise);
mVibrateThread->Dispatch(runnable.forget(), NS_DISPATCH_NORMAL);
NewRunnableMethod<ovrSession, uint32_t, double, double, uint64_t,
StoreCopyPassByConstLRef<VRManagerPromise>>(
"VRControllerOculus::UpdateVibrateHaptic",
this, &VRControllerOculus::UpdateVibrateHaptic, aSession,
aHapticIndex, aIntensity, aDuration, mVibrateIndex, aPromise);
mVibrateThread->PostTask(runnable.forget());
}
void

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше