Bug 1361208 - import latest version of Screenshots (6.6.0) into the tree; r=standard8

MozReview-Commit-ID: DICbgINxnoa

--HG--
extra : rebase_source : 065193b99216d68cf7f3ab3a41944f3d2a0836eb
This commit is contained in:
Jared Hirsch 2017-05-01 16:58:23 -07:00
parent fa7b7e4d28
commit 47db4ca0b0
109 changed files with 1723 additions and 603 deletions

View File

@ -4,7 +4,7 @@
const OLD_ADDON_PREF_NAME = "extensions.jid1-NeEaf3sAHdKHPA@jetpack.deviceIdInfo";
const OLD_ADDON_ID = "jid1-NeEaf3sAHdKHPA@jetpack";
const ADDON_ID = "screenshots@mozilla.org";
const TELEMETRY_ENABLED_PREF = "toolkit.telemetry.enabled";
const TELEMETRY_ENABLED_PREF = "datareporting.healthreport.uploadEnabled";
const PREF_BRANCH = "extensions.screenshots.";
const USER_DISABLE_PREF = "extensions.screenshots.disabled";
const SYSTEM_DISABLE_PREF = "extensions.screenshots.system-disabled";
@ -22,21 +22,21 @@ XPCOMUtils.defineLazyModuleGetter(this, "LegacyExtensionsUtils",
let addonResourceURI;
let appStartupDone;
const appStartupPromise = new Promise((resolve,reject) => {
const appStartupPromise = new Promise((resolve, reject) => {
appStartupDone = resolve;
});
const prefs = Services.prefs;
const prefObserver = {
register: function() {
prefs.addObserver(PREF_BRANCH, this);
register() {
prefs.addObserver(PREF_BRANCH, this, false); // eslint-disable-line mozilla/no-useless-parameters
},
unregister: function() {
prefs.removeObserver(PREF_BRANCH, this);
unregister() {
prefs.removeObserver(PREF_BRANCH, this, false); // eslint-disable-line mozilla/no-useless-parameters
},
observe: function(aSubject, aTopic, aData) {
observe(aSubject, aTopic, aData) {
// aSubject is the nsIPrefBranch we're observing (after appropriate QI)
// aData is the name of the pref that's been changed (relative to aSubject)
if (aData == USER_DISABLE_PREF || aData == SYSTEM_DISABLE_PREF) {
@ -47,15 +47,15 @@ const prefObserver = {
};
const appStartupObserver = {
register: function() {
Services.obs.addObserver(this, "sessionstore-windows-restored");
register() {
Services.obs.addObserver(this, "sessionstore-windows-restored", false); // eslint-disable-line mozilla/no-useless-parameters
},
unregister: function() {
Services.obs.removeObserver(this, "sessionstore-windows-restored", false);
unregister() {
Services.obs.removeObserver(this, "sessionstore-windows-restored", false); // eslint-disable-line mozilla/no-useless-parameters
},
observe: function() {
observe() {
appStartupDone();
this.unregister();
}
@ -76,6 +76,13 @@ function startup(data, reason) { // eslint-disable-line no-unused-vars
function shutdown(data, reason) { // eslint-disable-line no-unused-vars
prefObserver.unregister();
const webExtension = LegacyExtensionsUtils.getEmbeddedExtensionFor({
id: ADDON_ID,
resourceURI: addonResourceURI
});
if (webExtension.started) {
stop(webExtension);
}
}
function install(data, reason) {} // eslint-disable-line no-unused-vars

View File

@ -12,7 +12,7 @@
</Description>
</em:targetApplication>
<em:type>2</em:type>
<em:version>6.3.0</em:version>
<em:version>6.6.0</em:version>
<em:bootstrap>true</em:bootstrap>
<em:homepageURL>https://pageshot.net/</em:homepageURL>
<em:multiprocessCompatible>true</em:multiprocessCompatible>

View File

@ -29,6 +29,10 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales
'webextension/_locales/ach/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["az"] += [
'webextension/_locales/az/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["be"] += [
'webextension/_locales/be/messages.json'
]
@ -45,6 +49,10 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales
'webextension/_locales/cs/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["cy"] += [
'webextension/_locales/cy/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["de"] += [
'webextension/_locales/de/messages.json'
]
@ -89,6 +97,10 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales
'webextension/_locales/fa/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["fi"] += [
'webextension/_locales/fi/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["fr"] += [
'webextension/_locales/fr/messages.json'
]
@ -105,6 +117,10 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales
'webextension/_locales/he/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["hi_IN"] += [
'webextension/_locales/hi_IN/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["hsb"] += [
'webextension/_locales/hsb/messages.json'
]
@ -137,6 +153,10 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales
'webextension/_locales/kk/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["km"] += [
'webextension/_locales/km/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["ko"] += [
'webextension/_locales/ko/messages.json'
]
@ -157,6 +177,10 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales
'webextension/_locales/ms/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["my"] += [
'webextension/_locales/my/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["nb_NO"] += [
'webextension/_locales/nb_NO/messages.json'
]
@ -189,6 +213,10 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales
'webextension/_locales/rm/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["ro"] += [
'webextension/_locales/ro/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["ru"] += [
'webextension/_locales/ru/messages.json'
]
@ -213,6 +241,10 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales
'webextension/_locales/sv_SE/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["te"] += [
'webextension/_locales/te/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["th"] += [
'webextension/_locales/th/messages.json'
]
@ -233,6 +265,10 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales
'webextension/_locales/ur/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["uz"] += [
'webextension/_locales/uz/messages.json'
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["_locales"]["zh_CN"] += [
'webextension/_locales/zh_CN/messages.json'
]
@ -262,6 +298,7 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["build"]
]
FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["icons"] += [
'webextension/icons/back-highlight.svg',
'webextension/icons/back.svg',
'webextension/icons/cancel.svg',
'webextension/icons/copy.png',
@ -269,16 +306,17 @@ FINAL_TARGET_FILES.features['screenshots@mozilla.org']["webextension"]["icons"]
'webextension/icons/download.svg',
'webextension/icons/icon-128.png',
'webextension/icons/icon-16.png',
'webextension/icons/icon-16.svg',
'webextension/icons/icon-19.png',
'webextension/icons/icon-256.png',
'webextension/icons/icon-32.png',
'webextension/icons/icon-32.svg',
'webextension/icons/icon-38.png',
'webextension/icons/icon-48.png',
'webextension/icons/icon-64.png',
'webextension/icons/icon-highlight-19.png',
'webextension/icons/icon-highlight-38.png',
'webextension/icons/icon-starred-19.png',
'webextension/icons/icon-starred-38.png',
'webextension/icons/icon-highlight-32.svg',
'webextension/icons/icon-starred-32.svg',
'webextension/icons/icon-welcome-face-without-eyes.svg',
'webextension/icons/menu-fullpage.svg',
'webextension/icons/menu-myshot.svg',
'webextension/icons/menu-visible.svg',

View File

@ -0,0 +1,7 @@
"use strict";
module.exports = {
"extends": [
"plugin:mozilla/browser-test"
]
}

View File

@ -1,8 +1,5 @@
"use strict";
/* global add_task, is, promiseScreenshotsEnabled, promiseScreenshotsReset,
registerCleanupFunction */
function checkElements(expectPresent, l) {
for (let id of l) {
is(!!document.getElementById(id), expectPresent, "element " + id + (expectPresent ? " is" : " is not") + " present");
@ -16,5 +13,9 @@ add_task(function*() {
yield promiseScreenshotsReset();
});
yield BrowserTestUtils.waitForCondition(
() => document.getElementById("screenshots_mozilla_org-browser-action"),
"Screenshots button should be present", 100, 100);
checkElements(true, ["screenshots_mozilla_org-browser-action"]);
});

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Otum"
},
"termsAndPrivacyNotice": {
"message": "Tic ki Firefox Screenshots nyuto ni, i yee $TERMSANDPRIVACYNOTICETERMSLINK$ ki $TERMSANDPRIVACYNOTICEPRIVACYLINK$ me Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Tic ki Firefox Screenshots nyuto, ni i yee $TERMSANDPRIVACYNOTICETERMSLINK$ ki $TERMSANDPRIVACYNOTICEPRIVACYLINK$ me tic me Cloud pa Firefox.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -0,0 +1,20 @@
{
"addonAuthorsList": {
"message": "Mozilla <screenshots-feedback@mozilla.org>"
},
"saveScreenshotSelectedArea": {
"message": "Saxla"
},
"saveScreenshotVisibleArea": {
"message": "Görünən ərazini saxla"
},
"cancelScreenshot": {
"message": "Ləğv et"
},
"downloadScreenshot": {
"message": "Endir"
},
"notificationLinkCopiedTitle": {
"message": "Keçid köçürüldü"
}
}

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Гатова"
},
"termsAndPrivacyNotice": {
"message": "Выкарыстоўваючы Firefox Screenshots, вы згаджаецеся з яго $TERMSANDPRIVACYNOTICETERMSLINK$ і $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Выкарыстоўваючы Firefox Screenshots, вы згаджаецеся з $TERMSANDPRIVACYNOTICETERMSLINK$ і $TERMSANDPRIVACYNOTICEPRIVACYLINK$ Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Готово"
},
"termsAndPrivacyNotice": {
"message": "Използвайки Firefox Screenshots вие се съгласявате с тези $TERMSANDPRIVACYNOTICETERMSLINK$ и $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Използвайки Firefox Screenshots вие се съгласявате с $TERMSANDPRIVACYNOTICETERMSLINK$ и $TERMSANDPRIVACYNOTICEPRIVACYLINK$ на облачните услуги на Firefox.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
@ -115,9 +115,9 @@
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "Условия"
"message": "Условията"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "Политика на поверителност"
"message": "Политиката на поверителност"
}
}

View File

@ -103,17 +103,6 @@
"tourDone": {
"message": "সম্পন্ন"
},
"termsAndPrivacyNotice": {
"message": "Firefox Screenshots ব্যবহারের জন্য, আপনি স্ক্রিনশটের $TERMSANDPRIVACYNOTICETERMSLINK$ এবং $TERMSANDPRIVACYNOTICEPRIVACYLINK$ নীতিতে আগ্রহী।",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
},
"termsandprivacynoticeprivacylink": {
"content": "$2"
}
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "শর্তাবলী"
},

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Hotovo"
},
"termsAndPrivacyNotice": {
"message": "Používáním služby Firefox Screenshots souhlasíte s jejími $TERMSANDPRIVACYNOTICETERMSLINK$ a $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Používáním služby Firefox Screenshots souhlasíte s $TERMSANDPRIVACYNOTICETERMSLINK$ a $TERMSANDPRIVACYNOTICEPRIVACYLINK$ Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -0,0 +1,123 @@
{
"addonDescription": {
"message": "Cymrwch clipiau a lluniau sgrin o'r We a'u cadw dros dro neu'n barhaol."
},
"addonAuthorsList": {
"message": "Mozilla <screenshots-feedback@mozilla.org>"
},
"contextMenuLabel": {
"message": "Cymryd Llun Sgrin Screenshot"
},
"myShotsLink": {
"message": "Fy Lluniau Sgrin"
},
"screenshotInstructions": {
"message": "Llusgwch neu glicio ar y dudalen i ddewis adran. Pwyso ESC i ddiddymu."
},
"saveScreenshotSelectedArea": {
"message": "Cadw"
},
"saveScreenshotVisibleArea": {
"message": "Cadw'r gweladwy"
},
"saveScreenshotFullPage": {
"message": "Cadw tudalen lawn"
},
"cancelScreenshot": {
"message": "Diddymu"
},
"downloadScreenshot": {
"message": "Llwytho i Lawr"
},
"notificationLinkCopiedTitle": {
"message": "Dolen wedi ei Chadw"
},
"notificationLinkCopiedDetails": {
"message": "Mae'r ddolen i'ch llun wedi ei gopïo i'r clipfwrdd. Pwyswch $META_KEY$-V i'w ludo.",
"placeholders": {
"meta_key": {
"content": "$1"
}
}
},
"requestErrorTitle": {
"message": "Ddim yn gweithio."
},
"requestErrorDetails": {
"message": "Ymddiheuriadau! Nid oedd modd cadw eich llun. Ceisiwch eto'n hwyrach."
},
"connectionErrorTitle": {
"message": "Nid oes modd i ni gysylltu a'ch lluniau sgrin."
},
"connectionErrorDetails": {
"message": "Gwiriwch eich cysylltiad Rhyngrwyd. Os ydych yn gallu cysylltu â'r Rhyngrwyd, efallai bod anhawster dros dro gyda gwasanaeth lluniau sgrin, Firefox Screnshots."
},
"loginErrorDetails": {
"message": "Nid oedd modd i ni gadw eich llun gan fod yna anhawster gyda gwasanaeth Firefox Screenshots. Ceisiwch eto'n hwyrach."
},
"unshootablePageErrorTitle": {
"message": "Nid oes modd tynnu llun sgrin o'r dudalen."
},
"unshootablePageErrorDetails": {
"message": "Nid yw hwn yn dudalen Gwe safonol, felly does dim modd tynnu llun sgrin ohono."
},
"selfScreenshotErrorTitle": {
"message": "Nid oes modd cymryd llun o dudalen lluniau sgrin Firefox Screenshots!"
},
"genericErrorTitle": {
"message": "Www! Mae Firefox Screenshots wedi mynd yn hurt."
},
"genericErrorDetails": {
"message": "Nid ydym yn gwybod beth sydd wedi ddigwydd. Ceisiwch eto neu dynnu llun o dudalen wahanol?"
},
"tourBodyOne": {
"message": "Cymryd, cadw a rhannu lluniau sgrin heb adael Firefox."
},
"tourHeaderTwo": {
"message": "Cipio Dim ond Beth Rydych ei Angen"
},
"tourBodyTwo": {
"message": "Cliciwch a llusgo i gipio rhan o dudalen. Gallwch hofran i amlygu eich dewis."
},
"tourHeaderThree": {
"message": "Yn Ôl eich Dewis"
},
"tourBodyThree": {
"message": "Cadwch eich lluniau wedi eu golygu i'r We ar gyfer rhannu haws, neu eu llwytho i lawr i'ch cyfrifiadur. Gallwch hefyd glicio ar Fy Lluniau i weld pob llun sydd gennych."
},
"tourHeaderFour": {
"message": "Cipio Ffenestri neu Dudalennau Cyfan"
},
"tourBodyFour": {
"message": "Dewiswch y botymau ar y dde uchod i gipio ardal gweladwy mewn ffenestr neu i gipio tudalen gyfan."
},
"tourSkip": {
"message": "SKIP"
},
"tourNext": {
"message": "Sleid Nesaf"
},
"tourPrevious": {
"message": "Sleid Flaenorol"
},
"tourDone": {
"message": "Gorffen"
},
"termsAndPrivacyNoticeCloudServices": {
"message": "Drwy ddefnyddio Firefox Screenshots, rydych yn cytuno i Firefox Cloud Services $TERMSANDPRIVACYNOTICETERMSLINK$ a $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
},
"termsandprivacynoticeprivacylink": {
"content": "$2"
}
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "Telerau"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "Hysbysiad Preifatrwydd"
}
}

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Fertig"
},
"termsAndPrivacyNotice": {
"message": "Durch die Verwendung von Firefox Screenshots stimmen Sie den entsprechenden $TERMSANDPRIVACYNOTICETERMSLINK$ und dem $TERMSANDPRIVACYNOTICEPRIVACYLINK$ zu.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Durch die Verwendung von Firefox Screenshots stimmen Sie den $TERMSANDPRIVACYNOTICETERMSLINK$ und dem $TERMSANDPRIVACYNOTICEPRIVACYLINK$ von Firefox Cloud Services zu.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Gótowo"
},
"termsAndPrivacyNotice": {
"message": "Pśez wužywanje Firefox ScreenShots, zwolijośo do $TERMSANDPRIVACYNOTICETERMSLINK$ a $TERMSANDPRIVACYNOTICEPRIVACYLINK$ Firefox Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Pśez wužywanje Firefox ScreenShots, zwolijośo do $TERMSANDPRIVACYNOTICETERMSLINK$ a $TERMSANDPRIVACYNOTICEPRIVACYLINK$ Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Τέλος"
},
"termsAndPrivacyNotice": {
"message": "Χρησιμοποιώντας το Firefox Screenshots, συμφωνείτε με τους $TERMSANDPRIVACYNOTICETERMSLINK$ Στιγμιότυπων και τη $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Χρησιμοποιώντας το Firefox Screenshots, συμφωνείτε με τους $TERMSANDPRIVACYNOTICETERMSLINK$ και την $TERMSANDPRIVACYNOTICEPRIVACYLINK$ των Υπηρεσιών Cloud του Firefox.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Done"
},
"termsAndPrivacyNotice": {
"message": "By using Firefox Screenshots, you agree to the Screenshots $TERMSANDPRIVACYNOTICETERMSLINK$ and $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "By using Firefox Screenshots, you agree to the Firefox Cloud Services $TERMSANDPRIVACYNOTICETERMSLINK$ and $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Listo"
},
"termsAndPrivacyNotice": {
"message": "Al usar Firefox Screenshots, aceptás los $TERMSANDPRIVACYNOTICETERMSLINK$ y $TERMSANDPRIVACYNOTICEPRIVACYLINK$ de Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "AL usar Firefox Screenshots, aceptás los $TERMSANDPRIVACYNOTICETERMSLINK$ y $TERMSANDPRIVACYNOTICEPRIVACYLINK$ de los servicios en la nube de Firefox.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Hecho"
},
"termsAndPrivacyNotice": {
"message": "Al usar Firefox Screenshots, aceptas los $TERMSANDPRIVACYNOTICETERMSLINK$ y el $TERMSANDPRIVACYNOTICEPRIVACYLINK$ de Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Al usar Firefox Screenshots, aceptas los $TERMSANDPRIVACYNOTICETERMSLINK$ y el $TERMSANDPRIVACYNOTICEPRIVACYLINK$ de Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Hecho"
},
"termsAndPrivacyNotice": {
"message": "Al usar Firefox Screenshots, aceptas los $TERMSANDPRIVACYNOTICETERMSLINK$ y el $TERMSANDPRIVACYNOTICEPRIVACYLINK$ de Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Al usar Firefox Screenshots, aceptas los $TERMSANDPRIVACYNOTICETERMSLINK$ y el $TERMSANDPRIVACYNOTICEPRIVACYLINK$ de Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Terminado"
},
"termsAndPrivacyNotice": {
"message": "Al usar Firefox Screenshots, estás de acuerdo con los $TERMSANDPRIVACYNOTICETERMSLINK$ y con el $TERMSANDPRIVACYNOTICETERMSLINK$ de Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Al usar Firefox Screenshots, estás de acuerdo con los servicios de Firefox Cloud $TERMSANDPRIVACYNOTICETERMSLINK$ y $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Valmis"
},
"termsAndPrivacyNotice": {
"message": "Firefox Screenshots kasutamisel nõustud Screenshots $TERMSANDPRIVACYNOTICETERMSLINK$ ja $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Firefox Screenshots kasutamisel nõustud Firefox Cloud Services $TERMSANDPRIVACYNOTICETERMSLINK$ ja $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "انجام شد"
},
"termsAndPrivacyNotice": {
"message": "با استفاده از سرویسِ تصاویرِ صفحهٔ فایرفاکس، شما با $TERMSANDPRIVACYNOTICETERMSLINK$ و $TERMSANDPRIVACYNOTICEPRIVACYLINK$ موافقت می‌کنید.",
"termsAndPrivacyNoticeCloudServices": {
"message": "با استفاده از سرویس تصاویرِ صفحه فایرفاکس، شما با شرایط سرویس‌های ابری فایرفاکس $TERMSANDPRIVACYNOTICETERMSLINK$ و $TERMSANDPRIVACYNOTICEPRIVACYLINK$ موافقت می‌کنید.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -0,0 +1,23 @@
{
"addonAuthorsList": {
"message": "Mozilla <screenshots-feedback@mozilla.org>"
},
"saveScreenshotSelectedArea": {
"message": "Tallenna"
},
"saveScreenshotVisibleArea": {
"message": "Tallenna näkyvä osuus"
},
"saveScreenshotFullPage": {
"message": "Tallenna koko sivu"
},
"cancelScreenshot": {
"message": "Peruuta"
},
"downloadScreenshot": {
"message": "Lataa"
},
"notificationLinkCopiedTitle": {
"message": "Linkki kopioitu"
}
}

View File

@ -65,7 +65,7 @@
"message": "Vous ne pouvez pas effectuer une capture décran dune page Firefox Screenshots."
},
"genericErrorTitle": {
"message": "Firefox Screenshots semble avoir un petit problème."
"message": "Firefox Screenshots semble avoir un problème."
},
"genericErrorDetails": {
"message": "Un problème non identifié est survenu. Vous pouvez réessayer ou effectuer une capture décran dune autre page."
@ -103,8 +103,8 @@
"tourDone": {
"message": "Terminé"
},
"termsAndPrivacyNotice": {
"message": "En utilisant Firefox Screenshots, vous acceptez les $TERMSANDPRIVACYNOTICETERMSLINK$ et la $TERMSANDPRIVACYNOTICEPRIVACYLINK$ de Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "En utilisant Firefox Screenshots, vous acceptez les $TERMSANDPRIVACYNOTICETERMSLINK$ et la $TERMSANDPRIVACYNOTICEPRIVACYLINK$ des services en ligne de Firefox.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Dien"
},
"termsAndPrivacyNotice": {
"message": "Troch Firefox Screenshots te brûken, gean jo akkoard mei de $TERMSANDPRIVACYNOTICETERMSLINK$ en $TERMSANDPRIVACYNOTICEPRIVACYLINK$ fan Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Troch Firefox Screenshots te brûken, geane jo akkoard mei de $TERMSANDPRIVACYNOTICETERMSLINK$ en $TERMSANDPRIVACYNOTICEPRIVACYLINK$ fan Firefox-cloudtsjinsten.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "થઈ ગયું"
},
"termsAndPrivacyNotice": {
"message": "Firefox સ્ક્રીનશોટ્સ વાપરીને, તમે સ્ક્રીનશૉટ્સ થી સંમત છો $TERMSANDPRIVACYNOTICETERMSLINK$ અને $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Firefox સ્ક્રીનશોટ્સ વાપરીને, તમે Firefox Cloud સેવાઓ સાથે સંમત થાઓ છો $TERMSANDPRIVACYNOTICETERMSLINK$ અને $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -90,5 +90,34 @@
},
"tourBodyFour": {
"message": "נא לבחור בכפתורים שבחלק העליון כדי לצלם את האזור הגלוי בחלון או לצלם את הדף כולו."
},
"tourSkip": {
"message": "דילוג"
},
"tourNext": {
"message": "השקופית הבאה"
},
"tourPrevious": {
"message": "השקופית הקודמת"
},
"tourDone": {
"message": "סיום"
},
"termsAndPrivacyNoticeCloudServices": {
"message": "מעצם השימוש ב־Firefox Screenshots הכללים של שירותי הענן של Firefox $TERMSANDPRIVACYNOTICETERMSLINK$ ו$TERMSANDPRIVACYNOTICEPRIVACYLINK$ מוסכמים עליך.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
},
"termsandprivacynoticeprivacylink": {
"content": "$2"
}
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "תנאים"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "הצהרת פרטיות"
}
}

View File

@ -0,0 +1,123 @@
{
"addonDescription": {
"message": "वेब से फ़ोटो और स्क्रीनशॉट लें और उन्हें अस्थायी या स्थायी रूप से सहेजें."
},
"addonAuthorsList": {
"message": "Mozilla <screenshots-feedback@mozilla.org>"
},
"contextMenuLabel": {
"message": "स्क्रीनशॉट लें"
},
"myShotsLink": {
"message": "मेरे चित्र"
},
"screenshotInstructions": {
"message": "किसी क्षेत्र को चुनने के लिए पृष्ठ पर खींचें या क्लिक करें. रद्द करने के लिए ESC दबाएँ."
},
"saveScreenshotSelectedArea": {
"message": "सहेजें"
},
"saveScreenshotVisibleArea": {
"message": "दृश्यमान सहेजें"
},
"saveScreenshotFullPage": {
"message": "पूर्ण पृष्ठ सहेजें"
},
"cancelScreenshot": {
"message": "रद्द करें"
},
"downloadScreenshot": {
"message": "डाउनलोड करें"
},
"notificationLinkCopiedTitle": {
"message": "लिंक की नक़ल की गयी"
},
"notificationLinkCopiedDetails": {
"message": "आपके शॉट के लिंक क्लिपबोर्ड पर कॉपी किए गए हैं. पेस्ट करने के लिए $META_KEY$-V दबाएँ.",
"placeholders": {
"meta_key": {
"content": "$1"
}
}
},
"requestErrorTitle": {
"message": "कार्यरत नहीं है."
},
"requestErrorDetails": {
"message": "क्षमा करें! हम आपके शॉट को सहेज़ नहीं सके. कृपया बाद में पुन: प्रयास करें."
},
"connectionErrorTitle": {
"message": "हम आपके स्क्रीनशॉट से जुड़ नहीं सकते हैं."
},
"connectionErrorDetails": {
"message": "कृपया अपने इंटरनेट संपर्क की जाँच करें. यदि आप इंटरनेट से जुड़ने में सक्षम हैं, तो Firefox स्क्रीनशॉट सेवा के साथ एक अस्थायी समस्या हो सकती है."
},
"loginErrorDetails": {
"message": "हम आपका शॉट सहेज नहीं सके क्योंकि Firefox स्क्रीनशॉट सेवा में कोई समस्या है. कृपया बाद में पुन: प्रयास करें."
},
"unshootablePageErrorTitle": {
"message": "हम इस पृष्ठ का स्क्रीनशॉट नहीं ले सकते."
},
"unshootablePageErrorDetails": {
"message": "यह एक मानक वेब पेज नहीं है, इसलिए आप इसका स्क्रीनशॉट नहीं ले सकते."
},
"selfScreenshotErrorTitle": {
"message": "आप एक Firefox स्क्रीनशॉट पृष्ठ का शॉट नहीं ले सकते!"
},
"genericErrorTitle": {
"message": "ओह! Firefox स्क्रीनशॉट बिगड़ गया."
},
"genericErrorDetails": {
"message": "हम सुनिश्चित नहीं हैं कि अभी क्या हुआ. पुन: प्रयास या एक भिन्न पृष्ठ का एक शॉट लेना चाहते हैं?"
},
"tourBodyOne": {
"message": "Firefox छोड़े बिना स्क्रीनशॉट लें, सहेजें, और साझा करें."
},
"tourHeaderTwo": {
"message": "जो आप चाहते हैं उसे कैद करें"
},
"tourBodyTwo": {
"message": "पृष्ठ के बस एक हिस्से को कैद करने के लिए क्लिक करें और खींचें. आप अपने चयन को हाइलाइट करने के लिए भी जा सकते हैं."
},
"tourHeaderThree": {
"message": "जैसा आप इसे चाहते हैं"
},
"tourBodyThree": {
"message": "आसानी से साझा करने या उन्हें अपने कंप्यूटर पर डाउनलोड करने के लिए अपने क्रॉप किये गये शॉट को वेब पर सहेजें. आपके द्वारा लिए गये सभी शॉट्स को ढूंढने के लिए आप मेरे शॉट्स बटन पर भी क्लिक कर सकते हैं."
},
"tourHeaderFour": {
"message": "विंडोज़ या संपूर्ण पृष्ठों को कैद करें"
},
"tourBodyFour": {
"message": "विंडो में दिखाई देने वाले क्षेत्र या एक पूरे पृष्ठ को कैद करने के लिए ऊपर में दाहिनी तरफ़ के बटन का चयन करें."
},
"tourSkip": {
"message": "SKIP"
},
"tourNext": {
"message": "अगली स्लाइड"
},
"tourPrevious": {
"message": "पिछली स्लाइड"
},
"tourDone": {
"message": "पूर्ण"
},
"termsAndPrivacyNoticeCloudServices": {
"message": "Firefox स्क्रीनशॉट का उपयोग करके, आप Firefox क्लाउड सेवाओं $TERMSANDPRIVACYNOTICETERMSLINK$ और $TERMSANDPRIVACYNOTICEPRIVACYLINK$ के लिए सहमत हैं.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
},
"termsandprivacynoticeprivacylink": {
"content": "$2"
}
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "शर्तें"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "गोपनीयता सूचना"
}
}

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Hotowo"
},
"termsAndPrivacyNotice": {
"message": "Přez wužiwanje Firefox ScreenShots, zwoliće do $TERMSANDPRIVACYNOTICETERMSLINK$ a $TERMSANDPRIVACYNOTICEPRIVACYLINK$ Firefox Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Přez wužiwanje Firefox ScreenShots, zwoliće do $TERMSANDPRIVACYNOTICETERMSLINK$ a $TERMSANDPRIVACYNOTICEPRIVACYLINK$ Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Kész"
},
"termsAndPrivacyNotice": {
"message": "A Firefox képernyőképek használatával, Ön beleegyezik a képernyőképek $TERMSANDPRIVACYNOTICETERMSLINK$ és $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "A Firefox képernyőképek használatával beleegyezik a Firefox felhőszolgáltatások $TERMSANDPRIVACYNOTICETERMSLINK$ és $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -102,5 +102,22 @@
},
"tourDone": {
"message": "Պատրաստ է"
},
"termsAndPrivacyNoticeCloudServices": {
"message": "Օգտագործելով Firefox Screenshots-ը՝ դուք ընդունում եք Firefox Cloud ծառայությունների $TERMSANDPRIVACYNOTICETERMSLINK$ը և $TERMSANDPRIVACYNOTICEPRIVACYLINK$ը:",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
},
"termsandprivacynoticeprivacylink": {
"content": "$2"
}
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "Պայմաններ"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "Գաղտնիության ծանուցում"
}
}

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Selesai"
},
"termsAndPrivacyNotice": {
"message": "Dengan menggunakan Firefox Screenshots, Anda setuju dengan $TERMSANDPRIVACYNOTICETERMSLINK$ dan $TERMSANDPRIVACYNOTICEPRIVACYLINK$ Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Dengan menggunakan Firefox Screenshots, Anda setuju dengan $TERMSANDPRIVACYNOTICETERMSLINK$ dan $TERMSANDPRIVACYNOTICEPRIVACYLINK$ Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Fine"
},
"termsAndPrivacyNotice": {
"message": "Utilizzando Firefox Screenshots si accettano le $TERMSANDPRIVACYNOTICETERMSLINK$ e l$TERMSANDPRIVACYNOTICEPRIVACYLINK$ del servizio.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Utilizzando Firefox Screenshots si accettano le $TERMSANDPRIVACYNOTICETERMSLINK$ e l$TERMSANDPRIVACYNOTICEPRIVACYLINK$ di Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "完了"
},
"termsAndPrivacyNotice": {
"message": "Firefox Screenshots を使うことで、あなたは Screenshots の $TERMSANDPRIVACYNOTICETERMSLINK$ と $TERMSANDPRIVACYNOTICEPRIVACYLINK$ に同意したことになります。",
"termsAndPrivacyNoticeCloudServices": {
"message": "Firefox Screenshots を使うことで、あなたは Firefox Cloud Services の $TERMSANDPRIVACYNOTICETERMSLINK$ と $TERMSANDPRIVACYNOTICEPRIVACYLINK$ に同意したことになります。",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -1,6 +1,6 @@
{
"addonDescription": {
"message": "Ṭṭef imrayen akked igdilen si Web sakin sekles-iten s wudem askudan neɣ s wudem yezgan."
"message": "Ṭṭef imrayen akked igdilen si Web sakin sekles-iten s wudem askudan neγ s wudem yezgan."
},
"addonAuthorsList": {
"message": "Mozilla <screenshots-feedback@mozilla.org>"
@ -103,8 +103,8 @@
"tourDone": {
"message": "Immed"
},
"termsAndPrivacyNotice": {
"message": "S useqdec Firefox Screenshots, ad tqebleḍ $TERMSANDPRIVACYNOTICETERMSLINK$ n Screenshots akked $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "S useqdec n Firefox Screenshots, ad tqebleḍ tiwuriwin n usigna Firefox $TERMSANDPRIVACYNOTICETERMSLINK$ akked $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -49,6 +49,12 @@
"connectionErrorTitle": {
"message": "Скриншоттарыңызға байланыса алмадық."
},
"connectionErrorDetails": {
"message": "Интернетпен байланысыңызды тексеріңіз. Егер сізде интернетпен байланыс бар болса, онда Firefox скриншоттары қызметімен уақытша мәселелер болуы мүмкін."
},
"loginErrorDetails": {
"message": "Скриншотыңызды сақтай алмадық, өйткені Firefox скриншоттары қызметімен мәселе бар болып тұр. Кейінірек қайталап көріңіз."
},
"unshootablePageErrorTitle": {
"message": "Бұл беттің скриншотын түсіре алмаймыз."
},
@ -61,15 +67,30 @@
"genericErrorTitle": {
"message": "Қап! Firefox скриншоттары жасамай қалған сияқты."
},
"genericErrorDetails": {
"message": "Не болғанын білмейміз. Қайталап көресіз бе, немесе басқа парақтың скриншотын түсіріп көресіз бе?"
},
"tourBodyOne": {
"message": "Firefox ішінен скриншоттарды түсіру, сақтау және олармен бөлісу."
},
"tourHeaderTwo": {
"message": "Тек керек нәрсені түсіріңіз"
},
"tourBodyTwo": {
"message": "Беттің тек бір бөлігін түсіру үшін тышқанды шертіп, тартыңыз. Таңдауыңызды түспен ерекшелеу үшін үстінен өткізсеңіз болады."
},
"tourHeaderThree": {
"message": "Өзіңізге керек түрде"
},
"tourBodyThree": {
"message": "Қиылған скриншоттарыңыздбен оңай бөлісу үшін оларды интернетте сақтаңыз, немесе өз компьютеріңізге жүктеп алыңыз. Сонымен қатар, сіз жасаған барлық скриншоттарды табу үшін Менің скриншоттарым батырмасына шерте аласыз."
},
"tourHeaderFour": {
"message": "Терезелер немесе толық беттерді түсіріңіз"
},
"tourBodyFour": {
"message": "Жоғарғы оң жақта орналасқан батырмаларды терезенің көрінетін аймағын, немесе толық бетті түсіру үшін қолданыңыз."
},
"tourSkip": {
"message": "Аттап кету"
},
@ -81,5 +102,22 @@
},
"tourDone": {
"message": "Дайын"
},
"termsAndPrivacyNoticeCloudServices": {
"message": "Firefox скриншоттарын қолдану арқылы, сіз Firefox бұлттық қызметтерінің $TERMSANDPRIVACYNOTICETERMSLINK$ және $TERMSANDPRIVACYNOTICEPRIVACYLINK$ келісесіз.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
},
"termsandprivacynoticeprivacylink": {
"content": "$2"
}
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "Қолдану шарттары"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "Жекелік ескертуі"
}
}

View File

@ -0,0 +1,5 @@
{
"saveScreenshotSelectedArea": {
"message": "រក្សា​ទុក"
}
}

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "완료"
},
"termsAndPrivacyNotice": {
"message": "Firefox Screenshots를 사용하므로써, $TERMSANDPRIVACYNOTICETERMSLINK$와 $TERMSANDPRIVACYNOTICEPRIVACYLINK$에 동의하게 됩니다.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Firefox Screenshots을 사용함으로써, Firefox Cloud Services $TERMSANDPRIVACYNOTICETERMSLINK$과 $TERMSANDPRIVACYNOTICEPRIVACYLINK$에 동의하게 됩니다.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -102,5 +102,22 @@
},
"tourDone": {
"message": "Fæto"
},
"termsAndPrivacyNoticeCloudServices": {
"message": "Se ti deuvi Firefox Screenshots, ti e d'acordio con $TERMSANDPRIVACYNOTICETERMSLINK$ e $TERMSANDPRIVACYNOTICEPRIVACYLINK$ de Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
},
"termsandprivacynoticeprivacylink": {
"content": "$2"
}
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "Termini"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "Informativa in sciâ privacy"
}
}

