Bug 1208145 - Revert bug 1121291 using hard-coded strings from Fx43. r=dolske a=ritu draft
authorMatthew Noorenberghe <mozilla@noorenberghe.ca>
Wed, 13 Jan 2016 16:26:13 -0800
changeset 321538 27c695911e2bdb381ef7737fb2e1f9418e289969
parent 321145 40e457de9ce8b1a167caf74d9e464d1d51e4fda7
child 321539 59569eb96bfd91633e91b92d8f2b2ae72d8bf8ca
child 321540 b0cd122897457e27ab29461387ac7b008fca4c27
push id9411
push usermozilla@noorenberghe.ca
push dateThu, 14 Jan 2016 00:30:28 +0000
reviewersdolske, ritu
bugs1208145, 1121291
milestone44.0
Bug 1208145 - Revert bug 1121291 using hard-coded strings from Fx43. r=dolske a=ritu
toolkit/components/passwordmgr/content/passwordManager.js
toolkit/components/passwordmgr/content/passwordManager.xul
toolkit/components/passwordmgr/test/browser/browser_passwordmgr_contextmenu.js
toolkit/components/passwordmgr/test/browser/browser_passwordmgr_editing.js
toolkit/components/passwordmgr/test/browser/browser_passwordmgr_sort.js
toolkit/components/passwordmgr/test/browser/browser_passwordmgrdlg.js
toolkit/components/telemetry/Histograms.json
--- 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": {