Compare commits

..

683 Commits

Author SHA1 Message Date
Danny Coates
cda38f9bcf v2.5.3 2018-03-29 00:03:04 -07:00
Danny Coates
cc9b622bde fixed cryptofill on edge 2018-03-28 22:03:46 -07:00
Danny Coates
fb91fd03cc adjusted selectbox styles 2018-03-27 23:19:07 -07:00
rcmainak
77e3b5a3e6 Replaced the selectbox with native HTML <select> 2018-03-27 21:40:59 -07:00
صفا الفليج
0ed5c7f1e7 Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- صفا الفليج <safa1996alfulaij@gmail.com>
2018-03-26 01:32:08 +00:00
Alberto Castro
5afadd4ff1 Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Alberto Castro <albertdcastro@gmail.com>
- Rodrigo <rodrigo.mcunha@hotmail.com>
2018-03-22 17:10:58 +00:00
వీవెన్
0f53c718a2 Pontoon: Update Telugu (te) localization of Test Pilot: Firefox Send
Localization authors:
- వీవెన్ <veeven@gmail.com>
2018-03-22 16:31:46 +00:00
Gonçalo Matos
ad4e6c8dec Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Alberto Castro <albertdcastro@gmail.com>
- Gonçalo Matos <goncalo.matos@me.com>
- Rodrigo <rodrigo.mcunha@hotmail.com>
2018-03-22 02:31:41 +00:00
Rodrigo
9e0195deaa Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2018-03-22 02:12:00 +00:00
Rodrigo
253216e6fc Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2018-03-21 20:10:48 +00:00
Roberto Alvarado
78eab6335d Pontoon: Update Spanish (Mexico) (es-MX) localization of Test Pilot: Firefox Send
Localization authors:
- Roberto Alvarado <ralv888@gmail.com>
2018-03-19 22:11:09 +00:00
Enol
1d20b5ba11 Pontoon: Update Asturian (ast) localization of Test Pilot: Firefox Send
Localization authors:
- Enol <enolp@softastur.org>
2018-03-15 15:11:13 +00:00
Danny Coates
1edc571b36 v2.5.2 2018-03-14 09:12:26 -07:00
Danny Coates
e3556aa7e1 updated cryptofill to support Android Firefox. fixes #790 2018-03-13 21:11:27 -07:00
Jobava
aa94a75da9 Pontoon: Update Romanian (ro) localization of Test Pilot: Firefox Send
Localization authors:
- Jobava <jobaval10n@gmail.com>
2018-03-13 20:51:11 +00:00
Danny Coates
ecd61830aa v2.5.1 2018-03-12 12:26:37 -07:00
Danny Coates
da82ef814b MS Edge hacks 2018-03-12 12:24:43 -07:00
Danny Coates
b840173429 Merge pull request #789 from RCMainak/issue_775
Fixed #775 : Made text not-selectable
2018-03-12 10:43:53 -07:00
rcmainak
e1dc1687fc Fixed #775 : Made text not-selectable 2018-03-12 23:09:00 +05:30
Danny Coates
3e6a88d31d render header and footer only once. fixes #788 2018-03-12 10:15:11 -07:00
Melo46
94714ecb62 Pontoon: Update Interlingua (ia) localization of Test Pilot: Firefox Send
Localization authors:
- Melo46 <melo@carmu.com>
2018-03-09 00:50:44 +00:00
Danny Coates
07a817266c v2.5.0 2018-03-08 11:31:35 -08:00
Vitaliy Krutko
706708876c Pontoon: Update Ukrainian (uk) localization of Test Pilot: Firefox Send
Localization authors:
- Vitaliy Krutko <asmforce@ukr.net>
2018-03-08 17:52:01 +00:00
Frederick Villaluna
fc4cbe4b74 Pontoon: Update Tagalog (tl) localization of Test Pilot: Firefox Send
Localization authors:
- Frederick Villaluna <fv_comscie@yahoo.com>
2018-03-08 17:51:57 +00:00
ravmn
9e8429cff3 Pontoon: Update Spanish (Chile) (es-CL) localization of Test Pilot: Firefox Send
Localization authors:
- ravmn <ravmn@ravmn.cl>
2018-03-08 17:51:54 +00:00
Gabriela
f8db7ca923 Pontoon: Update Spanish (Argentina) (es-AR) localization of Test Pilot: Firefox Send
Localization authors:
- Gabriela <gmontagu@gmail.com>
2018-03-08 17:51:51 +00:00
Rok Žerdin
70e4d9eeb0 Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Rok Žerdin <rok.zerdin1990@gmail.com>
2018-03-08 17:51:48 +00:00
Jobava
410ec72fff Pontoon: Update Romanian (ro) localization of Test Pilot: Firefox Send
Localization authors:
- Jobava <jobaval10n@gmail.com>
2018-03-08 17:51:45 +00:00
Arash Mousavi
a42a517896 Pontoon: Update Persian (fa) localization of Test Pilot: Firefox Send
Localization authors:
- Arash Mousavi <mousavi.arash@gmail.com>
2018-03-08 17:51:42 +00:00
Håvar Henriksen
d9c9d95b89 Pontoon: Update Norwegian Bokmål (nb-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Håvar Henriksen <havar@firefox.no>
2018-03-08 17:51:39 +00:00
Alfredos-Panagiotis Damkalis
0ed10649ef Pontoon: Update Greek (el) localization of Test Pilot: Firefox Send
Localization authors:
- Alfredos-Panagiotis Damkalis <fredy@fredy.gr>
2018-03-08 17:51:36 +00:00
Fjoerfoks
4edf82cc21 Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2018-03-08 17:51:33 +00:00
Merike Sell
775726ae6d Pontoon: Update Estonian (et) localization of Test Pilot: Firefox Send
Localization authors:
- Merike Sell <merikes@gmail.com>
2018-03-08 17:51:30 +00:00
Michal Vašíček
5aeaf2e987 Pontoon: Update Czech (cs) localization of Test Pilot: Firefox Send
Localization authors:
- Michal Vašíček <michalvasicek@icloud.com>
- Michal Stanke <mstanke@mozilla.cz>
2018-03-08 17:51:27 +00:00
Emin Mastizada
773244f320 Pontoon: Update Azerbaijani (az) localization of Test Pilot: Firefox Send
Localization authors:
- Emin Mastizada <emin@mastizada.com>
2018-03-08 17:51:23 +00:00
Danny Coates
5079d9a317 Merge pull request #782 from mozilla/docs
updated docs
2018-03-07 15:20:11 -08:00
Danny Coates
18e1609cb3 updated docs 2018-03-07 15:01:08 -08:00
Danny Coates
41796840c4 Merge pull request #781 from timvisee/master
Don't translate URL-safe chars, b64 is doing it for us
2018-03-06 08:44:53 -08:00
timvisee
171b64bc98 Don't translate URL-safe chars, b64 is doing it for us 2018-03-06 14:38:29 +01:00
Danny Coates
cfc94fd9af built assets are webpack cacheable 2018-03-02 13:58:05 -08:00
Danny Coates
914394054e encapsulate translate function creation 2018-03-02 13:40:29 -08:00
Danny Coates
7a237b9b68 reduced the size of cryptofill 2018-03-02 12:21:59 -08:00
Danny Coates
80e9f129d8 ignore some lint warnings 2018-03-01 21:36:45 -08:00
Danny Coates
fddf1c40dc fixed password input style on small screens 2018-03-01 21:33:59 -08:00
Danny Coates
557db53d39 updated browserlist 2018-03-01 14:52:00 -08:00
Danny Coates
c16e00e5af Merge pull request #779 from mozilla/edgy
implemented crypto polyfills for ms edge
2018-03-01 13:21:45 -08:00
Danny Coates
cd7da20024 implemented crypto polyfills for ms edge 2018-03-01 13:10:57 -08:00
Danny Coates
5f44ed2598 v2.4.1 2018-02-28 09:05:44 -08:00
Danny Coates
5c0cfdcf38 Merge pull request #777 from mozilla/i771
use a separate circle in the progress svg for indefinite progress
2018-02-28 09:02:54 -08:00
Danny Coates
2de5378208 use a separate circle in the progress svg for indefinite progress. fixes #771 2018-02-28 08:57:35 -08:00
Danny Coates
a2aca89550 set removeViewBox: false on svgo 2018-02-26 20:28:51 -08:00
Danny Coates
8d658dc159 v2.4.0 2018-02-26 17:55:29 -08:00
Danny Coates
fb8e0afd85 fixed checkFiles bug 2018-02-26 17:50:58 -08:00
Danny Coates
5263839731 undo a fup from previous commit 2018-02-26 13:54:41 -08:00
Danny Coates
484063a596 fixed some html nits 2018-02-26 13:49:26 -08:00
Danny Coates
5650c7f778 Merge pull request #769 from mozilla/i740
removed unsafe-inline styles via svgo-loader
2018-02-26 11:52:42 -08:00
Danny Coates
74728782f3 removed unsafe-inline styles via svgo-loader. fixes #740 2018-02-26 11:48:28 -08:00
Danny Coates
0a0980f9e3 Merge pull request #767 from mozilla/circl
added coverage artifact to circleci
2018-02-26 10:15:37 -08:00
Danny Coates
26c46b8488 added coverage artifact to circleci 2018-02-26 10:09:28 -08:00
Danny Coates
c469696687 ignore all branch pushes for stage builds 2018-02-25 17:14:37 -08:00
Danny Coates
27550a7781 fix? circleci deploy 2018-02-25 17:06:28 -08:00
Danny Coates
e79bacd268 Merge pull request #766 from mozilla/frontend-tests
Some frontend unit tests [WIP]
2018-02-25 16:53:02 -08:00
Danny Coates
fd2dfcc4f2 circleci v2 2018-02-25 16:39:45 -08:00
Danny Coates
74b9e364fe updated deps 2018-02-25 10:59:35 -08:00
Filip Hruška
d2412679ea Pontoon: Update Czech (cs) localization of Test Pilot: Firefox Send
Localization authors:
- Michal Stanke <mstanke@mozilla.cz>
- Filip Hruška <fhr@fhrnet.eu>
2018-02-25 12:10:47 +00:00
Марко Костић (Marko Kostić)
98e6fc3b4a Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Марко Костић (Marko Kostić) <marko.m.kostic@gmail.com>
2018-02-25 08:10:19 +00:00
Slimane Amiri
b64b2a3091 Pontoon: Update Kabyle (kab) localization of Test Pilot: Firefox Send
Localization authors:
- Slimane Amiri <slimane.amiri@gmail.com>
2018-02-25 07:50:44 +00:00
Slimane Amiri
6275f3abf7 Pontoon: Update Kabyle (kab) localization of Test Pilot: Firefox Send
Localization authors:
- Slimane Amiri <slimane.amiri@gmail.com>
2018-02-25 07:31:42 +00:00
Danny Coates
22e836c98a removed unused deps 2018-02-24 18:00:43 -08:00
Danny Coates
d6c0489fa3 more frontend tests and some factoring based on them 2018-02-24 12:57:19 -08:00
Danny Coates
78728ce4ca some frontend unit tests 2018-02-24 11:21:48 -08:00
Bjørn I
6803a34b51 Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Bjørn I. <bjorn.svindseth@online.no>
2018-02-24 09:32:28 +00:00
jlG
42b6383283 Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- jlG <jlg.l10n.es@gmail.com>
2018-02-23 21:32:57 +00:00
Georgianizator
147f009279 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2018-02-23 17:52:11 +00:00
Andreas Pettersson
b899781b69 Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Andreas Pettersson <az@kth.se>
2018-02-23 16:51:56 +00:00
Alexander Slovesnik
64d0819ab4 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Alexander Slovesnik <unghost@mozilla-russia.org>
2018-02-23 13:31:50 +00:00
Rhoslyn Prys
3ea4af816a Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2018-02-23 11:51:38 +00:00
Pin-guang Chen
037d2c6974 Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2018-02-23 11:51:24 +00:00
Ton
fe2c664474 Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Ton <tonnes.mb@gmail.com>
2018-02-23 09:50:46 +00:00
Nihad Suljić
a3d429b9c3 Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad Suljić <nihad.suljic92@gmail.com>
2018-02-23 06:51:18 +00:00
manxmensch
d0e6f4118d Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2018-02-23 02:12:08 +00:00
Kohei Yoshino
75fb58e454 Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2018-02-23 01:31:39 +00:00
Selim Şumlu
6563b7fd11 Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2018-02-22 23:30:59 +00:00
Maykon Chagas
e1b78174e2 Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Maykon Chagas <mchagas@riseup.net>
2018-02-22 20:51:34 +00:00
Michael Wolf
aab7e25f80 Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-02-22 20:12:32 +00:00
Michael Wolf
24b2ba7b35 Pontoon: Update Sorbian, Lower (dsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-02-22 20:12:28 +00:00
Juan Esteban Ajsivinac Sián
20ae667b3b Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2018-02-22 20:12:24 +00:00
Juraj Cigáň
d8cb9da483 Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2018-02-22 19:51:15 +00:00
Besnik Bleta
8abce2ccf3 Pontoon: Update Albanian (sq) localization of Test Pilot: Firefox Send
Localization authors:
- Besnik Bleta <besnik@programeshqip.org>
2018-02-22 19:31:23 +00:00
Rodrigo
aa3ebd3bd2 Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2018-02-22 19:12:18 +00:00
Michael Köhler
4929437283 Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2018-02-22 18:51:36 +00:00
Balázs Meskó
389dd19a8a Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2018-02-22 18:31:38 +00:00
Francesco Lodolo
a8b6b3335b Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Francesco Lodolo <francesco.lodolo@mozillaitalia.org>
2018-02-22 17:50:43 +00:00
Théo Chevalier
a925e2fae0 Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2018-02-22 17:31:29 +00:00
YFdyh000
dc79b5923e Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2018-02-22 17:31:25 +00:00
Danny Coates
b39bbaf6fb Merge pull request #761 from mozilla/i741
added maxPasswordLength and passwordError messages
2018-02-22 09:10:26 -08:00
Danny Coates
14b40d820b added password setting error UI 2018-02-22 09:01:29 -08:00
Rhoslyn Prys
354d5963ec Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2018-02-22 15:51:26 +00:00
Victor Bychek
6a32b94336 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2018-02-22 10:31:30 +00:00
Danny Coates
5c68437b1c trimmed progress.css 2018-02-21 16:59:54 -08:00
Danny Coates
0106f280f0 removed unused css class on preview page 2018-02-21 16:53:14 -08:00
Danny Coates
b567aaac69 updated preview page 2018-02-21 16:40:52 -08:00
Danny Coates
36b419202b updated notFound page 2018-02-21 16:33:06 -08:00
Danny Coates
c80d01c648 updated error page 2018-02-21 16:28:40 -08:00
Danny Coates
1d00646b17 go back to faster createObjectURL for saveFile on non-iOS 2018-02-21 15:43:32 -08:00
Danny Coates
e4b98fe65a moved saveFile from utils to fileReceiver 2018-02-21 14:58:41 -08:00
Danny Coates
12443db891 Merge pull request #764 from mozilla/prog
added indefinite progress mode
2018-02-21 14:17:11 -08:00
Danny Coates
03f08de32f added indefinite progress mode 2018-02-21 13:59:06 -08:00
Danny Coates
c18f488be7 added maxPasswordLength and passwordError messages 2018-02-21 10:03:19 -08:00
Danny Coates
099012fac9 updated password input behavior. fixes #762 & fixes #763 2018-02-21 09:55:04 -08:00
Jordi Serratosa
fa510af65a Pontoon: Update Catalan (ca) localization of Test Pilot: Firefox Send
Localization authors:
- Jordi Serratosa <jordis@softcatala.cat>
2018-02-21 17:11:33 +00:00
Luna Jernberg
46b514cc61 Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Luna Jernberg <bittin@cafe8bitar.se>
2018-02-21 14:12:13 +00:00
Danny Coates
019c8814f6 disable nanotiming without localstorage (as of 7.3.0) 2018-02-20 16:00:19 -08:00
Danny Coates
46249935b2 moved babel-polyfill to prod deps 2018-02-20 12:52:44 -08:00
Danny Coates
ebecc6bb81 updated download password input style 2018-02-20 12:21:00 -08:00
Danny Coates
130ddca135 make 'change' button visible by default after pwd set 2018-02-20 11:27:56 -08:00
Danny Coates
f2661989dc updated deps 2018-02-20 10:56:16 -08:00
Roberto Alvarado
3f6cb8c356 Pontoon: Update Spanish (Mexico) (es-MX) localization of Test Pilot: Firefox Send
Localization authors:
- Roberto Alvarado <ralv888@gmail.com>
2018-02-20 18:51:01 +00:00
YFdyh000
228d9cca6c Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2018-02-20 18:33:03 +00:00
Марко Костић (Marko Kostić)
d08a1dd2ca Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Марко Костић (Marko Kostić) <marko.m.kostic@gmail.com>
2018-02-20 18:11:41 +00:00
Selim Şumlu
7d76a60db7 Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2018-02-20 13:11:34 +00:00
Ton
e4f0865067 Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Ton <tonnes.mb@gmail.com>
2018-02-20 10:50:53 +00:00
Rok Žerdin
cad4bd7c04 Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Rok Žerdin <rok.zerdin1990@gmail.com>
2018-02-20 10:11:54 +00:00
Nihad Suljić
f85aaf0370 Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad Suljić <nihad.suljic92@gmail.com>
2018-02-20 10:11:50 +00:00
Michael Köhler
312d78617d Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2018-02-20 08:50:58 +00:00
Balázs Meskó
af5aa12fa1 Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2018-02-20 08:31:19 +00:00
Håvar Henriksen
1c7e2edae0 Pontoon: Update Norwegian Bokmål (nb-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Håvar Henriksen <havar@firefox.no>
2018-02-20 08:11:41 +00:00
Fjoerfoks
a49eee9685 Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2018-02-20 07:50:53 +00:00
Danny Coates
61938c8e66 fixed css bundle filename hash 2018-02-19 23:44:18 -08:00
manxmensch
76d10f5920 Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2018-02-20 07:11:54 +00:00
صفا الفليج
2cf85926e9 Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- صفا الفليج <safa1996alfulaij@gmail.com>
2018-02-20 07:11:51 +00:00
Danny Coates
afb099f9df updated noscript style 2018-02-19 23:10:03 -08:00
Pin-guang Chen
343627eb82 Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2018-02-20 05:31:40 +00:00
Francesco Lodolo
86f2477c63 Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Francesco Lodolo <francesco.lodolo@mozillaitalia.org>
2018-02-20 04:50:41 +00:00
Frederick Villaluna
2684150141 Pontoon: Update Tagalog (tl) localization of Test Pilot: Firefox Send
Localization authors:
- Frederick Villaluna <fv_comscie@yahoo.com>
2018-02-20 03:11:09 +00:00
Maykon Chagas
3f8d8d055d Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Maykon Chagas <mchagas@riseup.net>
2018-02-20 01:32:00 +00:00
Georgianizator
e775e0542e Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2018-02-20 00:51:15 +00:00
Danny Coates
7992ba5bc1 tweaked password input style 2018-02-19 16:22:17 -08:00
Rodrigo
d24bbaa65a Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2018-02-20 00:10:28 +00:00
Kohei Yoshino
58a91e1b86 Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2018-02-19 23:31:29 +00:00
Kohei Yoshino
cfed1d0230 Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2018-02-19 23:10:56 +00:00
Danny Coates
b14c70f4b6 fixed file button style on input focus 2018-02-19 15:06:46 -08:00
Danny Coates
ad77fc20c6 fixed dnd after css changes 2018-02-19 14:29:13 -08:00
Danny Coates
029633f3d3 tweaked input styles 2018-02-19 14:02:26 -08:00
Michael Wolf
78459d759c Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-02-19 21:51:15 +00:00
Michael Wolf
a0d5a3dd07 Pontoon: Update Sorbian, Lower (dsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-02-19 21:51:13 +00:00
Juan Esteban Ajsivinac Sián
d76d983d5d Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2018-02-19 21:51:10 +00:00
Juraj Cigáň
68b8e7dc7c Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2018-02-19 21:31:59 +00:00
Théo Chevalier
1a7aff5102 Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2018-02-19 21:31:56 +00:00
Danny Coates
677edffb80 Merge pull request #760 from mozilla/refactor-css
refactored css: phase 1
2018-02-19 13:10:10 -08:00
ybouhamam
2cd90c998b Pontoon: Update Kabyle (kab) localization of Test Pilot: Firefox Send
Localization authors:
- ybouhamam <ybouhamam@gmail.com>
2018-02-18 20:32:16 +00:00
Danny Coates
346e604f34 updated password input UI 2018-02-17 15:07:47 -08:00
Danny Coates
8d41111cd6 refactored css, including some markup changes 2018-02-15 15:54:59 -08:00
Danny Coates
3163edcbe4 exclude fxios from fxPromo banner. fixes #753 2018-02-15 11:49:41 -08:00
Danny Coates
18df43c9cb Merge pull request #759 from flodolo/ftl_en
Switch en-US FTL file to new syntax
2018-02-15 08:56:56 -08:00
Francesco Lodolo [:flod]
4f2179c4d7 Switch en-US FTL file to new syntax 2018-02-15 11:24:21 +01:00
Danny Coates
b89546ac22 ignore stylelint until refactor-css is merged 2018-02-14 10:47:09 -08:00
Danny Coates
c0ad7635f2 change saveFile. attempting to fix for iOS 2018-02-14 09:29:37 -08:00
Bjørn I
a82688163e Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Bjørn I. <bjorn.svindseth@online.no>
2018-02-14 11:11:09 +00:00
Danny Coates
29c36ee110 updated deps 2018-02-12 11:39:35 -08:00
Merike Sell
43698f8d61 Pontoon: Update Estonian (et) localization of Test Pilot: Firefox Send
Localization authors:
- Merike Sell <merikes@gmail.com>
2018-02-12 18:10:42 +00:00
Danny Coates
b5b29aeb17 focus download password input on render. fixes #745 2018-02-12 09:53:34 -08:00
Melo46
fdcf4c152a Pontoon: Update Interlingua (ia) localization of Test Pilot: Firefox Send
Localization authors:
- Melo46 <melo@carmu.com>
2018-02-12 08:10:33 +00:00
Danny Coates
dcfda9521b nit: use 'html/raw' instead of html() where possible 2018-02-11 14:03:00 -08:00
Jim Spentzos
950c9cdaeb Pontoon: Update Greek (el) localization of Test Pilot: Firefox Send
Localization authors:
- Jim Spentzos <jamesspentzos@hotmail.com>
2018-02-10 20:32:06 +00:00
Danny Coates
1e9641a40e Merge pull request #758 from mozilla/refactor-backend
refactored server
2018-02-09 15:10:22 -08:00
Danny Coates
3fd2537311 refactored server 2018-02-09 15:03:05 -08:00
Danny Coates
6d470b8eba Merge pull request #757 from stasm/update-fluent-0.4.3
Update to fluent 0.4.3
2018-02-09 09:33:52 -08:00
Staś Małolepszy
71ad81a67d Update to fluent 0.4.3 2018-02-09 15:22:41 +01:00
Juan Esteban Ajsivinac Sián
9a1852ea05 Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2018-02-08 20:10:59 +00:00
Besnik Bleta
629a86de99 Pontoon: Update Albanian (sq) localization of Test Pilot: Firefox Send
Localization authors:
- Besnik Bleta <besnik@programeshqip.org>
2018-02-08 15:31:55 +00:00
Mozilla Pontoon
3539868683 Pontoon: Update Romanian (ro) localization of Test Pilot: Firefox Send 2018-02-08 07:50:55 +00:00
Mozilla Pontoon
71d4566df5 Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send 2018-02-08 07:50:52 +00:00
Mozilla Pontoon
caaa613ce9 Pontoon: Update Interlingua (ia) localization of Test Pilot: Firefox Send 2018-02-08 07:50:49 +00:00
Danny Coates
cf36a33aea localize other displayed numbers 2018-02-07 19:46:18 -08:00
Danny Coates
a777a808ee renamed localization ctx global to reduce the chance of collision (seen in sentry) 2018-02-07 19:18:11 -08:00
Danny Coates
a78150b7ad disable nanotiming 2018-02-07 18:52:41 -08:00
Danny Coates
deb177c6bb updated availableLanguages and localized progress percentage. fixes #747 2018-02-07 12:09:23 -08:00
Danny Coates
1c5e47b4c4 validate id param without middleware 2018-02-05 17:21:32 -08:00
Danny Coates
aae61f9451 extracted server id validation 2018-02-05 16:37:06 -08:00
Khaled Hosny
807c44f057 Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- Khaled Hosny <khaledhosny@eglug.org>
2018-02-06 00:11:42 +00:00
Khaled Hosny
9782007f7e Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- Khaled Hosny <khaledhosny@eglug.org>
2018-02-05 23:50:56 +00:00
Danny Coates
77d5f1e603 fixed welcome page flicker 2018-02-05 13:28:38 -08:00
Michal Vašíček
81ee6de0a3 Pontoon: Update Czech (cs) localization of Test Pilot: Firefox Send
Localization authors:
- Michal Vašíček <michalvasicek@icloud.com>
- Filip Hruška <fhr@fhrnet.eu>
2018-02-05 18:10:59 +00:00
Danny Coates
82fe65ada2 v2.3.1 2018-02-05 09:34:22 -08:00
Danny Coates
ce79d7b745 reset FileReceiver on cancel. fixes #751 2018-02-05 09:11:42 -08:00
Rhoslyn Prys
755cc4f5ec Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2018-02-05 12:12:00 +00:00
Danny Coates
fde4d311e3 added FileReceiver.reset 2018-02-04 18:30:33 -08:00
Sara Todaro
b08f40aaa3 Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Sara Todaro <sara.todaro@mozillaitalia.org>
2018-02-04 21:11:34 +00:00
Victor Bychek
e12ade6b31 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2018-02-04 11:32:24 +00:00
Sara Todaro
43fc80ef41 Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Sara Todaro <sara.todaro@mozillaitalia.org>
- Winfox <openlib@email.it>
2018-02-04 10:50:45 +00:00
Georgianizator
6ca96157f6 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2018-02-04 10:12:00 +00:00
jlG
856181ea54 Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- jlG <jlg.l10n.es@gmail.com>
- Jordi Cuevas <jordicuevas@gmail.com>
2018-02-03 23:31:26 +00:00
Jordi Cuevas
f84bd46cdc Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- Jordi Cuevas <jordicuevas@gmail.com>
2018-02-03 23:12:07 +00:00
Victor Bychek
0b43924ee2 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2018-02-03 18:32:13 +00:00
Selim Şumlu
16d3fd3828 Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2018-02-03 17:50:50 +00:00
Danny Coates
cf5defa6a9 fixed file list time wrap. fixes #749 2018-02-02 10:37:28 -08:00
Danny Coates
3de760db12 added fileTooBig alert to drop handler. fixes #578 2018-02-02 10:22:32 -08:00
Danny Coates
1366f0b68e moved ownedFile.type assignment 2018-02-02 10:15:17 -08:00
Danny Coates
be498e0bd3 /api/info values should be numbers. fixes #748 2018-02-02 10:10:51 -08:00
Danny Coates
a4e13f032a v2.3.0 2018-02-01 15:27:47 -08:00
Danny Coates
fef3136b1b updated dependencies 2018-02-01 13:42:27 -08:00
Danny Coates
6b318c248f tiny password input style fix 2018-02-01 13:20:53 -08:00
Danny Coates
fd6a3a5579 return false from form submit handlers 2018-02-01 12:49:18 -08:00
Danny Coates
2292267e39 remove download cancel button while decrypting 2018-02-01 11:42:07 -08:00
Danny Coates
dbfae53222 added autofocus to download password input 2018-02-01 10:41:52 -08:00
Roberto Alvarado
d39ed267f3 Pontoon: Update Spanish (Mexico) (es-MX) localization of Test Pilot: Firefox Send
Localization authors:
- Roberto Alvarado <ralv888@gmail.com>
2018-02-01 18:09:40 +00:00
Danny Coates
9d04ad704a fixes #746 password input style 2018-01-31 16:57:25 -08:00
Danny Coates
11cbb4df23 refactored dl-file html 2018-01-31 16:26:59 -08:00
Danny Coates
232911f725 fixed download preview page render issues and links 2018-01-31 15:47:34 -08:00
Emin Mastizada
41a0c6c73f Pontoon: Update Azerbaijani (az) localization of Test Pilot: Firefox Send
Localization authors:
- Emin Mastizada <emin@mastizada.com>
2018-01-31 21:50:59 +00:00
Danny Coates
10e80edb1d Merge pull request #536 from ehuggett/on-redis-expire
use redis expire event to delete stored data immediately
2018-01-31 13:23:33 -08:00
Danny Coates
af3848586c Merge branch 'master' into on-redis-expire 2018-01-31 13:10:05 -08:00
Danny Coates
48807bf030 Merge pull request #744 from mozilla/gradients
Gradient experiment
2018-01-31 12:15:15 -08:00
Andreas Pettersson
21a14cb225 Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Andreas Pettersson <az@kth.se>
2018-01-31 19:50:51 +00:00
Matjaž Horvat
b725d07744 Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Matjaž Horvat <matjaz.horvat@gmail.com>
2018-01-31 19:50:48 +00:00
Danny Coates
94e707da8a added gradient experiment 2018-01-31 11:46:29 -08:00
Danny Coates
4fb4041f13 sender no longer needs file nonce 2018-01-31 11:12:36 -08:00
gmontagu
545da556d2 Pontoon: Update Spanish (Argentina) (es-AR) localization of Test Pilot: Firefox Send
Localization authors:
- gmontagu <gmontagu@gmail.com>
2018-01-31 18:32:41 +00:00
ravmn
9f3da3454f Pontoon: Update Spanish (Chile) (es-CL) localization of Test Pilot: Firefox Send
Localization authors:
- ravmn <ravmn@ravmn.cl>
2018-01-31 15:31:47 +00:00
Luna Jernberg
15105426b1 Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Luna Jernberg <bittin@cafe8bitar.se>
2018-01-31 14:30:42 +00:00
Mark Heijl
b2d2e27945 Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Mark Heijl <markh@babelzilla.org>
2018-01-31 10:50:32 +00:00
Balázs Meskó
d93a4cf9f3 Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- siparon <siparon@gmail.com>
- Balázs Meskó <meskobalazs@gmail.com>
2018-01-31 09:10:35 +00:00
Fjoerfoks
8c3ec5da3d Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2018-01-31 08:10:40 +00:00
Nihad Suljić
d067b1d55a Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad Suljić <nihad.suljic92@gmail.com>
2018-01-31 07:11:19 +00:00
Håvar Henriksen
55070ace8b Pontoon: Update Norwegian Bokmål (nb-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Håvar Henriksen <havar@firefox.no>
2018-01-31 06:50:33 +00:00
Frederick Villaluna
0f35961173 Pontoon: Update Tagalog (tl) localization of Test Pilot: Firefox Send
Localization authors:
- Frederick Villaluna <fv_comscie@yahoo.com>
2018-01-31 04:50:57 +00:00
Pin-guang Chen
b63f68bf74 Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2018-01-31 04:50:52 +00:00
reza.habibi2008
8c6d6db07e Pontoon: Update Persian (fa) localization of Test Pilot: Firefox Send
Localization authors:
- reza.habibi2008 <reza.habibi2008@gmail.com>
2018-01-31 03:50:19 +00:00
Danny Coates
a74a70fd8c Merge pull request #739 from mozilla/fileInfo
added /api/info/:id route
2018-01-30 17:46:31 -08:00
Danny Coates
97ad674be2 added /api/info/:id route 2018-01-30 17:29:51 -08:00
Melo46
81534d2c13 Pontoon: Update Interlingua (ia) localization of Test Pilot: Firefox Send
Localization authors:
- Melo46 <melo@carmu.com>
2018-01-31 00:10:40 +00:00
manxmensch
51b7036456 Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2018-01-30 23:31:27 +00:00
YFdyh000
e40fdad251 Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2018-01-30 22:10:42 +00:00
YFdyh000
e4b0e97ac0 Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2018-01-30 21:50:28 +00:00
Juraj Cigáň
003320ca34 Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2018-01-30 21:31:17 +00:00
Kohei Yoshino
780addc50b Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2018-01-30 21:10:54 +00:00
Maykon Chagas
8892a5f43d Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Maykon Chagas <mchagas@riseup.net>
2018-01-30 20:11:12 +00:00
Théo Chevalier
75e52ebca7 Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2018-01-30 20:11:09 +00:00
Juan Esteban Ajsivinac Sián
e7b3bbcd0e Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2018-01-30 19:50:38 +00:00
Michael Köhler
b9d60639e2 Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2018-01-30 19:50:35 +00:00
Michael Wolf
2ce0ce65e1 Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-01-30 19:10:46 +00:00
Michael Wolf
a32bdcb06a Pontoon: Update Sorbian, Lower (dsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-01-30 19:10:43 +00:00
Марко Костић (Marko Kostić)
f9f8dff8b4 Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Марко Костић (Marko Kostić) <marko.m.kostic@gmail.com>
2018-01-30 19:10:40 +00:00
Rok Žerdin
5c5cd1e501 Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Rok Žerdin <rok.zerdin1990@gmail.com>
2018-01-30 18:50:30 +00:00
Rodrigo
89bcd1c4a8 Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2018-01-30 18:50:27 +00:00
Danny Coates
6b7b142961 Merge pull request #737 from mozilla/refactor
big refactor
2018-01-30 09:52:22 -08:00
Danny Coates
565e47aef8 big refactor 2018-01-30 09:37:42 -08:00
Ashikur Rahman
dd448cb3ed Pontoon: Update Bengali (Bangladesh) (bn-BD) localization of Test Pilot: Firefox Send
Localization authors:
- Ashikur Rahman <ashikurrahman068@gmail.com>
- S M Sarwar Nobin <smsarwar1996@gmail.com>
2018-01-29 16:50:39 +00:00
Frederick Villaluna
7a9a19e3b9 Pontoon: Update Tagalog (tl) localization of Test Pilot: Firefox Send
Localization authors:
- Frederick Villaluna <fv_comscie@yahoo.com>
2018-01-29 02:32:15 +00:00
avelper
a6e94441aa Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- avelper <avelper@mozilla-hispano.org>
- Marco Aurélio <fxhelp@yahoo.com>
2018-01-28 16:50:48 +00:00
Jobava
68d66d8ab3 Pontoon: Update Romanian (ro) localization of Test Pilot: Firefox Send
Localization authors:
- Jobava <jobaval10n@gmail.com>
2018-01-27 17:50:31 +00:00
Khaled Hosny
aa5cc7ff9f Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- Khaled Hosny <khaledhosny@eglug.org>
2018-01-27 14:32:15 +00:00
Rodrigo Guerra
eb8ede8376 Pontoon: Update Interlingua (ia) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo Guerra <rodmguerra@gmail.com>
2018-01-27 01:11:12 +00:00
Selim Şumlu
4dc92bae4e Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2018-01-25 19:31:30 +00:00
ravmn
9e1a975b23 Pontoon: Update Spanish (Chile) (es-CL) localization of Test Pilot: Firefox Send
Localization authors:
- ravmn <ravmn@ravmn.cl>
2018-01-25 02:11:13 +00:00
Марко Костић (Marko Kostić)
e5a26fa0be Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Марко Костић (Marko Kostić) <marko.m.kostic@gmail.com>
2018-01-24 19:51:34 +00:00
Arash Mousavi
4035a3a1e5 Pontoon: Update Persian (fa) localization of Test Pilot: Firefox Send
Localization authors:
- Arash Mousavi <mousavi.arash@gmail.com>
2018-01-24 19:51:32 +00:00
Bjørn I
0380d286cd Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Bjørn I. <bjorn.svindseth@online.no>
2018-01-24 15:51:26 +00:00
Victor Bychek
91dc3aa5d2 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2018-01-24 12:31:06 +00:00
Adnan Kičin
4bbffcf35e Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Adnan Kičin <adnankicin92@gmail.com>
2018-01-24 06:31:10 +00:00
Juan Esteban Ajsivinac Sián
bb73eeb7ea Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2018-01-23 20:11:42 +00:00
Danny Coates
546f8a12e4 Merge pull request #722 from flodolo/fix_721
Add localization note to 'Time' and 'Downloads' string
2018-01-23 11:16:06 -08:00
Juraj Cigáň
3a865d4aaa Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2018-01-23 19:10:51 +00:00
Luiz Carlos de Morais
05feb6b1b0 Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Luiz Carlos de Morais <lcom_flip@hotmail.com>
2018-01-23 19:10:47 +00:00
Melo46
efa6fe3ef1 Pontoon: Update Interlingua (ia) localization of Test Pilot: Firefox Send
Localization authors:
- Melo46 <melo@carmu.com>
2018-01-23 18:50:51 +00:00
Michal Stanke
e917927979 Pontoon: Update Czech (cs) localization of Test Pilot: Firefox Send
Localization authors:
- Michal Stanke <mstanke@mozilla.cz>
2018-01-23 18:31:25 +00:00
Melo46
61689ed451 Pontoon: Update Interlingua (ia) localization of Test Pilot: Firefox Send
Localization authors:
- Melo46 <melo@carmu.com>
2018-01-23 17:31:40 +00:00
gmontagu
b74919c376 Pontoon: Update Spanish (Argentina) (es-AR) localization of Test Pilot: Firefox Send
Localization authors:
- gmontagu <gmontagu@gmail.com>
2018-01-23 15:31:39 +00:00
gmontagu
67cc4f9600 Pontoon: Update Spanish (Argentina) (es-AR) localization of Test Pilot: Firefox Send
Localization authors:
- gmontagu <gmontagu@gmail.com>
2018-01-23 15:11:20 +00:00
Rhoslyn Prys
ec749de3fa Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2018-01-23 12:11:23 +00:00
Rodrigo
b99cd7ed3f Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2018-01-23 11:51:12 +00:00
Pin-guang Chen
87b9c955ca Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2018-01-23 11:31:44 +00:00
YFdyh000
00aee2771e Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2018-01-23 11:31:37 +00:00
Francesco Lodolo [:flod]
291276494d Add localization note to 'Time' and 'Downloads' strings 2018-01-23 12:22:12 +01:00
Michael Köhler
fc3823f0af Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2018-01-23 09:50:52 +00:00
Balázs Meskó
855ef73a9a Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2018-01-23 09:10:44 +00:00
Håvar Henriksen
517a8d2104 Pontoon: Update Norwegian Bokmål (nb-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Håvar Henriksen <havar@firefox.no>
2018-01-23 08:50:55 +00:00
Georgianizator
a042795ec1 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2018-01-23 08:50:52 +00:00
Rok Žerdin
e427d65bf5 Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Rok Žerdin <rok.zerdin1990@gmail.com>
2018-01-23 08:31:25 +00:00
Fjoerfoks
5ce319456f Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2018-01-23 07:50:48 +00:00
Francesco Lodolo
03828bfdaa Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Francesco Lodolo <francesco.lodolo@mozillaitalia.org>
2018-01-23 07:10:53 +00:00
Michael Wolf
7c836d121c Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-01-23 06:31:22 +00:00
Michael Wolf
b2ee3c5f30 Pontoon: Update Sorbian, Lower (dsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-01-23 06:31:20 +00:00
manxmensch
04205783b8 Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2018-01-23 05:31:36 +00:00
Andreas Pettersson
f27e71fbd8 Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Andreas Pettersson <az@kth.se>
2018-01-23 04:51:14 +00:00
Kohei Yoshino
fbca679334 Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2018-01-23 04:10:37 +00:00
Ton
5b594ba0b4 Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Ton <tonnes.mb@gmail.com>
2018-01-23 03:51:10 +00:00
Roberto Alvarado
3d4b5b0c1e Pontoon: Update Spanish (Mexico) (es-MX) localization of Test Pilot: Firefox Send
Localization authors:
- Roberto Alvarado <ralv888@gmail.com>
2018-01-23 03:31:20 +00:00
Pin-guang Chen
c7574de7dc Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2018-01-23 03:11:11 +00:00
Théo Chevalier
c8a3bb5f81 Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2018-01-23 02:53:29 +00:00
Danny Coates
118edef773 Merge pull request #721 from shikhar-scs/show-dlimits
show download Limits on page; Fixes #661
2018-01-22 18:24:35 -08:00
shikhar-scs
050a1aff83 show download Limits on page 2018-01-23 07:41:48 +05:30
Fjoerfoks
9ad74e9cbf Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2018-01-22 08:51:07 +00:00
Roberto Alvarado
09f8decc59 Pontoon: Update Spanish (Mexico) (es-MX) localization of Test Pilot: Firefox Send
Localization authors:
- Roberto Alvarado <ralv888@gmail.com>
2018-01-22 02:32:21 +00:00
Sav22999
0decdf156b Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Sav22999 <savemore99.sm@gmail.com>
2018-01-21 12:51:17 +00:00
Jordi Cuevas
9316655b8c Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- Jordi Cuevas <jordicuevas@gmail.com>
2018-01-20 19:31:42 +00:00
Bjørn I
1bcc4fd2d7 Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Bjørn I. <bjorn.svindseth@online.no>
2018-01-20 19:31:38 +00:00
Victor Bychek
239a4da145 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2018-01-20 16:50:39 +00:00
Selim Şumlu
d8e66c9b6a Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2018-01-20 14:11:03 +00:00
Danny Coates
72279f4995 a very slight refactor of previous commit 2018-01-19 17:14:14 -08:00
Danny Coates
48b21de011 a few tweaks to password input. fixes #703 2018-01-19 16:53:57 -08:00
Danny Coates
f7dc86ab2b reinstate the 'exited' metric. fixes #653 2018-01-19 15:07:05 -08:00
Juraj Cigáň
39bfe6d2cb Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2018-01-19 22:11:06 +00:00
aefgh39622
d6f534c3c0 Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- aefgh39622 <aefgh39622@gmail.com>
2018-01-19 20:11:09 +00:00
Rhoslyn Prys
45067d0354 Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2018-01-19 15:53:56 +00:00
YFdyh000
da1ff63f72 Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2018-01-19 15:11:34 +00:00
Rok Žerdin
5d715c50de Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Rok Žerdin <rok.zerdin1990@gmail.com>
2018-01-19 14:30:37 +00:00
Balázs Meskó
47072ae1fe Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2018-01-19 14:11:38 +00:00
Pin-guang Chen
72f301fa45 Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2018-01-19 12:11:08 +00:00
Håvar Henriksen
e9b89629a6 Pontoon: Update Norwegian Bokmål (nb-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Håvar Henriksen <havar@firefox.no>
2018-01-19 09:51:32 +00:00
Frederick Villaluna
3ef5ef166f Pontoon: Update Tagalog (tl) localization of Test Pilot: Firefox Send
Localization authors:
- Frederick Villaluna <fv_comscie@yahoo.com>
2018-01-19 08:50:42 +00:00
Nihad Suljić
37ca7a706a Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad Suljić <nihad.suljic92@gmail.com>
2018-01-19 08:31:08 +00:00
Ton
734c65fbda Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Ton <tonnes.mb@gmail.com>
2018-01-19 07:10:40 +00:00
Luna Jernberg
145605d628 Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Luna Jernberg <bittin@cafe8bitar.se>
2018-01-19 06:31:17 +00:00
Georgianizator
7ac432fbc5 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2018-01-19 06:31:15 +00:00
manxmensch
0c92cec2ea Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2018-01-19 02:11:30 +00:00
Michael Wolf
f6a788b36f Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-01-18 21:51:05 +00:00
Michael Wolf
72dffcf46b Pontoon: Update Sorbian, Lower (dsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2018-01-18 21:51:01 +00:00
Marcelo Poli
3140cdd148 Pontoon: Update Spanish (Argentina) (es-AR) localization of Test Pilot: Firefox Send
Localization authors:
- Marcelo Poli <enzomatrix@gmail.com>
2018-01-18 21:31:07 +00:00
Michael Köhler
d87adbce63 Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2018-01-18 21:31:02 +00:00
Théo Chevalier
ffdf2bc0cd Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2018-01-18 21:30:59 +00:00
Cynthia Pereira
be5d7a1c9f Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Cynthia Pereira <cynthiacpereira@gmail.com>
2018-01-18 20:31:18 +00:00
Juan Esteban Ajsivinac Sián
94288b5cef Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2018-01-18 20:31:14 +00:00
Марко Костић (Marko Kostić)
63abbf5949 Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Марко Костић (Marko Kostić) <marko.m.kostic@gmail.com>
2018-01-18 20:12:09 +00:00
Rodrigo
49214281f7 Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2018-01-18 20:12:07 +00:00
Danny Coates
9688dde1a4 Merge pull request #694 from himanish-star/feature-change-password
Passwords can now be changed (#687)
2018-01-18 11:46:11 -08:00
Soumya Himanish Mohapatra
fdcc31f049 Passwords can now be reset 2018-01-18 15:45:04 +05:30
Danny Coates
55ed6100e0 fixes #675. progress on ios 2018-01-16 13:52:09 -08:00
Danny Coates
7fb11ba912 added 'browser' to survey url. fixes #657 2018-01-16 13:21:26 -08:00
Danny Coates
f3d77fdcf2 Merge pull request #702 from himanish-star/remove-banner
Restricted the banner from showing on unsupported browsers
2018-01-13 14:50:17 -08:00
Soumya Himanish Mohapatra
6489ab6a56 Restricted the banner from showing on unsupported browsers 2018-01-13 09:32:55 +05:30
Danny Coates
bace117ada fixed error on metadata 404 2018-01-11 23:20:56 -08:00
Danny Coates
76175d61af Merge pull request #701 from shikhar-scs/delete-popup-mobile-view
improved popup for mobile display; Fixes #699
2018-01-11 21:26:30 -08:00
shikhar-scs
87110095a0 improved popup for mobile display 2018-01-12 08:16:55 +05:30
Danny Coates
50ba8bec5a Merge pull request #683 from ehuggett/issue618
API changes to accommodate 3rd party clients
2018-01-11 13:57:30 -08:00
Danny Coates
1741b1c686 use monospace font for password display 2018-01-10 10:02:21 -08:00
Jordi Serratosa
99097baf9d Pontoon: Update Catalan (ca) localization of Test Pilot: Firefox Send
Localization authors:
- Jordi Serratosa <jordis@softcatala.cat>
2018-01-09 20:32:28 +00:00
Jordi Serratosa
bac1cc8243 Pontoon: Update Catalan (ca) localization of Test Pilot: Firefox Send
Localization authors:
- Jordi Serratosa <jordis@softcatala.cat>
2018-01-09 20:12:02 +00:00
Danny Coates
096489d486 tweaked delete popup 2018-01-09 11:20:36 -08:00
Danny Coates
9811a9a3e1 Merge pull request #698 from himanish-star/delete-btn-background-red
Popup for delete button attached
2018-01-09 10:58:50 -08:00
Soumya Himanish Mohapatra
910cde4380 Popup for delete button attached 2018-01-09 20:56:27 +05:30
Danny Coates
4f1ccf83c8 Merge pull request #695 from shikhar-scs/warning-for-high-file-size
Show Warning, Cancel and Redirect on size > 2GB ; fixes #578
2018-01-08 20:11:44 -08:00
shikhar-scs
9501c1ce4b checking for file size > 2GB
included global MAXFILESIZE
2018-01-09 09:28:23 +05:30
Danny Coates
069f0e53e1 Merge pull request #684 from himanish-star/delete-btn-background-red
delete btn popup attached
2018-01-08 12:22:57 -08:00
Danny Coates
aedfba795e updated takedowns.md to add S3 info 2018-01-08 11:20:28 -08:00
Soumya Himanish Mohapatra
9f162c0703 Popup attached for delete Button 2018-01-08 23:53:16 +05:30
Danny Coates
7b96c46e39 Merge pull request #686 from shikhar-scs/hidePassword
Hide password while Typing and after Entering: Fixes #670
2018-01-08 09:49:40 -08:00
Danny Coates
3d48ea71b9 Merge pull request #679 from shikhar-scs/master
changed font to sans sherif: Solves #676
2018-01-08 09:45:21 -08:00
Kerim Kalamujić
24ee984a2e Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Kerim Kalamujić <kerim@mozilla.ba>
2018-01-08 07:12:23 +00:00
Khaled Hosny
4255cbe540 Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- Khaled Hosny <khaledhosny@eglug.org>
2018-01-07 16:31:44 +00:00
eljuno
fe16f24c41 Pontoon: Update Indonesian (id) localization of Test Pilot: Firefox Send
Localization authors:
- eljuno <eljunotrie_anggoro@yahoo.co.id>
2018-01-06 04:32:11 +00:00
shikhar-scs
a6e1fc5c44 changed font to sans serif
improved font family

font changes
2018-01-06 08:21:55 +05:30
shikhar-scs
8434312728 Toggleable Password
Changed * to ●
2018-01-06 08:11:16 +05:30
Danny Coates
46f641aaec Added docs/takedowns.md for DMCA removal instructions 2018-01-05 13:42:19 -08:00
Danny Coates
c246d8d517 Merge pull request #693 from jspam/01-good-first-issue
README: Fix query link for "good first bugs"
2018-01-03 10:26:52 -08:00
Danny Coates
4ec1aeafaf Merge pull request #685 from himanish-star/hover-checkbox
checkbox now has a hover effect: fixes #635
2018-01-03 10:23:25 -08:00
eljuno
27cfd04ea7 Pontoon: Update Indonesian (id) localization of Test Pilot: Firefox Send
Localization authors:
- eljuno <eljunotrie_anggoro@yahoo.co.id>
2018-01-03 07:51:07 +00:00
Emin Mastizada
797cfcb98d Pontoon: Update Azerbaijani (az) localization of Test Pilot: Firefox Send
Localization authors:
- Emin Mastizada <emin@mastizada.com>
2018-01-01 06:34:36 +00:00
jspam
96a9b52e6d README: Fix query link for "good first bugs" 2017-12-31 12:10:57 +01:00
Juan Esteban Ajsivinac Sián
3b7462070b Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2017-12-31 01:11:37 +00:00
Jim Spentzos
f08dd5960b Pontoon: Update Greek (el) localization of Test Pilot: Firefox Send
Localization authors:
- Jim Spentzos <jamesspentzos@hotmail.com>
2017-12-23 15:51:52 +00:00
Soumya Himanish Mohapatra
9972196f70 checkbox now has a hover effect 2017-12-23 11:49:15 +05:30
ehuggett
ebbf06787c changes requested in review 2017-12-23 05:09:06 +00:00
Danny Coates
1d2b0cb093 Merge pull request #668 from TwizzyDizzy/master
Add possibility to bind to a specific IP address
2017-12-21 13:25:02 -08:00
Thomas Dalichow
6f27c6e4aa Change default bind address to 0.0.0.0 2017-12-21 22:10:42 +01:00
Danny Coates
7b6008c37e Merge pull request #682 from tiagomoraismorgado88/patch-9
[Docs] - README.md - minor spelling fixes
2017-12-21 12:44:49 -08:00
Danny Coates
cf5405fbe4 Merge pull request #672 from derektamsen/dynamically-generate-file-ttl
Use EXPIRE_SECONDS to calculate file ttl for static content
2017-12-21 12:42:57 -08:00
Danny Coates
b4ec7402fc Merge pull request #680 from himanish-star/adjust-line-height-label
adjusted line height of label : fixes #609
2017-12-21 12:34:36 -08:00
ehuggett
ff9a107a29 API changes to accommodate 3rd party clients 2017-12-21 15:54:19 +00:00
tiagomoraismorgado
417ad87bcc [Docs] - README.md - minor spelling fixes
[Docs] - README.md - minor spelling fixes
2017-12-21 15:35:44 +00:00
Soumya Himanish Mohapatra
265f99f327 adjusted line height of label 2017-12-21 17:46:01 +05:30
Danny Coates
0f8c3caf18 fixed untranslated strings breaking the site 2017-12-19 10:06:45 -08:00
Jobava
3a7677b46d Pontoon: Update Romanian (ro) localization of Test Pilot: Firefox Send
Localization authors:
- Jobava <jobaval10n@gmail.com>
2017-12-14 17:31:55 +00:00
Jobava
3fd64d9956 Pontoon: Update Romanian (ro) localization of Test Pilot: Firefox Send
Localization authors:
- Jobava <jobaval10n@gmail.com>
2017-12-14 17:11:45 +00:00
Derek Tamsen
1d26f4b24f Use EXPIRE_SECONDS to calculate file ttl for static content 2017-12-13 18:22:17 -08:00
Nihad Suljić
1a4cea7b4f Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad Suljić <nihad.suljic92@gmail.com>
2017-12-13 08:32:30 +00:00
Hyeonseok Shin
bbb1c42641 Pontoon: Update Korean (ko) localization of Test Pilot: Firefox Send
Localization authors:
- Hyeonseok Shin <hyeonseok@gmail.com>
- minwook-shin <minwook0106@gmail.com>
2017-12-13 02:50:51 +00:00
Hyeonseok Shin
7ce2320eda Pontoon: Update Korean (ko) localization of Test Pilot: Firefox Send
Localization authors:
- Hyeonseok Shin <hyeonseok@gmail.com>
2017-12-13 02:31:46 +00:00
Abdalrahman Hwoij
1729b30f89 Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- Abdalrahman Hwoij <howij1995@gmail.com>
- Zaid Ibhais <s-e-7-s@hotmail.com>
- صفا الفليج <safa1996alfulaij@gmail.com>
- Khaled Hosny <khaledhosny@eglug.org>
2017-12-12 23:51:37 +00:00
Khaled Hosny
25d6595d5e Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- صفا الفليج <safa1996alfulaij@gmail.com>
- Khaled Hosny <khaledhosny@eglug.org>
2017-12-12 23:31:40 +00:00
Michal Stanke
3b31b9d65b Pontoon: Update Czech (cs) localization of Test Pilot: Firefox Send
Localization authors:
- Filip Hruška <fhr@fhrnet.eu>
- Michal Stanke <mstanke@mozilla.cz>
2017-12-12 20:11:29 +00:00
eljuno
e9e64fed3f Pontoon: Update Indonesian (id) localization of Test Pilot: Firefox Send
Localization authors:
- Rahmat Subekti <rahmatsubekti@live.com>
- eljuno <eljunotrie_anggoro@yahoo.co.id>
- Kiki <kelimutu.rizki@gmail.com>
2017-12-11 21:00:31 +00:00
Mozilla Pontoon
3b88ea9b1c Pontoon: Update Danish (da) localization of Test Pilot: Firefox Send 2017-12-11 20:59:57 +00:00
Emin Mastizada
623f76fa6c Pontoon: Update Azerbaijani (az) localization of Test Pilot: Firefox Send
Localization authors:
- Emin Mastizada <emin@mastizada.com>
2017-12-11 20:59:37 +00:00
ybouhamam
19efcb1a0d Pontoon: Update Kabyle (kab) localization of Test Pilot: Firefox Send
Localization authors:
- ybouhamam <ybouhamam@gmail.com>
2017-12-10 09:11:16 +00:00
Besnik Bleta
31c8916622 Pontoon: Update Albanian (sq) localization of Test Pilot: Firefox Send
Localization authors:
- Besnik Bleta <besnik@programeshqip.org>
2017-12-09 17:11:48 +00:00
Jim Spentzos
7a0b189a1d Pontoon: Update Greek (el) localization of Test Pilot: Firefox Send
Localization authors:
- Jim Spentzos <jamesspentzos@hotmail.com>
2017-12-09 14:51:13 +00:00
Besnik Bleta
fa0d56d57a Pontoon: Update Albanian (sq) localization of Test Pilot: Firefox Send
Localization authors:
- Besnik Bleta <besnik@programeshqip.org>
2017-12-09 11:51:15 +00:00
Besnik Bleta
85670bbc6a Pontoon: Update Albanian (sq) localization of Test Pilot: Firefox Send
Localization authors:
- Besnik Bleta <besnik@programeshqip.org>
2017-12-09 11:31:30 +00:00
Besnik Bleta
fc9a85b6ad Pontoon: Update Albanian (sq) localization of Test Pilot: Firefox Send
Localization authors:
- Besnik Bleta <besnik@programeshqip.org>
2017-12-09 11:10:46 +00:00
Besnik Bleta
8760b132da Pontoon: Update Albanian (sq) localization of Test Pilot: Firefox Send
Localization authors:
- Besnik Bleta <besnik@programeshqip.org>
2017-12-09 10:51:01 +00:00
Thomas Dalichow
b80ee8d778 Make the linter happy :) 2017-12-09 02:34:33 +01:00
Thomas Dalichow
c8e168aa3e Use new config item 'listen_address' in prod 2017-12-09 02:22:36 +01:00
Thomas Dalichow
106aef579f Add new config item: listen_address
The IP address to bind the HTTP server to
2017-12-09 02:21:55 +01:00
Breana Gonzales
d7084829c3 Pontoon: Update Spanish (Mexico) (es-MX) localization of Test Pilot: Firefox Send
Localization authors:
- Breana Gonzales <breanajones@hotmail.com>
2017-12-09 01:10:56 +00:00
Uccen Marzuq
243d72eed5 Pontoon: Update Kabyle (kab) localization of Test Pilot: Firefox Send
Localization authors:
- Uccen Marzuq <merzouk.ouchene@laposte.net>
2017-12-08 21:51:05 +00:00
Danny Coates
aa60e97d5d Merge pull request #667 from claudijd/remove_prod_as_default_env
Make develop the default NODE_ENV
2017-12-08 13:11:11 -08:00
Jonathan Claudius
4ae12db99c Make develop the default NODE_ENV 2017-12-08 16:04:26 -05:00
Andreas Pettersson
98ad058e2e Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Andreas Pettersson <az@kth.se>
2017-12-08 20:11:14 +00:00
Andreas Pettersson
58cc381abf Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Andreas Pettersson <az@kth.se>
2017-12-08 18:10:47 +00:00
Danny Coates
d039c38f00 v2.2.1 2017-12-08 10:00:13 -08:00
Danny Coates
81f3347981 retry setPassword on first nonce failure. fixes #664 2017-12-08 09:45:00 -08:00
Danny Coates
b96d2949f7 Merge pull request #665 from mozilla/dragleave
stop drag target from flickering when dragging over children
2017-12-08 09:18:54 -08:00
Erica Wright
a2e745a349 stop drag target from flickering when dragging over children 2017-12-08 10:48:44 -05:00
RickieES
0fe02b18ce Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- RickieES <rpmdisguise-nave@yahoo.es>
2017-12-08 12:30:51 +00:00
Juraj Cigáň
655eb8c253 Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2017-12-07 23:10:49 +00:00
Fjoerfoks
d9356f8171 Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2017-12-07 21:11:05 +00:00
Frederick Villaluna
be7d23163c Pontoon: Update Tagalog (tl) localization of Test Pilot: Firefox Send
Localization authors:
- Frederick Villaluna <fv_comscie@yahoo.com>
2017-12-07 09:30:56 +00:00
Artem Polivanchuk
7ac2e57484 Pontoon: Update Ukrainian (uk) localization of Test Pilot: Firefox Send
Localization authors:
- Artem Polivanchuk <artem@mozilla.org.ua>
2017-12-07 08:31:03 +00:00
Artem Polivanchuk
727ea1283a Pontoon: Update Ukrainian (uk) localization of Test Pilot: Firefox Send
Localization authors:
- Artem Polivanchuk <artem@mozilla.org.ua>
2017-12-07 08:11:00 +00:00
Lobodzets
3314057059 Pontoon: Update Ukrainian (uk) localization of Test Pilot: Firefox Send
Localization authors:
- Lobodzets <Lobodzets@meta.ua>
2017-12-07 06:51:08 +00:00
Danny Coates
df1b00fa2c v2.2.0 2017-12-06 15:57:55 -08:00
Danny Coates
6434329f61 added utm params to unsupported page download link 2017-12-06 15:43:36 -08:00
Arash Mousavi
454853dc93 Pontoon: Update Persian (fa) localization of Test Pilot: Firefox Send
Localization authors:
- Arash Mousavi <mousavi.arash@gmail.com>
2017-12-06 21:51:17 +00:00
Filip Hruška
b663bf94e4 Pontoon: Update Czech (cs) localization of Test Pilot: Firefox Send
Localization authors:
- Filip Hruška <fhr@fhrnet.eu>
2017-12-06 20:50:37 +00:00
Kohei Yoshino
081cf081c5 Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2017-12-06 18:10:58 +00:00
Selim Şumlu
f86b164c62 Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2017-12-06 16:50:46 +00:00
Marko Andrejić
92b79e8272 Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Marko Andrejić <marko.andrejic93@gmail.com>
2017-12-06 15:30:40 +00:00
Marcelo Poli
335086c9d7 Pontoon: Update Spanish (Argentina) (es-AR) localization of Test Pilot: Firefox Send
Localization authors:
- Marcelo Poli <enzomatrix@gmail.com>
2017-12-06 15:11:09 +00:00
Bjørn I
60806a3954 Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Bjørn I. <bjorn.svindseth@online.no>
2017-12-06 15:11:02 +00:00
Lan Glad
e0e96e7b9b Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Rok Žerdin <rok.zerdin1990@gmail.com>
- Lan Glad <upwinxp@gmail.com>
2017-12-06 14:50:51 +00:00
Håvar Henriksen
cda35eb127 Pontoon: Update Norwegian Bokmål (nb-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Håvar Henriksen <havar@firefox.no>
2017-12-06 13:11:06 +00:00
ravmn
bf1ef345a2 Pontoon: Update Spanish (Chile) (es-CL) localization of Test Pilot: Firefox Send
Localization authors:
- ravmn <ravmn@ravmn.cl>
2017-12-06 12:51:59 +00:00
Håvar Henriksen
e54ae7a51f Pontoon: Update Norwegian Bokmål (nb-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Håvar Henriksen <havar@firefox.no>
2017-12-06 12:51:57 +00:00
Rhoslyn Prys
a5a2d654ae Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2017-12-06 09:50:53 +00:00
Alexander Slovesnik
b6340d8657 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Alexander Slovesnik <unghost@mozilla-russia.org>
- Victor Bychek <a@bychek.ru>
2017-12-06 09:50:50 +00:00
Balázs Meskó
cdb87e2ac2 Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2017-12-06 08:51:11 +00:00
Michael Wolf
a0baed4e14 Pontoon: Update Sorbian, Lower (dsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2017-12-06 06:50:51 +00:00
Francesco Lodolo
573a2d4fb1 Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Francesco Lodolo <francesco.lodolo@mozillaitalia.org>
2017-12-06 06:50:48 +00:00
Michael Köhler
df3ae9e22d Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2017-12-06 06:50:46 +00:00
Ton
52bffa024e Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Ton <tonnes.mb@gmail.com>
2017-12-06 06:30:46 +00:00
Danny Coates
459499d5f5 fixed password ui 2017-12-05 19:41:53 -08:00
Pin-guang Chen
7cc94f6829 Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2017-12-06 03:11:15 +00:00
Danny Coates
53d5b08559 rename number to num in ftl 2017-12-05 19:07:23 -08:00
Marco Aurélio
c517b074f1 Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Marco Aurélio <fxhelp@yahoo.com>
2017-12-06 00:50:52 +00:00
Michael Wolf
503ba43ebc Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2017-12-05 23:31:32 +00:00
manxmensch
b0755f4bc5 Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2017-12-05 23:11:03 +00:00
Théo Chevalier
89ece1ec4c Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2017-12-05 23:11:00 +00:00
YFdyh000
9fcaefbd99 Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2017-12-05 23:10:57 +00:00
Rodrigo
81f33c7bbd Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2017-12-05 22:51:14 +00:00
Georgianizator
0ce1bf2360 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2017-12-05 22:51:10 +00:00
Danny Coates
bb10c1aa9d added 'report IP infringement' footer link 2017-12-05 14:16:22 -08:00
Danny Coates
b2c1daa6c7 color promo experiment 2017-12-05 14:06:40 -08:00
Danny Coates
da4338ed69 fixed ftl variable names 2017-12-05 12:58:48 -08:00
Danny Coates
1849d712b1 added ver to qsurvey url 2017-12-05 12:51:37 -08:00
Jordi Cuevas
28a7e0f717 Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- avelper <avelper@mozilla-hispano.org>
- Jordi Cuevas <jordicuevas@gmail.com>
2017-12-05 19:51:18 +00:00
Andreas Pettersson
ddbfc79cae Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Andreas Pettersson <az@kth.se>
2017-12-05 19:10:53 +00:00
Marco Aurélio
ec8900d38f Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Marco Aurélio <fxhelp@yahoo.com>
2017-12-05 17:10:33 +00:00
Michael Köhler
8aadd5d775 Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2017-12-05 16:51:22 +00:00
Ton
268f9306d9 Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Ton <tonnes.mb@gmail.com>
2017-12-05 16:30:45 +00:00
Francesco Lodolo
866552254c Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Francesco Lodolo <francesco.lodolo@mozillaitalia.org>
2017-12-05 15:10:38 +00:00
Kohei Yoshino
42f87424c6 Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2017-12-05 14:30:41 +00:00
ravmn
4899fb27ec Pontoon: Update Spanish (Chile) (es-CL) localization of Test Pilot: Firefox Send
Localization authors:
- ravmn <ravmn@ravmn.cl>
2017-12-05 14:10:59 +00:00
Fjoerfoks
c2c8d2bdaa Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2017-12-05 11:50:56 +00:00
Amin Mahmudian
daa373967f Pontoon: Update Persian (fa) localization of Test Pilot: Firefox Send
Localization authors:
- Amin Mahmudian <amin.mahmudian@gmail.com>
2017-12-05 11:30:57 +00:00
Fjoerfoks
dccc9bfbcd Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2017-12-05 11:30:51 +00:00
Marko Andrejić
f51a873752 Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Marko Andrejić <marko.andrejic93@gmail.com>
2017-12-05 10:50:52 +00:00
YFdyh000
bad5efc5e8 Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2017-12-05 10:31:06 +00:00
Rodrigo
edf8384348 Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2017-12-05 10:10:42 +00:00
manxmensch
65c2f0e191 Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2017-12-05 10:10:40 +00:00
Rodrigo
427a09296c Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2017-12-05 09:50:40 +00:00
Georgianizator
ba11d62003 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2017-12-05 09:30:37 +00:00
Balázs Meskó
900dbe781e Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2017-12-05 08:11:19 +00:00
Bjørn I
ee19aa8f2e Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Bjørn I. <bjorn.svindseth@online.no>
2017-12-05 07:30:40 +00:00
Nihad Suljić
e9cff66852 Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad Suljić <nihad.suljic92@gmail.com>
2017-12-05 06:50:58 +00:00
Frederick Villaluna
f63894bea7 Pontoon: Update Tagalog (tl) localization of Test Pilot: Firefox Send
Localization authors:
- Frederick Villaluna <fv_comscie@yahoo.com>
2017-12-05 05:11:02 +00:00
Roberto Alvarado
35a285d71a Pontoon: Update Spanish (Mexico) (es-MX) localization of Test Pilot: Firefox Send
Localization authors:
- Roberto Alvarado <ralv888@gmail.com>
2017-12-05 04:11:10 +00:00
Pin-guang Chen
ba80b01150 Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2017-12-05 04:11:08 +00:00
Théo Chevalier
c9be359db4 Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2017-12-05 03:50:56 +00:00
Danny Coates
46a3933dbb Merge pull request #654 from mozilla/multi
Multiple download UI
2017-12-04 19:29:03 -08:00
Danny Coates
7b4060f9e1 Added multiple download option 2017-12-04 15:52:31 -08:00
Danny Coates
beb3a6e67b Merge pull request #650 from ovlb/hotfix/ios-input-appearance
#634: overwrite appearance of password submit input
2017-11-28 11:45:06 -08:00
Alberto Castro
b393c35284 Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Alberto Castro <albertdcastro@gmail.com>
2017-11-28 11:51:09 +00:00
Rodrigo
ad371553ba Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2017-11-24 13:31:30 +00:00
albertdcastro
0107fb9486 Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- albertdcastro <albertdcastro@gmail.com>
2017-11-24 12:11:53 +00:00
Oscar
7cf70317e8 #634: overwrite appearance of password submit input
Bug: The button to set a password had a different look than other buttons on the site

Fix: add -webkit-appearance none on the button element to force browser to discard the default styling. For a reduced test case demonstrating the fix see https://codepen.io/ovl/full/qVYgoO/
2017-11-23 15:28:32 +01:00
Danny Coates
7d8aaac5d2 Merge pull request #649 from ovlb/hotfix/share-interface-button-alignment
#609 share interface: align text in input and button
2017-11-22 11:57:08 -08:00
Oscar
2b5f7d126f share interface: align text in input and button
Bug: Text in inout and button are not aligned on the middle axis

Fix: Add padding-bottom on the button elements to push their contents a bit higher
2017-11-22 20:36:22 +01:00
Théo Chevalier
3cbc71ca1b Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2017-11-17 02:30:26 +00:00
Tymur Faradzhev
9c4ac38a6c Pontoon: Update Ukrainian (uk) localization of Test Pilot: Firefox Send
Localization authors:
- Tymur Faradzhev <faradzhev.timur@gmail.com>
2017-11-16 21:51:21 +00:00
Arash Mousavi
9ae64a97ba Pontoon: Update Persian (fa) localization of Test Pilot: Firefox Send
Localization authors:
- Arash Mousavi <mousavi.arash@gmail.com>
2017-11-16 19:10:59 +00:00
Danny Coates
2807b1cad5 bump version to v2.1.2 2017-11-16 11:03:40 -08:00
Danny Coates
157e832c95 Merge pull request #645 from laurentj/patch-1
Remove the leak of the password into the console
2017-11-16 10:58:50 -08:00
Danny Coates
d78fcd3721 fixed promo position while ondrag is set. fixes 2017-11-16 10:50:29 -08:00
Radu Popescu
ac7ab79aef Pontoon: Update Romanian (ro) localization of Test Pilot: Firefox Send
Localization authors:
- Radu Popescu <ra.mi.90@gmail.com>
- Jobava <jobaval10n@gmail.com>
2017-11-16 17:52:07 +00:00
Laurent Jouanneau
00fb353465 Remove the leak of the password into the console 2017-11-16 12:28:16 +01:00
Hyeonseok Shin
f0ec5a9496 Pontoon: Update Korean (ko) localization of Test Pilot: Firefox Send
Localization authors:
- Hyeonseok Shin <hyeonseok@gmail.com>
2017-11-16 05:51:26 +00:00
Danny Coates
7a31082da1 bump version to v2.1.1 2017-11-15 10:59:03 -08:00
Danny Coates
b54f4575ee allow inline styles. fixes #644 2017-11-15 10:54:13 -08:00
Edmund Huggett
58840e2c00 use redis expire event to delete stored data immediately 2017-11-15 12:31:22 +00:00
Danny Coates
490a1e88eb don't disable copy while setting password. fixes #638 2017-11-14 19:07:24 -08:00
Danny Coates
2f8a3c9904 Merge pull request #641 from mozilla/banners
Added experiment for firefox download promo
2017-11-14 18:59:21 -08:00
Danny Coates
e7fdf76120 Added experiment for firefox download promo 2017-11-14 12:24:54 -08:00
Sahithi
d0d41b743a Pontoon: Update Telugu (te) localization of Test Pilot: Firefox Send
Localization authors:
- Sahithi <sahithi.thinker@gmail.com>
2017-11-13 10:30:34 +00:00
Enol
a2995411d6 Pontoon: Update Asturian (ast) localization of Test Pilot: Firefox Send
Localization authors:
- Enol <enolp@softastur.org>
2017-11-11 16:30:55 +00:00
Merike Sell
3246c4a621 Pontoon: Update Estonian (et) localization of Test Pilot: Firefox Send
Localization authors:
- Merike Sell <merikes@gmail.com>
2017-11-11 14:10:36 +00:00
Juraj Cigáň
48faf929a4 Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2017-11-10 22:50:36 +00:00
Danny Coates
b7f922a999 Merge pull request #640 from mozilla/i586
use fluent-langneg for subtag support
2017-11-10 13:01:20 -08:00
Danny Coates
bfcdf9340d use fluent-langneg for subtag support 2017-11-10 12:40:18 -08:00
Danny Coates
4ed515f5a3 updated deps 2017-11-09 15:07:03 -08:00
Danny Coates
84b2737ffb Merge pull request #639 from mozilla/i586
wrap number localization in try/catch
2017-11-09 14:17:11 -08:00
Danny Coates
deabca5a94 wrap number localization in try/catch 2017-11-09 13:58:20 -08:00
صفا الفليج
e9a49e23e8 Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- صفا الفليج <safa1996alfulaij@gmail.com>
2017-11-09 16:31:40 +00:00
Danny Coates
cfdef23365 v2.0.0 2017-11-07 21:31:12 -08:00
Juan Esteban Ajsivinac Sián
7c4b6a9de4 Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2017-11-07 23:11:16 +00:00
Elisa X
bb8866f73f Pontoon: Update Spanish (Mexico) (es-MX) localization of Test Pilot: Firefox Send
Localization authors:
- Elisa X. <ee.sf2000@gmail.com>
2017-11-07 17:51:47 +00:00
Fjoerfoks
33c42648ef Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2017-11-07 13:51:57 +00:00
Selim Şumlu
7feddd2eee Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2017-11-07 11:10:57 +00:00
Georgianizator
1344b84cf5 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2017-11-07 11:10:54 +00:00
Sara Todaro
ef03b750c5 Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Sara Todaro <sara.todaro@mozillaitalia.org>
2017-11-07 10:10:32 +00:00
Rhoslyn Prys
0c07d78a37 Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2017-11-07 09:10:43 +00:00
Balázs Meskó
b5885e446c Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2017-11-07 09:10:40 +00:00
Marko Andrejić
0fa3d4481a Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Marko Andrejić <marko.andrejic93@gmail.com>
2017-11-07 08:31:30 +00:00
Kohei Yoshino
49e7c2e05b Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2017-11-07 07:11:28 +00:00
Nihad
2dc7d046ef Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad <nihad.suljic92@gmail.com>
2017-11-07 07:11:26 +00:00
Frederick Villaluna
3e0bd41efd Pontoon: Update Tagalog (tl) localization of Test Pilot: Firefox Send
Localization authors:
- Frederick Villaluna <fv_comscie@yahoo.com>
2017-11-07 02:51:16 +00:00
ravmn
929eaca2d8 Pontoon: Update Spanish (Chile) (es-CL) localization of Test Pilot: Firefox Send
Localization authors:
- ravmn <ravmn@ravmn.cl>
2017-11-07 01:51:10 +00:00
manxmensch
60517c5ab6 Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2017-11-07 01:51:08 +00:00
Bjørn I
97a8a2b305 Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Bjørn I. <bjorn.svindseth@online.no>
2017-11-06 22:31:54 +00:00
Maykon Chagas
8fc54bdbe2 Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Maykon Chagas <mchagas@riseup.net>
2017-11-06 22:10:59 +00:00
Danny Coates
6ff251b24a fixes #319 - unsupported redirect 2017-11-06 14:09:23 -08:00
Michael Wolf
7237800a91 Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2017-11-06 21:51:15 +00:00
Michael Wolf
b4cc8e92c7 Pontoon: Update Sorbian, Lower (dsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2017-11-06 21:51:12 +00:00
Danny Coates
2e233da16d unsupport MS Edge (for now, sorry) and some http header nits 2017-11-06 13:36:56 -08:00
Michael Wolf
b703f78db9 Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2017-11-06 21:32:06 +00:00
Marcelo Poli
13e792cf4d Pontoon: Update Spanish (Argentina) (es-AR) localization of Test Pilot: Firefox Send
Localization authors:
- Marcelo Poli <enzomatrix@gmail.com>
2017-11-06 21:11:09 +00:00
Ton
552c2d74f3 Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Ton <tonnes.mb@gmail.com>
2017-11-06 21:11:06 +00:00
Håvar Henriksen
593f23b021 Pontoon: Update Norwegian Bokmål (nb-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Håvar Henriksen <havar@firefox.no>
2017-11-06 20:10:55 +00:00
Andreas Pettersson
1baf83bac3 Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Andreas Pettersson <az@kth.se>
2017-11-06 19:31:27 +00:00
Lan Glad
d43ca3190e Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Lan Glad <upwinxp@gmail.com>
2017-11-06 19:11:14 +00:00
Victor Bychek
c4c7860876 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2017-11-06 19:11:06 +00:00
Michael Köhler
0decdeb37c Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2017-11-06 18:51:08 +00:00
Pin-guang Chen
47505dcc31 Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2017-11-06 18:51:03 +00:00
avelper
e71d6e792b Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- avelper <avelper@mozilla-hispano.org>
2017-11-06 18:32:04 +00:00
Rodrigo
29796cfec8 Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2017-11-06 18:31:56 +00:00
Filip Hruška
4bdf255c3a Pontoon: Update Czech (cs) localization of Test Pilot: Firefox Send
Localization authors:
- Filip Hruška <fhr@fhrnet.eu>
2017-11-06 18:31:49 +00:00
Théo Chevalier
11efe8b8d1 Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2017-11-06 18:10:45 +00:00
YFdyh000
3dd2d09584 Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2017-11-06 18:10:41 +00:00
Danny Coates
ed4e8e8f25 Merge pull request #633 from ehuggett/563-regres
Keyboard navigation/visual feedback regression
2017-11-06 10:01:43 -08:00
Danny Coates
181a74df88 Merge pull request #632 from mozilla/pwd
display the 'add password' button only when the input field isn't empty
2017-11-06 09:41:06 -08:00
ehuggett
166b2f3a52 fix keyboard navigation/visual feedback for upload 2017-11-05 13:00:58 +00:00
Muḥend Belqasem
bd5cdc52f9 Pontoon: Update Kabyle (kab) localization of Test Pilot: Firefox Send
Localization authors:
- Muḥend Belqasem <belkacem77@gmail.com>
2017-11-04 20:31:17 +00:00
Sander Lepik
5d0318c102 Pontoon: Update Estonian (et) localization of Test Pilot: Firefox Send
Localization authors:
- Sander Lepik <sander.lepik@eesti.ee>
2017-11-04 19:11:01 +00:00
Danny Coates
17adc644fb display the 'add password' button only when the input field isn't empty 2017-11-02 14:27:54 -07:00
صفا الفليج
f48159dc0b Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- Abdalrahman Hwoij <howij1995@gmail.com>
- صفا الفليج <safa1996alfulaij@gmail.com>
2017-11-02 18:31:51 +00:00
Danny Coates
360697c034 Merge pull request #626 from ehuggett/623-password-field
Partial fix for #623
2017-11-02 11:02:58 -07:00
ravmn
45dd833b27 Pontoon: Update Spanish (Chile) (es-CL) localization of Test Pilot: Firefox Send
Localization authors:
- ravmn <ravmn@ravmn.cl>
2017-11-02 01:30:49 +00:00
ehuggett
98491eed01 set autocomplete off for addPassword checkbox 2017-11-02 00:08:36 +00:00
ehuggett
fdafc1c59e minor fix for togglePasswordInput 2017-11-01 23:36:45 +00:00
Марко Костић (Marko Kostić)
a32638ed4c Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Марко Костић (Marko Kostić) <marko.m.kostic@gmail.com>
2017-11-01 17:30:55 +00:00
avelper
39080a6046 Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- avelper <avelper@mozilla-hispano.org>
2017-11-01 11:51:43 +00:00
Frederick Villaluna
a124d36714 Pontoon: Update Tagalog (tl) localization of Test Pilot: Firefox Send
Localization authors:
- Frederick Villaluna <fv_comscie@yahoo.com>
2017-11-01 09:30:46 +00:00
Frederick Villaluna
7f9e619643 Pontoon: Update Tagalog (tl) localization of Test Pilot: Firefox Send
Localization authors:
- Frederick Villaluna <fv_comscie@yahoo.com>
2017-11-01 09:10:58 +00:00
Marcelo Poli
db12f2f5c8 Pontoon: Update Spanish (Argentina) (es-AR) localization of Test Pilot: Firefox Send
Localization authors:
- Marcelo Poli <enzomatrix@gmail.com>
2017-10-31 21:51:16 +00:00
Georgianizator
415e0b70f3 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2017-10-31 21:11:40 +00:00
Jakub Rychlý
0e4b1e5ec7 Pontoon: Update Czech (cs) localization of Test Pilot: Firefox Send
Localization authors:
- Jakub Rychlý <jrychly@jakubrychly.cz>
2017-10-31 20:11:34 +00:00
Danny Coates
054a97371c Merge pull request #624 from ehuggett/nit
set a default MIME type in file metadata
2017-10-31 11:09:01 -07:00
Roberto Alvarado
2b25b6a6ea Pontoon: Update Spanish (Mexico) (es-MX) localization of Test Pilot: Firefox Send
Localization authors:
- Roberto Alvarado <ralv888@gmail.com>
2017-10-31 16:52:02 +00:00
Francesco Lodolo
780ed3120e Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Francesco Lodolo <francesco.lodolo@mozillaitalia.org>
2017-10-31 16:31:20 +00:00
Bjørn I
bdd3cbd4c7 Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Bjørn I. <bjorn.svindseth@online.no>
2017-10-31 15:11:35 +00:00
Rhoslyn Prys
0c8013038f Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2017-10-31 13:54:03 +00:00
Selim Şumlu
c020d59c56 Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2017-10-31 13:53:56 +00:00
Juraj Cigáň
a5c336494b Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2017-10-31 13:53:51 +00:00
Luiz Carlos de Morais
aaa4655f45 Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Luiz Carlos de Morais <lcom_flip@hotmail.com>
2017-10-31 13:53:48 +00:00
reza.habibi2008
ed18ec0bc5 Pontoon: Update Persian (fa) localization of Test Pilot: Firefox Send
Localization authors:
- reza.habibi2008 <reza.habibi2008@gmail.com>
2017-10-31 13:53:42 +00:00
Håvar Henriksen
1de43f31b6 Pontoon: Update Norwegian Bokmål (nb-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Håvar Henriksen <havar@firefox.no>
2017-10-31 13:53:38 +00:00
manxmensch
1a04c86edd Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2017-10-31 13:53:34 +00:00
YFdyh000
2bbdcae82e Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2017-10-31 13:53:30 +00:00
Nihad
9b0aa5d601 Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad <nihad.suljic92@gmail.com>
2017-10-31 13:53:27 +00:00
Pin-guang Chen
cdc261e30a Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2017-10-31 04:51:09 +00:00
Enol
09133a66b0 Pontoon: Update Asturian (ast) localization of Test Pilot: Firefox Send
Localization authors:
- Enol <enolp@softastur.org>
2017-10-31 00:31:16 +00:00
Matjaž Horvat
64f1a31533 Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Matjaž Horvat <matjaz.horvat@gmail.com>
2017-10-30 23:11:54 +00:00
manxmensch
9a92a50a5f Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2017-10-30 23:11:40 +00:00
Juan Esteban Ajsivinac Sián
2afd93e82f Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2017-10-30 23:11:36 +00:00
Kohei Yoshino
cb62cc1e9d Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2017-10-30 23:11:25 +00:00
Luna Jernberg
2cd3fc5af9 Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Luna Jernberg <bittin@cafe8bitar.se>
2017-10-30 22:51:11 +00:00
Michael Köhler
bac710a17f Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2017-10-30 21:30:48 +00:00
Ton
fb8b0f78ca Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Ton <tonnes.mb@gmail.com>
2017-10-30 21:11:34 +00:00
Michael Wolf
e18ce15753 Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2017-10-30 20:51:39 +00:00
Michael Wolf
ed8ce9e3ca Pontoon: Update Sorbian, Lower (dsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2017-10-30 20:51:36 +00:00
Victor Bychek
af5ef04115 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2017-10-30 20:51:33 +00:00
Théo Chevalier
9530a3df52 Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2017-10-30 20:51:29 +00:00
albertdcastro
2794ac653f Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- albertdcastro <albertdcastro@gmail.com>
2017-10-30 20:30:56 +00:00
Balázs Meskó
43eb758d73 Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2017-10-30 20:30:53 +00:00
Fjoerfoks
d0364cd101 Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2017-10-30 20:30:50 +00:00
Danny Coates
6a008bf312 Merge pull request #612 from mozilla/password-nits
Password UI nits
2017-10-30 12:59:29 -07:00
Danny Coates
dfb271410c use relative path for the url() in css so webpack can substitute the hashed asset name 2017-10-30 12:54:59 -07:00
Danny Coates
789d67209c Merge pull request #617 from mozilla/drop-nav
allow drag and drop if navigating from shared page
2017-10-30 10:20:56 -07:00
Erica
a31f6b75d9 Merge pull request #608 from mozilla/link-copy
disable copying link when password not completed
2017-10-30 10:42:09 -04:00
Erica Wright
f814427a7d clear password input on toggle off 2017-10-30 10:29:49 -04:00
Jae Hyeon Park
b0307e92d4 Pontoon: Update Korean (ko) localization of Test Pilot: Firefox Send
Localization authors:
- Hyeonseok Shin <hyeonseok@gmail.com>
- Jae Hyeon Park <wogus150@naver.com>
2017-10-30 02:30:30 +00:00
Cristian Silaghi
7fa3d69aa1 Pontoon: Update Romanian (ro) localization of Test Pilot: Firefox Send
Localization authors:
- Cristian Silaghi <cristian.silaghi@mozilla.ro>
2017-10-29 16:51:08 +00:00
ehuggett
58555a6b85 set a default MIME type 2017-10-27 22:41:20 +01:00
Abdalrahman Hwoij
52113395db Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- Abdalrahman Hwoij <howij1995@gmail.com>
- صفا الفليج <safa1996alfulaij@gmail.com>
2017-10-26 18:51:13 +00:00
صفا الفليج
8dd1309c21 Pontoon: Update Arabic (ar) localization of Test Pilot: Firefox Send
Localization authors:
- Abdalrahman Hwoij <howij1995@gmail.com>
- صفا الفليج <safa1996alfulaij@gmail.com>
2017-10-26 18:31:41 +00:00
Erica Wright
202e428412 display spaces as they were originally in the password 2017-10-25 15:48:01 -04:00
Erica Wright
6e7ed3cea3 password maxlength and wrapping 2017-10-25 10:50:37 -04:00
Erica Wright
41cb49141b allow drag and drop if navigating from shared page 2017-10-24 16:45:05 -04:00
Erica Wright
82a8283b6e remove unsightly auto-applied margin from safari buttons 2017-10-24 15:08:57 -04:00
Erica Wright
a5d28adc44 focus password field when clicking password checkbox 2017-10-24 12:47:03 -04:00
Erica Wright
82e206bccf password input at smaller screens 2017-10-24 12:36:09 -04:00
Erica Wright
1e4d6646c6 style password checkbox 2017-10-23 15:36:05 -04:00
Erica
acbf9fc32f Merge pull request #605 from mozilla/password-alignment
align the "Password" and "Copy to clipboard" fields.
2017-10-23 13:31:20 -04:00
Erica Wright
046f227003 disable copying link when password not completed 2017-10-23 09:53:12 -04:00
eljuno
50ac9e32be Pontoon: Update Indonesian (id) localization of Test Pilot: Firefox Send
Localization authors:
- eljuno <eljunotrie_anggoro@yahoo.co.id>
2017-10-21 17:10:38 +00:00
Erica Wright
3459dcaa15 align the "Password" and "Copy to clipboard" fields. 2017-10-20 16:21:04 -04:00
Enol
9410defab6 Pontoon: Update Asturian (ast) localization of Test Pilot: Firefox Send
Localization authors:
- Enol <enolp@softastur.org>
2017-10-19 21:31:42 +00:00
Nihad
b5a26e11f8 Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad <nihad.suljic92@gmail.com>
2017-10-19 09:11:14 +00:00
Nihad
c51481628d Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad <nihad.suljic92@gmail.com>
2017-10-19 08:51:17 +00:00
Nihad
24fa51a12c Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad <nihad.suljic92@gmail.com>
2017-10-19 07:51:22 +00:00
Nihad
7328520d05 Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad <nihad.suljic92@gmail.com>
2017-10-19 07:31:28 +00:00
Nihad
409d206f1e Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad <nihad.suljic92@gmail.com>
2017-10-19 07:11:04 +00:00
Nihad
b0b393f3d9 Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad <nihad.suljic92@gmail.com>
2017-10-19 06:51:09 +00:00
Nihad
c4499088c8 Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad <nihad.suljic92@gmail.com>
2017-10-19 06:31:38 +00:00
Nihad
4cccd6ac5c Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- Nihad <nihad.suljic92@gmail.com>
2017-10-19 06:10:50 +00:00
Michal Stanke
188b28fce3 Pontoon: Update Czech (cs) localization of Test Pilot: Firefox Send
Localization authors:
- Michal Stanke <mstanke@mozilla.cz>
2017-10-17 12:31:48 +00:00
Sander Lepik
24adda6c7d Pontoon: Update Estonian (et) localization of Test Pilot: Firefox Send
Localization authors:
- Sander Lepik <sander.lepik@eesti.ee>
2017-10-16 20:10:49 +00:00
Sander Lepik
4b49302fbe Pontoon: Update Estonian (et) localization of Test Pilot: Firefox Send
Localization authors:
- Sander Lepik <sander.lepik@eesti.ee>
2017-10-16 19:51:40 +00:00
Emin Mastizada
402ab350de Pontoon: Update Azerbaijani (az) localization of Test Pilot: Firefox Send
Localization authors:
- Emin Mastizada <emin@mastizada.com>
2017-10-16 02:51:20 +00:00
Juraj Cigáň
47b68770af Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2017-10-15 21:31:54 +00:00
Marcelo Poli
60aa16a327 Pontoon: Update Spanish (Argentina) (es-AR) localization of Test Pilot: Firefox Send
Localization authors:
- Marcelo Poli <enzomatrix@gmail.com>
2017-10-15 18:10:48 +00:00
Μιχάλης
5702a4806b Pontoon: Update Greek (el) localization of Test Pilot: Firefox Send
Localization authors:
- Jim Spentzos <jamesspentzos@hotmail.com>
- Μιχάλης <mikem132@protonmail.com>
2017-10-14 22:10:56 +00:00
mirzet.omerovic.1992
74c4bdb660 Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- mirzet.omerovic.1992 <mirzet.omerovic.1992@gmail.com>
2017-10-14 12:10:55 +00:00
mirzet.omerovic.1992
203a2cf7fb Pontoon: Update Bosnian (bs) localization of Test Pilot: Firefox Send
Localization authors:
- mirzet.omerovic.1992 <mirzet.omerovic.1992@gmail.com>
2017-10-14 11:51:07 +00:00
eljuno
1faa2733b3 Pontoon: Update Indonesian (id) localization of Test Pilot: Firefox Send
Localization authors:
- eljuno <eljunotrie_anggoro@yahoo.co.id>
2017-10-13 18:10:42 +00:00
Georgianizator
ffa432a876 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2017-10-13 02:51:30 +00:00
Georgianizator
009fd29265 Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2017-10-13 02:31:25 +00:00
Georgianizator
8f05c2324e Pontoon: Update Georgian (ka) localization of Test Pilot: Firefox Send
Localization authors:
- Georgianizator <georgianization@outlook.com>
2017-10-13 02:10:59 +00:00
Michael Wolf
e1ab515883 Pontoon: Update Sorbian, Lower (dsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2017-10-12 20:11:08 +00:00
Mark Heijl
a68a7a60a7 Pontoon: Update Dutch (nl) localization of Test Pilot: Firefox Send
Localization authors:
- Mark Heijl <markh@babelzilla.org>
- Ton <tonnes.mb@gmail.com>
2017-10-12 02:51:16 +00:00
Roberto Alvarado
b4dc274646 Pontoon: Update Spanish (Mexico) (es-MX) localization of Test Pilot: Firefox Send
Localization authors:
- Roberto Alvarado <ralv888@gmail.com>
2017-10-11 16:51:41 +00:00
Arash Mousavi
b31892bdc6 Pontoon: Update Persian (fa) localization of Test Pilot: Firefox Send
Localization authors:
- Arash Mousavi <mousavi.arash@gmail.com>
2017-10-11 16:12:18 +00:00
Maykon Chagas
f388a1348d Pontoon: Update Portuguese (Brazil) (pt-BR) localization of Test Pilot: Firefox Send
Localization authors:
- Maykon Chagas <mchagas@riseup.net>
2017-10-11 15:32:02 +00:00
Francesco Lodolo
52dacbddf9 Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Francesco Lodolo <francesco.lodolo@mozillaitalia.org>
2017-10-11 13:51:50 +00:00
savemore99.sm
cc52f60aa1 Pontoon: Update Italian (it) localization of Test Pilot: Firefox Send
Localization authors:
- Francesco Lodolo <francesco.lodolo@mozillaitalia.org>
- savemore99.sm <savemore99.sm@gmail.com>
2017-10-11 13:33:29 +00:00
Victor Bychek
1af818b691 Pontoon: Update Russian (ru) localization of Test Pilot: Firefox Send
Localization authors:
- Victor Bychek <a@bychek.ru>
2017-10-11 12:51:50 +00:00
Balázs Meskó
d76f7758e7 Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2017-10-11 12:31:59 +00:00
Selim Şumlu
48ab2f2400 Pontoon: Update Turkish (tr) localization of Test Pilot: Firefox Send
Localization authors:
- Selim Şumlu <selim@sum.lu>
2017-10-11 12:11:35 +00:00
Balázs Meskó
0aa844eebc Pontoon: Update Hungarian (hu) localization of Test Pilot: Firefox Send
Localization authors:
- Balázs Meskó <meskobalazs@gmail.com>
2017-10-11 12:11:32 +00:00
Bjørn I
481b02ccf2 Pontoon: Update Norwegian Nynorsk (nn-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Bjørn I. <bjorn.svindseth@online.no>
2017-10-11 11:11:27 +00:00
Rok Žerdin
67e6ef6fda Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Rok Žerdin <rok.zerdin1990@gmail.com>
2017-10-11 08:31:40 +00:00
Fjoerfoks
7d19f86d7a Pontoon: Update Frisian (fy-NL) localization of Test Pilot: Firefox Send
Localization authors:
- Fjoerfoks <fryskefirefox@gmail.com>
2017-10-11 08:31:33 +00:00
Rhoslyn Prys
2d27d8a47c Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2017-10-11 07:51:11 +00:00
Håvar Henriksen
10fac130ef Pontoon: Update Norwegian Bokmål (nb-NO) localization of Test Pilot: Firefox Send
Localization authors:
- Håvar Henriksen <havar@firefox.no>
2017-10-11 07:31:25 +00:00
Rok Žerdin
c6b632543d Pontoon: Update Slovenian (sl) localization of Test Pilot: Firefox Send
Localization authors:
- Rok Žerdin <rok.zerdin1990@gmail.com>
2017-10-11 05:31:31 +00:00
Kohei Yoshino
32eb8157eb Pontoon: Update Japanese (ja) localization of Test Pilot: Firefox Send
Localization authors:
- Kohei Yoshino <kohei.yoshino@gmail.com>
2017-10-11 03:51:18 +00:00
Pin-guang Chen
3628f22114 Pontoon: Update Chinese (Taiwan) (zh-TW) localization of Test Pilot: Firefox Send
Localization authors:
- Pin-guang Chen <petercpg@mail.moztw.org>
2017-10-11 03:51:15 +00:00
Théo Chevalier
177fa37041 Pontoon: Update French (fr) localization of Test Pilot: Firefox Send
Localization authors:
- Théo Chevalier <theo.chevalier11@gmail.com>
2017-10-11 01:31:39 +00:00
Andreas Pettersson
717f6576ea Pontoon: Update Swedish (sv-SE) localization of Test Pilot: Firefox Send
Localization authors:
- Andreas Pettersson <az@kth.se>
2017-10-11 00:31:17 +00:00
Marko Andrejić
f1b2ffa0fa Pontoon: Update Serbian (sr) localization of Test Pilot: Firefox Send
Localization authors:
- Marko Andrejić <marko.andrejic93@gmail.com>
2017-10-10 23:51:34 +00:00
Juan Esteban Ajsivinac Sián
ac73c23c73 Pontoon: Update Kaqchikel (cak) localization of Test Pilot: Firefox Send
Localization authors:
- Juan Esteban Ajsivinac Sián <ajtzibsyan@yahoo.com>
2017-10-10 23:31:25 +00:00
manxmensch
ac40308b1c Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2017-10-10 22:51:19 +00:00
ravmn
6fb81aa78c Pontoon: Update Spanish (Chile) (es-CL) localization of Test Pilot: Firefox Send
Localization authors:
- ravmn <ravmn@ravmn.cl>
2017-10-10 22:31:22 +00:00
manxmensch
92430c78c2 Pontoon: Update Malay (ms) localization of Test Pilot: Firefox Send
Localization authors:
- manxmensch <manxmensch@gmail.com>
2017-10-10 22:31:18 +00:00
jlG
cb7ddaa295 Pontoon: Update Spanish (Spain) (es-ES) localization of Test Pilot: Firefox Send
Localization authors:
- jlG <jlg.l10n.es@gmail.com>
2017-10-10 22:11:16 +00:00
Michael Wolf
786d079632 Pontoon: Update Sorbian, Upper (hsb) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Wolf <milupo@sorbzilla.de>
2017-10-10 21:31:34 +00:00
Rodrigo
4af25a505a Pontoon: Update Portuguese (Portugal) (pt-PT) localization of Test Pilot: Firefox Send
Localization authors:
- Rodrigo <rodrigo.mcunha@hotmail.com>
2017-10-10 21:31:31 +00:00
YFdyh000
3218803aae Pontoon: Update Chinese (China) (zh-CN) localization of Test Pilot: Firefox Send
Localization authors:
- YFdyh000 <yfdyh000@gmail.com>
2017-10-10 21:11:17 +00:00
Michael Köhler
2311d5bcef Pontoon: Update German (de) localization of Test Pilot: Firefox Send
Localization authors:
- Michael Köhler <michael.koehler1@gmx.de>
2017-10-10 20:11:27 +00:00
Danny Coates
e56d92334f Merge pull request #582 from mozilla/split
Add optional password to the download url
2017-10-10 12:42:53 -07:00
Danny Coates
bc24a069da Add optional password to the download url 2017-10-10 10:45:10 -07:00
Danny Coates
837747f8f7 bump version 2017-10-10 10:34:45 -07:00
Danny Coates
a8c32ae49c Merge pull request #583 from mozilla/beef
Promote the beefy UI to default
2017-10-10 10:27:10 -07:00
Danny Coates
32c5b414de use beefy ui 2017-10-10 10:20:49 -07:00
Danny Coates
12c81a22e8 updated deps 2017-10-10 10:08:11 -07:00
Danny Coates
0c5d0d4bb2 Merge pull request #581 from tiagomoraismorgado88/patch-4
introducing ToC to README.md
2017-10-09 14:10:12 -07:00
tiagomoraismorgado
234f9c624d introducing ToC to README.md
**this PR does basically aim at:**
- *introducing ToC to README.md file*
2017-10-06 20:03:14 +01:00
Danny Coates
da669b44ff Merge pull request #579 from mozilla/cancel
Hide cancel button when upload reaches 100%
2017-10-06 11:41:09 -07:00
Danny Coates
3c39f5f085 Merge pull request #580 from mozilla/favicon
Change Favicon in to look better in a variety of cases
2017-10-06 11:40:06 -07:00
Erica Wright
6de91b5872 Change Favicon in to look better in a variety of cases 2017-10-06 11:24:17 -04:00
Rhoslyn Prys
ff9a0979f6 Pontoon: Update Welsh (cy) localization of Test Pilot: Firefox Send
Localization authors:
- Rhoslyn Prys <rprys@yahoo.com>
2017-10-05 16:13:35 +00:00
Erica Wright
e1e8af2489 Hide cancel button when upload reached 100% 2017-10-04 16:34:41 -04:00
Erica
1eb000f615 Merge pull request #571 from ehuggett/svg-logo
Centre logo
2017-10-04 13:25:35 -04:00
ehuggett
e20fd97e59 Centre logo by using transform (not optimal) 2017-10-04 00:05:45 +01:00
Erica
d10ceacd67 Merge pull request #574 from ehuggett/tab-upload
Make upload button focusable (accessibility/tab navigation)
2017-10-02 20:15:37 -04:00
ehuggett
208c28ee01 Make upload button focusable (accessibility/tab navigation) 2017-10-02 23:04:55 +01:00
Danny Coates
cdd1bb3c29 updated deps 2017-10-02 13:03:56 -07:00
Danny Coates
3d9c4fa320 added .nsprc 2017-10-02 12:04:03 -07:00
Danny Coates
9c4d18ef3b updated deps 2017-10-02 11:44:35 -07:00
Juraj Cigáň
ce9ff3959f Pontoon: Update Slovak (sk) localization of Test Pilot: Firefox Send
Localization authors:
- Juraj Cigáň <kusavica@gmail.com>
2017-09-30 17:51:09 +00:00
eljuno
51aef4e1e5 Pontoon: Update Indonesian (id) localization of Test Pilot: Firefox Send
Localization authors:
- eljuno <eljunotrie_anggoro@yahoo.co.id>
2017-09-28 18:50:47 +00:00
hello
90247059d0 Pontoon: Update Hebrew (he) localization of Test Pilot: Firefox Send
Localization authors:
- Yaron Shahrabani <sh.yaron@gmail.com>
- hello <hello@ira.abramov.org>
2017-09-27 18:11:56 +00:00
221 changed files with 19390 additions and 6697 deletions

View File

@@ -6,3 +6,5 @@ assets
docs
public
test
coverage
.nyc_output

View File

@@ -1,3 +1,4 @@
dist
assets
firefox
coverage

4
.gitignore vendored
View File

@@ -1,2 +1,6 @@
node_modules
coverage
dist
.idea
.DS_Store
.nyc_output

View File

@@ -1,2 +1,3 @@
dist
assets/*.js
coverage

View File

@@ -1,5 +1,98 @@
## Change Log
### v2.5.1 (2018/03/12 19:26 +00:00)
- [#789](https://github.com/mozilla/send/pull/789) Fixed #775 : Made text not-selectable (@RCMainak)
### v2.5.0 (2018/03/08 19:31 +00:00)
- [#782](https://github.com/mozilla/send/pull/782) updated docs (@dannycoates)
- [#781](https://github.com/mozilla/send/pull/781) Don't translate URL-safe chars, b64 is doing it for us (@timvisee)
- [#779](https://github.com/mozilla/send/pull/779) implemented crypto polyfills for ms edge (@dannycoates)
### v2.4.1 (2018/02/28 17:05 +00:00)
- [#777](https://github.com/mozilla/send/pull/777) use a separate circle in the progress svg for indefinite progress (@dannycoates)
### v2.4.0 (2018/02/27 01:55 +00:00)
- [#769](https://github.com/mozilla/send/pull/769) removed unsafe-inline styles via svgo-loader (@dannycoates)
- [#767](https://github.com/mozilla/send/pull/767) added coverage artifact to circleci (@dannycoates)
- [#766](https://github.com/mozilla/send/pull/766) Some frontend unit tests [WIP] (@dannycoates)
- [#761](https://github.com/mozilla/send/pull/761) added maxPasswordLength and passwordError messages (@dannycoates)
- [#764](https://github.com/mozilla/send/pull/764) added indefinite progress mode (@dannycoates)
- [#760](https://github.com/mozilla/send/pull/760) refactored css: phase 1 (@dannycoates)
- [#759](https://github.com/mozilla/send/pull/759) Switch en-US FTL file to new syntax (@flodolo)
- [#758](https://github.com/mozilla/send/pull/758) refactored server (@dannycoates)
- [#757](https://github.com/mozilla/send/pull/757) Update to fluent 0.4.3 (@stasm)
### v2.3.0 (2018/02/01 23:27 +00:00)
- [#536](https://github.com/mozilla/send/pull/536) use redis expire event to delete stored data immediately (@ehuggett)
- [#744](https://github.com/mozilla/send/pull/744) Gradient experiment (@dannycoates)
- [#739](https://github.com/mozilla/send/pull/739) added /api/info/:id route (@dannycoates)
- [#737](https://github.com/mozilla/send/pull/737) big refactor (@dannycoates)
- [#722](https://github.com/mozilla/send/pull/722) Add localization note to 'Time' and 'Downloads' string (@flodolo)
- [#721](https://github.com/mozilla/send/pull/721) show download Limits on page; Fixes #661 (@shikhar-scs)
- [#694](https://github.com/mozilla/send/pull/694) Passwords can now be changed (#687) (@himanish-star)
- [#702](https://github.com/mozilla/send/pull/702) Restricted the banner from showing on unsupported browsers (@himanish-star)
- [#701](https://github.com/mozilla/send/pull/701) improved popup for mobile display; Fixes #699 (@shikhar-scs)
- [#683](https://github.com/mozilla/send/pull/683) API changes to accommodate 3rd party clients (@ehuggett)
- [#698](https://github.com/mozilla/send/pull/698) Popup for delete button attached (@himanish-star)
- [#695](https://github.com/mozilla/send/pull/695) Show Warning, Cancel and Redirect on size > 2GB ; fixes #578 (@shikhar-scs)
- [#684](https://github.com/mozilla/send/pull/684) delete btn popup attached (@himanish-star)
- [#686](https://github.com/mozilla/send/pull/686) Hide password while Typing and after Entering: Fixes #670 (@shikhar-scs)
- [#679](https://github.com/mozilla/send/pull/679) changed font to sans sherif: Solves #676 (@shikhar-scs)
- [#693](https://github.com/mozilla/send/pull/693) README: Fix query link for "good first bugs" (@jspam)
- [#685](https://github.com/mozilla/send/pull/685) checkbox now has a hover effect: fixes #635 (@himanish-star)
- [#668](https://github.com/mozilla/send/pull/668) Add possibility to bind to a specific IP address (@TwizzyDizzy)
- [#682](https://github.com/mozilla/send/pull/682) [Docs] - README.md - minor spelling fixes (@tmm2018)
- [#672](https://github.com/mozilla/send/pull/672) Use EXPIRE_SECONDS to calculate file ttl for static content (@derektamsen)
- [#680](https://github.com/mozilla/send/pull/680) adjusted line height of label : fixes #609 (@himanish-star)
### v2.2.2 (2017/12/19 18:06 +00:00)
- [#667](https://github.com/mozilla/send/pull/667) Make develop the default NODE_ENV (@claudijd)
### v2.2.1 (2017/12/08 18:00 +00:00)
- [#665](https://github.com/mozilla/send/pull/665) stop drag target from flickering when dragging over children (@ericawright)
### v2.2.0 (2017/12/06 23:57 +00:00)
- [#654](https://github.com/mozilla/send/pull/654) Multiple download UI (@dannycoates)
- [#650](https://github.com/mozilla/send/pull/650) #634: overwrite appearance of password submit input (@ovlb)
- [#649](https://github.com/mozilla/send/pull/649) #609 share interface: align text in input and button (@ovlb)
### v2.1.2 (2017/11/16 19:03 +00:00)
- [#645](https://github.com/mozilla/send/pull/645) Remove the leak of the password into the console (@laurentj)
### v2.1.0 (2017/11/15 03:07 +00:00)
- [#641](https://github.com/mozilla/send/pull/641) Added experiment for firefox download promo (@dannycoates)
- [#640](https://github.com/mozilla/send/pull/640) use fluent-langneg for subtag support (@dannycoates)
- [#639](https://github.com/mozilla/send/pull/639) wrap number localization in try/catch (@dannycoates)
### v2.0.0 (2017/11/08 05:31 +00:00)
- [#633](https://github.com/mozilla/send/pull/633) Keyboard navigation/visual feedback regression (@ehuggett)
- [#632](https://github.com/mozilla/send/pull/632) display the 'add password' button only when the input field isn't empty (@dannycoates)
- [#626](https://github.com/mozilla/send/pull/626) Partial fix for #623 (@ehuggett)
- [#624](https://github.com/mozilla/send/pull/624) set a default MIME type in file metadata (@ehuggett)
- [#612](https://github.com/mozilla/send/pull/612) Password UI nits (@dannycoates, @ericawright)
- [#617](https://github.com/mozilla/send/pull/617) allow drag and drop if navigating from shared page (@ericawright)
- [#608](https://github.com/mozilla/send/pull/608) disable copying link when password not completed (@ericawright)
- [#605](https://github.com/mozilla/send/pull/605) align the "Password" and "Copy to clipboard" fields. (@ericawright)
- [#582](https://github.com/mozilla/send/pull/582) Add optional password to the download url (@dannycoates)
### v1.2.4 (2017/10/10 17:34 +00:00)
- [#583](https://github.com/mozilla/send/pull/583) Promote the beefy UI to default (@dannycoates)
- [#581](https://github.com/mozilla/send/pull/581) introducing ToC to README.md (@tmm2018)
- [#579](https://github.com/mozilla/send/pull/579) Hide cancel button when upload reaches 100% (@ericawright)
- [#580](https://github.com/mozilla/send/pull/580) Change Favicon in to look better in a variety of cases (@ericawright)
- [#571](https://github.com/mozilla/send/pull/571) Centre logo (@ehuggett)
- [#574](https://github.com/mozilla/send/pull/574) Make upload button focusable (accessibility/tab navigation) (@ehuggett)
### v1.2.0 (2017/09/12 22:42 +00:00)
- [#559](https://github.com/mozilla/send/pull/559) added first A/B experiment (@dannycoates)
- [#542](https://github.com/mozilla/send/pull/542) fix docker link typo (@ehuggett)
- [#541](https://github.com/mozilla/send/pull/541) removed .title and .alt attributes from ftl (@dannycoates)
- [#537](https://github.com/mozilla/send/pull/537) a few changes to make A/B testing easier (@dannycoates)
- [#533](https://github.com/mozilla/send/pull/533) minor UI fixes (@youwenliang)
- [#531](https://github.com/mozilla/send/pull/531) Add CHANGELOG script (@pdehaan)
- [#535](https://github.com/mozilla/send/pull/535) Fixed minimum NodeJS version in README (@LuFlo)
- [#528](https://github.com/mozilla/send/pull/528) adding separators to README (@tmm2018)
### v1.1.1 (2017/08/17 01:29 +00:00)
- [#516](https://github.com/mozilla/send/pull/516) cache assets (@dannycoates)
- [#520](https://github.com/mozilla/send/pull/520) fix drag & drop (@dannycoates)

View File

@@ -1,74 +1,126 @@
Abdalrahman Hwoij
Abhinav Adduri
Adnan Kičin
Alberto Castro
Alexander Slovesnik
Alfredos-Panagiotis Damkalis
Amin Mahmudian
Andreas Pettersson
Arash Mousavi
Artem Polivanchuk
Ashikur Rahman
Balázs Meskó
Belayet Hossain
Besnik Bleta
Bjørn I
Boopesh Mahendran
Breana Gonzales
Chuck Harmston
Cláudio Esperança
Cristian Silaghi
Cynthia Pereira
Daniel Thorn
Daniela Arcese
Danny Coates
Derek Tamsen
Edmund Huggett
Elisa X
Emin Mastizada
Enol
Erica
Erica Wright
Filip Hruška
Fjoerfoks
Francesco Lodolo
Francesco Lodolo [:flod]
Frederick Villaluna
Gabriela
Gautam krishna.R
Georgianizator
Gonçalo Matos
Hyeonseok Shin
Håvar Henriksen
Jae Hyeon Park
Jakub Rychlý
Jamie
Jim Spentzos
Jobava
Johann-S
John Gruen
Jon Vadillo
Jonathan Claudius
Jordi Cuevas
Jordi Serratosa
Juan Esteban Ajsivinac Sián
Juraj Cigáň
Kerim Kalamujić
Khaled Hosny
Kohei Yoshino
Lan Glad
Laurent Jouanneau
Lobodzets
LuFlo
Luiz Carlos de Morais
Luna Jernberg
Marcelo Poli
Marco Aurélio
Mark Heijl
Mark Liang
Marko Andrejić
Matjaž Horvat
Maykon Chagas
Melo46
Merike Sell
Michael Köhler
Michael Wolf
Michal Stanke
Michal Vašíček
Mozilla Pontoon
Moḥend Belqasem
Muḥend Belqasem
Nicholas Skinsacos
Nihad
Nihad Suljić
Oscar
Peter deHaan
Pierre Neter
Pin-guang Chen
Radu Popescu
Rhoslyn Prys
RickieES
Rizky Ariestiyansyah
Roberto Alvarado
Rodrigo
Rodrigo Guerra
Rok Žerdin
Sahithi
Sairam Raavi
Sander Lepik
Sandro
Sara Todaro
Sav22999
Schieck :)
Selim Şumlu
Slimane Amiri
Soumya Himanish Mohapatra
Staś Małolepszy
Tema
Thomas Dalichow
Théo Chevalier
Tiago Morais Morgado
Tomáš Zelina
Ton
Tymur Faradzhev
Uccen Marzuq
Varghese Thomas
Victor Bychek
Vitaliy Krutko
Weihang Lo
Wil Clouser
YFdyh000
You-Wen Liang (Mark)
aefgh39622
albertdcastro
alex_mayorga
ariestiyansyah
avelper
@@ -77,16 +129,29 @@ ehuggett
eljuno
erdem cobanoglu
gautamkrishnar
gmontagu
goofy
hello
hi
jesferman1993
jlG
josotrix
jspam
kenrick95
manxmensch
mirzet.omerovic.1992
ravmn
rcmainak
reza.habibi2008
savemore99.sm
shikhar-scs
siparon
skystar-p
tiagomoraismorgado
timvisee
xcffl
ybouhamam
Μιχάλης
Марко Костић (Marko Kostić)
صفا الفليج
వీవెన్

View File

@@ -3,7 +3,21 @@
[![CircleCI](https://img.shields.io/circleci/project/github/mozilla/send.svg)](https://circleci.com/gh/mozilla/send)
[![Available on Test Pilot](https://img.shields.io/badge/available_on-Test_Pilot-0996F8.svg)](https://testpilot.firefox.com/experiments/send)
**Docs:** [Docker](docs/docker.md), [Metrics](docs/metrics.md)
**Docs:** [FAQ](docs/faq.md), [Encryption](docs/encryption.md), [Build](docs/build.md), [Docker](docs/docker.md), [Metrics](docs/metrics.md), [More](docs/)
---
## Table of Contents
* [What it does](#what-it-does)
* [Requirements](#requirements)
* [Development](#development)
* [Commands](#commands)
* [Configuration](#configuration)
* [Localization](#localization)
* [Contributing](#contributing)
* [Testing](#testing)
* [License](#license)
---
@@ -55,13 +69,15 @@ The server is configured with environment variables. See [server/config.js](serv
## Localization
Firefox Send localization is managed via [Pontoon](https://pontoon.mozilla.org/projects/test-pilot-firefox-send/), not direct pull requests to the repository. If you want to fix a typo, add a new language, or simply know more about localization, please get in touch with the [existing localization team](https://pontoon.mozilla.org/teams/) for your language, or Mozillas [l10n-drivers](https://wiki.mozilla.org/L10n:Mozilla_Team#Mozilla_Corporation) for guidance.
Firefox Send localization is managed via [Pontoon](https://pontoon.mozilla.org/projects/test-pilot-firefox-send/), not direct pull requests to the repository. If you want to fix a typo, add a new language, or simply know more about localization, please get in touch with the [existing localization team](https://pontoon.mozilla.org/teams/) for your language or Mozillas [l10n-drivers](https://wiki.mozilla.org/L10n:Mozilla_Team#Mozilla_Corporation) for guidance.
see also [docs/localization.md](docs/localization.md)
---
## Contributing
Pull requests are always welcome! Feel free to check out the list of ["good first bugs"](https://github.com/mozilla/send/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+bug%22).
Pull requests are always welcome! Feel free to check out the list of ["good first issues"](https://github.com/mozilla/send/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22).
---

199
app/api.js Normal file
View File

@@ -0,0 +1,199 @@
import { arrayToB64, b64ToArray } from './utils';
function post(obj) {
return {
method: 'POST',
headers: new Headers({
'Content-Type': 'application/json'
}),
body: JSON.stringify(obj)
};
}
function parseNonce(header) {
header = header || '';
return header.split(' ')[1];
}
async function fetchWithAuth(url, params, keychain) {
const result = {};
params = params || {};
const h = await keychain.authHeader();
params.headers = new Headers({ Authorization: h });
const response = await fetch(url, params);
result.response = response;
result.ok = response.ok;
const nonce = parseNonce(response.headers.get('WWW-Authenticate'));
result.shouldRetry = response.status === 401 && nonce !== keychain.nonce;
keychain.nonce = nonce;
return result;
}
async function fetchWithAuthAndRetry(url, params, keychain) {
const result = await fetchWithAuth(url, params, keychain);
if (result.shouldRetry) {
return fetchWithAuth(url, params, keychain);
}
return result;
}
export async function del(id, owner_token) {
const response = await fetch(`/api/delete/${id}`, post({ owner_token }));
return response.ok;
}
export async function setParams(id, owner_token, params) {
const response = await fetch(
`/api/params/${id}`,
post({
owner_token,
dlimit: params.dlimit
})
);
return response.ok;
}
export async function fileInfo(id, owner_token) {
const response = await fetch(`/api/info/${id}`, post({ owner_token }));
if (response.ok) {
const obj = await response.json();
return obj;
}
throw new Error(response.status);
}
export async function metadata(id, keychain) {
const result = await fetchWithAuthAndRetry(
`/api/metadata/${id}`,
{ method: 'GET' },
keychain
);
if (result.ok) {
const data = await result.response.json();
const meta = await keychain.decryptMetadata(b64ToArray(data.metadata));
return {
size: data.size,
ttl: data.ttl,
iv: meta.iv,
name: meta.name,
type: meta.type
};
}
throw new Error(result.response.status);
}
export async function setPassword(id, owner_token, keychain) {
const auth = await keychain.authKeyB64();
const response = await fetch(
`/api/password/${id}`,
post({ owner_token, auth })
);
return response.ok;
}
export function uploadFile(
encrypted,
metadata,
verifierB64,
keychain,
onprogress
) {
const xhr = new XMLHttpRequest();
const upload = {
cancel: function() {
xhr.abort();
},
result: new Promise(function(resolve, reject) {
xhr.addEventListener('loadend', function() {
const authHeader = xhr.getResponseHeader('WWW-Authenticate');
if (authHeader) {
keychain.nonce = parseNonce(authHeader);
}
if (xhr.status === 200) {
const responseObj = JSON.parse(xhr.responseText);
return resolve({
url: responseObj.url,
id: responseObj.id,
ownerToken: responseObj.owner
});
}
reject(new Error(xhr.status));
});
})
};
const dataView = new DataView(encrypted);
const blob = new Blob([dataView], { type: 'application/octet-stream' });
const fd = new FormData();
fd.append('data', blob);
xhr.upload.addEventListener('progress', function(event) {
if (event.lengthComputable) {
onprogress([event.loaded, event.total]);
}
});
xhr.open('post', '/api/upload', true);
xhr.setRequestHeader('X-File-Metadata', arrayToB64(new Uint8Array(metadata)));
xhr.setRequestHeader('Authorization', `send-v1 ${verifierB64}`);
xhr.send(fd);
return upload;
}
function download(id, keychain, onprogress, canceller) {
const xhr = new XMLHttpRequest();
canceller.oncancel = function() {
xhr.abort();
};
return new Promise(async function(resolve, reject) {
xhr.addEventListener('loadend', function() {
canceller.oncancel = function() {};
const authHeader = xhr.getResponseHeader('WWW-Authenticate');
if (authHeader) {
keychain.nonce = parseNonce(authHeader);
}
if (xhr.status !== 200) {
return reject(new Error(xhr.status));
}
const blob = new Blob([xhr.response]);
const fileReader = new FileReader();
fileReader.readAsArrayBuffer(blob);
fileReader.onload = function() {
resolve(this.result);
};
});
xhr.addEventListener('progress', function(event) {
if (event.lengthComputable && event.target.status === 200) {
onprogress([event.loaded, event.total]);
}
});
const auth = await keychain.authHeader();
xhr.open('get', `/api/download/${id}`);
xhr.setRequestHeader('Authorization', auth);
xhr.responseType = 'blob';
xhr.send();
});
}
async function tryDownload(id, keychain, onprogress, canceller, tries = 1) {
try {
const result = await download(id, keychain, onprogress, canceller);
return result;
} catch (e) {
if (e.message === '401' && --tries > 0) {
return tryDownload(id, keychain, onprogress, canceller, tries);
}
throw e;
}
}
export function downloadFile(id, keychain, onprogress) {
const canceller = {
oncancel: function() {} // download() sets this
};
function cancel() {
canceller.oncancel();
}
return {
cancel,
result: tryDownload(id, keychain, onprogress, canceller, 2)
};
}

268
app/base.css Normal file
View File

@@ -0,0 +1,268 @@
:root {
--pageBGColor: #fff;
--primaryControlBGColor: #0297f8;
--primaryControlFGColor: #fff;
--primaryControlHoverColor: #0287e8;
--inputTextColor: #737373;
--errorColor: #d70022;
--linkColor: #0094fb;
--textColor: #0c0c0d;
--lightTextColor: #737373;
--successControlBGColor: #05a700;
--successControlFGColor: #fff;
}
html {
background: url('../assets/send_bg.svg');
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui',
'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif;
font-weight: 200;
background-size: 110%;
background-repeat: no-repeat;
background-position: center top;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui',
'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif;
display: flex;
flex-direction: column;
margin: 0;
min-height: 100vh;
}
input,
select,
textarea,
button {
font-family: inherit;
margin: 0;
}
a {
text-decoration: none;
}
.main {
flex: auto;
max-width: 650px;
margin: 0 auto;
padding: 0 20px;
box-sizing: border-box;
width: 96%;
}
.noscript {
text-align: center;
border: 3px solid var(--errorColor);
border-radius: 6px;
}
.btn {
font-size: 15px;
font-weight: 500;
color: var(--primaryControlFGColor);
cursor: pointer;
text-align: center;
background: var(--primaryControlBGColor);
border: 1px solid var(--primaryControlBGColor);
border-radius: 5px;
}
.btn:hover {
background-color: var(--primaryControlHoverColor);
}
.btn--cancel {
color: var(--errorColor);
background: var(--pageBGColor);
font-size: 15px;
border: 0;
cursor: pointer;
text-decoration: underline;
}
.btn--cancel:disabled {
text-decoration: none;
cursor: auto;
}
.btn--cancel:hover {
background-color: var(--pageBGColor);
}
.input {
flex: 2 0 auto;
border: 1px solid var(--primaryControlBGColor);
border-radius: 6px 0 0 6px;
font-size: 20px;
color: var(--inputTextColor);
font-family: 'SF Pro Text', sans-serif;
letter-spacing: 0;
line-height: 23px;
font-weight: 300;
height: 46px;
padding-left: 10px;
padding-right: 10px;
}
.input--error {
border-color: var(--errorColor);
}
.input--noBtn {
border-radius: 6px;
}
.inputBtn {
flex: auto;
background: var(--primaryControlBGColor);
border-radius: 0 6px 6px 0;
border: 1px solid var(--primaryControlBGColor);
color: var(--primaryControlFGColor);
cursor: pointer;
/* Force flat button look */
/* stylelint-disable-next-line plugin/no-unsupported-browser-features */
appearance: none;
font-size: 15px;
padding-bottom: 3px;
padding-left: 10px;
padding-right: 10px;
white-space: nowrap;
}
.inputBtn:disabled {
cursor: auto;
}
.inputBtn:hover {
background-color: var(--primaryControlHoverColor);
}
.inputBtn--hidden {
display: none;
}
.cursor--pointer {
cursor: pointer;
}
.link {
color: var(--linkColor);
text-decoration: none;
}
.link:focus,
.link:active,
.link:hover {
color: var(--primaryControlHoverColor);
}
.link--action {
text-decoration: underline;
text-align: center;
}
.page {
margin: 0 auto 30px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
}
.progressSection {
margin: 0 auto;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
font-size: 15px;
}
.progressSection__text {
color: var(--lightTextColor);
letter-spacing: -0.4px;
margin-top: 24px;
margin-bottom: 74px;
}
.effect--fadeOut {
opacity: 0;
animation: fadeout 200ms linear;
}
@keyframes fadeout {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.effect--fadeIn {
opacity: 1;
animation: fadein 200ms linear;
}
@keyframes fadein {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.error {
color: var(--errorColor);
}
.title {
font-size: 33px;
line-height: 40px;
margin: 20px auto;
text-align: center;
max-width: 520px;
font-family: 'SF Pro Text', sans-serif;
word-wrap: break-word;
}
.description {
font-size: 15px;
line-height: 23px;
max-width: 630px;
text-align: center;
margin: 0 auto 60px;
color: var(--textColor);
width: 92%;
}
@media (max-device-width: 768px), (max-width: 768px) {
.description {
margin: 0 auto 25px;
}
}
@media (max-device-width: 520px), (max-width: 520px) {
.input {
font-size: 22px;
padding: 10px 10px;
border-radius: 6px 6px 0 0;
}
.inputBtn {
border-radius: 0 0 6px 6px;
flex: 0 1 65px;
}
.input--noBtn {
border-radius: 6px;
}
}

View File

@@ -1,3 +1,6 @@
/* global MAXFILESIZE */
const { bytes } = require('./utils');
export default function(state, emitter) {
emitter.on('DOMContentLoaded', () => {
document.body.addEventListener('dragover', event => {
@@ -6,17 +9,28 @@ export default function(state, emitter) {
}
});
document.body.addEventListener('drop', event => {
if (state.route === '/' && !state.transfer) {
if (state.route === '/' && !state.uploading) {
event.preventDefault();
document.querySelector('.upload-window').classList.remove('ondrag');
document
.querySelector('.uploadArea')
.classList.remove('uploadArea--dragging');
const target = event.dataTransfer;
if (target.files.length === 0) {
return;
}
if (target.files.length > 1 || target.files[0].size === 0) {
if (target.files.length > 1) {
// eslint-disable-next-line no-alert
return alert(state.translate('uploadPageMultipleFilesAlert'));
}
const file = target.files[0];
if (file.size === 0) {
return;
}
if (file.size > MAXFILESIZE) {
// eslint-disable-next-line no-alert
alert(state.translate('fileTooBig', { size: bytes(MAXFILESIZE) }));
return;
}
emitter.emit('upload', { file, type: 'drop' });
}
});

View File

@@ -1,28 +1,33 @@
import hash from 'string-hash';
const experiments = {
'5YHCzn2CQTmBwWwTmZupBA': {
id: '5YHCzn2CQTmBwWwTmZupBA',
S9wqVl2SQ4ab2yZtqDI3Dw: {
id: 'S9wqVl2SQ4ab2yZtqDI3Dw',
run: function(variant, state, emitter) {
state.experiment = {
xid: this.id,
xvar: variant
};
// Beefy UI
if (variant === 1) {
state.config.uploadWindowStyle = 'upload-window upload-window-b';
state.config.uploadButtonStyle = 'btn browse browse-b';
} else {
state.config.uploadWindowStyle = 'upload-window';
state.config.uploadButtonStyle = 'btn browse';
switch (variant) {
case 1:
state.promo = 'blue';
break;
case 2:
state.promo = 'pink';
break;
default:
state.promo = 'grey';
}
emitter.emit('render');
},
eligible: function(state) {
return this.luckyNumber(state) >= 0.5;
eligible: function() {
return (
!/firefox|fxios/i.test(navigator.userAgent) &&
document.querySelector('html').lang === 'en-US'
);
},
variant: function(state) {
return this.luckyNumber(state) < 0.75 ? 0 : 1;
const n = this.luckyNumber(state);
if (n < 0.33) {
return 0;
}
return n < 0.66 ? 1 : 2;
},
luckyNumber: function(state) {
return luckyNumber(
@@ -33,6 +38,7 @@ const experiments = {
};
//Returns a number between 0 and 1
// eslint-disable-next-line no-unused-vars
function luckyNumber(str) {
return hash(str) / 0xffffffff;
}
@@ -61,12 +67,12 @@ export default function initialize(state, emitter) {
checkExperiments(state, emitter);
});
} else {
const enrolled = state.storage.enrolled;
enrolled.forEach(([id, variant]) => {
const enrolled = state.storage.enrolled.filter(([id, variant]) => {
const xp = experiments[id];
if (xp) {
xp.run(variant, state, emitter);
}
return !!xp;
});
// single experiment per session for now
if (enrolled.length === 0) {

View File

@@ -1,57 +1,14 @@
/* global EXPIRE_SECONDS */
import FileSender from './fileSender';
import FileReceiver from './fileReceiver';
import { copyToClipboard, delay, fadeOut, percent } from './utils';
import {
copyToClipboard,
delay,
fadeOut,
openLinksInNewTab,
percent
} from './utils';
import * as metrics from './metrics';
function saveFile(file) {
const dataView = new DataView(file.plaintext);
const blob = new Blob([dataView], { type: file.type });
const downloadUrl = URL.createObjectURL(blob);
if (window.navigator.msSaveBlob) {
return window.navigator.msSaveBlob(blob, file.name);
}
const a = document.createElement('a');
a.href = downloadUrl;
a.download = file.name;
document.body.appendChild(a);
a.click();
URL.revokeObjectURL(downloadUrl);
}
function openLinksInNewTab(links, should = true) {
links = links || Array.from(document.querySelectorAll('a:not([target])'));
if (should) {
links.forEach(l => {
l.setAttribute('target', '_blank');
l.setAttribute('rel', 'noopener noreferrer');
});
} else {
links.forEach(l => {
l.removeAttribute('target');
l.removeAttribute('rel');
});
}
return links;
}
function exists(id) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
resolve(xhr.status === 200);
}
};
xhr.onerror = () => resolve(false);
xhr.ontimeout = () => resolve(false);
xhr.open('get', '/api/exists/' + id);
xhr.timeout = 2000;
xhr.send();
});
}
export default function(state, emitter) {
let lastRender = 0;
let updateTitle = false;
@@ -61,13 +18,17 @@ export default function(state, emitter) {
}
async function checkFiles() {
const files = state.storage.files;
const files = state.storage.files.slice();
let rerender = false;
for (const file of files) {
const ok = await exists(file.id);
if (!ok) {
const oldLimit = file.dlimit;
const oldTotal = file.dtotal;
await file.updateDownloadCount();
if (file.dtotal === file.dlimit) {
state.storage.remove(file.id);
rerender = true;
} else if (oldLimit !== file.dlimit || oldTotal !== file.dtotal) {
rerender = true;
}
}
if (rerender) {
@@ -97,6 +58,12 @@ export default function(state, emitter) {
lastRender = Date.now();
});
emitter.on('changeLimit', async ({ file, value }) => {
await file.changeLimit(value);
state.storage.writeFile(file);
metrics.changedDownloadLimit(file);
});
emitter.on('delete', async ({ file, location }) => {
try {
metrics.deletedUpload({
@@ -108,11 +75,10 @@ export default function(state, emitter) {
location
});
state.storage.remove(file.id);
await FileSender.delete(file.id, file.deleteToken);
await file.del();
} catch (e) {
state.raven.captureException(e);
}
state.fileInfo = null;
});
emitter.on('cancel', () => {
@@ -125,76 +91,116 @@ export default function(state, emitter) {
sender.on('progress', updateProgress);
sender.on('encrypting', render);
state.transfer = sender;
state.uploading = true;
render();
const links = openLinksInNewTab();
await delay(200);
try {
const start = Date.now();
metrics.startedUpload({ size, type });
const info = await sender.upload();
const time = Date.now() - start;
const speed = size / (time / 1000);
metrics.completedUpload({ size, time, speed, type });
await delay(1000);
await fadeOut('upload-progress');
info.name = file.name;
info.size = size;
info.type = type;
info.time = time;
info.speed = speed;
info.createdAt = Date.now();
info.url = `${info.url}#${info.secretKey}`;
info.expiresAt = Date.now() + EXPIRE_SECONDS * 1000;
state.fileInfo = info;
state.storage.addFile(state.fileInfo);
openLinksInNewTab(links, false);
state.transfer = null;
const ownedFile = await sender.upload();
ownedFile.type = type;
state.storage.totalUploads += 1;
emitter.emit('pushState', `/share/${info.id}`);
metrics.completedUpload(ownedFile);
state.storage.addFile(ownedFile);
const cancelBtn = document.getElementById('cancel-upload');
if (cancelBtn) {
cancelBtn.hidden = 'hidden';
}
await delay(1000);
await fadeOut('.page');
emitter.emit('pushState', `/share/${ownedFile.id}`);
} catch (err) {
state.transfer = null;
if (err.message === '0') {
//cancelled. do nothing
metrics.cancelledUpload({ size, type });
return render();
render();
} else {
// eslint-disable-next-line no-console
console.error(err);
state.raven.captureException(err);
metrics.stoppedUpload({ size, type, err });
emitter.emit('pushState', '/error');
}
state.raven.captureException(err);
metrics.stoppedUpload({ size, type, err });
emitter.emit('replaceState', '/error');
} finally {
openLinksInNewTab(links, false);
state.uploading = false;
state.transfer = null;
}
});
emitter.on('download', async file => {
const size = file.size;
const url = `/api/download/${file.id}`;
const receiver = new FileReceiver(url, file.key);
receiver.on('progress', updateProgress);
receiver.on('decrypting', render);
state.transfer = receiver;
const links = openLinksInNewTab();
emitter.on('password', async ({ password, file }) => {
try {
state.settingPassword = true;
render();
await file.setPassword(password);
state.storage.writeFile(file);
metrics.addedPassword({ size: file.size });
await delay(1000);
} catch (err) {
// eslint-disable-next-line no-console
console.error(err);
state.passwordSetError = err;
} finally {
state.settingPassword = false;
}
render();
});
emitter.on('getMetadata', async () => {
const file = state.fileInfo;
const receiver = new FileReceiver(file);
try {
await receiver.getMetadata();
state.transfer = receiver;
} catch (e) {
if (e.message === '401') {
file.password = null;
if (!file.requiresPassword) {
return emitter.emit('pushState', '/404');
}
}
}
render();
});
emitter.on('download', async file => {
state.transfer.on('progress', updateProgress);
state.transfer.on('decrypting', render);
const links = openLinksInNewTab();
const size = file.size;
try {
const start = Date.now();
metrics.startedDownload({ size: file.size, ttl: file.ttl });
const f = await receiver.download();
const dl = state.transfer.download();
render();
await dl;
const time = Date.now() - start;
const speed = size / (time / 1000);
await delay(1000);
await fadeOut('download-progress');
saveFile(f);
await fadeOut('.page');
state.storage.totalDownloads += 1;
state.transfer.reset();
metrics.completedDownload({ size, time, speed });
emitter.emit('pushState', '/completed');
} catch (err) {
// TODO cancelled download
const location = err.message === 'notfound' ? '/404' : '/error';
if (location === '/error') {
state.raven.captureException(err);
metrics.stoppedDownload({ size, err });
if (err.message === '0') {
// download cancelled
state.transfer.reset();
render();
} else {
// eslint-disable-next-line no-console
console.error(err);
state.transfer = null;
const location = err.message === '404' ? '/404' : '/error';
if (location === '/error') {
state.raven.captureException(err);
metrics.stoppedDownload({ size, err });
}
emitter.emit('pushState', location);
}
emitter.emit('replaceState', location);
} finally {
state.transfer = null;
openLinksInNewTab(links, false);
}
});
@@ -204,6 +210,14 @@ export default function(state, emitter) {
metrics.copiedLink({ location });
});
setInterval(() => {
// poll for updates of the download counts
// TODO something for the share page: || state.route === '/share/:id'
if (state.route === '/') {
checkFiles();
}
}, 2 * 60 * 1000);
setInterval(() => {
// poll for rerendering the file list countdown timers
if (

View File

@@ -1,32 +1,27 @@
import Nanobus from 'nanobus';
import { hexToArray, bytes } from './utils';
import Keychain from './keychain';
import { bytes } from './utils';
import { metadata, downloadFile } from './api';
export default class FileReceiver extends Nanobus {
constructor(url, k) {
constructor(fileInfo) {
super('FileReceiver');
this.key = window.crypto.subtle.importKey(
'jwk',
{
k,
kty: 'oct',
alg: 'A128GCM',
ext: true
},
{
name: 'AES-GCM'
},
false,
['decrypt']
);
this.url = url;
this.msg = 'fileSizeProgress';
this.progress = [0, 1];
this.keychain = new Keychain(fileInfo.secretKey, fileInfo.nonce);
if (fileInfo.requiresPassword) {
this.keychain.setPassword(fileInfo.password, fileInfo.url);
}
this.fileInfo = fileInfo;
this.reset();
}
get progressRatio() {
return this.progress[0] / this.progress[1];
}
get progressIndefinite() {
return this.state !== 'downloading';
}
get sizes() {
return {
partialSize: bytes(this.progress[0]),
@@ -35,66 +30,95 @@ export default class FileReceiver extends Nanobus {
}
cancel() {
// TODO
if (this.downloadRequest) {
this.downloadRequest.cancel();
}
}
downloadFile() {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.onprogress = event => {
if (event.lengthComputable && event.target.status !== 404) {
this.progress = [event.loaded, event.total];
this.emit('progress', this.progress);
}
};
xhr.onload = function(event) {
if (xhr.status === 404) {
reject(new Error('notfound'));
return;
}
const blob = new Blob([this.response]);
const meta = JSON.parse(xhr.getResponseHeader('X-File-Metadata'));
const fileReader = new FileReader();
fileReader.onload = function() {
resolve({
data: this.result,
name: meta.filename,
type: meta.mimeType,
iv: meta.id
});
};
fileReader.readAsArrayBuffer(blob);
};
xhr.open('get', this.url);
xhr.responseType = 'blob';
xhr.send();
});
reset() {
this.msg = 'fileSizeProgress';
this.state = 'initialized';
this.progress = [0, 1];
}
async download() {
const key = await this.key;
const file = await this.downloadFile();
this.msg = 'decryptingFile';
this.emit('decrypting');
const plaintext = await window.crypto.subtle.decrypt(
{
name: 'AES-GCM',
iv: hexToArray(file.iv),
tagLength: 128
},
key,
file.data
async getMetadata() {
const meta = await metadata(this.fileInfo.id, this.keychain);
this.keychain.setIV(meta.iv);
this.fileInfo.name = meta.name;
this.fileInfo.type = meta.type;
this.fileInfo.iv = meta.iv;
this.fileInfo.size = meta.size;
this.state = 'ready';
}
async download(noSave = false) {
this.state = 'downloading';
this.downloadRequest = await downloadFile(
this.fileInfo.id,
this.keychain,
p => {
this.progress = p;
this.emit('progress');
}
);
this.msg = 'downloadFinish';
return {
plaintext,
name: decodeURIComponent(file.name),
type: file.type
};
try {
const ciphertext = await this.downloadRequest.result;
this.downloadRequest = null;
this.msg = 'decryptingFile';
this.state = 'decrypting';
this.emit('decrypting');
const plaintext = await this.keychain.decryptFile(ciphertext);
if (!noSave) {
await saveFile({
plaintext,
name: decodeURIComponent(this.fileInfo.name),
type: this.fileInfo.type
});
}
this.msg = 'downloadFinish';
this.state = 'complete';
} catch (e) {
this.downloadRequest = null;
throw e;
}
}
}
async function saveFile(file) {
return new Promise(function(resolve, reject) {
const dataView = new DataView(file.plaintext);
const blob = new Blob([dataView], { type: file.type });
if (navigator.msSaveBlob) {
navigator.msSaveBlob(blob, file.name);
return resolve();
} else if (/iPhone|fxios/i.test(navigator.userAgent)) {
// This method is much slower but createObjectURL
// is buggy on iOS
const reader = new FileReader();
reader.addEventListener('loadend', function() {
if (reader.error) {
return reject(reader.error);
}
if (reader.result) {
const a = document.createElement('a');
a.href = reader.result;
a.download = file.name;
document.body.appendChild(a);
a.click();
}
resolve();
});
reader.readAsDataURL(blob);
} else {
const downloadUrl = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = downloadUrl;
a.download = file.name;
document.body.appendChild(a);
a.click();
URL.revokeObjectURL(downloadUrl);
setTimeout(resolve, 100);
}
});
}

View File

@@ -1,48 +1,26 @@
/* global EXPIRE_SECONDS */
import Nanobus from 'nanobus';
import { arrayToHex, bytes } from './utils';
import OwnedFile from './ownedFile';
import Keychain from './keychain';
import { arrayToB64, bytes } from './utils';
import { uploadFile } from './api';
export default class FileSender extends Nanobus {
constructor(file) {
super('FileSender');
this.file = file;
this.msg = 'importingFile';
this.progress = [0, 1];
this.cancelled = false;
this.iv = window.crypto.getRandomValues(new Uint8Array(12));
this.uploadXHR = new XMLHttpRequest();
this.key = window.crypto.subtle.generateKey(
{
name: 'AES-GCM',
length: 128
},
true,
['encrypt']
);
}
static delete(id, token) {
return new Promise((resolve, reject) => {
if (!id || !token) {
return reject();
}
const xhr = new XMLHttpRequest();
xhr.open('POST', `/api/delete/${id}`);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = () => {
if (xhr.readyState === XMLHttpRequest.DONE) {
resolve();
}
};
xhr.send(JSON.stringify({ delete_token: token }));
});
this.keychain = new Keychain();
this.reset();
}
get progressRatio() {
return this.progress[0] / this.progress[1];
}
get progressIndefinite() {
return ['fileSizeProgress', 'notifyUploadDone'].indexOf(this.msg) === -1;
}
get sizes() {
return {
partialSize: bytes(this.progress[0]),
@@ -50,10 +28,17 @@ export default class FileSender extends Nanobus {
};
}
reset() {
this.uploadRequest = null;
this.msg = 'importingFile';
this.progress = [0, 1];
this.cancelled = false;
}
cancel() {
this.cancelled = true;
if (this.msg === 'fileSizeProgress') {
this.uploadXHR.abort();
if (this.uploadRequest) {
this.uploadRequest.cancel();
}
}
@@ -61,6 +46,7 @@ export default class FileSender extends Nanobus {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsArrayBuffer(this.file);
// TODO: progress?
reader.onload = function(event) {
const plaintext = new Uint8Array(this.result);
resolve(plaintext);
@@ -71,76 +57,57 @@ export default class FileSender extends Nanobus {
});
}
uploadFile(encrypted, keydata) {
return new Promise((resolve, reject) => {
const file = this.file;
const id = arrayToHex(this.iv);
const dataView = new DataView(encrypted);
const blob = new Blob([dataView], { type: file.type });
const fd = new FormData();
fd.append('data', blob, file.name);
const xhr = this.uploadXHR;
xhr.upload.addEventListener('progress', e => {
if (e.lengthComputable) {
this.progress = [e.loaded, e.total];
this.emit('progress', this.progress);
}
});
xhr.onreadystatechange = () => {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status === 200) {
this.progress = [1, 1];
this.msg = 'notifyUploadDone';
const responseObj = JSON.parse(xhr.responseText);
return resolve({
url: responseObj.url,
id: responseObj.id,
secretKey: keydata.k,
deleteToken: responseObj.delete
});
}
this.msg = 'errorPageHeader';
reject(new Error(xhr.status));
}
};
xhr.open('post', '/api/upload', true);
xhr.setRequestHeader(
'X-File-Metadata',
JSON.stringify({
id: id,
filename: encodeURIComponent(file.name)
})
);
xhr.send(fd);
this.msg = 'fileSizeProgress';
});
}
async upload() {
const key = await this.key;
const start = Date.now();
const plaintext = await this.readFile();
if (this.cancelled) {
throw new Error(0);
}
this.msg = 'encryptingFile';
this.emit('encrypting');
const encrypted = await window.crypto.subtle.encrypt(
{
name: 'AES-GCM',
iv: this.iv,
tagLength: 128
},
key,
plaintext
);
const encrypted = await this.keychain.encryptFile(plaintext);
const metadata = await this.keychain.encryptMetadata(this.file);
const authKeyB64 = await this.keychain.authKeyB64();
if (this.cancelled) {
throw new Error(0);
}
const keydata = await window.crypto.subtle.exportKey('jwk', key);
return this.uploadFile(encrypted, keydata);
this.uploadRequest = uploadFile(
encrypted,
metadata,
authKeyB64,
this.keychain,
p => {
this.progress = p;
this.emit('progress');
}
);
this.msg = 'fileSizeProgress';
this.emit('progress'); // HACK to kick MS Edge
try {
const result = await this.uploadRequest.result;
const time = Date.now() - start;
this.msg = 'notifyUploadDone';
this.uploadRequest = null;
this.progress = [1, 1];
const secretKey = arrayToB64(this.keychain.rawSecret);
const ownedFile = new OwnedFile({
id: result.id,
url: `${result.url}#${secretKey}`,
name: this.file.name,
size: this.file.size,
time: time,
speed: this.file.size / (time / 1000),
createdAt: Date.now(),
expiresAt: Date.now() + EXPIRE_SECONDS * 1000,
secretKey: secretKey,
nonce: this.keychain.nonce,
ownerToken: result.ownerToken
});
return ownedFile;
} catch (e) {
this.msg = 'errorPageHeader';
this.uploadRequest = null;
throw e;
}
}
}

209
app/keychain.js Normal file
View File

@@ -0,0 +1,209 @@
import { arrayToB64, b64ToArray } from './utils';
const encoder = new TextEncoder();
const decoder = new TextDecoder();
export default class Keychain {
constructor(secretKeyB64, nonce, ivB64) {
this._nonce = nonce || 'yRCdyQ1EMSA3mo4rqSkuNQ==';
if (ivB64) {
this.iv = b64ToArray(ivB64);
} else {
this.iv = window.crypto.getRandomValues(new Uint8Array(12));
}
if (secretKeyB64) {
this.rawSecret = b64ToArray(secretKeyB64);
} else {
this.rawSecret = window.crypto.getRandomValues(new Uint8Array(16));
}
this.secretKeyPromise = window.crypto.subtle.importKey(
'raw',
this.rawSecret,
'HKDF',
false,
['deriveKey']
);
this.encryptKeyPromise = this.secretKeyPromise.then(function(secretKey) {
return window.crypto.subtle.deriveKey(
{
name: 'HKDF',
salt: new Uint8Array(),
info: encoder.encode('encryption'),
hash: 'SHA-256'
},
secretKey,
{
name: 'AES-GCM',
length: 128
},
false,
['encrypt', 'decrypt']
);
});
this.metaKeyPromise = this.secretKeyPromise.then(function(secretKey) {
return window.crypto.subtle.deriveKey(
{
name: 'HKDF',
salt: new Uint8Array(),
info: encoder.encode('metadata'),
hash: 'SHA-256'
},
secretKey,
{
name: 'AES-GCM',
length: 128
},
false,
['encrypt', 'decrypt']
);
});
this.authKeyPromise = this.secretKeyPromise.then(function(secretKey) {
return window.crypto.subtle.deriveKey(
{
name: 'HKDF',
salt: new Uint8Array(),
info: encoder.encode('authentication'),
hash: 'SHA-256'
},
secretKey,
{
name: 'HMAC',
hash: { name: 'SHA-256' }
},
true,
['sign']
);
});
}
get nonce() {
return this._nonce;
}
set nonce(n) {
if (n && n !== this._nonce) {
this._nonce = n;
}
}
setIV(ivB64) {
this.iv = b64ToArray(ivB64);
}
setPassword(password, shareUrl) {
this.authKeyPromise = window.crypto.subtle
.importKey('raw', encoder.encode(password), { name: 'PBKDF2' }, false, [
'deriveKey'
])
.then(passwordKey =>
window.crypto.subtle.deriveKey(
{
name: 'PBKDF2',
salt: encoder.encode(shareUrl),
iterations: 100,
hash: 'SHA-256'
},
passwordKey,
{
name: 'HMAC',
hash: 'SHA-256'
},
true,
['sign']
)
);
}
setAuthKey(authKeyB64) {
this.authKeyPromise = window.crypto.subtle.importKey(
'raw',
b64ToArray(authKeyB64),
{
name: 'HMAC',
hash: 'SHA-256'
},
true,
['sign']
);
}
async authKeyB64() {
const authKey = await this.authKeyPromise;
const rawAuth = await window.crypto.subtle.exportKey('raw', authKey);
return arrayToB64(new Uint8Array(rawAuth));
}
async authHeader() {
const authKey = await this.authKeyPromise;
const sig = await window.crypto.subtle.sign(
{
name: 'HMAC'
},
authKey,
b64ToArray(this.nonce)
);
return `send-v1 ${arrayToB64(new Uint8Array(sig))}`;
}
async encryptFile(plaintext) {
const encryptKey = await this.encryptKeyPromise;
const ciphertext = await window.crypto.subtle.encrypt(
{
name: 'AES-GCM',
iv: this.iv,
tagLength: 128
},
encryptKey,
plaintext
);
return ciphertext;
}
async encryptMetadata(metadata) {
const metaKey = await this.metaKeyPromise;
const ciphertext = await window.crypto.subtle.encrypt(
{
name: 'AES-GCM',
iv: new Uint8Array(12),
tagLength: 128
},
metaKey,
encoder.encode(
JSON.stringify({
iv: arrayToB64(this.iv),
name: metadata.name,
type: metadata.type || 'application/octet-stream'
})
)
);
return ciphertext;
}
async decryptFile(ciphertext) {
const encryptKey = await this.encryptKeyPromise;
const plaintext = await window.crypto.subtle.decrypt(
{
name: 'AES-GCM',
iv: this.iv,
tagLength: 128
},
encryptKey,
ciphertext
);
return plaintext;
}
async decryptMetadata(ciphertext) {
const metaKey = await this.metaKeyPromise;
const plaintext = await window.crypto.subtle.decrypt(
{
name: 'AES-GCM',
iv: new Uint8Array(12),
tagLength: 128
},
metaKey,
ciphertext
);
return JSON.parse(decoder.decode(plaintext));
}
}

16
app/main.css Normal file
View File

@@ -0,0 +1,16 @@
@import './base.css';
@import './templates/header/header.css';
@import './templates/downloadButton/downloadButton.css';
@import './templates/progress/progress.css';
@import './templates/passwordInput/passwordInput.css';
@import './templates/downloadPassword/downloadPassword.css';
@import './templates/setPasswordSection/setPasswordSection.css';
@import './templates/footer/footer.css';
@import './templates/fxPromo/fxPromo.css';
@import './templates/selectbox/selectbox.css';
@import './templates/fileList/fileList.css';
@import './templates/file/file.css';
@import './templates/popup/popup.css';
@import './pages/welcome/welcome.css';
@import './pages/share/share.css';
@import './pages/unsupported/unsupported.css';

View File

@@ -1,9 +1,10 @@
import 'fast-text-encoding'; // MS Edge support
import 'fluent-intl-polyfill';
import app from './routes';
import locale from '../common/locales';
import fileManager from './fileManager';
import dragManager from './dragManager';
import { canHasSend } from './utils';
import assets from '../common/assets';
import storage from './storage';
import metrics from './metrics';
import experiments from './experiments';
@@ -14,28 +15,31 @@ if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) {
}
app.use((state, emitter) => {
// init state
state.transfer = null;
state.fileInfo = null;
state.translate = locale.getTranslator();
state.storage = storage;
state.raven = Raven;
state.config = {
uploadWindowStyle: 'upload-window',
uploadButtonStyle: 'browse btn'
};
emitter.on('DOMContentLoaded', async () => {
window.appState = state;
emitter.on('DOMContentLoaded', async function checkSupport() {
let unsupportedReason = null;
if (
// Firefox < 50
/firefox/i.test(navigator.userAgent) &&
parseInt(navigator.userAgent.match(/firefox\/*([^\n\r]*)\./i)[1], 10) <=
49
parseInt(navigator.userAgent.match(/firefox\/*([^\n\r]*)\./i)[1], 10) < 50
) {
return emitter.emit('replaceState', '/unsupported/outdated');
unsupportedReason = 'outdated';
}
const ok = await canHasSend(assets.get('cryptofill.js'));
const ok = await canHasSend();
if (!ok) {
const reason = /firefox/i.test(navigator.userAgent) ? 'outdated' : 'gcm';
emitter.emit('replaceState', `/unsupported/${reason}`);
unsupportedReason = /firefox/i.test(navigator.userAgent)
? 'outdated'
: 'gcm';
}
if (unsupportedReason) {
setTimeout(() =>
emitter.emit('replaceState', `/unsupported/${unsupportedReason}`)
);
}
});
});
@@ -45,4 +49,4 @@ app.use(fileManager);
app.use(dragManager);
app.use(experiments);
app.mount('#page-one');
app.mount('body');

View File

@@ -29,6 +29,8 @@ export default function initialize(state, emitter) {
});
//TODO restart handlers... somewhere
});
emitter.on('exit', exitEvent);
emitter.on('experiment', experimentEvent);
}
function category() {
@@ -81,6 +83,8 @@ function urlToMetric(url) {
case 'https://testpilot.firefox.com/':
case 'https://testpilot.firefox.com/experiments/send':
return 'testpilot';
case 'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com':
return 'promo';
default:
return 'other';
}
@@ -147,6 +151,15 @@ function completedUpload(params) {
});
}
function addedPassword(params) {
return sendEvent('sender', 'password-added', {
cm1: params.size,
cm5: storage.totalUploads,
cm6: storage.files.length,
cm7: storage.totalDownloads
});
}
function startedDownload(params) {
return sendEvent('recipient', 'download-started', {
cm1: params.size,
@@ -191,6 +204,16 @@ function stoppedUpload(params) {
});
}
function changedDownloadLimit(params) {
return sendEvent('sender', 'download-limit-changed', {
cm1: params.size,
cm5: storage.totalUploads,
cm6: storage.files.length,
cm7: storage.totalDownloads,
cm8: params.dlimit
});
}
function completedDownload(params) {
return sendEvent('recipient', 'download-stopped', {
cm1: params.size,
@@ -235,6 +258,11 @@ function exitEvent(target) {
});
}
function experimentEvent(params) {
return sendEvent(category(), 'experiment', params);
}
// eslint-disable-next-line no-unused-vars
function addExitHandlers() {
const links = Array.from(document.querySelectorAll('a'));
links.forEach(l => {
@@ -257,11 +285,13 @@ export {
cancelledUpload,
stoppedUpload,
completedUpload,
changedDownloadLimit,
deletedUpload,
startedDownload,
cancelledDownload,
stoppedDownload,
completedDownload,
addedPassword,
restart,
unsupported
};

84
app/ownedFile.js Normal file
View File

@@ -0,0 +1,84 @@
import Keychain from './keychain';
import { arrayToB64 } from './utils';
import { del, fileInfo, setParams, setPassword } from './api';
export default class OwnedFile {
constructor(obj) {
this.id = obj.id;
this.url = obj.url;
this.name = obj.name;
this.size = obj.size;
this.type = obj.type;
this.time = obj.time;
this.speed = obj.speed;
this.createdAt = obj.createdAt;
this.expiresAt = obj.expiresAt;
this.ownerToken = obj.ownerToken;
this.dlimit = obj.dlimit || 1;
this.dtotal = obj.dtotal || 0;
this.keychain = new Keychain(obj.secretKey, obj.nonce);
this._hasPassword = !!obj.hasPassword;
}
async setPassword(password) {
try {
this.password = password;
this._hasPassword = true;
this.keychain.setPassword(password, this.url);
const result = await setPassword(this.id, this.ownerToken, this.keychain);
return result;
} catch (e) {
this.password = null;
this._hasPassword = false;
throw e;
}
}
del() {
return del(this.id, this.ownerToken);
}
changeLimit(dlimit) {
if (this.dlimit !== dlimit) {
this.dlimit = dlimit;
return setParams(this.id, this.ownerToken, { dlimit });
}
return Promise.resolve(true);
}
get hasPassword() {
return !!this._hasPassword;
}
async updateDownloadCount() {
try {
const result = await fileInfo(this.id, this.ownerToken);
this.dtotal = result.dtotal;
this.dlimit = result.dlimit;
} catch (e) {
if (e.message === '404') {
this.dtotal = this.dlimit;
}
// ignore other errors
}
}
toJSON() {
return {
id: this.id,
url: this.url,
name: this.name,
size: this.size,
type: this.type,
time: this.time,
speed: this.speed,
createdAt: this.createdAt,
expiresAt: this.expiresAt,
secretKey: arrayToB64(this.keychain.rawSecret),
ownerToken: this.ownerToken,
dlimit: this.dlimit,
dtotal: this.dtotal,
hasPassword: this.hasPassword
};
}
}

5
app/pages/blank.js Normal file
View File

@@ -0,0 +1,5 @@
const html = require('choo/html');
module.exports = function() {
return html`<div></div>`;
};

View File

@@ -0,0 +1,26 @@
const html = require('choo/html');
const progress = require('../../templates/progress');
const { fadeOut } = require('../../utils');
module.exports = function(state, emit) {
return html`
<div class="page effect--fadeIn">
<div class="title">
${state.translate('downloadFinish')}
</div>
<div class="description"></div>
${progress(1)}
<div class="progressSection">
<div class="progressSection__text"></div>
</div>
<a class="link link--action"
href="/"
onclick=${sendNew}>${state.translate('sendYourFilesLink')}</a>
</div>`;
async function sendNew(e) {
e.preventDefault();
await fadeOut('.page');
emit('pushState', '/');
}
};

View File

@@ -0,0 +1,42 @@
const html = require('choo/html');
const progress = require('../../templates/progress');
const { bytes } = require('../../utils');
module.exports = function(state, emit) {
const transfer = state.transfer;
const cancelBtn = html`
<button
id="cancel"
class="btn btn--cancel"
title="${state.translate('deletePopupCancel')}"
onclick=${cancel}>
${state.translate('deletePopupCancel')}
</button>`;
return html`
<div class="page effect--fadeIn">
<div class="title">
${state.translate('downloadingPageProgress', {
filename: state.fileInfo.name,
size: bytes(state.fileInfo.size)
})}
</div>
<div class="description">
${state.translate('downloadingPageMessage')}
</div>
${progress(transfer.progressRatio, transfer.progressIndefinite)}
<div class="progressSection">
<div class="progressSection__text">
${state.translate(transfer.msg, transfer.sizes)}
</div>
${transfer.state === 'downloading' ? cancelBtn : null}
</div>
</div>
`;
function cancel() {
const btn = document.getElementById('cancel');
btn.remove();
emit('cancel');
}
};

View File

@@ -1,10 +1,10 @@
const html = require('choo/html');
const assets = require('../../common/assets');
const assets = require('../../../common/assets');
module.exports = function(state) {
return html`
<div id="upload-error">
<div class="page">
<div class="title">${state.translate('errorPageHeader')}</div>
<img id="upload-error-img" src="${assets.get('illustration_error.svg')}"/>
<img src="${assets.get('illustration_error.svg')}"/>
</div>`;
};

32
app/pages/legal.js Normal file
View File

@@ -0,0 +1,32 @@
const html = require('choo/html');
const raw = require('choo/html/raw');
module.exports = function(state) {
return html`
<div>
<div class="title">${state.translate('legalHeader')}</div>
${raw(
replaceLinks(state.translate('legalNoticeTestPilot'), [
'https://testpilot.firefox.com/terms',
'https://testpilot.firefox.com/privacy',
'https://testpilot.firefox.com/experiments/send'
])
)}
${raw(
replaceLinks(state.translate('legalNoticeMozilla'), [
'https://www.mozilla.org/privacy/websites/',
'https://www.mozilla.org/about/legal/terms/mozilla/'
])
)}
</div>
`;
};
function replaceLinks(str, urls) {
let i = 0;
const s = str.replace(
/<a>([^<]+)<\/a>/g,
(m, v) => `<a href="${urls[i++]}">${v}</a>`
);
return `<div class="description">${s}</div>`;
}

View File

@@ -0,0 +1,16 @@
const html = require('choo/html');
const assets = require('../../../common/assets');
module.exports = function(state) {
return html`
<div class="page">
<div class="title">${state.translate('expiredPageHeader')}</div>
<img src="${assets.get('illustration_expired.svg')}" id="expired-img">
<div class="description">
${state.translate('uploadPageExplainer')}
</div>
<a class="link link--action" href="/">
${state.translate('sendYourFilesLink')}
</a>
</div>`;
};

View File

@@ -0,0 +1,40 @@
const html = require('choo/html');
const assets = require('../../../common/assets');
const { bytes } = require('../../utils');
module.exports = function(state, pageAction) {
const fileInfo = state.fileInfo;
const size = fileInfo.size
? state.translate('downloadFileSize', { size: bytes(fileInfo.size) })
: '';
const title = fileInfo.name
? state.translate('downloadFileName', { filename: fileInfo.name })
: state.translate('downloadFileTitle');
const info = html`
<div id="dl-file"
data-nonce="${fileInfo.nonce}"
data-requires-password="${fileInfo.requiresPassword}"></div>`;
if (!pageAction) {
return info;
}
return html`
<div class="page">
<div class="title">
<span>${title}</span>
<span>${' ' + size}</span>
</div>
<div class="description">${state.translate('downloadMessage')}</div>
<img
src="${assets.get('illustration_download.svg')}"
title="${state.translate('downloadAltText')}"/>
${pageAction}
<a class="link link--action" href="/">
${state.translate('sendYourFilesLink')}
</a>
${info}
</div>
`;
};

112
app/pages/share/index.js Normal file
View File

@@ -0,0 +1,112 @@
/* global EXPIRE_SECONDS */
const html = require('choo/html');
const raw = require('choo/html/raw');
const assets = require('../../../common/assets');
const notFound = require('../notFound');
const setPasswordSection = require('../../templates/setPasswordSection');
const selectbox = require('../../templates/selectbox');
const deletePopup = require('../../templates/popup');
const { allowedCopy, delay, fadeOut } = require('../../utils');
module.exports = function(state, emit) {
const file = state.storage.getFileById(state.params.id);
if (!file) {
return notFound(state, emit);
}
return html`
<div id="shareWrapper" class="effect--fadeIn">
${expireInfo(file, state.translate, emit)}
<div class="sharePage">
<div class="sharePage__copyText">
${state.translate('copyUrlFormLabelWithName', { filename: file.name })}
</div>
<div class="copySection">
<input
id="fileUrl"
class="copySection__url"
type="url"
value="${file.url}"
readonly="true"/>
<button id="copyBtn"
class="inputBtn inputBtn--copy"
title="${state.translate('copyUrlFormButton')}"
onclick=${copyLink}>${state.translate('copyUrlFormButton')}</button>
</div>
${setPasswordSection(state, emit)}
<button
class="btn btn--delete"
title="${state.translate('deleteFileButton')}"
onclick=${showPopup}>${state.translate('deleteFileButton')}
</button>
<div class="sharePage__deletePopup">
${deletePopup(
state.translate('deletePopupText'),
state.translate('deletePopupYes'),
state.translate('deletePopupCancel'),
deleteFile
)}
</div>
<a class="link link--action"
href="/"
onclick=${sendNew}>${state.translate('sendAnotherFileLink')}</a>
</div>
</div>
`;
function showPopup() {
const popup = document.querySelector('.popup');
popup.classList.add('popup--show');
popup.focus();
}
async function sendNew(e) {
e.preventDefault();
await fadeOut('#shareWrapper');
emit('pushState', '/');
}
async function copyLink() {
if (allowedCopy()) {
emit('copy', { url: file.url, location: 'success-screen' });
const input = document.getElementById('fileUrl');
input.disabled = true;
input.classList.add('input--copied');
const copyBtn = document.getElementById('copyBtn');
copyBtn.disabled = true;
copyBtn.classList.add('inputBtn--copied');
copyBtn.replaceChild(
html`<img src="${assets.get('check-16.svg')}" class="cursor--pointer">`,
copyBtn.firstChild
);
await delay(2000);
input.disabled = false;
input.classList.remove('input--copied');
copyBtn.disabled = false;
copyBtn.classList.remove('inputBtn--copied');
copyBtn.textContent = state.translate('copyUrlFormButton');
}
}
async function deleteFile() {
emit('delete', { file, location: 'success-screen' });
await fadeOut('#shareWrapper');
emit('pushState', '/');
}
};
function expireInfo(file, translate, emit) {
const hours = Math.floor(EXPIRE_SECONDS / 60 / 60);
const el = html`<div class="title">${raw(
translate('expireInfo', {
downloadCount: '<select></select>',
timespan: translate('timespanHours', { num: hours })
})
)}</div>`;
const select = el.querySelector('select');
const options = [1, 2, 3, 4, 5, 20].filter(i => i > (file.dtotal || 0));
const t = num => translate('downloadCount', { num });
const changed = value => emit('changeLimit', { file, value });
el.replaceChild(selectbox(file.dlimit || 1, options, t, changed), select);
return el;
}

112
app/pages/share/share.css Normal file
View File

@@ -0,0 +1,112 @@
.sharePage {
margin: 0 auto;
display: flex;
justify-content: center;
flex-direction: column;
width: 100%;
max-width: 640px;
}
.sharePage__copyText {
align-self: flex-start;
margin-top: 60px;
margin-bottom: 10px;
color: var(--textColor);
max-width: 614px;
word-wrap: break-word;
}
.sharePage__deletePopup {
position: relative;
align-self: center;
bottom: 50px;
}
.copySection {
display: flex;
flex-wrap: nowrap;
width: 100%;
}
.copySection__url {
flex: 1;
height: 56px;
border: 1px solid var(--primaryControlBGColor);
border-radius: 6px 0 0 6px;
font-size: 20px;
color: var(--inputTextColor);
font-family: 'SF Pro Text', sans-serif;
letter-spacing: 0;
line-height: 23px;
font-weight: 300;
padding-left: 10px;
}
.copySection__url:disabled {
border: 1px solid var(--successControlBGColor);
background: var(--successControlFGColor);
}
.inputBtn--copy {
flex: 0 1 165px;
padding-bottom: 4px;
}
.input--copied {
border-color: var(--successControlBGColor);
}
.inputBtn--copied,
.inputBtn--copied:hover {
background: var(--successControlBGColor);
border: 1px solid var(--successControlBGColor);
color: var(--successControlFGColor);
}
.btn--delete {
align-self: center;
width: 176px;
height: 44px;
background: #fff;
border-color: rgba(12, 12, 13, 0.3);
margin-top: 50px;
margin-bottom: 12px;
color: #313131;
}
.btn--delete:hover {
background: #efeff1;
}
@media (max-device-width: 768px), (max-width: 768px) {
.copySection {
width: 100%;
}
.copySection__url {
font-size: 18px;
}
}
@media (max-device-width: 520px), (max-width: 520px) {
.copySection {
width: 100%;
flex-direction: column;
padding-left: 0;
}
.copySection__url {
font-size: 22px;
padding: 15px 10px;
border-radius: 6px 6px 0 0;
}
.sharePage__copyText {
text-align: center;
}
.inputBtn--copy {
border-radius: 0 0 6px 6px;
flex: 0 1 65px;
}
}

View File

@@ -0,0 +1,67 @@
const html = require('choo/html');
const assets = require('../../../common/assets');
module.exports = function(state) {
let strings = {};
let why = '';
let url = '';
let buttonAction = '';
if (state.params.reason !== 'outdated') {
strings = unsupportedStrings(state);
why = html`
<div class="description">
<a href="https://github.com/mozilla/send/blob/master/docs/faq.md#why-is-my-browser-not-supported">
${state.translate('notSupportedLink')}
</a>
</div>`;
url =
'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com';
buttonAction = html`
<div class="firefoxDownload__action">
Firefox<br><span class="firefoxDownload__text">${strings.button}</span>
</div>`;
} else {
strings = outdatedStrings(state);
url = 'https://support.mozilla.org/kb/update-firefox-latest-version';
buttonAction = html`
<div class="firefoxDownload__action">
${strings.button}
</div>`;
}
return html`
<div class="unsupportedPage">
<div class="title">${strings.title}</div>
<div class="description">
${strings.description}
</div>
${why}
<a href="${url}" class="firefoxDownload">
<img
src="${assets.get('firefox_logo-only.svg')}"
class="firefoxDownload__logo"
alt="Firefox"/>
${buttonAction}
</a>
<div class="unsupportedPage__info">
${strings.explainer}
</div>
</div>`;
};
function outdatedStrings(state) {
return {
title: state.translate('notSupportedHeader'),
description: state.translate('notSupportedOutdatedDetail'),
button: state.translate('updateFirefox'),
explainer: state.translate('uploadPageExplainer')
};
}
function unsupportedStrings(state) {
return {
title: state.translate('notSupportedHeader'),
description: state.translate('notSupportedDetail'),
button: state.translate('downloadFirefoxButtonSub'),
explainer: state.translate('uploadPageExplainer')
};
}

View File

@@ -0,0 +1,49 @@
.unsupportedPage {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.unsupportedPage__info {
font-size: 13px;
line-height: 23px;
text-align: center;
color: var(--lightTextColor);
margin: 0 auto 23px;
}
.firefoxDownload {
margin-bottom: 181px;
height: 80px;
background: #98e02b;
border-radius: 3px;
cursor: pointer;
border: 0;
box-shadow: 0 5px 3px rgb(234, 234, 234);
font-family: 'Fira Sans', 'segoe ui', sans-serif;
font-weight: 500;
color: var(--primaryControlFGColor);
font-size: 26px;
display: flex;
justify-content: center;
align-items: center;
line-height: 1;
padding: 0 25px;
}
.firefoxDownload__logo {
width: 70px;
}
.firefoxDownload__action {
text-align: left;
margin-left: 20.4px;
}
.firefoxDownload__text {
font-family: 'Fira Sans', 'segoe ui', sans-serif;
font-weight: 300;
font-size: 18px;
letter-spacing: -0.69px;
}

39
app/pages/upload/index.js Normal file
View File

@@ -0,0 +1,39 @@
const html = require('choo/html');
const progress = require('../../templates/progress');
const { bytes } = require('../../utils');
module.exports = function(state, emit) {
const transfer = state.transfer;
return html`
<div class="page effect--fadeIn">
<div class="title">
${state.translate('uploadingPageProgress', {
filename: transfer.file.name,
size: bytes(transfer.file.size)
})}
</div>
<div class="description"></div>
${progress(transfer.progressRatio, transfer.progressIndefinite)}
<div class="progressSection">
<div class="progressSection__text">
${state.translate(transfer.msg, transfer.sizes)}
</div>
<button
id="cancel-upload"
class="btn btn--cancel"
title="${state.translate('uploadingPageCancel')}"
onclick=${cancel}>
${state.translate('uploadingPageCancel')}
</button>
</div>
</div>
`;
function cancel() {
const btn = document.getElementById('cancel-upload');
btn.disabled = true;
btn.textContent = state.translate('uploadCancelNotification');
emit('cancel');
}
};

View File

@@ -0,0 +1,84 @@
/* global MAXFILESIZE */
const html = require('choo/html');
const assets = require('../../../common/assets');
const fileList = require('../../templates/fileList');
const { bytes, fadeOut } = require('../../utils');
module.exports = function(state, emit) {
// the page flickers if both the server and browser set 'effect--fadeIn'
const fade = state.layout ? '' : 'effect--fadeIn';
return html`
<div id="page-one" class="${fade}">
<div class="title">${state.translate('uploadPageHeader')}</div>
<div class="description">
<div>${state.translate('uploadPageExplainer')}</div>
<a
href="https://testpilot.firefox.com/experiments/send"
class="link">
${state.translate('uploadPageLearnMore')}
</a>
</div>
<div class="uploadArea"
ondragover=${dragover}
ondragleave=${dragleave}>
<img
src="${assets.get('upload.svg')}"
title="${state.translate('uploadSvgAlt')}"/>
<div class="uploadArea__msg">
${state.translate('uploadPageDropMessage')}
</div>
<span class="uploadArea__sizeMsg">
${state.translate('uploadPageSizeMessage')}
</span>
<input id="file-upload"
class="inputFile"
type="file"
name="fileUploaded"
onfocus=${onfocus}
onblur=${onblur}
onchange=${upload} />
<label for="file-upload"
class="btn btn--file"
title="${state.translate('uploadPageBrowseButton1')}">
${state.translate('uploadPageBrowseButton1')}
</label>
</div>
${fileList(state, emit)}
</div>
`;
function dragover(event) {
const div = document.querySelector('.uploadArea');
div.classList.add('uploadArea--dragging');
}
function dragleave(event) {
const div = document.querySelector('.uploadArea');
div.classList.remove('uploadArea--dragging');
}
function onfocus(event) {
event.target.classList.add('inputFile--focused');
}
function onblur(event) {
event.target.classList.remove('inputFile--focused');
}
async function upload(event) {
event.preventDefault();
const target = event.target;
const file = target.files[0];
if (file.size === 0) {
return;
}
if (file.size > MAXFILESIZE) {
// eslint-disable-next-line no-alert
alert(state.translate('fileTooBig', { size: bytes(MAXFILESIZE) }));
return;
}
await fadeOut('#page-one');
emit('upload', { file, type: 'click' });
}
};

View File

@@ -0,0 +1,65 @@
.uploadArea {
border: 3px dashed rgba(0, 148, 251, 0.5);
margin: 0 auto 10px;
height: 255px;
border-radius: 4px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
transition: transform 150ms;
padding: 15px;
}
.uploadArea__msg {
font-size: 22px;
color: var(--lightTextColor);
margin: 20px 0 10px;
font-family: 'SF Pro Text', sans-serif;
}
.uploadArea__sizeMsg {
font-style: italic;
font-size: 12px;
line-height: 16px;
color: var(--lightTextColor);
margin-bottom: 22px;
}
.uploadArea--dragging {
border: 5px dashed rgba(0, 148, 251, 0.5);
height: 251px;
transform: scale(1.04);
border-radius: 4.2px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
}
.uploadArea--dragging * {
pointer-events: none;
}
.btn--file {
font-size: 20px;
min-width: 240px;
height: 60px;
display: flex;
justify-content: center;
align-items: center;
padding: 0 10px;
}
.inputFile {
opacity: 0;
position: absolute;
}
.inputFile--focused + .btn--file {
background-color: var(--primaryControlHoverColor);
outline: 1px dotted #000;
outline: -webkit-focus-ring-color auto 5px;
}

9
app/readme.md Normal file
View File

@@ -0,0 +1,9 @@
# Application Code
`app/` contains the browser code that gets bundled into `app.[hash].js`. It's got all the logic, crypto, and UI. All of it gets used in the browser, and some of it by the server for server side rendering.
The main entrypoint for the browser is [main.js](./main.js) and on the server [routes/index.js](./routes/index.js) gets imported by [/server/routes/pages.js](../server/routes/pages.js)
- `pages` contains display logic an markup for pages
- `routes` contains route definitions and logic
- `templates` contains ui elements smaller than pages

View File

@@ -1,9 +1,60 @@
const preview = require('../templates/preview');
const download = require('../templates/download');
const preview = require('../pages/preview');
const download = require('../pages/download');
const notFound = require('../pages/notFound');
const downloadPassword = require('../templates/downloadPassword');
const downloadButton = require('../templates/downloadButton');
function hasFileInfo() {
return !!document.getElementById('dl-file');
}
function getFileInfoFromDOM() {
const el = document.getElementById('dl-file');
if (!el) {
return null;
}
return {
nonce: el.getAttribute('data-nonce'),
requiresPassword: !!+el.getAttribute('data-requires-password')
};
}
function createFileInfo(state) {
const metadata = getFileInfoFromDOM();
return {
id: state.params.id,
secretKey: state.params.key,
nonce: metadata.nonce,
requiresPassword: metadata.requiresPassword
};
}
module.exports = function(state, emit) {
if (state.transfer) {
return download(state, emit);
if (!state.fileInfo) {
// This is a fresh page load
// We need to parse the file info from the server's html
if (!hasFileInfo()) {
return notFound(state, emit);
}
state.fileInfo = createFileInfo(state);
if (!state.fileInfo.requiresPassword) {
emit('getMetadata');
}
}
return preview(state, emit);
let pageAction = null; //default state: we don't have file metadata
if (state.transfer) {
const s = state.transfer.state;
if (['downloading', 'decrypting', 'complete'].indexOf(s) > -1) {
// Downloading is in progress
return download(state, emit);
}
// we have file metadata
pageAction = downloadButton(state, emit);
} else if (state.fileInfo.requiresPassword && !state.fileInfo.password) {
// we're waiting on the user for a valid password
pageAction = downloadPassword(state, emit);
}
return preview(state, pageAction);
};

View File

@@ -1,8 +1,8 @@
const welcome = require('../templates/welcome');
const upload = require('../templates/upload');
const welcome = require('../pages/welcome');
const upload = require('../pages/upload');
module.exports = function(state, emit) {
if (state.transfer) {
if (state.uploading) {
return upload(state, emit);
}
return welcome(state, emit);

View File

@@ -1,17 +1,58 @@
const choo = require('choo');
const html = require('choo/html');
const nanotiming = require('nanotiming');
const download = require('./download');
const header = require('../templates/header');
const footer = require('../templates/footer');
const fxPromo = require('../templates/fxPromo');
nanotiming.disabled = true;
const app = choo();
app.route('/', require('./home'));
app.route('/share/:id', require('../templates/share'));
app.route('/download/:id', download);
app.route('/download/:id/:key', download);
app.route('/completed', require('../templates/completed'));
app.route('/unsupported/:reason', require('../templates/unsupported'));
app.route('/legal', require('../templates/legal'));
app.route('/error', require('../templates/error'));
app.route('/blank', require('../templates/blank'));
app.route('*', require('../templates/notFound'));
function banner(state, emit) {
if (state.promo && !state.route.startsWith('/unsupported/')) {
return fxPromo(state, emit);
}
}
function body(template) {
return function(state, emit) {
const b = html`<body>
${banner(state, emit)}
${header(state)}
<main class="main">
<noscript>
<div class="noscript">
<h2>${state.translate('javascriptRequired')}</h2>
<p>
<a class="link" href="https://github.com/mozilla/send/blob/master/docs/faq.md#why-does-firefox-send-require-javascript">
${state.translate('whyJavascript')}
</a>
</p>
<p>${state.translate('enableJavascript')}</p>
</div>
</noscript>
${template(state, emit)}
</main>
${footer(state)}
</body>`;
if (state.layout) {
// server side only
return state.layout(state, b);
}
return b;
};
}
app.route('/', body(require('./home')));
app.route('/share/:id', body(require('../pages/share')));
app.route('/download/:id', body(download));
app.route('/download/:id/:key', body(download));
app.route('/completed', body(require('../pages/completed')));
app.route('/unsupported/:reason', body(require('../pages/unsupported')));
app.route('/legal', body(require('../pages/legal')));
app.route('/error', body(require('../pages/error')));
app.route('/blank', body(require('../pages/blank')));
app.route('*', body(require('../pages/notFound')));
module.exports = app;

View File

@@ -1,4 +1,5 @@
import { isFile } from './utils';
import OwnedFile from './ownedFile';
class Mem {
constructor() {
@@ -42,7 +43,7 @@ class Storage {
const k = this.engine.key(i);
if (isFile(k)) {
try {
const f = JSON.parse(this.engine.getItem(k));
const f = new OwnedFile(JSON.parse(this.engine.getItem(k)));
if (!f.id) {
f.id = f.fileId;
}
@@ -92,11 +93,7 @@ class Storage {
}
getFileById(id) {
try {
return JSON.parse(this.engine.getItem(id));
} catch (e) {
return null;
}
return this._files.find(f => f.id === id);
}
get(id) {
@@ -112,8 +109,16 @@ class Storage {
addFile(file) {
this._files.push(file);
this.writeFile(file);
}
writeFile(file) {
this.engine.setItem(file.id, JSON.stringify(file));
}
writeFiles() {
this._files.forEach(f => this.writeFile(f));
}
}
export default new Storage();

View File

@@ -1,9 +0,0 @@
const html = require('choo/html');
module.exports = function(state) {
const div = html`<div id="page-one"></div>`;
if (state.layout) {
return state.layout(state, div);
}
return div;
};

View File

@@ -1,31 +0,0 @@
const html = require('choo/html');
const progress = require('./progress');
const { fadeOut } = require('../utils');
module.exports = function(state, emit) {
const div = html`
<div id="download" class="fadeIn">
<div id="download-progress">
<div id="dl-title" class="title">${state.translate(
'downloadFinish'
)}</div>
<div class="description"></div>
${progress(1)}
<div class="upload">
<div class="progress-text"></div>
</div>
</div>
<a class="send-new" data-state="completed" href="/" onclick=${sendNew}>${state.translate(
'sendYourFilesLink'
)}</a>
</div>
`;
async function sendNew(e) {
e.preventDefault();
await fadeOut('download');
emit('pushState', '/');
}
return div;
};

View File

@@ -1,28 +0,0 @@
const html = require('choo/html');
const progress = require('./progress');
const { bytes } = require('../utils');
module.exports = function(state) {
const transfer = state.transfer;
const div = html`
<div id="download-progress" class="fadeIn">
<div id="dl-title" class="title">${state.translate(
'downloadingPageProgress',
{
filename: state.fileInfo.name,
size: bytes(state.fileInfo.size)
}
)}</div>
<div class="description">${state.translate('downloadingPageMessage')}</div>
${progress(transfer.progressRatio)}
<div class="upload">
<div class="progress-text">${state.translate(
transfer.msg,
transfer.sizes
)}</div>
</div>
</div>
`;
return div;
};

View File

@@ -0,0 +1,6 @@
.btn--download {
width: 180px;
height: 44px;
margin-top: 20px;
margin-bottom: 30px;
}

View File

@@ -0,0 +1,13 @@
const html = require('choo/html');
module.exports = function(state, emit) {
return html`
<button class="btn btn--download"
onclick=${download}>${state.translate('downloadButtonLabel')}
</button>`;
function download(event) {
event.preventDefault();
emit('download', state.fileInfo);
}
};

View File

@@ -0,0 +1,22 @@
.passwordSection {
text-align: left;
padding: 40px 0;
width: 80%;
}
.passwordForm {
display: flex;
flex-wrap: nowrap;
width: 100%;
padding: 10px 0;
}
@media (max-device-width: 520px), (max-width: 520px) {
.passwordSection {
width: 100%;
}
.passwordForm {
flex-direction: column;
}
}

View File

@@ -0,0 +1,66 @@
const html = require('choo/html');
module.exports = function(state, emit) {
const fileInfo = state.fileInfo;
const invalid = fileInfo.password === null;
const label = invalid
? html`
<label class="error" for="password-input">
${state.translate('passwordTryAgain')}
</label>`
: html`
<label for="password-input">
${state.translate('unlockInputLabel')}
</label>`;
const inputClass = invalid
? 'input input--noBtn input--error'
: 'input input--noBtn';
const div = html`
<div class="passwordSection">
${label}
<form class="passwordForm" onsubmit=${checkPassword} data-no-csrf>
<input id="password-input"
class="${inputClass}"
maxlength="64"
autocomplete="off"
placeholder="${state.translate('unlockInputPlaceholder')}"
oninput=${inputChanged}
type="password" />
<input type="submit"
id="password-btn"
class="inputBtn inputBtn--hidden"
value="${state.translate('unlockButtonLabel')}"/>
</form>
</div>`;
if (!(div instanceof String)) {
setTimeout(() => document.getElementById('password-input').focus());
}
function inputChanged() {
const input = document.getElementById('password-input');
const btn = document.getElementById('password-btn');
input.classList.remove('input--error');
if (input.value.length > 0) {
btn.classList.remove('inputBtn--hidden');
input.classList.remove('input--noBtn');
} else {
btn.classList.add('inputBtn--hidden');
input.classList.add('input--noBtn');
}
}
function checkPassword(event) {
event.preventDefault();
const password = document.getElementById('password-input').value;
if (password.length > 0) {
document.getElementById('password-btn').disabled = true;
state.fileInfo.url = window.location.href;
state.fileInfo.password = password;
emit('getMetadata');
}
return false;
}
return div;
};

View File

@@ -1,84 +0,0 @@
const html = require('choo/html');
const assets = require('../../common/assets');
function timeLeft(milliseconds) {
const minutes = Math.floor(milliseconds / 1000 / 60);
const hours = Math.floor(minutes / 60);
const seconds = Math.floor((milliseconds / 1000) % 60);
if (hours >= 1) {
return `${hours}h ${minutes % 60}m`;
} else if (hours === 0) {
return `${minutes}m ${seconds}s`;
}
return null;
}
module.exports = function(file, state, emit) {
const ttl = file.expiresAt - Date.now();
const remaining = timeLeft(ttl) || state.translate('linkExpiredAlt');
const row = html`
<tr id="${file.id}">
<td class="overflow-col" title="${file.name}">${file.name}</td>
<td class="center-col">
<img onclick=${copyClick} src="${assets.get(
'copy-16.svg'
)}" class="icon-copy" title="${state.translate('copyUrlHover')}">
<span class="text-copied" hidden="true">${state.translate(
'copiedUrl'
)}</span>
</td>
<td>${remaining}</td>
<td class="center-col">
<img onclick=${showPopup} src="${assets.get(
'close-16.svg'
)}" class="icon-delete" title="${state.translate('deleteButtonHover')}">
<div class="popup">
<div class="popuptext" onblur=${cancel} tabindex="-1">
<div class="popup-message">${state.translate('deletePopupText')}</div>
<div class="popup-action">
<span class="popup-no" onclick=${cancel}>${state.translate(
'deletePopupCancel'
)}</span>
<span class="popup-yes" onclick=${deleteFile}>${state.translate(
'deletePopupYes'
)}</span>
</div>
</div>
</div>
</td>
</tr>
`;
function copyClick(e) {
emit('copy', { url: file.url, location: 'upload-list' });
const icon = e.target;
const text = e.target.nextSibling;
icon.hidden = true;
text.hidden = false;
setTimeout(() => {
icon.hidden = false;
text.hidden = true;
}, 500);
}
function showPopup() {
const tr = document.getElementById(file.id);
const popup = tr.querySelector('.popuptext');
popup.classList.add('show');
popup.focus();
}
function cancel(e) {
e.stopPropagation();
const tr = document.getElementById(file.id);
const popup = tr.querySelector('.popuptext');
popup.classList.remove('show');
}
function deleteFile() {
emit('delete', { file, location: 'upload-list' });
emit('render');
}
return row;
};

View File

@@ -0,0 +1,26 @@
.fileData {
font-size: 15px;
vertical-align: top;
color: var(--lightTextColor);
padding: 17px 19px 0;
line-height: 23px;
position: relative;
}
.fileData--overflow {
text-overflow: ellipsis;
max-width: 0;
overflow: hidden;
white-space: nowrap;
}
.fileData--center {
text-align: center;
}
@media (max-device-width: 520px), (max-width: 520px) {
.fileData {
font-size: 13px;
padding: 17px 5px 0;
}
}

View File

@@ -0,0 +1,87 @@
const html = require('choo/html');
const assets = require('../../../common/assets');
const number = require('../../utils').number;
const deletePopup = require('../popup');
module.exports = function(file, state, emit) {
const ttl = file.expiresAt - Date.now();
const remainingTime =
timeLeft(ttl, state) || state.translate('linkExpiredAlt');
const downloadLimit = file.dlimit || 1;
const totalDownloads = file.dtotal || 0;
return html`
<tr id="${file.id}">
<td class="fileData fileData--overflow" title="${file.name}">
<a class="link" href="/share/${file.id}">${file.name}</a>
</td>
<td class="fileData fileData--center">
<img
onclick=${copyClick}
src="${assets.get('copy-16.svg')}"
class="cursor--pointer"
title="${state.translate('copyUrlHover')}">
<span hidden="true">
${state.translate('copiedUrl')}
</span>
</td>
<td class="fileData fileData--overflow">${remainingTime}</td>
<td class="fileData fileData--center">${number(totalDownloads)} / ${number(
downloadLimit
)}</td>
<td class="fileData fileData--center">
<img
onclick=${showPopup}
src="${assets.get('close-16.svg')}"
class="cursor--pointer"
title="${state.translate('deleteButtonHover')}">
${deletePopup(
state.translate('deletePopupText'),
state.translate('deletePopupYes'),
state.translate('deletePopupCancel'),
deleteFile
)}
</td>
</tr>
`;
function copyClick(e) {
emit('copy', { url: file.url, location: 'upload-list' });
const icon = e.target;
const text = e.target.nextSibling;
icon.hidden = true;
text.hidden = false;
setTimeout(() => {
icon.hidden = false;
text.hidden = true;
}, 500);
}
function showPopup() {
const tr = document.getElementById(file.id);
const popup = tr.querySelector('.popup');
popup.classList.add('popup--show');
popup.focus();
}
function deleteFile() {
emit('delete', { file, location: 'upload-list' });
emit('render');
}
};
function timeLeft(milliseconds, state) {
const minutes = Math.floor(milliseconds / 1000 / 60);
const hours = Math.floor(minutes / 60);
if (hours >= 1) {
return state.translate('expiresHoursMinutes', {
hours,
minutes: minutes % 60
});
} else if (hours === 0) {
if (minutes === 0) {
return state.translate('expiresMinutes', { minutes: '< 1' });
}
return state.translate('expiresMinutes', { minutes });
}
return null;
}

View File

@@ -1,32 +0,0 @@
const html = require('choo/html');
const file = require('./file');
module.exports = function(state, emit) {
let table = '';
if (state.storage.files.length) {
table = html`
<table id="uploaded-files">
<thead>
<tr>
<th id="uploaded-file">${state.translate('uploadedFile')}</th>
<th id="copy-file-list" class="center-col">${state.translate(
'copyFileList'
)}</th>
<th id="expiry-file-list">${state.translate('expiryFileList')}</th>
<th id="delete-file-list" class="center-col">${state.translate(
'deleteFileList'
)}</th>
</tr>
</thead>
<tbody>
${state.storage.files.map(f => file(f, state, emit))}
</tbody>
</table>
`;
}
return html`
<div id="file-list">
${table}
</div>
`;
};

View File

@@ -0,0 +1,52 @@
.fileList {
margin: 45.3px auto;
table-layout: fixed;
border-collapse: collapse;
font-family: 'Segoe UI', 'SF Pro Text', sans-serif;
}
.fileList__header {
font-size: 16px;
color: var(--lightTextColor);
font-weight: lighter;
text-align: left;
background: rgba(0, 148, 251, 0.05);
height: 40px;
border-top: 1px solid rgba(0, 148, 251, 0.1);
padding: 0 19px;
white-space: nowrap;
}
.fileList__body {
word-wrap: break-word;
word-break: break-all;
}
.fileList__nameCol {
width: 35%;
}
.fileList__copyCol {
text-align: center;
width: 25%;
}
.fileList__expireCol {
width: 25%;
}
.fileList__dlCol {
width: 8%;
}
.fileList__delCol {
text-align: center;
width: 7%;
}
@media (max-device-width: 520px), (max-width: 520px) {
.fileList__header {
font-size: 14px;
padding: 0 5px;
}
}

View File

@@ -0,0 +1,33 @@
const html = require('choo/html');
const file = require('../file');
module.exports = function(state, emit) {
if (state.storage.files.length) {
return html`
<table class="fileList">
<thead>
<tr>
<th class="fileList__header fileList__nameCol">
${state.translate('uploadedFile')}
</th>
<th class="fileList__header fileList__copyCol">
${state.translate('copyFileList')}
</th>
<th class="fileList__header fileList__expireCol" >
${state.translate('timeFileList')}
</th>
<th class="fileList__header fileList__dlCol" >
${state.translate('downloadsFileList')}
</th>
<th class="fileList__header fileList__delCol">
${state.translate('deleteFileList')}
</th>
</tr>
</thead>
<tbody class="fileList__body">
${state.storage.files.map(f => file(f, state, emit))}
</tbody>
</table>
`;
}
};

View File

@@ -0,0 +1,93 @@
.footer {
right: 0;
bottom: 0;
left: 0;
font-size: 13px;
display: flex;
align-items: flex-end;
flex-direction: row;
justify-content: space-between;
padding: 50px 31px 41px;
width: 100%;
box-sizing: border-box;
}
.legalSection {
max-width: 81vw;
display: flex;
align-items: center;
flex-direction: row;
}
.legalSection__link {
color: var(--lightTextColor);
opacity: 0.9;
white-space: nowrap;
margin-right: 2vw;
}
.legalSection__link:hover {
opacity: 1;
}
.legalSection__link:visited {
color: var(--lightTextColor);
}
.legalSection__mozLogo {
width: 112px;
height: 32px;
margin-bottom: -5px;
}
.socialSection {
display: flex;
justify-content: space-between;
width: 94px;
}
.socialSection__link {
opacity: 0.9;
}
.socialSection__link:hover {
opacity: 1;
}
.socialSection__icon {
width: 32px;
height: 32px;
margin-bottom: -5px;
}
@media (max-device-width: 768px), (max-width: 768px) {
.footer {
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
max-width: 630px;
margin: auto;
}
.legalSection__mozLogo {
margin-left: -7px;
}
.legalSection {
flex-direction: column;
margin: auto;
width: 100%;
max-width: 100%;
}
.legalSection__link {
display: block;
padding: 10px 0;
align-self: flex-start;
}
.socialSection {
margin-top: 20px;
align-self: flex-start;
}
}

View File

@@ -0,0 +1,71 @@
const html = require('choo/html');
const assets = require('../../../common/assets');
module.exports = function(state) {
const footer = html`<footer class="footer">
<div class="legalSection">
<a
href="https://www.mozilla.org"
class="legalSection__link"
role="presentation">
<img
class="legalSection__mozLogo"
src="${assets.get('mozilla-logo.svg')}"
alt="mozilla"/>
</a>
<a
href="https://www.mozilla.org/about/legal"
class="legalSection__link">
${state.translate('footerLinkLegal')}
</a>
<a
href="https://testpilot.firefox.com/about"
class="legalSection__link">
${state.translate('footerLinkAbout')}
</a>
<a
href="/legal"
class="legalSection__link">${state.translate('footerLinkPrivacy')}</a>
<a
href="/legal"
class="legalSection__link">${state.translate('footerLinkTerms')}</a>
<a
href="https://www.mozilla.org/privacy/websites/#cookies"
class="legalSection__link">
${state.translate('footerLinkCookies')}
</a>
<a
href="https://www.mozilla.org/about/legal/report-infringement/"
class="legalSection__link">
${state.translate('reportIPInfringement')}
</a>
</div>
<div class="socialSection">
<a
href="https://github.com/mozilla/send"
class="socialSection__link"
role="presentation">
<img
class="socialSection__icon"
src="${assets.get('github-icon.svg')}"
alt="github"/>
</a>
<a
href="https://twitter.com/FxTestPilot"
class="socialSection__link"
role="presentation">
<img
class="socialSection__icon"
src="${assets.get('twitter-icon.svg')}"
alt="twitter"/>
</a>
</div>
</footer>`;
// HACK
// We only want to render this once because we
// toggle the targets of the links with utils/openLinksInNewTab
footer.isSameNode = function(target) {
return target && target.nodeName && target.nodeName === 'FOOTER';
};
return footer;
};

View File

@@ -0,0 +1,56 @@
.fxPromo {
padding: 0 15px;
height: 48px;
background-color: #efeff1;
color: #4a4a4f;
font-size: 13px;
display: flex;
flex-direction: row;
align-content: center;
align-items: center;
justify-content: center;
}
.fxPromo > div {
display: flex;
align-items: center;
margin: 0 auto;
}
.fxPromo > div > span {
margin-left: 10px;
}
.fxPromo__logo {
width: 24px;
}
.fxPromo--blue {
background: linear-gradient(-180deg, #45a1ff 0%, #00feff 94%);
color: #fff;
}
.fxPromo--pink {
background: linear-gradient(-180deg, #ff9400 0%, #ff1ad9 94%);
color: #fff;
}
.fxPromo--blue a {
color: #fff;
font-weight: bold;
}
.fxPromo--pink a {
color: #fff;
font-weight: bold;
}
.fxPromo--blue a:hover {
color: #eee;
font-weight: bold;
}
.fxPromo--pink a:hover {
color: #eee;
font-weight: bold;
}

View File

@@ -0,0 +1,34 @@
const html = require('choo/html');
const assets = require('../../../common/assets');
module.exports = function(state, emit) {
let classes = 'fxPromo';
switch (state.promo) {
case 'blue':
classes = 'fxPromo fxPromo--blue';
break;
case 'pink':
classes = 'fxPromo fxPromo--pink';
break;
}
return html`
<div class="${classes}">
<div>
<img
src="${assets.get('firefox_logo-only.svg')}"
class="fxPromo__logo"
alt="Firefox"/>
<span>Send is brought to you by the all-new Firefox.
<a
class="link"
href="https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com"
onclick=${clicked}
>Download Firefox now ≫</a></span>
</div>
</div>`;
function clicked() {
emit('experiment', { cd3: 'promo' });
}
};

View File

@@ -0,0 +1,104 @@
.header {
align-items: flex-start;
box-sizing: border-box;
display: flex;
justify-content: space-between;
padding: 31px;
width: 100%;
}
.logo {
display: flex;
position: relative;
align-items: center;
}
.logo__link {
display: flex;
flex-direction: row;
}
.logo__title {
color: #3e3d40;
font-size: 32px;
font-weight: 500;
margin: 0;
position: relative;
top: -1px;
letter-spacing: 1px;
margin-left: 8px;
transition: color 50ms;
}
.logo__title:hover {
color: var(--primaryControlBGColor);
}
.logo__subtitle {
color: #3e3d40;
font-size: 12px;
margin: 0 8px;
}
.logo__subtitle-link {
font-weight: bold;
color: #3e3d40;
transition: color 50ms;
}
.logo__subtitle-link:hover {
color: var(--primaryControlBGColor);
}
.feedback {
background-color: var(--primaryControlBGColor);
background-image: url('../assets/feedback.svg');
background-position: 2px 4px;
background-repeat: no-repeat;
background-size: 18px;
border-radius: 3px;
border: 1px solid var(--primaryControlBGColor);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
color: var(--primaryControlFGColor);
cursor: pointer;
display: block;
float: right;
font-size: 12px;
line-height: 12px;
opacity: 0.9;
padding: 5px;
overflow: hidden;
min-width: 12px;
max-width: 12px;
text-indent: 17px;
transition: all 250ms ease-in-out;
white-space: nowrap;
}
.feedback:hover,
.feedback:focus {
min-width: 30px;
max-width: 300px;
text-indent: 2px;
padding: 5px 5px 5px 20px;
background-color: var(--primaryControlHoverColor);
}
.feedback:active {
background-color: var(--primaryControlHoverColor);
}
@media (max-device-width: 520px), (max-width: 520px) {
.header {
flex-direction: column;
justify-content: flex-start;
}
.feedback {
margin-top: 10px;
min-width: 30px;
max-width: 300px;
text-indent: 2px;
padding: 5px 5px 5px 20px;
}
}

View File

@@ -0,0 +1,67 @@
const html = require('choo/html');
const assets = require('../../../common/assets');
/*
The current weback config uses package.json to generate
version.json for /__version__ meaning `require` returns the
string 'version.json' in the frontend context but the json
on the server.
We want `version` to be constant at build time so this file
has a custom loader (/build/version_loader.js) just to replace
string with the value from package.json. 🤢
*/
const version = require('../../../package.json').version || 'VERSION';
const browser = browserName();
module.exports = function(state) {
const feedbackUrl = `https://qsurvey.mozilla.com/s3/txp-firefox-send?ver=${version}&browser=${browser}`;
const header = html`
<header class="header">
<div class="logo">
<a class="logo__link" href="/">
<img
src="${assets.get('send_logo.svg')}"
alt="Send"/>
<h1 class="logo__title">Send</h1>
</a>
<div class="logo__subtitle">
<a class="logo__subtitle-link" href="https://testpilot.firefox.com">Firefox Test Pilot</a>
<div>${state.translate('siteSubtitle')}</div>
</div>
</div>
<a href="${feedbackUrl}"
rel="noreferrer noopener"
class="feedback"
target="_blank">${state.translate('siteFeedback')}</a>
</header>`;
// HACK
// We only want to render this once because we
// toggle the targets of the links with utils/openLinksInNewTab
header.isSameNode = function(target) {
return target && target.nodeName && target.nodeName === 'HEADER';
};
return header;
};
function browserName() {
try {
if (/firefox/i.test(navigator.userAgent)) {
return 'firefox';
}
if (/edge/i.test(navigator.userAgent)) {
return 'edge';
}
if (/trident/i.test(navigator.userAgent)) {
return 'ie';
}
if (/chrome/i.test(navigator.userAgent)) {
return 'chrome';
}
if (/safari/i.test(navigator.userAgent)) {
return 'safari';
}
return 'other';
} catch (e) {
return 'unknown';
}
}

View File

@@ -1,38 +0,0 @@
const html = require('choo/html');
function replaceLinks(str, urls) {
let i = -1;
const s = str.replace(/<a>([^<]+)<\/a>/g, (m, v) => {
i++;
return `<a href="${urls[i]}">${v}</a>`;
});
return [`<div class="description">${s}</div>`];
}
module.exports = function(state) {
const div = html`
<div id="page-one">
<div id="legal">
<div class="title">${state.translate('legalHeader')}</div>
${html(
replaceLinks(state.translate('legalNoticeTestPilot'), [
'https://testpilot.firefox.com/terms',
'https://testpilot.firefox.com/privacy',
'https://testpilot.firefox.com/experiments/send'
])
)}
${html(
replaceLinks(state.translate('legalNoticeMozilla'), [
'https://www.mozilla.org/privacy/websites/',
'https://www.mozilla.org/about/legal/terms/mozilla/'
])
)}
</div>
</div>
`;
if (state.layout) {
return state.layout(state, div);
}
return div;
};

View File

@@ -1,25 +0,0 @@
const html = require('choo/html');
const assets = require('../../common/assets');
module.exports = function(state) {
const div = html`
<div id="page-one">
<div id="download">
<div class="title">${state.translate('expiredPageHeader')}</div>
<div class="share-window">
<img src="${assets.get('illustration_expired.svg')}" id="expired-img">
</div>
<div class="expired-description">${state.translate(
'uploadPageExplainer'
)}</div>
<a class="send-new" href="/" data-state="notfound">${state.translate(
'sendYourFilesLink'
)}</a>
</div>
</div>`;
if (state.layout) {
return state.layout(state, div);
}
return div;
};

View File

@@ -0,0 +1,109 @@
const html = require('choo/html');
const MAX_LENGTH = 32;
module.exports = function(file, state, emit) {
const loading = state.settingPassword;
const pwd = file.hasPassword;
const sectionClass =
pwd || state.passwordSetError
? 'passwordInput'
: 'passwordInput passwordInput--hidden';
const inputClass = loading || pwd ? 'input' : 'input input--noBtn';
let btnClass = 'inputBtn inputBtn--password inputBtn--hidden';
if (loading) {
btnClass = 'inputBtn inputBtn--password inputBtn--loading';
} else if (pwd) {
btnClass = 'inputBtn inputBtn--password';
}
const action = pwd
? state.translate('changePasswordButton')
: state.translate('addPasswordButton');
return html`
<div class="${sectionClass}">
<form
class="passwordInput__form"
onsubmit=${setPassword}
data-no-csrf>
<input id="password-input"
${loading ? 'disabled' : ''}
class="${inputClass}"
maxlength="${MAX_LENGTH}"
autocomplete="off"
type="password"
oninput=${inputChanged}
onfocus=${focused}
placeholder="${
pwd && !state.passwordSetError
? passwordPlaceholder(file.password)
: state.translate('unlockInputPlaceholder')
}">
<input type="submit"
id="password-btn"
${loading ? 'disabled' : ''}
class="${btnClass}"
value="${loading ? '' : action}">
</form>
<label
class="passwordInput__msg ${
state.passwordSetError ? 'passwordInput__msg--error' : ''
}"
for="password-input">${message(state, pwd)}</label>
</div>`;
function inputChanged() {
state.passwordSetError = null;
const resetInput = document.getElementById('password-input');
const resetBtn = document.getElementById('password-btn');
const pwdmsg = document.querySelector('.passwordInput__msg');
const length = resetInput.value.length;
if (length === MAX_LENGTH) {
pwdmsg.textContent = state.translate('maxPasswordLength', {
length: MAX_LENGTH
});
} else {
pwdmsg.textContent = '';
}
if (length > 0) {
resetBtn.classList.remove('inputBtn--hidden');
resetInput.classList.remove('input--noBtn');
} else {
resetBtn.classList.add('inputBtn--hidden');
resetInput.classList.add('input--noBtn');
}
}
function focused(event) {
event.preventDefault();
const el = document.getElementById('password-input');
if (el.placeholder !== state.translate('unlockInputPlaceholder')) {
el.placeholder = '';
}
}
function setPassword(event) {
event.preventDefault();
const el = document.getElementById('password-input');
const password = el.value;
if (password.length > 0) {
emit('password', { password, file });
} else {
el.focus();
}
return false;
}
};
function passwordPlaceholder(password) {
return password ? password.replace(/./g, '●') : '●●●●●●●●●●●●';
}
function message(state, pwd) {
if (state.passwordSetError) {
return state.translate('passwordSetError');
}
if (state.settingPassword || !pwd) {
return '';
}
return state.translate('passwordIsSet');
}

View File

@@ -0,0 +1,41 @@
.passwordInput {
width: 90%;
height: 100px;
padding: 10px 5px 5px;
}
.passwordInput--hidden {
visibility: hidden;
}
.passwordInput__form {
display: flex;
flex-wrap: nowrap;
padding-bottom: 5px;
}
.passwordInput__msg {
font-size: 15px;
color: var(--lightTextColor);
}
.passwordInput__msg--error {
color: var(--errorColor);
}
.inputBtn--loading {
background-image: url('../assets/spinner.svg');
background-position: center;
background-size: 30px 30px;
background-repeat: no-repeat;
}
.inputBtn--password {
flex: 0 0 200px;
}
@media (max-device-width: 520px), (max-width: 520px) {
.passwordInput__form {
flex-direction: column;
}
}

View File

@@ -0,0 +1,26 @@
const html = require('choo/html');
module.exports = function(msg, confirmText, cancelText, confirmCallback) {
return html`
<div class="popup__wrapper">
<div class="popup" onblur=${hide} tabindex="-1">
<div class="popup__message">${msg}</div>
<div class="popup__action">
<span class="popup__no" onclick=${hide}>
${cancelText}
</span>
<span class="popup__yes" onclick=${confirmCallback}>
${confirmText}
</span>
</div>
</div>
</div>`;
function hide(e) {
e.stopPropagation();
const popup = document.querySelector('.popup.popup--show');
if (popup) {
popup.classList.remove('popup--show');
}
}
};

View File

@@ -0,0 +1,122 @@
.popup {
visibility: hidden;
min-width: 204px;
min-height: 105px;
background-color: var(--pageBGColor);
color: var(--textColor);
border: 1px solid #d7d7db;
padding: 15px 24px;
box-sizing: content-box;
text-align: center;
border-radius: 5px;
position: absolute;
z-index: 1;
bottom: 20px;
left: -40px;
transition: opacity 0.5s;
opacity: 0;
outline: 0;
box-shadow: 3px 3px 7px rgba(136, 136, 136, 0.3);
}
.popup::after {
content: '';
position: absolute;
bottom: -11px;
left: 20px;
background-color: #fff;
display: block;
width: 20px;
height: 20px;
transform: rotate(45deg);
border-radius: 0 0 5px;
border-right: 1px solid #d7d7db;
border-bottom: 1px solid #d7d7db;
border-left: 1px solid #fff;
border-top: 1px solid #fff;
}
.popup__wrapper {
position: absolute;
display: inline-block;
}
.popup__message {
height: 40px;
display: flex;
justify-content: center;
align-items: center;
border-bottom: 1px #ebebeb solid;
color: var(--textColor);
font-size: 15px;
font-weight: normal;
padding-bottom: 15px;
white-space: nowrap;
width: calc(100% + 48px);
margin-left: -24px;
}
.popup__action {
margin-top: 15px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
}
.popup__no {
color: #4a4a4a;
background-color: #fbfbfb;
border: 1px #c1c1c1 solid;
border-radius: 5px;
padding: 5px 25px;
font-weight: normal;
min-width: 94px;
box-sizing: border-box;
cursor: pointer;
white-space: nowrap;
}
.popup__no:hover {
background-color: #efeff1;
}
.popup__yes {
color: var(--primaryControlFGColor);
background-color: var(--primaryControlBGColor);
border-radius: 5px;
padding: 5px 25px;
font-weight: normal;
cursor: pointer;
min-width: 94px;
box-sizing: border-box;
white-space: nowrap;
margin-left: 12px;
}
.popup__yes:hover {
background-color: var(--primaryControlHoverColor);
}
.popup--show {
visibility: visible;
opacity: 1;
}
@media (max-device-width: 992px), (max-width: 992px) {
.popup {
left: auto;
right: -40px;
}
.popup::after {
left: auto;
right: 36px;
}
}
@media (max-device-width: 520px), (max-width: 520px) {
.popup::after {
left: 125px;
}
}

View File

@@ -1,70 +0,0 @@
const html = require('choo/html');
const assets = require('../../common/assets');
const notFound = require('./notFound');
const { bytes } = require('../utils');
function getFileFromDOM() {
const el = document.getElementById('dl-file');
if (!el) {
return null;
}
const data = el.dataset;
return {
name: data.name,
size: parseInt(data.size, 10),
ttl: parseInt(data.ttl, 10)
};
}
module.exports = function(state, emit) {
state.fileInfo = state.fileInfo || getFileFromDOM();
if (!state.fileInfo) {
return notFound(state, emit);
}
state.fileInfo.id = state.params.id;
state.fileInfo.key = state.params.key;
const fileInfo = state.fileInfo;
const size = bytes(fileInfo.size);
const div = html`
<div id="page-one">
<div id="download">
<div id="download-page-one">
<div class="title">
<span id="dl-file"
data-name="${fileInfo.name}"
data-size="${fileInfo.size}"
data-ttl="${fileInfo.ttl}">${state.translate('downloadFileName', {
filename: fileInfo.name
})}</span>
<span id="dl-filesize">${' ' +
state.translate('downloadFileSize', { size })}</span>
</div>
<div class="description">${state.translate('downloadMessage')}</div>
<img
src="${assets.get('illustration_download.svg')}"
id="download-img"
alt="${state.translate('downloadAltText')}"/>
<div>
<button
id="download-btn"
class="btn"
title="${state.translate('downloadButtonLabel')}"
onclick=${download}>${state.translate(
'downloadButtonLabel'
)}</button>
</div>
</div>
<a class="send-new" href="/">${state.translate('sendYourFilesLink')}</a>
</div>
</div>
`;
function download(event) {
event.preventDefault();
emit('download', fileInfo);
}
if (state.layout) {
return state.layout(state, div);
}
return div;
};

View File

@@ -1,21 +0,0 @@
const html = require('choo/html');
const radius = 73;
const oRadius = radius + 10;
const oDiameter = oRadius * 2;
const circumference = 2 * Math.PI * radius;
module.exports = function(progressRatio) {
const dashOffset = (1 - progressRatio) * circumference;
const percent = Math.floor(progressRatio * 100);
const div = html`
<div class="progress-bar">
<svg id="progress" width="${oDiameter}" height="${oDiameter}" viewPort="0 0 ${oDiameter} ${oDiameter}" version="1.1">
<circle r="${radius}" cx="${oRadius}" cy="${oRadius}" fill="transparent"/>
<circle id="bar" r="${radius}" cx="${oRadius}" cy="${oRadius}" fill="transparent" transform="rotate(-90 ${oRadius} ${oRadius})" stroke-dasharray="${circumference}" stroke-dashoffset="${dashOffset}"/>
<text class="percentage" text-anchor="middle" x="50%" y="98"><tspan class="percent-number">${percent}</tspan><tspan class="percent-sign">%</tspan></text>
</svg>
</div>
`;
return div;
};

View File

@@ -0,0 +1,56 @@
const html = require('choo/html');
const percent = require('../../utils').percent;
const radius = 73;
const oRadius = radius + 10;
const oDiameter = oRadius * 2;
const circumference = 2 * Math.PI * radius;
module.exports = function(progressRatio, indefinite = false) {
// HACK - never indefinite for MS Edge
if (/edge/i.test(navigator.userAgent)) {
indefinite = false;
}
const p = indefinite ? 0.2 : progressRatio;
const dashOffset = (1 - p) * circumference;
const progressPercent = html`
<text class="progress__percent" text-anchor="middle" x="50%" y="98">
${percent(progressRatio)}
</text>`;
return html`
<div class="progress">
<svg
width="${oDiameter}"
height="${oDiameter}"
viewPort="0 0 ${oDiameter} ${oDiameter}"
version="1.1">
<circle
class="progress__bg"
r="${radius}"
cx="${oRadius}"
cy="${oRadius}"
fill="transparent"/>
<circle
class="progress__indefinite ${indefinite ? '' : 'progress--invisible'}"
r="${radius}"
cx="${oRadius}"
cy="${oRadius}"
fill="transparent"
transform="rotate(-90 ${oRadius} ${oRadius})"
stroke-dasharray="${circumference}"
stroke-dashoffset="${dashOffset}"/>
<circle
class="progress__bar ${indefinite ? 'progress--invisible' : ''}"
r="${radius}"
cx="${oRadius}"
cy="${oRadius}"
fill="transparent"
transform="rotate(-90 ${oRadius} ${oRadius})"
stroke-dasharray="${circumference}"
stroke-dashoffset="${dashOffset}"/>
${indefinite ? '' : progressPercent}
</svg>
</div>
`;
};

View File

@@ -0,0 +1,43 @@
.progress {
margin-top: 3px;
}
.progress__bg {
stroke: #eee;
stroke-width: 0.75em;
}
.progress__bar {
stroke: #3b9dff;
stroke-width: 0.75em;
transition: stroke-dashoffset 300ms linear;
}
.progress__indefinite {
stroke: #3b9dff;
stroke-width: 0.75em;
animation: 1s linear infinite spin;
transform-origin: center;
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.progress__percent {
font-family: 'Segoe UI', 'SF Pro Text', sans-serif;
font-size: 43.2px;
letter-spacing: -0.78px;
line-height: 58px;
user-select: none;
}
.progress--invisible {
display: none;
}

View File

@@ -0,0 +1,28 @@
const html = require('choo/html');
module.exports = function(selected, options, translate, changed) {
const id = `select-${Math.random()}`;
let x = selected;
return html`
<div class="select">
<select id="${id}" onchange=${choose}>
${options.map(
i =>
html`<option value="${i}" ${
i === selected ? 'selected' : ''
}>${translate(i)}</option>`
)}
</select>
</div>`;
function choose(event) {
const target = event.target;
const value = +target.value;
if (x !== value) {
x = value;
changed(value);
}
}
};

View File

@@ -0,0 +1,47 @@
.select {
background-color: var(--pageBGColor);
overflow: hidden;
padding: 4px 2px 1px 2px;
border: 1px dotted #0094fb88;
border-radius: 4px;
display: inline;
position: relative;
}
.select::after {
color: #0094fb;
content: '\25BC';
position: absolute;
right: 0;
padding: 0 10px;
pointer-events: none;
font-size: 20px;
}
option {
padding: 0;
}
select {
appearance: none;
outline: 0;
box-shadow: none;
border: 0;
background: #fff;
background-image: none;
font-size: 1em;
font-weight: 200;
margin: 0;
color: #0094fb;
cursor: pointer;
padding-right: 40px;
}
select:active {
background-color: var(--pageBGColor);
border: 0;
}
#arrow {
position: relative;
}

View File

@@ -0,0 +1,37 @@
const html = require('choo/html');
const passwordInput = require('../passwordInput');
module.exports = function(state, emit) {
const file = state.storage.getFileById(state.params.id);
return html`
<div class="setPasswordSection">
<div class="checkbox">
<input
${file.hasPassword ? 'disabled' : ''}
${file.hasPassword || state.passwordSetError ? 'checked' : ''}
class="checkbox__input"
id="add-password"
type="checkbox"
autocomplete="off"
onchange=${togglePasswordInput}/>
<label class="checkbox__label" for="add-password">
${state.translate('requirePasswordCheckbox')}
</label>
</div>
${passwordInput(file, state, emit)}
</div>`;
function togglePasswordInput(e) {
const unlockInput = document.getElementById('password-input');
const boxChecked = e.target.checked;
document
.querySelector('.passwordInput')
.classList.toggle('passwordInput--hidden', !boxChecked);
if (boxChecked) {
unlockInput.focus();
} else {
unlockInput.value = '';
}
}
};

View File

@@ -0,0 +1,69 @@
.setPasswordSection {
padding: 10px 0;
max-width: 100%;
overflow-wrap: break-word;
}
.checkbox {
min-height: 24px;
}
.checkbox__input {
position: absolute;
opacity: 0;
}
.checkbox__label {
line-height: 23px;
cursor: pointer;
color: var(--lightTextColor);
user-select: none;
}
.checkbox__label::before {
content: '';
height: 20px;
width: 20px;
margin-right: 10px;
margin-left: 5px;
float: left;
border: 1px solid rgba(12, 12, 13, 0.3);
border-radius: 2px;
}
.checkbox__input:focus + .checkbox__label::before,
.checkbox:hover .checkbox__label::before {
border: 1px solid var(--primaryControlBGColor);
}
.checkbox__input:checked + .checkbox__label {
color: var(--textColor);
}
.checkbox__input:checked + .checkbox__label::before {
background-image: url('../assets/check-16-blue.svg');
background-position: 2px 1px;
}
.checkbox__input:disabled + .checkbox__label {
cursor: auto;
}
.checkbox__input:disabled + .checkbox__label::before {
background-image: url('../assets/check-16-blue.svg');
background-repeat: no-repeat;
background-size: 26px 26px;
border: none;
cursor: auto;
}
@media (max-device-width: 520px), (max-width: 520px) {
.setPasswordSection {
align-self: center;
min-width: 95%;
}
.checkbox__label::before {
margin-left: 0;
}
}

View File

@@ -1,64 +0,0 @@
const html = require('choo/html');
const assets = require('../../common/assets');
const notFound = require('./notFound');
const { allowedCopy, delay, fadeOut } = require('../utils');
module.exports = function(state, emit) {
const file = state.storage.getFileById(state.params.id);
if (!file) {
return notFound(state, emit);
}
const div = html`
<div id="share-link" class="fadeIn">
<div class="title">${state.translate('uploadSuccessTimingHeader')}</div>
<div id="share-window">
<div id="copy-text">${state.translate('copyUrlFormLabelWithName', {
filename: file.name
})}</div>
<div id="copy">
<input id="link" type="url" value="${file.url}" readonly="true"/>
<button id="copy-btn" class="btn" title="${state.translate(
'copyUrlFormButton'
)}" onclick=${copyLink}>${state.translate('copyUrlFormButton')}</button>
</div>
<button id="delete-file" class="btn" title="${state.translate(
'deleteFileButton'
)}" onclick=${deleteFile}>${state.translate('deleteFileButton')}</button>
<a class="send-new" data-state="completed" href="/" onclick=${sendNew}>${state.translate(
'sendAnotherFileLink'
)}</a>
</div>
</div>
`;
async function sendNew(e) {
e.preventDefault();
await fadeOut('share-link');
emit('pushState', '/');
}
async function copyLink() {
if (allowedCopy()) {
emit('copy', { url: file.url, location: 'success-screen' });
const input = document.getElementById('link');
input.disabled = true;
const copyBtn = document.getElementById('copy-btn');
copyBtn.disabled = true;
copyBtn.replaceChild(
html`<img src="${assets.get('check-16.svg')}" class="icon-check">`,
copyBtn.firstChild
);
await delay(2000);
input.disabled = false;
copyBtn.disabled = false;
copyBtn.textContent = state.translate('copyUrlFormButton');
}
}
async function deleteFile() {
emit('delete', { file, location: 'success-screen' });
await fadeOut('share-link');
emit('pushState', '/');
}
return div;
};

View File

@@ -1,50 +0,0 @@
const html = require('choo/html');
const assets = require('../../common/assets');
module.exports = function(state) {
const msg =
state.params.reason === 'outdated'
? html`
<div id="unsupported-browser">
<div class="title">${state.translate('notSupportedHeader')}</div>
<div class="description">${state.translate(
'notSupportedOutdatedDetail'
)}</div>
<a id="update-firefox" href="https://support.mozilla.org/kb/update-firefox-latest-version">
<img src="${assets.get(
'firefox_logo-only.svg'
)}" class="firefox-logo" alt="Firefox"/>
<div class="unsupported-button-text">${state.translate(
'updateFirefox'
)}</div>
</a>
<div class="unsupported-description">${state.translate(
'uploadPageExplainer'
)}</div>
</div>`
: html`
<div id="unsupported-browser">
<div class="title">${state.translate('notSupportedHeader')}</div>
<div class="description">${state.translate('notSupportedDetail')}</div>
<div class="description"><a href="https://github.com/mozilla/send/blob/master/docs/faq.md#why-is-my-browser-not-supported">${state.translate(
'notSupportedLink'
)}</a></div>
<a id="dl-firefox" href="https://www.mozilla.org/firefox/new/?scene=2">
<img src="${assets.get(
'firefox_logo-only.svg'
)}" class="firefox-logo" alt="Firefox"/>
<div class="unsupported-button-text">Firefox<br>
<span>${state.translate('downloadFirefoxButtonSub')}</span>
</div>
</a>
<div class="unsupported-description">${state.translate(
'uploadPageExplainer'
)}</div>
</div>`;
const div = html`<div id="page-one">${msg}</div>`;
if (state.layout) {
return state.layout(state, div);
}
return div;
};

View File

@@ -1,38 +0,0 @@
const html = require('choo/html');
const progress = require('./progress');
const { bytes } = require('../utils');
module.exports = function(state, emit) {
const transfer = state.transfer;
const div = html`
<div id="upload-progress" class="fadeIn">
<div class="title" id="upload-filename">${state.translate(
'uploadingPageProgress',
{
filename: transfer.file.name,
size: bytes(transfer.file.size)
}
)}</div>
<div class="description"></div>
${progress(transfer.progressRatio)}
<div class="upload">
<div class="progress-text">${state.translate(
transfer.msg,
transfer.sizes
)}</div>
<button id="cancel-upload" title="${state.translate(
'uploadingPageCancel'
)}" onclick=${cancel}>${state.translate('uploadingPageCancel')}</button>
</div>
</div>
`;
function cancel() {
const btn = document.getElementById('cancel-upload');
btn.disabled = true;
btn.textContent = state.translate('uploadCancelNotification');
emit('cancel');
}
return div;
};

View File

@@ -1,62 +0,0 @@
const html = require('choo/html');
const assets = require('../../common/assets');
const fileList = require('./fileList');
const { fadeOut } = require('../utils');
module.exports = function(state, emit) {
const div = html`
<div id="page-one" class="fadeIn">
<div class="title">${state.translate('uploadPageHeader')}</div>
<div class="description">
<div>${state.translate('uploadPageExplainer')}</div>
<a href="https://testpilot.firefox.com/experiments/send" class="link">${state.translate(
'uploadPageLearnMore'
)}</a>
</div>
<div class="${state.config
.uploadWindowStyle}" ondragover=${dragover} ondragleave=${dragleave}>
<div id="upload-img"><img src="${assets.get(
'upload.svg'
)}" title="${state.translate('uploadSvgAlt')}"/></div>
<div id="upload-text">${state.translate('uploadPageDropMessage')}</div>
<span id="file-size-msg"><em>${state.translate(
'uploadPageSizeMessage'
)}</em></span>
<form method="post" action="upload" enctype="multipart/form-data">
<label for="file-upload" id="browse" class="${state.config
.uploadButtonStyle}" title="${state.translate(
'uploadPageBrowseButton1'
)}">${state.translate('uploadPageBrowseButton1')}</label>
<input id="file-upload" type="file" name="fileUploaded" onchange=${upload} />
</form>
</div>
${fileList(state, emit)}
</div>
`;
function dragover(event) {
const div = document.querySelector('.upload-window');
div.classList.add('ondrag');
}
function dragleave(event) {
const div = document.querySelector('.upload-window');
div.classList.remove('ondrag');
}
async function upload(event) {
event.preventDefault();
const target = event.target;
const file = target.files[0];
if (file.size === 0) {
return;
}
await fadeOut('page-one');
emit('upload', { file, type: 'click' });
}
if (state.layout) {
return state.layout(state, div);
}
return div;
};

View File

@@ -1,38 +1,15 @@
function arrayToHex(iv) {
let hexStr = '';
// eslint-disable-next-line prefer-const
for (let i in iv) {
if (iv[i] < 16) {
hexStr += '0' + iv[i].toString(16);
} else {
hexStr += iv[i].toString(16);
}
}
return hexStr;
const b64 = require('base64-js');
function arrayToB64(array) {
return b64
.fromByteArray(array)
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
}
function hexToArray(str) {
const iv = new Uint8Array(str.length / 2);
for (let i = 0; i < str.length; i += 2) {
iv[i / 2] = parseInt(str.charAt(i) + str.charAt(i + 1), 16);
}
return iv;
}
function notify(str) {
return str;
/* TODO: enable once we have an opt-in ui element
if (!('Notification' in window)) {
return;
} else if (Notification.permission === 'granted') {
new Notification(str);
} else if (Notification.permission !== 'denied') {
Notification.requestPermission(function(permission) {
if (permission === 'granted') new Notification(str);
});
}
*/
function b64ToArray(str) {
return b64.toByteArray(str + '==='.slice((str.length + 3) % 4));
}
function loadShim(polyfill) {
@@ -45,7 +22,7 @@ function loadShim(polyfill) {
});
}
async function canHasSend(polyfill) {
async function canHasSend() {
try {
const key = await window.crypto.subtle.generateKey(
{
@@ -55,7 +32,6 @@ async function canHasSend(polyfill) {
true,
['encrypt', 'decrypt']
);
await window.crypto.subtle.encrypt(
{
name: 'AES-GCM',
@@ -65,9 +41,24 @@ async function canHasSend(polyfill) {
key,
new ArrayBuffer(8)
);
await window.crypto.subtle.importKey(
'raw',
window.crypto.getRandomValues(new Uint8Array(16)),
'PBKDF2',
false,
['deriveKey']
);
await window.crypto.subtle.importKey(
'raw',
window.crypto.getRandomValues(new Uint8Array(16)),
'HKDF',
false,
['deriveKey']
);
return true;
} catch (err) {
return loadShim(polyfill);
console.error(err);
return false;
}
}
@@ -105,21 +96,44 @@ const LOCALIZE_NUMBERS = !!(
const UNITS = ['B', 'kB', 'MB', 'GB'];
function bytes(num) {
if (num < 1) {
return '0B';
}
const exponent = Math.min(Math.floor(Math.log10(num) / 3), UNITS.length - 1);
const n = Number(num / Math.pow(1000, exponent));
const nStr = LOCALIZE_NUMBERS
? n.toLocaleString(navigator.languages, {
let nStr = n.toFixed(1);
if (LOCALIZE_NUMBERS) {
try {
const locale = document.querySelector('html').lang;
nStr = n.toLocaleString(locale, {
minimumFractionDigits: 1,
maximumFractionDigits: 1
})
: n.toFixed(1);
});
} catch (e) {
// fall through
}
}
return `${nStr}${UNITS[exponent]}`;
}
function percent(ratio) {
return LOCALIZE_NUMBERS
? ratio.toLocaleString(navigator.languages, { style: 'percent' })
: `${Math.floor(ratio * 100)}%`;
if (LOCALIZE_NUMBERS) {
try {
const locale = document.querySelector('html').lang;
return ratio.toLocaleString(locale, { style: 'percent' });
} catch (e) {
// fall through
}
}
return `${Math.floor(ratio * 100)}%`;
}
function number(n) {
if (LOCALIZE_NUMBERS) {
const locale = document.querySelector('html').lang;
return n.toLocaleString(locale);
}
return n.toString();
}
function allowedCopy() {
@@ -131,14 +145,28 @@ function delay(delay = 100) {
return new Promise(resolve => setTimeout(resolve, delay));
}
function fadeOut(id) {
const classes = document.getElementById(id).classList;
classes.remove('fadeIn');
classes.add('fadeOut');
function fadeOut(selector) {
const classes = document.querySelector(selector).classList;
classes.remove('effect--fadeIn');
classes.add('effect--fadeOut');
return delay(300);
}
const ONE_DAY_IN_MS = 86400000;
function openLinksInNewTab(links, should = true) {
links = links || Array.from(document.querySelectorAll('a:not([target])'));
if (should) {
links.forEach(l => {
l.setAttribute('target', '_blank');
l.setAttribute('rel', 'noopener noreferrer');
});
} else {
links.forEach(l => {
l.removeAttribute('target');
l.removeAttribute('rel');
});
}
return links;
}
module.exports = {
fadeOut,
@@ -146,11 +174,12 @@ module.exports = {
allowedCopy,
bytes,
percent,
number,
copyToClipboard,
arrayToHex,
hexToArray,
notify,
arrayToB64,
b64ToArray,
loadShim,
canHasSend,
isFile,
ONE_DAY_IN_MS
openLinksInNewTab
};

1
assets/check-16-blue.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="#0A84FF " d="M6 14a1 1 0 0 1-.707-.293l-3-3a1 1 0 0 1 1.414-1.414l2.157 2.157 6.316-9.023a1 1 0 0 1 1.639 1.146l-7 10a1 1 0 0 1-.732.427A.863.863 0 0 1 6 14z"/></svg>

After

Width:  |  Height:  |  Size: 238 B

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path class="icon-copy" fill="#0A8DFF" d="M14.707 8.293l-3-3A1 1 0 0 0 11 5h-1V4a1 1 0 0 0-.293-.707l-3-3A1 1 0 0 0 6 0H3a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3v3a2 2 0 0 0 2 2h5a2 2 0 0 0 2-2V9a1 1 0 0 0-.293-.707zM12.586 9H11V7.414zm-5-5H6V2.414zM6 7v2H3V2h2v2.5a.5.5 0 0 0 .5.5H8a2 2 0 0 0-2 2zm2 7V7h2v2.5a.5.5 0 0 0 .5.5H13v4z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="#0A8DFF" d="M14.707 8.293l-3-3A1 1 0 0 0 11 5h-1V4a1 1 0 0 0-.293-.707l-3-3A1 1 0 0 0 6 0H3a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3v3a2 2 0 0 0 2 2h5a2 2 0 0 0 2-2V9a1 1 0 0 0-.293-.707zM12.586 9H11V7.414zm-5-5H6V2.414zM6 7v2H3V2h2v2.5a.5.5 0 0 0 .5.5H8a2 2 0 0 0-2 2zm2 7V7h2v2.5a.5.5 0 0 0 .5.5H13v4z"/></svg>

Before

Width:  |  Height:  |  Size: 416 B

After

Width:  |  Height:  |  Size: 398 B

File diff suppressed because one or more lines are too long

BIN
assets/favicon-120.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
assets/favicon-128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
assets/favicon-144.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
assets/favicon-152.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
assets/favicon-167.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
assets/favicon-180.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
assets/favicon-195.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
assets/favicon-196.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
assets/favicon-228.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
assets/favicon-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

BIN
assets/favicon-96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 239 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,931 +0,0 @@
/*** index.html ***/
html {
background: url('./send_bg.svg');
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui',
'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif;
font-weight: 200;
background-size: 110%;
background-repeat: no-repeat;
background-position: center top;
height: 100%;
max-width: 1440px;
margin: auto;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui',
'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif;
display: flex;
flex-direction: column;
margin: 0;
min-height: 100vh;
position: relative;
}
#progress circle {
stroke: #eee;
stroke-width: 0.75em;
}
#progress #bar {
transition: stroke-dashoffset 300ms linear;
stroke: #3b9dff;
}
.header {
align-items: flex-start;
box-sizing: border-box;
display: flex;
justify-content: space-between;
padding: 31px;
width: 100%;
}
.send-logo {
display: flex;
position: relative;
align-items: center;
}
.send-logo h1 {
transition: color 50ms;
}
.send-logo h1:hover {
color: #0297f8;
}
.send-logo > a {
display: flex;
flex-direction: row;
}
.site-title {
color: #3e3d40;
font-size: 32px;
font-weight: 500;
margin: 0;
position: relative;
top: -1px;
letter-spacing: 1px;
margin-left: 8px;
}
.site-subtitle {
color: #3e3d40;
font-size: 12px;
margin: 0 8px;
}
.site-subtitle a {
font-weight: bold;
color: #3e3d40;
transition: color 50ms;
}
.site-subtitle a:hover {
color: #0297f8;
}
.feedback {
background-color: #0297f8;
background-image: url('./feedback.svg');
background-position: 2px 4px;
background-repeat: no-repeat;
background-size: 18px;
border-radius: 3px;
border: 1px solid #0297f8;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
color: #fff;
cursor: pointer;
display: block;
float: right;
font-size: 12px;
line-height: 12px;
opacity: 0.9;
padding: 5px;
overflow: hidden;
min-width: 12px;
max-width: 12px;
text-indent: 17px;
transition: all 250ms ease-in-out;
white-space: nowrap;
}
.feedback:hover,
.feedback:focus {
min-width: 30px;
max-width: 300px;
text-indent: 2px;
padding: 5px 5px 5px 20px;
background-color: #0287e8;
}
.feedback:active {
background-color: #0277d8;
}
.all {
flex: 1;
display: flex;
flex-direction: column;
justify-content: flex-start;
max-width: 630px;
margin: 0 auto;
padding: 0 20px;
box-sizing: border-box;
width: 96%;
}
input,
select,
textarea,
button {
font-family: inherit;
}
a {
text-decoration: none;
}
.btn {
font-weight: 500;
}
/** page-one **/
.fadeOut {
opacity: 0;
animation: fadeout 200ms linear;
}
@keyframes fadeout {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.fadeIn {
opacity: 1;
animation: fadein 200ms linear;
}
@keyframes fadein {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.title {
font-size: 33px;
line-height: 40px;
margin: 20px auto;
text-align: center;
max-width: 520px;
font-family: 'SF Pro Text', sans-serif;
word-wrap: break-word;
}
.description {
font-size: 15px;
line-height: 23px;
max-width: 630px;
text-align: center;
margin: 0 auto 60px;
color: #0c0c0d;
width: 92%;
}
.upload-window {
border: 1px dashed rgba(0, 148, 251, 0.5);
margin: 0 auto;
height: 255px;
border-radius: 4px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
transition: transform 150ms;
padding: 15px;
}
.upload-window.ondrag {
border: 3px dashed rgba(0, 148, 251, 0.5);
margin: 0 auto;
height: 251px;
transform: scale(1.04);
border-radius: 4.2px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
}
.upload-window-b {
border: 3px dashed rgba(0, 148, 251, 0.5);
}
.upload-window-b.ondrag {
border: 5px dashed rgba(0, 148, 251, 0.5);
}
.link {
color: #0094fb;
text-decoration: none;
}
.link:hover {
color: #0287e8;
}
#upload-text {
font-size: 22px;
color: #737373;
margin: 20px 0 10px;
font-family: 'SF Pro Text', sans-serif;
}
.browse {
background: #0297f8;
border-radius: 5px;
font-size: 15px;
color: #fff;
min-width: 240px;
height: 44px;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
padding: 0 10px;
}
.browse:hover {
background-color: #0287e8;
}
.browse-b {
height: 60px;
font-size: 20px;
}
input[type='file'] {
display: none;
}
#file-size-msg {
font-size: 12px;
line-height: 16px;
color: #737373;
margin-bottom: 22px;
}
/** file-list **/
th {
font-size: 16px;
color: #858585;
font-weight: lighter;
text-align: left;
background: rgba(0, 148, 251, 0.05);
height: 40px;
border-top: 1px solid rgba(0, 148, 251, 0.1);
padding: 0 19px;
white-space: nowrap;
}
td {
font-size: 15px;
vertical-align: top;
color: #4a4a4a;
padding: 17px 19px 0;
line-height: 23px;
position: relative;
}
table {
border-collapse: collapse;
font-family: 'Segoe UI', 'SF Pro Text', sans-serif;
}
tbody {
word-wrap: break-word;
word-break: break-all;
}
#uploaded-files {
margin: 45.3px auto;
table-layout: fixed;
}
#uploaded-file {
width: 35%;
}
#copy-file-list {
width: 25%;
}
#expiry-file-list {
width: 21%;
}
#delete-file-list {
width: 12%;
}
.overflow-col {
text-overflow: ellipsis;
max-width: 0;
overflow: hidden;
white-space: nowrap;
}
.center-col {
text-align: center;
}
.icon-delete,
.icon-copy,
.icon-check {
cursor: pointer;
}
.icon-copy[disabled='disabled'] {
pointer-events: none;
opacity: 0.3;
}
.text-copied {
color: #0a8dff;
}
/* Popup container */
.popup {
position: absolute;
display: inline-block;
}
/* The actual popup (appears on top) */
.popup .popuptext {
visibility: hidden;
min-width: 204px;
min-height: 105px;
background-color: #fff;
color: #000;
border: 1px solid #d7d7db;
padding: 15px 24px;
box-sizing: content-box;
text-align: center;
border-radius: 5px;
position: absolute;
z-index: 1;
bottom: 20px;
left: -40px;
transition: opacity 0.5s;
opacity: 0;
outline: 0;
box-shadow: 3px 3px 7px rgba(136, 136, 136, 0.3);
}
/* Popup arrow */
.popup .popuptext::after {
content: '';
position: absolute;
bottom: -11px;
left: 20px;
background-color: #fff;
display: block;
width: 20px;
height: 20px;
transform: rotate(45deg);
border-radius: 0 0 5px;
border-right: 1px solid #d7d7db;
border-bottom: 1px solid #d7d7db;
}
.popup .show {
visibility: visible;
opacity: 1;
}
.popup-message {
height: 40px;
display: flex;
justify-content: center;
align-items: center;
border-bottom: 1px #ebebeb solid;
color: #0c0c0d;
font-size: 15px;
font-weight: normal;
padding-bottom: 15px;
white-space: nowrap;
width: calc(100% + 48px);
margin-left: -24px;
}
.popup-action {
margin-top: 15px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
}
.popup-yes {
color: #fff;
background-color: #0297f8;
border-radius: 5px;
padding: 5px 25px;
font-weight: normal;
cursor: pointer;
min-width: 94px;
box-sizing: border-box;
white-space: nowrap;
margin-left: 12px;
}
.popup-yes:hover {
background-color: #0287e8;
}
.popup-no {
color: #4a4a4a;
background-color: #fbfbfb;
border: 1px #c1c1c1 solid;
border-radius: 5px;
padding: 5px 25px;
font-weight: normal;
min-width: 94px;
box-sizing: border-box;
cursor: pointer;
white-space: nowrap;
}
.popup-no:hover {
background-color: #efeff1;
}
/** upload-progress **/
.progress-bar {
margin-top: 3px;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
position: relative;
}
.percentage {
letter-spacing: -0.78px;
font-family: 'Segoe UI', 'SF Pro Text', sans-serif;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.percent-number {
font-size: 43.2px;
line-height: 58px;
}
.percent-sign {
font-size: 28.8px;
stroke: none;
fill: #686868;
}
.upload {
margin: 0 auto;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
font-size: 15px;
}
.progress-text {
color: rgba(0, 0, 0, 0.5);
letter-spacing: -0.4px;
margin-top: 24px;
margin-bottom: 74px;
}
#cancel-upload {
color: #d70022;
background: #fff;
font-size: 15px;
border: 0;
cursor: pointer;
text-decoration: underline;
}
#cancel-upload:disabled {
text-decoration: none;
cursor: auto;
}
/** share-link **/
#share-window {
margin: 0 auto;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width: 100%;
max-width: 640px;
}
#share-window-r > div {
font-size: 12px;
padding-bottom: 10px;
}
#copy {
display: flex;
flex-wrap: nowrap;
width: 100%;
}
#copy-text {
align-self: flex-start;
margin-top: 60px;
margin-bottom: 10px;
color: #0c0c0d;
max-width: 614px;
word-wrap: break-word;
}
#link {
flex: 1;
height: 56px;
border: 1px solid #0297f8;
border-radius: 6px 0 0 6px;
font-size: 20px;
color: #737373;
font-family: 'SF Pro Text', sans-serif;
letter-spacing: 0;
line-height: 23px;
font-weight: 300;
padding-left: 10px;
padding-right: 10px;
}
#link:disabled {
border: 1px solid #05a700;
background: #fff;
}
#copy-btn {
flex: 0 1 165px;
background: #0297f8;
border-radius: 0 6px 6px 0;
border: 1px solid #0297f8;
color: white;
cursor: pointer;
font-size: 15px;
height: 60px;
padding-left: 10px;
padding-right: 10px;
white-space: nowrap;
}
#copy-btn:hover {
background-color: #0287e8;
}
#copy-btn:disabled {
background: #05a700;
border: 1px solid #05a700;
cursor: auto;
}
#delete-file {
width: 176px;
height: 44px;
background: #fff;
border: 1px solid rgba(12, 12, 13, 0.3);
border-radius: 5px;
font-size: 15px;
margin-top: 50px;
margin-bottom: 12px;
cursor: pointer;
color: #313131;
}
#delete-file:hover {
background: #efeff1;
}
.send-new {
font-size: 15px;
margin: auto;
text-align: center;
color: #0094fb;
cursor: pointer;
text-decoration: underline;
}
.send-new:hover,
.send-new:focus,
.send-new:active {
color: #0287e8;
}
/* upload-error */
#upload-error {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
}
#upload-error[hidden],
#unsupported-browser[hidden] {
display: none;
}
#upload-error-img {
margin: 51px 0 71px;
}
/* unsupported-browser */
#unsupported-browser {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.unsupported-description {
font-size: 13px;
line-height: 23px;
text-align: center;
color: #7d7d7d;
margin: 0 auto 23px;
}
.firefox-logo {
width: 70px;
}
#dl-firefox,
#update-firefox {
margin-bottom: 181px;
height: 80px;
background: #98e02b;
border-radius: 3px;
cursor: pointer;
border: 0;
box-shadow: 0 5px 3px rgb(234, 234, 234);
font-family: 'Fira Sans';
font-weight: 500;
color: #fff;
font-size: 26px;
display: flex;
justify-content: center;
align-items: center;
line-height: 1;
padding: 0 25px;
}
.unsupported-button-text {
text-align: left;
margin-left: 20.4px;
}
.unsupported-button-text > span {
font-family: 'Fira Sans';
font-weight: 300;
font-size: 18px;
letter-spacing: -0.69px;
}
/** download.html **/
#download-btn {
font-size: 15px;
color: white;
width: 180px;
height: 44px;
margin-top: 20px;
margin-bottom: 30px;
text-align: center;
background: #0297f8;
border: 1px solid #0297f8;
border-radius: 5px;
cursor: pointer;
}
#download-btn:hover {
background-color: #0287e8;
}
#download-btn:disabled {
background: #47b04b;
cursor: auto;
}
#download {
margin: 0 auto;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
text-align: center;
}
#expired-img {
margin: 51px 0 71px;
}
.expired-description {
font-size: 15px;
line-height: 23px;
text-align: center;
color: #7d7d7d;
margin: 0 auto 23px;
}
#download-progress {
width: 590px;
}
#download-progress[hidden] {
display: none;
}
#download-img {
width: 283px;
height: 196px;
}
/* footer */
.footer {
right: 0;
bottom: 0;
left: 0;
font-size: 13px;
display: flex;
align-items: flex-end;
flex-direction: row;
justify-content: space-between;
padding: 50px 31px 41px;
width: 100%;
box-sizing: border-box;
}
.mozilla-logo {
width: 112px;
height: 32px;
margin-bottom: -5px;
}
.legal-links {
max-width: 81vw;
display: flex;
align-items: center;
flex-direction: row;
}
.legal-links > a {
color: #858585;
opacity: 0.9;
white-space: nowrap;
margin-right: 2vw;
}
.legal-links > a:hover {
opacity: 1;
}
.legal-links > a:visited {
color: #858585;
}
.social-links {
display: flex;
justify-content: space-between;
width: 94px;
}
.social-links > a {
opacity: 0.9;
}
.social-links > a:hover {
opacity: 1;
}
.github,
.twitter {
width: 32px;
height: 32px;
margin-bottom: -5px;
}
@media (max-device-width: 992px), (max-width: 992px) {
.popup .popuptext {
left: auto;
right: -40px;
}
.popup .popuptext::after {
left: auto;
right: 36px;
}
}
@media (max-device-width: 768px), (max-width: 768px) {
.description {
margin: 0 auto 25px;
}
#copy {
width: 100%;
}
#link {
font-size: 18px;
}
.footer {
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
max-width: 630px;
margin: auto;
}
.mozilla-logo {
margin-left: -7px;
}
.legal-links {
flex-direction: column;
margin: auto;
width: 100%;
max-width: 100%;
}
.legal-links > * {
display: block;
padding: 10px 0;
align-self: flex-start;
}
.social-links {
margin-top: 20px;
align-self: flex-start;
}
}
@media (max-device-width: 520px), (max-width: 520px) {
.header {
flex-direction: column;
justify-content: flex-start;
}
.feedback {
margin-top: 10px;
min-width: 30px;
max-width: 300px;
text-indent: 2px;
padding: 5px 5px 5px 20px;
}
#copy {
width: 100%;
flex-direction: column;
}
#link {
font-size: 22px;
padding: 15px 10px;
border-radius: 6px 6px 0 0;
}
#copy-btn {
border-radius: 0 0 6px 6px;
flex: 0 1 65px;
}
th {
font-size: 14px;
padding: 0 5px;
}
td {
font-size: 13px;
padding: 17px 5px 0;
}
}

View File

@@ -1 +1 @@
<svg width="30" height="27" viewBox="0 0 30 27" xmlns="http://www.w3.org/2000/svg"><title>send logo</title><g stroke="#3E3D40" fill="none" fill-rule="evenodd"><path d="M22.364 19.989l-2.153-2.103a2.046 2.046 0 0 0-2.665-.151l3.402 3.323a.531.531 0 0 1 0 .766l-2.466 2.408a.563.563 0 0 1-.784 0l-3.398-3.32a1.932 1.932 0 0 0 .188 2.564l2.153 2.103c.788.77 2.066.77 2.855 0l2.868-2.802a1.94 1.94 0 0 0 0-2.788M8.77 14.745a.534.534 0 0 0 0 .766l3.399 3.32a2.05 2.05 0 0 1-2.625-.184l-2.153-2.102a1.94 1.94 0 0 1 0-2.79l2.869-2.801a2.052 2.052 0 0 1 2.854 0l2.153 2.103c.73.713.775 1.83.154 2.603l-3.401-3.323a.565.565 0 0 0-.784 0L8.77 14.745zm9.464 5.682a.777.777 0 0 1 0 1.118.822.822 0 0 1-1.144 0l-5.6-5.47a.777.777 0 0 1 0-1.118.822.822 0 0 1 1.144 0l5.6 5.47z" stroke-width=".618" fill="#3E3D40"/><path d="M6.065 20.606c-2.913-1.586-3.988-3.656-3.988-6.468 0-2.81 2.265-6.425 5.786-6.289.1.004.55-.006.649 0 .895-3.27 2.508-6.353 6.898-6.353 4.557 0 7.336 3.716 6.75 7.785.08-.005 1.232.17 1.31.186 3.096.644 4.915 3.275 4.915 5.18 0 1.905-.107 3.029-2.023 4.947" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></g></svg>
<svg width="30" height="27" viewBox="0 0 30 27" xmlns="http://www.w3.org/2000/svg"><title>send logo</title><g stroke="#3E3D40" fill="none" fill-rule="evenodd" transform="translate(-0.231,0.11948695)"><path d="M22.364 19.989l-2.153-2.103a2.046 2.046 0 0 0-2.665-.151l3.402 3.323a.531.531 0 0 1 0 .766l-2.466 2.408a.563.563 0 0 1-.784 0l-3.398-3.32a1.932 1.932 0 0 0 .188 2.564l2.153 2.103c.788.77 2.066.77 2.855 0l2.868-2.802a1.94 1.94 0 0 0 0-2.788M8.77 14.745a.534.534 0 0 0 0 .766l3.399 3.32a2.05 2.05 0 0 1-2.625-.184l-2.153-2.102a1.94 1.94 0 0 1 0-2.79l2.869-2.801a2.052 2.052 0 0 1 2.854 0l2.153 2.103c.73.713.775 1.83.154 2.603l-3.401-3.323a.565.565 0 0 0-.784 0L8.77 14.745zm9.464 5.682a.777.777 0 0 1 0 1.118.822.822 0 0 1-1.144 0l-5.6-5.47a.777.777 0 0 1 0-1.118.822.822 0 0 1 1.144 0l5.6 5.47z" stroke-width=".618" fill="#3E3D40"/><path d="M6.065 20.606c-2.913-1.586-3.988-3.656-3.988-6.468 0-2.81 2.265-6.425 5.786-6.289.1.004.55-.006.649 0 .895-3.27 2.508-6.353 6.898-6.353 4.557 0 7.336 3.716 6.75 7.785.08-.005 1.232.17 1.31.186 3.096.644 4.915 3.275 4.915 5.18 0 1.905-.107 3.029-2.023 4.947" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

17
assets/spinner.svg Normal file
View File

@@ -0,0 +1,17 @@
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg" stroke="#fff">
<g fill="none" fill-rule="evenodd">
<g transform="translate(1 1)" stroke-width="2">
<circle stroke-opacity=".5" cx="18" cy="18" r="18"/>
<path d="M36 18c0-9.94-8.06-18-18-18">
<animateTransform
attributeName="transform"
type="rotate"
from="0 18 18"
to="360 18 18"
dur="1s"
repeatCount="indefinite"/>
</path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 694 B

10
browserconfig.xml Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square70x70logo src=“favicon-76.png”/>
<square150x150logo src="favicon-228.png"/>
<TileColor>#0297F8</TileColor>
</tile>
</msapplication>
</browserconfig>

View File

@@ -1,5 +1,5 @@
last 2 chrome versions
last 2 firefox versions
last 2 safari versions
last 2 edge versions
firefox esr
ie >= 9
safari >= 9

View File

@@ -1,38 +1,63 @@
const { MessageContext } = require('fluent');
// TODO: when node supports 'for await' we can remove babel-polyfill
// and use 'fluent' instead of 'fluent/compat' (also below near line 42)
require('babel-polyfill');
const { MessageContext } = require('fluent/compat');
const fs = require('fs');
function toJSON(map) {
return JSON.stringify(Array.from(map));
}
function merge(m1, m2) {
const result = new Map(m1);
for (const [k, v] of m2) {
result.set(k, v);
}
return result;
}
module.exports = function(source) {
const localeExp = this.options.locale || /([^/]+)\/[^/]+\.ftl$/;
const result = localeExp.exec(this.resourcePath);
const locale = result && result[1];
// pre-parse the ftl
const context = new MessageContext(locale);
context.addMessages(source);
if (!locale) {
throw new Error(`couldn't find locale in: ${this.resourcePath}`);
}
// load default language and "merge" contexts
// TODO: make this configurable
const en_ftl = fs.readFileSync(
require.resolve('../public/locales/en-US/send.ftl'),
'utf8'
);
const en = new MessageContext('en-US');
en.addMessages(en_ftl);
// pre-parse the ftl
const context = new MessageContext(locale);
context.addMessages(source);
const merged = merge(en._messages, context._messages);
return `
module.exports = \`
if (typeof window === 'undefined') {
var fluent = require('fluent');
require('babel-polyfill');
var fluent = require('fluent/compat');
}
var ctx = new fluent.MessageContext('${locale}', {useIsolating: false});
ctx._messages = new Map(${toJSON(context._messages)});
function translate(id, data) {
var msg = ctx.getMessage(id);
if (typeof(msg) !== 'string' && !msg.val && msg.attrs) {
msg = msg.attrs.title || msg.attrs.alt
(function () {
var ctx = new fluent.MessageContext('${locale}', {useIsolating: false});
ctx._messages = new Map(${toJSON(merged)});
function translate(id, data) {
var msg = ctx.getMessage(id);
if (typeof(msg) !== 'string' && !msg.val && msg.attrs) {
msg = msg.attrs.title || msg.attrs.alt
}
return ctx.format(msg, data);
}
return ctx.format(msg, data);
}
if (typeof window === 'undefined') {
module.exports = translate;
}
else {
window.translate = translate;
}
if (typeof window === 'undefined') {
module.exports = translate;
}
else {
window.translate = translate;
}
})();
\``;
};

View File

@@ -1,3 +1,14 @@
/*
This code is included by both the server and frontend via
common/assets.js
When included from the server the export will be the function.
When included from the frontend (via webpack) the export will
be an object mapping file names to hashed file names. Example:
"send_logo.svg": "send_logo.5fcfdf0e.svg"
*/
const fs = require('fs');
const path = require('path');
@@ -14,6 +25,6 @@ module.exports = function() {
return {
code,
dependencies: files.map(f => require.resolve('../assets/' + f)),
cacheable: false
cacheable: true
};
};

View File

@@ -1,3 +1,14 @@
/*
This code is included by both the server and frontend via
common/locales.js
When included from the server the export will be the function.
When included from the frontend (via webpack) the export will
be an object mapping ftl files to js files. Example:
"public/locales/en-US/send.ftl":"public/locales/en-US/send.6b4f8354.js"
*/
const fs = require('fs');
const path = require('path');
@@ -17,6 +28,6 @@ module.exports = function() {
dependencies: dirs.map(d =>
require.resolve(`../public/locales/${d}/send.ftl`)
),
cacheable: false
cacheable: true
};
};

Some files were not shown because too many files have changed in this diff Show More