View File

@ -1,7 +1,19 @@
{
"addonDescription": {
"message": "ຖ່າຍຄຣິບ ແລະ ພາບຫນ້າຈໍຈາກຫນ້າເວັບ ແລ້ວບັນທຶກໄວ້ຊົ່ວຄາວ ຫລື ຖາວອນ."
},
"addonAuthorsList": {
"message": "Mozilla <screenshots-feedback@mozilla.org>"
},
"contextMenuLabel": {
"message": "ຖ່າຍພາບຫນ້າຈໍ"
},
"myShotsLink": {
"message": "ພາບຂອງຂ້ອຍ"
},
"screenshotInstructions": {
"message": "ລາກ ຫລື ຄິກໃສ່ຫນ້າເວັບເພື່ອເລືອກເອົາບ່ອນທີ່ຕ້ອງການ. ກົດ ESC ເພື່ອຍົກເລີກ."
},
"saveScreenshotSelectedArea": {
"message": "ບັນທຶກ"
},
@ -20,9 +32,65 @@
"notificationLinkCopiedTitle": {
"message": "ໄດ້ສຳເນົາລີ້ງໄວ້ແລ້ວ"
},
"notificationLinkCopiedDetails": {
"message": "ລີ້ງໄປຫາຮູບພາບຂອງທ່ານໄດ້ຖືກບັນທຶກໄວ້ໃນຄຣິບບອດ. ກົດ $META_KEY$-V ເພື່ອວາງ.",
"placeholders": {
"meta_key": {
"content": "$1"
}
}
},
"requestErrorTitle": {
"message": "ໃຊ້ວຽກບໍ່ໄດ້."
},
"requestErrorDetails": {
"message": "ຂໍອະໄພ! ພວກເຮົາບໍ່ສາມາດບັນທຶກພາບຂອງທ່ານໄດ້. ກະລູນາລອງໃຫມ່ອີກຄັ້ງ."
},
"connectionErrorTitle": {
"message": "ພວກເຮົາບໍ່ສາມາດເຊື່ອມຕໍ່ໄປຫາພາບຫນ້າຈໍຂອງທ່ານໄດ້."
},
"connectionErrorDetails": {
"message": "ກະລູນາກວດເບິງການເຊື່ອມຕໍ່ກັບອິນເຕີເນັດຂອງທ່ານ. ຖ້າຫາກວ່າທ່ານສາມາດເຊື່ອມຕໍ່ກັບອິນເຕີເນັດໄດ້ແມ່ນ ບໍລິການພາບຖ່າຍຫນ້າຈໍຂອງ Firefox ອາດຈະເກີດມີບັນຫາຊົ່ວຄາວ."
},
"loginErrorDetails": {
"message": "ພວກເຮົາບໍ່ສາມາດບັນທຶກພາບຖ່າຍຂອງທ່ານໄດ້ ເພາະວ່າບໍລິການພາບຖ່າຍຫນ້າຈໍຂອງ Firefox ໄດ້ເກີດມີບັນຫາ. ກະລູນາລອງໃຫມ່ອີກຄັ້ງ."
},
"unshootablePageErrorTitle": {
"message": "ພວກເຮົາບໍ່ສາມາດຖ່າຍຮູບຫນ້າຈໍຂອງຫນ້ານີ້ໄດ້."
},
"unshootablePageErrorDetails": {
"message": "ນີ້ບໍ່ແມ່ນຫນ້າເວັບມາດຕະຖານ, ສະນັ້ນທ່ານຈຶ່ງບໍ່ສາມາດຖ່າຍພາບຫນ້າຈໍໄດ້."
},
"selfScreenshotErrorTitle": {
"message": "ທ່ານບໍ່ສາມາດຖ່າຍພາບຫນ້າຈໍຂອງ Firefox ໄດ້!"
},
"genericErrorTitle": {
"message": "ໂອ! Firefox Screenshots ລວນ."
},
"genericErrorDetails": {
"message": "ພວກເຮົາບໍ່ແນ່ໃຈວ່າມັນຫາກະເກີດຫຍັງຂື້ນ. ກະລຸນາລອງໃຫມ່ອີກຄັ້ງ ຫລື ຖ່າຍພາບຫນ້າຈໍອື່ນລອງເບິງ"
},
"tourBodyOne": {
"message": "ຖ່າຍ, ບັນທຶກ ແລະ ແບ່ງປັນພາບຫນ້າຈໍໂດຍບໍ່ຕ້ອງອອກຈາກ Firefox."
},
"tourHeaderTwo": {
"message": "ຖ່າຍພາບຕາມທີ່ທ່ານຕ້ອງການ"
},
"tourBodyTwo": {
"message": "ຄິກ ຫລື ລາກເພື່ອຖ່າຍພາບສະເພາະບາງສ່ວນຂອງຫນ້າເວັບ. ພ້ອມດຽວກັນນັ້ນທ່ານຍັງສາມາດເລື່ອນມາເພື່ອເນັ້ນພາບທີ່ທ່ານເລືອກ."
},
"tourHeaderThree": {
"message": "ຕາມທີ່ທ່ານມັກ"
},
"tourBodyThree": {
"message": "ບັນທຶກຮູບພາບທີ່ທ່ານໄດ້ຄັອບເອົາໄວ້ລົງໄປໄວ້ໃນເວັບເພື່ອເຮັດໃຫ້ແບ່ງປັນໄດ້ງ່າຍ ຫລື ດາວໂຫລດໄປໄວ້ໃນຄອມພິວເຕີຂອງທ່ານ. ທ່ານຍັງສາມາດຄິກໃສ່ໃນປຸ່ມກົດ \"ຮູບພາບຂອງຂ້ອຍ\" ເພື່ອຊອກຫາຮູບພາບທັງຫມົດທີ່ທ່ານໄດ້ຖ່າຍເອົາໄວ້."
},
"tourHeaderFour": {
"message": "ຖ່າຍພາບວິນໂດ ຫລື ຫມົດທັ້ງຫນ້າ"
},
"tourBodyFour": {
"message": "ເລືອກປຸ່ມກົດທີ່ຢູ່ເທິງເບື້ອງຂວາມືເພື່ອຈັບພາບໃນບໍລິເວນທີ່ເບິງເຫັນໄດ້ໃນວິນໂດ ຫລື ເພື່ອຈັບພາບທັງຫມົດໃນຫນ້າເວັບ."
},
"tourSkip": {
"message": "ຂ້າມໄປ"
},
@ -34,5 +102,22 @@
},
"tourDone": {
"message": "ສຳເລັດ"
},
"termsAndPrivacyNoticeCloudServices": {
"message": "ການນຳໃຊ້ Firefox Screenshots ແມ່ນທ່ານໄດ້ຍອມຮັບເງືອນໄຂການໃຫ້ບໍລິການຂອງ Firefox Cloud Services $TERMSANDPRIVACYNOTICETERMSLINK$ ແລະ $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
},
"termsandprivacynoticeprivacylink": {
"content": "$2"
}
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "ຂໍ້ກຳນົດ"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "ຄຳເຕືອນກ່ຽວກັບຄວາມເປັນສ່ວນຕົວ"
}
}

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Baigta"
},
"termsAndPrivacyNotice": {
"message": "Naudodamiesi „Firefox Screenshots“, sutinkate su jų $TERMSANDPRIVACYNOTICETERMSLINK$ ir $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Naudodami „Firefox Screenshots“ sutinkate su „Firefox“ tinklo paslaugų $TERMSANDPRIVACYNOTICETERMSLINK$ bei $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -102,5 +102,22 @@
},
"tourDone": {
"message": "Selesai"
},
"termsAndPrivacyNoticeCloudServices": {
"message": "Dengan menggunakan Firefox Screenshots, anda bersetuju dengan $TERMSANDPRIVACYNOTICETERMSLINK$ dan $TERMSANDPRIVACYNOTICEPRIVACYLINK$ Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
},
"termsandprivacynoticeprivacylink": {
"content": "$2"
}
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "Terma"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "Notis Privasi"
}
}

