diff --git a/app/browser/electronDownloadItem.js b/app/browser/electronDownloadItem.js index 88aaf6e6ab3..445bf73dec9 100644 --- a/app/browser/electronDownloadItem.js +++ b/app/browser/electronDownloadItem.js @@ -28,7 +28,7 @@ const progressDownloadItems = () => { } module.exports.updateElectronDownloadItem = (win, downloadId, item, state) => { - if (state === downloadStates.INTERRUPTED || state === downloadStates.CANCELLED || state === downloadStates.COMPLETED) { + if (state === downloadStates.INTERRUPTED || state === downloadStates.CANCELLED || state === downloadStates.UNAUTHORIZED || state === downloadStates.COMPLETED) { if (app.dock && state === downloadStates.COMPLETED) { app.dock.downloadFinished(item.getSavePath()) } diff --git a/app/browser/menu.js b/app/browser/menu.js index b3d8e62a8e2..a4c5cde12f8 100644 --- a/app/browser/menu.js +++ b/app/browser/menu.js @@ -270,7 +270,11 @@ const createViewSubmenu = () => { click: function () { const win = BrowserWindow.getActiveWindow() const activeTab = tabState.getActiveTab(appStore.getState(), win.id) - appActions.toggleDevTools(activeTab.get('tabId')) + if (activeTab) { + appActions.toggleDevTools(activeTab.get('tabId')) + } else { + console.warn('Unable to open developer tools; activeTab is null or undefined') + } } }, CommonMenu.separatorMenuItem, diff --git a/app/browser/reducers/downloadsReducer.js b/app/browser/reducers/downloadsReducer.js index 8eb8f0513c5..e4a3075f2e2 100644 --- a/app/browser/reducers/downloadsReducer.js +++ b/app/browser/reducers/downloadsReducer.js @@ -86,7 +86,7 @@ const downloadsReducer = (state, action) => { if (state.get('downloads')) { const downloads = state.get('downloads') .filter((download) => - ![downloadStates.COMPLETED, downloadStates.INTERRUPTED, downloadStates.CANCELLED].includes(download.get('state'))) + ![downloadStates.COMPLETED, downloadStates.INTERRUPTED, downloadStates.UNAUTHORIZED, downloadStates.CANCELLED].includes(download.get('state'))) state = state.set('downloads', downloads) } break diff --git a/app/common/constants/countryCodes.js b/app/common/constants/countryCodes.js new file mode 100644 index 00000000000..e62eeeb2748 --- /dev/null +++ b/app/common/constants/countryCodes.js @@ -0,0 +1,253 @@ +const countryCodes = [ + 'AF', + 'AX', + 'AL', + 'DZ', + 'AS', + 'AD', + 'AO', + 'AI', + 'AQ', + 'AG', + 'AR', + 'AM', + 'AW', + 'AU', + 'AT', + 'AZ', + 'BS', + 'BH', + 'BD', + 'BB', + 'BY', + 'BE', + 'BZ', + 'BJ', + 'BM', + 'BT', + 'BO', + 'BQ', + 'BA', + 'BW', + 'BV', + 'BR', + 'IO', + 'BN', + 'BG', + 'BF', + 'BI', + 'KH', + 'CM', + 'CA', + 'CV', + 'KY', + 'CF', + 'TD', + 'CL', + 'CN', + 'CX', + 'CC', + 'CO', + 'KM', + 'CG', + 'CD', + 'CK', + 'CR', + 'CI', + 'HR', + 'CU', + 'CW', + 'CY', + 'CZ', + 'DK', + 'DJ', + 'DM', + 'DO', + 'EC', + 'EG', + 'SV', + 'GQ', + 'ER', + 'EE', + 'ET', + 'FK', + 'FO', + 'FJ', + 'FI', + 'FR', + 'GF', + 'PF', + 'TF', + 'GA', + 'GM', + 'GE', + 'DE', + 'GH', + 'GI', + 'GR', + 'GL', + 'GD', + 'GP', + 'GU', + 'GT', + 'GG', + 'GN', + 'GW', + 'GY', + 'HT', + 'HM', + 'VA', + 'HN', + 'HK', + 'HU', + 'IS', + 'IN', + 'ID', + 'IR', + 'IQ', + 'IE', + 'IM', + 'IL', + 'IT', + 'JM', + 'JP', + 'JE', + 'JO', + 'KZ', + 'KE', + 'KI', + 'KP', + 'KR', + 'KW', + 'KG', + 'LA', + 'LV', + 'LB', + 'LS', + 'LR', + 'LY', + 'LI', + 'LT', + 'LU', + 'MO', + 'MK', + 'MG', + 'MW', + 'MY', + 'MV', + 'ML', + 'MT', + 'MH', + 'MQ', + 'MR', + 'MU', + 'YT', + 'MX', + 'FM', + 'MD', + 'MC', + 'MN', + 'ME', + 'MS', + 'MA', + 'MZ', + 'MM', + 'NA', + 'NR', + 'NP', + 'NL', + 'NC', + 'NZ', + 'NI', + 'NE', + 'NG', + 'NU', + 'NF', + 'MP', + 'NO', + 'OM', + 'PK', + 'PW', + 'PS', + 'PA', + 'PG', + 'PY', + 'PE', + 'PH', + 'PN', + 'PL', + 'PT', + 'PR', + 'QA', + 'RE', + 'RO', + 'RU', + 'RW', + 'BL', + 'SH', + 'KN', + 'LC', + 'MF', + 'PM', + 'VC', + 'WS', + 'SM', + 'ST', + 'SA', + 'SN', + 'RS', + 'SC', + 'SL', + 'SG', + 'SX', + 'SK', + 'SI', + 'SB', + 'SO', + 'ZA', + 'GS', + 'SS', + 'ES', + 'LK', + 'SD', + 'SR', + 'SJ', + 'SZ', + 'SE', + 'CH', + 'SY', + 'TW', + 'TJ', + 'TZ', + 'TH', + 'TL', + 'TG', + 'TK', + 'TO', + 'TT', + 'TN', + 'TR', + 'TM', + 'TC', + 'TV', + 'UG', + 'UA', + 'AE', + 'GB', + 'US', + 'UM', + 'UY', + 'UZ', + 'VU', + 'VE', + 'VN', + 'VG', + 'VI', + 'WF', + 'EH', + 'YE', + 'ZM', + 'ZW' +] + +module.exports = countryCodes diff --git a/app/extensions/brave/about-autofill.html b/app/extensions/brave/about-autofill.html index b82e72374b9..9a8059d6cdf 100644 --- a/app/extensions/brave/about-autofill.html +++ b/app/extensions/brave/about-autofill.html @@ -14,6 +14,7 @@ +
diff --git a/app/extensions/brave/index-dev.html b/app/extensions/brave/index-dev.html index e7ae6ae3cee..0b8496dc191 100644 --- a/app/extensions/brave/index-dev.html +++ b/app/extensions/brave/index-dev.html @@ -18,6 +18,7 @@ +
diff --git a/app/extensions/brave/index.html b/app/extensions/brave/index.html index 833af07d72c..bc3b4dec0f8 100644 --- a/app/extensions/brave/index.html +++ b/app/extensions/brave/index.html @@ -18,6 +18,7 @@ +
diff --git a/app/extensions/brave/locales/bn-BD/downloads.properties b/app/extensions/brave/locales/bn-BD/downloads.properties index 76991dca09b..2ff56454294 100644 --- a/app/extensions/brave/locales/bn-BD/downloads.properties +++ b/app/extensions/brave/locales/bn-BD/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=সম্পূর্ণ হয়েছে downloadInProgress={{downloadPercent}} ডাউনলোডিং downloadInProgressUnknownTotal=ডাউনলোড চলছে... downloadPaused={{downloadPercent}} থেমে আছে +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/bn-IN/downloads.properties b/app/extensions/brave/locales/bn-IN/downloads.properties index 37fefc0328a..01c4fb373c5 100644 --- a/app/extensions/brave/locales/bn-IN/downloads.properties +++ b/app/extensions/brave/locales/bn-IN/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=সম্পূর্ণ downloadInProgress=ডাউনলোড হচ্ছে: {{downloadPercent}} downloadInProgressUnknownTotal=ডাউনলোড করা হচ্ছে ... downloadPaused=থামানো হয়েছে: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/cs/downloads.properties b/app/extensions/brave/locales/cs/downloads.properties index afa293a100b..67860e8217d 100644 --- a/app/extensions/brave/locales/cs/downloads.properties +++ b/app/extensions/brave/locales/cs/downloads.properties @@ -6,6 +6,7 @@ downloadCancelled=Zrušeno downloadCompleted=Dokončeno downloadInProgress=Stahování: {{downloadPercent}} downloadInProgressUnknownTotal=Stahuje se... +downloadUnauthorized=Failed - Unauthorized access to download location downloadPaused=Pozastaveno: {{downloadPercent}} downloadDeleteConfirmation=Smazat? downloadLocalFile=Místní soubor diff --git a/app/extensions/brave/locales/de-DE/downloads.properties b/app/extensions/brave/locales/de-DE/downloads.properties index 3259e6109c9..a08346e5437 100644 --- a/app/extensions/brave/locales/de-DE/downloads.properties +++ b/app/extensions/brave/locales/de-DE/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Abgeschlossen downloadInProgress=Wird heruntergeladen: {{downloadPercent}} downloadInProgressUnknownTotal=Wird heruntergeladen… downloadPaused=Pausiert: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Löschen? downloadLocalFile=Lokale Datei diff --git a/app/extensions/brave/locales/en-GB/downloads.properties b/app/extensions/brave/locales/en-GB/downloads.properties index af8c9f235e2..3feac63ca06 100644 --- a/app/extensions/brave/locales/en-GB/downloads.properties +++ b/app/extensions/brave/locales/en-GB/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Completed downloadInProgress=Downloading: {{downloadPercent}} downloadInProgressUnknownTotal=Downloading… downloadPaused=Paused: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/en-US/countries.properties b/app/extensions/brave/locales/en-US/countries.properties new file mode 100644 index 00000000000..3fa9aaac45d --- /dev/null +++ b/app/extensions/brave/locales/en-US/countries.properties @@ -0,0 +1,249 @@ +AF=Afghanistan +AX=Åland Islands +AL=Albania +DZ=Algeria +AS=American Samoa +AD=Andorra +AO=Angola +AI=Anguilla +AQ=Antarctica +AG=Antigua and Barbuda +AR=Argentina +AM=Armenia +AW=Aruba +AU=Australia +AT=Austria +AZ=Azerbaijan +BS=Bahamas +BH=Bahrain +BD=Bangladesh +BB=Barbados +BY=Belarus +BE=Belgium +BZ=Belize +BJ=Benin +BM=Bermuda +BT=Bhutan +BO=Bolivia, Plurinational State of +BQ=Bonaire, Sint Eustatius and Saba +BA=Bosnia and Herzegovina +BW=Botswana +BV=Bouvet Island +BR=Brazil +IO=British Indian Ocean Territory +BN=Brunei Darussalam +BG=Bulgaria +BF=Burkina Faso +BI=Burundi +KH=Cambodia +CM=Cameroon +CA=Canada +CV=Cape Verde +KY=Cayman Islands +CF=Central African Republic +TD=Chad +CL=Chile +CN=China +CX=Christmas Island +CC=Cocos (Keeling) Islands +CO=Colombia +KM=Comoros +CG=Congo +CD=Congo, the Democratic Republic of the +CK=Cook Islands +CR=Costa Rica +CI=Côte d'Ivoire +HR=Croatia +CU=Cuba +CW=Curaçao +CY=Cyprus +CZ=Czech Republic +DK=Denmark +DJ=Djibouti +DM=Dominica +DO=Dominican Republic +EC=Ecuador +EG=Egypt +SV=El Salvador +GQ=Equatorial Guinea +ER=Eritrea +EE=Estonia +ET=Ethiopia +FK=Falkland Islands (Malvinas) +FO=Faroe Islands +FJ=Fiji +FI=Finland +FR=France +GF=French Guiana +PF=French Polynesia +TF=French Southern Territories +GA=Gabon +GM=Gambia +GE=Georgia +DE=Germany +GH=Ghana +GI=Gibraltar +GR=Greece +GL=Greenland +GD=Grenada +GP=Guadeloupe +GU=Guam +GT=Guatemala +GG=Guernsey +GN=Guinea +GW=Guinea-Bissau +GY=Guyana +HT=Haiti +HM=Heard Island and McDonald Islands +VA=Holy See (Vatican City State) +HN=Honduras +HK=Hong Kong +HU=Hungary +IS=Iceland +IN=India +ID=Indonesia +IR=Iran, Islamic Republic of +IQ=Iraq +IE=Ireland +IM=Isle of Man +IL=Israel +IT=Italy +JM=Jamaica +JP=Japan +JE=Jersey +JO=Jordan +KZ=Kazakhstan +KE=Kenya +KI=Kiribati +KP=Korea, Democratic People's Republic of +KR=Korea, Republic of +KW=Kuwait +KG=Kyrgyzstan +LA=Lao People's Democratic Republic +LV=Latvia +LB=Lebanon +LS=Lesotho +LR=Liberia +LY=Libya +LI=Liechtenstein +LT=Lithuania +LU=Luxembourg +MO=Macao +MK=Macedonia, the Former Yugoslav Republic of +MG=Madagascar +MW=Malawi +MY=Malaysia +MV=Maldives +ML=Mali +MT=Malta +MH=Marshall Islands +MQ=Martinique +MR=Mauritania +MU=Mauritius +YT=Mayotte +MX=Mexico +FM=Micronesia, Federated States of +MD=Moldova, Republic of +MC=Monaco +MN=Mongolia +ME=Montenegro +MS=Montserrat +MA=Morocco +MZ=Mozambique +MM=Myanmar +NA=Namibia +NR=Nauru +NP=Nepal +NL=Netherlands +NC=New Caledonia +NZ=New Zealand +NI=Nicaragua +NE=Niger +NG=Nigeria +NU=Niue +NF=Norfolk Island +MP=Northern Mariana Islands +NO=Norway +OM=Oman +PK=Pakistan +PW=Palau +PS=Palestine, State of +PA=Panama +PG=Papua New Guinea +PY=Paraguay +PE=Peru +PH=Philippines +PN=Pitcairn +PL=Poland +PT=Portugal +PR=Puerto Rico +QA=Qatar +RE=Réunion +RO=Romania +RU=Russian Federation +RW=Rwanda +BL=Saint Barthélemy +SH=Saint Helena, Ascension and Tristan da Cunha +KN=Saint Kitts and Nevis +LC=Saint Lucia +MF=Saint Martin (French part) +PM=Saint Pierre and Miquelon +VC=Saint Vincent and the Grenadines +WS=Samoa +SM=San Marino +ST=Sao Tome and Principe +SA=Saudi Arabia +SN=Senegal +RS=Serbia +SC=Seychelles +SL=Sierra Leone +SG=Singapore +SX=Sint Maarten (Dutch part) +SK=Slovakia +SI=Slovenia +SB=Solomon Islands +SO=Somalia +ZA=South Africa +GS=South Georgia and the South Sandwich Islands +SS=South Sudan +ES=Spain +LK=Sri Lanka +SD=Sudan +SR=Suriname +SJ=Svalbard and Jan Mayen +SZ=Swaziland +SE=Sweden +CH=Switzerland +SY=Syrian Arab Republic +TW=Taiwan +TJ=Tajikistan +TZ=Tanzania, United Republic of +TH=Thailand +TL=Timor-Leste +TG=Togo +TK=Tokelau +TO=Tonga +TT=Trinidad and Tobago +TN=Tunisia +TR=Turkey +TM=Turkmenistan +TC=Turks and Caicos Islands +TV=Tuvalu +UG=Uganda +UA=Ukraine +AE=United Arab Emirates +GB=United Kingdom +US=United States +UM=United States Minor Outlying Islands +UY=Uruguay +UZ=Uzbekistan +VU=Vanuatu +VE=Venezuela, Bolivarian Republic of +VN=Viet Nam +VG=Virgin Islands, British +VI=Virgin Islands, U.S. +WF=Wallis and Futuna +EH=Western Sahara +YE=Yemen +ZM=Zambia +ZW=Zimbabwe diff --git a/app/extensions/brave/locales/en-US/downloads.properties b/app/extensions/brave/locales/en-US/downloads.properties index af8c9f235e2..3feac63ca06 100644 --- a/app/extensions/brave/locales/en-US/downloads.properties +++ b/app/extensions/brave/locales/en-US/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Completed downloadInProgress=Downloading: {{downloadPercent}} downloadInProgressUnknownTotal=Downloading… downloadPaused=Paused: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/es/downloads.properties b/app/extensions/brave/locales/es/downloads.properties index e8d54344142..f63ca4cf04e 100644 --- a/app/extensions/brave/locales/es/downloads.properties +++ b/app/extensions/brave/locales/es/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Completado downloadInProgress=Descargando: {{downloadPercent}} downloadInProgressUnknownTotal=Descargando… downloadPaused=Pausado: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=¿Eliminar? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/eu/downloads.properties b/app/extensions/brave/locales/eu/downloads.properties index 1f13d994a71..1bd40838b17 100644 --- a/app/extensions/brave/locales/eu/downloads.properties +++ b/app/extensions/brave/locales/eu/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Osatuta downloadInProgress=Deskargatzen: {{downloadPercent}} downloadInProgressUnknownTotal=Deskargatzen... downloadPaused=Pausatu: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/fr-FR/downloads.properties b/app/extensions/brave/locales/fr-FR/downloads.properties index df0c2fd8587..30d0423e62c 100644 --- a/app/extensions/brave/locales/fr-FR/downloads.properties +++ b/app/extensions/brave/locales/fr-FR/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Terminé downloadInProgress=Téléchargement : {{downloadPercent}} downloadInProgressUnknownTotal=Téléchargement… downloadPaused=Pause : {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Supprimer ? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/hi-IN/downloads.properties b/app/extensions/brave/locales/hi-IN/downloads.properties index 03c22110db2..e8875c85986 100644 --- a/app/extensions/brave/locales/hi-IN/downloads.properties +++ b/app/extensions/brave/locales/hi-IN/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=पूरा कर लिया है downloadInProgress=डाउनलोड हो रहा है:{{डाउनलोड प्रतिशत्}} downloadInProgressUnknownTotal=Downloading… downloadPaused=रोका गया {{डाउनलोड प्रतिशत्}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/id-ID/downloads.properties b/app/extensions/brave/locales/id-ID/downloads.properties index 5fd26f26799..390af70863d 100644 --- a/app/extensions/brave/locales/id-ID/downloads.properties +++ b/app/extensions/brave/locales/id-ID/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Lengkap downloadInProgress=Mengunduh: {{downloadPercent}} downloadInProgressUnknownTotal=Mengunduh... downloadPaused=Jeda: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Hapus? downloadLocalFile=Berkas lokal diff --git a/app/extensions/brave/locales/it-IT/downloads.properties b/app/extensions/brave/locales/it-IT/downloads.properties index 22197a2ca3d..6384ed9b7ba 100644 --- a/app/extensions/brave/locales/it-IT/downloads.properties +++ b/app/extensions/brave/locales/it-IT/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Completato downloadInProgress=Scaricamento: {{downloadPercent}} downloadInProgressUnknownTotal=Scarico… downloadPaused=In pausa: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Elimino? downloadLocalFile=File locale diff --git a/app/extensions/brave/locales/ja-JP/downloads.properties b/app/extensions/brave/locales/ja-JP/downloads.properties index bff4482f5e8..e094de08c71 100644 --- a/app/extensions/brave/locales/ja-JP/downloads.properties +++ b/app/extensions/brave/locales/ja-JP/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=完了 downloadInProgress=ダウンロード中 {{downloadPercent}}完了 downloadInProgressUnknownTotal=ダウンロード中です… downloadPaused=中断しました {{downloadPercent}}完了 +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=削除しますか? downloadLocalFile=ローカルファイル diff --git a/app/extensions/brave/locales/ko-KR/downloads.properties b/app/extensions/brave/locales/ko-KR/downloads.properties index 0407bdb94c5..9dc41b19b92 100644 --- a/app/extensions/brave/locales/ko-KR/downloads.properties +++ b/app/extensions/brave/locales/ko-KR/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=완료 downloadInProgress=다운로드중: {{downloadPercent}} downloadInProgressUnknownTotal=다운로드 중... downloadPaused=중지됨: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/ms-MY/downloads.properties b/app/extensions/brave/locales/ms-MY/downloads.properties index 22f257027f8..962bf442213 100644 --- a/app/extensions/brave/locales/ms-MY/downloads.properties +++ b/app/extensions/brave/locales/ms-MY/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Siap downloadInProgress=Memuat turun: {{downloadPercent}} downloadInProgressUnknownTotal=Sedang memuat turun... downloadPaused=Jeda: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Hapus? downloadLocalFile=Fail lokal diff --git a/app/extensions/brave/locales/nl-NL/downloads.properties b/app/extensions/brave/locales/nl-NL/downloads.properties index 42547fab62a..7308a1aa087 100644 --- a/app/extensions/brave/locales/nl-NL/downloads.properties +++ b/app/extensions/brave/locales/nl-NL/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Voltooid downloadInProgress=Downloaden: {{downloadPercent}} downloadInProgressUnknownTotal=Downloaden… downloadPaused=Gepauzeerd: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Verwijderen? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/pl-PL/downloads.properties b/app/extensions/brave/locales/pl-PL/downloads.properties index 301f021d6f5..71c53c86f99 100644 --- a/app/extensions/brave/locales/pl-PL/downloads.properties +++ b/app/extensions/brave/locales/pl-PL/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Gotowe downloadInProgress=Pobieranie: {{downloadPercent}} downloadInProgressUnknownTotal=Pobieranie... downloadPaused=Zatrzymaj: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/pt-BR/downloads.properties b/app/extensions/brave/locales/pt-BR/downloads.properties index 605c032c4c6..861b8e22104 100644 --- a/app/extensions/brave/locales/pt-BR/downloads.properties +++ b/app/extensions/brave/locales/pt-BR/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Concluído downloadInProgress=Baixando: {{downloadPercent}} downloadInProgressUnknownTotal=Baixando... downloadPaused=Pausado: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Apagar? downloadLocalFile=Arquivo Local diff --git a/app/extensions/brave/locales/ru/downloads.properties b/app/extensions/brave/locales/ru/downloads.properties index bacc08ab43d..d9cc62be076 100644 --- a/app/extensions/brave/locales/ru/downloads.properties +++ b/app/extensions/brave/locales/ru/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Завершено downloadInProgress=Загрузка: {{downloadPercent}} downloadInProgressUnknownTotal=Загрузка... downloadPaused=Приостановлено: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Удалить? downloadLocalFile=Локальный файл diff --git a/app/extensions/brave/locales/sl/downloads.properties b/app/extensions/brave/locales/sl/downloads.properties index 1f9fa4f2f7f..3f00d650fa0 100644 --- a/app/extensions/brave/locales/sl/downloads.properties +++ b/app/extensions/brave/locales/sl/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Dokončano downloadInProgress=Prenašanje: {{downloadPercent}} downloadInProgressUnknownTotal=Prenos je v teku ... downloadPaused=Prekinjeno: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Želite izbrisati? downloadLocalFile=Krajevna datoteka diff --git a/app/extensions/brave/locales/sv-SE/downloads.properties b/app/extensions/brave/locales/sv-SE/downloads.properties index 9f5d5eebc60..260245c6826 100644 --- a/app/extensions/brave/locales/sv-SE/downloads.properties +++ b/app/extensions/brave/locales/sv-SE/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Avslutad downloadInProgress=Laddar ner: {{downloadPercent}} downloadInProgressUnknownTotal=Laddar ner... downloadPaused=Pausad: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Radera? downloadLocalFile=Lokal fil diff --git a/app/extensions/brave/locales/ta/downloads.properties b/app/extensions/brave/locales/ta/downloads.properties index 462e1ee0796..91daaf1e2c3 100644 --- a/app/extensions/brave/locales/ta/downloads.properties +++ b/app/extensions/brave/locales/ta/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=முடிந்தது downloadInProgress=பதிவிறக்குகிறது: {{downloadPercent}} downloadInProgressUnknownTotal=பதிவிறக்குகிறது… downloadPaused=இடைநிறுத்தப்பட்டது: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/te/downloads.properties b/app/extensions/brave/locales/te/downloads.properties index af8c9f235e2..3feac63ca06 100644 --- a/app/extensions/brave/locales/te/downloads.properties +++ b/app/extensions/brave/locales/te/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Completed downloadInProgress=Downloading: {{downloadPercent}} downloadInProgressUnknownTotal=Downloading… downloadPaused=Paused: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/tr-TR/downloads.properties b/app/extensions/brave/locales/tr-TR/downloads.properties index a6f1bdf67b5..6d3e9161e45 100644 --- a/app/extensions/brave/locales/tr-TR/downloads.properties +++ b/app/extensions/brave/locales/tr-TR/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Tamamlanmış downloadInProgress=İndiriliyor: {{downloadPercent}} downloadInProgressUnknownTotal=İndiriliyor… downloadPaused=Durduruldu: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/extensions/brave/locales/uk/downloads.properties b/app/extensions/brave/locales/uk/downloads.properties index db67b70779c..d91f73d726f 100644 --- a/app/extensions/brave/locales/uk/downloads.properties +++ b/app/extensions/brave/locales/uk/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=Завершено downloadInProgress=Завантаження: {{downloadPercent}} downloadInProgressUnknownTotal=Завантаження… downloadPaused=Призупинено: {{downloadPercent}} +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Видалити? downloadLocalFile=Локальний файл diff --git a/app/extensions/brave/locales/zh-CN/downloads.properties b/app/extensions/brave/locales/zh-CN/downloads.properties index 3ec2066cbf4..5bf9b56b170 100644 --- a/app/extensions/brave/locales/zh-CN/downloads.properties +++ b/app/extensions/brave/locales/zh-CN/downloads.properties @@ -7,6 +7,7 @@ downloadCompleted=下载完成 downloadInProgress=下载中 downloadInProgressUnknownTotal=下载中... downloadPaused=暂停下载 +downloadUnauthorized=Failed - Unauthorized access to download location downloadDeleteConfirmation=Delete? downloadLocalFile=Local file diff --git a/app/filtering.js b/app/filtering.js index bfb23b5734b..a08d324eb83 100644 --- a/app/filtering.js +++ b/app/filtering.js @@ -602,6 +602,14 @@ function registerForDownloadListener (session) { item.on('updated', function () { const state = item.isPaused() ? downloadStates.PAUSED : downloadStates.IN_PROGRESS updateDownloadState(win, downloadId, item, state) + + // Change state if download path is protected + fs.access(path.dirname(savePath), fs.constants.R_OK | fs.constants.W_OK, (err) => { + if (err) { + const state = downloadStates.UNAUTHORIZED + updateDownloadState(win, downloadId, item, state) + } + }) }) item.on('done', function (e, state) { updateDownloadState(win, downloadId, item, state) diff --git a/app/locale.js b/app/locale.js index b88e8c51fe6..1443a9f2b45 100644 --- a/app/locale.js +++ b/app/locale.js @@ -13,6 +13,8 @@ const {LANGUAGE, REQUEST_LANGUAGE} = require('../js/constants/messages') // Exhaustive list of identifiers used by top and context menus var rendererIdentifiers = function () { + const countryCodes = require('./common/constants/countryCodes') + return [ 'downloadsManager', 'confirmClearPasswords', @@ -259,7 +261,7 @@ var rendererIdentifiers = function () { // Release channels 'channelDev', 'channelBeta' - ] + ].concat(countryCodes) } var ctx = null @@ -383,7 +385,9 @@ exports.init = function (language) { path.join(__dirname, 'extensions', 'brave', 'locales', lang, 'app.properties'), path.join(__dirname, 'extensions', 'brave', 'locales', lang, 'error.properties'), path.join(__dirname, 'extensions', 'brave', 'locales', lang, 'passwords.properties'), - path.join(__dirname, 'extensions', 'brave', 'locales', lang, 'common.properties')) + path.join(__dirname, 'extensions', 'brave', 'locales', lang, 'common.properties'), + path.join(__dirname, 'extensions', 'brave', 'locales', lang, 'countries.properties') + ) } appendLangProperties(lang) diff --git a/app/renderer/components/autofill/autofillAddressPanel.js b/app/renderer/components/autofill/autofillAddressPanel.js index 4187503eebb..ec2b4c04fdf 100644 --- a/app/renderer/components/autofill/autofillAddressPanel.js +++ b/app/renderer/components/autofill/autofillAddressPanel.js @@ -14,6 +14,7 @@ const { CommonFormLarge, CommonFormSection, CommonFormTitle, + CommonFormFullWidthDropdown, CommonFormButtonWrapper, commonFormStyles } = require('../common/commonForm') @@ -24,9 +25,14 @@ const appActions = require('../../../../js/actions/appActions') // Constants const KeyCodes = require('../../../common/constants/keyCodes') +const countryCodes = require('../../../common/constants/countryCodes') // Styles const commonStyles = require('../styles/commonStyles') + +// Localization +const locale = require('../../../../js/l10n') + const commonForm = css( commonStyles.formControl, commonStyles.textbox, @@ -118,7 +124,16 @@ class AutofillAddressPanel extends React.Component { onHide () { windowActions.setAutofillAddressDetail() } - + get countryList () { + const countryList = [] + countryList.push() + } + return countryList + } mergeProps (state, ownProps) { const currentWindow = state.get('currentWindow') const detail = currentWindow.get('autofillAddressDetail', Immutable.Map()) @@ -226,14 +241,13 @@ class AutofillAddressPanel extends React.Component { />
- + data-test-id='country' + > + {this.countryList} +
+ } +} + class CommonFormTextbox extends ImmutableComponent { render () { return @@ -234,6 +240,7 @@ module.exports = { CommonFormLarge, CommonFormBookmarkHanger, CommonFormDropdown, + CommonFormFullWidthDropdown, CommonFormTextbox, CommonFormClickable, CommonFormSection, diff --git a/app/renderer/components/common/dropdown.js b/app/renderer/components/common/dropdown.js index b20ba495935..1c9ab9cd297 100644 --- a/app/renderer/components/common/dropdown.js +++ b/app/renderer/components/common/dropdown.js @@ -17,6 +17,7 @@ class Dropdown extends ImmutableComponent { styles.dropdown, this.props['data-isCommonForm'] && styles.commonForm, this.props['data-isSettings'] && styles.settings, + this.props['data-isFullWidth'] && styles.fullWidth, this.props['data-isBraveryPanel'] && styles.braveryPanel ) @@ -59,6 +60,7 @@ const styles = StyleSheet.create({ '-webkit-appearance': 'none', width: 'auto' }, + outlineable: { ':focus': { outlineColor: globalStyles.color.statsBlue, @@ -67,13 +69,20 @@ const styles = StyleSheet.create({ outlineWidth: '1px' } }, + commonForm: { backgroundColor: '#fff', fontSize: globalStyles.fontSize.flyoutDialog }, + settings: { width: '280px' }, + + fullWidth: { + width: '100%' + }, + braveryPanel: { fontSize: '13px', width: '100%' diff --git a/app/renderer/components/download/downloadItem.js b/app/renderer/components/download/downloadItem.js index 32ad3673f0a..2cbbad08ab2 100644 --- a/app/renderer/components/download/downloadItem.js +++ b/app/renderer/components/download/downloadItem.js @@ -80,6 +80,10 @@ class DownloadItem extends React.Component { return this.props.downloadState === downloadStates.INTERRUPTED } + get isUnauthorized () { + return this.props.downloadState === downloadStates.UNAUTHORIZED + } + get isInProgress () { return this.props.downloadState === downloadStates.IN_PROGRESS } @@ -132,7 +136,7 @@ class DownloadItem extends React.Component { width: this.props.percentageComplete } - if (this.isCancelled || this.isInterrupted) { + if (this.isCancelled || this.isInterrupted || this.isUnauthorized) { progressStyle.display = 'none' } else if (this.props.isPendingState) { l10nStateArgs.downloadPercent = this.props.percentageComplete @@ -269,7 +273,7 @@ class DownloadItem extends React.Component { : null } { - this.isCancelled || this.isInterrupted || this.isCompleted || this.isPaused || this.isInProgress + this.isCancelled || this.isInterrupted || this.isUnauthorized || this.isCompleted || this.isPaused || this.isInProgress ?
: null } diff --git a/js/about/autofill.js b/js/about/autofill.js index c972cee9902..591ebc60c3a 100644 --- a/js/about/autofill.js +++ b/js/about/autofill.js @@ -9,6 +9,7 @@ const ImmutableComponent = require('../../app/renderer/components/immutableCompo const cx = require('../lib/classSet') const aboutActions = require('./aboutActions') const Button = require('../../app/renderer/components/common/button') +const locale = require('../../js/l10n') const ipc = window.chrome.ipcRenderer @@ -49,7 +50,7 @@ class AddressItem extends ImmutableComponent { {address.get('city')} {address.get('state')} {address.get('postalCode')} - {address.get('country')} + {locale.translation(address.get('country'))} {address.get('phone')} {address.get('email')} diff --git a/js/constants/downloadStates.js b/js/constants/downloadStates.js index 051fb27ab05..49421ee500e 100644 --- a/js/constants/downloadStates.js +++ b/js/constants/downloadStates.js @@ -12,7 +12,8 @@ const downloadStates = { PAUSED: _, COMPLETED: _, CANCELLED: _, - INTERRUPTED: _ + INTERRUPTED: _, + UNAUTHORIZED: _ } module.exports = mapValuesByKeys(downloadStates) diff --git a/js/entry.js b/js/entry.js index 5256f038c61..82114f33a57 100644 --- a/js/entry.js +++ b/js/entry.js @@ -6,7 +6,6 @@ require('../less/window.less') require('../less/button.less') require('../less/contextMenu.less') -require('../less/main.less') require('../less/navigationBar.less') require('../less/forms.less') require('../less/switchControls.less') diff --git a/js/l10n.js b/js/l10n.js index 396027e87aa..f8617a58029 100644 --- a/js/l10n.js +++ b/js/l10n.js @@ -12,6 +12,8 @@ var rendererTranslationCache = {} // As for a translation for the current language exports.translation = (token) => { + if (!token) return '' + // If we are in the renderer process if (ipcRenderer) { // If the token does not exist in the renderer translations cache diff --git a/js/state/downloadUtil.js b/js/state/downloadUtil.js index 0ad4ca7af44..ba65bb14d35 100644 --- a/js/state/downloadUtil.js +++ b/js/state/downloadUtil.js @@ -6,11 +6,11 @@ const downloadStates = require('../constants/downloadStates') const domUtil = require('../../app/renderer/lib/domUtil') const pendingStates = [downloadStates.IN_PROGRESS, downloadStates.PAUSED] -const stopStates = [downloadStates.CANCELLED, downloadStates.INTERRUPTED, downloadStates.COMPLETED] +const stopStates = [downloadStates.CANCELLED, downloadStates.INTERRUPTED, downloadStates.UNAUTHORIZED, downloadStates.COMPLETED] const notErrorStates = [downloadStates.IN_PROGRESS, downloadStates.PAUSED, downloadStates.COMPLETED] const downloadIsInState = (download, list) => - list.includes(download.get('state')) + (download && list && list.includes(download.get('state'))) || false const isPendingState = (download) => downloadIsInState(download, pendingStates) @@ -42,6 +42,8 @@ const getL10nId = (download) => { return 'downloadInterrupted' case downloadStates.CANCELLED: return 'downloadCancelled' + case downloadStates.UNAUTHORIZED: + return 'downloadUnauthorized' case downloadStates.IN_PROGRESS: if (!download.get('totalBytes')) { return 'downloadInProgressUnknownTotal' @@ -56,13 +58,20 @@ const getL10nId = (download) => { return '' } -const getPercentageComplete = (download) => - Math.ceil(download.get('receivedBytes') / download.get('totalBytes') * 100) + '%' +const getPercentageComplete = (download) => { + const totalBytes = download && download.get('totalBytes') + if (!totalBytes) { + // Most likely totalBytes has not been calculated yet. Avoid + // division by 0. + return '0%' + } + return Math.ceil(download.get('receivedBytes') / totalBytes * 100) + '%' +} -const shouldAllowCopyLink = (download) => !!download.get('url') +const shouldAllowCopyLink = (download) => (download && !!download.get('url')) || false const getDownloadItems = (state) => { - if (!state.get('downloads')) { + if (!state || !state.get('downloads')) { return Immutable.List() } diff --git a/less/downloadBar.less b/less/downloadBar.less index 65773a556dc..d62a3d87724 100644 --- a/less/downloadBar.less +++ b/less/downloadBar.less @@ -77,7 +77,7 @@ } } - &.completed, &.interrupted, &.cancelled { + &.completed, &.interrupted, &.cancelled, &.unauthorized { background-color: #e6e6e6; .downloadState { font-weight: bold; diff --git a/less/main.less b/less/main.less deleted file mode 100644 index 819d480a1f1..00000000000 --- a/less/main.less +++ /dev/null @@ -1,14 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -@bodyBG: #000; -@windowContainerFG: #f00; - -body { - background-color: @bodyBG; -} - -#windowContainer { - color: @windowContainerFG; -} diff --git a/less/window.less b/less/window.less index bd0962014a8..77c7bad0394 100644 --- a/less/window.less +++ b/less/window.less @@ -167,3 +167,12 @@ body.fullScreen .banner.fade { a { cursor: pointer; } + +// TODO: Investigate if these are required +// See PR #10861 +body { + background-color: #000; +} +#windowContainer { + color: #f00; +} diff --git a/test/contents/autofillTest.js b/test/contents/autofillTest.js index 07a6fb34416..792b57b9da6 100644 --- a/test/contents/autofillTest.js +++ b/test/contents/autofillTest.js @@ -22,6 +22,7 @@ const postalCode = '94103-1550' const postalCodeInput = '[data-test-id="postalCode"]' const country = 'US' const countryInput = '[data-test-id="country"]' +const countryValue = 'United States' const phone = '0987654321' const phoneInput = '[data-test-id="phone"]' const email = 'press@brave.com' @@ -75,8 +76,7 @@ describe('Autofill', function () { .typeText(stateInput, state) .click(postalCodeInput) .typeText(postalCodeInput, postalCode) - .click(countryInput) - .typeText(countryInput, country) + .selectByValue(countryInput, country) .click(phoneInput) .typeText(phoneInput, phone) .click(emailInput) @@ -100,7 +100,7 @@ describe('Autofill', function () { .waitForTextValue(cityInput, city) .waitForTextValue(stateInput, state) .waitForTextValue(postalCodeInput, postalCode) - .waitForTextValue(countryInput, country) + .waitForTextValue(countryInput, countryValue) .waitForTextValue(phoneInput, phone) .waitForTextValue(emailInput, email) }) @@ -168,7 +168,7 @@ describe('Autofill', function () { .waitForTextValue(cityInput, city) .waitForTextValue(stateInput, state) .waitForTextValue(postalCodeInput, postalCode) - .waitForTextValue(countryInput, country) + .waitForTextValue(countryInput, countryValue) .waitForTextValue(phoneInput, phone + '123') .waitForTextValue(emailInput, email + 'mm') // fill out the form @@ -346,8 +346,7 @@ describe('Autofill', function () { .typeText(stateInput, state) .click(postalCodeInput) .typeText(postalCodeInput, postalCode) - .click(countryInput) - .typeText(countryInput, country) + .selectByValue(countryInput, country) .click(phoneInput) .typeText(phoneInput, phone) .click(emailInput) @@ -388,7 +387,7 @@ describe('Autofill', function () { .waitForTextValue(cityInput, city) .waitForTextValue(stateInput, state) .waitForTextValue(postalCodeInput, postalCode) - .waitForTextValue(countryInput, country) + .waitForTextValue(countryInput, countryValue) .waitForTextValue(phoneInput, phone) .waitForTextValue(emailInput, email) }) diff --git a/test/unit/app/renderer/components/download/downloadItemTest.js b/test/unit/app/renderer/components/download/downloadItemTest.js index 0424b87e33a..79ed12f5cf4 100644 --- a/test/unit/app/renderer/components/download/downloadItemTest.js +++ b/test/unit/app/renderer/components/download/downloadItemTest.js @@ -139,7 +139,7 @@ describe('downloadItem component', function () { appActions.downloadActionPerformed.restore() }) - testButton('[data-test-id="redownloadButton"]', [downloadStates.CANCELLED, downloadStates.INTERRUPTED, downloadStates.COMPLETED], function (button) { + testButton('[data-test-id="redownloadButton"]', [downloadStates.CANCELLED, downloadStates.INTERRUPTED, downloadStates.UNAUTHORIZED, downloadStates.COMPLETED], function (button) { const spy = sinon.spy(appActions, 'downloadRedownloaded') button.simulate('click') assert(spy.withArgs(downloadId).calledOnce) @@ -160,7 +160,7 @@ describe('downloadItem component', function () { appActions.downloadRevealed.restore() }) - testButton('[data-test-id="deleteButton"]', [downloadStates.CANCELLED, downloadStates.INTERRUPTED, downloadStates.COMPLETED], function (button) { + testButton('[data-test-id="deleteButton"]', [downloadStates.CANCELLED, downloadStates.INTERRUPTED, downloadStates.UNAUTHORIZED, downloadStates.COMPLETED], function (button) { const spy = sinon.spy(appActions, 'showDownloadDeleteConfirmation') try { // Confirmation should NOT be visible by default @@ -175,7 +175,7 @@ describe('downloadItem component', function () { }) }) - if ([downloadStates.CANCELLED, downloadStates.INTERRUPTED, downloadStates.COMPLETED].includes(state)) { + if ([downloadStates.CANCELLED, downloadStates.INTERRUPTED, downloadStates.UNAUTHORIZED, downloadStates.COMPLETED].includes(state)) { describe(`${state} download item when delete button has been clicked`, function () { before(function () { downloadId = uuid.v4() @@ -183,7 +183,7 @@ describe('downloadItem component', function () { result = mount() }) - testButton('[data-test-id="confirmDeleteButton"]', [downloadStates.CANCELLED, downloadStates.INTERRUPTED, downloadStates.COMPLETED], function (button) { + testButton('[data-test-id="confirmDeleteButton"]', [downloadStates.CANCELLED, downloadStates.INTERRUPTED, downloadStates.UNAUTHORIZED, downloadStates.COMPLETED], function (button) { const spy = sinon.spy(appActions, 'downloadDeleted') try { // Accepting confirmation should delete the item diff --git a/test/unit/app/sessionStoreTest.js b/test/unit/app/sessionStoreTest.js index 2c7e3a8df91..2cd97387a00 100644 --- a/test/unit/app/sessionStoreTest.js +++ b/test/unit/app/sessionStoreTest.js @@ -510,6 +510,10 @@ describe('sessionStore unit tests', function () { result = sessionStore.cleanAppData(data, false) assert.equal(result.getIn(['downloads', 'entry1', 'state']), downloadStates.CANCELLED) + data = getEntry(downloadStates.UNAUTHORIZED) + result = sessionStore.cleanAppData(data, false) + assert.equal(result.getIn(['downloads', 'entry1', 'state']), downloadStates.UNAUTHORIZED) + data = getEntry(downloadStates.PENDING) result = sessionStore.cleanAppData(data, false) assert.equal(result.getIn(['downloads', 'entry1', 'state']), downloadStates.PENDING) diff --git a/test/unit/state/downloadUtilTest.js b/test/unit/state/downloadUtilTest.js new file mode 100644 index 00000000000..998257f21c9 --- /dev/null +++ b/test/unit/state/downloadUtilTest.js @@ -0,0 +1,77 @@ +/* global describe, it */ + +const downloadUtil = require('../../../js/state/downloadUtil') +const downloadStates = require('../../../js/constants/downloadStates') +const assert = require('assert') +const Immutable = require('immutable') + +describe('downloadUtil', function () { + describe('shouldAllowPause', function () { + it('handles falsey input', function () { + assert.equal(downloadUtil.shouldAllowPause(undefined), false) + }) + it('returns true if state is `downloadStates.IN_PROGRESS`', function () { + assert.equal(downloadUtil.shouldAllowPause(new Immutable.Map({ + state: downloadStates.IN_PROGRESS + }), [downloadStates.IN_PROGRESS]), true) + }) + }) + + describe('getPercentageComplete', function () { + it('handles falsey input', function () { + assert.equal(downloadUtil.getPercentageComplete(undefined), '0%') + }) + it('returns percentage complete for nonzero totalBytes', function () { + assert.equal(downloadUtil.getPercentageComplete(new Immutable.Map({ + totalBytes: 100, + receivedBytes: 10 + })), '10%') + assert.equal(downloadUtil.getPercentageComplete(new Immutable.Map({ + totalBytes: 1, + receivedBytes: 1 + })), '100%') + assert.equal(downloadUtil.getPercentageComplete(new Immutable.Map({ + totalBytes: 0, + receivedBytes: 1 + })), '0%') + }) + it('returns percentage complete for falsey totalBytes', function () { + assert.equal(downloadUtil.getPercentageComplete(new Immutable.Map({ + totalBytes: 0, + receivedBytes: 10 + })), '0%') + assert.equal(downloadUtil.getPercentageComplete(new Immutable.Map({ + totalBytes: 0, + receivedBytes: 0 + })), '0%') + assert.equal(downloadUtil.getPercentageComplete(new Immutable.Map({ + receivedBytes: 0 + })), '0%') + }) + }) + + describe('shouldAllowCopyLink', function () { + it('returns false if input is falsey', function () { + assert.equal(downloadUtil.shouldAllowCopyLink(undefined), false) + }) + it('returns false if `download.url` does not have a value', function () { + assert.equal(downloadUtil.shouldAllowCopyLink(new Immutable.Map({ + totalBytes: 0 + })), false) + }) + it('returns true if `download.url` has a value', function () { + assert.equal(downloadUtil.shouldAllowCopyLink(new Immutable.Map({ + url: 'https://clifton.io/robots.txt' + })), true) + }) + }) + + describe('getDownloadItems', function () { + it('returns an empty Immutable.List if intput is falsey', function () { + assert.deepEqual(downloadUtil.getDownloadItems(undefined), Immutable.List()) + }) + it('returns an empty Immutable.List if `state.downloads` is falsey', function () { + assert.deepEqual(downloadUtil.getDownloadItems(new Immutable.Map({})), Immutable.List()) + }) + }) +})