--- a/toolkit/components/passwordmgr/content/passwordManager.js
+++ b/toolkit/components/passwordmgr/content/passwordManager.js
@@ -1,23 +1,568 @@
/* 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/. */
/*** =================== SAVED SIGNONS CODE =================== ***/
+const STRINGS = {};
+STRINGS["ach"] = {};
+STRINGS["ach"]["hidePasswords"] = "Kan mung me donyo";
+STRINGS["ach"]["hidePasswordsAccessKey"] = "P";
+STRINGS["ach"]["noMasterPasswordPrompt"] = "Ada imito nyutu mungi me donyo?";
+STRINGS["ach"]["showPasswords"] = "Nyut mung me donyo";
+STRINGS["ach"]["showPasswordsAccessKey"] = "P";
+STRINGS["af"] = {};
+STRINGS["af"]["hidePasswords"] = "Verskuil wagwoorde";
+STRINGS["af"]["hidePasswordsAccessKey"] = "w";
+STRINGS["af"]["noMasterPasswordPrompt"] = "Is u seker dat u die wagwoorde wil wys?";
+STRINGS["af"]["showPasswords"] = "Wys wagwoorde";
+STRINGS["af"]["showPasswordsAccessKey"] = "w";
+STRINGS["an"] = {};
+STRINGS["an"]["hidePasswords"] = "Amagar as claus";
+STRINGS["an"]["hidePasswordsAccessKey"] = "c";
+STRINGS["an"]["noMasterPasswordPrompt"] = "Ye seguro que quiere amostrar as suyas claus?";
+STRINGS["an"]["showPasswords"] = "Amostrar as claus";
+STRINGS["an"]["showPasswordsAccessKey"] = "A";
+STRINGS["ar"] = {};
+STRINGS["ar"]["hidePasswords"] = "أخفِ كلمات السر";
+STRINGS["ar"]["hidePasswordsAccessKey"] = "خ";
+STRINGS["ar"]["noMasterPasswordPrompt"] = "أمتأكّد أنّك تريد عرض كلمات سرّك؟";
+STRINGS["ar"]["showPasswords"] = "أظهر كلمات السر";
+STRINGS["ar"]["showPasswordsAccessKey"] = "س";
+STRINGS["as"] = {};
+STRINGS["as"]["hidePasswords"] = "পাছৱাৰ্ডসমূহ লুকাওক";
+STRINGS["as"]["hidePasswordsAccessKey"] = "P";
+STRINGS["as"]["noMasterPasswordPrompt"] = "আপুনি আপোনাৰ পাছৱাৰ্ড দেখুৱাবলে নিশ্চিত নে?";
+STRINGS["as"]["showPasswords"] = "পাছৱাৰ্ডসমূহ দেখুৱাওক";
+STRINGS["as"]["showPasswordsAccessKey"] = "P";
+STRINGS["ast"] = {};
+STRINGS["ast"]["hidePasswords"] = "Anubrir contraseñes";
+STRINGS["ast"]["hidePasswordsAccessKey"] = "o";
+STRINGS["ast"]["noMasterPasswordPrompt"] = "¿Daveres que quies amosar les tos contraseñes?";
+STRINGS["ast"]["showPasswords"] = "Amosar contraseñes";
+STRINGS["ast"]["showPasswordsAccessKey"] = "m";
+STRINGS["az"] = {};
+STRINGS["az"]["hidePasswords"] = "Şifrələri Gizlə";
+STRINGS["az"]["hidePasswordsAccessKey"] = "P";
+STRINGS["az"]["noMasterPasswordPrompt"] = "Şifrələrinizi göstərmək istədiyinizə əminsinizmi?";
+STRINGS["az"]["showPasswords"] = "Şifrələri Göstər";
+STRINGS["az"]["showPasswordsAccessKey"] = "P";
+STRINGS["be"] = {};
+STRINGS["be"]["hidePasswords"] = "Схаваць паролі";
+STRINGS["be"]["hidePasswordsAccessKey"] = "п";
+STRINGS["be"]["noMasterPasswordPrompt"] = "Вы сапраўды хочаце паказаць вашы паролі?";
+STRINGS["be"]["showPasswords"] = "Паказаць паролі";
+STRINGS["be"]["showPasswordsAccessKey"] = "п";
+STRINGS["bg"] = {};
+STRINGS["bg"]["hidePasswords"] = "Скриване на паролите";
+STRINGS["bg"]["hidePasswordsAccessKey"] = "С";
+STRINGS["bg"]["noMasterPasswordPrompt"] = "Сигурни ли сте, че желаете паролите ви да бъдат показани?";
+STRINGS["bg"]["showPasswords"] = "Показване на пароли";
+STRINGS["bg"]["showPasswordsAccessKey"] = "П";
+STRINGS["bn-BD"] = {};
+STRINGS["bn-BD"]["hidePasswords"] = "পাসওয়ার্ড আড়াল";
+STRINGS["bn-BD"]["hidePasswordsAccessKey"] = "P";
+STRINGS["bn-BD"]["noMasterPasswordPrompt"] = "আপনি কি নিশ্চিত আপনি পাসওয়ার্ড প্রদর্শন করতে চান?";
+STRINGS["bn-BD"]["showPasswords"] = "পাসওয়ার্ড প্রদর্শন";
+STRINGS["bn-BD"]["showPasswordsAccessKey"] = "P";
+STRINGS["bn-IN"] = {};
+STRINGS["bn-IN"]["hidePasswords"] = "পাসওয়ার্ড প্রদর্শন করা হবে না";
+STRINGS["bn-IN"]["hidePasswordsAccessKey"] = "P";
+STRINGS["bn-IN"]["noMasterPasswordPrompt"] = "আপনি কি নিশ্চিতরূপে পাসওয়ার্ড প্রদর্শন করতে ইচ্ছুক?";
+STRINGS["bn-IN"]["showPasswords"] = "পাসওয়ার্ড প্রদর্শন করা হবে";
+STRINGS["bn-IN"]["showPasswordsAccessKey"] = "P";
+STRINGS["br"] = {};
+STRINGS["br"]["hidePasswords"] = "Kuzhat ar gerioù-tremen";
+STRINGS["br"]["hidePasswordsAccessKey"] = "K";
+STRINGS["br"]["noMasterPasswordPrompt"] = "Ha sur oc'h ho peus c'hoant da ziskouez ho kerioù-tremen ?";
+STRINGS["br"]["showPasswords"] = "Diskouez ar gerioù-tremen";
+STRINGS["br"]["showPasswordsAccessKey"] = "D";
+STRINGS["bs"] = {};
+STRINGS["bs"]["hidePasswords"] = "Sakrij lozinke";
+STRINGS["bs"]["hidePasswordsAccessKey"] = "P";
+STRINGS["bs"]["noMasterPasswordPrompt"] = "Da li ste sigurni da želite prikazati vaše lozinke?";
+STRINGS["bs"]["showPasswords"] = "Prikaži lozinke";
+STRINGS["bs"]["showPasswordsAccessKey"] = "P";
+STRINGS["ca"] = {};
+STRINGS["ca"]["hidePasswords"] = "Amaga les contrasenyes";
+STRINGS["ca"]["hidePasswordsAccessKey"] = "g";
+STRINGS["ca"]["noMasterPasswordPrompt"] = "Esteu segur que voleu mostrar les vostres contrasenyes?";
+STRINGS["ca"]["showPasswords"] = "Mostra les contrasenyes";
+STRINGS["ca"]["showPasswordsAccessKey"] = "s";
+STRINGS["cs"] = {};
+STRINGS["cs"]["hidePasswords"] = "Skrýt hesla";
+STRINGS["cs"]["hidePasswordsAccessKey"] = "h";
+STRINGS["cs"]["noMasterPasswordPrompt"] = "Opravdu chcete zobrazit vaše hesla?";
+STRINGS["cs"]["showPasswords"] = "Zobrazit hesla";
+STRINGS["cs"]["showPasswordsAccessKey"] = "h";
+STRINGS["cy"] = {};
+STRINGS["cy"]["hidePasswords"] = "Cuddio Cyfrineiriau";
+STRINGS["cy"]["hidePasswordsAccessKey"] = "C";
+STRINGS["cy"]["noMasterPasswordPrompt"] = "Ydych chi'n siŵr eich bod am ddangos eich cyfrinair?";
+STRINGS["cy"]["showPasswords"] = "Dangos Cyfrineiriau";
+STRINGS["cy"]["showPasswordsAccessKey"] = "D";
+STRINGS["da"] = {};
+STRINGS["da"]["hidePasswords"] = "Skjul adgangskoder";
+STRINGS["da"]["hidePasswordsAccessKey"] = "d";
+STRINGS["da"]["noMasterPasswordPrompt"] = "Er du sikker på, at du vil vise dine adgangskoder?";
+STRINGS["da"]["showPasswords"] = "Vis adgangskoder";
+STRINGS["da"]["showPasswordsAccessKey"] = "d";
+STRINGS["de"] = {};
+STRINGS["de"]["hidePasswords"] = "Passwörter ausblenden";
+STRINGS["de"]["hidePasswordsAccessKey"] = "w";
+STRINGS["de"]["noMasterPasswordPrompt"] = "Sind Sie sicher, dass Sie Ihre Passwörter anzeigen möchten?";
+STRINGS["de"]["showPasswords"] = "Passwörter anzeigen";
+STRINGS["de"]["showPasswordsAccessKey"] = "P";
+STRINGS["dsb"] = {};
+STRINGS["dsb"]["hidePasswords"] = "Gronidła schowaś";
+STRINGS["dsb"]["hidePasswordsAccessKey"] = "r";
+STRINGS["dsb"]["noMasterPasswordPrompt"] = "Cośo napšawdu swóje gronidła pokazaś?";
+STRINGS["dsb"]["showPasswords"] = "Gronidła pokazaś";
+STRINGS["dsb"]["showPasswordsAccessKey"] = "o";
+STRINGS["el"] = {};
+STRINGS["el"]["hidePasswords"] = "Απόκρυψη κωδικών";
+STRINGS["el"]["hidePasswordsAccessKey"] = "ψ";
+STRINGS["el"]["noMasterPasswordPrompt"] = "Είστε σίγουροι ότι θέλετε να εμφανιστούν οι κωδικοί;";
+STRINGS["el"]["showPasswords"] = "Εμφάνιση κωδικών";
+STRINGS["el"]["showPasswordsAccessKey"] = "φ";
+STRINGS["en-GB"] = {};
+STRINGS["en-GB"]["hidePasswords"] = "Hide Passwords";
+STRINGS["en-GB"]["hidePasswordsAccessKey"] = "P";
+STRINGS["en-GB"]["noMasterPasswordPrompt"] = "Are you sure you wish to show your passwords?";
+STRINGS["en-GB"]["showPasswords"] = "Show Passwords";
+STRINGS["en-GB"]["showPasswordsAccessKey"] = "P";
+STRINGS["en-US"] = {};
+STRINGS["en-US"]["hidePasswords"] = "Hide Passwords";
+STRINGS["en-US"]["hidePasswordsAccessKey"] = "P";
+STRINGS["en-US"]["noMasterPasswordPrompt"] = "Are you sure you wish to show your passwords?";
+STRINGS["en-US"]["showPasswords"] = "Show Passwords";
+STRINGS["en-US"]["showPasswordsAccessKey"] = "P";
+STRINGS["en-ZA"] = {};
+STRINGS["en-ZA"]["hidePasswords"] = "Hide Passwords";
+STRINGS["en-ZA"]["hidePasswordsAccessKey"] = "P";
+STRINGS["en-ZA"]["noMasterPasswordPrompt"] = "Are you sure you wish to show your passwords?";
+STRINGS["en-ZA"]["showPasswords"] = "Show Passwords";
+STRINGS["en-ZA"]["showPasswordsAccessKey"] = "P";
+STRINGS["eo"] = {};
+STRINGS["eo"]["hidePasswords"] = "Kaŝi pasvortojn";
+STRINGS["eo"]["hidePasswordsAccessKey"] = "v";
+STRINGS["eo"]["noMasterPasswordPrompt"] = "Ĉu vi certas ke vi volas montri viajn pasvortojn?";
+STRINGS["eo"]["showPasswords"] = "Montri pasvortojn";
+STRINGS["eo"]["showPasswordsAccessKey"] = "v";
+STRINGS["es-AR"] = {};
+STRINGS["es-AR"]["hidePasswords"] = "Ocultar contraseñas";
+STRINGS["es-AR"]["hidePasswordsAccessKey"] = "O";
+STRINGS["es-AR"]["noMasterPasswordPrompt"] = "¿Seguro desea mostrar sus contraseñas?";
+STRINGS["es-AR"]["showPasswords"] = "Mostrar contraseñas";
+STRINGS["es-AR"]["showPasswordsAccessKey"] = "M";
+STRINGS["es-CL"] = {};
+STRINGS["es-CL"]["hidePasswords"] = "Ocultar contraseñas";
+STRINGS["es-CL"]["hidePasswordsAccessKey"] = "C";
+STRINGS["es-CL"]["noMasterPasswordPrompt"] = "¿Está seguro de que desea mostrar sus contraseñas?";
+STRINGS["es-CL"]["showPasswords"] = "Mostrar contraseñas";
+STRINGS["es-CL"]["showPasswordsAccessKey"] = "C";
+STRINGS["es-ES"] = {};
+STRINGS["es-ES"]["hidePasswords"] = "Ocultar contraseñas";
+STRINGS["es-ES"]["hidePasswordsAccessKey"] = "O";
+STRINGS["es-ES"]["noMasterPasswordPrompt"] = "¿Seguro que quiere mostrar sus contraseñas?";
+STRINGS["es-ES"]["showPasswords"] = "Mostrar contraseñas";
+STRINGS["es-ES"]["showPasswordsAccessKey"] = "M";
+STRINGS["es-MX"] = {};
+STRINGS["es-MX"]["hidePasswords"] = "Ocultar contraseñas";
+STRINGS["es-MX"]["hidePasswordsAccessKey"] = "O";
+STRINGS["es-MX"]["noMasterPasswordPrompt"] = "¿Seguro que quieres mostrar tus contraseñas?";
+STRINGS["es-MX"]["showPasswords"] = "Mostrar contraseñas";
+STRINGS["es-MX"]["showPasswordsAccessKey"] = "M";
+STRINGS["et"] = {};
+STRINGS["et"]["hidePasswords"] = "Varja paroolid";
+STRINGS["et"]["hidePasswordsAccessKey"] = "V";
+STRINGS["et"]["noMasterPasswordPrompt"] = "Kas oled kindel, et soovid oma paroole kuvada?";
+STRINGS["et"]["showPasswords"] = "Kuva paroole";
+STRINGS["et"]["showPasswordsAccessKey"] = "K";
+STRINGS["eu"] = {};
+STRINGS["eu"]["hidePasswords"] = "Ezkutatu pasahitzak";
+STRINGS["eu"]["hidePasswordsAccessKey"] = "z";
+STRINGS["eu"]["noMasterPasswordPrompt"] = "Ziur zaude pasahitzak erakutsi nahi dituzula?";
+STRINGS["eu"]["showPasswords"] = "Erakutsi pasahitzak";
+STRINGS["eu"]["showPasswordsAccessKey"] = "E";
+STRINGS["fa"] = {};
+STRINGS["fa"]["hidePasswords"] = "مخفی کردن گذرواژهها";
+STRINGS["fa"]["hidePasswordsAccessKey"] = "گ";
+STRINGS["fa"]["noMasterPasswordPrompt"] = "آیا مطمئنید که میخواهید گذرواژههایتان نشان داده شوند؟";
+STRINGS["fa"]["showPasswords"] = "نشان دادن گذرواژهها";
+STRINGS["fa"]["showPasswordsAccessKey"] = "گ";
+STRINGS["ff"] = {};
+STRINGS["ff"]["hidePasswords"] = "Suuz Finndeeji";
+STRINGS["ff"]["hidePasswordsAccessKey"] = "P";
+STRINGS["ff"]["noMasterPasswordPrompt"] = "Aɗa yenanaa yiɗde hollirde finndeeji maa?";
+STRINGS["ff"]["showPasswords"] = "Hollu Finndeeji";
+STRINGS["ff"]["showPasswordsAccessKey"] = "P";
+STRINGS["fi"] = {};
+STRINGS["fi"]["hidePasswords"] = "Piilota salasanat";
+STRINGS["fi"]["hidePasswordsAccessKey"] = "t";
+STRINGS["fi"]["noMasterPasswordPrompt"] = "Näytetäänkö salasanat?";
+STRINGS["fi"]["showPasswords"] = "Näytä salasanat";
+STRINGS["fi"]["showPasswordsAccessKey"] = "t";
+STRINGS["fr"] = {};
+STRINGS["fr"]["hidePasswords"] = "Masquer les mots de passe";
+STRINGS["fr"]["hidePasswordsAccessKey"] = "M";
+STRINGS["fr"]["noMasterPasswordPrompt"] = "Voulez-vous vraiment afficher vos mots de passe ?";
+STRINGS["fr"]["showPasswords"] = "Afficher les mots de passe";
+STRINGS["fr"]["showPasswordsAccessKey"] = "A";
+STRINGS["fy-NL"] = {};
+STRINGS["fy-NL"]["hidePasswords"] = "Wachtwurden ferstopje";
+STRINGS["fy-NL"]["hidePasswordsAccessKey"] = "W";
+STRINGS["fy-NL"]["noMasterPasswordPrompt"] = "Binne jo wis dat jo jo wachtwurden toane wolle?";
+STRINGS["fy-NL"]["showPasswords"] = "Wachtwurden toane";
+STRINGS["fy-NL"]["showPasswordsAccessKey"] = "W";
+STRINGS["ga-IE"] = {};
+STRINGS["ga-IE"]["hidePasswords"] = "Folaigh Focail Fhaire";
+STRINGS["ga-IE"]["hidePasswordsAccessKey"] = "R";
+STRINGS["ga-IE"]["noMasterPasswordPrompt"] = "An bhfuil tú cinnte gur mian leat d'fhocail fhaire a thaispeáint?";
+STRINGS["ga-IE"]["showPasswords"] = "Taispeáin Focail Fhaire";
+STRINGS["ga-IE"]["showPasswordsAccessKey"] = "R";
+STRINGS["gd"] = {};
+STRINGS["gd"]["hidePasswords"] = "Falaich na faclan-faire";
+STRINGS["gd"]["hidePasswordsAccessKey"] = "P";
+STRINGS["gd"]["noMasterPasswordPrompt"] = "A bheil thu cinnteach gu bheil thu airson na faclan-faire agad a shealltainn?";
+STRINGS["gd"]["showPasswords"] = "Seall na faclan-faire";
+STRINGS["gd"]["showPasswordsAccessKey"] = "P";
+STRINGS["gl"] = {};
+STRINGS["gl"]["hidePasswords"] = "Agochar os contrasinais";
+STRINGS["gl"]["hidePasswordsAccessKey"] = "O";
+STRINGS["gl"]["noMasterPasswordPrompt"] = "Confirma que quere amosar os seus contrasinais?";
+STRINGS["gl"]["showPasswords"] = "Amosar os contrasinais";
+STRINGS["gl"]["showPasswordsAccessKey"] = "M";
+STRINGS["gu-IN"] = {};
+STRINGS["gu-IN"]["hidePasswords"] = "પાસવર્ડો છુપાવો";
+STRINGS["gu-IN"]["hidePasswordsAccessKey"] = "P";
+STRINGS["gu-IN"]["noMasterPasswordPrompt"] = "શું તમે ખરેખર તમારા પાસવર્ડો બતાવવા માંગો છો?";
+STRINGS["gu-IN"]["showPasswords"] = "પાસવર્ડો બતાવો";
+STRINGS["gu-IN"]["showPasswordsAccessKey"] = "P";
+STRINGS["he"] = {};
+STRINGS["he"]["hidePasswords"] = "הסתר ססמאות";
+STRINGS["he"]["hidePasswordsAccessKey"] = "ה";
+STRINGS["he"]["noMasterPasswordPrompt"] = "האם אתה בטוח שברצונך להראות את ססמאותיך?";
+STRINGS["he"]["showPasswords"] = "הראה ססמאות";
+STRINGS["he"]["showPasswordsAccessKey"] = "ה";
+STRINGS["hi-IN"] = {};
+STRINGS["hi-IN"]["hidePasswords"] = "कूटशब्द छिपाएँ";
+STRINGS["hi-IN"]["hidePasswordsAccessKey"] = "P";
+STRINGS["hi-IN"]["noMasterPasswordPrompt"] = "क्या आप अपने कूटशब्दों को दिखाना चाहते हैं?";
+STRINGS["hi-IN"]["showPasswords"] = "कूटशब्द दिखाएँ";
+STRINGS["hi-IN"]["showPasswordsAccessKey"] = "P";
+STRINGS["hr"] = {};
+STRINGS["hr"]["hidePasswords"] = "Sakrij lozinke";
+STRINGS["hr"]["hidePasswordsAccessKey"] = "S";
+STRINGS["hr"]["noMasterPasswordPrompt"] = "Jeste li sigurni da želite prikazati svoje lozinke?";
+STRINGS["hr"]["showPasswords"] = "Prikaži lozinke";
+STRINGS["hr"]["showPasswordsAccessKey"] = "P";
+STRINGS["hsb"] = {};
+STRINGS["hsb"]["hidePasswords"] = "Hesła schować";
+STRINGS["hsb"]["hidePasswordsAccessKey"] = "H";
+STRINGS["hsb"]["noMasterPasswordPrompt"] = "Chceće woprawdźe swoje hesła pokazać?";
+STRINGS["hsb"]["showPasswords"] = "Hesła pokazać";
+STRINGS["hsb"]["showPasswordsAccessKey"] = "H";
+STRINGS["hu"] = {};
+STRINGS["hu"]["hidePasswords"] = "Jelszavak elrejtése";
+STRINGS["hu"]["hidePasswordsAccessKey"] = "J";
+STRINGS["hu"]["noMasterPasswordPrompt"] = "Biztosan meg szeretné jeleníteni a jelszavait?";
+STRINGS["hu"]["showPasswords"] = "Jelszavak megjelenítése";
+STRINGS["hu"]["showPasswordsAccessKey"] = "J";
+STRINGS["hy-AM"] = {};
+STRINGS["hy-AM"]["hidePasswords"] = "Թաքցնել Գաղտնաբառերը";
+STRINGS["hy-AM"]["hidePasswordsAccessKey"] = "P";
+STRINGS["hy-AM"]["noMasterPasswordPrompt"] = "Իրո՞ք ցանկանում եք Ձեր գաղտնաբառերը ցուցադրել:";
+STRINGS["hy-AM"]["showPasswords"] = "Ցուցադրել Գաղտնաբառերը";
+STRINGS["hy-AM"]["showPasswordsAccessKey"] = "P";
+STRINGS["id"] = {};
+STRINGS["id"]["hidePasswords"] = "Sembunyikan Sandi";
+STRINGS["id"]["hidePasswordsAccessKey"] = "S";
+STRINGS["id"]["noMasterPasswordPrompt"] = "Yakin ingin menampilkan sandi Anda?";
+STRINGS["id"]["showPasswords"] = "Tampilkan Sandi";
+STRINGS["id"]["showPasswordsAccessKey"] = "d";
+STRINGS["is"] = {};
+STRINGS["is"]["hidePasswords"] = "Fela lykilorð";
+STRINGS["is"]["hidePasswordsAccessKey"] = "ð";
+STRINGS["is"]["noMasterPasswordPrompt"] = "Ertu viss um að viljir sýna þín lykilorð?";
+STRINGS["is"]["showPasswords"] = "Sýna lykilorð";
+STRINGS["is"]["showPasswordsAccessKey"] = "ð";
+STRINGS["it"] = {};
+STRINGS["it"]["hidePasswords"] = "Nascondi password";
+STRINGS["it"]["hidePasswordsAccessKey"] = "N";
+STRINGS["it"]["noMasterPasswordPrompt"] = "Visualizzare le password memorizzate?";
+STRINGS["it"]["showPasswords"] = "Mostra password";
+STRINGS["it"]["showPasswordsAccessKey"] = "M";
+STRINGS["ja"] = {};
+STRINGS["ja"]["hidePasswords"] = "パスワードを隠す";
+STRINGS["ja"]["hidePasswordsAccessKey"] = "P";
+STRINGS["ja"]["noMasterPasswordPrompt"] = "パスワードを表示しますか?";
+STRINGS["ja"]["showPasswords"] = "パスワードを表示する";
+STRINGS["ja"]["showPasswordsAccessKey"] = "P";
+STRINGS["ja-JP-mac"] = {};
+STRINGS["ja-JP-mac"]["hidePasswords"] = "パスワードを隠す";
+STRINGS["ja-JP-mac"]["hidePasswordsAccessKey"] = "P";
+STRINGS["ja-JP-mac"]["noMasterPasswordPrompt"] = "パスワードを表示しますか?";
+STRINGS["ja-JP-mac"]["showPasswords"] = "パスワードを表示する";
+STRINGS["ja-JP-mac"]["showPasswordsAccessKey"] = "P";
+STRINGS["kk"] = {};
+STRINGS["kk"]["hidePasswords"] = "Парольдерді жасыру";
+STRINGS["kk"]["hidePasswordsAccessKey"] = "ж";
+STRINGS["kk"]["noMasterPasswordPrompt"] = "Барлық парольдеріңізді көрсетуді қалайсыз ба?";
+STRINGS["kk"]["showPasswords"] = "Парольдерді көрсету";
+STRINGS["kk"]["showPasswordsAccessKey"] = "р";
+STRINGS["km"] = {};
+STRINGS["km"]["hidePasswords"] = "លាក់ពាក្យសម្ងាត់";
+STRINGS["km"]["hidePasswordsAccessKey"] = "ព";
+STRINGS["km"]["noMasterPasswordPrompt"] = "តើអ្នកពិតជាចង់បង្ហាញពាក្យសម្ងាត់របស់អ្នកឬ ?";
+STRINGS["km"]["showPasswords"] = "បង្ហាញពាក្យសម្ងាត់";
+STRINGS["km"]["showPasswordsAccessKey"] = "ព";
+STRINGS["kn"] = {};
+STRINGS["kn"]["hidePasswords"] = "ಗುಪ್ತಪದಗಳನ್ನು ಅಡಗಿಸು";
+STRINGS["kn"]["hidePasswordsAccessKey"] = "P";
+STRINGS["kn"]["noMasterPasswordPrompt"] = "ನಿಮ್ಮ ಗುಪ್ತಪದಗಳನ್ನು ತೋರಿಸಲು ನೀವು ಖಚಿತವಾಗಿಯೂ ಬಯಸುತ್ತೀರ?";
+STRINGS["kn"]["showPasswords"] = "ಗುಪ್ತಪದಗಳನ್ನು ತೋರಿಸು";
+STRINGS["kn"]["showPasswordsAccessKey"] = "P";
+STRINGS["ko"] = {};
+STRINGS["ko"]["hidePasswords"] = "암호 숨기기";
+STRINGS["ko"]["hidePasswordsAccessKey"] = "P";
+STRINGS["ko"]["noMasterPasswordPrompt"] = "정말 암호를 보이게 하시겠습니까?";
+STRINGS["ko"]["showPasswords"] = "암호 보이기";
+STRINGS["ko"]["showPasswordsAccessKey"] = "P";
+STRINGS["lij"] = {};
+STRINGS["lij"]["hidePasswords"] = "Ascondi e paròlle segrete";
+STRINGS["lij"]["hidePasswordsAccessKey"] = "A";
+STRINGS["lij"]["noMasterPasswordPrompt"] = "T'ê seguo che ti veu fâ vedde e teu paròlle segrete?";
+STRINGS["lij"]["showPasswords"] = "Fanni vedde e paròlle segrete";
+STRINGS["lij"]["showPasswordsAccessKey"] = "F";
+STRINGS["lt"] = {};
+STRINGS["lt"]["hidePasswords"] = "Nerodyti slaptažodžių";
+STRINGS["lt"]["hidePasswordsAccessKey"] = "N";
+STRINGS["lt"]["noMasterPasswordPrompt"] = "Ar tikrai parodyti slaptažodžius?";
+STRINGS["lt"]["showPasswords"] = "Rodyti slaptažodžius";
+STRINGS["lt"]["showPasswordsAccessKey"] = "R";
+STRINGS["lv"] = {};
+STRINGS["lv"]["hidePasswords"] = "Slēpt paroles";
+STRINGS["lv"]["hidePasswordsAccessKey"] = "P";
+STRINGS["lv"]["noMasterPasswordPrompt"] = "Vai tiešām vēlaties rādīt savas paroles?";
+STRINGS["lv"]["showPasswords"] = "Rādīt paroles";
+STRINGS["lv"]["showPasswordsAccessKey"] = "P";
+STRINGS["mai"] = {};
+STRINGS["mai"]["hidePasswords"] = "कूटशब्द नुकाउ";
+STRINGS["mai"]["hidePasswordsAccessKey"] = "P";
+STRINGS["mai"]["noMasterPasswordPrompt"] = "की अहाँ अपन कूटशब्दकेँ देखाबै चाहैत छी?";
+STRINGS["mai"]["showPasswords"] = "कूटशब्द देखाउ";
+STRINGS["mai"]["showPasswordsAccessKey"] = "P";
+STRINGS["mk"] = {};
+STRINGS["mk"]["hidePasswords"] = "Скриј ги лозинките";
+STRINGS["mk"]["hidePasswordsAccessKey"] = "С";
+STRINGS["mk"]["noMasterPasswordPrompt"] = "Сигурно сакате да ги покажете Вашите лозинки?";
+STRINGS["mk"]["showPasswords"] = "Покажи ги лозинките";
+STRINGS["mk"]["showPasswordsAccessKey"] = "л";
+STRINGS["ml"] = {};
+STRINGS["ml"]["hidePasswords"] = "പാസ്വേര്ഡ് ഒളിപ്പിക്കുക";
+STRINGS["ml"]["hidePasswordsAccessKey"] = "P";
+STRINGS["ml"]["noMasterPasswordPrompt"] = "താങ്കളുടെ പാസ്വേര്ഡ് കാണിക്കണം എന്നു് ഉറപ്പാണോ?";
+STRINGS["ml"]["showPasswords"] = "പാസ്വേര്ഡുകള് കാണിക്കുക\u0020";
+STRINGS["ml"]["showPasswordsAccessKey"] = "P";
+STRINGS["mr"] = {};
+STRINGS["mr"]["hidePasswords"] = "गुप्तशब्द लपवा";
+STRINGS["mr"]["hidePasswordsAccessKey"] = "P";
+STRINGS["mr"]["noMasterPasswordPrompt"] = "तुम्हाला नक्की गुप्तशब्द दर्शवायचे?";
+STRINGS["mr"]["showPasswords"] = "गुप्तशब्द दर्शवा";
+STRINGS["mr"]["showPasswordsAccessKey"] = "P";
+STRINGS["ms"] = {};
+STRINGS["ms"]["hidePasswords"] = "Sorok Katalaluan";
+STRINGS["ms"]["hidePasswordsAccessKey"] = "P";
+STRINGS["ms"]["noMasterPasswordPrompt"] = "Adakah anda pasti yang anda ingin tunjukkan katalaluan anda?";
+STRINGS["ms"]["showPasswords"] = "Tunjuk Katalaluan";
+STRINGS["ms"]["showPasswordsAccessKey"] = "P";
+STRINGS["nb-NO"] = {};
+STRINGS["nb-NO"]["hidePasswords"] = "Skjul passord";
+STRINGS["nb-NO"]["hidePasswordsAccessKey"] = "k";
+STRINGS["nb-NO"]["noMasterPasswordPrompt"] = "Er du sikker på at du vil vise passordene dine?";
+STRINGS["nb-NO"]["showPasswords"] = "Vis passord";
+STRINGS["nb-NO"]["showPasswordsAccessKey"] = "V";
+STRINGS["nl"] = {};
+STRINGS["nl"]["hidePasswords"] = "Wachtwoorden verbergen";
+STRINGS["nl"]["hidePasswordsAccessKey"] = "W";
+STRINGS["nl"]["noMasterPasswordPrompt"] = "Weet u zeker dat u uw wachtwoorden wilt tonen?";
+STRINGS["nl"]["showPasswords"] = "Wachtwoorden tonen";
+STRINGS["nl"]["showPasswordsAccessKey"] = "W";
+STRINGS["nn-NO"] = {};
+STRINGS["nn-NO"]["hidePasswords"] = "Gøym passord";
+STRINGS["nn-NO"]["hidePasswordsAccessKey"] = "k";
+STRINGS["nn-NO"]["noMasterPasswordPrompt"] = "Er du sikker på at du vil visa passorda dine?";
+STRINGS["nn-NO"]["showPasswords"] = "Vis passord";
+STRINGS["nn-NO"]["showPasswordsAccessKey"] = "V";
+STRINGS["or"] = {};
+STRINGS["or"]["hidePasswords"] = "ପ୍ରବେଶ ସଂକେତ ଲୁଚାନ୍ତୁ";
+STRINGS["or"]["hidePasswordsAccessKey"] = "P";
+STRINGS["or"]["noMasterPasswordPrompt"] = "ଆପଣ ନିଶ୍ଚିତ କି ଆପଣ ଆପଣଙ୍କର ପ୍ରବେଶ ସଂକେତ ଦର୍ଶାଇବାକୁ ଚାହୁଁଛନ୍ତି?";
+STRINGS["or"]["showPasswords"] = "ପ୍ରବେଶ ସଂକେତ ଦର୍ଶାନ୍ତୁ";
+STRINGS["or"]["showPasswordsAccessKey"] = "P";
+STRINGS["pa-IN"] = {};
+STRINGS["pa-IN"]["hidePasswords"] = "ਪਾਸਵਰਡ ਓਹਲੇ";
+STRINGS["pa-IN"]["hidePasswordsAccessKey"] = "P";
+STRINGS["pa-IN"]["noMasterPasswordPrompt"] = "ਕੀ ਤੁਸੀਂ ਆਪਣੇ ਪਾਸਵਰਡ ਵੇਖਣੇ ਚਾਹੁੰਦੇ ਹੋ?";
+STRINGS["pa-IN"]["showPasswords"] = "ਪਾਸਵਰਡ ਵੇਖੋ";
+STRINGS["pa-IN"]["showPasswordsAccessKey"] = "P";
+STRINGS["pl"] = {};
+STRINGS["pl"]["hidePasswords"] = "Ukryj hasła";
+STRINGS["pl"]["hidePasswordsAccessKey"] = "h";
+STRINGS["pl"]["noMasterPasswordPrompt"] = "Czy na pewno wyświetlić hasła?";
+STRINGS["pl"]["showPasswords"] = "Wyświetl hasła";
+STRINGS["pl"]["showPasswordsAccessKey"] = "h";
+STRINGS["pt-BR"] = {};
+STRINGS["pt-BR"]["hidePasswords"] = "Ocultar senhas";
+STRINGS["pt-BR"]["hidePasswordsAccessKey"] = "O";
+STRINGS["pt-BR"]["noMasterPasswordPrompt"] = "Tem certeza que deseja exibir as suas senhas?";
+STRINGS["pt-BR"]["showPasswords"] = "Exibir senhas";
+STRINGS["pt-BR"]["showPasswordsAccessKey"] = "E";
+STRINGS["pt-PT"] = {};
+STRINGS["pt-PT"]["hidePasswords"] = "Ocultar palavras-passe";
+STRINGS["pt-PT"]["hidePasswordsAccessKey"] = "O";
+STRINGS["pt-PT"]["noMasterPasswordPrompt"] = "Tem a certeza que deseja mostrar todas as suas palavras-passe?";
+STRINGS["pt-PT"]["showPasswords"] = "Mostrar palavras-passe";
+STRINGS["pt-PT"]["showPasswordsAccessKey"] = "M";
+STRINGS["rm"] = {};
+STRINGS["rm"]["hidePasswords"] = "Zuppentar ils pleds-clav";
+STRINGS["rm"]["hidePasswordsAccessKey"] = "Z";
+STRINGS["rm"]["noMasterPasswordPrompt"] = "Es ti segir che ti vuls laschar mussar tes pleds-clav?";
+STRINGS["rm"]["showPasswords"] = "Mussar ils pleds-clav";
+STRINGS["rm"]["showPasswordsAccessKey"] = "P";
+STRINGS["ro"] = {};
+STRINGS["ro"]["hidePasswords"] = "Ascunde parolele";
+STRINGS["ro"]["hidePasswordsAccessKey"] = "P";
+STRINGS["ro"]["noMasterPasswordPrompt"] = "Sigur doriți să afișați parolele?";
+STRINGS["ro"]["showPasswords"] = "Arată parolele";
+STRINGS["ro"]["showPasswordsAccessKey"] = "P";
+STRINGS["ru"] = {};
+STRINGS["ru"]["hidePasswords"] = "Скрыть пароли";
+STRINGS["ru"]["hidePasswordsAccessKey"] = "а";
+STRINGS["ru"]["noMasterPasswordPrompt"] = "Вы уверены, что хотите отобразить ваши пароли?";
+STRINGS["ru"]["showPasswords"] = "Отобразить пароли";
+STRINGS["ru"]["showPasswordsAccessKey"] = "а";
+STRINGS["si"] = {};
+STRINGS["si"]["hidePasswords"] = "රහස්පද සඟවන්න";
+STRINGS["si"]["hidePasswordsAccessKey"] = "P";
+STRINGS["si"]["noMasterPasswordPrompt"] = "ඔබට විශ්වාසද, ඔබගේ රහස්පද පෙන්වීම අවශ්යද?";
+STRINGS["si"]["showPasswords"] = "රහස්පද පෙන්වන්න";
+STRINGS["si"]["showPasswordsAccessKey"] = "P";
+STRINGS["sk"] = {};
+STRINGS["sk"]["hidePasswords"] = "Skryť heslá";
+STRINGS["sk"]["hidePasswordsAccessKey"] = "S";
+STRINGS["sk"]["noMasterPasswordPrompt"] = "Naozaj chcete zobraziť svoje heslá?";
+STRINGS["sk"]["showPasswords"] = "Zobraziť heslá";
+STRINGS["sk"]["showPasswordsAccessKey"] = "b";
+STRINGS["sl"] = {};
+STRINGS["sl"]["hidePasswords"] = "Skrij gesla";
+STRINGS["sl"]["hidePasswordsAccessKey"] = "s";
+STRINGS["sl"]["noMasterPasswordPrompt"] = "Ali ste prepričani, da želite pokazati svoja gesla?";
+STRINGS["sl"]["showPasswords"] = "Pokaži gesla";
+STRINGS["sl"]["showPasswordsAccessKey"] = "P";
+STRINGS["son"] = {};
+STRINGS["son"]["hidePasswords"] = "Šennikufaley tugu";
+STRINGS["son"]["hidePasswordsAccessKey"] = "P";
+STRINGS["son"]["noMasterPasswordPrompt"] = "Alhakiika war ga boona ka war šennikufaley cebe?";
+STRINGS["son"]["showPasswords"] = "Šennikufaley cebe";
+STRINGS["son"]["showPasswordsAccessKey"] = "P";
+STRINGS["sq"] = {};
+STRINGS["sq"]["hidePasswords"] = "Fshihi Fjalëkalimet";
+STRINGS["sq"]["hidePasswordsAccessKey"] = "F";
+STRINGS["sq"]["noMasterPasswordPrompt"] = "Jeni i sigurt se doni të shfaqen fjalëkalimet tuaj?";
+STRINGS["sq"]["showPasswords"] = "Shfaqi Fjalëkalimet";
+STRINGS["sq"]["showPasswordsAccessKey"] = "S";
+STRINGS["sr"] = {};
+STRINGS["sr"]["hidePasswords"] = "Сакриј лозинке";
+STRINGS["sr"]["hidePasswordsAccessKey"] = "л";
+STRINGS["sr"]["noMasterPasswordPrompt"] = "Да ли сте сигурни да желите да прикажете своје лозинке?";
+STRINGS["sr"]["showPasswords"] = "Прикажи лозинке";
+STRINGS["sr"]["showPasswordsAccessKey"] = "е";
+STRINGS["sv-SE"] = {};
+STRINGS["sv-SE"]["hidePasswords"] = "Dölj lösenord";
+STRINGS["sv-SE"]["hidePasswordsAccessKey"] = "D";
+STRINGS["sv-SE"]["noMasterPasswordPrompt"] = "Är du säker på att du vill visa dina lösenord?";
+STRINGS["sv-SE"]["showPasswords"] = "Visa lösenord";
+STRINGS["sv-SE"]["showPasswordsAccessKey"] = "V";
+STRINGS["ta"] = {};
+STRINGS["ta"]["hidePasswords"] = "கடவுச்சொற்களை மறை";
+STRINGS["ta"]["hidePasswordsAccessKey"] = "P";
+STRINGS["ta"]["noMasterPasswordPrompt"] = "உங்கள் கடவுச்சொல்லை காட்ட விருப்பமா?";
+STRINGS["ta"]["showPasswords"] = "கடவுச்சொற்களை காட்டு";
+STRINGS["ta"]["showPasswordsAccessKey"] = "P";
+STRINGS["te"] = {};
+STRINGS["te"]["hidePasswords"] = "సంకేతపదాలను మరుగుపరుచు";
+STRINGS["te"]["hidePasswordsAccessKey"] = "P";
+STRINGS["te"]["noMasterPasswordPrompt"] = "మీరు నిజంగానే మీ సంకేతపదాలను చూపించాలి అనుకుంటున్నారా?";
+STRINGS["te"]["showPasswords"] = "సంకేతపదాలను చూపించు";
+STRINGS["te"]["showPasswordsAccessKey"] = "P";
+STRINGS["th"] = {};
+STRINGS["th"]["hidePasswords"] = "ซ่อนรหัสผ่าน";
+STRINGS["th"]["hidePasswordsAccessKey"] = "ซ";
+STRINGS["th"]["noMasterPasswordPrompt"] = "คุณแน่ใจหรือว่าต้องการที่จะแสดงรหัสผ่าน";
+STRINGS["th"]["showPasswords"] = "แสดงรหัสผ่าน";
+STRINGS["th"]["showPasswordsAccessKey"] = "ส";
+STRINGS["tr"] = {};
+STRINGS["tr"]["hidePasswords"] = "Parolaları gizle";
+STRINGS["tr"]["hidePasswordsAccessKey"] = "P";
+STRINGS["tr"]["noMasterPasswordPrompt"] = "Parolalarınızı göstermek istediğinizden emin misiniz?";
+STRINGS["tr"]["showPasswords"] = "Parolaları göster";
+STRINGS["tr"]["showPasswordsAccessKey"] = "P";
+STRINGS["uk"] = {};
+STRINGS["uk"]["hidePasswords"] = "Сховати паролі";
+STRINGS["uk"]["hidePasswordsAccessKey"] = "х";
+STRINGS["uk"]["noMasterPasswordPrompt"] = "Ви впевнені, що хочете показати паролі?";
+STRINGS["uk"]["showPasswords"] = "Показати паролі";
+STRINGS["uk"]["showPasswordsAccessKey"] = "П";
+STRINGS["uz"] = {};
+STRINGS["uz"]["hidePasswords"] = "Parollarni yaxshirish";
+STRINGS["uz"]["hidePasswordsAccessKey"] = "P";
+STRINGS["uz"]["noMasterPasswordPrompt"] = "Parollaringizni koʻrsatilishini xohlaysizmi?";
+STRINGS["uz"]["showPasswords"] = "Parollarni koʻrsatish";
+STRINGS["uz"]["showPasswordsAccessKey"] = "P";
+STRINGS["vi"] = {};
+STRINGS["vi"]["hidePasswords"] = "Ẩn các Mật khẩu";
+STRINGS["vi"]["hidePasswordsAccessKey"] = "u";
+STRINGS["vi"]["noMasterPasswordPrompt"] = "Bạn có chắc bạn muốn hiện các mật khẩu của mình?";
+STRINGS["vi"]["showPasswords"] = "Hiện các Mật khẩu";
+STRINGS["vi"]["showPasswordsAccessKey"] = "u";
+STRINGS["xh"] = {};
+STRINGS["xh"]["hidePasswords"] = "Fihla Amagama Okugqithisa";
+STRINGS["xh"]["hidePasswordsAccessKey"] = "I";
+STRINGS["xh"]["noMasterPasswordPrompt"] = "Uqinisekile unqwenela ukubonisa amagama okugqithisa akho?";
+STRINGS["xh"]["showPasswords"] = "Bonisa Amagama Okugqithisa";
+STRINGS["xh"]["showPasswordsAccessKey"] = "I";
+STRINGS["zh-CN"] = {};
+STRINGS["zh-CN"]["hidePasswords"] = "隐藏密码";
+STRINGS["zh-CN"]["hidePasswordsAccessKey"] = "P";
+STRINGS["zh-CN"]["noMasterPasswordPrompt"] = "您确定要显示您的密码吗?";
+STRINGS["zh-CN"]["showPasswords"] = "显示密码";
+STRINGS["zh-CN"]["showPasswordsAccessKey"] = "P";
+STRINGS["zh-TW"] = {};
+STRINGS["zh-TW"]["hidePasswords"] = "隱藏密碼";
+STRINGS["zh-TW"]["hidePasswordsAccessKey"] = "P";
+STRINGS["zh-TW"]["noMasterPasswordPrompt"] = "您確定要顯示密碼嗎?";
+STRINGS["zh-TW"]["showPasswords"] = "顯示密碼";
+STRINGS["zh-TW"]["showPasswordsAccessKey"] = "P";
+
var kSignonBundle;
+var showingPasswords = false;
var dateFormatter = new Intl.DateTimeFormat(undefined,
{ day: "numeric", month: "short", year: "numeric" });
var dateAndTimeFormatter = new Intl.DateTimeFormat(undefined,
{ day: "numeric", month: "short", year: "numeric",
hour: "numeric", minute: "numeric" });
function SignonsStartup() {
kSignonBundle = document.getElementById("signonBundle");
+ document.getElementById("togglePasswords").label = getLegacyString("showPasswords");
+ document.getElementById("togglePasswords").accessKey = getLegacyString("showPasswordsAccessKey");
document.getElementById("signonsIntro").textContent = kSignonBundle.getString("loginsDescriptionAll");
let treecols = document.getElementsByTagName("treecols")[0];
treecols.addEventListener("click", HandleTreeColumnClick.bind(null, SignonColumnSort));
LoadSignons();
// filter the table if requested by caller
@@ -71,24 +616,19 @@ var signonsTreeView = {
return dateFormatter.format(time);
case "timesUsedCol":
return signon.timesUsed;
default:
return "";
}
},
isEditable : function(row, col) {
- if (col.id == "userCol") {
+ if (col.id == "userCol" || col.id == "passwordCol") {
return true;
}
-
- if (col.id == "passwordCol") {
- return masterPasswordLogin();
- }
-
return false;
},
isSeparator : function(index) { return false; },
isSorted : function() { return false; },
isContainer : function(index) { return false; },
cycleHeader : function(column) {},
getRowProperties : function(row) { return ""; },
getColumnProperties : function(column) { return ""; },
@@ -125,36 +665,38 @@ var signonsTreeView = {
};
function LoadSignons() {
// loads signons into table
try {
signons = passwordmanager.getAllLogins();
} catch (e) {
- window.close();
- return;
+ signons = [];
}
signons.forEach(login => login.QueryInterface(Components.interfaces.nsILoginMetaInfo));
signonsTreeView.rowCount = signons.length;
// sort and display the table
signonsTree.view = signonsTreeView;
// The sort column didn't change. SortTree (called by
// SignonColumnSort) assumes we want to toggle the sort
// direction but here we don't so we have to trick it
lastSignonSortAscending = !lastSignonSortAscending;
SignonColumnSort(lastSignonSortColumn);
// disable "remove all signons" button if there are no signons
var element = document.getElementById("removeAllSignons");
+ var toggle = document.getElementById("togglePasswords");
if (signons.length == 0) {
element.setAttribute("disabled","true");
+ toggle.setAttribute("disabled","true");
} else {
element.removeAttribute("disabled");
+ toggle.removeAttribute("disabled");
}
return true;
}
function SignonSelected() {
var selections = GetTreeSelections(signonsTree);
if (selections.length) {
@@ -188,16 +730,44 @@ function DeleteAllSignons() {
var syncNeeded = (signonsTreeView._filterSet.length != 0);
DeleteAllFromTree(signonsTree, signonsTreeView,
signonsTreeView._filterSet.length ? signonsTreeView._filterSet : signons,
deletedSignons, "removeSignon", "removeAllSignons");
FinalizeSignonDeletions(syncNeeded);
Services.telemetry.getHistogramById("PWMGR_MANAGE_DELETED_ALL").add(1);
}
+function TogglePasswordVisible() {
+ if (showingPasswords || masterPasswordLogin(AskUserShowPasswords)) {
+ showingPasswords = !showingPasswords;
+ document.getElementById("togglePasswords").label = getLegacyString(showingPasswords ? "hidePasswords" : "showPasswords");
+ document.getElementById("togglePasswords").accessKey = getLegacyString(showingPasswords ? "hidePasswordsAccessKey" : "showPasswordsAccessKey");
+ document.getElementById("passwordCol").hidden = !showingPasswords;
+ _filterPasswords();
+ }
+
+ // Notify observers that the password visibility toggling is
+ // completed. (Mostly useful for tests)
+ Components.classes["@mozilla.org/observer-service;1"]
+ .getService(Components.interfaces.nsIObserverService)
+ .notifyObservers(null, "passwordmgr-password-toggle-complete", null);
+ Services.telemetry.getHistogramById("PWMGR_MANAGE_VISIBILITY_TOGGLED").add(showingPasswords);
+}
+
+function AskUserShowPasswords() {
+ var prompter = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService);
+ var dummy = { value: false };
+
+ // Confirm the user wants to display passwords
+ return prompter.confirmEx(window,
+ null,
+ getLegacyString("noMasterPasswordPrompt"), prompter.STD_YES_NO_BUTTONS,
+ null, null, null, null, dummy) == 0; // 0=="Yes" button
+}
+
function FinalizeSignonDeletions(syncNeeded) {
for (var s=0; s<deletedSignons.length; s++) {
passwordmanager.removeLogin(deletedSignons[s]);
Services.telemetry.getHistogramById("PWMGR_MANAGE_DELETED").add(1);
}
// If the deletion has been performed in a filtered view, reflect the deletion in the unfiltered table.
// See bug 405389.
if (syncNeeded) {
@@ -301,17 +871,17 @@ function SignonMatchesFilter(aSignon, aF
if (aSignon.hostname.toLowerCase().indexOf(aFilterValue) != -1)
return true;
if (aSignon.username &&
aSignon.username.toLowerCase().indexOf(aFilterValue) != -1)
return true;
if (aSignon.httpRealm &&
aSignon.httpRealm.toLowerCase().indexOf(aFilterValue) != -1)
return true;
- if (Services.logins.isLoggedIn && aSignon.password &&
+ if (showingPasswords && aSignon.password &&
aSignon.password.toLowerCase().indexOf(aFilterValue) != -1)
return true;
return false;
}
function FilterPasswords(aFilterValue, view) {
aFilterValue = aFilterValue.toLowerCase();
@@ -357,18 +927,19 @@ function _filterPasswords()
// if the view is not empty then select the first item
if (signonsTreeView.rowCount > 0)
signonsTreeView.selection.select(0);
document.getElementById("signonsIntro").textContent = kSignonBundle.getString("loginsDescriptionFiltered");
}
function CopyPassword() {
- // Don't copy passwords if a master password hasn't been entered.
- if (!masterPasswordLogin())
+ // Don't copy passwords if we aren't already showing the passwords & a master
+ // password hasn't been entered.
+ if (!showingPasswords && !masterPasswordLogin())
return;
// Copy selected signon's password to clipboard
var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].
getService(Components.interfaces.nsIClipboardHelper);
var row = document.getElementById("signonsTree").currentIndex;
var password = signonsTreeView.getCellText(row, {id : "passwordCol" });
clipboard.copyString(password);
Services.telemetry.getHistogramById("PWMGR_MANAGE_COPIED_PASSWORD").add(1);
@@ -411,17 +982,23 @@ function UpdateContextMenu() {
if (signonsTreeView.getCellText(selectedRow, { id: "userCol" }) != "") {
menuItems.get("context-copyusername").removeAttribute("disabled");
} else {
menuItems.get("context-copyusername").setAttribute("disabled", "true");
}
menuItems.get("context-editusername").removeAttribute("disabled");
menuItems.get("context-copypassword").removeAttribute("disabled");
- menuItems.get("context-editpassword").removeAttribute("disabled");
+
+ // Disable "Edit Password" if the password column isn't showing.
+ if (!document.getElementById("passwordCol").hidden) {
+ menuItems.get("context-editpassword").removeAttribute("disabled");
+ } else {
+ menuItems.get("context-editpassword").setAttribute("disabled", "true");
+ }
}
function masterPasswordLogin(noPasswordCallback) {
// This doesn't harm if passwords are not encrypted
var tokendb = Components.classes["@mozilla.org/security/pk11tokendb;1"]
.createInstance(Components.interfaces.nsIPK11TokenDB);
var token = tokendb.getInternalKeyToken();
@@ -450,8 +1027,23 @@ function escapeKeyHandler() {
window.close();
}
function OpenMigrator() {
const { MigrationUtils } = Cu.import("resource:///modules/MigrationUtils.jsm", {});
// We pass in the type of source we're using for use in telemetry:
MigrationUtils.showMigrationWizard(window, [MigrationUtils.MIGRATION_ENTRYPOINT_PASSWORDS]);
}
+
+function getLegacyString(aStringID) {
+ let locale = Cc["@mozilla.org/chrome/chrome-registry;1"].
+ getService(Ci.nsIXULChromeRegistry).
+ getSelectedLocale("passwordmgr");
+
+ let string = STRINGS["en-US"][aStringID];
+ try {
+ if (typeof(STRINGS[locale][aStringID]) == "string") {
+ string = STRINGS[locale][aStringID];
+ }
+ } catch (ex) {}
+
+ return string;
+}
--- a/toolkit/components/passwordmgr/content/passwordManager.xul
+++ b/toolkit/components/passwordmgr/content/passwordManager.xul
@@ -77,18 +77,19 @@
ignoreincolumnpicker="true"
sortDirection="ascending"/>
<splitter class="tree-splitter"/>
<treecol id="userCol" label="&treehead.username.label;" flex="25"
ignoreincolumnpicker="true"
data-field-name="username" persist="width"/>
<splitter class="tree-splitter"/>
<treecol id="passwordCol" label="&treehead.password.label;" flex="15"
- data-field-name="password" persist="width hidden"
- type="password"/>
+ ignoreincolumnpicker="true"
+ data-field-name="password" persist="width"
+ hidden="true"/>
<splitter class="tree-splitter"/>
<treecol id="timeCreatedCol" label="&treehead.timeCreated.label;" flex="10"
data-field-name="timeCreated" persist="width hidden"
hidden="true"/>
<splitter class="tree-splitter"/>
<treecol id="timeLastUsedCol" label="&treehead.timeLastUsed.label;" flex="20"
data-field-name="timeLastUsed" persist="width hidden"/>
<splitter class="tree-splitter"/>
@@ -111,16 +112,18 @@
label="&removeall.label;" accesskey="&removeall.accesskey;"
oncommand="DeleteAllSignons();"/>
<spacer flex="1"/>
#if defined(MOZ_BUILD_APP_IS_BROWSER) && defined(XP_WIN)
<button accesskey="&import.accesskey;"
label="&import.label;"
oncommand="OpenMigrator();"/>
#endif
+ <button id="togglePasswords"
+ oncommand="TogglePasswordVisible();"/>
</hbox>
</vbox>
<hbox align="end">
<hbox class="actionButtons" flex="1">
<spacer flex="1"/>
#ifndef XP_MACOSX
<button oncommand="close();" icon="close"
label="&closebutton.label;" accesskey="&closebutton.accesskey;"/>
--- a/toolkit/components/passwordmgr/test/browser/browser_passwordmgr_contextmenu.js
+++ b/toolkit/components/passwordmgr/test/browser/browser_passwordmgr_contextmenu.js
@@ -45,27 +45,28 @@ function test() {
assertMenuitemEnabled("copypassword", false);
assertMenuitemEnabled("editpassword", false);
info("Select the first row (with an empty username)");
selection.select(0);
assertMenuitemEnabled("copyusername", false, "empty username");
assertMenuitemEnabled("editusername", true);
assertMenuitemEnabled("copypassword", true);
- assertMenuitemEnabled("editpassword", true);
+ assertMenuitemEnabled("editpassword", false, "password column hidden");
info("Clear the selection");
selection.clearSelection();
assertMenuitemEnabled("copyusername", false);
assertMenuitemEnabled("editusername", false);
assertMenuitemEnabled("copypassword", false);
assertMenuitemEnabled("editpassword", false);
info("Select the third row and making the password column visible");
selection.select(2);
+ doc.getElementById("passwordCol").hidden = false;
assertMenuitemEnabled("copyusername", true);
assertMenuitemEnabled("editusername", true);
assertMenuitemEnabled("copypassword", true);
assertMenuitemEnabled("editpassword", true, "password column visible");
menuitem.doCommand();
}
function assertMenuitemEnabled(idSuffix, expected, reason = "") {
@@ -74,16 +75,17 @@ function test() {
is(actual, expected, idSuffix + " should be " + (expected ? "enabled" : "disabled") +
(reason ? ": " + reason : ""));
}
function cleanUp() {
Services.ww.registerNotification(function (aSubject, aTopic, aData) {
Services.ww.unregisterNotification(arguments.callee);
Services.logins.removeAllLogins();
+ doc.getElementById("passwordCol").hidden = true;
finish();
});
pwmgrdlg.close();
}
function testPassword() {
info("Testing Copy Password");
waitForClipboard("coded", function copyPassword() {
--- a/toolkit/components/passwordmgr/test/browser/browser_passwordmgr_editing.js
+++ b/toolkit/components/passwordmgr/test/browser/browser_passwordmgr_editing.js
@@ -27,16 +27,21 @@ function synthesizeDblClickOnCell(aTree,
let rect = tbo.getCoordsForCellItem(row, aTree.columns[column], "text");
let x = rect.x + rect.width / 2;
let y = rect.y + rect.height / 2;
// Simulate the double click.
EventUtils.synthesizeMouse(aTree.body, x, y, { clickCount: 2 },
aTree.ownerDocument.defaultView);
}
+function* togglePasswords() {
+ pwmgrdlg.document.querySelector("#togglePasswords").doCommand();
+ yield new Promise(resolve => waitForFocus(resolve, pwmgrdlg));
+}
+
function* editUsernamePromises(site, oldUsername, newUsername) {
is(Services.logins.findLogins({}, site, "", "").length, 1, "Correct login found");
let login = Services.logins.findLogins({}, site, "", "")[0];
is(login.username, oldUsername, "Correct username saved");
is(getUsername(0), oldUsername, "Correct username shown");
synthesizeDblClickOnCell(signonsTree, 1, 0);
yield ContentTaskUtils.waitForCondition(() => signonsTree.getAttribute("editing"),
"Waiting for editing");
@@ -104,17 +109,19 @@ add_task(function* test_setup() {
}, pwmgrdlg);
});
});
add_task(function* test_edit_multiple_logins() {
function* testLoginChange(site, oldUsername, oldPassword, newUsername, newPassword) {
addLogin(site, oldUsername, oldPassword);
yield* editUsernamePromises(site, oldUsername, newUsername);
+ yield* togglePasswords();
yield* editPasswordPromises(site, oldPassword, newPassword);
+ yield* togglePasswords();
}
yield* testLoginChange("http://c.tn/", "userC", "passC", "usernameC", "passwordC");
yield* testLoginChange("http://b.tn/", "userB", "passB", "usernameB", "passwordB");
yield* testLoginChange("http://a.tn/", "userA", "passA", "usernameA", "passwordA");
pwmgrdlg.close();
});
--- a/toolkit/components/passwordmgr/test/browser/browser_passwordmgr_sort.js
+++ b/toolkit/components/passwordmgr/test/browser/browser_passwordmgr_sort.js
@@ -62,16 +62,45 @@ function test() {
let doc = pwmgrdlg.document;
let win = doc.defaultView;
let sTree = doc.getElementById("signonsTree");
let filter = doc.getElementById("filter");
let siteCol = doc.getElementById("siteCol");
let userCol = doc.getElementById("userCol");
let passwordCol = doc.getElementById("passwordCol");
+ let toggleCalls = 0;
+ function toggleShowPasswords(func) {
+ let toggleButton = doc.getElementById("togglePasswords");
+ let showMode = (toggleCalls++ % 2) == 0;
+
+ // only watch for a confirmation dialog every other time being called
+ if (showMode) {
+ Services.ww.registerNotification(function (aSubject, aTopic, aData) {
+ if (aTopic == "domwindowclosed")
+ Services.ww.unregisterNotification(arguments.callee);
+ else if (aTopic == "domwindowopened") {
+ let win = aSubject.QueryInterface(Ci.nsIDOMEventTarget);
+ SimpleTest.waitForFocus(function() {
+ EventUtils.sendKey("RETURN", win);
+ }, win);
+ }
+ });
+ }
+
+ Services.obs.addObserver(function (aSubject, aTopic, aData) {
+ if (aTopic == "passwordmgr-password-toggle-complete") {
+ Services.obs.removeObserver(arguments.callee, aTopic);
+ func();
+ }
+ }, "passwordmgr-password-toggle-complete", false);
+
+ EventUtils.synthesizeMouse(toggleButton, 1, 1, {}, win);
+ }
+
function clickCol(col) {
EventUtils.synthesizeMouse(col, 20, 1, {}, win);
setTimeout(runNextTest, 0);
}
function setFilter(string) {
filter.value = string;
filter.doCommand();
@@ -168,11 +197,12 @@ function test() {
pwmgr.removeAllLogins();
finish();
});
pwmgrdlg.close();
}
}
- runNextTest();
+ // Toggle Show Passwords to display Password column, then start tests
+ toggleShowPasswords(runNextTest);
}
}
--- a/toolkit/components/passwordmgr/test/browser/browser_passwordmgrdlg.js
+++ b/toolkit/components/passwordmgr/test/browser/browser_passwordmgrdlg.js
@@ -52,44 +52,98 @@ function test() {
let view = tree.view;
is(filter.value, "", "Filter box should initially be empty");
is(view.rowCount, 10, "There should be 10 passwords initially");
// Prepare a set of tests
// filter: the text entered in the filter search box
// count: the number of logins which should match the respective filter
+ // count2: the number of logins which should match the respective filter
+ // if the passwords are being shown as well
+ // Note: if a test doesn't have count2 set, count is used instead.
let tests = [
- {filter: "pass", count: 4},
+ {filter: "pass", count: 0, count2: 4},
{filter: "", count: 10}, // test clearing the filter
{filter: "moz", count: 7},
{filter: "mozi", count: 7},
{filter: "mozil", count: 7},
{filter: "mozill", count: 7},
{filter: "mozilla", count: 7},
- {filter: "mozilla.com", count: 2},
+ {filter: "mozilla.com", count: 1, count2: 2},
{filter: "user", count: 4},
{filter: "user ", count: 1},
{filter: " user", count: 2},
{filter: "http", count: 10},
{filter: "https", count: 1},
- {filter: "secret", count: 2},
+ {filter: "secret", count: 0, count2: 2},
{filter: "secret!", count: 0},
];
- function runTests(endFunction) {
+ let toggleCalls = 0;
+ function toggleShowPasswords(func) {
+ let toggleButton = doc.getElementById("togglePasswords");
+ let showMode = (toggleCalls++ % 2) == 0;
+
+ // only watch for a confirmation dialog every other time being called
+ if (showMode) {
+ Services.ww.registerNotification(function (aSubject, aTopic, aData) {
+ if (aTopic == "domwindowclosed")
+ Services.ww.unregisterNotification(arguments.callee);
+ else if (aTopic == "domwindowopened") {
+ let win = aSubject.QueryInterface(Ci.nsIDOMEventTarget);
+ SimpleTest.waitForFocus(function() {
+ EventUtils.sendKey("RETURN", win);
+ }, win);
+ }
+ });
+ }
+
+ Services.obs.addObserver(function (aSubject, aTopic, aData) {
+ if (aTopic == "passwordmgr-password-toggle-complete") {
+ Services.obs.removeObserver(arguments.callee, aTopic);
+ func();
+ }
+ }, "passwordmgr-password-toggle-complete", false);
+
+ EventUtils.synthesizeMouse(toggleButton, 1, 1, {}, win);
+ }
+
+ function runTests(mode, endFunction) {
let testCounter = 0;
function setFilter(string) {
filter.value = string;
filter.doCommand();
}
function runOneTest(test) {
- is(view.rowCount, test.count, test.count + " logins should match '" + test.filter + "'");
+ function tester() {
+ is(view.rowCount, expected, expected + " logins should match '" + test.filter + "'");
+ }
+
+ let expected;
+ switch (mode) {
+ case 1: // without showing passwords
+ expected = test.count;
+ break;
+ case 2: // showing passwords
+ expected = ("count2" in test) ? test.count2 : test.count;
+ break;
+ case 3: // toggle
+ expected = test.count;
+ tester();
+ toggleShowPasswords(function () {
+ expected = ("count2" in test) ? test.count2 : test.count;
+ tester();
+ toggleShowPasswords(proceed);
+ });
+ return;
+ }
+ tester();
proceed();
}
function proceed() {
// run the next test if necessary or proceed with the tests
if (testCounter != tests.length)
runNextTest();
else
@@ -101,17 +155,29 @@ function test() {
setFilter(test.filter);
setTimeout(runOneTest, 0, test);
}
runNextTest();
}
function step1() {
- runTests(lastStep);
+ runTests(1, step2);
+ }
+
+ function step2() {
+ toggleShowPasswords(function() {
+ runTests(2, step3);
+ });
+ }
+
+ function step3() {
+ toggleShowPasswords(function() {
+ runTests(3, lastStep);
+ });
}
function lastStep() {
// cleanup
Services.ww.registerNotification(function (aSubject, aTopic, aData) {
// unregister ourself
Services.ww.unregisterNotification(arguments.callee);
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -8890,16 +8890,21 @@
"description": "Accumulates how the password management interface was opened. (0=Preferences, 1=Page Info)"
},
"PWMGR_MANAGE_SORTED": {
"expires_in_version": "never",
"keyed": true,
"kind": "count",
"description": "Reports the column that logins are sorted by"
},
+ "PWMGR_MANAGE_VISIBILITY_TOGGLED": {
+ "expires_in_version": "never",
+ "kind": "boolean",
+ "description": "Whether the visibility of passwords was toggled (0=Hide, 1=Show)"
+ },
"PWMGR_NUM_PASSWORDS_PER_HOSTNAME": {
"expires_in_version": "never",
"kind": "linear",
"high": 21,
"n_buckets" : 20,
"description": "The number of passwords per hostname"
},
"PWMGR_NUM_SAVED_PASSWORDS": {