View File

@ -0,0 +1,74 @@
{
"addonDescription": {
"message": "ဝဘ်ထံမှ ဓါတ်ပုံများနှင့် မျက်နှာပြင်ပုံဖမ်းချက်များကို ရိုက်ယူပြီး ယာယီ သို့မဟုတ် အမြဲတမ်းသိုလှောင်ရာတွင် သိမ်းဆည်းပါ။"
},
"addonAuthorsList": {
"message": "Mozilla <screenshots-feedback@mozilla.org>"
},
"contextMenuLabel": {
"message": "မျက်နှာပြင်ပုံရိပ် ဖမ်းယူပါ"
},
"myShotsLink": {
"message": "ရိုက်ကူးထားသော ပုံများ"
},
"saveScreenshotSelectedArea": {
"message": "သိမ်းရန်"
},
"saveScreenshotVisibleArea": {
"message": "မြင်ရသည်များကို သိမ်းပါ"
},
"saveScreenshotFullPage": {
"message": "စာမျက်နှာတစ်ခုလုံးကို သိမ်းပါ"
},
"cancelScreenshot": {
"message": "မဆောင်ရွက်တော့ပါ"
},
"downloadScreenshot": {
"message": "ဆွဲယူရန်"
},
"notificationLinkCopiedTitle": {
"message": "လင့်ခ်ကို ကူယူပြီး"
},
"requestErrorTitle": {
"message": "ပျက်နေသည်"
},
"requestErrorDetails": {
"message": "စိတ်မကောင်းပါ၊ သင်ရိုက်ကူးထားသော ပုံကို မသိမ်းနိုင်ပါ။ နောင်တွင် ပြန်စမ်းကြည့်ပါ။"
},
"connectionErrorTitle": {
"message": "သင်ရိုက်ကူးထားသော မျက်နှာပြင်ပုံရိပ်များထံ မချိတ်ဆက်နိုင်ပါ။"
},
"unshootablePageErrorTitle": {
"message": "ဒီစာမျက်နှာ၏ မျက်နှာပြင်ပုံရိပ်ကို မရိုက်ကူးနိုင်ပါ။"
},
"tourBodyOne": {
"message": "Firefox ကနေ ထွက်ခွာရန် မလိုဘဲ မျက်နှာပြင်ပုံရိပ်များကို ရိုက်ကူး၊ သိမ်းဆည်း၊ မျှဝေပါ။"
},
"tourHeaderTwo": {
"message": "ကိုယ်နှစ်သက်ရာ စာမျက်နှာများကို ဖမ်းယူပါ"
},
"tourHeaderThree": {
"message": "နှစ်သက်သလို"
},
"tourHeaderFour": {
"message": "ဝင်ဒိုးများ သို့မဟုတ် စာမျက်နှာတစ်ခုလုံးကို ဖမ်းယူပါ"
},
"tourSkip": {
"message": "SKIP"
},
"tourNext": {
"message": "နောက်ဆလိုက်"
},
"tourPrevious": {
"message": "အရင်ကဆလိုက်"
},
"tourDone": {
"message": "ပြီးပြီ"
},
"termsAndPrivacyNoticeTermsLink": {
"message": "စကားရပ်များ"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "ကိုယ်ရေးကာကွယ်မှု သတိပေးချက်"
}
}

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Ferdig"
},
"termsAndPrivacyNotice": {
"message": "Ved å bruke Firefox Screenshots, godtar du $TERMSANDPRIVACYNOTICETERMSLINK$ og $TERMSANDPRIVACYNOTICEPRIVACYLINK$ for Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Ved å bruke Firefox Screenshots, godtar du $TERMSANDPRIVACYNOTICETERMSLINK$ og $TERMSANDPRIVACYNOTICEPRIVACYLINK$ for Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Gereed"
},
"termsAndPrivacyNotice": {
"message": "Door Firefox Screenshots te gebruiken, gaat u akkoord met de $TERMSANDPRIVACYNOTICETERMSLINK$ en $TERMSANDPRIVACYNOTICEPRIVACYLINK$ van Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Door Firefox Screenshots te gebruiken, gaat u akkoord met de $TERMSANDPRIVACYNOTICETERMSLINK$ en $TERMSANDPRIVACYNOTICEPRIVACYLINK$ van Firefox-cloudservices.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Ferdig"
},
"termsAndPrivacyNotice": {
"message": "Ved å bruke Firefox Screenshots, godtar du $TERMSANDPRIVACYNOTICETERMSLINK$ og $TERMSANDPRIVACYNOTICEPRIVACYLINK$ for Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Ved å bruke Firefox Screenshots, godtar du $TERMSANDPRIVACYNOTICETERMSLINK$ og $TERMSANDPRIVACYNOTICEPRIVACYLINK$ for Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Zamknij"
},
"termsAndPrivacyNotice": {
"message": "Używając Firefox Screenshots, zgadzasz się na $TERMSANDPRIVACYNOTICETERMSLINK$ i $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Używając Firefox Screenshots, zgadzasz się na $TERMSANDPRIVACYNOTICETERMSLINK$ i $TERMSANDPRIVACYNOTICEPRIVACYLINK$ usług Firefox Cloud.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
@ -115,7 +115,7 @@
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "warunki korzystania z usługi"
"message": "warunki korzystania"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "zasady ochrony prywatności"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Concluir"
},
"termsAndPrivacyNotice": {
"message": "Usando Firefox Screenshots, você concorda com os $TERMSANDPRIVACYNOTICETERMSLINK$ e $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Usando o Firefox Screenshots, você concorda com os $TERMSANDPRIVACYNOTICETERMSLINK$ e $TERMSANDPRIVACYNOTICEPRIVACYLINK$ dos serviços na nuvem do Firefox .",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Feito"
},
"termsAndPrivacyNotice": {
"message": "Ao utilizar o Firefox Screenshots, você concorda com os $TERMSANDPRIVACYNOTICETERMSLINK$ e com a $TERMSANDPRIVACYNOTICEPRIVACYLINK$ do Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Ao utilizar as Capturas de ecrã Firefox, você concorda com os $TERMSANDPRIVACYNOTICETERMSLINK$ e a $TERMSANDPRIVACYNOTICEPRIVACYLINK$ do Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Finì"
},
"termsAndPrivacyNotice": {
"message": "Cun utilisar Firefox Screenshots accepteschas ti $TERMSANDPRIVACYNOTICETERMSLINK$ e $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Cun utilisar Firefox Screenshots accepteschas ti $TERMSANDPRIVACYNOTICETERMSLINK$ e $TERMSANDPRIVACYNOTICEPRIVACYLINK$ da Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -0,0 +1,38 @@
{
"addonDescription": {
"message": "Realizează decupaje și capturi de ecran de pe web și salvează-le temporar sau permanent."
},
"contextMenuLabel": {
"message": "Realizează o captură de ecran"
},
"myShotsLink": {
"message": "Capturile mele"
},
"saveScreenshotSelectedArea": {
"message": "Salvează"
},
"cancelScreenshot": {
"message": "Renunță"
},
"downloadScreenshot": {
"message": "Descarcă"
},
"notificationLinkCopiedTitle": {
"message": "Link copiat"
},
"tourSkip": {
"message": "OMITE"
},
"tourNext": {
"message": "Diapozitivul următor"
},
"tourPrevious": {
"message": "Diapozitivul anterior"
},
"termsAndPrivacyNoticeTermsLink": {
"message": "Termenii"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "Politica de confidenţialitate"
}
}

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Готово"
},
"termsAndPrivacyNotice": {
"message": "Используя Firefox Screenshots, вы соглашаетесь с его $TERMSANDPRIVACYNOTICETERMSLINK$ и $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Используя Скриншоты Firefox, вы соглашаетесь с $TERMSANDPRIVACYNOTICETERMSLINK$ и $TERMSANDPRIVACYNOTICEPRIVACYLINK$ облачных сервисов Firefox.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Hotovo"
},
"termsAndPrivacyNotice": {
"message": "Používaním služby Firefox Screenshots vyjadrujete súhlas s $TERMSANDPRIVACYNOTICETERMSLINK$ služby Screenshots a so $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Používaním služby Firefox Screenshots súhlasíte s $TERMSANDPRIVACYNOTICETERMSLINK$ a $TERMSANDPRIVACYNOTICEPRIVACYLINK$ Firefox Cloud Services.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Končano"
},
"termsAndPrivacyNotice": {
"message": "Z uporabo razširitve Firefox Screenshots se strinjate s $TERMSANDPRIVACYNOTICETERMSLINK$ in $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Z uporabo Firefox Screenshots se strinjate s $TERMSANDPRIVACYNOTICETERMSLINK$ Firefoxovih storitev v oblaku in $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -1,7 +1,22 @@
{
"addonAuthorsList": {
"message": "Mozilla <screenshots-feedback@mozilla.org>"
},
"contextMenuLabel": {
"message": "Bëni një Foto"
},
"myShotsLink": {
"message": "Shkrepjet e Mia"
},
"saveScreenshotSelectedArea": {
"message": "Ruaje"
},
"saveScreenshotVisibleArea": {
"message": "Ruaj pjesën e dukshme"
},
"saveScreenshotFullPage": {
"message": "Ruaj krejt faqen"
},
"cancelScreenshot": {
"message": "Anuloje"
},
@ -10,5 +25,32 @@
},
"notificationLinkCopiedTitle": {
"message": "Lidhja u Kopjua"
},
"requestErrorDetails": {
"message": "Na ndjeni! Se ruajtëm dot foton tuaj. Ju lutemi, riprovoni më vonë."
},
"connectionErrorTitle": {
"message": "Slidhemi dot te fotot tuaja."
},
"unshootablePageErrorTitle": {
"message": "Sbëjmë dot foto të kësaj faqeje."
},
"tourHeaderTwo": {
"message": "Fiksoni Në Foto Aq Sa Doni"
},
"tourHeaderThree": {
"message": "Si Tju Pëlqejë"
},
"tourHeaderFour": {
"message": "Fiksoni Dritare ose Krejt Faqet"
},
"tourDone": {
"message": "U bë"
},
"termsAndPrivacyNoticeTermsLink": {
"message": "Kushte"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "Shënim Privatësie"
}
}

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Готово"
},
"termsAndPrivacyNotice": {
"message": "Коришћењем услуге Firefox Screenshots, слажете се са $TERMSANDPRIVACYNOTICETERMSLINK$ и $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Коришћењем Firefox Screenshots-а, прихватате Firefox Cloud Services $TERMSANDPRIVACYNOTICETERMSLINK$ и $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Färdig"
},
"termsAndPrivacyNotice": {
"message": "Genom att använda Firefox Screenshots, godkänner du $TERMSANDPRIVACYNOTICETERMSLINK$ och $TERMSANDPRIVACYNOTICEPRIVACYLINK$ för Screenshots.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Genom att använda Firefox Screenshots, godkänner du $TERMSANDPRIVACYNOTICETERMSLINK$ och $TERMSANDPRIVACYNOTICEPRIVACYLINK$ för Firefox molntjänster.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -0,0 +1,50 @@
{
"addonAuthorsList": {
"message": "Mozilla <screenshots-feedback@mozilla.org>"
},
"contextMenuLabel": {
"message": "ఒక తెరపట్టు తీసుకోండి"
},
"myShotsLink": {
"message": "నా షాట్లు"
},
"saveScreenshotSelectedArea": {
"message": "భద్రపరచు"
},
"saveScreenshotFullPage": {
"message": "పూర్తి పేజీని భద్రపరచు"
},
"cancelScreenshot": {
"message": "రద్దుచేయి"
},
"downloadScreenshot": {
"message": "దింపుకోండి"
},
"notificationLinkCopiedTitle": {
"message": "లంకె కాపీ అయింది"
},
"requestErrorDetails": {
"message": "క్షమిచండి! మీ తెరను భద్రపరచలేకపోయాం. దయచేసి కాసేపాగి మళ్ళీ ప్రయత్నించండి."
},
"tourHeaderThree": {
"message": "మీకు నచ్చినట్టుగా"
},
"tourSkip": {
"message": "దాటవేయి"
},
"tourNext": {
"message": "తర్వాతి ఫలకం"
},
"tourPrevious": {
"message": "మునుపటి ఫలకం"
},
"tourDone": {
"message": "పూర్తయింది"
},
"termsAndPrivacyNoticeTermsLink": {
"message": "నియమాలు"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "అంతరంగికత గమనిక"
}
}

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "เสร็จสิ้น"
},
"termsAndPrivacyNotice": {
"message": "เพื่อใช้ Firefox Screenshots คุณยอมรับ $TERMSANDPRIVACYNOTICETERMSLINK$ และ $TERMSANDPRIVACYNOTICEPRIVACYLINK$ ของ Screenshots",
"termsAndPrivacyNoticeCloudServices": {
"message": "สำหรับการใช้งาน Firefox Screenshots คุณยอมรับใน Firefox Cloud Services $TERMSANDPRIVACYNOTICETERMSLINK$ และ $TERMSANDPRIVACYNOTICEPRIVACYLINK$",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Tapos"
},
"termsAndPrivacyNotice": {
"message": "Sa pamamagitan ng paggamit ng Firefox screenshot, sumasang-ayon ka sa mga screenshot $TERMSANDPRIVACYNOTICETERMSLINK$ at $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Sa paggamit ng Firefox Screenshots, tinatanggap mo ang Firefox Cloud Services $TERMSANDPRIVACYNOTICETERMSLINK$ at $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Tamam"
},
"termsAndPrivacyNotice": {
"message": "Firefox Screenshots'ı kullandığınızda Screenshosts $TERMSANDPRIVACYNOTICETERMSLINK$ ve $TERMSANDPRIVACYNOTICEPRIVACYLINK$ kabul etmiş sayılırsınız.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Firefox Screenshots'ı kullandığınızda Firefox Bulut Hizmetleri'nin $TERMSANDPRIVACYNOTICETERMSLINK$ ve $TERMSANDPRIVACYNOTICEPRIVACYLINK$ kabul etmiş sayılırsınız.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "Готово"
},
"termsAndPrivacyNotice": {
"message": "Використовуючи Firefox Screenshots, ви погоджуєтеся з його $TERMSANDPRIVACYNOTICETERMSLINK$ та $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"termsAndPrivacyNoticeCloudServices": {
"message": "Використовуючи Firefox Screenshots, ви погоджуєтеся з умовами хмарних послуг Firefox: $TERMSANDPRIVACYNOTICETERMSLINK$ та $TERMSANDPRIVACYNOTICEPRIVACYLINK$.",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -64,6 +64,9 @@
"selfScreenshotErrorTitle": {
"message": "آپ Firefox اسکرین شاٹس صفحے! کی ایک شاٹ نہیں لے سکت"
},
"genericErrorTitle": {
"message": "لاجواب! Firefox Screenshots بہت مشہور ہو گیا۔"
},
"genericErrorDetails": {
"message": "ہمیں یقین نہیں کہ کیا ہوا تھا۔ خیال رکھ کر پھر کوشش کریں یا بھر مختلف صفحہ کی تصویرلیں؟"
},
@ -99,5 +102,22 @@
},
"tourDone": {
"message": "ہوگیا"
},
"termsAndPrivacyNoticeCloudServices": {
"message": "۔Firefox Screenshots کے استعمال کے ساتھ آپ Firefox Cloud Services کے $TERMSANDPRIVACYNOTICETERMSLINK$ اور $TERMSANDPRIVACYNOTICEPRIVACYLINK$ کے ساتھ متفق ہیں۔",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"
},
"termsandprivacynoticeprivacylink": {
"content": "$2"
}
}
},
"termsAndPrivacyNoticeTermsLink": {
"message": "شرائط"
},
"termsAndPrivacyNoticyPrivacyLink": {
"message": "اطلاع نامہ نجی نوعیت"
}
}

