From f228a348597da3e491c94e50bc4ecd53adf431fd Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Mon, 13 Jun 2016 11:33:16 -0400 Subject: [PATCH 01/22] WebExtensions conversion in progress. Mostly working. --- README.md | 50 ++++++++++++++++++++-------------- src/chrome/backgroundscript.js | 10 +++---- src/chrome/contentscript.js | 2 +- src/common/options-store.js | 15 +++++----- src/common/test/utils-test.js | 11 ++++++-- src/common/utils.js | 4 +-- src/manifest.json | 13 +++++++-- 7 files changed, 65 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index c9e1e432..7b60c8b8 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,23 @@ +# WebExtensions notes + +* Ampersand in context menu item (just remove? programmatically?) +* Toolbar logo looks crap on dark background + - Doesn't seem to be a way to detect theme and show appropriate icon. (See [this SO question](https://stackoverflow.com/questions/37366781/how-to-detect-firefox-theme)). Maybe will need to provide an option for user to choose icon. +* Hotkey doesn't work +* Build stuff and MetaScript stuff will need to change. Separate Firefox from Thunderbird et al. +* `applications` key can't be in `manifest.json` for Chrome +* Decide on whether to keep using AMO. + + # ![Markdown Here logo](https://raw.github.com/adam-p/markdown-here/master/src/common/images/icon48.png) Markdown Here -[**Visit the website.**](http://markdown-here.com) -[**Get it for Chrome.**](https://chrome.google.com/webstore/detail/elifhakcjgalahccnjkneoccemfahfoa) -[**Get it for Firefox.**](https://addons.mozilla.org/en-US/firefox/addon/markdown-here/) -[**Get it for Safari.**](https://s3.amazonaws.com/markdown-here/markdown-here.safariextz) -[**Get it for Thunderbird and Postbox.**](https://addons.mozilla.org/en-US/thunderbird/addon/markdown-here/) -[**Get it for Opera.**](https://addons.opera.com/en/extensions/details/markdown-here/) -[**Discuss it and ask questions in the Google Group.**](https://groups.google.com/forum/?fromgroups#!forum/markdown-here/) +[**Visit the website.**](http://markdown-here.com)
+[**Get it for Chrome.**](https://chrome.google.com/webstore/detail/elifhakcjgalahccnjkneoccemfahfoa)
+[**Get it for Firefox.**](https://addons.mozilla.org/en-US/firefox/addon/markdown-here/)
+[**Get it for Safari.**](https://s3.amazonaws.com/markdown-here/markdown-here.safariextz)
+[**Get it for Thunderbird and Postbox.**](https://addons.mozilla.org/en-US/thunderbird/addon/markdown-here/)
+[**Get it for Opera.**](https://addons.opera.com/en/extensions/details/markdown-here/)
+[**Discuss it and ask questions in the Google Group.**](https://groups.google.com/forum/?fromgroups#!forum/markdown-here/)
*Markdown Here* is a Google Chrome, Firefox, Safari, Opera, and Thunderbird extension that lets you write email in Markdown and render them before sending. It also supports syntax highlighting (just specify the language in a fenced code block). @@ -14,19 +25,19 @@ Writing email with code in it is pretty tedious. Writing Markdown with code in i To discover what can be done with Markdown in *Markdown Here*, check out the [Markdown Here Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Here-Cheatsheet) and the other [wiki pages](https://github.com/adam-p/markdown-here/wiki). -†: And Google Groups posts, and Blogger posts, and Evernote notes, and Wordpress posts! [See more](#compatibility). +†: And Google Groups posts, and Blogger posts, and Evernote notes, and Wordpress posts! [See more](#compatibility).
‡: And TeX mathematical formulae! ![screenshot of conversion](https://raw.github.com/adam-p/markdown-here/master/store-assets/markdown-here-image1.gimp.png) ### Table of Contents -**[Installation Instructions](#installation-instructions)** -**[Usage Instructions](#usage-instructions)** -**[Troubleshooting](#troubleshooting)** -**[Compatibility](#compatibility)** -**[Notes and Miscellaneous](#notes-and-miscellaneous)** -**[Building the Extension Bundles](#building-the-extension-bundles)** -**[Next Steps, Credits, Feedback, License](#next-steps)** +**[Installation Instructions](#installation-instructions)**
+**[Usage Instructions](#usage-instructions)**
+**[Troubleshooting](#troubleshooting)**
+**[Compatibility](#compatibility)**
+**[Notes and Miscellaneous](#notes-and-miscellaneous)**
+**[Building the Extension Bundles](#building-the-extension-bundles)**
+**[Next Steps, Credits, Feedback, License](#next-steps)**
## Installation Instructions @@ -66,7 +77,7 @@ After installing, make sure to restart Firefox/Thunderbird! ### Safari -[Download the extension directly.](https://s3.amazonaws.com/markdown-here/markdown-here.safariextz) When it has finished downloading, double click it to install. +[Download the extension directly.](https://s3.amazonaws.com/markdown-here/markdown-here.safariextz) When it has finished downloading, double click it to install. #### Preferences @@ -113,7 +124,7 @@ In Gmail, you can also use the browser's Undo command (CTRL+Z= 0) { +if (typeof(navigator) !== 'undefined' && + (navigator.userAgent.indexOf('Chrome') >= 0 || navigator.userAgent.indexOf('Firefox') >= 0)) { this.OptionsStore = ChromeOptionsStore; } else if (typeof(navigator) !== 'undefined' && navigator.userAgent.match(/AppleWebKit.*Version.*Safari/)) { this.OptionsStore = SafariOptionsStore; } -else /*? } */ { +else /*? } */ { // Thunderbird, Postbox, Icedove this.OptionsStore = MozillaOptionsStore; } diff --git a/src/common/test/utils-test.js b/src/common/test/utils-test.js index 7ee066f1..c8ce4016 100644 --- a/src/common/test/utils-test.js +++ b/src/common/test/utils-test.js @@ -548,10 +548,15 @@ describe('Utils', function() { // The sibling of the selected node *is not* intersected. expect(Utils.rangeIntersectsNode(range, $('#test-elem-2')[0])).to.be.false; + }); + + // I have found that Range.intersectsNode is broken on Chrome. I'm adding + // test to see if/when it gets fixed. + it('Range.intersectsNode is broken on Chrome', function() { + var range = document.createRange(); + range.selectNode($('#test-elem-1')[0]); - // I have found that Range.intersectsNode is broken on Chrome. I'm adding - // test to see if/when it gets fixed. - if (typeof(window.chrome) !== 'undefined') { + if (typeof(window.chrome) !== 'undefined' && navigator.userAgent.indexOf('Chrome') >= 0) { expect(range.intersectsNode($('#test-elem-2')[0])).to.be.true; } }); diff --git a/src/common/utils.js b/src/common/utils.js index 24f78765..9bcbfdd3 100644 --- a/src/common/utils.js +++ b/src/common/utils.js @@ -451,10 +451,10 @@ function makeRequestToPrivilegedScript(doc, requestObj, callback) { // If `callback` is undefined and we pass it anyway, Chrome complains with this: // Uncaught Error: Invocation of form extension.sendMessage(object, undefined, null) doesn't match definition extension.sendMessage(optional string extensionId, any message, optional function responseCallback) if (callback) { - chrome.extension.sendMessage(requestObj, callback); + chrome.runtime.sendMessage(requestObj, callback); } else { - chrome.extension.sendMessage(requestObj); + chrome.runtime.sendMessage(requestObj); } } else if (typeof(safari) !== 'undefined') { diff --git a/src/manifest.json b/src/manifest.json index 5a91f968..7be90b0b 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -4,7 +4,6 @@ "version": "2.12.0", "description": "__MSG_app_slogan__", "homepage_url": "http://markdown-here.com", - "minimum_chrome_version": "6", "default_locale": "en", "icons": { "16": "common/images/icon16.png", @@ -36,5 +35,15 @@ }, "default_title": "__MSG_toggle_button_tooltip__" }, - "options_page": "common/options.html" + "options_ui": { + "page": "common/options.html", + "open_in_tab": true + }, + + "applications": { + "gecko": { + "id": "markdown-here@adam.pritchard", + "update_url": "https://example.com/updates.json" + } + } } From c7d418500730df0bad49ec8d9fe1cb318dc388f2 Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Mon, 13 Jun 2016 14:21:16 -0400 Subject: [PATCH 02/22] Remove context menu shortcut key. It wasn't working with Firefox WebExtensions and isn't super important anyway. (Also, there's a strong risk of conflicting with other menu items. Also, it doesn't make a ton of sense for all languages.) --- README.md | 1 - src/_locales/de/messages.json | 9 --------- src/_locales/en/messages.json | 9 --------- src/_locales/es/messages.json | 9 --------- src/_locales/fr/messages.json | 9 --------- src/_locales/it/messages.json | 9 --------- src/_locales/ja/messages.json | 9 --------- src/_locales/ko/messages.json | 9 --------- src/_locales/pl/messages.json | 9 --------- src/_locales/pt_BR/messages.json | 9 --------- src/_locales/ru/messages.json | 9 --------- src/_locales/tr/messages.json | 9 --------- src/_locales/zh_CN/messages.json | 9 --------- src/_locales/zh_TW/messages.json | 9 --------- src/chrome/backgroundscript.js | 2 +- src/firefox/chrome/content/ff-overlay.xul | 1 - src/firefox/chrome/content/tb-overlay.xul | 1 - src/firefox/chrome/content/zotero-overlay.xul | 1 - src/firefox/chrome/locale/de/strings.dtd | 1 - src/firefox/chrome/locale/de/strings.properties | 2 -- src/firefox/chrome/locale/en/strings.dtd | 1 - src/firefox/chrome/locale/en/strings.properties | 2 -- src/firefox/chrome/locale/es/strings.dtd | 1 - src/firefox/chrome/locale/es/strings.properties | 2 -- src/firefox/chrome/locale/fr/strings.dtd | 1 - src/firefox/chrome/locale/fr/strings.properties | 2 -- src/firefox/chrome/locale/it/strings.dtd | 1 - src/firefox/chrome/locale/it/strings.properties | 2 -- src/firefox/chrome/locale/ja/strings.dtd | 1 - src/firefox/chrome/locale/ja/strings.properties | 2 -- src/firefox/chrome/locale/ko/strings.dtd | 1 - src/firefox/chrome/locale/ko/strings.properties | 2 -- src/firefox/chrome/locale/pl/strings.dtd | 1 - src/firefox/chrome/locale/pl/strings.properties | 2 -- src/firefox/chrome/locale/pt_BR/strings.dtd | 1 - src/firefox/chrome/locale/pt_BR/strings.properties | 2 -- src/firefox/chrome/locale/ru/strings.dtd | 1 - src/firefox/chrome/locale/ru/strings.properties | 2 -- src/firefox/chrome/locale/tr/strings.dtd | 1 - src/firefox/chrome/locale/tr/strings.properties | 2 -- src/firefox/chrome/locale/zh_CN/strings.dtd | 1 - src/firefox/chrome/locale/zh_CN/strings.properties | 2 -- src/firefox/chrome/locale/zh_TW/strings.dtd | 1 - src/firefox/chrome/locale/zh_TW/strings.properties | 2 -- 44 files changed, 1 insertion(+), 161 deletions(-) diff --git a/README.md b/README.md index 7b60c8b8..537faa6e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # WebExtensions notes -* Ampersand in context menu item (just remove? programmatically?) * Toolbar logo looks crap on dark background - Doesn't seem to be a way to detect theme and show appropriate icon. (See [this SO question](https://stackoverflow.com/questions/37366781/how-to-detect-firefox-theme)). Maybe will need to provide an option for user to choose icon. * Hotkey doesn't work diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index b6139ce0..cf03defe 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"Mar&kdown An\/Aus", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"Das ausgewählte Textfeld kann nicht zu Markdown gerendert werden. Bitte einen Rich-Text–Editor verwenden.", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 68ff7107..bafaf409 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -28,15 +28,6 @@ "description": "Text shown on the context menu.", "inMozDTD": true }, - "context_menu_item_with_shortcut": { - "message": "Mar&kdown Toggle", - "description": "Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language/locale/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut": { - "message": "k", - "description": "The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD": true - }, "invalid_field": { "message": "The selected field is not valid for Markdown rendering. Please use a rich editor.", "description": "Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json index cc208c11..dadec658 100644 --- a/src/_locales/es/messages.json +++ b/src/_locales/es/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"Mar&kdown Toggle", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"El campo seleccionado no es válido para el renderizado Markdown. Por favor, use un editor de texto enriquecido.", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json index fcd5397a..762b4878 100644 --- a/src/_locales/fr/messages.json +++ b/src/_locales/fr/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"Basculer vers Mar&kdown", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"Le champ sélectionné n'est pas valide pour un rendu avec Markdown. Utilisez un éditeur de texte enrichi.", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/it/messages.json b/src/_locales/it/messages.json index 459e6201..1cd0734f 100644 --- a/src/_locales/it/messages.json +++ b/src/_locales/it/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"Commuta Mar&kdown", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"The selected field is not valid for Markdown rendering. Please use a rich editor.", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json index 89e43e08..71f679cb 100644 --- a/src/_locales/ja/messages.json +++ b/src/_locales/ja/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"Mar&kdownを有効化\/無効化", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"このテキストフィールドではMarkdownにレンダリングできません。リッチテキストフィールドで行なってください。", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/ko/messages.json b/src/_locales/ko/messages.json index 396e2cbc..c51ae1a2 100644 --- a/src/_locales/ko/messages.json +++ b/src/_locales/ko/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"마크다운 토글", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"The selected field is not valid for Markdown rendering. Please use a rich editor.", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/pl/messages.json b/src/_locales/pl/messages.json index 46ec25e2..cb1db39e 100644 --- a/src/_locales/pl/messages.json +++ b/src/_locales/pl/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"Przełącz Mar&kdown", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"Wybrane pole nie pozwala na interpretację języka Markdown. Proszę użyj edytora tekstu sformatowanego.", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/pt_BR/messages.json b/src/_locales/pt_BR/messages.json index d5f8e8a6..c07ffb5e 100644 --- a/src/_locales/pt_BR/messages.json +++ b/src/_locales/pt_BR/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"Alternar Mar&kdwon", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"O campo selecionado não é válido para renderização em Markdown. Favor usar um editor de texto formatado.", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index 44d57035..7d16ebed 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"Переключить Mar&kdown", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"Рендеринг Markdown не применим к выбранному полю. Пожалуйста используйте WYSIWYG редактор.", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/tr/messages.json b/src/_locales/tr/messages.json index 88788736..bcf26d16 100644 --- a/src/_locales/tr/messages.json +++ b/src/_locales/tr/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"Mar&kdown Toggle", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"Seçilen alan Markdown dönüşümü için geçerli değildir. Lütfen bir zengin metin editörü kullanın.", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index 76912f8f..6d5ff072 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"Mar&kdown转换", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"选定的区域不支持Markdown转换,请使用富文本编辑器。", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index 69dfef72..df9e85d7 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -28,15 +28,6 @@ "description":"Text shown on the context menu.", "inMozDTD":true }, - "context_menu_item_with_shortcut":{ - "message":"Mar&kdown切換", - "description":"Text shown on the context menu. The '&' comes before the shortcut character. If a shortcut key doesn't make sense for your language\/locale\/keyboard, you can just leave out the '&'." - }, - "context_menu_item_shortcut":{ - "message":"k", - "description":"The shortcut key for the context menu. Must be one of the letters in the context menu item text. If you excluded '&' in 'context_menu_item_with_shortcut', then you can leave this blank.", - "inMozDTD":true - }, "invalid_field":{ "message":"選擇的區域不支援Markdown算繪模式,請使用富文字編輯器。", "description":"Shown in an alert dialog if the user tries to render a field that cannot be rendered" diff --git a/src/chrome/backgroundscript.js b/src/chrome/backgroundscript.js index 0ea77481..dfcd3c03 100644 --- a/src/chrome/backgroundscript.js +++ b/src/chrome/backgroundscript.js @@ -54,7 +54,7 @@ function upgradeCheck() { // Create the context menu that will signal our main code. chrome.contextMenus.create({ contexts: ['editable'], - title: Utils.getMessage('context_menu_item_with_shortcut'), + title: Utils.getMessage('context_menu_item'), onclick: function(info, tab) { chrome.tabs.sendMessage(tab.id, {action: 'context-click'}); } diff --git a/src/firefox/chrome/content/ff-overlay.xul b/src/firefox/chrome/content/ff-overlay.xul index 4ca49f9a..456ad091 100644 --- a/src/firefox/chrome/content/ff-overlay.xul +++ b/src/firefox/chrome/content/ff-overlay.xul @@ -10,7 +10,6 @@ diff --git a/src/firefox/chrome/content/tb-overlay.xul b/src/firefox/chrome/content/tb-overlay.xul index ba25c3c5..01d12468 100644 --- a/src/firefox/chrome/content/tb-overlay.xul +++ b/src/firefox/chrome/content/tb-overlay.xul @@ -9,7 +9,6 @@ diff --git a/src/firefox/chrome/content/zotero-overlay.xul b/src/firefox/chrome/content/zotero-overlay.xul index 6d1004c7..58c6f852 100644 --- a/src/firefox/chrome/content/zotero-overlay.xul +++ b/src/firefox/chrome/content/zotero-overlay.xul @@ -16,7 +16,6 @@ diff --git a/src/firefox/chrome/locale/de/strings.dtd b/src/firefox/chrome/locale/de/strings.dtd index 3754c3a6..974f9b65 100644 --- a/src/firefox/chrome/locale/de/strings.dtd +++ b/src/firefox/chrome/locale/de/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/de/strings.properties b/src/firefox/chrome/locale/de/strings.properties index 1c4ecac1..6456c50b 100644 --- a/src/firefox/chrome/locale/de/strings.properties +++ b/src/firefox/chrome/locale/de/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=E-Mail in Markdown schreiben, dann aufhübschen lassen. context_menu_item=Markdown An/Aus -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Mar&kdown An/Aus currently_in_use=Derzeit im Einsatz cursor_into_compose=Bitte den Cursor im Textfeld platzieren. forgot_to_render_back_button=Zurück diff --git a/src/firefox/chrome/locale/en/strings.dtd b/src/firefox/chrome/locale/en/strings.dtd index 6142413c..d15b5fe8 100644 --- a/src/firefox/chrome/locale/en/strings.dtd +++ b/src/firefox/chrome/locale/en/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/en/strings.properties b/src/firefox/chrome/locale/en/strings.properties index 55560f8a..8cb103f8 100644 --- a/src/firefox/chrome/locale/en/strings.properties +++ b/src/firefox/chrome/locale/en/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=Write your email in Markdown, then make it pretty. context_menu_item=Markdown Toggle -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Mar&kdown Toggle currently_in_use=Currently in use cursor_into_compose=Please put the cursor into the compose box. forgot_to_render_back_button=Back diff --git a/src/firefox/chrome/locale/es/strings.dtd b/src/firefox/chrome/locale/es/strings.dtd index 1452453a..2589adb8 100644 --- a/src/firefox/chrome/locale/es/strings.dtd +++ b/src/firefox/chrome/locale/es/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/es/strings.properties b/src/firefox/chrome/locale/es/strings.properties index cc8b642f..724581fb 100644 --- a/src/firefox/chrome/locale/es/strings.properties +++ b/src/firefox/chrome/locale/es/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=Escribe tu correo electrónico en Markdown, y hazlo bonito. context_menu_item=Markdown Toggle -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Mar&kdown Toggle currently_in_use=Actualmente en uso cursor_into_compose=Por favor, pon el cursor en la zona de escritura. forgot_to_render_back_button=Atrás diff --git a/src/firefox/chrome/locale/fr/strings.dtd b/src/firefox/chrome/locale/fr/strings.dtd index 2f3a371f..9fc1abdd 100644 --- a/src/firefox/chrome/locale/fr/strings.dtd +++ b/src/firefox/chrome/locale/fr/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/fr/strings.properties b/src/firefox/chrome/locale/fr/strings.properties index a7de5b62..ca32fbf4 100644 --- a/src/firefox/chrome/locale/fr/strings.properties +++ b/src/firefox/chrome/locale/fr/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=Écrivez votre courriel avec Markdown, puis rendez-le attrayant. context_menu_item=Basculer vers Markdown -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Basculer vers Mar&kdown currently_in_use=En cours d'utilisation cursor_into_compose=Veuillez placer le curseur dans la zone de texte. forgot_to_render_back_button=Retour diff --git a/src/firefox/chrome/locale/it/strings.dtd b/src/firefox/chrome/locale/it/strings.dtd index c78203a1..071ac9d1 100644 --- a/src/firefox/chrome/locale/it/strings.dtd +++ b/src/firefox/chrome/locale/it/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/it/strings.properties b/src/firefox/chrome/locale/it/strings.properties index f37975c5..d213f036 100644 --- a/src/firefox/chrome/locale/it/strings.properties +++ b/src/firefox/chrome/locale/it/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=Scrivi la tua email in Markdown, quindi rendila bella. context_menu_item=Commuta Markdown -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Commuta Mar&kdown currently_in_use=Currently in use cursor_into_compose=Please put the cursor into the compose box. forgot_to_render_back_button=Indietro diff --git a/src/firefox/chrome/locale/ja/strings.dtd b/src/firefox/chrome/locale/ja/strings.dtd index d525a187..cdfcbfbe 100644 --- a/src/firefox/chrome/locale/ja/strings.dtd +++ b/src/firefox/chrome/locale/ja/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/ja/strings.properties b/src/firefox/chrome/locale/ja/strings.properties index 254639ca..dd6136cb 100644 --- a/src/firefox/chrome/locale/ja/strings.properties +++ b/src/firefox/chrome/locale/ja/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=Markdownで電子メールを美しく context_menu_item=Markdownを有効化/無効化 -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Mar&kdownを有効化/無効化 currently_in_use=現在の設定 cursor_into_compose=メール作成ボックスにカーソルを置いて下さい。 forgot_to_render_back_button=戻る diff --git a/src/firefox/chrome/locale/ko/strings.dtd b/src/firefox/chrome/locale/ko/strings.dtd index 2ef9ccd0..8aa82c7d 100644 --- a/src/firefox/chrome/locale/ko/strings.dtd +++ b/src/firefox/chrome/locale/ko/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/ko/strings.properties b/src/firefox/chrome/locale/ko/strings.properties index c20e74ab..57d5b9dd 100644 --- a/src/firefox/chrome/locale/ko/strings.properties +++ b/src/firefox/chrome/locale/ko/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=Write your email in Markdown, then make it pretty. context_menu_item=마크다운 토글 -context_menu_item_shortcut=k -context_menu_item_with_shortcut=마크다운 토글 currently_in_use=Currently in use cursor_into_compose=Please put the cursor into the compose box. forgot_to_render_back_button=뒤로 diff --git a/src/firefox/chrome/locale/pl/strings.dtd b/src/firefox/chrome/locale/pl/strings.dtd index e45b83d1..861566b8 100644 --- a/src/firefox/chrome/locale/pl/strings.dtd +++ b/src/firefox/chrome/locale/pl/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/pl/strings.properties b/src/firefox/chrome/locale/pl/strings.properties index d1767294..728610fb 100644 --- a/src/firefox/chrome/locale/pl/strings.properties +++ b/src/firefox/chrome/locale/pl/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=Napisz e-mail w języku Markdown a następnie go upiększ. context_menu_item=Przełącz Markdown -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Przełącz Mar&kdown currently_in_use=Obecnie w użyciu cursor_into_compose=Proszę umieść kursor w polu kompozycji. forgot_to_render_back_button=Wróć diff --git a/src/firefox/chrome/locale/pt_BR/strings.dtd b/src/firefox/chrome/locale/pt_BR/strings.dtd index b3c38e8c..01318a53 100644 --- a/src/firefox/chrome/locale/pt_BR/strings.dtd +++ b/src/firefox/chrome/locale/pt_BR/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/pt_BR/strings.properties b/src/firefox/chrome/locale/pt_BR/strings.properties index f1a7ff1d..c76f876a 100644 --- a/src/firefox/chrome/locale/pt_BR/strings.properties +++ b/src/firefox/chrome/locale/pt_BR/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=Escreva seu email em Markdown e o torne elegante. context_menu_item=Alternar Markdown -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Alternar Mar&kdwon currently_in_use=Atualmente em uso cursor_into_compose=Favor coloque o cursor no campo de texto. forgot_to_render_back_button=Voltar diff --git a/src/firefox/chrome/locale/ru/strings.dtd b/src/firefox/chrome/locale/ru/strings.dtd index 9d579c2a..89abcaae 100644 --- a/src/firefox/chrome/locale/ru/strings.dtd +++ b/src/firefox/chrome/locale/ru/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/ru/strings.properties b/src/firefox/chrome/locale/ru/strings.properties index f0dac7ce..30238d01 100644 --- a/src/firefox/chrome/locale/ru/strings.properties +++ b/src/firefox/chrome/locale/ru/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=Напишите ваш емейл в Markdown и сделайте его стильным. context_menu_item=Переключить Markdown -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Переключить Mar&kdown currently_in_use=Используемый в настоящее время cursor_into_compose=Пожалуйста, установите курсор в окно создания сообщения. forgot_to_render_back_button=Назад diff --git a/src/firefox/chrome/locale/tr/strings.dtd b/src/firefox/chrome/locale/tr/strings.dtd index 977572d1..e5838c81 100644 --- a/src/firefox/chrome/locale/tr/strings.dtd +++ b/src/firefox/chrome/locale/tr/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/tr/strings.properties b/src/firefox/chrome/locale/tr/strings.properties index eaea9c8c..7477cabc 100644 --- a/src/firefox/chrome/locale/tr/strings.properties +++ b/src/firefox/chrome/locale/tr/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=Markdown ile email yaz, sonra da güzelleştir. context_menu_item=Markdown Toggle -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Mar&kdown Toggle currently_in_use=Şuanda kullanımda cursor_into_compose=Lütfen kürsörünüzü metin alanına getirin. forgot_to_render_back_button=Geri diff --git a/src/firefox/chrome/locale/zh_CN/strings.dtd b/src/firefox/chrome/locale/zh_CN/strings.dtd index 7fedfb63..175eb5a2 100644 --- a/src/firefox/chrome/locale/zh_CN/strings.dtd +++ b/src/firefox/chrome/locale/zh_CN/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/zh_CN/strings.properties b/src/firefox/chrome/locale/zh_CN/strings.properties index 5f01df26..d5344dce 100644 --- a/src/firefox/chrome/locale/zh_CN/strings.properties +++ b/src/firefox/chrome/locale/zh_CN/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=用Markdown写一封漂亮的电子邮件。 context_menu_item=Markdown转换 -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Mar&kdown转换 currently_in_use=目前使用 cursor_into_compose=请把光标定位在编辑区。 forgot_to_render_back_button=返回 diff --git a/src/firefox/chrome/locale/zh_TW/strings.dtd b/src/firefox/chrome/locale/zh_TW/strings.dtd index 4fb075e0..a698960d 100644 --- a/src/firefox/chrome/locale/zh_TW/strings.dtd +++ b/src/firefox/chrome/locale/zh_TW/strings.dtd @@ -1,6 +1,5 @@ - diff --git a/src/firefox/chrome/locale/zh_TW/strings.properties b/src/firefox/chrome/locale/zh_TW/strings.properties index f28e9d74..ec99e62d 100644 --- a/src/firefox/chrome/locale/zh_TW/strings.properties +++ b/src/firefox/chrome/locale/zh_TW/strings.properties @@ -1,8 +1,6 @@ app_name=Markdown Here app_slogan=用Markdown寫一封漂亮的電子郵件。 context_menu_item=Markdown切換 -context_menu_item_shortcut=k -context_menu_item_with_shortcut=Mar&kdown切換 currently_in_use=目前使用 cursor_into_compose=請把游標定位在編輯區。 forgot_to_render_back_button=返回 From 5322791649589aab6fde9bc2a96fed89776418c5 Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Mon, 13 Jun 2016 15:33:02 -0400 Subject: [PATCH 03/22] Hotkey seems to work now --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 537faa6e..f7e70c46 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ * Toolbar logo looks crap on dark background - Doesn't seem to be a way to detect theme and show appropriate icon. (See [this SO question](https://stackoverflow.com/questions/37366781/how-to-detect-firefox-theme)). Maybe will need to provide an option for user to choose icon. -* Hotkey doesn't work * Build stuff and MetaScript stuff will need to change. Separate Firefox from Thunderbird et al. * `applications` key can't be in `manifest.json` for Chrome * Decide on whether to keep using AMO. From 7743d63474d957cace9c237d310ca5621c5c46d9 Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Sat, 16 Jul 2016 22:05:58 -0400 Subject: [PATCH 04/22] Switch from using deprecated chrome.app.getDetails to chrome.runtime.getManifest. Only the latter works with WebExtensions. --- src/chrome/backgroundscript.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/chrome/backgroundscript.js b/src/chrome/backgroundscript.js index dfcd3c03..597ffe41 100644 --- a/src/chrome/backgroundscript.js +++ b/src/chrome/backgroundscript.js @@ -1,5 +1,5 @@ /* - * Copyright Adam Pritchard 2013 + * Copyright Adam Pritchard 2016 * MIT License : http://adampritchard.mit-license.org/ */ @@ -25,23 +25,23 @@ window.addEventListener('load', Utils.nextTickFn(onLoad), false); function upgradeCheck() { OptionsStore.get(function(options) { - var appDetails = chrome.app.getDetails(); + var appManifest = chrome.runtime.getManifest(); var optionsURL = '/common/options.html'; if (typeof(options['last-version']) === 'undefined') { // Update our last version. Only when the update is complete will we take // the next action, to make sure it doesn't happen every time we start up. - OptionsStore.set({ 'last-version': appDetails.version }, function() { + OptionsStore.set({ 'last-version': appManifest.version }, function() { // This is the very first time the extensions has been run, so show the // options page. chrome.tabs.create({ url: chrome.extension.getURL(optionsURL) }); }); } - else if (options['last-version'] !== appDetails.version) { + else if (options['last-version'] !== appManifest.version) { // Update our last version. Only when the update is complete will we take // the next action, to make sure it doesn't happen every time we start up. - OptionsStore.set({ 'last-version': appDetails.version }, function() { + OptionsStore.set({ 'last-version': appManifest.version }, function() { // The extension has been newly updated optionsURL += '?prevVer=' + options['last-version']; From 88dda67e72a846f7edcda20cd6d0f1921dff8cb7 Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Sat, 16 Jul 2016 22:06:30 -0400 Subject: [PATCH 05/22] Add charset to background page, to get rid of Firefox warning --- src/chrome/background.html | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/chrome/background.html b/src/chrome/background.html index 4a46523d..a7efe521 100644 --- a/src/chrome/background.html +++ b/src/chrome/background.html @@ -1,12 +1,20 @@ + + - - - - - - - + + + + + + + + + + + + + From 566f20f219cfc11b09337d14cff1ebc3563f959f Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Sat, 16 Jul 2016 22:07:43 -0400 Subject: [PATCH 06/22] Update preprocessor directives and build script --- README.md | 13 +++-- src/common/markdown-here.js | 2 +- src/common/options-iframe.js | 4 +- src/common/options-store.js | 28 +++++++--- src/common/options.js | 10 +++- src/common/utils.js | 102 ++++++++++++++++++++++++++--------- src/install.rdf | 4 +- src/manifest.json | 4 +- utils/build.js | 59 ++++++++++++++------ 9 files changed, 166 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index f7e70c46..a6f3cb3c 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,17 @@ # WebExtensions notes +## High +* Test the WebExtension. Especially on release Firefox. Publish for prelim review/signing. +* Show message to Firefox users about switching to new extension. Probably open options tab with huge message at top. +* Decide on whether to keep using AMO. + +## Low * Toolbar logo looks crap on dark background - Doesn't seem to be a way to detect theme and show appropriate icon. (See [this SO question](https://stackoverflow.com/questions/37366781/how-to-detect-firefox-theme)). Maybe will need to provide an option for user to choose icon. -* Build stuff and MetaScript stuff will need to change. Separate Firefox from Thunderbird et al. -* `applications` key can't be in `manifest.json` for Chrome -* Decide on whether to keep using AMO. + +## Steps (after work done) +1. Release WebExtension. Get it signed (happens immediately?). Maybe get it preliminarily reviewed. +2. Release XUL update. Point Firefox users at WebExtension. # ![Markdown Here logo](https://raw.github.com/adam-p/markdown-here/master/src/common/images/icon48.png) Markdown Here diff --git a/src/common/markdown-here.js b/src/common/markdown-here.js index 79d6e018..d802bb60 100644 --- a/src/common/markdown-here.js +++ b/src/common/markdown-here.js @@ -114,7 +114,7 @@ function getOperationalRange(focusedElem) { range = selection.getRangeAt(0); - /*? if(platform!=='mozilla'){ */ + /*? if(platform==='safari' || platform==='chrome'){ */ // We're going to work around some weird OSX+Chrome/Safari behaviour where if you // right-click on a word it gets selected, which then causes us to render just // that one word and look dumb and be wrong. diff --git a/src/common/options-iframe.js b/src/common/options-iframe.js index 5c4806ff..83ebc48c 100644 --- a/src/common/options-iframe.js +++ b/src/common/options-iframe.js @@ -4,8 +4,8 @@ */ function onLoad() { - /*? if(platform!=='mozilla'){ */ - // Chrome and Safari require us to manually load our content script in order + /*? if(platform==='safari' || platform==='chrome' || platform==='firefox'){ */ + // Chrome/Safari/WebExtensions require us to manually load our content script in order // to use the button and context menu in the iframe. if (typeof(safari) !== 'undefined' || typeof(chrome) !== 'undefined') { window.LOAD_MARKDOWN_HERE_CONTENT_SCRIPT = true; diff --git a/src/common/options-store.js b/src/common/options-store.js index e00a8797..a0934d27 100644 --- a/src/common/options-store.js +++ b/src/common/options-store.js @@ -25,7 +25,7 @@ var DEFAULTS = { 'gfm-line-breaks-enabled': true }; -/*? if(platform!=='mozilla'){ */ +/*? if(platform!=='thunderbird'){ */ /* * Chrome storage helper. Gets around the synchronized value size limit. * Overall quota limits still apply (or less, but we should stay well within). @@ -261,7 +261,7 @@ var ChromeOptionsStore = { }; /*? } */ - +/*? if(platform==='thunderbird'){ */ /* * Mozilla preferences storage helper */ @@ -379,9 +379,10 @@ var MozillaOptionsStore = { } } }; +/*? } */ -/*? if(platform!=='mozilla'){ */ +/*? if(platform==='safari'){ */ /* * When called from the options page, this is effectively a content script, so * we'll have to make calls to the background script in that case. @@ -487,17 +488,28 @@ var SafariOptionsStore = { /*? } */ -/*? if(platform!=='mozilla'){ */ -if (typeof(navigator) !== 'undefined' && - (navigator.userAgent.indexOf('Chrome') >= 0 || navigator.userAgent.indexOf('Firefox') >= 0)) { +// Choose which OptionsStore engine we should use. +// (This if-structure is ugly to work around the preprocessor logic.) +/*? if(platform==='chrome' || platform==='firefox'){ */ +if (typeof(navigator) !== 'undefined' + && (navigator.userAgent.indexOf('Chrome') >= 0 + || navigator.userAgent.indexOf('Firefox') >= 0)) { this.OptionsStore = ChromeOptionsStore; } -else if (typeof(navigator) !== 'undefined' && navigator.userAgent.match(/AppleWebKit.*Version.*Safari/)) { +/*? } */ +/*? if(platform==='safari'){ */ +if (!this.OptionsStore + && typeof(navigator) !== 'undefined' + && navigator.userAgent.match(/AppleWebKit.*Version.*Safari/)) { this.OptionsStore = SafariOptionsStore; } -else /*? } */ { // Thunderbird, Postbox, Icedove +/*? } */ +/*? if(platform==='thunderbird'){ */ +// Thunderbird, Postbox, Icedove +if (!this.OptionsStore) { this.OptionsStore = MozillaOptionsStore; } +/*? } */ this.OptionsStore._fillDefaults = function(prefsObj, callback) { var that = this; diff --git a/src/common/options.js b/src/common/options.js index e99bfe9a..65b9c674 100644 --- a/src/common/options.js +++ b/src/common/options.js @@ -185,15 +185,21 @@ function localize() { // Shows/hide page elements depending on the current platform. // E.g., not all usage instructions apply to all clients. function showPlatformElements() { - /*? if(platform!=='mozilla'){ */ + // (This if-structure is ugly to work around the preprocessor logic.) + var matched = false; + /*? if (platform!=='firefox' && platform!=='thunderbird') { */ if (typeof(chrome) !== 'undefined' && typeof(chrome.extension) !== 'undefined') { + matched = true; // Webkit-derived platforms $('#need-page-reload').css('display', 'none'); } - else /*? } */ { + /*? } else { */ + if (!matched) { + matched = true; // Mozilla-derived platforms $('#need-page-reload').css('display', ''); } + /*? } */ } diff --git a/src/common/utils.js b/src/common/utils.js index 9bcbfdd3..08257186 100644 --- a/src/common/utils.js +++ b/src/common/utils.js @@ -194,7 +194,7 @@ function getSelectedElementsInRange(range) { } }); - /*? if(platform!=='mozilla'){ */ + /*? if(platform!=='firefox' && platform!=='thunderbird'){ */ /* // This code is probably superior, but TreeWalker is not supported by Postbox. // If this ends up getting used, it should probably be moved into walkDOM @@ -298,14 +298,23 @@ function getLocalURL(url) { return url; } - /*? if(platform!=='mozilla'){ */ + // (This if-structure is ugly to work around the preprocessor logic.) + var matched = false; + /*? if (platform==='chrome' || platform==='firefox') { */ if (typeof(chrome) !== 'undefined') { + matched = true; return chrome.extension.getURL(url); } - else if (typeof(safari) !== 'undefined') { + /*? } */ + /*? if (platform==='safari') { */ + if (!matched && typeof(safari) !== 'undefined') { + matched = true; return safari.extension.baseURI + 'markdown-here/src' + url; } - else /*? } */ { + /*? } */ + /*? if(platform==='thunderbird'){ */ + if (!matched) { + matched = true; // Mozilla platform. // HACK: The proper URL depends on values in `chrome.manifest`. But we "know" // that there are only a couple of locations we request from, so we're going @@ -321,6 +330,7 @@ function getLocalURL(url) { return 'chrome://markdown_here/' + url.slice(CONTENT.length); } } + /*? } */ throw 'unknown url type: ' + url; } @@ -446,8 +456,11 @@ function fireMouseClick(elem) { var PRIVILEGED_REQUEST_EVENT_NAME = 'markdown-here-request-event'; function makeRequestToPrivilegedScript(doc, requestObj, callback) { - /*? if(platform!=='mozilla'){ */ + // (This if-structure is ugly to work around the preprocessor logic.) + var matched = false; + /*? if(platform==='chrome' || platform==='firefox'){ */ if (typeof(chrome) !== 'undefined') { + matched = true; // If `callback` is undefined and we pass it anyway, Chrome complains with this: // Uncaught Error: Invocation of form extension.sendMessage(object, undefined, null) doesn't match definition extension.sendMessage(optional string extensionId, any message, optional function responseCallback) if (callback) { @@ -457,7 +470,10 @@ function makeRequestToPrivilegedScript(doc, requestObj, callback) { chrome.runtime.sendMessage(requestObj); } } - else if (typeof(safari) !== 'undefined') { + /*? } */ + /*? if(platform==='safari'){ */ + if (!matched && typeof(safari) !== 'undefined') { + matched = true; /* Unlike Chrome, Safari doesn't provide a way to pass a callback to a background- script request. Instead the background script sends a separate message to @@ -499,7 +515,11 @@ function makeRequestToPrivilegedScript(doc, requestObj, callback) { safari.self.tab.dispatchMessage('request', window.JSON.stringify(requestObj)); } - else /*? } */ { + /*? } */ + /*? if(platform==='thunderbird'){ */ + if (!matched) { // Mozilla/XUL + matched = true; + // See: https://developer.mozilla.org/en-US/docs/Code_snippets/Interaction_between_privileged_and_non-privileged_pages#Chromium-like_messaging.3A_json_request_with_json_callback // Make a unique event name to use. (Bad style to modify the input like this...) @@ -530,6 +550,7 @@ function makeRequestToPrivilegedScript(doc, requestObj, callback) { event.initEvent(PRIVILEGED_REQUEST_EVENT_NAME, true, false); request.dispatchEvent(event); } + /*? } */ } @@ -642,14 +663,15 @@ function nextTickFn(callback, context) { * i18n/l10n */ /* -This is a much bigger hassle than it should be. i18n support is great on Chrome, -a bit of a hassle on Firefox/Thunderbird, and basically nonexistent on Safari. +This is a much bigger hassle than it should be. i18n support is great on Chrome +(and Opera, and Firefox+WebExtensions), a bit of a hassle on Thunderbird/XUL, +and basically nonexistent on Safari. In Chrome, we can use `chrome.i18n.getMessage` to just get the string we want, in either content or background scripts, synchronously and with no extra prep work. -In Firefox, we need to load the `strings.properties` string bundle for both the +In Thunderbird, we need to load the `strings.properties` string bundle for both the current locale and English (our fallback language) and combine them. This can only be done from a privileged script. Then we can use the strings. The loading is synchronous for the privileged script, but asynchronous for the unprivileged @@ -671,15 +693,36 @@ calls wait until the loading is complete. var g_stringBundleLoadListeners = []; function registerStringBundleLoadListener(callback) { - if (/*? if(platform!=='mozilla'){ */ - typeof(chrome) !== 'undefined' || - (typeof(g_safariStringBundle) === 'object' && Object.keys(g_safariStringBundle).length > 0) || - /*? } */ - (typeof(g_mozStringBundle) === 'object' && Object.keys(g_mozStringBundle).length > 0)) { + // (This if-structure is ugly to work around the preprocessor logic.) + var matched = false; + /*? if(platform==='chrome' || platform==='firefox'){ */ + if (typeof(chrome) !== 'undefined') { + matched = true; // Already loaded Utils.nextTick(callback); return; } + /*? } */ + /*? if(platform==='safari'){ */ + if (!matched + && typeof(g_safariStringBundle) === 'object' + && Object.keys(g_safariStringBundle).length > 0) { + matched = true; + // Already loaded + Utils.nextTick(callback); + return; + } + /*? } */ + /*? if(platform==='thunderbird'){ */ + if (!matched + && typeof(g_mozStringBundle) === 'object' + && Object.keys(g_mozStringBundle).length > 0) { + matched = true; + // Already loaded + Utils.nextTick(callback); + return; + } + /*? } */ g_stringBundleLoadListeners.push(callback); } @@ -738,10 +781,9 @@ function getMozStringBundle() { return stringBundleObj; } +/*? if(platform==='thunderbird'){ */ // Load the Mozilla string bundle -/*? if(platform!=='mozilla'){ */ if (typeof(chrome) === 'undefined' && typeof(safari) === 'undefined') { -/*? } */ var g_mozStringBundle = getMozStringBundle(); if (!g_mozStringBundle || Object.keys(g_mozStringBundle).length === 0) { @@ -756,12 +798,11 @@ if (typeof(chrome) === 'undefined' && typeof(safari) === 'undefined') { // g_mozStringBundle is filled in triggerStringBundleLoadListeners(); } -/*? if(platform!=='mozilla'){ */ } /*? } */ -/*? if(platform!=='mozilla'){ */ +/*? if(platform==='safari'){ */ // Will only succeed when called from a privileged Safari script. // `callback(data, err)` is passed a non-null value for err in case of total // failure, which should be interpreted as being called from a non-privileged @@ -845,7 +886,7 @@ function getSafariStringBundle(callback) { } /*? } */ -/*? if(platform!=='mozilla'){ */ +/*? if(platform==='safari'){ */ // Load the Safari string bundle if (typeof(safari) !== 'undefined') { var g_safariStringBundle = {}; @@ -885,11 +926,18 @@ if (typeof(safari) !== 'undefined') { // internationalization (yet). function getMessage(messageID) { var message = ''; - /*? if(platform!=='mozilla'){ */ + + // (This if-structure is ugly to work around the preprocessor logic.) + var matched = false; + /*? if (platform==='chrome' || platform==='firefox') { */ if (typeof(chrome) !== 'undefined') { + matched = true; message = chrome.i18n.getMessage(messageID); } - else if (typeof(safari) !== 'undefined') { + /*? } */ + /*? if (platform==='safari') { */ + if (!matched && typeof(safari) !== 'undefined') { + matched = true; if (g_safariStringBundle) { message = g_safariStringBundle[messageID]; } @@ -898,7 +946,10 @@ function getMessage(messageID) { return ''; } } - else /*? } */ { // Mozilla + /*? } */ + /*? if (platform==='thunderbird') { */ + if (!matched) { // Mozilla + matched = true; if (g_mozStringBundle) { message = g_mozStringBundle[messageID]; } @@ -907,6 +958,7 @@ function getMessage(messageID) { return ''; } } + /*? } */ if (!message) { throw new Error('Could not find message ID: ' + messageID); @@ -1119,8 +1171,10 @@ Utils.setFocus = setFocus; Utils.getTopURL = getTopURL; Utils.nextTick = nextTick; Utils.nextTickFn = nextTickFn; +/*? if(platform==='thunderbird'){ */ Utils.getMozStringBundle = getMozStringBundle; -/*? if(platform!=='mozilla'){ */ +/*? } */ +/*? if(platform==='safari'){ */ Utils.getSafariStringBundle = getSafariStringBundle; /*? } */ Utils.registerStringBundleLoadListener = registerStringBundleLoadListener; diff --git a/src/install.rdf b/src/install.rdf index 09b4a703..3bedda2f 100644 --- a/src/install.rdf +++ b/src/install.rdf @@ -12,7 +12,7 @@ {ec8030f7-c20a-464f-9b0e-13a3a9e97384} 11.0 - 42.* + 49.* @@ -30,7 +30,7 @@ toolkit@mozilla.org 6.0 - 42.* + 49.* diff --git a/src/manifest.json b/src/manifest.json index 7be90b0b..bb3b23f0 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -38,9 +38,9 @@ "options_ui": { "page": "common/options.html", "open_in_tab": true - }, + } - "applications": { + ,"applications": { "gecko": { "id": "markdown-here@adam.pritchard", "update_url": "https://example.com/updates.json" diff --git a/utils/build.js b/utils/build.js index d397ddd9..31a99f1f 100644 --- a/utils/build.js +++ b/utils/build.js @@ -16,16 +16,24 @@ var MetaScript = require('MetaScript'); var BASE_DIR = '..'; var SRC_DIR = file.path.join(BASE_DIR, 'src'); var DIST_DIR = file.path.join(BASE_DIR, 'dist'); + var CHROME_EXTENSION = file.path.join(DIST_DIR, 'chrome.zip'); -var FIREFOX_EXTENSION = file.path.join(DIST_DIR, 'firefox.xpi'); +var FIREFOX_EXTENSION = file.path.join(DIST_DIR, 'firefox.zip'); +var THUNDERBIRD_EXTENSION = file.path.join(DIST_DIR, 'thunderbird.xpi'); + var CHROME_INPUT = [/^manifest\.json$/, /^common(\\|\/)/, /^chrome(\\|\/)/, /^_locales(\\|\/)/]; -var FIREFOX_INPUT = [/^chrome.manifest$/, /^install.rdf$/, /^common(\\|\/)/, /^firefox(\\|\/)/]; -var FIREFOX_PLATFORM = 'mozilla'; +var FIREFOX_INPUT = CHROME_INPUT; +var THUNDERBIRD_INPUT = [/^chrome.manifest$/, /^install.rdf$/, /^common(\\|\/)/, /^firefox(\\|\/)/]; + +var CHROME_PLATFORM = 'firefox'; +var FIREFOX_PLATFORM = 'firefox'; +var THUNDERBIRD_PLATFORM = 'thunderbird'; var skipFileRegexes = [/^common(\\|\/)test(\\|\/)/, // OS files and temp files /\.DS_Store$/, /.+\.bts$/, /desktop\.ini$/]; var javascriptFileRegex = /.+\.js$/; +var manifestJsonFileRegex = /manifest\.json$/ // Checks for a match for fpath in inputArray (which should be CHROME_INPUT or FIREFOX_INPUT). @@ -51,17 +59,18 @@ function fnameMatch(fpath, inputArray) { // Add a file to the Chrome extension zip -function addChromeFile(zip, fullPath, zipPath) { - zip.file(fullPath, { name: zipPath }); -} - - -// Add a file to the Firefox extension zip -function addFirefoxFile(zip, fullPath, zipPath) { - // For the Mozilla extension, we need to do some preprocessing on JavaScript files. +function addBuildFile(platformName, zip, fullPath, zipPath) { + // For the Mozilla extensions in particular, we need to do some preprocessing on JavaScript files + // in order to exclude code specific to other platforms. if (javascriptFileRegex.test(fullPath)) { var fileContents = fs.readFileSync(fullPath); - fileContents = MetaScript.transform(fileContents, {platform: FIREFOX_PLATFORM}); + fileContents = MetaScript.transform(fileContents, {platform: platformName}); + zip.append(fileContents, { name: zipPath }); + } + else if (platformName === CHROME_PLATFORM && manifestJsonFileRegex.test(fullPath)) { + // Remove the Firefox-specific stuff from manifest.json when building for Chrome. + var fileContents = fs.readFileSync(fullPath, {encoding: 'utf8'}); + fileContents = fileContents.replace(/,"applications":[^{]*{[^{]*{[^}]*}[^}]*}/m, ''); zip.append(fileContents, { name: zipPath }); } else { @@ -71,7 +80,7 @@ function addFirefoxFile(zip, fullPath, zipPath) { // Initialize the extension zips. Returns an object like: -// { chrome: chromeZip, firefox: firefoxZip } +// { chrome: chromeZip, firefox: firefoxZip, thunderbird: thunderbirdZip } function setUpZips() { file.mkdirsSync(DIST_DIR); if (fs.existsSync(CHROME_EXTENSION)) { @@ -82,8 +91,13 @@ function setUpZips() { fs.unlinkSync(FIREFOX_EXTENSION); } + if (fs.existsSync(THUNDERBIRD_EXTENSION)) { + fs.unlinkSync(THUNDERBIRD_EXTENSION); + } + var chromeZip = new archiver('zip'); // Chrome will reject the zip if there's no compression var firefoxZip = new archiver('zip', {store: true}); + var thunderbirdZip = new archiver('zip', {store: true}); chromeZip.on('error', function(err) { console.log('chromeZip error:', err); @@ -95,12 +109,19 @@ function setUpZips() { throw err; }); + thunderbirdZip.on('error', function(err) { + console.log('thunderbirdZip error:', err); + throw err; + }); + chromeZip.pipe(fs.createWriteStream(CHROME_EXTENSION)); firefoxZip.pipe(fs.createWriteStream(FIREFOX_EXTENSION)); + thunderbirdZip.pipe(fs.createWriteStream(THUNDERBIRD_EXTENSION)); return { chrome: chromeZip, - firefox: firefoxZip + firefox: firefoxZip, + thunderbird: thunderbirdZip, }; } @@ -114,19 +135,25 @@ function main() { var fnameChrome = fnameMatch(fullPath, CHROME_INPUT); var fnameFirefox = fnameMatch(fullPath, FIREFOX_INPUT); + var fnameThunderbird = fnameMatch(fullPath, THUNDERBIRD_INPUT); if (fnameChrome) { - addChromeFile(zips.chrome, fullPath, fnameChrome); + addBuildFile(CHROME_PLATFORM, zips.chrome, fullPath, fnameChrome); } if (fnameFirefox) { - addFirefoxFile(zips.firefox, fullPath, fnameFirefox); + addBuildFile(FIREFOX_PLATFORM, zips.firefox, fullPath, fnameFirefox); + } + + if (fnameThunderbird) { + addBuildFile(THUNDERBIRD_PLATFORM, zips.thunderbird, fullPath, fnameThunderbird); } } }); zips.chrome.finalize(); zips.firefox.finalize(); + zips.thunderbird.finalize(); console.log('Done! Built extensions written to', DIST_DIR); } From ef26080135056a77ea25d0c8256b04a9ce5bf66e Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Fri, 10 Feb 2017 17:10:33 -0500 Subject: [PATCH 07/22] Disable spellcheck in sample --- src/common/options-iframe.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/options-iframe.html b/src/common/options-iframe.html index 48f78dd9..a53b18fd 100644 --- a/src/common/options-iframe.html +++ b/src/common/options-iframe.html @@ -34,7 +34,7 @@ - + ```javascript
function syntaxHighlighting() {
  var n = 33;
From cf238a4bf6861d731e976f32156794b699e6326c Mon Sep 17 00:00:00 2001 From: adam-p Date: Fri, 10 Feb 2017 17:19:01 -0500 Subject: [PATCH 08/22] Add more browser action icon sizes As suggested here: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/manifest.json/browser_action#Choosing_icon_sizes We still need a proper button icon for 64px. --- src/manifest.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/manifest.json b/src/manifest.json index bb3b23f0..1f84e4dc 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -30,8 +30,11 @@ ], "browser_action": { "default_icon": { + "16": "common/images/icon16-button-monochrome.png", "19": "common/images/icon19-button-monochrome.png", - "38": "common/images/icon38-button-monochrome.png" + "32": "common/images/icon32-button-monochrome.png", + "38": "common/images/icon38-button-monochrome.png", + "64": "common/images/icon64-monochrome.png" }, "default_title": "__MSG_toggle_button_tooltip__" }, From 0c6121be4aed373055d77f899f3685aa798e68e6 Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Sun, 19 Feb 2017 14:01:38 -0500 Subject: [PATCH 09/22] Add updated icons --- src/common/images/icon1024-monochrome.png | Bin 26913 -> 26913 bytes src/common/images/icon1024.png | Bin 23584 -> 23584 bytes src/common/images/icon12-button-disabled.png | Bin 405 -> 385 bytes .../images/icon12-button-monochrome.png | Bin 410 -> 396 bytes src/common/images/icon12-button.png | Bin 494 -> 492 bytes src/common/images/icon12-monochrome.png | Bin 324 -> 324 bytes src/common/images/icon12.png | Bin 365 -> 365 bytes src/common/images/icon128-monochrome.png | Bin 2010 -> 2010 bytes src/common/images/icon128.png | Bin 2144 -> 2144 bytes src/common/images/icon14-button-disabled.png | Bin 451 -> 436 bytes .../images/icon14-button-monochrome.png | Bin 466 -> 451 bytes src/common/images/icon14-button.png | Bin 595 -> 581 bytes src/common/images/icon14-monochrome.png | Bin 347 -> 347 bytes src/common/images/icon14.png | Bin 389 -> 389 bytes src/common/images/icon16-button-disabled.png | Bin 513 -> 508 bytes .../images/icon16-button-monochrome.png | Bin 529 -> 518 bytes src/common/images/icon16-button.png | Bin 665 -> 680 bytes src/common/images/icon16-monochrome.png | Bin 374 -> 374 bytes src/common/images/icon16.png | Bin 409 -> 409 bytes src/common/images/icon19-button-disabled.png | Bin 583 -> 573 bytes .../images/icon19-button-monochrome.png | Bin 590 -> 580 bytes src/common/images/icon19-button.png | Bin 766 -> 772 bytes src/common/images/icon19-monochrome.png | Bin 407 -> 407 bytes src/common/images/icon19.png | Bin 430 -> 430 bytes src/common/images/icon24-button-disabled.png | Bin 722 -> 663 bytes .../images/icon24-button-monochrome.png | Bin 735 -> 683 bytes src/common/images/icon24-button.png | Bin 968 -> 893 bytes src/common/images/icon24-monochrome.png | Bin 465 -> 465 bytes src/common/images/icon24.png | Bin 506 -> 506 bytes src/common/images/icon256-monochrome.png | Bin 4386 -> 4386 bytes src/common/images/icon256.png | Bin 4649 -> 4649 bytes src/common/images/icon28-button-disabled.png | Bin 817 -> 801 bytes .../images/icon28-button-monochrome.png | Bin 815 -> 847 bytes src/common/images/icon28-button.png | Bin 1100 -> 1113 bytes src/common/images/icon28-monochrome.png | Bin 535 -> 535 bytes src/common/images/icon28.png | Bin 579 -> 579 bytes src/common/images/icon32-button-disabled.png | Bin 998 -> 979 bytes .../images/icon32-button-monochrome.png | Bin 1008 -> 1004 bytes src/common/images/icon32-button.png | Bin 1401 -> 1372 bytes src/common/images/icon32-monochrome.png | Bin 627 -> 627 bytes src/common/images/icon32.png | Bin 695 -> 695 bytes src/common/images/icon38-button-disabled.png | Bin 1217 -> 1144 bytes .../images/icon38-button-monochrome.png | Bin 1260 -> 1197 bytes src/common/images/icon38-button.png | Bin 1675 -> 1631 bytes src/common/images/icon38-monochrome.png | Bin 713 -> 713 bytes src/common/images/icon38.png | Bin 774 -> 774 bytes src/common/images/icon48-button-disabled.png | Bin 1518 -> 1341 bytes .../images/icon48-button-monochrome.png | Bin 1550 -> 1388 bytes src/common/images/icon48-button.png | Bin 2089 -> 1890 bytes src/common/images/icon48-monochrome.png | Bin 835 -> 835 bytes src/common/images/icon48.png | Bin 916 -> 916 bytes src/common/images/icon512-monochrome.png | Bin 11948 -> 11948 bytes src/common/images/icon512.png | Bin 10191 -> 10191 bytes src/common/images/icon64-button-disabled.png | Bin 0 -> 1956 bytes .../images/icon64-button-monochrome.png | Bin 0 -> 2037 bytes src/common/images/icon64-button.png | Bin 0 -> 2748 bytes src/common/images/icon64-monochrome.png | Bin 1086 -> 1086 bytes src/common/images/icon64.png | Bin 1188 -> 1188 bytes src/common/images/icon76-monochrome.png | Bin 1070 -> 1070 bytes src/common/images/icon76.png | Bin 1156 -> 1156 bytes src/common/images/icon96-monochrome.png | Bin 1570 -> 1570 bytes src/common/images/icon96.png | Bin 1696 -> 1696 bytes src/common/images/markdown-here-disabled.svg | 9 +++++++++ .../images/markdown-here-monochrome.svg | 9 +++++++++ src/common/images/markdown-here-normal.svg | 9 +++++++++ src/manifest.json | 2 +- 66 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/common/images/icon64-button-disabled.png create mode 100644 src/common/images/icon64-button-monochrome.png create mode 100644 src/common/images/icon64-button.png create mode 100644 src/common/images/markdown-here-disabled.svg create mode 100644 src/common/images/markdown-here-monochrome.svg create mode 100644 src/common/images/markdown-here-normal.svg diff --git a/src/common/images/icon1024-monochrome.png b/src/common/images/icon1024-monochrome.png index 9bf3318ef89c4ef58e26185554f8b1481b6d5655..faf31126b2555b4aadeebc8449cf5f1e0c0a1e8d 100644 GIT binary patch delta 23 fcmZ2@iE-g2#tFS#51F{cEMzm9?kI0002eNkl{ZuUd)R6rj$;aM z&+|5x;bCM>q3?UC>-z2c{?;-)jLaz%MImk5ewG|Y<`lZFo30T>(Opk^KzJCLQ_v5d zpE_k(PUl2;7@1ic4R+%=KANTxgol}bqYLOV%gMhiS?~pdj}gTH00005EB3l#<>(LvnP~W?OIL)4kvWAVNd$#qI4>al%6AKSow zF9;7Ka|-&v*I^hw%Ch|VN<56r?2QJeX`0@frV)gPng2!?&~1^Ee*XLU~{S delta 278 zcmV+x0qOpX1DXSnjep+=9~B=HM87790002%Nkl*^X_hFx50}A;B$V!oU{~m=L029$dJb!+pi4)c737 z`POxPtsWi>_sCTo#}WjA*tY$pY1)#|VYt~rk|Yv_q4>W4M}O$Br-L+2f9tyb$@5$Y z9rkoEhVg!7bQo?j5Rp|`mOXcOU3W+5Fr1ougLoTGxgRgaS@$sY-)r0U clgzmb{|%BC^A8rYegFUf07*qoM6N<$f`Mv*LjV8( diff --git a/src/common/images/icon12-button.png b/src/common/images/icon12-button.png index f9668e6fdc513da3074b1c95b56528a7fb593120..8a452c9dba5df81c0c7c9de28a973797c04cdccc 100644 GIT binary patch delta 360 zcmV-u0hj*n1MCBkjep?+3KlpP|4|3)0003!NklYHfP!Gr%9AdF$yN+#z+WW8 zDp8{TB)T|5rqrzei4uMPff|oG3nrNZ6`ChXG#o9Infkv*mnfN?R4YyA|``_cY@rQ>< z0SinlRIGw!X5jW8_fNgR)R3mt_5Z}qi$BrDPw%??vsiZmriSxd?*ES$>ir)iRCNXz ztVaGK=|%~n4Pj^U#isthvh^XR2A~JsUqAfxwbp$3|5%~!|G8q5{&!oi`~U9Y=dU0+ z25bN*A@S$;-^;U-cl}?Iw*Nnf4H9F(2Y?DdcqtTP$O8Zy(YTtNl+?Na0000YHfC3Mp%oBz@9(oLDz>?2f zFGMu&1iCmwrqs;;(c-QD-2~IN>2N#BoAA2G2a05G%aZE(UnRHjKUNJ{QnUW2icb3< zCD!yOL$dQvndH3x)pCn)Ysi+J^>cm8iF4(;i~qM7uKK^D?SJgK8pTCFacThKA8ZU^ zOt0>L^m+rtN({+NK*c|>YDg2C4%Ps~EHE*kLKcvQ3aR;+8s=r~dzvFR`0!4t3sQyLIeQafni8GlqsH*JZ!lIr5%Z z@&)80eIQJ<@Ia2(g#XJk4?PFT zF<=8g3GVeRCy!+TLktu$z+gQF5@R3)_RqPz;OM+-3$V!n0F)M*P3TOA3jhEB07*qo IM6N<$f;)$@2LJ#7 diff --git a/src/common/images/icon12-monochrome.png b/src/common/images/icon12-monochrome.png index 5b2af23b5f5074c2c9c26f73cb9710381fabc171..43d6b3ae96f49cf98716fa143638d6cdc63c2957 100644 GIT binary patch delta 20 ccmX@YbcAU_FV{mRE-?$)jOKgE6Q{2Q08UH@4FCWD delta 20 ccmX@YbcAU_FV}qzc~Lo$!v~tOCr)1r08nHIMgRZ+ diff --git a/src/common/images/icon12.png b/src/common/images/icon12.png index 298069c03e23e4f9c2a356adb00b4415609b8aab..0861f1a946095242554b6df5e0abdd4f05fad517 100644 GIT binary patch delta 20 ccmaFM^pc(70{~lU2oL}O delta 21 dcmcb`e~W)YFV}qzc~Lo$!v~tOH%@nE2LN5W2uT0{ diff --git a/src/common/images/icon128.png b/src/common/images/icon128.png index a4aec1884d07bdff1cb2d50861d4685d35ca5444..b77d8948717bd278c4d0844ae5b015ed69b291c3 100644 GIT binary patch delta 21 dcmaDL@IYWfFV{mRE-`a?M$yF$8>gRS2LM)y2eJSF delta 21 dcmaDL@IYWfFV}qzc~M!B7jG}F*f{+pI{;-t3Az9P diff --git a/src/common/images/icon14-button-disabled.png b/src/common/images/icon14-button-disabled.png index 8ae1eeab07d4668c9e3d0f895b4279da211e93bd..d7b866f8b1ea1ac9224362f9d50f324fc9b7246c 100644 GIT binary patch delta 304 zcmV-00nh%!1GEE>jep?+3KlvMQv>kI00036Nkl$+aOyMMtnO{K1DNs{Dq4Z>OP z1{oZN;ccF0Y1>vnIQnjoj^p?!B2T(g5WaiV^>})~`n9389@`ik$5E=Pk|>HcK{z_T zF<6$ROw%OGvTTBIbbMp5X&Syyf*?5Cw*7zx!qM@KL46T**LCuByEo7CUO+fHzPeZ1 zbo;*l{t0L}x+(gr^w2Z!$HRkg_21INC*AL$$^QW0;W2caHdzk<00004gU$pO2TnAChz!!!Qa( zQEsJ;!6UOUk|YtH=Lyp^3sqI`W*v@(M`lqB!%%=Yj;95dWq*ADINI!Q7SlAHu2B?C z_^X{P=6U|ob=_N06h8otcD5JVCg}&9Y3muFC>nmgQ>zN5dnt z`dbada9@_?z&ML=9A^R?4Np2X<0rUkn&xwU{UiTElm0Vf@S<(ocK~0@`~qMtE0y9X RSQ7vM002ovPDHLkV1jQvl}i8s diff --git a/src/common/images/icon14-button-monochrome.png b/src/common/images/icon14-button-monochrome.png index 38eff4096f3917f483899aa1225580a39715a048..bbc38df365b86d9e55b4c73852d408929d83ec9e 100644 GIT binary patch delta 319 zcmV-F0l@y!1H%K5jep?+3KlsS0rDHI0003LNkl^Of$(qdY%q>vX_`jD zFyze}!qInwzVFMsu6drN>pB79=(|DM^Smn&xz+sy!goJ42m;Qe59s*D;5d#_ zRh77|dlH1B;~Rr@UCT60vaah%5RQ&-47P2%ZBbvrqh(naXdoON-x$=3cNs3!^I;fqXPFYvqrDk&!?g$HMo0VcRwbtbP?%crY?jF-a1Urhn-OgCG!&G`)mTq<%~6Wq-lx`UCC zigjIo@H}A{N<};v8L60MS$aGk@0zB$J!N<>GE#B9UJG5*zsUwW`C=`?{BKA`s8HK^G31b!IY&LKEXxXwr{))H0c-#aeO&L%|_!~g&Q07*qoM6N<$f~_-^sQ>@~ diff --git a/src/common/images/icon14-button.png b/src/common/images/icon14-button.png index e0cd582be08847996d3b40a5aca6e997d0652b41..9eff4a31d09c69b82e5e0473cf356f1d1e3e37f6 100644 GIT binary patch delta 450 zcmV;z0X_cH1jPi9jep?+3KlpP|4|3)0004&Nkl z7j9>6xFeSHHR#eWW>P~NeY8L3a9yHdB`fHP^ZpLaG7e{ZH-U%X3+5f$cnXGav40n^Dm}kLTBgWx4S;k~%k=G#PiZI; zh304ub>!4~HGi-D-nS?CwDeRf>k)?M2Y2Yto`WI6`2)5}-CAePA}$XfgrQA0j+@{; zKHl&He!fF{OZt6zyfEYpD=3xpp)Aohs|nLdXfGqYKw?VnnXQoy!f#p^hU6o5R=Fco zM>$ch=na)9+D9#_fl!-b5*w~#&^aR(GUQG+uh1ChMmsah!;v(D)2(ZYIOeaACFA4e sE5?eK@O%}b$jJORWI2sgkiJ6mFKJ)tn>6{C<^TWy07*qoM6N<$g6C${Hvj+t delta 464 zcmV;>0Wbc=1k(hNjep+=9~B-BKB9XO0004`NklkC7yr+ap7lRnZ2JFl zsrmn_LH(d?Zj9VknwicH){nrmYnKn6U+rRlSyZ_xj{A}7J_f7qHH9~Ez0`dR< z|1SZ;Aas0L}O06HB*^m08z~dQUCw| delta 20 ccmcc3bem~HFV}qzc~Lo$!v~tOCr&>C08`}%ivR!s diff --git a/src/common/images/icon14.png b/src/common/images/icon14.png index 521950fd75326d8dc7a9e8bffe434b79756c151f..f0ca00806d28cb0311d61d273f5af3c6122a17b9 100644 GIT binary patch delta 20 bcmZo=Ze^a(%k_|nOUzuJQFL*`#OdzkI0003^Nklo?O+m^=I0KfJX zQuKW2mh%O5bj2lzE5R5aPZJc z4dOT!pX+!$esO4;b~ESD0|yVC)L<9}%JY1>2j8Y?KC7y_LPZZ8Jake6-u4~mS6P-~ znYejef5u9{!9%zBvoN{hjGLwrw-6ggMGqXja!s)C6{8kKAx1{8{5SZ}J?AItlI9oV WSDZzyZr2?E0000uq;mINemX_vKbhj?=x?h zQ3YW%48ureS)K_8h9pTd;sPDP+iv} zMNzJS;LzbCH(7w``+h&M!1KHw2W`k4ELbj=Uqw-T;~51&aOg)Bu=zqMJ!_igalKye zfZ))NEg*x&7M_lLau1_VBG+=4VsZ?@a5ljr#>&xZ~l zIc|Y%+j~vZ9(KyIyx{rJ;UmW_Sglr{IHP4*4GZ3lJ#gsok>eJy8$aJ{Hg9np_wU~{ z&39E*Z-L;@;UhQsvoQ0duIs18V)6Ic0>Pof7mgWi+ukQhLg({21%eCz9bMO5RaNx? boXY$Fq+@UF-TIR700000NkvXXu0mjfk07!7 diff --git a/src/common/images/icon16-button-monochrome.png b/src/common/images/icon16-button-monochrome.png index e871442e35ae86192e628a77458e0a0b92e1a6dc..77ee6ad919ab5ba7125190df0ca170e98d213de8 100644 GIT binary patch delta 386 zcmV-|0e$|F1cn5Vjep?+3KlsS0rDHI00043NkldPzEuvk4Kr$=PZznMx$?CqDR}dTTC!KIzD57 zzU>?Be7#V!Z delta 398 zcmV;90df9@1d#-gjep+=9~B=HM87790004ENkl0@?kU1*ip(jep?+3KlpP|4|3)0005`Nkl@gf3mG$Ig!wi~HIPVj1w zlu&4ybEO7-x~VXDruBhy^*!gqITuHWZPXasW=|TLs>Ke}7=K%;FIqZhHAA0mm`3R? zwWjv$DZ>@l--BLPgA~rT+6M^BDKrIsTatin1fMOzC8?J>Q^&m97zj2>UGqWveZsOr zmpn#9R!a+hS95tBuXUJKdyKGCA!JDrk<~v{QsAvf&{sQ2b}CQg*f`e=3GN+#LT>sk ziL*}$JCt2Euzx0LKd9sY72w_6GQUu}4^QMGPIdPaeAZ-I2q6Fma0_q`_w{Fn;Xu)IdA$ma37Hq6< zF?fE823;eyNkiSLyTT{&gS}eZ2?dTtUP;=<*G4GlQh8P zik=@g>~TU;iWjjtfEA#!yH34fL{CyK=fN-lgFJe o*(huQL?6Zf0#pHcpsG~QPrJoFz!qb2RsaA107*qoM6N<$f=|W&qyPW_ delta 535 zcmV+y0_gpy1(^kqjep+=9~B-BKB9XO0005%NklPpaWQnH#<+5}CV>KXCYUckesagNi zB&Ylj5v}^~AP~FLl-JYFODJh)qC^8wPiiW8Zpg z)_tm!T|k5jBxfA`|NlS7qbqM_Y-&FF>)F+}GeCTx=A#5%0L8~(VnB_oFg8%*F}wz( zi_gF?02#mxsDF@NfZc#8(cAu{iB10x#8?fekeYw2Tx$OR1#x@+U^QUtrtS9kPQF?@ zEq=#wZ1Rhe_8xz9>do41Ky_FR@a8T2W612=a_inTd2I4Gf#TLIK`jx2<=9=YwDi#X zSfQ@}UV=FvE%*YHQImOSa+pZr$6T>Vz$iWb9;*Ss5PugwF#qbs9J$&5qeWZ)y9%b> zvgQwr4iw3{l_lBpzeZ{C{}T&tTm-4ZnOT66j5m%vonLLT?0<^rl>g~cegDfO=l<`q zSo{C((dY9)@(jd)_s_nhO$gomKTBZ7|GAO7{(pG(HI0E(@aNB8)8or-Jo)$MpD8Xi Z0D9&Pst_h0O9%h}002ovPDHLkV1mXa7qI{U diff --git a/src/common/images/icon16-monochrome.png b/src/common/images/icon16-monochrome.png index a86e4425fbb1200832f5c461c89c007244c95d96..ca451735a0f080acf45e23c72259dfd70dbdf27a 100644 GIT binary patch delta 20 ccmeyy^o?mkFV{mRE-?$)jOKgE6Q|z?09EP;qW}N^ delta 20 ccmeyy^o?mkFV}qzc~Lo$!v~tOCr-Z)09XPD+yDRo diff --git a/src/common/images/icon16.png b/src/common/images/icon16.png index 01353114e33f9572769cc62a025e1f88ba9335c4..b9f17cce6bf4d54a6f5ed770b538df520d2e0379 100644 GIT binary patch delta 21 dcmbQqJd=4sFV{mRE-`a?M$yF$8>cfd0su$v20Z`( delta 21 dcmbQqJd=4sFV}qzc~M!B7jG}F*f^bu5dc=F2t@z@ diff --git a/src/common/images/icon19-button-disabled.png b/src/common/images/icon19-button-disabled.png index 9d55b6c41371af7f7dfafb2c7f9937fc413251d6..0bdec533b887b29b7654c855edbfe4c9c2d11f37 100644 GIT binary patch delta 442 zcmV;r0Y(1D1ib{1jep?+3KlvMQv>kI0004wNkl)N%C;pEsC2+>CnbTHtbn5Y>tlqy)dw4+#;5ReY3t_r93cS%6RtC3zf9MAWC_q&{P zy|Jvl)o3){9ml!13M_Q!je;-?B?tm(Hk%){TJ7PO1{@w8dViyt@B2cG$72}|htg`b zzUuY*BOI9;96r~cH9IuzbUMF>CKs8pvET3O-x!gp4-L5HmMUbuUQ4!?;P4l<>ALPUm@;@$@k*u!FVyD#i7Lv51Izmz7|kY= ziJnJhYBYmKhkxE^md__MJ!%FHpU=@~#;wig^L*GP!+|A8bm)y{Tt6-Fzv_0o&&M?2 z@aWJR&33z;%w{wFKG~q&;G1pRH*jQXaCmg+PtB}C3yZ}6ov!sT<#PGgG|dT_+B5M^D6@9Ety-wY=;SF zwlm}H@AsuvtLb&C)zXz7{3bIlIvfrX$FW3FBx=yQ(u12# zGMP0R4Oy?(FCwy6DZAZHlGua8-*imZb??EHfv56~N)Mjtn9XK0J&%HA!-CPEx0+3- zQ(gy2Os!_{=zq{#&CGmevl&CaXa){%=4dtR^?I^et<11~uQGVzJOOd?4-StG{k55mIKpzd)I0O}wA*dg zpHzBq_#{SGe=SPzpz?dW-RhZ`yQI>C!=uactHSV3NklFL?V$3JSsgpzRm6pbB1QK*`HJ@^-Oh!1PW_38d9&<|IVrO_POt{TCFCN$z(AY z47LIERC=W^=>t7kxm?yo>uMVjJatxo4&%} zcFx&iv3TiryMNn}P#f+VhK>&h?->>fg)Fr{*R$E|t=H?hepcwpe}{wj3}d zkDn{}*o{HQhlBSF>-YQLg+hU;7sD{_!{P9W)2BzrhlBSFQ+GAT`fAUzW?|>)!oQ>lcyzZaY8|;Q& zN)!(kxh|Y5RpiA+?0Htj8Ln14aV6hD6LYBjIMe~`1}`N_JNa^bmIdIA6-WtGB>`+r#Ihl>H_g&cE!)L2X8&V62SZU zuWV&0Ji6d%QG>f1vshe97eWZ22zUw<2_Zzy9$$J~V^$^g{rv%^SUv8PkSPjXFb->D zo#ruYl9wudpEhCqQB4z+7zO=&?+?QNs>XeZ5u-DR;+hDxW{Sl`@sXHJ00+pnmU zeN-m(QhThlaa!k^w;MWe8V7OdgG_rP(N#FNJuN^Mu(J5_GYzRh?24ay;~*{SFqaRH z@GkrXUnQstqi!`d;kCd07*qoM6N<$g1ZbZ;{X5v delta 636 zcmV-?0)zd82L1(*jep+=9~B-BKB9XO0006{Nkl9BB02X|n z#%_YKr*JArmYncEK&0fqEq~;GJsxLmY--H-+_l|>;`YagSN$)RneiW|VVP1h|ATOn zME`$3;iCUQmu}bPaZ&}znee)*x(UW?j~1)=UnDdAf0f)qFn=a!7{buL|GvTn|J((W z&P9op{VSB23O9r#!_viP{7)B~0cPh*&-`Bv)L0?4;D3em0@4gi6`B73$kOZQ=Va{p zpC&f_f1cQEup!H{4*oyA{MLnX$@!$YEJO zC)t}oYzPwv8h;`IV*?E^q{uL2K(t}0BGdk7NX#J0uu7Q)|H~xi;Wq5b-bYv4+}Hk3 z5t<4Lc&vt1NX<7a6`S{eiudOKH}^fgiqkMPb{i*P__&|maOdTW#2r|()#8+W#uqo< ze+5#f$L`>S)35-+^8Z#`;RlRVTvULHS+J=AiCZYUtADug#2kndsm1Nh*{QpK#|rd- zQvH7`zRfpi0su>427CYj delta 21 dcmZ3-ypDN7FV}qzc~M!B7jG}F*f?FB5dc~l2!sFt diff --git a/src/common/images/icon24-button-disabled.png b/src/common/images/icon24-button-disabled.png index 772fad3506e1d0e0711c213b53951150d0088a75..7080f8005c38ccce44cb6e79f0f1ff42454e5278 100644 GIT binary patch delta 533 zcmV+w0_y$J1(yYojep?+3KlvMQv>kI0005#NklYRxOFYq zj-}thZ_`l(5!@Xd%p`U3e^m;iU>z+E&O#T_MXCo9;OfMX~dH0-qqPgB! zmM@CM;(I=yf3QM^XztM(iT!?G)$4UtDwReeN(E?~f{O;N(SM-XY^rvdc9V|;ZTFz4LBDY$lZP&4u_=lc~QUPg&LeF&tR8Mr>{7dh6zE{ zL4q@Ca3UE9Vt;>dW1$VaQxnF(ohqXN5709;JDHNR2GroVQ-#)Ou-$I;6J!KsVs@EK z=BxoVIB*HHMuSSFq9&7xk_kbx6H)Asn~A}Jiw3RHfIkkXR;y|@o9#_}IB;E^(O|h; z>OIr#cJ*4YZF^oQ6dwIN&dTNT91dJGXpIK^F8lpn4Sxm$JsB)EK4pWxWwY5NAoteb zq9KA9+zLJ+Pp4BoP2RQbUDMRyIDzIi(Cbf#altF9#bR+>ax?|*H8m&T#>2j5F?vS5 z*=$s=*E@a#a?YH1wxWbIcoMMm)ObABa7Orxn)M$cjjjbBo=r-AWBq3^AOhP#VBHTb X{Bseq#|}-m00000NkvXXu0mjfbCLRK delta 592 zcmV-W0NBsDDveN)jku%p8-&m4gR?mB4;on8B4siejJ}EB#a8%&oceWPYuh&1XB3ae zf8HeQ$e>s(Uj62L8;yn;_w{dWP%4$wU@$O63x&d8BIMNRgL7;!8jW6WHk(i5@z@m1 z=ksPHm-=V=j(-idNAQ%oQtFWiew@u_zlh}2>HpJzAp7ikUxe@O;Lna~um}I28MIoh z-6zJj0X+Cx13BaO)9F+-n@y7-Pl(olJ~;63WPQ*Ycs!n00=kdUWHM2mPUo2pPahn3 z*$?1r4YJv+ip63*x7+-G9wzuz|pnKg%G ziY^0zz@^LOx<@3p<`FpX@N9qnVG=$R`JcntxLaxbCH4K`VH=NWCQQkL@}^i6==W<^lZ&m|4=6l=)tjD zg*MP&v)Pz8$O`JlY-6$5NdtOt;1Xy94T{C0OePaK9*=0Yhr{8d0X;Zy(Vz`9(7iUd zhu`URx(njN@oEAM=JUC<+ie40UM`pWlTN1-ejYV?aDOZxZJ+_qWxZZYzuz~TVUL_% z&>!)5{0@-YqX!2r8X}Crz2YzA@px>u$zIc1t!7}aDLpuDpt%qA`BUPJ;ybF@Y$l~r ziL+szF(9W#&keXYQ9rX7J)&N%R?_SB%$5LhYHmC_mxK;TDW3QHy^Ka919EEgoc9PF r^g;34b0SH}KRWLjEQsQ(i_p6NS9qM__w?AL00000NkvXXu0mjfM$if` delta 605 zcmV-j0;2t^1>Xgbjep+=9~B=HM87790006oNkl;e5XQF)A;c!(77~zv z5D<)yM$o92fFSt5_XAQ|Xraw5t^5mwlu2wQu?Pfg#D5_1mI1qfsbXu9LM2SjZ^>TF zV%A;bz+s%3@0;(Oqt4MZlLZ2SFFv2|g?5I)gKr7S<#LipB!46n3VpUK1P(kr_?F;C zqan3gP4fA?A;gIi|7e_`4h}p#_$LL7btn`Lhi_HG>pzXJRpVQ8V`JGCFbgGvcWGAFDeSs8*{o8jYmYYDuY7`l|^sdFtTK5@4s3$)vE`?LJJW zQ@vrKP|!WG%70I&AD+nZ6_v~7=j27?>3+X|zgR4Gcw+L@|LZ$YD|lE}jqjWA!HWtU z!8;Q$-=|Xn_?7~lPRIOQa|KtO* z-EQ9uheMsjoJptCOwpfyzyHSVc0a%qlcx?2JUrXapSssqYTo=Zrl%SSl1il{7K`oi z#Kv?52Ugzk8>>jqmdoXLhMO@ljW>XpJaur|xu(eXHk-|-!C-Lr2gDPTr>;rIsix8Odi_oLm|f0qnPxKfV#UQT00000NkvXXu0mjfRTV1e diff --git a/src/common/images/icon24-button.png b/src/common/images/icon24-button.png index d8cc078716491cc601a53a0045b0f21226082db6..b4a2709b5ef640f6311da3d106113c99923a3596 100644 GIT binary patch delta 764 zcmVhZnor%xSW-v;e^4%42cB!*(0J2;LiKH!INRTQ$=H(6iwkjg!UL3P?RY;v ziZSqYjolvil8*Q|@qaiM-OD<%Rqk-kKwy~I2>P5DYKb2Dq+QG29YIWmumD7gK)J+F z5i)>wP4U032^t`El`OzDF^j7iYh6P?Ldmx7fPmWMyMGE|EYPlM7Y~0<9`JL1K|Dd) zo&+QuQk4V*9B0i6Vl2>hrLi#oOCE46#*CiJkKpxsX^pVBA_N3@$QsS@u6QwUv39j4V9WMdBD5TPdJy{1)jZyoTyr4t4pW# zN~7LC?|-PeNT0`^pDs`}!>s8$22Foq;VM;khQ56K$x9v!hl27z?C^MlgUBqFI{US1}4c+UlF8*Tu1Ii0(yBZ-D-)%d+B6vuYJq;;X+g-tZJBsx$X--|bcF3FtcMuz&E zrJx2{Ju~$URVfY>u^qUm>A{sfgP5ECE}1tl;RG=_NaS7=mT@y@2wl0)u_TBs?51nX uRs=EPh~BQ7r1VD@ei*k{{fVh*Bwn zUL>%<`cR>%n>?MfFwNv{P9Hd2&b`m`|K0nXbN`1RHboL!>3@o4ok}4Bh~w<6lr*l& z#h8>Ys)tOz9+EjKr@tU9oWZ-`RFhXgFKz=DYg{mWGOOu zc`htm8qo~Z(r&1U?C}j)8zo{4y6pwYIjTtnO8wKu%v2;isU|CsaLZrewc$75e^42m zHwbO`&FXum>sPF8h^5l&yjHO#yJv{?J8h%Y#%`F z5FqsdsE+M}LS8#;0Qm<%!j)tfG$af$15l4UpY_gwLDuU9p`FACKs!i=h3n%7!P)l) zmBT$ofRH$rj*VH;syWT_eQ$$B`=*FjQfuH(=ixr8bI=w5{+jiYv)Bg;Wg zHABsQ8#Cb3^w+8DiT!X{&<1(JTX2G>fkbvrTU1CA>mT7zIV+W`YRd`JfmYlIw8#o~ zXM` zpRuSY>g~kbEH*jptXi=d$|Ef3hq6O8a!~B1@10*}aUKz9pyHq(^NYhxxevW9tB`g< z6+yCUt7-&(&i@+5&xzd#Bt$#voKVWQz(~V$yzgmZw*!eL&wu#-4qfH`*8B!lmriD$ S(s(BT0000d?_0svSd2iE`q delta 21 dcmcb}e35xVFV}qzc~Lo$!v~tOH%_-=1OQrd2oL}O diff --git a/src/common/images/icon24.png b/src/common/images/icon24.png index f60427295e75360b25bff0aeee4223e91e496b3c..3f5b2526d71c9cb2c74955ffe143c1af8bb45d1b 100644 GIT binary patch delta 21 dcmeyx{EK-)FV{mRE-`a?M$yF$8>c5T0svRp2VejI delta 21 dcmeyx{EK-)FV}qzc~M!B7jG}F*f>3z5ddb931|QS diff --git a/src/common/images/icon256-monochrome.png b/src/common/images/icon256-monochrome.png index 20bd7b17d564e7399ca023315806956ffe220d66..8be27d3f52ddf80e3c6672bb405144e1c633078b 100644 GIT binary patch delta 21 dcmZ3av`A?}FV{mRE-?$)jOKgE8>e>*0034M2p0eV delta 21 dcmZ3av`A?}FV}qzc~Lo$!v~tOH%{*s003BK2v7h3 diff --git a/src/common/images/icon256.png b/src/common/images/icon256.png index 321ce68c3b8a2a242fcada5ee45a0496c045226e..5fc4af7b8e15a8772f024d322ec4ed6d6da7a196 100644 GIT binary patch delta 21 dcmZ3fvQlM2FV{mRE-`a?M$yF$8>dea1OQNl2R{G+ delta 21 dcmZ3fvQlM2FV}qzc~M!B7jG}F*f@QXAOK%I2}b|` diff --git a/src/common/images/icon28-button-disabled.png b/src/common/images/icon28-button-disabled.png index 17923cc5c43e846abe4e8382703d9eb10e4e2dd0..c37cdd4a1b5d217246e400ea5e9d175fa2e918fc 100644 GIT binary patch delta 672 zcmV;R0$=^H2B8L!jep?+3KlvMQv>kI0007VNkl z3oL;xQtUhU02WCp>;nW#EnF{+c0xoHyx$dEys(kA2&52#ooPe`n}};B^E;dgXAefk z%YN`NeDnP;o|!pkG>k0~4u>CnKHmr9h=3o7L>{!j&1O?%GJhEnjYhvo;`N?J*YMz@ zqeUtfi=tYsidL&7ve_)gL%-kuaTkX^IPmb`qoZx8(rz4!#lB178;8*i^G+j`dmB29 zbGaPGKZ3#FXGZF6Mn@akjoF)8t!9q@GdkLkC$ZP1QfX)ZV8cS8AbP!?m`o<-6FG&c znWqm9{LzN}et%!6Kv*3jMrsw{jyAOR?NRF8$^4_l7mJ0k1@m{{PPK<^=B4O`%%IFC z%jn6fFDzdBREGEVzBG6v^An?kcmE=WJ9vi~=JR>y=I?C?9~~{j*=#1d-L84$En{s% z@bEgFjzCAtP#wMbe6EbO48ehir$Wmxl}bH(zn06TmVY5Q`}>NH_I;R6r_H@!S!A>| zSEkL=!Go`T9|EjYDx%S7h-5O!K90Oz@7rA*`ryFBgRgD4*=)pMFfdP9yYK^khfuj(HkS!uc_4l>QZr8wU<)E!@VjAw}NF{DsDtU{F|47nMxrckwR9 z$lmL#%fP|$od1J+@64Pr7}kc%m>Q2O4N;0&}^Xh<`*P!sGEYoKEN2wnlK^ zqJfqsA)n8SN~I$BjYgxw>-Bz-BIi1c&cVW2)zI~X1mJSHEDD8!YTTBh7aNQ&sDS|s z2d=84+i;U{EEW?!pYKwBpXY>}eOn)Zxk03c}V89;Y3CBW+H{n#;au*S9qqQ7~aAAZ@77|nb(&8PKIcprD-^u&AxZL zU9n<3ksI8kU%by&o3d#&3qFIg?}^+!GMJW7Y$uze!u^R-EM!m zG=92RESmj(|GpLv3|Kh)M*}TQL(a%}JT3x(z?Ic%eX?x>h65K3v@{9TYE?NCiDe)B zEPLLmjw{6}SU4&lElorDT0S+KO=ZE*wOMiDa9FtA?vFN`?cq9}95pat;lM=$Exn88 zZLil;h=1yJA(cvrU@-VwUX0#ZES3|q*?hvB95wYy0S7J`TYU>jI2(;d*ECqV0!tmy zWHO2IHNl)5H85a@!{IgDovwP4_(1NZM!jAa>2&(GKVm|t{f`3Ux5ZY}^enHl) zKR^l*G)e?byk8P8*~CltAqpaNr5hLNe<-+?>!#FeV`##B;2*Wk8Zd7jj=@GCr3-1&*w!f7Jn0adwZXxac4o$4nF+k zXql49q{wEo;`sPjfxpNg_kTccbP9x@94%lx9v3t_n6cmQ|LXC0d~+Zl^Q@y&AeFHY zP_;xNF%SN>ySw|A-VQ=H?|l-`4$fpUcK~|E4}q2j9vmE)`>DV@HU(my^_2jl(Wt1^ zYNFroi(;`T_J8;H@4)no3x$HYjt>3Ozs@#;VXQ4W#9Axz951 zT(-X|d^{ctTQPr*ZdH5OWnPAE$@X5h8w+$}jkhdccU8bk`?>_YkgZHV=et}B@DbnB zfT2)me)AUw;wMK7cy)CpDwT@)-Lk;iK=kjXuI`sHdX#x3y z4~N4$(_}Ky0-{qM{N!i>IVbsIpPiin!{60>GF|le@ROqjER{;)@bJ()m^r%SetdVi zTrVHtM4|)8CA&Mry+yDRo07*qoM6N<$g5jNH AegFUf delta 686 zcmV;f0#W_X2CoK?jep+=9~B=HM87790007jNkliYre;!tqwYV;P| z=|K!-9I1UNu9xv<5&Ap4qX#iu!~1WzdX-8gkxHfZHbet0O~c#U+aK+ATNH~$)p%Mc z6f_ONfQ17W4YW2IG4j{FStG|vp?;4}a)nGATl#kZ`$Nzil>K!)P=Ad&R`~J^wG&^lnh2 z2S#_uB?Vvi`~5k`m3qY>r$$fr5K9U_ACJf1YbUjuAY^_?P4|#%F@Vn(q2HGO2e0$@ U%!$N=C;$Ke07*qoM6N<$f}s#o4FCWD diff --git a/src/common/images/icon28-button.png b/src/common/images/icon28-button.png index 8a19279da1afcd308334debe5e9f0438eff04708..e23567d85956735a22d5a9d35f51301277f81353 100644 GIT binary patch delta 986 zcmV<0110>-2-ygbjep?+3KlpP|4|3)000B3Nkl zK{xCMM2*oEcGpLuMilh#xwTV^&%we!`KRrjd(JPtb571xseeAAFm>vsP<2wU$`3_y zslieF;!BD)FA%JV;?4L;Be@71(oayx9Brm6L0AcsVH*?$WsI&ynrK6Uu$jR5n4!tI zO5m_BfWl(5nO75qRme1yA>X(IzmBO_4wTKni3E;*3%(wzUKsu!D4amo6NS}%K(hM{ z>;u+sA+UvkTYqPAX{H$MveqR1YAiF9e*p3uC_7!WBS~L^h5C)i3at1f$ZueZ#tun* z`&}Yu2fhOp80(Rzs~Z?#y5513*~j5Jb^`@d_F$3PMqmeW7?41@+8wY?J%pAMw@@8@ z8U=wn{R9dQY>hqvS+1k)STS`k7ONfD{KH|i9KY#(R(}(F1{Q;#zzjOZ?D5Vkl&_Nf zT26kaImcu!bLTw}1z%7|5zLk6Ohx>lAJ^bt(hO zrPtx=#DAuUqYSJFNT5dh&%fjL<(R*kZXi2& zqcY$xycIKtXTuUzin|@1EWSbE$u!*S=tAL~O2m!G#}d85d1#rk8_9e*=5gy0F)|C5 z=+d_7>iPWVV#2v3zA&buEnZ_rhERg#`WjfL9e-2??0L}(d*T@+kE%qfSb;dM2$5V? z4_!TqzaJG9;JY_O6B|HRiQ;&jxhGxNggj#{a{2Apm3$5?kJ6%f#m@0;%{8R*)FNUP zQp7UE>DD5GGd=!My-1ooA~aw&FG+KC%O9nQ8<18=-&2EW>~@&6HCXe_9&}u|?`>D|cdCIBB^ydU z%`!iE@ErBhIXrvNEyLLQFx6m)5?jz$7S&*jAVHog4C-&}8?-T&RA8AurvLx|07*qo IM6N<$g6wVDMF0Q* delta 973 zcmV;;12X*C2+RnOjep+=9~B-BKB9XO000A>NklZ?sG z$|x!^DN)cyt~RsG3)-{`HqF^`qNeEzwVRZ+k}lrz(n>+ezLcM=&@4aAREkUqg37`R zhPB$71)a|GIw382=j~eu&WAnE`JW$qpUeNDsA;jud6&V@S$`Hx%`*aB!h?fdq71Bs zaiRj)#ybRooM;5gC365twsQ9vqJ(Nlri*}8km^x^g;zk~dJ?wtQV<-|z0p}NWzz+@ z?35y?J4$#2Qs{G#Ev^Kum!2JX*rO6iPJpi>_!NRw1pFMq@_&Hj2znkZOas*)pyOV* zn6w!<9UPBf8GoMv_xdfBg#~iL!$NtAm(fBEg3cr8#uU(;fq#QfL%2W#dqi0{Rtz~a zfaVUQD!%%yKaF2WkqoJShshY3BQ*#xF9;CResUh0+hMA#X*W5J&FvQjI8*!w&KR2I)sQSG zn>X;7TP+l>?WS+uu>9kn-Y(Sb=+8i(m);2n4yr_W4jDA+t5$4b;{UDKDWfR+I^9TF1VI zTK_sYD7XR%=n7T?ZpSCbIvbpR9r|KB@kQbyS$}v1o)2hZ2U<)&TPu_;pyXa>oS!^7 zLU~FE;6yh1E)Aup*Kg*?XbCsAF+!li`m>AyXN#(#KDia}6SvyBY4RUczJNo*GPI&{ zP`Z~uj7SR-?tx#MIT1QK!OGY|geZ+)``Qkx`*N;D1$Q-p8fsMsugWp~i vN$4F diff --git a/src/common/images/icon28-monochrome.png b/src/common/images/icon28-monochrome.png index f867c35b3e9ebc365ccd40b43e211e096557394a..ab20f0f1ae168ea408756c227d2f37aad0d59544 100644 GIT binary patch delta 21 dcmbQvGM!~YFV{mRE-?$)jOKgE8>crg0sv3M2de-8 delta 21 dcmbQvGM!~YFV}qzc~Lo$!v~tOH%@P01OQSM2jl<% diff --git a/src/common/images/icon28.png b/src/common/images/icon28.png index 0d8b66aa609a92599a8e33d0b1ca9c99ca690801..09cba41ee810ce9c4325728af31847879adf710b 100644 GIT binary patch delta 21 dcmX@ia+qa8FV{mRE-`a?M$yF$8>g>f1OQL@2R#4) delta 21 dcmX@ia+qa8FV}qzc~M!B7jG}F*f@O+BLH5p2}J+^ diff --git a/src/common/images/icon32-button-disabled.png b/src/common/images/icon32-button-disabled.png index 9e207685a182309bbd54eda8c110480cc0902bdb..bb63f89d6d3e0005f4a1a93ec97e8730a74221bf 100644 GIT binary patch delta 851 zcmV-Z1FZb!2h#_Tjep?+3KlvMQv>kI0009dNklX)0uiNJiAkpCH{1!g zqLR@Y4;+qj=6v7za_`KY(QzKJa5$VEA0PkJ)z#JFyudm;JAYf?fzJxKwzj5XvDn@8 z^mKA;Y%K7c=HS4?1D~~kt*tG!zP_%a(P%}85<=MDVB>!3!GVXzTENQ6ioyYIZ*LnR zcT-bS@lYt#_Yj6W^VCrf4!q%dmVk$Z%+Jr4rBQTrbo2wYM8@PFYV3=E`$CA)@OpN3 zHcj;AAH(`0z<(=*cWeBq#=Z(jBobUByKoMxFO5`6ZxQC=@cnf2~}*xVTXHd|pS7T~kNB z@2@~eKT3lh@tAm7{cmMA-$Pxq7GeF9ERFiazlr~KV}G9q8)&)!SHv6fcf@Ut#mQvS7Xk3VXC**ZvdUyK8tf5bCBR_efzL_+%eq#pX<#~?)Q`cy?{Tk-h#ST8KxtPdWwdCz8!I~9v={m(RG^2~dVXK<~KA0|Wt;=f_Oy1G)SRI2_;h>Xd*M%{qpw+U&t z_)K^G^U7tlx3{O86B)b4e7Dmq6Y@6kFLbI_tEyNm>gXEzHs>`=8V!2xhr~hWwar}@ dKVR~`{{ak+^I;$|LCXLD002ovPDHLkV1l7jtsejY delta 870 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 delta 21 dcmey&@|k5qFV}qzc~Lo$!v~tOH%`C92moO%2>1X1 diff --git a/src/common/images/icon32.png b/src/common/images/icon32.png index 3457dbb50ca4a33fd552513b0d5f7c9468341319..2c8eb315339c3fc3d9dbca22de6620d704e5abb3 100644 GIT binary patch delta 21 dcmdnax}9}GFV{mRE-`a?M$yF$8>cHU0RT-X2Alu@ delta 21 dcmdnax}9}GFV}qzc~M!B7jG}F*f?E*2>@H*2&4c2 diff --git a/src/common/images/icon38-button-disabled.png b/src/common/images/icon38-button-disabled.png index b363381886fa7419be235cb14c74ddc0467399a1..cd9af7938faa67a3d6183a5eda1ef1b425712fe4 100644 GIT binary patch delta 1017 zcmVkI000BYNklh|K(0^K6TkGJ$w*t)1&#Q@v ziPX^0(0or%&r6TTQe&S3)aDPm0*~0P(q%H&Bih!xEuC6EKP)a>OJNSi1YVAej6^7l5mYr{ z`2?=5trab(D#AjckYcHuZOkLY=t-@eIO3}=jDfeew_Oo)b8`is2K~elpDVcH!gvCw zr>82JOsd`8U3b7-fz)ZIpE%-kpK#TLX*)kZ&kCHKoqx>=qFr09g#An;5?^J!q%!R6 z>`d+N@4ID=C5b1m7L)(E4A>~{7r$2d?K;!nNPMlf3$Komft$rYi{E4f-DK*`2FF`- zVTQnG;vXsVaPCjoUpW7XumZbw*~0YO!%CPea}|w7^SxHAg=s->;adq~iQV1ZxqwI{ z;zBb5OMe!obK$^)i&+UXcX&X@$H!`GYm0B}EpbYC$s=D2(r*MSVPj)s?l-);y2`@R z>9o4IxF|^&@#JZP2N%ATFwR%OU{D1D0TqwORVtOzY;TEE!b=kQaNxm(ZzYTu^7{I^ zd+-A`Gc%(O4-a{2CEb*WCy#tM@ZiF?61KOumw!E_axx8v!)kJJQVkCehvl--R1AYS z;>jalUkBmBw_cS;M@MRTdD&g!D=RDJE$K=w9iQa#@i<>D?er6;Z%O3Cfd|)mRhnn6 z&CSj10Z^ausgI71{ume-c-z_8`H&n+>e8N|-@Hdshhv`AY=!lS-?~SJn;W&Wvy(lo z@_%zMPw?sKY31|zV)BIEQBv1^`e!4Ld^j0nCG}bV-yq2yY&m)_J2*JV?%OMFm7N;_`spDEAia|M*@2!9?*2z zG~KtrpKeOD(@&gXQ*fM0n?N6kzt{7Q4RSLUi~V-b)GvJ6jSZRj59B-5G#Q{>{JS2N z%~P*BO6rCY*Y4EHWUvPDs2=^~B15v5@2gE=S^x#WM>VTIKK@dd+6Y@nxyn>A5-Ll3^1tp{;5W><(122Rmg6VF3 zhuLx(W@@&cu^v3I*zUd8@3%hA%sK8gE?11JsHkYNu(0rs{D0|oCFXMD@ALU4jZ`fy zEvmM*_NU+P9~MYYT3VVTfT^jeZv61YpE^bcV`F1#cz9T~x3>eR#OQ?>-pa_xNID8o zdU|>idhvOVAHMig$H-`4VBk=w0qg4O0DLJ0ZhJhQM^CaujTEa8LzL4#(xXZF);k8V`Q|tx~it9r&ScdV}ofR{HbGPB#-^WgM)*2YinzffJX+i1L2E5 zbxggIMMQWt;MCL<#zz7}hu#L{#h*GxMrCDX3vv>@AHI7jVZaZYo0}u@x9Qz?q1)fz z{}2XB3Ac#%sbgf;)zzgM8X8nZMa5J>L4hY+;D4;dO$oOlm^-XH%N##^@u!Xv7^hGU zeF($NM<6dRFXK2prRZ4?e6Y=ou8k#ou9+^njqsy0hYOa1xz`Ir9W!G1|eiJyFQ=yflE zFMs~jG5x|`kr-H7TCxmz%ypB2X;V{^s;sR1B%RTt+}zyrcCF0MvCcku`x*!xdVKK1 z7yo1Z5F!RSJ3BkyW@l$DbKR8ifdRHPZ zDez!>d;2^8V(f7CV4Z#P$akI8#hY9jkM|1;3x}r#{n0UJoqh6LCw+xGqz>9OK0L-i zAYhHmS&!_LP8u#r;_=qj){nWlImO7Fb=UuJ3CL}Uc}6GvegUppyY_YtDAWJ|002ov JPDHLkV1n?-CK3Pu diff --git a/src/common/images/icon38-button-monochrome.png b/src/common/images/icon38-button-monochrome.png index 09d97ab3dd6a483ec43ec5e67559b90aa8ca1c4b..87aa059f6a8833a54ecd8dd969bfb2fe6bac44ed 100644 GIT binary patch delta 1071 zcmV+~1kn5J39Si`jep?+3KlsS0rDHI000C2NklU_S*Rf z7|e!%_&^ia_hWtGy9_p_h!G3xAVvsQMz9D$VIi;)(npD+g{DypZ4{CeK@=BPcbS~; za%Z{9uDavy8pwgeI5X#b^Y7fbb7!=yE3BfTVp;roVPRp0m48Ib%gf7v3*QLP-rlb2 z>gvv`s;a(}mzO`w%F4Qx!0hbo3^?%M!Z!l-_4TR#{(jZb(Sg9Q00Z(XpPH~lkcWIY z@ZiEX64ut%raC)2)g^(<;Aa`A_=bXti6_r32rhghVLqQv;jskP*484>F9R3F5mZD! zaj^tx_N|1)6Mx7Wk%7-dz(QGB*&}i&r9MwP{qY1PRoFEGPpYe{m*tV2+(b}Hgt-NF zb#+Ar_V)Hh1<`($pp*z}YHCugt*sXXvW^f#=@vvB@hKO^pkrfWwut)r`U?WxPCNa? z5g%{%k|K=3@a^qwwZFfwrlzLs_0`bO5EV#Cop$<(BY$4!rc~J0)|S$?ySu9A0{{Hp!^r%1}pj>cIf=j}qe-s>eaDU+&U*9jZ)jy~POH-0OZmX_?P zXV1|`XXlI`luO5ZxqLi~l}kJQ#OawQ9}YaY#&4xwPKM^`(S-IPkQY3VSDh2H@!ENKH&k*r!tl)a!&<;O&wd(xwP{ zO-WtPE^)+@M?M_K&fy#Xzd@3H;(zpJ>-YQZlPH7phua zHzfLrbJ+qME7>N{d*W~Ox(fz_YI=G)dQw1?K9SH)zhlIYl5eHbWB{-DPd)15;-bC2 zm?cW;E+fusrORZn9P#gZ^o@-TH99(KmoB3}$4a-!pqb(y+$Rv1(Vl7Dm9a;PzbF(x paRi+>b?cun5%PjdH)S$-e*u6(NE=#wxWE7a002ovPDHLkV1n-~BozPv delta 1134 zcmV-!1d;o#3G4}wjep+=9~B=HM8779000C%Nkl>mZIxdHCV1kcil8LB`5R62GKoUbB zE`(XA0gWf;yL2^elTNyv+a`;-aHy`T^MB{}-nx&{X>4r7peSfVfgP!- zsfjl+l#-H?h+hBDb$D>$Q^yK4I5;T%{rzGLHZ?Ul1{M5;7Pz05mUbr=4teCOZWBEm zV+cNVtc{t7Vt??N7W8FhWhMQcJ~J~jsj#rnr+HsSGi2h%#=;Hu_Vz{^{8|n6WMpJG z2Gi5ilj!UCSK)@xMH+I=*uNNjUQ|>Rz-X+7TsIbJu%n|xT3T9!JB*foEQaD{EZksU zU!P-!HdaHf8XFoKa*7kN6g9c%;%1C9GCMmf>+9<>F@G`P++ooSGR{1CFKX)Yilw&IeE>XF~m6YQ&T+oZ)6M|dN@Ht58+eC3Z$El{k*)q z2f?$K1nA=8;)jESgU|K1?b-LBLmxEceC@)gj(-)bxw%=YtE;87v~(*sH`g01a95*7 zBf-*GLQr>?K0LVasbgi#=krNtXQv|!emXzO$;qjDnLVZIE8)O{3!gex5Wb_jySqcX zqlShCsjRI0Lr?vuy4iTghDAO)^l;2>2|jhKjGdgE{I;~T6#CYp^?JQhS63(H<>e<@ z=zk;K-rxHt2J_^Rj}Cn}Z*g%^sAIceb2Of;uCB`P@Nj5z!KrU+Ym?gAS}7|l`$>03 z@983bBV4Qf*BNJ?Jo3?*%?muZS65e0sAIh*RP>t0$9sEwe~yojJEvZsN6yo_tE)>| zTU({3riL5jTfJQV?Ck6}we6$NIP>I@kADt59C&cyztlfM6yQHTKK^}vem-Q5;F7R_ z*|KqmRa8{`NK2n_=1nfTxw$!k1JAYp87VAZpF`iQtgM928m||Ab9per8lnxpA)I-0 zw$PzhPJ!$H&{F7I8lP-$Z_C)&n6rS*`;X$RA!CSOo;>o=q4&h|&;nyeM@KJs#b=mH z8~)W`E*bHoJ1hnJ3S4+edJR^cmZ?k&zMS4y2{ec;rs$ zw#_AK1P%`mPZt&zgqA+zp8vz4M(%5TN9zXfFLHQasWun!bpQYW07*qoM6N<$g7MNk A1poj5 diff --git a/src/common/images/icon38-button.png b/src/common/images/icon38-button.png index e6fa0c68fe5098bf6b6bc04a0c244780529688a5..3c94b400ce163f71aee68e60e6ad6bf404195685 100644 GIT binary patch delta 1508 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 D!m{o& diff --git a/src/common/images/icon38-monochrome.png b/src/common/images/icon38-monochrome.png index 25f08baa4b31f8423b5a0fab8fea619e012bc97d..ffe778b83715086247db96766c85e9d5b7077310 100644 GIT binary patch delta 21 dcmX@fdXjZQFV{mRE-?$)jOKgE8>bsF0RUGY2gCpX delta 21 dcmX@fdXjZQFV}qzc~Lo$!v~tOH%>QV0svWX2mJs5 diff --git a/src/common/images/icon38.png b/src/common/images/icon38.png index 59461b807ef2d887224f75d8380d40bc0d35df4b..13263eeb23155ccf9707bf0d2733eb5a31db57b4 100644 GIT binary patch delta 21 ccmZo;Yh#kI000DzNklk` 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 AH~;_u diff --git a/src/common/images/icon48-button-monochrome.png b/src/common/images/icon48-button-monochrome.png index 8f9a7014f76c52f3a497dbb6b06941ceb08b041f..6b8991390abf4c2d3e9a2989696c6a7739ea9088 100644 GIT binary patch delta 1263 zcmVUx~xn*VpG?Ku1T1>g?=P2pJw8b`?^{(#n-M9B{!2cOU|^ z-z7w5B;sMIcz;Sq6QIvZz6ES;ZK;KYgFVlIwY9ZO_iwRS>^oVn5At}g9uPw;7+`^m!vPnZ za0gOG&(6-ADdxWdo(!!L$aqqaGws#Y)mxHO!b5K~!B}F51p_QF!G;4aI0M}WD09op z%h~VY?(Xhet#Fn>eSJMbRwT)nE{VV7H-E-3)@<2>rN4{eFiUC>0zQ~!hs{R5W3#hC z)5?6&GriHPcs#xo4u`97xqiz%vo}hNZg_zOCfJsJ2tvRU@gGdo{B>y3f|7MPa7`6Q6Pe+1|=@fq>7M!&qgR7*=ss->kR+n8calYgid z!c*3>!##dujP7a>3kFz*r88Wg2mS|~fWBe^Ot#h4)$9}3CrT|u3osMc2RH5!YZ=(D ziuy025IkqMH(3u457orPM0QD;y;HmQ$r#2GW1k?vF3EqmnH@A~vYVxrDr0}3aL+E0 zh9&*%=zfH}7C+BbYRxvJTZzoXzGx1W(CDzAK@k(SdOKr(YWPl=`iT`3G&-Js=f5{}_N8;}?{-{_y Z{{Y&F1AC5D53v9M002ovPDHLkV1g^dOoadd delta 1427 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 LNkvXXu0mjf;SEy= delta 1970 zcmV;j2Tl0m4yh23jep+=9~B-BKB9XO000MiNklbwGqXHtQngqO)DET z@fD&*Y0^0Azwg|=Ys>ObciEL@JTu?y?%jLO`Ty=c-*?abUw?_DmDZ=r=*qs*H^L>Z zl4m5&Zc>S4Fc+d5#Eq%6xsMUD>G0#C?)pl@4)l|b36jX203wq-&M@Vb1` z-4KNyHup72orMThDgxws`19l8%jwDpB)Bu*sm(z;@g14)U=m&yAfJqIWjv<2Wgyn$ zecJ(MdE{cI`+sUoRxcGnqRk+O2_!_tdpv8ea93XQtUn(XLc$L*;Snm6@OVu&=6dB} zzP8YIfOw4&ahd|eSb>cG52Tzx!Zdu(#|F{zy_oPY5?;YI0 zQ~U?=Hi1kbkVp%Vft>CLf#|%s7hN9KXAi!&3klbe@P8wtMd8yQ2+waMe4%%#5N!a^ z8pwQ0kfQ_=(Vcsx35XB>Dia<-!jF!YPa)w6Bs{ZK;SK(9wnO zBz5uQLnBFe#p4QhAi$%64B{dxhs&ZWErlnL@Oh6Y+z9~9fvmw4w`CZsN=K+N3FBQ; z@Rs{x5`Vtxv4uMkz#1eEdiRg0a(##-&m5$98Ifj#aEAlLx{+XaV+$Zg;WJHJEQ)R_ ze1TU9(mkKh6pHgOB4glIywiOn^zuC6xAi^=nhkW;n-Q)pL8`h4i=W$q?7=&Q-%bZ$ zqRWgw+^;!Nhr-x{Nc7s!1jHIZ5bj!pjBcB;Er0$9E}guNiVdgkvu#cXVAE%L;Lg(bz6+vifnE}{TVIniTZ^rh-FLB}fImg z0>q0&Yx}fofJbRh0iFUp1#ln$-KY@T>|)J10Ky$yU2HqR*0iIT>r+figWQ%t90I_E z8|V(6_0m@CT5!yE0IJ~^YtPnWdqxH3^nWU94x~*1%);M&VGH&y`UZ7p|73UYi}nC0 zDGU_nYO75k$pT28`8l9X09p`!P8?fhmtiJ?C@4}bLD&_U$>rD$kfPXVSn_-m;cP60 zr3RbY0BPu{{?cGQeRZ)0xpL+P4i%nAvlrm2qSI+tf30s$xQjop(+}YzPTAZ!bAK0x z@)Mc6aIC*HB-mnLN|pAYjLE*rOp*)Wl+#0PGM%^m7pb3~iOZ0^1dKkm&2U#V_=UujU!wi52g zh4vgK8@oP0KB+;cj1xRklYdkIgMWt|=5E&T9ndRsVRETI#3c25&?)C)q-+KTbK|c0 zO2e}HN&{`K5`+0*)lfb%Ym{ulwNPa=CacpB>#_2Ixoc2w#F|mNYzMe`tpTNT%GskM zV%+ixB!@2RDoju>L5MO5!(~(P8W&kj$sYHzbmSvfivfHVIIxOiWa# zP~Xcj$1_K;)6+bQ1=nKdyh_}<-eA{_Y#c?+;lh)cP0zTqRQZV26d>AT9j3cw<4xC0 zj8PBzdkys&)g?y^As5y%?E2 zHiN1Yt4uXagS}Ov7e)CmUw>Uf=Adn+o0!H(Ao0Th$+$cQ=TloC9@k+Ew| zbXKvVXll)HTPz4q_J7P364cV*WlQCyeYWG&{`2gtS5fqL$}3!PN%8TOGk+jEbQkn8 zW+|?>0%7HM9ZeOZaK_UuooQ_;45}g&gztm6jM!qagpfE3g2lXsn|E$+ORq3hC^usx zhdO~i)2%FZW+Tpb--O)@zs5gwEbD{y^~4$tK8m8ca_dh>>VHv$S<3tt&0SU^m-uYK z@lVdMvtG@Pm9&Q@I&q($`>qyQ!*&Q$${K*J_t%WvjhgQSV|QOmPTiA)=)j!nzv^z^ zD~vfPl-hWAnnL1pEwj^a)-~J{-RusM_S#5X)ct$+fBz!4%9I0CC;2}# z68a)V#p%Nr@GEoqMK)zBDPEHNpBf3~D0Ya!Icl7L0ggMfs%N(9(EtDd07*qoM6N<$ Ef;NA`n*aa+ diff --git a/src/common/images/icon48-monochrome.png b/src/common/images/icon48-monochrome.png index 9cc59a191023b0a23ae91aa743bd2710f325dc62..a7703802bf89c793d3daf9a162b1fa0384808b0f 100644 GIT binary patch delta 21 dcmX@ic9?BKFV{mRE-?$)jOKgE8>g>f0svP@2s8iy delta 21 dcmX@ic9?BKFV}qzc~Lo$!v~tOH%?!}1OQo@2yFlW diff --git a/src/common/images/icon48.png b/src/common/images/icon48.png index 8d15796d0b82fdd206f5a6cab5ad7b1e94a08a49..9f8d934a63e62664379b1e87dea83e23282a294c 100644 GIT binary patch delta 21 dcmbQjK81ZkFV{mRE-`a?M$yF$8>jze0su+22R8r! delta 21 dcmbQjK81ZkFV}qzc~M!B7jG}F*f{+!698Cl2|oY; diff --git a/src/common/images/icon512-monochrome.png b/src/common/images/icon512-monochrome.png index bc84b8fa2390a81590383060b9b3a97d6d5719b0..0ff34904eb25fbd630ab73e981b4219c91ddecc7 100644 GIT binary patch delta 21 dcmZ1zyC!x*FV{mRE-?$)jOKgE8>frv0RUf_2uT0{ delta 21 dcmZ1zyC!x*FV}qzc~Lo$!v~tOH%=GT0{~&_2!a3r diff --git a/src/common/images/icon512.png b/src/common/images/icon512.png index cb0c9ac6d15c1a2a4c8b3aa14c221008617ac421..73b49909925460224e60a340699843d7d4bf3d72 100644 GIT binary patch delta 21 dcmX@_f8KvWFV{mRE-`a?M$yF$8>d^S0{~n(2b}-_ delta 21 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 T9)>w100000NkvXXu0mjfbM?qk literal 0 HcmV?d00001 diff --git a/src/common/images/icon64-button.png b/src/common/images/icon64-button.png new file mode 100644 index 0000000000000000000000000000000000000000..689a14bb5ff66f4b7874d5e30afec16d140759c6 GIT binary patch literal 2748 zcmV;t3PbgYP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmYZn^*fZn^>1-mw<|000McNliru;Q|U4I2Qj= z2kQU;3Jpm_K~#9!?V1Tt6lWI4$0TMqiKWa;&&AAOc57?nZnkP&tJdAEScn0PAjiN6 ziehw}3lWg}5b;3c4Hy&{P%eY(5p@!?8jqA14_xDsn8X7$uCbEnT5gh!Hz04{_st9p zL(c$e!wj2O^@^gWzvKVw?$_Vf@9}s&u+d(zN5=4{g}?l#p#yksX!2p+ybz%-ELfm9 z!pQ({2;v}+uWt$9YxnpIG~-76%GWJGj8u#s5XKnBg)?z`BAECVHIoFK3=}Pz2N6sr zj29-sSb-4`#7F*u8Nq*51osIDUs(td9;{;GK8j=#V3H^e-jvJ*ooq2T05sA<9AG(2 z5-)^ECd(eg0R$29nk@X8-Vpw}RQ(JJ4?*DvsBm!_Oq1k+QMMEk<*Ok@QNj%XqjxFj zWouxDw5St^H!L9P5k%-HoFEtD2TCRq;h`wJ-Xc65h0kjfo~kH=OyxSrR#tHXV5WCD z#Ce;*0%ENLh-^C$x{nb=xUVGo*{3n?Sn=d%QFyqDnR&3I@MRr^`&2=WPYulRspSrU z&ASQW5Q0$oiYGqzIOB~I$D(kf3WXn1TZK>WLb%O22hbf5A?+XzBZ$b+;+SrM2og_y z4uwae@WW~*u}8vt9e^tkF>N4b+dv#e5Nbcs?MN9o>Oew+9d>H9^|%YWCxNQ_!z;1>*9t>s<=B z_LH*c51aPqC_G>+fD{?L8iV9f%?5@#yER!pYxR+#ATotmUicZN8bQI;bc#d?On|cfYZCK zKtbeAARu(ELG&&FtMDuoUJ>jDI~09**S8Rq~xg1FiSg2ae88Akw=wdSsba|+<-?$b^Ow1HR|{vO#9 za{>Uj!e&$CZkNKz@#7zU#ti_!K^jO8TM1{5HagwLJ!)x%uTI|J1i;s)ZkkE|&g{#E zi;$-(f{-BwZUBS}(;@JsIGWd6qOX9f=f8C}7c)nXpqXv3YZtzQLSq%EMTrnOI0>eT z=WqjHs$?ll5-$LiFa!KwFhZC-5lnNpz^&^)^a+6f;J8(J+aSg#6;y)~PSqh~z(gK>?j1uL+c&}s_^MVevf60UT?Z=_Hsbw1% zGSof6IrkK{Fvnm=uMKF z#V}pE3Z_UF!vs+-1PxAvz#&GMIz0PwfIu7YRO1g57hoKbcR5m!0MTA)cqcA|c<+^v zEMEiZ%5oH53E7Hj$iUa+`bm4a0nq%g1$Hh!LBISO#Q46qW_h);w`sb2vUm|KfC%zR z#6TJMD3Gt)8X%Z4{K95w(901AkT0qzeAS^{v5ww0VkrYzi3E=CB{RK08dNNiRWAs7c z#gRMyJsZil; z0-`lk82^P@l++p{&cHin0k&CT4RGal!rRkf>7q)SJ-&AOrZe$melPO4G#nt7EW{i~ z{^`~|sL=1DMG@ppVP6i@7AR$_F`%uWAfiNbAx1nGgJ(XC?3Ms$>JZ>;!byZD!EU4R zAl$iipG`QKPb{yu3H7RUEnD)A6{>pHRo5uHlwo#u0i&QI?(bA4RU(Rz^!^sUq&qwcc>ApF83zm%CZh2M88~`Y5 z>8fr`&|X^_5>h!q9avi*JH?zo~hsQSdD4Cu&r=O2KM1{qwH&13 zTPTU%4Ofoca3-F#8^r4mhC;OHKX$W5h@7Y8^*2LNBhf$aLOl6>B(J|3iW8x4aw47_ z7xDVLp~wN~>2|BfyVm~)@cy3+1&5)ZA%FX74*vrhSK`XD$H+JU0000cU41^`yX2r2*o delta 21 dcmdnTv5#XyFV}qzc~Lo$!v~tOH%?#93;jQK002s)25kTU delta 21 dcmZ3&xrB2dfa1^`qf2l@a2 delta 21 dcmZ3-v5sRxFV}qzc~Lo$!v~tOH%_0<3;e@(0svCR2jBnz delta 21 dcmZ3)vxsLxFV}qzc~Lo$!v~tOH%{+n1prkS2pIqX diff --git a/src/common/images/icon96.png b/src/common/images/icon96.png index c0bd99d92c2dcbc82a22a9a5d8185b4b24ded21c..132028e53bed0efee24a1a09e3f5da1e7b61678f 100644 GIT binary patch delta 21 dcmZ3$yMT8>FV{mRE-`a?M$yF$8>e%!0RT#t25SHS delta 21 dcmZ3$yMT8>FV}qzc~M!B7jG}F*f^b&4FFkA2y*}c diff --git a/src/common/images/markdown-here-disabled.svg b/src/common/images/markdown-here-disabled.svg new file mode 100644 index 00000000..2d697af2 --- /dev/null +++ b/src/common/images/markdown-here-disabled.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/src/common/images/markdown-here-monochrome.svg b/src/common/images/markdown-here-monochrome.svg new file mode 100644 index 00000000..1d1babda --- /dev/null +++ b/src/common/images/markdown-here-monochrome.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/src/common/images/markdown-here-normal.svg b/src/common/images/markdown-here-normal.svg new file mode 100644 index 00000000..4e748756 --- /dev/null +++ b/src/common/images/markdown-here-normal.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/src/manifest.json b/src/manifest.json index 1f84e4dc..6b4a1075 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -34,7 +34,7 @@ "19": "common/images/icon19-button-monochrome.png", "32": "common/images/icon32-button-monochrome.png", "38": "common/images/icon38-button-monochrome.png", - "64": "common/images/icon64-monochrome.png" + "64": "common/images/icon64-button-monochrome.png" }, "default_title": "__MSG_toggle_button_tooltip__" }, From 9b3a35ced6cd05b102689fc69cf47104bcc78a9e Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Sun, 7 May 2017 10:57:10 -0400 Subject: [PATCH 10/22] Move scripts into body (was illegal) --- src/common/options.html | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/common/options.html b/src/common/options.html index 1c0b2dad..df1f3979 100644 --- a/src/common/options.html +++ b/src/common/options.html @@ -666,21 +666,21 @@

Changes saved
- + + + - - - + + + + + - - - - - + + - - + - + From aff917d186fa6bcb94050701f4b0c8f4c25f1aa6 Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Sun, 7 May 2017 11:00:58 -0400 Subject: [PATCH 11/22] Change ext ID for Firefox --- src/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/manifest.json b/src/manifest.json index 6b4a1075..e352b286 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -36,7 +36,8 @@ "38": "common/images/icon38-button-monochrome.png", "64": "common/images/icon64-button-monochrome.png" }, - "default_title": "__MSG_toggle_button_tooltip__" + "default_title": "__MSG_toggle_button_tooltip__", + "browser_style": true }, "options_ui": { "page": "common/options.html", @@ -45,8 +46,7 @@ ,"applications": { "gecko": { - "id": "markdown-here@adam.pritchard", - "update_url": "https://example.com/updates.json" + "id": "markdown-here-webext@adam.pritchard" } } } From 0c5102478f68bbcb18443b25bf63af26dbb4da14 Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Sun, 7 May 2017 11:01:57 -0400 Subject: [PATCH 12/22] Update notes; add new release flow --- README.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a6f3cb3c..1212101e 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,37 @@ # WebExtensions notes ## High +* DON'T FORGET THUNDERBIRD * Test the WebExtension. Especially on release Firefox. Publish for prelim review/signing. * Show message to Firefox users about switching to new extension. Probably open options tab with huge message at top. * Decide on whether to keep using AMO. ## Low * Toolbar logo looks crap on dark background - - Doesn't seem to be a way to detect theme and show appropriate icon. (See [this SO question](https://stackoverflow.com/questions/37366781/how-to-detect-firefox-theme)). Maybe will need to provide an option for user to choose icon. + - JUST CREATE AN ISSUE + - Maybe getting fixed someday: https://bugzilla.mozilla.org/show_bug.cgi?id=1329242 + - Maybe will need to provide an option for user to choose icon. ## Steps (after work done) 1. Release WebExtension. Get it signed (happens immediately?). Maybe get it preliminarily reviewed. 2. Release XUL update. Point Firefox users at WebExtension. +## Better steps + +This results in a cleaner migration for existing Firefox users. + +1. Release webext version with new ID. + +2. Modify old version to detect if it's running on Firefox, prompt the user to install the new extension and uninstall the old extension. + ``` + AddonManager.getInstallForURL('https://addons.mozilla.org/firefox/downloads/latest/markdown-here/addon-375281-latest.xpi', function(install) {console.log(arguments); install.install()}, 'application/x-xpinstall') + ``` + +3. Coordinate with AMO reviewers to allow the install/uninstall action. (Via IRC?) + + + + # ![Markdown Here logo](https://raw.github.com/adam-p/markdown-here/master/src/common/images/icon48.png) Markdown Here From bc0739c24e6f4beda53db034ebc8b9cb2a8ca0bd Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Sun, 7 May 2017 11:02:32 -0400 Subject: [PATCH 13/22] Fix platform name for Chrome --- .gitignore | 3 +++ utils/build.js | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 56d4d8a0..6cc0f8f5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,6 @@ Thumbs.db *.sublime-project *.sublime-workspace + +# Build directory +dist diff --git a/utils/build.js b/utils/build.js index 31a99f1f..9c03ee06 100644 --- a/utils/build.js +++ b/utils/build.js @@ -25,7 +25,7 @@ var CHROME_INPUT = [/^manifest\.json$/, /^common(\\|\/)/, /^chrome(\\|\/)/, /^_l var FIREFOX_INPUT = CHROME_INPUT; var THUNDERBIRD_INPUT = [/^chrome.manifest$/, /^install.rdf$/, /^common(\\|\/)/, /^firefox(\\|\/)/]; -var CHROME_PLATFORM = 'firefox'; +var CHROME_PLATFORM = 'chrome'; var FIREFOX_PLATFORM = 'firefox'; var THUNDERBIRD_PLATFORM = 'thunderbird'; From 8dabef177dc76749fc0bbb7b0848f0030f80ce19 Mon Sep 17 00:00:00 2001 From: adam-p Date: Tue, 16 May 2017 09:30:00 -0400 Subject: [PATCH 14/22] Remove "Low" webext item --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 1212101e..53c5bc7d 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,6 @@ * Show message to Firefox users about switching to new extension. Probably open options tab with huge message at top. * Decide on whether to keep using AMO. -## Low -* Toolbar logo looks crap on dark background - - JUST CREATE AN ISSUE - - Maybe getting fixed someday: https://bugzilla.mozilla.org/show_bug.cgi?id=1329242 - - Maybe will need to provide an option for user to choose icon. ## Steps (after work done) 1. Release WebExtension. Get it signed (happens immediately?). Maybe get it preliminarily reviewed. From 19ba5b01c16db21078c3c9b03ed4eeef666884b5 Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Sun, 21 May 2017 21:22:09 -0400 Subject: [PATCH 15/22] Add icon sizes to setIcon to match manifest browserAction --- README.md | 4 +++- src/chrome/backgroundscript.js | 10 ++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 53c5bc7d..c35d0d6c 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,9 @@ This results in a cleaner migration for existing Firefox users. 2. Modify old version to detect if it's running on Firefox, prompt the user to install the new extension and uninstall the old extension. ``` - AddonManager.getInstallForURL('https://addons.mozilla.org/firefox/downloads/latest/markdown-here/addon-375281-latest.xpi', function(install) {console.log(arguments); install.install()}, 'application/x-xpinstall') + AddonManager.getInstallForURL('https://addons.mozilla.org/firefox/downloads/latest/markdown-here/addon-375281-latest.xpi', function(install) {console.log(arguments); install.install()}, 'application/x-xpinstall'); + + AddonManager.getAddonByID('markdown-here@adam.pritchard', function(install) {console.log(arguments); install.uninstall()}); ``` 3. Coordinate with AMO reviewers to allow the install/uninstall action. (Via IRC?) diff --git a/src/chrome/backgroundscript.js b/src/chrome/backgroundscript.js index 597ffe41..9c1c4372 100644 --- a/src/chrome/backgroundscript.js +++ b/src/chrome/backgroundscript.js @@ -95,8 +95,11 @@ chrome.runtime.onMessage.addListener(function(request, sender, responseCallback) tabId: sender.tab.id }); chrome.browserAction.setIcon({ path: { + "16": Utils.getLocalURL('/common/images/icon16-button-monochrome.png'), "19": Utils.getLocalURL('/common/images/icon19-button-monochrome.png'), - "38": Utils.getLocalURL('/common/images/icon38-button-monochrome.png') + "32": Utils.getLocalURL('/common/images/icon32-button-monochrome.png'), + "38": Utils.getLocalURL('/common/images/icon38-button-monochrome.png'), + "64": Utils.getLocalURL('/common/images/icon64-button-monochrome.png') }, tabId: sender.tab.id }); return false; @@ -108,8 +111,11 @@ chrome.runtime.onMessage.addListener(function(request, sender, responseCallback) tabId: sender.tab.id }); chrome.browserAction.setIcon({ path: { + "16": Utils.getLocalURL('/common/images/icon16-button-disabled.png'), "19": Utils.getLocalURL('/common/images/icon19-button-disabled.png'), - "38": Utils.getLocalURL('/common/images/icon38-button-disabled.png') + "32": Utils.getLocalURL('/common/images/icon32-button-disabled.png'), + "38": Utils.getLocalURL('/common/images/icon38-button-disabled.png'), + "64": Utils.getLocalURL('/common/images/icon64-button-disabled.png') }, tabId: sender.tab.id }); return false; From 000e21e78567afbb16eb3563390ca6f0164c5457 Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Mon, 22 May 2017 21:13:43 -0400 Subject: [PATCH 16/22] Update the default chrome.storage.sync quota value --- src/common/options-store.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/options-store.js b/src/common/options-store.js index a0934d27..b741d833 100644 --- a/src/common/options-store.js +++ b/src/common/options-store.js @@ -145,8 +145,8 @@ var ChromeOptionsStore = { return chrome.storage.sync.QUOTA_BYTES_PER_ITEM / 2; } else { - // 2048 is the default value for chrome.storage.sync.QUOTA_BYTES_PER_ITEM, so... - return 2048 / 2; + // 8192 is the default value for chrome.storage.sync.QUOTA_BYTES_PER_ITEM, so... + return 8192 / 2; } }, From 9a34af77d2b24f658030d17a37dbafef3b9c6833 Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Mon, 22 May 2017 21:14:04 -0400 Subject: [PATCH 17/22] Bump max Tbird and Postbox version --- src/install.rdf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/install.rdf b/src/install.rdf index 989c9628..282c44d6 100644 --- a/src/install.rdf +++ b/src/install.rdf @@ -21,7 +21,7 @@ postbox@postbox-inc.com 2.0 - 4.* + 5.* @@ -30,7 +30,7 @@ toolkit@mozilla.org 6.0 - 49.* + 54.* From 1973ab58ffe92cd6c86bba8cd281ae0f9a81eee0 Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Tue, 23 May 2017 21:45:35 -0400 Subject: [PATCH 18/22] Add WebExtensions change item --- src/common/CHANGES.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/common/CHANGES.md b/src/common/CHANGES.md index e1ba3831..80a35904 100644 --- a/src/common/CHANGES.md +++ b/src/common/CHANGES.md @@ -1,12 +1,19 @@ Change Log ========== -2017-xx-yy: v2.13.0 +2017-05-yy: v2.13.0 -------------------- -* [Fixed bug # 369](https://github.com/adam-p/markdown-here/issues/369): Clicking Markdown Here's "Options" button in Firefox and Thunderbird (version 48+) causes the client application to hang. +* Converted the **Firefox** version of Markdown Here to use the WebExtensions API. This makes MDH compatible with Firefox's new **multiprocess** architecture (aka **Electrolysis**). If you have an older version of MDH installed in Firefox, there will soon be a new release of that version which prompts you to install the new WebExtensions version. + - The upgrade for existing Firefox users is a little rocky because the XUL version needs to continue to exist for Thunderbird (and Postbox) users. So the WebExtensions version has to fork. + - The Firefox and Chrome code bases are now almost identical, so that's good. + +* [Fixed bug# 369](https://github.com/adam-p/markdown-here/issues/369): Clicking Markdown Here's "Options" button in Firefox and Thunderbird (version 48+) causes the client application to hang. (Note that this only applies to the XUL version of the extension.) - Thanks to [Sam Estep](https://github.com/samestep), [r2evans](https://github.com/r2evans), [happyconfident](https://github.com/happyconfident), [Juan Salvador Aleixandre](https://github.com/juaalta), [haililihai](https://github.com/haililihai), [Shi Liang](https://github.com/shiliang-hust), [jjroper](https://github.com/jjroper), [Linxzh](https://github.com/l0o0). +* Wondering why there hasn't been a release in a while? My son was born a month after the last release. This is not a coincidence. You guys, having a kid is a lot of work. + + 2015-09-07: v2.12.0 -------------------- From 2930319d343b2482996665f3ba2780a0148d8c2c Mon Sep 17 00:00:00 2001 From: Adam Pritchard Date: Tue, 23 May 2017 21:46:31 -0400 Subject: [PATCH 19/22] Bump version number --- src/install.rdf | 2 +- src/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/install.rdf b/src/install.rdf index 282c44d6..9185751c 100644 --- a/src/install.rdf +++ b/src/install.rdf @@ -5,7 +5,7 @@ 2 markdown-here@adam.pritchard - 2.12.0 + 2.13.0 diff --git a/src/manifest.json b/src/manifest.json index e352b286..1c7d5e82 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "__MSG_app_name__", - "version": "2.12.0", + "version": "2.13.0", "description": "__MSG_app_slogan__", "homepage_url": "http://markdown-here.com", "default_locale": "en", From 5266f4466ec7574bbf1880a0d5a690a1355b5b00 Mon Sep 17 00:00:00 2001 From: adam-p Date: Fri, 26 May 2017 16:25:10 -0400 Subject: [PATCH 20/22] At glob to local node deps, as required by npm bug --- utils/package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/utils/package.json b/utils/package.json index bbc3fa3b..9f8a8a48 100644 --- a/utils/package.json +++ b/utils/package.json @@ -3,9 +3,10 @@ "version": "0.0.0", "private": true, "dependencies": { - "markdown-it": "~3.0.5", - "metascript": "~1.0.0", + "archiver": "*", "file": "*", - "archiver": "*" + "glob": "^7.1.2", + "markdown-it": "~3.0.5", + "metascript": "~1.0.0" } } From e6725a33653b42f7191b88d6388e3e0d5322c24c Mon Sep 17 00:00:00 2001 From: adam-p Date: Fri, 26 May 2017 16:25:41 -0400 Subject: [PATCH 21/22] Exclude Thumbs.db from build zips --- utils/build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/build.js b/utils/build.js index 9c03ee06..9b726311 100644 --- a/utils/build.js +++ b/utils/build.js @@ -31,7 +31,7 @@ var THUNDERBIRD_PLATFORM = 'thunderbird'; var skipFileRegexes = [/^common(\\|\/)test(\\|\/)/, // OS files and temp files - /\.DS_Store$/, /.+\.bts$/, /desktop\.ini$/]; + /\.DS_Store$/, /.+\.bts$/, /desktop\.ini$/, /Thumbs.db$/]; var javascriptFileRegex = /.+\.js$/; var manifestJsonFileRegex = /manifest\.json$/ From 28bee9612b746944bd49cd305176ea1b9ccb1366 Mon Sep 17 00:00:00 2001 From: adam-p Date: Fri, 26 May 2017 16:26:10 -0400 Subject: [PATCH 22/22] Upgade jQuery, as required by Mozilla review --- src/common/CHANGES.md | 4 +- src/common/options-iframe.html | 2 +- src/common/options.html | 2 +- src/common/test/index.html | 2 +- src/common/vendor/jquery-1.9.1.js | 9597 -------------------- src/common/vendor/jquery-3.2.1.slim.min.js | 4 + src/manifest.json | 2 +- 7 files changed, 11 insertions(+), 9602 deletions(-) delete mode 100644 src/common/vendor/jquery-1.9.1.js create mode 100644 src/common/vendor/jquery-3.2.1.slim.min.js diff --git a/src/common/CHANGES.md b/src/common/CHANGES.md index 80a35904..2e988c28 100644 --- a/src/common/CHANGES.md +++ b/src/common/CHANGES.md @@ -1,7 +1,7 @@ Change Log ========== -2017-05-yy: v2.13.0 +2017-05-26: v2.13.1 -------------------- * Converted the **Firefox** version of Markdown Here to use the WebExtensions API. This makes MDH compatible with Firefox's new **multiprocess** architecture (aka **Electrolysis**). If you have an older version of MDH installed in Firefox, there will soon be a new release of that version which prompts you to install the new WebExtensions version. @@ -11,6 +11,8 @@ Change Log * [Fixed bug# 369](https://github.com/adam-p/markdown-here/issues/369): Clicking Markdown Here's "Options" button in Firefox and Thunderbird (version 48+) causes the client application to hang. (Note that this only applies to the XUL version of the extension.) - Thanks to [Sam Estep](https://github.com/samestep), [r2evans](https://github.com/r2evans), [happyconfident](https://github.com/happyconfident), [Juan Salvador Aleixandre](https://github.com/juaalta), [haililihai](https://github.com/haililihai), [Shi Liang](https://github.com/shiliang-hust), [jjroper](https://github.com/jjroper), [Linxzh](https://github.com/l0o0). +* Updated jQuery to 3.2.1. This was required to pass Mozilla review. + * Wondering why there hasn't been a release in a while? My son was born a month after the last release. This is not a coincidence. You guys, having a kid is a lot of work. diff --git a/src/common/options-iframe.html b/src/common/options-iframe.html index a53b18fd..df0b0591 100644 --- a/src/common/options-iframe.html +++ b/src/common/options-iframe.html @@ -17,7 +17,7 @@ - +