View File

@ -0,0 +1,64 @@
{
"addonAuthorsList": {
"message": "Mozilla <screenshots-feedback@mozilla.org>"
},
"contextMenuLabel": {
"message": "Rasmini olish"
},
"myShotsLink": {
"message": "Rasmlarim"
},
"screenshotInstructions": {
"message": "Hududni belgilash uchun sahifa ustiga tashlang yoki bosing. Chiqish uchun “ESC” tugmasidan foydalaning."
},
"saveScreenshotSelectedArea": {
"message": "Saqlash"
},
"saveScreenshotVisibleArea": {
"message": "Korinadiganini saqlash"
},
"saveScreenshotFullPage": {
"message": "Toliq sahifani saqlash"
},
"cancelScreenshot": {
"message": "Bekor qilish"
},
"downloadScreenshot": {
"message": "Yuklab olish"
},
"notificationLinkCopiedTitle": {
"message": "Havoladan nusxa olindi"
},
"notificationLinkCopiedDetails": {
"message": "Rasm havolasidan maxsus xotiraga nusxa olindi. Qoyish uchun $META_KEY$-V tugmalarini bosing.",
"placeholders": {
"meta_key": {
"content": "$1"
}
}
},
"requestErrorTitle": {
"message": "Xizmat hozircha ishlamayapti"
},
"requestErrorDetails": {
"message": "Uzr! Rasmni saqlay olmaymiz. Keyinroq urinib koring."
},
"connectionErrorTitle": {
"message": "Ekran rasmiga ulana olmadik."
},
"connectionErrorDetails": {
"message": "Internetga ulanishni tekshiring. Ulana olsangiz, demak Firefox Screenshot xizmatida vaqtinchalik muammo bolishi mumkin."
},
"loginErrorDetails": {
"message": "Olingan rasmni saqlay olmaymiz, chunki Firefox Screenshot xizmatida muammo mavjud. Keyinroq urinib koring."
},
"unshootablePageErrorTitle": {
"message": "Bu sahifani rasmga tushira olmaymiz."
},
"unshootablePageErrorDetails": {
"message": "Bu sahifa standart sahifa emas, shuning uchun uni rasmga tushira olmaymiz."
},
"selfScreenshotErrorTitle": {
"message": "Firefox Screenshot sahifasini rasmga tushirish mumkin emas!"
}
}

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "完成"
},
"termsAndPrivacyNotice": {
"message": "使用 Firefox Screenshots 即代表您同意 Screenshots 的$TERMSANDPRIVACYNOTICETERMSLINK$和$TERMSANDPRIVACYNOTICEPRIVACYLINK$。",
"termsAndPrivacyNoticeCloudServices": {
"message": "使用 Firefox Screenshots 即代表您同意 Firefox 云服务的$TERMSANDPRIVACYNOTICETERMSLINK$和$TERMSANDPRIVACYNOTICEPRIVACYLINK$。",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -103,8 +103,8 @@
"tourDone": {
"message": "完成"
},
"termsAndPrivacyNotice": {
"message": "使用 Firefox Screenshots代表您同意 Screenshots 的 $TERMSANDPRIVACYNOTICETERMSLINK$ 及 $TERMSANDPRIVACYNOTICEPRIVACYLINK$。",
"termsAndPrivacyNoticeCloudServices": {
"message": "繼續使用 Firefox Screenshots代表您同意 Firefox 雲端服務的 $TERMSANDPRIVACYNOTICETERMSLINK$ 以及 $TERMSANDPRIVACYNOTICEPRIVACYLINK$。",
"placeholders": {
"termsandprivacynoticetermslink": {
"content": "$1"

View File

@ -3,13 +3,13 @@
Should be applied *inside* catcher.watchFunction
*/
this.assertIsTrusted = function assertIsTrusted(handlerFunction) {
return function (event) {
if (! event) {
return function(event) {
if (!event) {
let exc = new Error("assertIsTrusted did not get an event");
exc.noPopup = true;
throw exc;
}
if (! event.isTrusted) {
if (!event.isTrusted) {
let exc = new Error(`Received untrusted event (type: ${event.type})`);
exc.noPopup = true;
throw exc;

View File

@ -2,23 +2,23 @@
"use strict";
this.analytics = (function () {
this.analytics = (function() {
let exports = {};
let telemetryPrefKnown = false;
let telemetryPref;
exports.sendEvent = function (action, label, options) {
exports.sendEvent = function(action, label, options) {
let eventCategory = "addon";
if (! telemetryPrefKnown) {
if (!telemetryPrefKnown) {
log.warn("sendEvent called before we were able to refresh");
return Promise.resolve();
}
if (! telemetryPref) {
if (!telemetryPref) {
log.info(`Cancelled sendEvent ${eventCategory}/${action}/${label || 'none'} ${JSON.stringify(options)}`);
return Promise.resolve();
}
if (typeof label == "object" && (! options)) {
if (typeof label == "object" && (!options)) {
options = label;
label = undefined;
}
@ -56,7 +56,7 @@ this.analytics = (function () {
});
};
exports.refreshTelemetryPref = function () {
exports.refreshTelemetryPref = function() {
return communication.sendToBootstrap("getTelemetryPref").then((result) => {
telemetryPrefKnown = true;
if (result === communication.NO_BOOTSTRAP) {

View File

@ -3,7 +3,7 @@
"use strict";
this.auth = (function () {
this.auth = (function() {
let exports = {};
let registrationInfo;
@ -25,7 +25,7 @@ this.auth = (function () {
}
}));
exports.getDeviceId = function () {
exports.getDeviceId = function() {
return registrationInfo && registrationInfo.deviceId;
};
@ -146,39 +146,38 @@ this.auth = (function () {
}
}
exports.getDeviceId = function () {
exports.getDeviceId = function() {
return registrationInfo.deviceId;
};
exports.authHeaders = function () {
exports.authHeaders = function() {
let initPromise = Promise.resolve();
if (! initialized) {
if (!initialized) {
initPromise = login();
}
return initPromise.then(() => {
if (authHeader) {
return {"x-screenshots-auth": authHeader};
} else {
log.warn("No auth header available");
return {};
}
log.warn("No auth header available");
return {};
});
};
exports.getSentryPublicDSN = function () {
exports.getSentryPublicDSN = function() {
return sentryPublicDSN || buildSettings.defaultSentryDsn;
};
exports.getAbTests = function () {
exports.getAbTests = function() {
return abTests;
};
exports.isRegistered = function () {
exports.isRegistered = function() {
return registrationInfo.registered;
};
exports.setDeviceInfoFromOldAddon = function (newDeviceInfo) {
if (! (newDeviceInfo.deviceId && newDeviceInfo.secret)) {
exports.setDeviceInfoFromOldAddon = function(newDeviceInfo) {
if (!(newDeviceInfo.deviceId && newDeviceInfo.secret)) {
throw new Error("Bad deviceInfo");
}
if (registrationInfo.deviceId === newDeviceInfo.deviceId &&
@ -199,17 +198,12 @@ this.auth = (function () {
communication.register("getAuthInfo", (sender, ownershipCheck) => {
let info = registrationInfo;
let done = Promise.resolve();
if (info.registered) {
done = login({ownershipCheck}).then((result) => {
if (result && result.isOwner) {
info.isOwner = true;
}
return login({ownershipCheck}).then((result) => {
return {isOwner: result && result.isOwner, deviceId: registrationInfo.deviceId};
});
}
return done.then(() => {
return info;
});
return Promise.resolve(info);
});
return exports;

View File

@ -2,18 +2,18 @@
"use strict";
this.communication = (function () {
this.communication = (function() {
let exports = {};
let registeredFunctions = {};
browser.runtime.onMessage.addListener(catcher.watchFunction((req, sender, sendResponse) => {
if (! (req.funcName in registeredFunctions)) {
if (!(req.funcName in registeredFunctions)) {
log.error(`Received unknown internal message type ${req.funcName}`);
sendResponse({type: "error", name: "Unknown message type"});
return;
}
if (! Array.isArray(req.args)) {
if (!Array.isArray(req.args)) {
log.error("Received message with no .args list");
sendResponse({type: "error", name: "No .args"});
return;
@ -26,7 +26,7 @@ this.communication = (function () {
} catch (e) {
log.error(`Error in ${req.funcName}:`, e, e.stack);
// FIXME: should consider using makeError from catcher here:
sendResponse({type: "error", message: e+""});
sendResponse({type: "error", message: e + "", errorCode: e.errorCode, popupMessage: e.popupMessage});
return;
}
if (result && result.then) {
@ -34,28 +34,26 @@ this.communication = (function () {
sendResponse({type: "success", value: concreteResult});
}).catch((errorResult) => {
log.error(`Promise error in ${req.funcName}:`, errorResult, errorResult && errorResult.stack);
sendResponse({type: "error", message: errorResult+""});
sendResponse({type: "error", message: errorResult + "", errorCode: errorResult.errorCode, popupMessage: errorResult.popupMessage});
});
return true;
} else {
sendResponse({type: "success", value: result});
}
sendResponse({type: "success", value: result});
}));
exports.register = function (name, func) {
exports.register = function(name, func) {
registeredFunctions[name] = func;
};
/** Send a message to bootstrap.js
Technically any worker can listen to this. If the bootstrap wrapper is not in place, then this
will *not* fail, and will return a value of exports.NO_BOOTSTRAP */
exports.sendToBootstrap = function (funcName, ...args) {
exports.sendToBootstrap = function(funcName, ...args) {
return browser.runtime.sendMessage({funcName, args}).then((result) => {
if (result.type === "success") {
return result.value;
} else {
throw new Error(`Error in ${funcName}: ${result.name || 'unknown'}`);
}
throw new Error(`Error in ${funcName}: ${result.name || 'unknown'}`);
}, (error) => {
if (isBootstrapMissingError(error)) {
return exports.NO_BOOTSTRAP;
@ -65,15 +63,15 @@ this.communication = (function () {
};
function isBootstrapMissingError(error) {
if (! error) {
if (!error) {
return false;
}
return error.errorCode === "NO_RECEIVING_END" ||
(! error.errorCode && error.message === "Could not establish connection. Receiving end does not exist.");
return ('errorCode' in error && error.errorCode === "NO_RECEIVING_END") ||
(!error.errorCode && error.message === "Could not establish connection. Receiving end does not exist.");
}
// A singleton/sentinal (with a name):
// A singleton/sentinel (with a name):
exports.NO_BOOTSTRAP = {name: "communication.NO_BOOTSTRAP"};
return exports;

View File

@ -2,7 +2,7 @@
"use strict";
this.deviceInfo = (function () {
this.deviceInfo = (function() {
let manifest = browser.runtime.getManifest();
let platformInfo = {};
@ -23,8 +23,8 @@ this.deviceInfo = (function () {
architecture: platformInfo.arch,
version: firefoxVersion || chromeVersion,
// These don't seem to apply to Chrome:
//build: system.build,
//platformVersion: system.platformVersion,
// build: system.build,
// platformVersion: system.platformVersion,
userAgent: navigator.userAgent,
appVendor: appName,
appName

View File

@ -1,9 +1,9 @@
/* globals browser, console, XMLHttpRequest, Image, document, setTimeout, navigator */
/* globals selectorLoader, analytics, communication, catcher, makeUuid, auth, senderror */
/* globals browser, XMLHttpRequest, Image, document, setTimeout, navigator */
/* globals selectorLoader, analytics, communication, catcher, log, makeUuid, auth, senderror */
"use strict";
this.main = (function () {
this.main = (function() {
let exports = {};
const pasteSymbol = (window.navigator.platform.match(/Mac/i)) ? "\u2318" : "Ctrl";
@ -15,8 +15,8 @@ this.main = (function () {
let hasSeenOnboarding;
browser.storage.local.get(["hasSeenOnboarding"]).then((result) => {
hasSeenOnboarding = !! result.hasSeenOnboarding;
if (! hasSeenOnboarding) {
hasSeenOnboarding = !!result.hasSeenOnboarding;
if (!hasSeenOnboarding) {
setIconActive(false, null);
// Note that the branded name 'Firefox Screenshots' is not localized:
browser.browserAction.setTitle({
@ -27,12 +27,12 @@ this.main = (function () {
log.error("Error getting hasSeenOnboarding:", error);
});
exports.setBackend = function (newBackend) {
exports.setBackend = function(newBackend) {
backend = newBackend;
backend = backend.replace(/\/*$/, "");
};
exports.getBackend = function () {
exports.getBackend = function() {
return backend;
};
@ -52,9 +52,9 @@ this.main = (function () {
}
function setIconActive(active, tabId) {
let path = active ? "icons/icon-highlight-38.png" : "icons/icon-38.png";
if ((! hasSeenOnboarding) && ! active) {
path = "icons/icon-starred-38.png";
let path = active ? "icons/icon-highlight-32.svg" : "icons/icon-32.svg";
if ((!hasSeenOnboarding) && !active) {
path = "icons/icon-starred-32.svg";
}
browser.browserAction.setIcon({path, tabId});
}
@ -72,13 +72,25 @@ this.main = (function () {
});
}
function startSelectionWithOnboarding(tab) {
return analytics.refreshTelemetryPref().then(() => {
return selectorLoader.testIfLoaded(tab.id);
}).then((isLoaded) => {
if (!isLoaded) {
sendEvent("start-shot", "site-request");
setIconActive(true, tab.id);
selectorLoader.toggle(tab.id, false);
}
});
}
function shouldOpenMyShots(url) {
return /^about:(?:newtab|blank)/i.test(url) || /^resource:\/\/activity-streams\//i.test(url);
}
browser.browserAction.onClicked.addListener(catcher.watchFunction((tab) => {
if (shouldOpenMyShots(tab.url)) {
if (! hasSeenOnboarding) {
if (!hasSeenOnboarding) {
catcher.watchPromise(analytics.refreshTelemetryPref().then(() => {
sendEvent("goto-onboarding", "selection-button");
return forceOnboarding();
@ -98,7 +110,7 @@ this.main = (function () {
const event = active ? "start-shot" : "cancel-shot";
sendEvent(event, "toolbar-button");
}, (error) => {
if ((! hasSeenOnboarding) && error.popupMessage == "UNSHOOTABLE_PAGE") {
if ((!hasSeenOnboarding) && error.popupMessage == "UNSHOOTABLE_PAGE") {
sendEvent("goto-onboarding", "selection-button");
return forceOnboarding();
}
@ -126,7 +138,7 @@ this.main = (function () {
});
browser.contextMenus.onClicked.addListener(catcher.watchFunction((info, tab) => {
if (! tab) {
if (!tab) {
// Not in a page/tab context, ignore
return;
}
@ -147,14 +159,14 @@ this.main = (function () {
function isShotOrMyShotPage(url) {
// It's okay to take a shot of any pages except shot pages and My Shots
if (! url.startsWith(backend)) {
if (!url.startsWith(backend)) {
return false;
}
let path = url.substr(backend.length).replace(/^\/*/, "").replace(/#.*/, "").replace(/\?.*/, "");
let path = url.substr(backend.length).replace(/^\/*/, "").replace(/[?#].*/, "");
if (path == "shots") {
return true;
}
if (/^[^/]+\/[^/]+$/.test(url)) {
if (/^[^/]+\/[^/]+$/.test(path)) {
// Blocks {:id}/{:domain}, but not /, /privacy, etc
return true;
}
@ -173,15 +185,28 @@ this.main = (function () {
return badDomains.includes(domain);
}
function enableButton(tabId) {
browser.browserAction.enable(tabId);
// We have to manually toggle the icon state, because disabled toolbar
// buttons aren't automatically dimmed for WebExtensions on Windows or
// Linux (bug 1204609).
setIconActive(false, tabId);
}
function disableButton(tabId) {
browser.browserAction.disable(tabId);
setIconActive(true, tabId);
}
browser.tabs.onUpdated.addListener(catcher.watchFunction((id, info, tab) => {
if (info.url && tab.active) {
if (urlEnabled(info.url)) {
browser.browserAction.enable(tab.id);
enableButton(tab.id);
} else if (hasSeenOnboarding) {
browser.browserAction.disable(tab.id);
disableButton(tab.id);
}
}
}));
}, true));
browser.tabs.onActivated.addListener(catcher.watchFunction(({tabId, windowId}) => {
catcher.watchPromise(browser.tabs.get(tabId).then((tab) => {
@ -190,11 +215,11 @@ this.main = (function () {
return;
}
if (urlEnabled(tab.url)) {
browser.browserAction.enable(tabId);
enableButton(tabId);
} else if (hasSeenOnboarding) {
browser.browserAction.disable(tabId);
disableButton(tabId);
}
}));
}), true);
}));
communication.register("sendEvent", (sender, ...args) => {
@ -227,9 +252,23 @@ this.main = (function () {
const binary = atob(info.url.split(',')[1]); // just the base64 data
const data = Uint8Array.from(binary, char => char.charCodeAt(0))
const blob = new Blob([data], {type: "image/png"})
let url = URL.createObjectURL(blob);
let downloadId;
let onChangedCallback = catcher.watchFunction(function(change) {
if (!downloadId || downloadId != change.id) {
return;
}
if (change.state && change.state.current != "in_progress") {
URL.revokeObjectURL(url);
browser.downloads.onChanged.removeListener(onChangedCallback);
}
});
browser.downloads.onChanged.addListener(onChangedCallback)
return browser.downloads.download({
url: URL.createObjectURL(blob),
url,
filename: info.filename
}).then((id) => {
downloadId = id;
});
});
@ -238,7 +277,7 @@ this.main = (function () {
});
catcher.watchPromise(communication.sendToBootstrap("getOldDeviceInfo").then((deviceInfo) => {
if (deviceInfo === communication.NO_BOOTSTRAP || ! deviceInfo) {
if (deviceInfo === communication.NO_BOOTSTRAP || !deviceInfo) {
return;
}
deviceInfo = JSON.parse(deviceInfo);
@ -272,5 +311,20 @@ this.main = (function () {
});
});
// Note: this signal is only needed until bug 1357589 is fixed.
communication.register("openTermsPage", () => {
return catcher.watchPromise(browser.tabs.create({url: "https://www.mozilla.org/about/legal/terms/services/"}));
});
// Note: this signal is also only needed until bug 1357589 is fixed.
communication.register("openPrivacyPage", () => {
return catcher.watchPromise(browser.tabs.create({url: "https://www.mozilla.org/privacy/firefox-cloud/"}));
});
// A Screenshots page wants us to start/force onboarding
communication.register("requestOnboarding", (sender) => {
return startSelectionWithOnboarding(sender.tab);
});
return exports;
})();

View File

@ -2,7 +2,9 @@
"use strict";
this.selectorLoader = (function () {
var global = this;
this.selectorLoader = (function() {
const exports = {};
// These modules are loaded in order, first standardScripts, then optionally onboardingScripts, and then selectorScripts
@ -37,7 +39,7 @@ this.selectorLoader = (function () {
"onboarding/slides.js"
];
exports.unloadIfLoaded = function (tabId) {
exports.unloadIfLoaded = function(tabId) {
return browser.tabs.executeScript(tabId, {
code: "this.selectorLoader && this.selectorLoader.unloadModules()",
runAt: "document_start"
@ -46,12 +48,35 @@ this.selectorLoader = (function () {
});
};
exports.loadModules = function (tabId, hasSeenOnboarding) {
if (hasSeenOnboarding) {
return executeModules(tabId, standardScripts.concat(selectorScripts));
} else {
return executeModules(tabId, standardScripts.concat(onboardingScripts).concat(selectorScripts));
exports.testIfLoaded = function(tabId) {
if (loadingTabs.has(tabId)) {
return true;
}
return browser.tabs.executeScript(tabId, {
code: "!!this.selectorLoader",
runAt: "document_start"
}).then(result => {
return result && result[0];
});
};
let loadingTabs = new Set();
exports.loadModules = function(tabId, hasSeenOnboarding) {
let promise;
loadingTabs.add(tabId);
if (hasSeenOnboarding) {
promise = executeModules(tabId, standardScripts.concat(selectorScripts));
} else {
promise = executeModules(tabId, standardScripts.concat(onboardingScripts).concat(selectorScripts));
}
return promise.then((result) => {
loadingTabs.delete(tabId);
return result;
}, (error) => {
loadingTabs.delete(tabId);
throw error;
});
};
function executeModules(tabId, scripts) {
@ -79,7 +104,7 @@ this.selectorLoader = (function () {
});
}
exports.unloadModules = function () {
exports.unloadModules = function() {
const watchFunction = catcher.watchFunction;
let allScripts = standardScripts.concat(onboardingScripts).concat(selectorScripts);
const moduleNames = allScripts.map((filename) =>
@ -99,7 +124,7 @@ this.selectorLoader = (function () {
return true;
};
exports.toggle = function (tabId, hasSeenOnboarding) {
exports.toggle = function(tabId, hasSeenOnboarding) {
return exports.unloadIfLoaded(tabId)
.then(wasLoaded => {
if (!wasLoaded) {

View File

@ -2,9 +2,11 @@
"use strict";
this.senderror = (function () {
this.senderror = (function() {
let exports = {};
let manifest = browser.runtime.getManifest();
// Do not show an error more than every ERROR_TIME_LIMIT milliseconds:
const ERROR_TIME_LIMIT = 3000;
@ -48,14 +50,14 @@ this.senderror = (function () {
let lastErrorTime;
exports.showError = function (error) {
exports.showError = function(error) {
if (lastErrorTime && (Date.now() - lastErrorTime) < ERROR_TIME_LIMIT) {
return;
}
lastErrorTime = Date.now();
let id = makeUuid();
let popupMessage = error.popupMessage || "generic";
if (! messages[popupMessage]) {
if (!messages[popupMessage]) {
popupMessage = "generic";
}
let title = messages[popupMessage].title;
@ -76,38 +78,38 @@ this.senderror = (function () {
});
};
exports.reportError = function (e) {
exports.reportError = function(e) {
if (!analytics.getTelemetryPrefSync()) {
log.error("Telemetry disabled. Not sending critical error:", e);
return;
}
let dsn = auth.getSentryPublicDSN();
if (! dsn) {
if (!dsn) {
log.warn("Error:", e);
return;
}
if (! Raven.isSetup()) {
if (!Raven.isSetup()) {
Raven.config(dsn).install();
}
let exception = new Error(e.message);
exception.stack = e.multilineStack || e.stack || undefined;
let rest = {};
for (let attr in e) {
if (! ["name", "message", "stack", "multilineStack", "popupMessage", "version", "sentryPublicDSN", "help"].includes(attr)) {
if (!["name", "message", "stack", "multilineStack", "popupMessage", "version", "sentryPublicDSN", "help"].includes(attr)) {
rest[attr] = e[attr];
}
}
rest.stack = e.multilineStack || e.stack;
Raven.captureException(exception, {
logger: 'addon',
tags: {version: e.version, category: e.popupMessage},
tags: {version: manifest.version, category: e.popupMessage},
message: exception.message,
extra: rest
});
};
catcher.registerHandler((errorObj) => {
if (! errorObj.noPopup) {
if (!errorObj.noPopup) {
exports.showError(errorObj);
}
exports.reportError(errorObj);

View File

@ -2,7 +2,7 @@
"use strict";
this.takeshot = (function () {
this.takeshot = (function() {
let exports = {};
const Shot = shot.AbstractShot;
const { sendEvent } = analytics;
@ -10,9 +10,10 @@ this.takeshot = (function () {
communication.register("takeShot", catcher.watchFunction((sender, options) => {
let { captureType, captureText, scroll, selectedPos, shotId, shot } = options;
shot = new Shot(main.getBackend(), shotId, shot);
shot.favicon = sender.tab.favIconUrl;
let capturePromise = Promise.resolve();
let openedTab;
if (! shot.clipNames().length) {
if (!shot.clipNames().length) {
// canvas.drawWindow isn't available, so we fall back to captureVisibleTab
capturePromise = screenshotPage(selectedPos, scroll).then((dataUrl) => {
shot.addClip({
@ -100,16 +101,15 @@ this.takeshot = (function () {
return auth.authHeaders().then((headers) => {
headers["content-type"] = "application/json";
let body = JSON.stringify(shot.asJson());
let req = new Request(shot.jsonUrl, {
sendEvent("upload", "started", {eventValue: Math.floor(body.length / 1000)});
return fetch(shot.jsonUrl, {
method: "PUT",
mode: "cors",
headers,
body
});
sendEvent("upload", "started", {eventValue: Math.floor(body.length / 1000)});
return fetch(req);
}).then((resp) => {
if (! resp.ok) {
if (!resp.ok) {
sendEvent("upload-failed", `status-${resp.status}`);
let exc = new Error(`Response failed with status ${resp.status}`);
exc.popupMessage = "REQUEST_ERROR";
@ -120,6 +120,7 @@ this.takeshot = (function () {
}, (error) => {
// FIXME: I'm not sure what exceptions we can expect
sendEvent("upload-failed", "connection");
error.popupMessage = "CONNECTION_ERROR";
throw error;
});
}

View File

@ -1,5 +1,5 @@
window.buildSettings = {
defaultSentryDsn: "",
defaultSentryDsn: "https://97d8afa496f94764ae255e739b147f4b@sentry.prod.mozaws.net/139",
logLevel: "" || "warn"
};
null;

View File

@ -16,7 +16,7 @@ window.inlineSelectionCss = `
position: relative;
text-align: center;
text-decoration: none;
transition: background 150ms;
transition: background 150ms cubic-bezier(0.07, 0.95, 0, 1), border 150ms cubic-bezier(0.07, 0.95, 0, 1);
user-select: none;
white-space: nowrap; }
.button.small, .small.highlight-button-cancel, .small.highlight-button-save, .small.highlight-button-download {
@ -24,70 +24,80 @@ window.inlineSelectionCss = `
line-height: 32px;
padding: 0 8px; }
.button.tiny, .tiny.highlight-button-cancel, .tiny.highlight-button-save, .tiny.highlight-button-download {
font-size: 12px;
height: 22px;
line-height: 12px;
padding: 2px 6px; }
font-size: 14px;
height: 26px;
border: 1px solid #c7c7c7; }
.button.tiny:hover, .tiny.highlight-button-cancel:hover, .tiny.highlight-button-save:hover, .tiny.highlight-button-download:hover, .button.tiny:focus, .tiny.highlight-button-cancel:focus, .tiny.highlight-button-save:focus, .tiny.highlight-button-download:focus {
background: #ebebeb;
border-color: #989898; }
.button.tiny:active, .tiny.highlight-button-cancel:active, .tiny.highlight-button-save:active, .tiny.highlight-button-download:active {
background: #dedede;
border-color: #989898; }
.button.set-width--medium, .set-width--medium.highlight-button-cancel, .set-width--medium.highlight-button-save, .set-width--medium.highlight-button-download {
max-width: 200px; }
.button.inline, .inline.highlight-button-cancel, .inline.highlight-button-save, .inline.highlight-button-download {
display: inline-block; }
.button.block-button, .block-button.highlight-button-cancel, .block-button.highlight-button-save, .block-button.highlight-button-download {
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
border: none;
border-right: 1px solid rgba(0, 0, 0, 0.1);
border-right: 1px solid #c7c7c7;
box-shadow: none;
border-radius: 0;
height: 100%;
line-height: 100%;
padding: 0 20px;
margin-right: 20px;
flex: 0 0 155px; }
.button .arrow-icon, .highlight-button-cancel .arrow-icon, .highlight-button-save .arrow-icon, .highlight-button-download .arrow-icon {
display: inline-block;
position: relative;
top: 1px;
flex: 0 0 18px;
height: 16px;
opacity: .6;
background-image: url(../img/arrow-page-right-16.svg);
background-position: right center;
background-repeat: no-repeat; }
flex-shrink: 0;
font-size: 20px;
height: 100px;
line-height: 100%; }
@media (max-width: 719px) {
.button.block-button, .block-button.highlight-button-cancel, .block-button.highlight-button-save, .block-button.highlight-button-download {
justify-content: flex-start;
padding: 10px;
font-size: 16px;
height: 72px;
flex: 1 0;
margin-right: 10px; } }
.button.block-button:hover, .block-button.highlight-button-cancel:hover, .block-button.highlight-button-save:hover, .block-button.highlight-button-download:hover {
background: #ebebeb; }
.button.block-button:active, .block-button.highlight-button-cancel:active, .block-button.highlight-button-save:active, .block-button.highlight-button-download:active {
background: #dedede; }
.inverse-color-scheme {
background: #383E49;
color: #FFF; }
background: #3e3d40;
color: #f5f5f7; }
.inverse-color-scheme a {
color: #0996F8; }
.inverse-color-scheme .large-icon {
filter: invert(100%); }
color: #e1e1e6; }
.default-color-scheme {
background: #f2f2f2;
color: #000; }
background: #f5f5f7;
color: #3e3d40; }
.default-color-scheme a {
color: #0996F8; }
color: #009ec0; }
.highlight-color-scheme {
background: #009ec0;
color: #fff; }
.highlight-color-scheme a {
color: #fff;
text-decoration: underline; }
.button.primary, .primary.highlight-button-cancel, .highlight-button-save, .primary.highlight-button-download {
background-color: #0996F8;
color: #FFF; }
background-color: #009ec0;
color: #fff; }
.button.primary:hover, .primary.highlight-button-cancel:hover, .highlight-button-save:hover, .primary.highlight-button-download:hover, .button.primary:focus, .primary.highlight-button-cancel:focus, .highlight-button-save:focus, .primary.highlight-button-download:focus {
background-color: #0681d7; }
background-color: #00819c; }
.button.primary:active, .primary.highlight-button-cancel:active, .highlight-button-save:active, .primary.highlight-button-download:active {
background-color: #0573be; }
background-color: #006c83; }
.button.secondary, .highlight-button-cancel, .secondary.highlight-button-save, .highlight-button-download {
background: #EDEDED;
color: #000; }
.button.secondary:hover, .highlight-button-cancel:hover, .secondary.highlight-button-save:hover, .highlight-button-download:hover, .button.secondary:focus, .highlight-button-cancel:focus, .secondary.highlight-button-save:focus, .highlight-button-download:focus {
background-color: #dbdbdb; }
.button.secondary:active, .highlight-button-cancel:active, .secondary.highlight-button-save:active, .highlight-button-download:active {
background-color: #cecece; }
background-color: #f5f5f7;
color: #3e3d40; }
.button.secondary:hover, .highlight-button-cancel:hover, .secondary.highlight-button-save:hover, .highlight-button-download:hover {
background-color: #ebebeb; }
.button.secondary:hover, .highlight-button-cancel:hover, .secondary.highlight-button-save:hover, .highlight-button-download:hover {
background-color: #dedede; }
.button.warning, .warning.highlight-button-cancel, .warning.highlight-button-save, .warning.highlight-button-download {
color: #FFF;
color: #fff;
background: #d92215; }
.button.warning:hover, .warning.highlight-button-cancel:hover, .warning.highlight-button-save:hover, .warning.highlight-button-download:hover, .button.warning:focus, .warning.highlight-button-cancel:focus, .warning.highlight-button-save:focus, .warning.highlight-button-download:focus {
background: #b81d12; }
@ -95,7 +105,7 @@ window.inlineSelectionCss = `
background: #a11910; }
.subtitle-link {
color: #0996F8; }
color: #009ec0; }
@keyframes fade-in {
0% {
@ -219,7 +229,7 @@ window.inlineSelectionCss = `
transform: scale(1.05); }
.mover {
background-color: #FFF;
background-color: #fff;
border-radius: 50%;
box-shadow: 0 0 4px rgba(0, 0, 0, 0.5);
height: 16px;
@ -288,9 +298,11 @@ window.inlineSelectionCss = `
z-index: 6; }
.bottom-selection .highlight-buttons {
bottom: 5px; }
.left-selection .highlight-buttons {
right: auto;
left: 5px; }
.highlight-button-cancel {
background-color: #ededed;
background-image: url("MOZ_EXTENSION/icons/cancel.svg");
background-position: center center;
background-repeat: no-repeat;
@ -304,7 +316,6 @@ window.inlineSelectionCss = `
min-width: 80px; }
.highlight-button-download {
background-color: #ededed;
background-image: url("MOZ_EXTENSION/icons/download.svg");
background-position: center center;
background-repeat: no-repeat;
@ -313,15 +324,6 @@ window.inlineSelectionCss = `
margin: 5px;
width: 40px; }
.highlight-button-cancel,
.highlight-button-download {
transition: background-color cubic-bezier(0.07, 0.95, 0, 1) 250ms; }
.highlight-button-cancel:hover, .highlight-button-cancel:focus, .highlight-button-cancel:active,
.highlight-button-download:hover,
.highlight-button-download:focus,
.highlight-button-download:active {
background-color: #dbdbdb; }
.pixel-dimensions {
position: absolute;
pointer-events: none;
@ -344,6 +346,49 @@ window.inlineSelectionCss = `
top: 0;
width: 100%; }
.face-container {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
width: 64px;
height: 64px;
transform: translateY(-45px); }
.eye {
background-color: #fff;
width: 10.8px;
height: 14.6px;
position: absolute;
border-radius: 100%;
overflow: hidden;
left: 16.4px;
top: 19.8px; }
.eyeball {
position: absolute;
width: 6px;
height: 6px;
background-color: #000;
border-radius: 50%;
left: 2.4px;
top: 4.3px;
z-index: 10; }
.left {
margin-left: 0; }
.right {
margin-left: 20px; }
.face {
width: 62.4px;
height: 62.4px;
display: block;
background-image: url("MOZ_EXTENSION/icons/icon-welcome-face-without-eyes.svg"); }
.preview-instructions {
display: flex;
align-items: center;
@ -354,7 +399,8 @@ window.inlineSelectionCss = `
font-size: 24px;
line-height: 32px;
text-align: center;
width: 400px; }
width: 400px;
margin-top: 45px; }
.myshots-all-buttons-container {
display: flex;
@ -412,7 +458,7 @@ window.inlineSelectionCss = `
/* styleMyShotsButton test: */
.styleMyShotsButton-bright .myshots-button {
color: #fff;
background: #0996F8; }
background: #009ec0; }
.styleMyShotsButton-bright .myshots-text-pre,
.styleMyShotsButton-bright .myshots-text-post {

View File

@ -62,7 +62,7 @@ body {
align-items: center;
flex-direction: column;
justify-content: center;
background-color: #f2f2f2;
background-color: #f5f5f7;
border-radius: 5px;
height: 520px;
overflow: hidden;
@ -91,8 +91,7 @@ body {
color: #fff;
font-size: 16px;
margin-left: 5px;
padding: 2px;
text-transform: uppercase; }
padding: 2px; }
.slide p {
animation-duration: 350ms;
font-size: 16px;
@ -146,7 +145,7 @@ body {
.goto-slide {
background: transparent;
background-color: #f2f2f2;
background-color: #f5f5f7;
border-radius: 50%;
border: 0;
flex: 0 0 9px;
@ -182,6 +181,7 @@ body {
width: 70px; }
#prev {
background-image: url("MOZ_EXTENSION/icons/back.svg");
left: 50%;
margin-left: -385px; }
@ -196,9 +196,22 @@ body {
background-position: center center;
background-repeat: no-repeat;
background-size: 20px 20px; }
#prev:hover,
#next:hover,
#done:hover {
background-color: #fff;
background-size: 22px 22px; }
#prev:active,
#next:active,
#done:active {
background-color: #fff;
background-size: 24px 24px; }
#next {
background-image: url("MOZ_EXTENSION/icons/back.svg");
transform: rotate(180deg); }
.active-slide-1 #next {
background-image: url("MOZ_EXTENSION/icons/back-highlight.svg"); }
#skip {
background: none;
@ -214,18 +227,6 @@ body {
transition: opacity 100ms cubic-bezier(0.07, 0.95, 0, 1);
z-index: 10; }
#prev:hover,
#next:hover,
#done:hover {
background-color: #fff;
background-size: 22px 22px; }
#prev:active,
#next:active,
#done:active {
background-color: #fff;
background-size: 24px 24px; }
#skip:hover {
opacity: 1; }
@ -234,11 +235,42 @@ body {
display: none; }
#done {
background-image: url("MOZ_EXTENSION/icons/done.svg");
display: none; }
.active-slide-4 #done {
display: inline-block; }
/* for smaller screen sizes */
@media screen and (max-width: 768px) {
.slide {
height: 360px;
width: 450px; }
.slide .slide-image {
background-size: contain;
background-repeat: no-repeat;
background-position: center;
flex: 0 0 200px; }
.slide .slide-content {
flex: 0 0 160px; }
.slide .slide-content h1 {
font-size: 24px; }
.slide .slide-content p {
font-size: 14px;
line-height: 21px;
width: 85%; }
.slide .slide-content .onboarding-legal-notice {
font-size: 10px;
line-height: 16px; }
#skip {
margin-left: -205px;
margin-top: 177px; }
#prev {
margin-left: -260px; }
#next,
#done {
margin-left: 190px; } }
`;
null;

View File

@ -46,9 +46,9 @@ window.onboardingHtml = `
<!-- Clickable elements should be buttons for accessibility -->
<button id="skip" data-l10n-id="tourSkip" tabindex=1>Skip</button>
<button id="prev" tabindex=2 data-l10n-label-id="tourPrevious" style="background-image: url('MOZ_EXTENSION/icons/back.svg');"></button>
<button id="next" tabindex=3 data-l10n-label-id="tourNext" style="background-image: url('MOZ_EXTENSION/icons/back.svg');"/></button>
<button id="done" tabindex=4 data-l10n-label-id="tourDone" style="background-image: url('MOZ_EXTENSION/icons/done.svg')"></button>
<button id="prev" tabindex=2 data-l10n-label-id="tourPrevious"></button>
<button id="next" tabindex=3 data-l10n-label-id="tourNext"></button>
<button id="done" tabindex=4 data-l10n-label-id="tourDone"></button>
<div id="slide-status-container">
<button class="goto-slide goto-slide-1" data-number="1" tabindex=4></button>
<button class="goto-slide goto-slide-2" data-number="2" tabindex=5></button>

View File

@ -1,4 +1,4 @@
/*! Raven.js 3.14.0 (6b817d7) | github.com/getsentry/raven-js */
/*! Raven.js 3.14.2 (5cf57e1) | github.com/getsentry/raven-js */
/*
* Includes TraceKit
@ -155,7 +155,7 @@ Raven.prototype = {
// webpack (using a build step causes webpack #1617). Grunt verifies that
// this value matches package.json during build.
// See: https://github.com/getsentry/raven-js/issues/465
VERSION: '3.14.0',
VERSION: '3.14.2',
debug: false,
@ -1414,19 +1414,21 @@ Raven.prototype = {
_trimBreadcrumbs: function (breadcrumbs) {
// known breadcrumb properties with urls
// TODO: also consider arbitrary prop values that start with (https?)?://
var urlprops = {to: 1, from: 1, url: 1},
var urlProps = ['to', 'from', 'url'],
urlProp,
crumb,
data;
for (var i = 0; i < breadcrumbs.values.length; i++) {
for (var i = 0; i < breadcrumbs.values.length; ++i) {
crumb = breadcrumbs.values[i];
if (!crumb.hasOwnProperty('data'))
if (!crumb.hasOwnProperty('data') || !isObject(crumb.data))
continue;
data = crumb.data;
for (var prop in urlprops) {
if (data.hasOwnProperty(prop)) {
data[prop] = truncate(data[prop], this._globalOptions.maxUrlLength);
for (var j = 0; j < urlProps.length; ++j) {
urlProp = urlProps[j];
if (data.hasOwnProperty(urlProp)) {
data[urlProp] = truncate(data[urlProp], this._globalOptions.maxUrlLength);
}
}
}
@ -2127,20 +2129,22 @@ function isObject(what) {
return typeof what === 'object' && what !== null;
}
// Sorta yanked from https://github.com/joyent/node/blob/aa3b4b4/lib/util.js#L560
// Yanked from https://git.io/vS8DV re-used under CC0
// with some tiny modifications
function isError(what) {
var toString = {}.toString.call(what);
return isObject(what) &&
toString === '[object Error]' ||
toString === '[object Exception]' || // Firefox NS_ERROR_FAILURE Exceptions
what instanceof Error;
function isError(value) {
switch ({}.toString.call(value)) {
case '[object Error]': return true;
case '[object Exception]': return true;
case '[object DOMException]': return true;
default: return value instanceof Error;
}
}
module.exports = {
isObject: isObject,
isError: isError
};
},{}],6:[function(_dereq_,module,exports){
(function (global){
'use strict';
@ -2468,27 +2472,6 @@ TraceKit.report = (function reportModuleWrapper() {
*
*/
TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
/**
* Escapes special characters, except for whitespace, in a string to be
* used inside a regular expression as a string literal.
* @param {string} text The string.
* @return {string} The escaped string literal.
*/
function escapeRegExp(text) {
return text.replace(/[\-\[\]{}()*+?.,\\\^$|#]/g, '\\$&');
}
/**
* Escapes special characters in a string to be used inside a regular
* expression as a string literal. Also ensures that HTML entities will
* be matched the same as their literal friends.
* @param {string} body The string.
* @return {string} The escaped string.
*/
function escapeCodeAsRegExpForMatchingInsideHTML(body) {
return escapeRegExp(body).replace('<', '(?:<|&lt;)').replace('>', '(?:>|&gt;)').replace('&', '(?:&|&amp;)').replace('"', '(?:"|&quot;)').replace(/\s+/g, '\\s+');
}
// Contents of Exception in various browsers.
//
// SAFARI:

View File

@ -34,10 +34,10 @@ function isUrl(url) {
}
function assertUrl(url) {
if (! url) {
if (!url) {
throw new Error("Empty value is not URL");
}
if (! isUrl(url)) {
if (!isUrl(url)) {
let exc = new Error("Not a URL");
exc.scheme = url.split(":")[0];
throw exc;
@ -48,14 +48,14 @@ function assertOrigin(url) {
assertUrl(url);
if (url.search(/^https?:/i) != -1) {
let match = (/^https?:\/\/[^/:]+\/?$/i).exec(url);
if (! match) {
if (!match) {
throw new Error("Bad origin, might include path");
}
}
}
function originFromUrl(url) {
if (! url) {
if (!url) {
return null;
}
if (url.search(/^https?:/i) == -1) {
@ -77,7 +77,7 @@ function checkObject(obj, required, optional) {
}
required = required || [];
for (let attr of required) {
if (! (attr in obj)) {
if (!(attr in obj)) {
return false;
}
}
@ -146,14 +146,14 @@ function deepEqual(a, b) {
return a === b;
}
if (Array.isArray(a)) {
if (! Array.isArray(b)) {
if (!Array.isArray(b)) {
return false;
}
if (a.length != b.length) {
return false;
}
for (let i=0; i<a.length; i++) {
if (! deepEqual(a[i], b[i])) {
for (let i = 0; i < a.length; i++) {
if (!deepEqual(a[i], b[i])) {
return false;
}
}
@ -163,14 +163,14 @@ function deepEqual(a, b) {
}
let seen = new Set();
for (let attr of Object.keys(a)) {
if (! deepEqual(a[attr], b[attr])) {
if (!deepEqual(a[attr], b[attr])) {
return false;
}
seen.add(attr);
}
for (let attr of Object.keys(b)) {
if (! seen.has(attr)) {
if (! deepEqual(a[attr], b[attr])) {
if (!seen.has(attr)) {
if (!deepEqual(a[attr], b[attr])) {
return false;
}
}
@ -183,7 +183,7 @@ function makeRandomId() {
let id = "";
while (id.length < 12) {
let num;
if (! id) {
if (!id) {
num = Date.now() % Math.pow(36, 3);
} else {
num = Math.floor(Math.random() * Math.pow(36, 3));
@ -202,7 +202,7 @@ class AbstractShot {
this._id = id;
this.origin = attrs.origin || null;
this.fullUrl = attrs.fullUrl || null;
if ((! attrs.fullUrl) && attrs.url) {
if ((!attrs.fullUrl) && attrs.url) {
console.warn("Received deprecated attribute .url");
this.fullUrl = attrs.url;
}
@ -254,7 +254,7 @@ class AbstractShot {
if (val.asJson) {
val = val.asJson();
}
if (! deepEqual(json[attr], val)) {
if (!deepEqual(json[attr], val)) {
this[attr] = json[attr];
}
} else if (json[attr] !== this[attr] &&
@ -264,11 +264,11 @@ class AbstractShot {
}
if (json.clips) {
for (let clipId in json.clips) {
if (! json.clips[clipId]) {
if (!json.clips[clipId]) {
this.delClip(clipId);
} else if (! this.getClip(clipId)) {
} else if (!this.getClip(clipId)) {
this.setClip(clipId, json.clips[clipId]);
} else if (! deepEqual(this.getClip(clipId).asJson(), json.clips[clipId])) {
} else if (!deepEqual(this.getClip(clipId).asJson(), json.clips[clipId])) {
this.setClip(clipId, json.clips[clipId]);
}
}
@ -360,7 +360,7 @@ class AbstractShot {
}
get urlDisplay() {
if (! this.url) {
if (!this.url) {
return null;
}
if (this.url.search(/^https?/i) != -1) {
@ -371,11 +371,10 @@ class AbstractShot {
return txt;
} else if (this.url.startsWith("data:")) {
return "data:url";
} else {
let txt = this.url;
txt = txt.replace(/\?.*/, "");
return txt;
}
let txt = this.url;
txt = txt.replace(/\?.*/, "");
return txt;
}
get viewUrl() {
@ -472,7 +471,7 @@ class AbstractShot {
clipNames() {
let names = Object.getOwnPropertyNames(this._clips);
names.sort(function (a, b) {
names.sort(function(a, b) {
return a.sortOrder < b.sortOrder ? 1 : 0;
});
return names;
@ -490,7 +489,7 @@ class AbstractShot {
this._clips[name] = clip;
}
delClip(name) {
if (! this._clips[name]) {
if (!this._clips[name]) {
throw new Error("No existing clip with id: " + name);
}
delete this._clips[name];
@ -515,7 +514,7 @@ class AbstractShot {
return this._siteName || null;
}
set siteName(val) {
assert(typeof val == "string" || ! val);
assert(typeof val == "string" || !val);
this._siteName = val;
}
@ -523,7 +522,7 @@ class AbstractShot {
return this._documentSize;
}
set documentSize(val) {
assert(typeof val == "object" || ! val);
assert(typeof val == "object" || !val);
if (val) {
assert(checkObject(val, ["height", "width"], "Bad attr to documentSize:", Object.keys(val)));
assert(typeof val.height == "number");
@ -538,7 +537,7 @@ class AbstractShot {
return this._fullScreenThumbnail;
}
set fullScreenThumbnail(val) {
assert(typeof val == "string" || ! val);
assert(typeof val == "string" || !val);
if (val) {
assert(isUrl(val));
this._fullScreenThumbnail = val;
@ -556,7 +555,7 @@ class AbstractShot {
return;
}
assert(typeof val == "object", "abTests should be an object, not:", typeof val);
assert(! Array.isArray(val), "abTests should not be an Array");
assert(!Array.isArray(val), "abTests should not be an Array");
for (let name in val) {
assert(val[name] && typeof val[name] == "string", `abTests.${name} should be a string:`, typeof val[name]);
}
@ -606,13 +605,13 @@ class _Image {
assert(checkObject(json, ["url"], ["dimensions", "title", "alt"]), "Bad attrs for Image:", Object.keys(json));
assert(isUrl(json.url), "Bad Image url:", json.url);
this.url = json.url;
assert((! json.dimensions) ||
assert((!json.dimensions) ||
(typeof json.dimensions.x == "number" && typeof json.dimensions.y == "number"),
"Bad Image dimensions:", json.dimensions);
this.dimensions = json.dimensions;
assert(typeof json.title == "string" || ! json.title, "Bad Image title:", json.title);
assert(typeof json.title == "string" || !json.title, "Bad Image title:", json.title);
this.title = json.title;
assert(typeof json.alt == "string" || ! json.alt, "Bad Image alt:", json.alt);
assert(typeof json.alt == "string" || !json.alt, "Bad Image alt:", json.alt);
this.alt = json.alt;
}
@ -632,7 +631,7 @@ class _Clip {
this._id = id;
this.createdDate = json.createdDate;
if ('sortOrder' in json) {
assert(typeof json.sortOrder == "number" || ! json.sortOrder, "Bad Clip sortOrder:", json.sortOrder);
assert(typeof json.sortOrder == "number" || !json.sortOrder, "Bad Clip sortOrder:", json.sortOrder);
}
if ('sortOrder' in json) {
this.sortOrder = json.sortOrder;
@ -659,7 +658,7 @@ class _Clip {
return this._createdDate;
}
set createdDate(val) {
assert(typeof val == "number" || ! val, "Bad Clip createdDate:", val);
assert(typeof val == "number" || !val, "Bad Clip createdDate:", val);
this._createdDate = val;
}
@ -667,14 +666,14 @@ class _Clip {
return this._image;
}
set image(image) {
if (! image) {
if (!image) {
this._image = undefined;
return;
}
assert(checkObject(image, ["url"], ["dimensions", "text", "location", "captureType"]), "Bad attrs for Clip Image:", Object.keys(image));
assert(isUrl(image.url), "Bad Clip image URL:", image.url);
assert(image.captureType == "madeSelection" || image.captureType == "selection" || image.captureType == "visible" || image.captureType == "auto" || image.captureType == "fullPage" || ! image.captureType, "Bad image.captureType:", image.captureType);
assert(typeof image.text == "string" || ! image.text, "Bad Clip image text:", image.text);
assert(image.captureType == "madeSelection" || image.captureType == "selection" || image.captureType == "visible" || image.captureType == "auto" || image.captureType == "fullPage" || !image.captureType, "Bad image.captureType:", image.captureType);
assert(typeof image.text == "string" || !image.text, "Bad Clip image text:", image.text);
if (image.dimensions) {
assert(typeof image.dimensions.x == "number" && typeof image.dimensions.y == "number", "Bad Clip image dimensions:", image.dimensions);
}
@ -702,13 +701,14 @@ class _Clip {
if (this.image) {
return this.image.url.startsWith("data:");
}
return false;
}
get sortOrder() {
return this._sortOrder || null;
}
set sortOrder(val) {
assert(typeof val == "number" || ! val, "Bad Clip sortOrder:", val);
assert(typeof val == "number" || !val, "Bad Clip sortOrder:", val);
this._sortOrder = val;
}

View File

@ -1,20 +1,20 @@
/* globals log */
"use strict";
var global = this;
this.catcher = (function () {
this.catcher = (function() {
let exports = {};
let handler;
let queue = [];
exports.unhandled = function (error, info) {
let log = global.log;
exports.unhandled = function(error, info) {
log.error("Unhandled error:", error, info);
let e = makeError(error, info);
if (! handler) {
if (!handler) {
queue.push(e);
} else {
handler(e);
@ -47,7 +47,7 @@ this.catcher = (function () {
/** Wrap the function, and if it raises any exceptions then call unhandled() */
exports.watchFunction = function watchFunction(func) {
return function () {
return function() {
try {
return func.apply(this, arguments);
} catch (e) {
@ -57,16 +57,21 @@ this.catcher = (function () {
};
};
exports.watchPromise = function watchPromise(promise) {
exports.watchPromise = function watchPromise(promise, quiet) {
return promise.catch((e) => {
log.error("------Error in promise:", e);
log.error(e.stack);
exports.unhandled(makeError(e));
if (quiet) {
log.debug("------Error in promise:", e);
log.debug(e.stack);
} else {
log.error("------Error in promise:", e);
log.error(e.stack);
exports.unhandled(makeError(e));
}
throw e;
});
};
exports.registerHandler = function (h) {
exports.registerHandler = function(h) {
if (handler) {
log.error("registerHandler called after handler was already registered");
return;

View File

@ -2,10 +2,10 @@
"use strict";
this.clipboard = (function () {
this.clipboard = (function() {
let exports = {};
exports.copy = function (text) {
exports.copy = function(text) {
let el = document.createElement("textarea");
document.body.appendChild(el);
el.value = text;

View File

@ -4,13 +4,13 @@
"use strict";
this.domainFromUrl = (function () {
this.domainFromUrl = (function() {
return function urlDomainForId(location) { // eslint-disable-line no-unused-vars
let domain = location.hostname;
if (!domain) {
domain = location.origin.split(":")[0];
if (! domain) {
if (!domain) {
domain = "unknown";
}
}
@ -18,7 +18,7 @@ this.domainFromUrl = (function () {
// Probably a unicode domain; we could use punycode but it wouldn't decode
// well in the URL anyway. Instead we'll punt.
domain = domain.replace(/[^a-z0-9.\-]/ig, "");
if (! domain) {
if (!domain) {
domain = "site";
}
}

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 20 20" style="enable-background:new 0 0 20 20;" xml:space="preserve">
<style type="text/css">
.st0{fill:#009EC0;}
</style>
<path id="path-1_1_" class="st0" fill="#3D3D40" d="M18.8,8.5H4.2l5.4-5.4c0.5-0.5,0.5-1.2,0-1.8s-1.2-0.5-1.8,0L0.4,8.9c-0.5,0.5-0.5,1.2,0,1.8
l7.5,7.5c0.2,0.2,0.5,0.4,0.9,0.4s0.6-0.1,0.9-0.4c0.5-0.5,0.5-1.2,0-1.8L4.2,11h14.5c0.8,0,1.2-0.5,1.2-1.2S19.5,8.5,18.8,8.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 675 B

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
<title>icon-16</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Onboarding" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon" fill="#4D4D4D">
<path d="M11,2 L15,2 L15,4 L11,4 L11,2 Z M17,2 L21,2 L21,4 L17,4 L17,2 Z M14,28 L18,28 L21,28 L21,30 L14,30 L14,28 Z M28,11 L30,11 L30,15 L28,15 L28,11 Z M28,17 L30,17 L30,21 L28,21 L28,17 Z M30,3.00292933 L30,9 L28,9 L28,4.49769878 C28,4.21484375 27.7771727,4 27.5023012,4 L23,4 L23,2 L28.9970707,2 C29.5621186,2 30,2.44902676 30,3.00292933 Z M28.9970707,30 L23,30 L23,28 L27.5023012,28 C27.7851562,28 28,27.7771727 28,27.5023012 L28,23 L30,23 L30,28.9970707 C30,29.5621186 29.5509732,30 28.9970707,30 Z M9,2 L9,4 L4.49769878,4 C4.21484375,4 4,4.22595492 4,4.50468445 L4,6 L2,6 L2,3.0093689 C2,2.44335318 2.44902676,2 3.00292933,2 L9,2 Z" id="Combined-Shape"></path>
<path d="M7.5,18 C4.46243388,18 2,15.5375661 2,12.5 C2,9.46243388 4.46243388,7 7.5,7 C10.5375661,7 13,9.46243388 13,12.5 C13,15.5375661 10.5375661,18 7.5,18 Z M7.5,15.25 C9.01878306,15.25 10.25,14.0187831 10.25,12.5 C10.25,10.9812169 9.01878306,9.75 7.5,9.75 C5.98121694,9.75 4.75,10.9812169 4.75,12.5 C4.75,14.0187831 5.98121694,15.25 7.5,15.25 Z" id="Combined-Shape"></path>
<path d="M7.5,30 C4.46243388,30 2,27.5375661 2,24.5 C2,21.4624339 4.46243388,19 7.5,19 C10.5375661,19 13,21.4624339 13,24.5 C13,27.5375661 10.5375661,30 7.5,30 Z M7.5,27.25 C9.01878306,27.25 10.25,26.0187831 10.25,24.5 C10.25,22.9812169 9.01878306,21.75 7.5,21.75 C5.98121694,21.75 4.75,22.9812169 4.75,24.5 C4.75,26.0187831 5.98121694,27.25 7.5,27.25 Z" id="Combined-Shape-Copy"></path>
<path d="M17.5,17.1107468 C15.3660747,15.6044466 13.2177087,14.087953 11.6169865,12.9580314 C10.6291131,12.260709 8.43228761,15.6061621 9.47511461,16.3422753 L14.0318913,19.5588235 L17.5,17.1107468 Z M20.9681087,19.5588235 C23.6164424,21.4282356 25.6533664,22.8660643 25.6533664,22.8660643 C26.5557642,23.5030509 26.7709224,24.7509686 26.1339357,25.6533664 C25.4969491,26.5557642 24.2490314,26.7709224 23.3466336,26.1339357 L17.5,22.0069002 C18.6001,21.2303591 19.7896836,20.390653 20.9681087,19.5588235 Z" id="Combined-Shape" fill-rule="nonzero"></path>
<path d="M12.0225886,23.7556612 L25.6533664,14.1339357 C26.5557642,13.4969491 26.7709224,12.2490314 26.1339357,11.3466336 C25.4969491,10.4442358 24.2490314,10.2290776 23.3466336,10.8660643 L9.80606657,20.4241116 C8.65292225,21.2380958 10.8995145,24.5484194 12.0225886,23.7556612 Z" id="Line" fill-rule="nonzero"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
<title>icon-32</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Onboarding" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon" fill="#4D4D4D">
<path d="M11,2 L15,2 L15,4 L11,4 L11,2 Z M17,2 L21,2 L21,4 L17,4 L17,2 Z M14,28 L18,28 L21,28 L21,30 L14,30 L14,28 Z M28,11 L30,11 L30,15 L28,15 L28,11 Z M28,17 L30,17 L30,21 L28,21 L28,17 Z M30,3.00292933 L30,9 L28,9 L28,4.49769878 C28,4.21484375 27.7771727,4 27.5023012,4 L23,4 L23,2 L28.9970707,2 C29.5621186,2 30,2.44902676 30,3.00292933 Z M28.9970707,30 L23,30 L23,28 L27.5023012,28 C27.7851562,28 28,27.7771727 28,27.5023012 L28,23 L30,23 L30,28.9970707 C30,29.5621186 29.5509732,30 28.9970707,30 Z M9,2 L9,4 L4.49769878,4 C4.21484375,4 4,4.22595492 4,4.50468445 L4,6 L2,6 L2,3.0093689 C2,2.44335318 2.44902676,2 3.00292933,2 L9,2 Z" id="Combined-Shape"></path>
<path d="M7.5,18 C4.46243388,18 2,15.5375661 2,12.5 C2,9.46243388 4.46243388,7 7.5,7 C10.5375661,7 13,9.46243388 13,12.5 C13,15.5375661 10.5375661,18 7.5,18 Z M7.5,15.25 C9.01878306,15.25 10.25,14.0187831 10.25,12.5 C10.25,10.9812169 9.01878306,9.75 7.5,9.75 C5.98121694,9.75 4.75,10.9812169 4.75,12.5 C4.75,14.0187831 5.98121694,15.25 7.5,15.25 Z" id="Combined-Shape"></path>
<path d="M7.5,30 C4.46243388,30 2,27.5375661 2,24.5 C2,21.4624339 4.46243388,19 7.5,19 C10.5375661,19 13,21.4624339 13,24.5 C13,27.5375661 10.5375661,30 7.5,30 Z M7.5,27.25 C9.01878306,27.25 10.25,26.0187831 10.25,24.5 C10.25,22.9812169 9.01878306,21.75 7.5,21.75 C5.98121694,21.75 4.75,22.9812169 4.75,24.5 C4.75,26.0187831 5.98121694,27.25 7.5,27.25 Z" id="Combined-Shape-Copy"></path>
<path d="M17.5,17.1107468 C15.3660747,15.6044466 13.2177087,14.087953 11.6169865,12.9580314 C10.6291131,12.260709 8.43228761,15.6061621 9.47511461,16.3422753 L14.0318913,19.5588235 L17.5,17.1107468 Z M20.9681087,19.5588235 C23.6164424,21.4282356 25.6533664,22.8660643 25.6533664,22.8660643 C26.5557642,23.5030509 26.7709224,24.7509686 26.1339357,25.6533664 C25.4969491,26.5557642 24.2490314,26.7709224 23.3466336,26.1339357 L17.5,22.0069002 C18.6001,21.2303591 19.7896836,20.390653 20.9681087,19.5588235 Z" id="Combined-Shape" fill-rule="nonzero"></path>
<path d="M12.0225886,23.7556612 L25.6533664,14.1339357 C26.5557642,13.4969491 26.7709224,12.2490314 26.1339357,11.3466336 C25.4969491,10.4442358 24.2490314,10.2290776 23.3466336,10.8660643 L9.80606657,20.4241116 C8.65292225,21.2380958 10.8995145,24.5484194 12.0225886,23.7556612 Z" id="Line" fill-rule="nonzero"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
<title>icon-32</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Onboarding" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon" fill="#989898">
<path d="M11,2 L15,2 L15,4 L11,4 L11,2 Z M17,2 L21,2 L21,4 L17,4 L17,2 Z M14,28 L18,28 L21,28 L21,30 L14,30 L14,28 Z M28,11 L30,11 L30,15 L28,15 L28,11 Z M28,17 L30,17 L30,21 L28,21 L28,17 Z M30,3.00292933 L30,9 L28,9 L28,4.49769878 C28,4.21484375 27.7771727,4 27.5023012,4 L23,4 L23,2 L28.9970707,2 C29.5621186,2 30,2.44902676 30,3.00292933 Z M28.9970707,30 L23,30 L23,28 L27.5023012,28 C27.7851562,28 28,27.7771727 28,27.5023012 L28,23 L30,23 L30,28.9970707 C30,29.5621186 29.5509732,30 28.9970707,30 Z M9,2 L9,4 L4.49769878,4 C4.21484375,4 4,4.22595492 4,4.50468445 L4,6 L2,6 L2,3.0093689 C2,2.44335318 2.44902676,2 3.00292933,2 L9,2 Z" id="Combined-Shape"></path>
<path d="M7.5,18 C4.46243388,18 2,15.5375661 2,12.5 C2,9.46243388 4.46243388,7 7.5,7 C10.5375661,7 13,9.46243388 13,12.5 C13,15.5375661 10.5375661,18 7.5,18 Z M7.5,15.25 C9.01878306,15.25 10.25,14.0187831 10.25,12.5 C10.25,10.9812169 9.01878306,9.75 7.5,9.75 C5.98121694,9.75 4.75,10.9812169 4.75,12.5 C4.75,14.0187831 5.98121694,15.25 7.5,15.25 Z" id="Combined-Shape"></path>
<path d="M7.5,30 C4.46243388,30 2,27.5375661 2,24.5 C2,21.4624339 4.46243388,19 7.5,19 C10.5375661,19 13,21.4624339 13,24.5 C13,27.5375661 10.5375661,30 7.5,30 Z M7.5,27.25 C9.01878306,27.25 10.25,26.0187831 10.25,24.5 C10.25,22.9812169 9.01878306,21.75 7.5,21.75 C5.98121694,21.75 4.75,22.9812169 4.75,24.5 C4.75,26.0187831 5.98121694,27.25 7.5,27.25 Z" id="Combined-Shape-Copy"></path>
<path d="M17.5,17.1107468 C15.3660747,15.6044466 13.2177087,14.087953 11.6169865,12.9580314 C10.6291131,12.260709 8.43228761,15.6061621 9.47511461,16.3422753 L14.0318913,19.5588235 L17.5,17.1107468 Z M20.9681087,19.5588235 C23.6164424,21.4282356 25.6533664,22.8660643 25.6533664,22.8660643 C26.5557642,23.5030509 26.7709224,24.7509686 26.1339357,25.6533664 C25.4969491,26.5557642 24.2490314,26.7709224 23.3466336,26.1339357 L17.5,22.0069002 C18.6001,21.2303591 19.7896836,20.390653 20.9681087,19.5588235 Z" id="Combined-Shape" fill-rule="nonzero"></path>
<path d="M12.0225886,23.7556612 L25.6533664,14.1339357 C26.5557642,13.4969491 26.7709224,12.2490314 26.1339357,11.3466336 C25.4969491,10.4442358 24.2490314,10.2290776 23.3466336,10.8660643 L9.80606657,20.4241116 C8.65292225,21.2380958 10.8995145,24.5484194 12.0225886,23.7556612 Z" id="Line" fill-rule="nonzero"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 993 B

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
<title>icon-starred-32</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Onboarding" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon-starred">
<path d="M11,2 L15,2 L15,4 L11,4 L11,2 Z M17,2 L19,2 L19,4 L17,4 L17,2 Z M14,28 L18,28 L21,28 L21,30 L14,30 L14,28 Z M28,18 L30,18 L30,21 L28,21 L28,18 Z M28.9970707,30 L23,30 L23,28 L27.5023012,28 C27.7851562,28 28,27.7771727 28,27.5023012 L28,23 L30,23 L30,28.9970707 C30,29.5621186 29.5509732,30 28.9970707,30 Z M9,2 L9,4 L4.49769878,4 C4.21484375,4 4,4.22595492 4,4.50468445 L4,6 L2,6 L2,3.0093689 C2,2.44335318 2.44902676,2 3.00292933,2 L9,2 Z" id="Combined-Shape" fill="#4D4D4D"></path>
<path d="M7.5,18 C4.46243388,18 2,15.5375661 2,12.5 C2,9.46243388 4.46243388,7 7.5,7 C10.5375661,7 13,9.46243388 13,12.5 C13,15.5375661 10.5375661,18 7.5,18 Z M7.5,15.25 C9.01878306,15.25 10.25,14.0187831 10.25,12.5 C10.25,10.9812169 9.01878306,9.75 7.5,9.75 C5.98121694,9.75 4.75,10.9812169 4.75,12.5 C4.75,14.0187831 5.98121694,15.25 7.5,15.25 Z" id="Combined-Shape" fill="#4D4D4D"></path>
<path d="M7.5,30 C4.46243388,30 2,27.5375661 2,24.5 C2,21.4624339 4.46243388,19 7.5,19 C10.5375661,19 13,21.4624339 13,24.5 C13,27.5375661 10.5375661,30 7.5,30 Z M7.5,27.25 C9.01878306,27.25 10.25,26.0187831 10.25,24.5 C10.25,22.9812169 9.01878306,21.75 7.5,21.75 C5.98121694,21.75 4.75,22.9812169 4.75,24.5 C4.75,26.0187831 5.98121694,27.25 7.5,27.25 Z" id="Combined-Shape-Copy" fill="#4D4D4D"></path>
<path d="M19.5621306,18.4336316 L12.0225886,23.7556612 C10.8995145,24.5484194 8.65292225,21.2380958 9.80606657,20.4241116 L12.5318913,18.5 L9.47511461,16.3422753 C8.43228761,15.6061621 10.6291131,12.260709 11.6169865,12.9580314 L16,16.0519233 L16.2999464,15.8401964 C16.308319,16.6949285 16.7256347,17.5052335 17.4378266,18.0070314 C18.0631741,18.4476404 18.8359546,18.5940831 19.5621306,18.4336316 Z M20.9681087,19.5588235 L25.6533664,22.8660643 C26.5557642,23.5030509 26.7709224,24.7509686 26.1339357,25.6533664 C25.4969491,26.5557642 24.2490314,26.7709224 23.3466336,26.1339357 L17.5,22.0069002 C18.6001,21.2303591 19.7896836,20.390653 20.9681087,19.5588235 Z" id="Combined-Shape" fill="#4D4D4D" fill-rule="nonzero"></path>
<path d="M31.0298163,5.60065296 L26.6315676,4.81413617 L24.5599053,0.655603441 C24.3597524,0.253892444 23.949655,-8.95905326e-17 23.5009482,0 C23.0522413,5.97270217e-17 22.642144,0.253892444 22.441991,0.655603441 L20.3692531,4.81413617 L15.9796095,5.59850107 C15.5518938,5.67324058 15.1994617,5.97631422 15.0614174,6.38809939 C14.9233731,6.79988456 15.0218952,7.25422244 15.3180974,7.57178672 L18.4664647,10.9577899 L17.8114064,15.6489161 C17.7498225,16.0883409 17.9391303,16.5253075 18.3017873,16.7808292 C18.6644442,17.036351 19.1395182,17.0674963 19.5324134,16.8615077 L23.5004103,14.7913869 L27.4694829,16.8647355 C27.8623781,17.0707241 28.3374521,17.0395788 28.7001091,16.7840571 C29.062766,16.5285353 29.2520739,16.0915688 29.19049,15.652144 L28.534356,10.9577899 L31.6816477,7.57286266 C31.9779332,7.25540997 32.0766057,6.80113504 31.9387231,6.38932166 C31.8019739,5.98045861 31.4537759,5.67832329 31.0298163,5.60065296 Z" id="Shape" fill="#FF1AD9" fill-rule="nonzero"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<g id="Visual-design">
<g id="_x31_.2-Div-selection" transform="translate(-575.000000, -503.000000)">
<g id="Introduction" transform="translate(250.000000, 503.000000)">
<g id="icon-welcomeface" transform="translate(325.000000, 0.000000)">
<g id="Layer_1_1_">
<path id="Shape" class="st0" d="M11.4,0.9v2.9h-6c-0.9,0-1.5,0.8-1.5,1.5v6H0.8V3.8c0-1.7,1.4-3.1,3.1-3.1h7.6v0.2H11.4z"/>
<path id="Shape_1_" class="st0" d="M63.2,11.4h-3.1v-6c0-0.8-0.6-1.5-1.5-1.5h-6v-3h7.6c1.7,0,3.1,1.4,3.1,3.1L63.2,11.4
L63.2,11.4z"/>
<path id="Shape_2_" class="st0" d="M52.6,63.2v-3.1h6c0.9,0,1.5-0.6,1.5-1.5v-6h3.1v7.6c0,1.7-1.4,3.1-3.1,3.1L52.6,63.2
L52.6,63.2z"/>
<path id="Shape_3_" class="st0" d="M0.8,52.7h3.1v6c0,0.9,0.6,1.5,1.5,1.5h6v3.1H3.8c-1.7,0-3.1-1.4-3.1-3.1L0.8,52.7L0.8,52.7
z"/>
<path id="Shape_6_" class="st0" d="M33.3,49.2H33c-4.6-0.1-7.8-3.6-7.9-3.8c-0.6-0.8-0.6-2,0.1-2.7c0.8-0.8,1.9-0.6,2.6,0.1
c0,0,2.3,2.6,5.2,2.6c1.8,0,3.6-0.9,5.2-2.6c0.8-0.8,1.9-0.8,2.7,0s0.8,1.9,0,2.7C38.7,47.9,36,49.2,33.3,49.2z"/>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,17 +1 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 46 46" style="enable-background:new 0 0 46 46;" xml:space="preserve">
<style type="text/css">
.st0{fill:#3E3D40;}
</style>
<path class="st0" d="M11,29v6c0,0.5,0.4,1,1,1h6v-7H11z"/>
<rect x="20" y="11" class="st0" width="7" height="7"/>
<rect x="11" y="20" class="st0" width="7" height="7"/>
<path class="st0" d="M18,11h-6c-0.5,0-1,0.4-1,1v6h7V11z"/>
<rect x="20" y="29" class="st0" width="7" height="7"/>
<path class="st0" d="M35,11h-6v7h7v-6C36,11.5,35.6,11,35,11z"/>
<path class="st0" d="M29,36h6c0.5,0,1-0.4,1-1v-6h-7V36z"/>
<rect x="20" y="20" class="st0" width="7" height="7"/>
<rect x="29" y="20" class="st0" width="7" height="7"/>
</svg>
<svg width="46" height="46" viewBox="0 0 46 46" xmlns="http://www.w3.org/2000/svg"><title>Screenshots</title><path d="M11 11.995c0-.55.455-.995.995-.995h23.01c.55 0 .995.455.995.995v23.01c0 .55-.455.995-.995.995h-23.01c-.55 0-.995-.455-.995-.995v-23.01zM11 25v-2h7v2h-7zm9-5h7v-2h-7v2zm9 5h7v-2h-7v2zm-9 4h7v-2h-7v2zm-2-18h2v25h-2V11zm9 0h2v25h-2V11z" fill="#3E3D40" fill-rule="evenodd"/></svg>

Before

Width:  |  Height:  |  Size: 921 B

After

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -2,11 +2,11 @@
"use strict";
this.log = (function () {
this.log = (function() {
let exports = {};
const levels = ["debug", "info", "warn", "error"];
if (! levels.includes(buildSettings.logLevel)) {
if (!levels.includes(buildSettings.logLevel)) {
console.warn("Invalid buildSettings.logLevel:", buildSettings.logLevel);
}
let shouldLog = {};

View File

@ -1,6 +1,6 @@
"use strict";
this.makeUuid = (function () {
this.makeUuid = (function() {
// generates a v4 UUID
return function makeUuid() { // eslint-disable-line no-unused-vars
@ -11,7 +11,7 @@ this.makeUuid = (function () {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var i = Array.prototype.slice.call(arguments).slice(-2)[0]; // grab the `offset` parameter
var r = randomValues[i]%16|0, v = c === 'x' ? r : (r&0x3|0x8);
var r = randomValues[i] % 16|0, v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
};

View File

@ -1,7 +1,7 @@
{
"manifest_version": 2,
"name": "Firefox Screenshots",
"version": "6.3.0",
"version": "6.6.0",
"description": "__MSG_addonDescription__",
"author": "__MSG_addonAuthorsList__",
"homepage_url": "https://github.com/mozilla-services/screenshots",
@ -21,8 +21,8 @@
},
"browser_action": {
"default_icon": {
"19": "icons/icon-19.png",
"38": "icons/icon-38.png"
"16": "icons/icon-16.svg",
"32": "icons/icon-32.svg"
},
"default_title": "__MSG_contextMenuLabel__",
"browser_style": false
@ -64,6 +64,7 @@
"icons/download.svg",
"icons/icon-256.png",
"icons/back.svg",
"icons/back-highlight.svg",
"icons/menu-fullpage.svg",
"icons/menu-visible.svg",
"icons/menu-myshot.svg",
@ -71,7 +72,8 @@
"icons/onboarding-2.png",
"icons/onboarding-3.png",
"icons/onboarding-4.png",
"icons/done.svg"
"icons/done.svg",
"icons/icon-welcome-face-without-eyes.svg"
],
"permissions": [
"activeTab",

View File

@ -44,9 +44,9 @@
<!-- Clickable elements should be buttons for accessibility -->
<button id="skip" data-l10n-id="tourSkip" tabindex=1>Skip</button>
<button id="prev" tabindex=2 data-l10n-label-id="tourPrevious" style="background-image: url('MOZ_EXTENSION/icons/back.svg');"></button>
<button id="next" tabindex=3 data-l10n-label-id="tourNext" style="background-image: url('MOZ_EXTENSION/icons/back.svg');"/></button>
<button id="done" tabindex=4 data-l10n-label-id="tourDone" style="background-image: url('MOZ_EXTENSION/icons/done.svg')"></button>
<button id="prev" tabindex=2 data-l10n-label-id="tourPrevious"></button>
<button id="next" tabindex=3 data-l10n-label-id="tourNext"></button>
<button id="done" tabindex=4 data-l10n-label-id="tourDone"></button>
<div id="slide-status-container">
<button class="goto-slide goto-slide-1" data-number="1" tabindex=4></button>
<button class="goto-slide goto-slide-2" data-number="2" tabindex=5></button>

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