├── LICENSE ├── README.md ├── drawings ├── blue.cdr ├── blue.svg ├── gray.cdr ├── gray.svg ├── icon.cdr ├── icon.png ├── new-16.png ├── new.cdr ├── new.svg ├── p-16.png ├── p.cdr ├── p.svg ├── red.cdr ├── red.svg └── safari screenshot.png ├── v1 ├── builds │ ├── packed │ │ ├── icon.png │ │ └── icon64.png │ └── unpacked │ │ └── chrome │ │ ├── _locales │ │ ├── bg │ │ │ └── messages.json │ │ ├── el │ │ │ └── messages.json │ │ ├── en │ │ │ └── messages.json │ │ ├── fr │ │ │ └── messages.json │ │ ├── hu │ │ │ └── messages.json │ │ ├── nl │ │ │ └── messages.json │ │ ├── pl │ │ │ └── messages.json │ │ ├── ru │ │ │ └── messages.json │ │ ├── sr │ │ │ └── messages.json │ │ └── zh_CN │ │ │ └── messages.json │ │ ├── data │ │ ├── icons │ │ │ ├── blue │ │ │ │ ├── 16.png │ │ │ │ ├── 19.png │ │ │ │ └── 32.png │ │ │ ├── browsers │ │ │ │ ├── chrome.png │ │ │ │ ├── firefox.png │ │ │ │ └── opera.png │ │ │ ├── gray │ │ │ │ ├── 16.png │ │ │ │ ├── 19.png │ │ │ │ └── 32.png │ │ │ ├── load0 │ │ │ │ ├── 16.png │ │ │ │ ├── 19.png │ │ │ │ └── 32.png │ │ │ ├── load1 │ │ │ │ ├── 16.png │ │ │ │ ├── 19.png │ │ │ │ └── 32.png │ │ │ ├── load2 │ │ │ │ ├── 16.png │ │ │ │ ├── 19.png │ │ │ │ └── 32.png │ │ │ ├── load3 │ │ │ │ ├── 16.png │ │ │ │ ├── 19.png │ │ │ │ └── 32.png │ │ │ ├── new │ │ │ │ ├── 16.png │ │ │ │ ├── 19.png │ │ │ │ └── 32.png │ │ │ ├── notification │ │ │ │ ├── 16.png │ │ │ │ ├── 32.png │ │ │ │ ├── 48.png │ │ │ │ └── 64.png │ │ │ ├── options │ │ │ │ ├── 16.png │ │ │ │ └── 64.png │ │ │ ├── red │ │ │ │ ├── 128.png │ │ │ │ ├── 16.png │ │ │ │ ├── 19.png │ │ │ │ ├── 32.png │ │ │ │ ├── 48.png │ │ │ │ └── 64.png │ │ │ └── tray │ │ │ │ ├── blue.png │ │ │ │ ├── gray.png │ │ │ │ └── red.png │ │ ├── options │ │ │ ├── chrome │ │ │ │ └── chrome.js │ │ │ ├── css_browser_selector.js │ │ │ ├── index.css │ │ │ ├── index.html │ │ │ └── index.js │ │ ├── popup │ │ │ ├── body │ │ │ │ └── email-chrome.css │ │ │ ├── chrome │ │ │ │ └── chrome.js │ │ │ ├── fetch.gif │ │ │ ├── icons.png │ │ │ ├── index.css │ │ │ ├── index.html │ │ │ ├── index.js │ │ │ └── wait.gif │ │ └── sounds │ │ │ ├── 0.wav │ │ │ ├── 1.wav │ │ │ ├── 2.wav │ │ │ └── 3.wav │ │ ├── lib │ │ ├── common.js │ │ ├── config.js │ │ ├── utils │ │ │ ├── gmail.js │ │ │ ├── render.js │ │ │ ├── server.js │ │ │ ├── tab.js │ │ │ └── timer.js │ │ └── wrapper │ │ │ └── chrome │ │ │ ├── EventEmitter.js │ │ │ ├── app.js │ │ │ └── background.html │ │ └── manifest.json ├── compile │ └── convert.js ├── gulpfile.js ├── package.json └── src │ ├── Icon-64.png │ ├── Info.plist │ ├── Settings.plist │ ├── _locales │ ├── bg │ │ └── messages.json │ ├── el │ │ └── messages.json │ ├── en │ │ └── messages.json │ ├── fr │ │ └── messages.json │ ├── hu │ │ └── messages.json │ ├── nl │ │ └── messages.json │ ├── pl │ │ └── messages.json │ ├── ru │ │ └── messages.json │ ├── sr │ │ └── messages.json │ └── zh_CN │ │ └── messages.json │ ├── chrome.manifest │ ├── data │ ├── firefox │ │ ├── chrome │ │ │ └── content │ │ │ │ └── options-opener.xul │ │ ├── notification.html │ │ ├── shared │ │ │ └── connect.jsm │ │ └── sound.html │ ├── icons │ │ ├── blue │ │ │ ├── 16.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── browsers │ │ │ ├── chrome.png │ │ │ ├── firefox.png │ │ │ ├── opera.png │ │ │ └── safari.png │ │ ├── gray │ │ │ ├── 16.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load0 │ │ │ ├── 16.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load1 │ │ │ ├── 16.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load2 │ │ │ ├── 16.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load3 │ │ │ ├── 16.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── new │ │ │ ├── 16.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── notification │ │ │ ├── 16.png │ │ │ ├── 32.png │ │ │ ├── 48.png │ │ │ └── 64.png │ │ ├── options │ │ │ ├── 16.png │ │ │ └── 64.png │ │ ├── red │ │ │ ├── 128.png │ │ │ ├── 16.png │ │ │ ├── 19.png │ │ │ ├── 32.png │ │ │ ├── 48.png │ │ │ └── 64.png │ │ ├── safari │ │ │ ├── clear.png │ │ │ ├── new.png │ │ │ └── unknown.png │ │ └── tray │ │ │ ├── blue.png │ │ │ ├── gray.png │ │ │ └── red.png │ ├── options │ │ ├── chrome │ │ │ └── chrome.js │ │ ├── css_browser_selector.js │ │ ├── firefox │ │ │ └── firefox.js │ │ ├── index.css │ │ ├── index.html │ │ ├── index.js │ │ └── safari │ │ │ └── safari.js │ ├── popup │ │ ├── body │ │ │ ├── email-chrome.css │ │ │ └── email-firefox.css │ │ ├── chrome │ │ │ └── chrome.js │ │ ├── fetch.gif │ │ ├── firefox │ │ │ └── firefox.js │ │ ├── icons.png │ │ ├── index.css │ │ ├── index.html │ │ ├── index.js │ │ ├── safari │ │ │ └── safari.js │ │ └── wait.gif │ └── sounds │ │ ├── 0.wav │ │ ├── 1.wav │ │ ├── 2.wav │ │ └── 3.wav │ ├── lib │ ├── common.js │ ├── config.js │ ├── utils │ │ ├── gmail.js │ │ ├── render.js │ │ ├── server.js │ │ ├── tab.js │ │ └── timer.js │ └── wrapper │ │ ├── chrome │ │ ├── EventEmitter.js │ │ ├── app.js │ │ └── background.html │ │ ├── firefox │ │ ├── app.js │ │ ├── tbExtra.js │ │ ├── tray │ │ │ ├── darwin │ │ │ │ └── tray.js │ │ │ ├── winnt │ │ │ │ └── tray.js │ │ │ └── wrapper.js │ │ └── userstyles.js │ │ └── safari │ │ ├── app.js │ │ ├── background.html │ │ ├── i18next-1.7.4.js │ │ └── q.js │ ├── locale │ ├── bg.properties │ ├── el.properties │ ├── en-US.properties │ ├── en.properties │ ├── fr.properties │ ├── hu.properties │ ├── nl.properties │ ├── pl.properties │ ├── ru-RU.properties │ ├── ru.properties │ ├── sr.properties │ └── zh-CN.properties │ ├── manifest.json │ ├── package.json │ └── update.plist ├── v2 ├── LICENSE ├── _locales │ ├── ar │ │ └── messages.json │ ├── be │ │ └── messages.json │ ├── bg │ │ └── messages.json │ ├── ca │ │ └── messages.json │ ├── de │ │ └── messages.json │ ├── el │ │ └── messages.json │ ├── en │ │ └── messages.json │ ├── es │ │ └── messages.json │ ├── fr │ │ └── messages.json │ ├── he │ │ └── messages.json │ ├── hu │ │ └── messages.json │ ├── nl │ │ └── messages.json │ ├── pl │ │ └── messages.json │ ├── ru │ │ └── messages.json │ ├── sr │ │ └── messages.json │ ├── tr │ │ └── messages.json │ ├── uk │ │ └── messages.json │ └── zh_CN │ │ └── messages.json ├── config.js ├── data │ ├── icons │ │ ├── blue │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── browsers │ │ │ ├── chrome.png │ │ │ ├── firefox.png │ │ │ └── opera.png │ │ ├── gray │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load0 │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load1 │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load2 │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load3 │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── new │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── notification │ │ │ ├── 16.png │ │ │ ├── 32.png │ │ │ ├── 48.png │ │ │ └── 64.png │ │ ├── options │ │ │ ├── 32.png │ │ │ └── 64.png │ │ ├── red │ │ │ ├── 128.png │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ ├── 32.png │ │ │ ├── 48.png │ │ │ └── 64.png │ │ └── tray │ │ │ ├── blue.png │ │ │ ├── gray.png │ │ │ └── red.png │ ├── images │ │ ├── archive.png │ │ ├── read.png │ │ └── trash.png │ ├── locale.js │ ├── options │ │ ├── index.css │ │ ├── index.html │ │ └── index.js │ ├── popup │ │ ├── accessibility.js │ │ ├── body │ │ │ ├── index.css │ │ │ └── index.html │ │ ├── fetch.gif │ │ ├── gmail.js │ │ ├── icons.png │ │ ├── icons │ │ │ ├── archive.png │ │ │ ├── arrow_drop_down.png │ │ │ ├── check.png │ │ │ ├── check_all.png │ │ │ ├── check_box.png │ │ │ ├── chevron_left.png │ │ │ ├── chevron_right.png │ │ │ ├── delete.png │ │ │ ├── inbox.png │ │ │ ├── list.png │ │ │ ├── refresh.png │ │ │ ├── settings.png │ │ │ └── spam.png │ │ ├── index.css │ │ ├── index.html │ │ ├── index.js │ │ ├── plug-ins │ │ │ ├── labels.js │ │ │ ├── no-star.svg │ │ │ └── star.svg │ │ ├── utils.js │ │ └── wait.gif │ └── sounds │ │ ├── 0.wav │ │ ├── 1.wav │ │ ├── 2.wav │ │ └── 3.wav ├── lib │ ├── common.js │ ├── config.js │ ├── context-menu.js │ ├── gmail.js │ ├── load.js │ ├── toolbar.js │ ├── utils │ │ ├── server.js │ │ ├── tab.js │ │ └── timer.js │ └── wrapper │ │ └── chrome │ │ ├── app.js │ │ └── background.html └── manifest.json ├── v3.classic ├── LICENSE ├── _locales │ ├── ar │ │ └── messages.json │ ├── be │ │ └── messages.json │ ├── bg │ │ └── messages.json │ ├── ca │ │ └── messages.json │ ├── de │ │ └── messages.json │ ├── el │ │ └── messages.json │ ├── en │ │ └── messages.json │ ├── es │ │ └── messages.json │ ├── fr │ │ └── messages.json │ ├── he │ │ └── messages.json │ ├── hu │ │ └── messages.json │ ├── it │ │ └── messages.json │ ├── ja │ │ └── messages.json │ ├── nl │ │ └── messages.json │ ├── pl │ │ └── messages.json │ ├── ru │ │ └── messages.json │ ├── sr │ │ └── messages.json │ ├── tr │ │ └── messages.json │ ├── uk │ │ └── messages.json │ └── zh_CN │ │ └── messages.json ├── core │ ├── button.js │ ├── check.js │ ├── context.js │ ├── offscreen.js │ ├── offscreen │ │ ├── firefox │ │ │ └── polyfill.js │ │ ├── gmail │ │ │ └── core.js │ │ ├── index.html │ │ └── index.js │ ├── open.js │ ├── repeater.js │ ├── sound.js │ ├── utils │ │ ├── feed.js │ │ ├── log.js │ │ └── sax.js │ └── watch.js ├── data │ ├── icons │ │ ├── blue │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── browsers │ │ │ ├── chrome.png │ │ │ ├── edge.png │ │ │ ├── firefox.png │ │ │ └── opera.png │ │ ├── gray │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load0 │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load1 │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load2 │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── load3 │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── new │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ └── 32.png │ │ ├── notification │ │ │ ├── 16.png │ │ │ ├── 32.png │ │ │ ├── 48.png │ │ │ └── 64.png │ │ ├── options │ │ │ ├── 32.png │ │ │ └── 64.png │ │ ├── red │ │ │ ├── 128.png │ │ │ ├── 16.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ ├── 32.png │ │ │ ├── 48.png │ │ │ └── 64.png │ │ └── tray │ │ │ ├── blue.png │ │ │ ├── gray.png │ │ │ └── red.png │ ├── images │ │ ├── archive.png │ │ ├── read.png │ │ └── trash.png │ ├── locale.js │ ├── options │ │ ├── config.js │ │ ├── index.css │ │ ├── index.html │ │ └── index.js │ ├── popup │ │ ├── accessibility.js │ │ ├── body │ │ │ ├── index.css │ │ │ ├── index.html │ │ │ └── index.js │ │ ├── fetch.gif │ │ ├── gmail.js │ │ ├── icons.png │ │ ├── icons │ │ │ ├── archive.png │ │ │ ├── arrow_drop_down.png │ │ │ ├── check.png │ │ │ ├── check_all.png │ │ │ ├── check_box.png │ │ │ ├── chevron_left.png │ │ │ ├── chevron_right.png │ │ │ ├── dark.png │ │ │ ├── delete.png │ │ │ ├── inbox.png │ │ │ ├── list.png │ │ │ ├── refresh.png │ │ │ ├── settings.png │ │ │ └── spam.png │ │ ├── index.css │ │ ├── index.html │ │ ├── index.js │ │ ├── plug-ins │ │ │ ├── labels.js │ │ │ ├── no-star.svg │ │ │ └── star.svg │ │ ├── utils.js │ │ └── wait.gif │ └── sounds │ │ ├── 0.mp4 │ │ ├── 1.mp4 │ │ ├── 2.mp4 │ │ └── 3.mp4 ├── manifest.json └── worker.js └── v3.dev ├── LICENSE ├── _locales ├── be │ └── messages.json ├── ca │ └── messages.json ├── en │ └── messages.json ├── nl │ └── messages.json └── zh_CN │ └── messages.json ├── accounts.js ├── badge.js ├── configs.js ├── core.js ├── data ├── icons │ └── colors │ │ ├── blue │ │ ├── 16.png │ │ └── 32.png │ │ ├── gray │ │ ├── 16.png │ │ └── 32.png │ │ └── red │ │ ├── 128.png │ │ ├── 16.png │ │ ├── 256.png │ │ ├── 32.png │ │ ├── 48.png │ │ ├── 512.png │ │ └── 64.png ├── inject │ └── watch.js ├── options │ ├── index.css │ ├── index.html │ └── index.js ├── popup │ ├── api.js │ ├── commands.js │ ├── externals │ │ └── moment │ │ │ ├── README │ │ │ └── moment.js │ ├── icons │ │ ├── archive.png │ │ ├── delete.png │ │ ├── down.png │ │ ├── down.svg │ │ ├── expand.png │ │ ├── grid-view.svg │ │ ├── inbox.png │ │ ├── loading.svg │ │ ├── mark-all-as-read.png │ │ ├── next.png │ │ ├── options.png │ │ ├── previous.png │ │ ├── refresh.png │ │ ├── report.png │ │ ├── silent.svg │ │ ├── single-view.svg │ │ ├── sound.svg │ │ ├── star_false.png │ │ └── star_true.png │ ├── index.css │ ├── index.html │ ├── index.js │ └── view │ │ ├── sandbox │ │ ├── sandbox.css │ │ └── sandbox.html │ │ ├── view.css │ │ ├── view.html │ │ └── view.js └── sounds │ ├── 0.wav │ ├── 1.wav │ ├── 2.wav │ └── 3.wav ├── engines ├── .eslintrc ├── api │ └── core.js ├── native │ └── core.js └── rss │ └── core.js ├── manifest.json ├── plugins.js ├── utils ├── query.js └── sax.js └── worker.js /README.md: -------------------------------------------------------------------------------- 1 | ## [Gmail Notifier](https://webextension.org/listing/gmail-notifier.html) browser extension (ignotifier) 2 | 3 | ### Description 4 | [Gmail Notifier](https://webextension.org/listing/gmail-notifier.html) is a multi-account notifier for Google mail (without storing passwords locally) 5 | 6 | ### YouTube Preview 7 | [![YouTube Preview](https://img.youtube.com/vi/5Z2huN_GNkA/0.jpg)](https://www.youtube.com/watch?v=5Z2huN_GNkA) 8 | 9 | ### Listings (v3) 10 | 11 | * [Chrome Webstore](https://chrome.google.com/webstore/detail/gmail-notifier-developer/inglgcknnendooehdkhplbmhhbfkngmg) 12 | * [Firefox Add-ons](https://addons.mozilla.org/firefox/addon/gmail-notifier-dev-edition/) 13 | * [Edge Addons](https://microsoftedge.microsoft.com/addons/detail/jhgfdokolagmnmjggpipkdefblhlhaap) 14 | 15 | ### Listings (v2) 16 | 17 | * [Chrome Webstore](https://chrome.google.com/webstore/detail/gmail-notifier/dcjichoefijpinlfnjghokpkojhlhkgl) 18 | * [Firefox Add-ons](https://addons.mozilla.org/firefox/addon/gmail-notifier-restartless/) 19 | * [Edge Addons](https://microsoftedge.microsoft.com/addons/detail/cmhmeappbhdaifkknkhdnmogalbnhloa) 20 | * [Opera Addons](https://addons.opera.com/extensions/details/gmail-notifier/) 21 | 22 | ### How to translate ignotifier 23 | * To translate ignotifier into your language head to [transifex.com](https://www.transifex.com/projects/p/gmail-notifier-addon) page. 24 | * After the translation is ready, insert the translated file in `/src/_locales` directory 25 | * For Firefox to recognize the translation, you will need to run the following commend in the root directory 26 | `node compile/convert.js` 27 | * Now compile the project as described above to have the localized version of ignotifier. 28 | 29 | ### How to try the precompiled latest version on Firefox 30 | 1. Select the right branch 31 | 2. Browse the `builds/packed` directory 32 | 3. Download the raw *.xpi file 33 | 4. Open a browser tab for `about:debugging` and turn on the developer mode 34 | 5. Point the browse button to the download XPI 35 | 36 | ### How to try the precompiled latest version on Chrome 37 | 1. Select the right branch 38 | 2. Browse the `builds/packed` directory 39 | 3. Download the *.zip file and extract it somewhere 40 | 4. Open a browser tab for `chrome://extensions` and turn on the developer mode 41 | 5. Point the browse button to the root directory 42 | -------------------------------------------------------------------------------- /drawings/blue.cdr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/blue.cdr -------------------------------------------------------------------------------- /drawings/blue.svg: -------------------------------------------------------------------------------- 1 | 2 | 13 | 15 | 16 | 18 | image/svg+xml 19 | 21 | 22 | 23 | 24 | 26 | 30 | 32 | 36 | 40 | 44 | 48 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /drawings/gray.cdr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/gray.cdr -------------------------------------------------------------------------------- /drawings/gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 13 | 15 | 16 | 18 | image/svg+xml 19 | 21 | 22 | 23 | 24 | 26 | 30 | 32 | 36 | 40 | 44 | 48 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /drawings/icon.cdr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/icon.cdr -------------------------------------------------------------------------------- /drawings/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/icon.png -------------------------------------------------------------------------------- /drawings/new-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/new-16.png -------------------------------------------------------------------------------- /drawings/new.cdr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/new.cdr -------------------------------------------------------------------------------- /drawings/new.svg: -------------------------------------------------------------------------------- 1 | 2 | 13 | 15 | 16 | 18 | image/svg+xml 19 | 21 | 22 | 23 | 24 | 26 | 30 | 31 | -------------------------------------------------------------------------------- /drawings/p-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/p-16.png -------------------------------------------------------------------------------- /drawings/p.cdr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/p.cdr -------------------------------------------------------------------------------- /drawings/p.svg: -------------------------------------------------------------------------------- 1 | 2 | 14 | 16 | 17 | 19 | image/svg+xml 20 | 22 | 23 | 24 | 25 | 27 | 29 | 33 | 35 | 37 | 42 | 47 | 48 | 56 | 57 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /drawings/red.cdr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/red.cdr -------------------------------------------------------------------------------- /drawings/red.svg: -------------------------------------------------------------------------------- 1 | 2 | 13 | 15 | 16 | 18 | image/svg+xml 19 | 21 | 22 | 23 | 24 | 26 | 30 | 32 | 36 | 40 | 44 | 48 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /drawings/safari screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/safari screenshot.png -------------------------------------------------------------------------------- /v1/builds/packed/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/packed/icon.png -------------------------------------------------------------------------------- /v1/builds/packed/icon64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/packed/icon64.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/blue/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/blue/16.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/blue/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/blue/19.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/blue/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/blue/32.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/browsers/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/browsers/chrome.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/browsers/firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/browsers/firefox.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/browsers/opera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/browsers/opera.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/gray/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/gray/16.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/gray/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/gray/19.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/gray/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/gray/32.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load0/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load0/16.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load0/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load0/19.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load0/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load0/32.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load1/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load1/16.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load1/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load1/19.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load1/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load1/32.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load2/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load2/16.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load2/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load2/19.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load2/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load2/32.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load3/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load3/16.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load3/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load3/19.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/load3/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/load3/32.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/new/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/new/16.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/new/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/new/19.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/new/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/new/32.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/notification/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/notification/16.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/notification/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/notification/32.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/notification/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/notification/48.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/notification/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/notification/64.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/options/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/options/16.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/options/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/options/64.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/red/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/red/128.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/red/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/red/16.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/red/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/red/19.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/red/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/red/32.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/red/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/red/48.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/red/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/red/64.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/tray/blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/tray/blue.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/tray/gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/tray/gray.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/icons/tray/red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/icons/tray/red.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/options/chrome/chrome.js: -------------------------------------------------------------------------------- 1 | /* globals chrome */ 2 | 'use strict'; 3 | 4 | var background = { 5 | send: function (id, data) { 6 | chrome.extension.sendRequest({method: id, data: data}); 7 | }, 8 | receive: function (id, callback) { 9 | chrome.runtime.onMessage.addListener(function (request) { 10 | if (request.method === id) { 11 | callback(request.data); 12 | } 13 | }); 14 | } 15 | }; 16 | 17 | (function (elems) { 18 | [].forEach.call(elems, function (elem) { 19 | elem.textContent = chrome.i18n.getMessage(elem.getAttribute('data-l10n-id')); 20 | }); 21 | })(document.querySelectorAll('*[data-l10n-id]')); 22 | -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/options/css_browser_selector.js: -------------------------------------------------------------------------------- 1 | /* 2 | CSS Browser Selector v0.4.0 (Nov 02, 2010) 3 | Rafael Lima (http://rafael.adm.br) 4 | http://rafael.adm.br/css_browser_selector 5 | License: http://creativecommons.org/licenses/by/2.5/ 6 | Contributors: http://rafael.adm.br/css_browser_selector#contributors 7 | */ 8 | function css_browser_selector(u){var ua=u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1},g='gecko',w='webkit',s='safari',o='opera',m='mobile',h=document.documentElement,b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3.5')?g+' ff3 ff3_5':is('firefox/3.6')?g+' ff3 ff3_6':is('firefox/3')?g+' ff3':is('gecko/')?g:is('opera')?o+(/version\/(\d+)/.test(ua)?' '+o+RegExp.$1:(/opera(\s|\/)(\d+)/.test(ua)?' '+o+RegExp.$2:'')):is('konqueror')?'konqueror':is('blackberry')?m+' blackberry':is('android')?m+' android':is('chrome')?w+' chrome':is('iron')?w+' iron':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?m+' j2me':is('iphone')?m+' iphone':is('ipod')?m+' ipod':is('ipad')?m+' ipad':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win'+(is('windows nt 6.0')?' vista':''):is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;}; css_browser_selector(navigator.userAgent); 9 | -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/options/index.css: -------------------------------------------------------------------------------- 1 | .flex { 2 | display: -webkit-flex; 3 | display: flex; 4 | flex-direction: column; 5 | -webkit-flex-direction: column; 6 | } 7 | .note { 8 | color: #707070 !important; 9 | padding: 0; 10 | margin: 5px 0 0 0; 11 | font-size: 85%; 12 | } 13 | .warning { 14 | color: #FB8F91; 15 | } 16 | 17 | .box { 18 | display: flex; 19 | align-items: center; 20 | } 21 | .box input, 22 | .box select { 23 | display: table-cell; 24 | width:100%; 25 | } 26 | .box div { 27 | white-space: nowrap; 28 | margin-right: 10px; 29 | } 30 | 31 | .browse { 32 | display: none; 33 | font-weight: bold; 34 | padding: 0 5px; 35 | cursor: pointer; 36 | } 37 | .browse input { 38 | display: none; 39 | } 40 | 41 | .spacer { 42 | height: 18px; 43 | margin: 0; 44 | } 45 | 46 | .only-safari, 47 | .only-mac, 48 | .only-firefox { 49 | display: none; 50 | } 51 | .safari .only-safari, 52 | .mac .only-mac, 53 | .gecko .only-firefox { 54 | display: block; 55 | } 56 | 57 | body { 58 | align-items: center; 59 | -webkit-align-items: center; 60 | margin: 0; 61 | } 62 | body, 63 | table { 64 | font-size: 14px; 65 | color: #222; 66 | font-family: arial,sans-serif; 67 | } 68 | select, 69 | input { 70 | background-color: #fff; 71 | } 72 | input { 73 | height: 24px; 74 | border: 1px solid #C8C8C8; 75 | } 76 | select { 77 | height: 22px; 78 | border: 0; 79 | outline: 1px solid #C8C8C8; 80 | } 81 | 82 | input[type=checkbox] { 83 | width: 20px; 84 | height: 20px; 85 | } 86 | 87 | input[type=number] { 88 | width: 55px; 89 | } 90 | 91 | label>input { 92 | vertical-align: middle; 93 | } 94 | 95 | body>* { 96 | width: 800px; 97 | display: -webkit-flex; 98 | display: flex; 99 | } 100 | 101 | #header { 102 | width: 100%; 103 | background-color: #F1F1F1; 104 | border-bottom: solid 1px #E5E5E5; 105 | justify-content: center; 106 | -webkit-justify-content: center; 107 | } 108 | #header>div>span { 109 | padding-left: 105px; 110 | } 111 | #header>div:nth-child(1)>span:nth-child(1) { 112 | font-size: 140%; 113 | } 114 | 115 | #header table { 116 | height: 94px; 117 | } 118 | #header td[type=icon] { 119 | width: 90px; 120 | background-image: url(../icons/options/64.png); 121 | background-position: right 10px center; 122 | background-repeat: no-repeat; 123 | } 124 | #header td[type=title] { 125 | vertical-align: bottom; 126 | } 127 | #header td[type=inshort] { 128 | vertical-align: top; 129 | } 130 | #header td[type=donation] { 131 | text-align: center; 132 | width: 300px; 133 | } 134 | #header button { 135 | background-color: #F07600; 136 | color: #FFF; 137 | border: 1px solid transparent; 138 | border-radius: 0px; 139 | cursor: pointer; 140 | height: 32px; 141 | line-height: 20px; 142 | min-height: 32px; 143 | min-width: 90px; 144 | outline: medium none; 145 | text-align: center; 146 | vertical-align: middle !important; 147 | } 148 | #header td[type=links] { 149 | width: 200px; 150 | } 151 | #header td[type=links] ul{ 152 | list-style-type: none; 153 | padding: 0; 154 | } 155 | 156 | table { 157 | border-collapse: collapse; 158 | } 159 | #content>table>tbody>tr { 160 | border-bottom: solid 1px #E5E5E5; 161 | } 162 | #content>table>tbody>tr>td { 163 | padding: 20px 0 20px 0; 164 | } 165 | #content>table>tbody>tr>td:nth-child(1){ 166 | width: 120px; 167 | font-weight: bold; 168 | vertical-align: top; 169 | } 170 | -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/options/index.js: -------------------------------------------------------------------------------- 1 | /* globals self, alert, background */ 2 | 'use strict'; 3 | 4 | var isFirefox = typeof self !== 'undefined' && self.port; 5 | 6 | var connect = function (elem, pref) { 7 | var att = 'value'; 8 | if (elem) { 9 | if (elem.type === 'checkbox') { 10 | att = 'checked'; 11 | } 12 | if (elem.localName === 'select') { 13 | att = 'selectedIndex'; 14 | } 15 | if (elem.localName === 'span') { 16 | att = 'textContent'; 17 | } 18 | pref = pref || elem.getAttribute('data-pref'); 19 | background.send('get', pref); 20 | elem.addEventListener('change', function () { 21 | if (pref.endsWith('.file')) { 22 | var base = pref.replace('.file', ''); 23 | var file = this.files[0]; 24 | var input = document.querySelector('[data-pref="' + pref + '"]'); 25 | if (input) { 26 | input.parentNode.style.display = 'none'; 27 | } 28 | background.send('changed', { 29 | pref: base + '.mime', 30 | value: file.type 31 | }); 32 | var reader = new FileReader(); 33 | reader.onload = function (e) { 34 | background.send('changed', { 35 | pref, 36 | value: e.target.result 37 | }); 38 | }; 39 | reader.onerror = function (e) { 40 | alert(e); 41 | }; 42 | reader.readAsDataURL(file); 43 | } 44 | else { 45 | background.send('changed', { 46 | pref: pref, 47 | value: this[att] 48 | }); 49 | } 50 | }); 51 | } 52 | return { 53 | get value () { 54 | return elem[att]; 55 | }, 56 | set value (val) { 57 | if (elem.type === 'file') { 58 | return; 59 | } 60 | elem[att] = val; 61 | } 62 | }; 63 | }; 64 | 65 | background.receive('set', function (o) { 66 | if (window[o.pref]) { 67 | window[o.pref].value = o.value; 68 | } 69 | }); 70 | 71 | background.receive('custom-sound', function (pref) { 72 | if (isFirefox) { 73 | background.send('custom-sound', pref); 74 | } 75 | else { 76 | var input = document.querySelector('[data-pref="' + pref + '"]'); 77 | if (input) { 78 | input.parentElement.style.display = 'inline-block'; 79 | } 80 | } 81 | }); 82 | 83 | window.addEventListener('DOMContentLoaded', function () { 84 | var prefs = document.querySelectorAll('*[data-pref]'); 85 | [].forEach.call(prefs, function (elem) { 86 | var pref = elem.getAttribute('data-pref'); 87 | window[pref] = connect(elem, pref); 88 | }); 89 | }, false); 90 | -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/popup/body/email-chrome.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | } 4 | table { 5 | color: inherit; 6 | } 7 | body, td { 8 | font-family: arial,sans-serif; 9 | font-size: 12px; 10 | } 11 | a { 12 | color: #1155CC; 13 | text-decoration: none; 14 | } 15 | -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/popup/chrome/chrome.js: -------------------------------------------------------------------------------- 1 | /* globals chrome */ 2 | 'use strict'; 3 | 4 | var background = { 5 | send: function (id, data) { 6 | chrome.extension.sendRequest({method: id, data: data}); 7 | }, 8 | receive: function (id, callback) { 9 | if (id === 'show') { 10 | window.addEventListener('load', function () { 11 | background.send('show'); 12 | callback(); 13 | }, false); 14 | } 15 | else { 16 | chrome.extension.onRequest.addListener(function (request) { 17 | if (request.method === id) { 18 | callback(request.data); 19 | } 20 | }); 21 | } 22 | } 23 | }; 24 | 25 | var manifest = { 26 | url: chrome.extension.getURL(''), 27 | locale: chrome.i18n.getMessage 28 | }; 29 | 30 | (function (elems) { 31 | [].forEach.call(elems, function (elem) { 32 | elem.textContent = chrome.i18n.getMessage(elem.getAttribute('data-l10n-id')); 33 | }); 34 | })(document.querySelectorAll('*[data-l10n-id]')); 35 | 36 | chrome.extension.getBackgroundPage().userActions.forEach(function (callback) { 37 | callback(); 38 | }); 39 | -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/popup/fetch.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/popup/fetch.gif -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/popup/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/popup/icons.png -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/popup/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Email
12 |
- -
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | Title 21 |
22 |
23 |
24 | Sender 25 |
26 |
Email
27 |
date
28 |
29 |
30 | 31 |
32 |
33 | 34 | 43 | 44 | 54 |
    55 |
    56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/popup/wait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/popup/wait.gif -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/sounds/0.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/sounds/0.wav -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/sounds/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/sounds/1.wav -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/sounds/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/sounds/2.wav -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/data/sounds/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/builds/unpacked/chrome/data/sounds/3.wav -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/lib/utils/tab.js: -------------------------------------------------------------------------------- 1 | var isFirefox = typeof require !== 'undefined'; 2 | if (isFirefox) { 3 | app = require('../wrapper/firefox/app'); 4 | tab = exports; 5 | } 6 | else { 7 | var tab = {}; 8 | } -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/lib/utils/timer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var app = app || require('../wrapper/firefox/app'); 4 | var timer; 5 | 6 | var isFirefox = typeof require !== 'undefined'; 7 | if (isFirefox) { 8 | timer = exports; 9 | } 10 | else { 11 | timer = {}; 12 | } 13 | 14 | /** Repeater: Repeats a function infinity with an interval pattern 15 | * Example: 16 | * var repeater = new repeater(1000, 10000, 2000); 17 | * var i = 0; 18 | * repeater.on(function () { 19 | * i += 1; 20 | * console.error(i); 21 | * if (i == 6) { 22 | * repeater.reset(); 23 | * } 24 | * if (i == 10) { 25 | * repeater.stop(); 26 | * } 27 | * }); 28 | **/ 29 | timer.repeater = function () { 30 | var id, callback; 31 | var intervals = [].slice.call(arguments, 0); 32 | function stop () { 33 | if (id) { 34 | app.timer.clearTimeout(id); 35 | } 36 | } 37 | function run () { 38 | var t = intervals.length > 1 ? intervals.shift() : intervals[0]; 39 | stop(); 40 | id = app.timer.setTimeout(function (args) { 41 | run(); 42 | try { 43 | callback.apply(null, args); 44 | } 45 | catch (e) {} 46 | }, t, arguments); 47 | } 48 | 49 | return { 50 | reset: function () { 51 | stop(); 52 | intervals.unshift(0); 53 | run.apply(null, arguments); 54 | }, 55 | stop: stop, 56 | on: function (c) { 57 | callback = c; 58 | run(); 59 | }, 60 | fill: function () { 61 | intervals = [].slice.call(arguments, 0); 62 | } 63 | }; 64 | }; 65 | 66 | timer.setTimeout = app.timer.setTimeout; 67 | timer.clearTimeout = app.timer.clearTimeout; 68 | timer.setInterval = app.timer.setInterval; 69 | -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/lib/wrapper/chrome/background.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /v1/builds/unpacked/chrome/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Notifier for Gmail™", 3 | "short_name": "ignotifier", 4 | "description": "__MSG_description__", 5 | "author": "InBasic", 6 | "version": "0.7.4", 7 | "manifest_version": 2, 8 | "default_locale": "en", 9 | "permissions": [ 10 | "https://mail.google.com/mail/", 11 | "tabs", 12 | "notifications", 13 | "contextMenus", 14 | "webRequest", 15 | "storage" 16 | ], 17 | "web_accessible_resources": [ 18 | "notification.png" 19 | ], 20 | "browser_action": { 21 | "default_icon": "data/icons/blue/19.png" 22 | }, 23 | "background": { 24 | "page": "lib/wrapper/chrome/background.html" 25 | }, 26 | "options_page": "data/options/index.html", 27 | "homepage_url": "http://add0n.com/gmail-notifier.html", 28 | "icons": { 29 | "16": "data/icons/red/16.png", 30 | "48": "data/icons/red/48.png", 31 | "128": "data/icons/red/128.png" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /v1/compile/convert.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var fs = require('fs'); 4 | var path = require('path'); 5 | 6 | function convert (input, outputs) { 7 | 8 | fs.exists('src/_locales/' + input + '/messages.json', function (exists) { 9 | if (exists) { 10 | fs.readFile('src/_locales/' + input + '/messages.json', 'utf8', function (err, data) { 11 | if (err) { 12 | throw err; 13 | } 14 | var json = JSON.parse(data); 15 | var c = ''; 16 | for (var name in json) { 17 | c += name + '=' + json[name].message + '\n'; 18 | } 19 | outputs.forEach(function (output) { 20 | fs.writeFile('src/locale/' + output + '.properties', c, 'utf8', function (err) { 21 | if (err) { 22 | throw err; 23 | } 24 | else { 25 | console.log('[done]', input + '/messages.json', 'src/locale/' + output + '.properties'); 26 | } 27 | }); 28 | }); 29 | }); 30 | } 31 | else { 32 | console.error('[error]', 'Cannot locate', input + '/messages.json'); 33 | } 34 | }); 35 | } 36 | 37 | function map (input) { 38 | if (input === 'en') { 39 | return ['en', 'en-US']; 40 | } 41 | if (input === 'ru') { 42 | return ['ru', 'ru-RU']; 43 | } 44 | return [input.replace('_', '-')]; 45 | } 46 | 47 | fs.readdir('src/locale', function (err, files) { 48 | console.error(err); 49 | files.forEach(function (file) { 50 | fs.unlinkSync(path.resolve('src/locale', file)); 51 | }); 52 | fs.readdir('src/_locales/', function (err, files) { 53 | files.filter(f => !f.startsWith('.')).forEach(function (file) { 54 | convert (file, map(file)); 55 | }); 56 | }); 57 | }); 58 | 59 | -------------------------------------------------------------------------------- /v1/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "InBasic ", 3 | "name" : "ignotifier", 4 | "version" : "0.2.6", 5 | "dependencies" : 6 | { 7 | "cli-color": "*", 8 | "commander": "*", 9 | "gulp": "*", 10 | "gulp-change": "*", 11 | "gulp-babel": "*", 12 | "babel-preset-es2015": "*", 13 | "gulp-if": "*", 14 | "gulp-filter": "*", 15 | "gulp-shell": "*", 16 | "gulp-wait": "*", 17 | "gulp-clean": "*", 18 | "gulp-zip": "*", 19 | "gulp-rename": "*", 20 | "run-sequence": "*", 21 | "jpm": "*" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /v1/src/Icon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/Icon-64.png -------------------------------------------------------------------------------- /v1/src/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Author 6 | InBasic 7 | Builder Version 8 | 10600.3.18 9 | CFBundleDisplayName 10 | Email Notifier for Gmail 11 | CFBundleIdentifier 12 | com.add0n.gmail 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleShortVersionString 16 | 0.5.0 17 | CFBundleVersion 18 | 1 19 | Chrome 20 | 21 | Database Quota 22 | 10485760 23 | Global Page 24 | lib/wrapper/safari/background.html 25 | Toolbar Items 26 | 27 | 28 | Identifier 29 | toolbarbutton 30 | Image 31 | data/icons/safari/unknown.png 32 | Label 33 | Gmail™ Notifier 34 | Popover 35 | 36 | 37 | 38 | 39 | Content 40 | 41 | Scripts 42 | 43 | 44 | Description 45 | Multiple label and account notifier for Google Mail (Gmail) 46 | DeveloperIdentifier 47 | 2C3W8RZ8ND 48 | ExtensionInfoDictionaryVersion 49 | 1.0 50 | Permissions 51 | 52 | Website Access 53 | 54 | Include Secure Pages 55 | 56 | Level 57 | All 58 | 59 | 60 | Update Manifest URL 61 | https://raw.githubusercontent.com/inbasic/ignotifier/multi-browser/src.safariextension/update.plist 62 | Website 63 | http://add0n.com/gmail-notifier.html 64 | 65 | 66 | -------------------------------------------------------------------------------- /v1/src/Settings.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /v1/src/chrome.manifest: -------------------------------------------------------------------------------- 1 | content ignotifier ./ 2 | -------------------------------------------------------------------------------- /v1/src/data/firefox/chrome/content/options-opener.xul: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /v1/src/data/firefox/notification.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /v1/src/data/firefox/shared/connect.jsm: -------------------------------------------------------------------------------- 1 | var EXPORTED_SYMBOLS = ["remote"]; 2 | 3 | var remote = {}; 4 | -------------------------------------------------------------------------------- /v1/src/data/firefox/sound.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /v1/src/data/icons/blue/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/blue/16.png -------------------------------------------------------------------------------- /v1/src/data/icons/blue/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/blue/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/blue/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/blue/32.png -------------------------------------------------------------------------------- /v1/src/data/icons/browsers/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/browsers/chrome.png -------------------------------------------------------------------------------- /v1/src/data/icons/browsers/firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/browsers/firefox.png -------------------------------------------------------------------------------- /v1/src/data/icons/browsers/opera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/browsers/opera.png -------------------------------------------------------------------------------- /v1/src/data/icons/browsers/safari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/browsers/safari.png -------------------------------------------------------------------------------- /v1/src/data/icons/gray/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/gray/16.png -------------------------------------------------------------------------------- /v1/src/data/icons/gray/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/gray/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/gray/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/gray/32.png -------------------------------------------------------------------------------- /v1/src/data/icons/load0/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load0/16.png -------------------------------------------------------------------------------- /v1/src/data/icons/load0/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load0/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/load0/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load0/32.png -------------------------------------------------------------------------------- /v1/src/data/icons/load1/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load1/16.png -------------------------------------------------------------------------------- /v1/src/data/icons/load1/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load1/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/load1/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load1/32.png -------------------------------------------------------------------------------- /v1/src/data/icons/load2/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load2/16.png -------------------------------------------------------------------------------- /v1/src/data/icons/load2/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load2/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/load2/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load2/32.png -------------------------------------------------------------------------------- /v1/src/data/icons/load3/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load3/16.png -------------------------------------------------------------------------------- /v1/src/data/icons/load3/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load3/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/load3/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/load3/32.png -------------------------------------------------------------------------------- /v1/src/data/icons/new/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/new/16.png -------------------------------------------------------------------------------- /v1/src/data/icons/new/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/new/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/new/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/new/32.png -------------------------------------------------------------------------------- /v1/src/data/icons/notification/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/notification/16.png -------------------------------------------------------------------------------- /v1/src/data/icons/notification/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/notification/32.png -------------------------------------------------------------------------------- /v1/src/data/icons/notification/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/notification/48.png -------------------------------------------------------------------------------- /v1/src/data/icons/notification/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/notification/64.png -------------------------------------------------------------------------------- /v1/src/data/icons/options/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/options/16.png -------------------------------------------------------------------------------- /v1/src/data/icons/options/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/options/64.png -------------------------------------------------------------------------------- /v1/src/data/icons/red/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/red/128.png -------------------------------------------------------------------------------- /v1/src/data/icons/red/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/red/16.png -------------------------------------------------------------------------------- /v1/src/data/icons/red/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/red/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/red/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/red/32.png -------------------------------------------------------------------------------- /v1/src/data/icons/red/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/red/48.png -------------------------------------------------------------------------------- /v1/src/data/icons/red/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/red/64.png -------------------------------------------------------------------------------- /v1/src/data/icons/safari/clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/safari/clear.png -------------------------------------------------------------------------------- /v1/src/data/icons/safari/new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/safari/new.png -------------------------------------------------------------------------------- /v1/src/data/icons/safari/unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/safari/unknown.png -------------------------------------------------------------------------------- /v1/src/data/icons/tray/blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/tray/blue.png -------------------------------------------------------------------------------- /v1/src/data/icons/tray/gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/tray/gray.png -------------------------------------------------------------------------------- /v1/src/data/icons/tray/red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/icons/tray/red.png -------------------------------------------------------------------------------- /v1/src/data/options/chrome/chrome.js: -------------------------------------------------------------------------------- 1 | /* globals chrome */ 2 | 'use strict'; 3 | 4 | var background = { 5 | send: function (id, data) { 6 | chrome.extension.sendRequest({method: id, data: data}); 7 | }, 8 | receive: function (id, callback) { 9 | chrome.runtime.onMessage.addListener(function (request) { 10 | if (request.method === id) { 11 | callback(request.data); 12 | } 13 | }); 14 | } 15 | }; 16 | 17 | (function (elems) { 18 | [].forEach.call(elems, function (elem) { 19 | elem.textContent = chrome.i18n.getMessage(elem.getAttribute('data-l10n-id')); 20 | }); 21 | })(document.querySelectorAll('*[data-l10n-id]')); 22 | -------------------------------------------------------------------------------- /v1/src/data/options/css_browser_selector.js: -------------------------------------------------------------------------------- 1 | /* 2 | CSS Browser Selector v0.4.0 (Nov 02, 2010) 3 | Rafael Lima (http://rafael.adm.br) 4 | http://rafael.adm.br/css_browser_selector 5 | License: http://creativecommons.org/licenses/by/2.5/ 6 | Contributors: http://rafael.adm.br/css_browser_selector#contributors 7 | */ 8 | function css_browser_selector(u){var ua=u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1},g='gecko',w='webkit',s='safari',o='opera',m='mobile',h=document.documentElement,b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3.5')?g+' ff3 ff3_5':is('firefox/3.6')?g+' ff3 ff3_6':is('firefox/3')?g+' ff3':is('gecko/')?g:is('opera')?o+(/version\/(\d+)/.test(ua)?' '+o+RegExp.$1:(/opera(\s|\/)(\d+)/.test(ua)?' '+o+RegExp.$2:'')):is('konqueror')?'konqueror':is('blackberry')?m+' blackberry':is('android')?m+' android':is('chrome')?w+' chrome':is('iron')?w+' iron':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?m+' j2me':is('iphone')?m+' iphone':is('ipod')?m+' ipod':is('ipad')?m+' ipad':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win'+(is('windows nt 6.0')?' vista':''):is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;}; css_browser_selector(navigator.userAgent); 9 | -------------------------------------------------------------------------------- /v1/src/data/options/firefox/firefox.js: -------------------------------------------------------------------------------- 1 | /* globals self */ 2 | 'use strict'; 3 | 4 | var background = { 5 | send: function (id, data) { 6 | self.port.emit(id, data); 7 | }, 8 | receive: function (id, callback) { 9 | self.port.on(id, callback); 10 | } 11 | }; 12 | 13 | background.receive('show', function () { 14 | background.send('show'); 15 | }); 16 | -------------------------------------------------------------------------------- /v1/src/data/options/index.css: -------------------------------------------------------------------------------- 1 | .flex { 2 | display: -webkit-flex; 3 | display: flex; 4 | flex-direction: column; 5 | -webkit-flex-direction: column; 6 | } 7 | .note { 8 | color: #707070 !important; 9 | padding: 0; 10 | margin: 5px 0 0 0; 11 | font-size: 85%; 12 | } 13 | .warning { 14 | color: #FB8F91; 15 | } 16 | 17 | .box { 18 | display: flex; 19 | align-items: center; 20 | } 21 | .box input, 22 | .box select { 23 | display: table-cell; 24 | width:100%; 25 | } 26 | .box div { 27 | white-space: nowrap; 28 | margin-right: 10px; 29 | } 30 | 31 | .browse { 32 | display: none; 33 | font-weight: bold; 34 | padding: 0 5px; 35 | cursor: pointer; 36 | } 37 | .browse input { 38 | display: none; 39 | } 40 | 41 | .spacer { 42 | height: 18px; 43 | margin: 0; 44 | } 45 | 46 | .only-safari, 47 | .only-mac, 48 | .only-firefox { 49 | display: none; 50 | } 51 | .safari .only-safari, 52 | .mac .only-mac, 53 | .gecko .only-firefox { 54 | display: block; 55 | } 56 | 57 | body { 58 | align-items: center; 59 | -webkit-align-items: center; 60 | margin: 0; 61 | } 62 | body, 63 | table { 64 | font-size: 14px; 65 | color: #222; 66 | font-family: arial,sans-serif; 67 | } 68 | select, 69 | input { 70 | background-color: #fff; 71 | } 72 | input { 73 | height: 24px; 74 | border: 1px solid #C8C8C8; 75 | } 76 | select { 77 | height: 22px; 78 | border: 0; 79 | outline: 1px solid #C8C8C8; 80 | } 81 | 82 | input[type=checkbox] { 83 | width: 20px; 84 | height: 20px; 85 | } 86 | 87 | input[type=number] { 88 | width: 55px; 89 | } 90 | 91 | label>input { 92 | vertical-align: middle; 93 | } 94 | 95 | body>* { 96 | width: 800px; 97 | display: -webkit-flex; 98 | display: flex; 99 | } 100 | 101 | #header { 102 | width: 100%; 103 | background-color: #F1F1F1; 104 | border-bottom: solid 1px #E5E5E5; 105 | justify-content: center; 106 | -webkit-justify-content: center; 107 | } 108 | #header>div>span { 109 | padding-left: 105px; 110 | } 111 | #header>div:nth-child(1)>span:nth-child(1) { 112 | font-size: 140%; 113 | } 114 | 115 | #header table { 116 | height: 94px; 117 | } 118 | #header td[type=icon] { 119 | width: 90px; 120 | background-image: url(../icons/options/64.png); 121 | background-position: right 10px center; 122 | background-repeat: no-repeat; 123 | } 124 | #header td[type=title] { 125 | vertical-align: bottom; 126 | } 127 | #header td[type=inshort] { 128 | vertical-align: top; 129 | } 130 | #header td[type=donation] { 131 | text-align: center; 132 | width: 300px; 133 | } 134 | #header button { 135 | background-color: #F07600; 136 | color: #FFF; 137 | border: 1px solid transparent; 138 | border-radius: 0px; 139 | cursor: pointer; 140 | height: 32px; 141 | line-height: 20px; 142 | min-height: 32px; 143 | min-width: 90px; 144 | outline: medium none; 145 | text-align: center; 146 | vertical-align: middle !important; 147 | } 148 | #header td[type=links] { 149 | width: 200px; 150 | } 151 | #header td[type=links] ul{ 152 | list-style-type: none; 153 | padding: 0; 154 | } 155 | 156 | table { 157 | border-collapse: collapse; 158 | } 159 | #content>table>tbody>tr { 160 | border-bottom: solid 1px #E5E5E5; 161 | } 162 | #content>table>tbody>tr>td { 163 | padding: 20px 0 20px 0; 164 | } 165 | #content>table>tbody>tr>td:nth-child(1){ 166 | width: 120px; 167 | font-weight: bold; 168 | vertical-align: top; 169 | } 170 | -------------------------------------------------------------------------------- /v1/src/data/options/index.js: -------------------------------------------------------------------------------- 1 | /* globals self, alert, background */ 2 | 'use strict'; 3 | 4 | var isFirefox = typeof self !== 'undefined' && self.port; 5 | 6 | var connect = function (elem, pref) { 7 | var att = 'value'; 8 | if (elem) { 9 | if (elem.type === 'checkbox') { 10 | att = 'checked'; 11 | } 12 | if (elem.localName === 'select') { 13 | att = 'selectedIndex'; 14 | } 15 | if (elem.localName === 'span') { 16 | att = 'textContent'; 17 | } 18 | pref = pref || elem.getAttribute('data-pref'); 19 | background.send('get', pref); 20 | elem.addEventListener('change', function () { 21 | if (pref.endsWith('.file')) { 22 | var base = pref.replace('.file', ''); 23 | var file = this.files[0]; 24 | var input = document.querySelector('[data-pref="' + pref + '"]'); 25 | if (input) { 26 | input.parentNode.style.display = 'none'; 27 | } 28 | background.send('changed', { 29 | pref: base + '.mime', 30 | value: file.type 31 | }); 32 | var reader = new FileReader(); 33 | reader.onload = function (e) { 34 | background.send('changed', { 35 | pref, 36 | value: e.target.result 37 | }); 38 | }; 39 | reader.onerror = function (e) { 40 | alert(e); 41 | }; 42 | reader.readAsDataURL(file); 43 | } 44 | else { 45 | background.send('changed', { 46 | pref: pref, 47 | value: this[att] 48 | }); 49 | } 50 | }); 51 | } 52 | return { 53 | get value () { 54 | return elem[att]; 55 | }, 56 | set value (val) { 57 | if (elem.type === 'file') { 58 | return; 59 | } 60 | elem[att] = val; 61 | } 62 | }; 63 | }; 64 | 65 | background.receive('set', function (o) { 66 | if (window[o.pref]) { 67 | window[o.pref].value = o.value; 68 | } 69 | }); 70 | 71 | background.receive('custom-sound', function (pref) { 72 | if (isFirefox) { 73 | background.send('custom-sound', pref); 74 | } 75 | else { 76 | var input = document.querySelector('[data-pref="' + pref + '"]'); 77 | if (input) { 78 | input.parentElement.style.display = 'inline-block'; 79 | } 80 | } 81 | }); 82 | 83 | window.addEventListener('DOMContentLoaded', function () { 84 | var prefs = document.querySelectorAll('*[data-pref]'); 85 | [].forEach.call(prefs, function (elem) { 86 | var pref = elem.getAttribute('data-pref'); 87 | window[pref] = connect(elem, pref); 88 | }); 89 | }, false); 90 | -------------------------------------------------------------------------------- /v1/src/data/options/safari/safari.js: -------------------------------------------------------------------------------- 1 | /* globals safari */ 2 | 'use strict'; 3 | 4 | var background = { 5 | send: function (id, obj) { 6 | safari.self.tab.dispatchMessage('message', { 7 | id: id, 8 | data: obj 9 | }); 10 | }, 11 | receive: (function () { 12 | var callbacks = {}; 13 | safari.self.addEventListener('message', function (e) { 14 | if (callbacks[e.name]) { 15 | callbacks[e.name](e.message); 16 | } 17 | }, false); 18 | 19 | return function (id, callback) { 20 | callbacks[id] = callback; 21 | }; 22 | })() 23 | }; 24 | 25 | script('../../lib/wrapper/safari/i18next-1.7.4.js', function () { 26 | i18n.init({ 27 | resGetPath: '../../_locales/en/messages.json' 28 | }, function () { 29 | var elems = document.querySelectorAll('*[data-l10n-id]'); 30 | [].forEach.call(elems, function (elem) { 31 | elem.textContent = i18n.t(elem.getAttribute('data-l10n-id') + '.message'); 32 | }); 33 | }); 34 | }); 35 | -------------------------------------------------------------------------------- /v1/src/data/popup/body/email-chrome.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | } 4 | table { 5 | color: inherit; 6 | } 7 | body, td { 8 | font-family: arial,sans-serif; 9 | font-size: 12px; 10 | } 11 | a { 12 | color: #1155CC; 13 | text-decoration: none; 14 | } 15 | -------------------------------------------------------------------------------- /v1/src/data/popup/body/email-firefox.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | } 4 | table { 5 | color: inherit; 6 | } 7 | body, td { 8 | font-family: arial,sans-serif; 9 | font-size: 12px; 10 | } 11 | /* support black themes; #139 */ 12 | html, body { 13 | background-color: #fff; 14 | } 15 | a { 16 | color: #1155CC; 17 | text-decoration: none; 18 | } 19 | 20 | body>table:first-child, 21 | body>hr, 22 | .maincontent>table:first-child, 23 | .maincontent>hr { 24 | display: none; 25 | } 26 | 27 | .message>tbody>tr:nth-child(1), .message>tbody>tr:nth-child(2) { 28 | display: none; 29 | } 30 | 31 | .message>tbody>tr>td>table>tbody>tr>td { 32 | padding: 0 6px; 33 | } 34 | -------------------------------------------------------------------------------- /v1/src/data/popup/chrome/chrome.js: -------------------------------------------------------------------------------- 1 | /* globals chrome */ 2 | 'use strict'; 3 | 4 | var background = { 5 | send: function (id, data) { 6 | chrome.extension.sendRequest({method: id, data: data}); 7 | }, 8 | receive: function (id, callback) { 9 | if (id === 'show') { 10 | window.addEventListener('load', function () { 11 | background.send('show'); 12 | callback(); 13 | }, false); 14 | } 15 | else { 16 | chrome.extension.onRequest.addListener(function (request) { 17 | if (request.method === id) { 18 | callback(request.data); 19 | } 20 | }); 21 | } 22 | } 23 | }; 24 | 25 | var manifest = { 26 | url: chrome.extension.getURL(''), 27 | locale: chrome.i18n.getMessage 28 | }; 29 | 30 | (function (elems) { 31 | [].forEach.call(elems, function (elem) { 32 | elem.textContent = chrome.i18n.getMessage(elem.getAttribute('data-l10n-id')); 33 | }); 34 | })(document.querySelectorAll('*[data-l10n-id]')); 35 | 36 | chrome.extension.getBackgroundPage().userActions.forEach(function (callback) { 37 | callback(); 38 | }); 39 | -------------------------------------------------------------------------------- /v1/src/data/popup/fetch.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/popup/fetch.gif -------------------------------------------------------------------------------- /v1/src/data/popup/firefox/firefox.js: -------------------------------------------------------------------------------- 1 | /* globals self */ 2 | 'use strict'; 3 | 4 | var background = { 5 | send: self.port.emit, 6 | receive: self.port.on 7 | }; 8 | 9 | var manifest = { 10 | url: self.options.base, 11 | locale: (id) => self.options.locales[id] 12 | }; 13 | 14 | background.receive('show', function () { 15 | background.send('show'); 16 | }); 17 | -------------------------------------------------------------------------------- /v1/src/data/popup/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/popup/icons.png -------------------------------------------------------------------------------- /v1/src/data/popup/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Email
    12 |
    - -
    13 |
    14 |
    15 |
    16 |
    17 |
    18 |
    19 |
    20 | Title 21 |
    22 |
    23 |
    24 | Sender 25 |
    26 |
    Email
    27 |
    date
    28 |
    29 |
    30 | 31 |
    32 |
    33 | 34 | 43 | 44 | 54 |
      55 |
      56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /v1/src/data/popup/safari/safari.js: -------------------------------------------------------------------------------- 1 | /* globals safari */ 2 | 'use strict'; 3 | 4 | var background = (function () { 5 | var callbacks = {}; 6 | return { 7 | send: function (id, data) { 8 | safari.extension.globalPage.contentWindow.app.popup.dispatchMessage(id, data); 9 | }, 10 | receive: function (id, callback) { 11 | callbacks[id] = callback; 12 | }, 13 | dispatchMessage: function (id, data) { 14 | if (callbacks[id]) { 15 | callbacks[id](data); 16 | } 17 | } 18 | }; 19 | })(); 20 | 21 | var manifest = { 22 | url: safari.extension.baseURI 23 | }; 24 | -------------------------------------------------------------------------------- /v1/src/data/popup/wait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/popup/wait.gif -------------------------------------------------------------------------------- /v1/src/data/sounds/0.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/sounds/0.wav -------------------------------------------------------------------------------- /v1/src/data/sounds/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/sounds/1.wav -------------------------------------------------------------------------------- /v1/src/data/sounds/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/sounds/2.wav -------------------------------------------------------------------------------- /v1/src/data/sounds/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v1/src/data/sounds/3.wav -------------------------------------------------------------------------------- /v1/src/lib/utils/tab.js: -------------------------------------------------------------------------------- 1 | var isFirefox = typeof require !== 'undefined'; 2 | if (isFirefox) { 3 | app = require('../wrapper/firefox/app'); 4 | tab = exports; 5 | } 6 | else { 7 | var tab = {}; 8 | } -------------------------------------------------------------------------------- /v1/src/lib/utils/timer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var app = app || require('../wrapper/firefox/app'); 4 | var timer; 5 | 6 | var isFirefox = typeof require !== 'undefined'; 7 | if (isFirefox) { 8 | timer = exports; 9 | } 10 | else { 11 | timer = {}; 12 | } 13 | 14 | /** Repeater: Repeats a function infinity with an interval pattern 15 | * Example: 16 | * var repeater = new repeater(1000, 10000, 2000); 17 | * var i = 0; 18 | * repeater.on(function () { 19 | * i += 1; 20 | * console.error(i); 21 | * if (i == 6) { 22 | * repeater.reset(); 23 | * } 24 | * if (i == 10) { 25 | * repeater.stop(); 26 | * } 27 | * }); 28 | **/ 29 | timer.repeater = function () { 30 | var id, callback; 31 | var intervals = [].slice.call(arguments, 0); 32 | function stop () { 33 | if (id) { 34 | app.timer.clearTimeout(id); 35 | } 36 | } 37 | function run () { 38 | var t = intervals.length > 1 ? intervals.shift() : intervals[0]; 39 | stop(); 40 | id = app.timer.setTimeout(function (args) { 41 | run(); 42 | try { 43 | callback.apply(null, args); 44 | } 45 | catch (e) {} 46 | }, t, arguments); 47 | } 48 | 49 | return { 50 | reset: function () { 51 | stop(); 52 | intervals.unshift(0); 53 | run.apply(null, arguments); 54 | }, 55 | stop: stop, 56 | on: function (c) { 57 | callback = c; 58 | run(); 59 | }, 60 | fill: function () { 61 | intervals = [].slice.call(arguments, 0); 62 | } 63 | }; 64 | }; 65 | 66 | timer.setTimeout = app.timer.setTimeout; 67 | timer.clearTimeout = app.timer.clearTimeout; 68 | timer.setInterval = app.timer.setInterval; 69 | -------------------------------------------------------------------------------- /v1/src/lib/wrapper/chrome/background.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /v1/src/lib/wrapper/firefox/tbExtra.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var {Cu} = require('chrome'), 4 | self = require('sdk/self'), 5 | unload = require('sdk/system/unload'); 6 | 7 | const NS_XUL = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'; 8 | 9 | var onContext, onClick, button; 10 | 11 | (function (listen) { 12 | let {CustomizableUI} = Cu.import('resource:///modules/CustomizableUI.jsm'); 13 | CustomizableUI.addListener(listen); 14 | unload.when(() => CustomizableUI.removeListener(listen)); 15 | })({ 16 | onWidgetBeforeDOMChange: function (tbb) { 17 | if (tbb.id.indexOf(self.name) === -1) { 18 | return; 19 | } 20 | // Install onContext if it is not installed 21 | if (!tbb.isOnContextInstalled) { 22 | tbb.isOnContextInstalled = true; 23 | 24 | let doc = tbb.ownerDocument.defaultView.document; 25 | let menupopup = doc.createElementNS(NS_XUL, 'menupopup'); 26 | let menu = doc.createElementNS(NS_XUL, 'menu'); 27 | let menuitem = doc.createElementNS(NS_XUL, 'menuitem'); 28 | let menuseparator = doc.createElementNS(NS_XUL, 'menuseparator'); 29 | 30 | tbb.addEventListener('contextmenu', function (e) { 31 | if (onContext) { 32 | //Prevent Firefox context menu 33 | e.stopPropagation(); 34 | e.preventDefault(); 35 | try { 36 | onContext(e, menupopup, menuitem, menuseparator, menu); 37 | } 38 | catch (e) { 39 | console.error(e, '1'); 40 | } 41 | menupopup.openPopup(tbb , 'after_end', 0, 0, false); 42 | } 43 | }, true); 44 | tbb.addEventListener('popuphidden', function () { 45 | if (button) { 46 | button.state('window', { 47 | checked: false 48 | }); 49 | } 50 | }); 51 | tbb.addEventListener('click', function (e) { 52 | if (onClick) { 53 | onClick(e); 54 | } 55 | }, true); 56 | tbb.appendChild(menupopup); 57 | } 58 | } 59 | }); 60 | 61 | exports.onContext = (c) => onContext = c; 62 | exports.onClick = (c) => onClick = c; 63 | exports.attach = (b) => button = b; 64 | -------------------------------------------------------------------------------- /v1/src/lib/wrapper/firefox/tray/darwin/tray.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var {Cc, Ci} = require('chrome'), 4 | unload = require('sdk/system/unload'), 5 | config = require('../../../../config'); 6 | 7 | var dock = Cc['@mozilla.org/widget/macdocksupport;1'] 8 | .getService(Ci.nsIMacDockSupport); 9 | 10 | exports.set = function (badge) { 11 | if(!config.tray.show) { 12 | return; 13 | } 14 | dock.badgeText = badge; 15 | }; 16 | exports.remove = function () { 17 | dock.badgeText = ''; 18 | }; 19 | exports.callback = function () {}; 20 | 21 | unload.when(exports.remove); 22 | -------------------------------------------------------------------------------- /v1/src/lib/wrapper/firefox/tray/wrapper.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var os = require('sdk/system').platform; 4 | 5 | exports.tray = (function () { 6 | let callback = function () {}; 7 | let module; 8 | 9 | if (os !== 'winnt' && os !== 'darwin') { 10 | return { 11 | set: function () {}, 12 | remove: function () {}, 13 | callback: function () {} 14 | }; 15 | } 16 | 17 | return { 18 | set: (a, b) => { 19 | if (!module) { 20 | module = require('./' + os + '/tray'); 21 | module.callback(callback); 22 | } 23 | module.set(a, b); 24 | }, 25 | remove: () => module ? module.remove() : null, 26 | callback: (c) => callback = c 27 | }; 28 | })(); 29 | -------------------------------------------------------------------------------- /v1/src/lib/wrapper/firefox/userstyles.js: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 | "use strict"; 5 | 6 | const { Cc, Ci } = require("chrome"); 7 | const unload = require("sdk/system/unload").when; 8 | 9 | const sss = Cc["@mozilla.org/content/style-sheet-service;1"] 10 | .getService(Ci.nsIStyleSheetService); 11 | 12 | function getURI(aURL) Cc["@mozilla.org/network/io-service;1"] 13 | .getService(Ci.nsIIOService).newURI(aURL, null, null); 14 | 15 | function setOptions(url, options) { 16 | let newOptions = {}; 17 | options = options || {}; 18 | 19 | newOptions.uri = getURI(url); 20 | newOptions.type = (options.type || 'user').toLowerCase(); 21 | newOptions.type = (newOptions.type == 'agent') ? sss.AGENT_SHEET : sss.USER_SHEET; 22 | 23 | return newOptions; 24 | }; 25 | 26 | /** 27 | * Load various packaged styles for the add-on and undo on unload 28 | * 29 | * @usage load(aURL): Load specified style 30 | * @param [string] aURL: Style file to load 31 | * @param [object] options: 32 | */ 33 | const loadSS = exports.load = function loadSS(url, options) { 34 | let { uri, type } = setOptions(url, options); 35 | 36 | // load the stylesheet 37 | sss.loadAndRegisterSheet(uri, type); 38 | 39 | // unload the stylesheet on unload 40 | unload(unregisterSS.bind(null, url, options)); 41 | }; 42 | 43 | const registeredSS = exports.registered = function registeredSS(url, options) { 44 | let { uri, type } = setOptions(url, options); 45 | 46 | // check that the stylesheet is registered 47 | return !!sss.sheetRegistered(uri, type); 48 | }; 49 | 50 | const unregisterSS = exports.unload = function unregisterSS(url, options) { 51 | let { uri, type } = setOptions(url, options); 52 | 53 | // unregister the stylesheet 54 | sss.unregisterSheet(uri, type); 55 | }; 56 | -------------------------------------------------------------------------------- /v1/src/lib/wrapper/safari/background.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /v1/src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Notifier for Gmail™", 3 | "short_name": "ignotifier", 4 | "description": "__MSG_description__", 5 | "author": "InBasic", 6 | "version": "0.7.4", 7 | "manifest_version": 2, 8 | "default_locale": "en", 9 | "permissions": [ 10 | "https://mail.google.com/mail/", 11 | "tabs", 12 | "notifications", 13 | "contextMenus", 14 | "webRequest", 15 | "storage" 16 | ], 17 | "web_accessible_resources": [ 18 | "notification.png" 19 | ], 20 | "browser_action": { 21 | "default_icon": "data/icons/blue/19.png" 22 | }, 23 | "background": { 24 | "page": "lib/wrapper/chrome/background.html" 25 | }, 26 | "options_page": "data/options/index.html", 27 | "homepage_url": "http://add0n.com/gmail-notifier.html", 28 | "icons": { 29 | "16": "data/icons/red/16.png", 30 | "48": "data/icons/red/48.png", 31 | "128": "data/icons/red/128.png" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /v1/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Gmail™ Notifier (restartless)", 3 | "name": "ignotifier", 4 | "description": "Multiple label and account notifier for Google Mail (Gmail)", 5 | "id": "jid0-GjwrPchS3Ugt7xydvqVK4DQk8Ls@jetpack", 6 | "license": "MPLv2.0", 7 | "version": "0.7.4", 8 | "author": "InBasic", 9 | "contributors": [ 10 | "CaTz", 11 | "ecaron" 12 | ], 13 | "lib": "lib", 14 | "main": "./lib/common.js", 15 | "url": "http://add0n.com/gmail-notifier.html", 16 | "permissions": { 17 | "private-browsing": true, 18 | "unsafe-content-script": true, 19 | "cross-domain-content": ["file:///"], 20 | "multiprocess": true 21 | }, 22 | "preferences": [{ 23 | "type": "control", 24 | "label": "Open Options", 25 | "name": "settings_open", 26 | "title": "Open options (settings) page" 27 | }] 28 | } 29 | -------------------------------------------------------------------------------- /v1/src/update.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Extension Updates 6 | 7 | 8 | CFBundleIdentifier 9 | com.add0n.gmail 10 | Developer Identifier 11 | L62F677Y54 12 | CFBundleVersion 13 | 1 14 | CFBundleShortVersionString 15 | 0.5.0 16 | URL 17 | https://github.com/inbasic/ignotifier/blob/multi-browser/src.safariextension/executables/ignotifier.safariextz?raw=true 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /v2/LICENSE: -------------------------------------------------------------------------------- 1 | ../LICENSE -------------------------------------------------------------------------------- /v2/data/icons/blue/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/blue/16.png -------------------------------------------------------------------------------- /v2/data/icons/blue/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/blue/18.png -------------------------------------------------------------------------------- /v2/data/icons/blue/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/blue/19.png -------------------------------------------------------------------------------- /v2/data/icons/blue/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/blue/32.png -------------------------------------------------------------------------------- /v2/data/icons/browsers/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/browsers/chrome.png -------------------------------------------------------------------------------- /v2/data/icons/browsers/firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/browsers/firefox.png -------------------------------------------------------------------------------- /v2/data/icons/browsers/opera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/browsers/opera.png -------------------------------------------------------------------------------- /v2/data/icons/gray/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/gray/16.png -------------------------------------------------------------------------------- /v2/data/icons/gray/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/gray/18.png -------------------------------------------------------------------------------- /v2/data/icons/gray/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/gray/19.png -------------------------------------------------------------------------------- /v2/data/icons/gray/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/gray/32.png -------------------------------------------------------------------------------- /v2/data/icons/load0/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load0/16.png -------------------------------------------------------------------------------- /v2/data/icons/load0/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load0/18.png -------------------------------------------------------------------------------- /v2/data/icons/load0/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load0/19.png -------------------------------------------------------------------------------- /v2/data/icons/load0/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load0/32.png -------------------------------------------------------------------------------- /v2/data/icons/load1/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load1/16.png -------------------------------------------------------------------------------- /v2/data/icons/load1/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load1/18.png -------------------------------------------------------------------------------- /v2/data/icons/load1/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load1/19.png -------------------------------------------------------------------------------- /v2/data/icons/load1/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load1/32.png -------------------------------------------------------------------------------- /v2/data/icons/load2/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load2/16.png -------------------------------------------------------------------------------- /v2/data/icons/load2/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load2/18.png -------------------------------------------------------------------------------- /v2/data/icons/load2/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load2/19.png -------------------------------------------------------------------------------- /v2/data/icons/load2/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load2/32.png -------------------------------------------------------------------------------- /v2/data/icons/load3/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load3/16.png -------------------------------------------------------------------------------- /v2/data/icons/load3/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load3/18.png -------------------------------------------------------------------------------- /v2/data/icons/load3/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load3/19.png -------------------------------------------------------------------------------- /v2/data/icons/load3/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/load3/32.png -------------------------------------------------------------------------------- /v2/data/icons/new/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/new/16.png -------------------------------------------------------------------------------- /v2/data/icons/new/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/new/18.png -------------------------------------------------------------------------------- /v2/data/icons/new/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/new/19.png -------------------------------------------------------------------------------- /v2/data/icons/new/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/new/32.png -------------------------------------------------------------------------------- /v2/data/icons/notification/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/notification/16.png -------------------------------------------------------------------------------- /v2/data/icons/notification/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/notification/32.png -------------------------------------------------------------------------------- /v2/data/icons/notification/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/notification/48.png -------------------------------------------------------------------------------- /v2/data/icons/notification/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/notification/64.png -------------------------------------------------------------------------------- /v2/data/icons/options/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/options/32.png -------------------------------------------------------------------------------- /v2/data/icons/options/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/options/64.png -------------------------------------------------------------------------------- /v2/data/icons/red/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/red/128.png -------------------------------------------------------------------------------- /v2/data/icons/red/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/red/16.png -------------------------------------------------------------------------------- /v2/data/icons/red/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/red/18.png -------------------------------------------------------------------------------- /v2/data/icons/red/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/red/19.png -------------------------------------------------------------------------------- /v2/data/icons/red/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/red/32.png -------------------------------------------------------------------------------- /v2/data/icons/red/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/red/48.png -------------------------------------------------------------------------------- /v2/data/icons/red/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/red/64.png -------------------------------------------------------------------------------- /v2/data/icons/tray/blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/tray/blue.png -------------------------------------------------------------------------------- /v2/data/icons/tray/gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/tray/gray.png -------------------------------------------------------------------------------- /v2/data/icons/tray/red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/icons/tray/red.png -------------------------------------------------------------------------------- /v2/data/images/archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/images/archive.png -------------------------------------------------------------------------------- /v2/data/images/read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/images/read.png -------------------------------------------------------------------------------- /v2/data/images/trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/images/trash.png -------------------------------------------------------------------------------- /v2/data/locale.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var locale = { 4 | get: chrome.i18n.getMessage 5 | }; 6 | 7 | (elems => { 8 | elems.forEach(elem => { 9 | const att = elem.dataset.l10nValue; 10 | const value = locale.get(elem.dataset.l10nId); 11 | if (att) { 12 | elem.setAttribute(att, value); 13 | } 14 | else { 15 | elem.textContent = value; 16 | } 17 | }); 18 | })([...document.querySelectorAll('[data-l10n-id]')]); 19 | -------------------------------------------------------------------------------- /v2/data/popup/accessibility.js: -------------------------------------------------------------------------------- 1 | /* global qs */ 2 | 'use strict'; 3 | 4 | // Link opener for html 5 | { 6 | const opener = e => { 7 | const target = e.target; 8 | 9 | const a = target.closest('a') || target; 10 | let link = a.dataset.href || a.href || a.src || target.src || target.href; 11 | 12 | if (link && link.startsWith('https://www.google.com/url?q=')) { 13 | const args = (new URL(link)).searchParams; 14 | link = args.get('q') || link; 15 | } 16 | 17 | if (link) { 18 | e.preventDefault(); 19 | e.stopPropagation(); 20 | chrome.runtime.sendMessage({ 21 | method: 'open', 22 | url: { 23 | link, 24 | button: e.button, 25 | ctrlKey: e.ctrlKey, 26 | shiftKey: e.shiftKey, 27 | altKey: e.altKey, 28 | metaKey: e.metaKey 29 | } 30 | }, () => e.button === 0 ? window.close() : null); 31 | } 32 | }; 33 | window.addEventListener('click', opener); 34 | qs('iframe').addEventListener('load', () => { 35 | qs('iframe').contentDocument.addEventListener('mousedown', opener); 36 | }); 37 | } 38 | 39 | { 40 | function keyup(e) { 41 | if (!keyup.doKeyUp) { 42 | return; 43 | } 44 | 45 | if (e.keyCode === 49 && e.shiftKey) { 46 | qs('spam').click(); 47 | } 48 | if (e.keyCode === 51 && e.shiftKey) { 49 | qs('trash').click(); 50 | } 51 | if (e.keyCode === 73 && e.shiftKey) { 52 | qs('read').click(); 53 | } 54 | if (e.keyCode === 69) { 55 | qs('archive').click(); 56 | } 57 | } 58 | chrome.storage.local.get({ 59 | keyUp: false 60 | }, prefs => keyup.doKeyUp = prefs.keyUp); 61 | 62 | window.addEventListener('keyup', keyup); 63 | qs('iframe').contentDocument.addEventListener('keyup', keyup); 64 | } 65 | 66 | window.focus(); 67 | 68 | chrome.runtime.getBackgroundPage(b => b.userActions.forEach(c => c())); 69 | -------------------------------------------------------------------------------- /v2/data/popup/body/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | } 4 | table { 5 | color: inherit; 6 | } 7 | body, 8 | td { 9 | font-family: arial, sans-serif; 10 | font-size: 12px; 11 | } 12 | a { 13 | color: #15c; 14 | text-decoration: none; 15 | cursor: pointer; 16 | } 17 | body > hr { 18 | border: none; 19 | border-bottom: solid 4px whitesmoke; 20 | } 21 | body > hr:last-child { 22 | display: none; 23 | } 24 | 25 | .root { 26 | width: 100%; 27 | border-collapse: collapse; 28 | border: none; 29 | } 30 | -------------------------------------------------------------------------------- /v2/data/popup/body/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /v2/data/popup/fetch.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/fetch.gif -------------------------------------------------------------------------------- /v2/data/popup/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons.png -------------------------------------------------------------------------------- /v2/data/popup/icons/archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/archive.png -------------------------------------------------------------------------------- /v2/data/popup/icons/arrow_drop_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/arrow_drop_down.png -------------------------------------------------------------------------------- /v2/data/popup/icons/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/check.png -------------------------------------------------------------------------------- /v2/data/popup/icons/check_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/check_all.png -------------------------------------------------------------------------------- /v2/data/popup/icons/check_box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/check_box.png -------------------------------------------------------------------------------- /v2/data/popup/icons/chevron_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/chevron_left.png -------------------------------------------------------------------------------- /v2/data/popup/icons/chevron_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/chevron_right.png -------------------------------------------------------------------------------- /v2/data/popup/icons/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/delete.png -------------------------------------------------------------------------------- /v2/data/popup/icons/inbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/inbox.png -------------------------------------------------------------------------------- /v2/data/popup/icons/list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/list.png -------------------------------------------------------------------------------- /v2/data/popup/icons/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/refresh.png -------------------------------------------------------------------------------- /v2/data/popup/icons/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/settings.png -------------------------------------------------------------------------------- /v2/data/popup/icons/spam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/icons/spam.png -------------------------------------------------------------------------------- /v2/data/popup/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
      11 |
      Email
      12 |
      - -
      13 |
      14 |
      15 |
      16 |
      17 |
      18 |
      19 |
      20 | Title 21 |
      22 | 23 |
      24 | 30 |
      31 |
      32 | Sender 33 |
      34 |
      Email
      35 |
      date
      36 |
      37 |
      38 | 39 |
      40 |
      41 | 42 | 51 | 52 | 62 |
        63 |
        64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /v2/data/popup/plug-ins/labels.js: -------------------------------------------------------------------------------- 1 | /* globals api, gmail, action, selected */ 2 | 'use strict'; 3 | 4 | { 5 | let response; 6 | let root; 7 | let query; 8 | let inprogress = ''; 9 | 10 | function star(url) { 11 | const id = gmail.get.id(url); 12 | const o = response.filter(o => o.thread === id).shift(); 13 | if (o) { 14 | document.body.dataset.star = o.labels.some(s => s === 'STARRED'); 15 | } 16 | else { 17 | document.body.dataset.star = 'hide'; 18 | } 19 | } 20 | const hiddens = ['STARRED', 'Inbox', 'INBOX']; 21 | function labels(url) { 22 | const id = gmail.get.id(url); 23 | const o = response.filter(o => o.thread === id).shift(); 24 | if (o) { 25 | const parent = document.getElementById('labels'); 26 | const t = document.getElementById('label-template'); 27 | parent.textContent = ''; 28 | o.labels.map(s => s === '^i' ? 'Inbox' : s).filter(s => s.startsWith('^') === false && hiddens.indexOf(s) === -1).forEach(label => { 29 | const clone = document.importNode(t.content, true); 30 | clone.querySelector('span').textContent = label; 31 | clone.querySelector('div').dataset.value = label; 32 | parent.appendChild(clone); 33 | }); 34 | 35 | document.body.dataset.labels = true; 36 | } 37 | else { 38 | document.body.dataset.labels = false; 39 | } 40 | } 41 | 42 | const update = (q = query, callback = () => {}) => chrome.runtime.sendMessage({ 43 | method: 'gmail.search', 44 | url: selected.parent.xml.rootLink, 45 | query: q 46 | }, r => { 47 | if (!r || r instanceof Error) { 48 | console.error(r); 49 | } 50 | else { 51 | response = r; 52 | query = q; 53 | root = selected.parent.xml.rootLink; 54 | callback(); 55 | } 56 | }); 57 | 58 | function fetch(url = selected.entry.link) { 59 | document.body.dataset.labels = false; 60 | document.body.dataset.star = 'hide'; 61 | 62 | const q = 'in:' + (selected.parent.xml.label || 'inbox') + ' is:unread'; 63 | if (q === query && root === selected.parent.xml.rootLink && response) { 64 | star(url); 65 | labels(url); 66 | } 67 | else { 68 | if (inprogress === q) { 69 | console.warn('update is rejected; duplicated'); 70 | } 71 | else { 72 | inprogress = q; 73 | update(q, () => { 74 | inprogress = ''; 75 | star(url); 76 | labels(url); 77 | }); 78 | } 79 | } 80 | } 81 | 82 | api.on('update-full-content', fetch); 83 | 84 | document.getElementById('star').addEventListener('click', () => { 85 | const cmd = document.body.dataset.star === 'true' ? 'xst' : 'st'; 86 | action(cmd, selected.entry.link, update); 87 | document.body.dataset.star = cmd === 'xst' ? 'false' : 'true'; 88 | }); 89 | document.getElementById('labels').addEventListener('click', ({target}) => { 90 | const cmd = target.dataset.cmd; 91 | if (cmd === 'remove-label') { 92 | const div = target.closest('div'); 93 | const label = div.dataset.value; 94 | action('rc_' + label, selected.entry.link, update); 95 | div.remove(); 96 | } 97 | }); 98 | } 99 | -------------------------------------------------------------------------------- /v2/data/popup/plug-ins/no-star.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /v2/data/popup/plug-ins/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /v2/data/popup/utils.js: -------------------------------------------------------------------------------- 1 | /* globals locale */ 2 | 'use strict'; 3 | 4 | var utils = {}; 5 | 6 | utils.prettyDate = time => { 7 | const date = new Date((time || '')); 8 | const diff = (((new Date()).getTime() - date.getTime()) / 1000); 9 | const dayDiff = Math.floor(diff / 86400); 10 | 11 | if (isNaN(dayDiff) || dayDiff < 0) { 12 | return 'just now'; 13 | } 14 | return dayDiff === 0 && ( 15 | diff < 60 && locale.get('popup_msg_1') || 16 | diff < 120 && locale.get('popup_msg_2') || 17 | diff < 3600 && locale.get('popup_msg_3_format').replace('%d', Math.floor(diff / 60)) || 18 | diff < 7200 && locale.get('popup_msg_4') || 19 | diff < 86400 && Math.floor(diff / 3600) + ' ' + locale.get('popup_msg_5')) || 20 | dayDiff === 1 && locale.get('popup_msg_6') || 21 | dayDiff < 7 && locale.get('popup_msg_7_format').replace('%d', dayDiff) || 22 | dayDiff < 7 * 7 && locale.get('popup_msg_8_format').replace('%d', Math.ceil(dayDiff / 7)) || 23 | dayDiff < 7 * 4 * 3 && locale.get('popup_msg_9_format').replace('%d', Math.ceil(dayDiff / 7 / 4)) || 24 | locale.get('popup_date_format') 25 | .replace('%dd', date.getDate()) 26 | .replace('%yy', date.getFullYear().toString()) 27 | .replace('%mm', [ 28 | locale.get('popup_msg_10'), 29 | locale.get('popup_msg_11'), 30 | locale.get('popup_msg_12'), 31 | locale.get('popup_msg_13'), 32 | locale.get('popup_msg_14'), 33 | locale.get('popup_msg_15'), 34 | locale.get('popup_msg_16'), 35 | locale.get('popup_msg_17'), 36 | locale.get('popup_msg_18'), 37 | locale.get('popup_msg_19'), 38 | locale.get('popup_msg_20'), 39 | locale.get('popup_msg_21') 40 | ][date.getMonth()]); 41 | }; 42 | -------------------------------------------------------------------------------- /v2/data/popup/wait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/popup/wait.gif -------------------------------------------------------------------------------- /v2/data/sounds/0.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/sounds/0.wav -------------------------------------------------------------------------------- /v2/data/sounds/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/sounds/1.wav -------------------------------------------------------------------------------- /v2/data/sounds/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/sounds/2.wav -------------------------------------------------------------------------------- /v2/data/sounds/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v2/data/sounds/3.wav -------------------------------------------------------------------------------- /v2/lib/load.js: -------------------------------------------------------------------------------- 1 | /* globals config, app */ 2 | 'use strict'; 3 | 4 | chrome.storage.local.get(config.prefs, ps => { 5 | // fix preferences from older versions 6 | if (ps.firstRun && ps.version) { 7 | config.map.number.forEach(name => ps[name] = Number(ps[name])); 8 | config.map.checkbox.forEach(name => { 9 | if (ps[name] === 'true') { 10 | ps[name] = true; 11 | } 12 | else if (ps[name] === 'false') { 13 | ps[name] = false; 14 | } 15 | }); 16 | ps.firstRun = false; 17 | chrome.storage.local.set(ps); 18 | } 19 | 20 | Object.assign(config.prefs, ps); 21 | 22 | app.storage = { 23 | read: id => config.prefs[id], 24 | write: (id, data) => { 25 | config.prefs[id] = data; 26 | chrome.storage.local.set({ 27 | [id]: data 28 | }); 29 | } 30 | }; 31 | // window.setTimeout(() => app.emit('load'), 2000); 32 | app.emit('load'); 33 | }); 34 | -------------------------------------------------------------------------------- /v2/lib/toolbar.js: -------------------------------------------------------------------------------- 1 | /* globals config, app */ 2 | 'use strict'; 3 | 4 | var toolbar = {}; 5 | 6 | Object.defineProperty(toolbar, 'badge', { 7 | set(val) { 8 | if (val > 999 && config.ui.minimal) { 9 | val = '>' + Math.round(val / 1000) + 'K'; 10 | } 11 | chrome.browserAction.setBadgeText({ 12 | text: val === 0 || config.ui.badge === false ? '' : String(val) 13 | }); 14 | } 15 | }); 16 | 17 | Object.defineProperty(toolbar, 'color', { 18 | set(val) { 19 | chrome.browserAction.setBadgeBackgroundColor({ 20 | color: val 21 | }); 22 | } 23 | }); 24 | 25 | { 26 | let i = 0; 27 | const t = []; 28 | function clearTimeout() { 29 | t.forEach(_t => { 30 | window.clearTimeout(_t); 31 | t.splice(t.indexOf(_t), 1); 32 | }); 33 | } 34 | Object.defineProperty(toolbar, 'icon', { 35 | set(clr) { 36 | function set(clr) { 37 | // Change color pattern? 38 | if (config.ui.pattern === 1) { 39 | switch (clr) { 40 | case 'blue': 41 | clr = 'gray'; 42 | break; 43 | case 'gray': 44 | clr = 'blue'; 45 | break; 46 | } 47 | } 48 | if (config.ui.pattern === 2) { 49 | switch (clr) { 50 | case 'blue': 51 | clr = 'gray'; 52 | break; 53 | case 'red': 54 | clr = 'blue'; 55 | break; 56 | case 'gray': 57 | clr = 'red'; 58 | break; 59 | } 60 | } 61 | chrome.browserAction.setIcon({ 62 | path: { 63 | '16': '/data/icons/' + clr + '/16.png', 64 | '18': '/data/icons/' + clr + '/18.png', 65 | '19': '/data/icons/' + clr + '/19.png', 66 | '32': '/data/icons/' + clr + '/32.png' 67 | } 68 | }); 69 | } 70 | 71 | clearTimeout(); 72 | if (clr === 'load') { 73 | t.push(window.setTimeout(function() { 74 | set('load' + i); 75 | i += 1; 76 | i = i % 4; 77 | toolbar.icon = 'load'; 78 | }, 200)); 79 | } 80 | else if (clr === 'new') { 81 | t.push(window.setTimeout(function() { 82 | set(i % 2 ? 'red' : 'new'); 83 | if (i < 7) { 84 | i += 1; 85 | toolbar.icon = 'new'; 86 | } 87 | else { 88 | i = 0; 89 | } 90 | }, 300)); 91 | } 92 | else { 93 | i = 0; 94 | set(clr); 95 | } 96 | } 97 | }); 98 | } 99 | 100 | Object.defineProperty(toolbar, 'label', { 101 | set(title) { 102 | chrome.browserAction.setTitle({title}); 103 | } 104 | }); 105 | 106 | app.on('load', () => { 107 | toolbar.color = config.prefs.backgroundColor; 108 | }); 109 | -------------------------------------------------------------------------------- /v2/lib/utils/tab.js: -------------------------------------------------------------------------------- 1 | var tab = {}; 2 | -------------------------------------------------------------------------------- /v2/lib/utils/timer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var timer = {}; 4 | 5 | /** Repeater: Repeats a function infinity with an interval pattern 6 | * Example: 7 | * var repeater = new repeater(1000, 10000, 2000); 8 | * var i = 0; 9 | * repeater.on(function() { 10 | * i += 1; 11 | * console.error(i); 12 | * if (i == 6) { 13 | * repeater.reset(); 14 | * } 15 | * if (i == 10) { 16 | * repeater.stop(); 17 | * } 18 | * }); 19 | **/ 20 | timer.Repeater = function() { 21 | let id, callback; 22 | let intervals = [].slice.call(arguments, 0); 23 | function stop() { 24 | if (id) { 25 | window.clearTimeout(id); 26 | } 27 | } 28 | function run() { 29 | const t = intervals.length > 1 ? intervals.shift() : intervals[0]; 30 | stop(); 31 | id = window.setTimeout(function(args) { 32 | run(); 33 | try { 34 | callback.apply(null, args); 35 | } 36 | catch (e) {} 37 | }, t, arguments); 38 | } 39 | 40 | return { 41 | reset: function() { 42 | stop(); 43 | intervals.unshift(0); 44 | run.apply(null, arguments); 45 | }, 46 | stop: stop, 47 | on: function(c) { 48 | callback = c; 49 | run(); 50 | }, 51 | fill: function() { 52 | intervals = [].slice.call(arguments, 0); 53 | } 54 | }; 55 | }; 56 | -------------------------------------------------------------------------------- /v2/lib/wrapper/chrome/background.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /v2/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Notifier for Gmail™", 3 | "description": "__MSG_description__", 4 | "author": "InBasic", 5 | "version": "1.0.5", 6 | "manifest_version": 2, 7 | "default_locale": "en", 8 | "permissions": [ 9 | "*://mail.google.com/mail/", 10 | "*://mail.google.com/sync/", 11 | "notifications", 12 | "contextMenus", 13 | "webRequest", 14 | "storage" 15 | ], 16 | "web_accessible_resources": [ 17 | "notification.png" 18 | ], 19 | "browser_action": { 20 | "default_icon": { 21 | "16": "data/icons/blue/16.png", 22 | "18": "data/icons/blue/18.png", 23 | "19": "data/icons/blue/19.png", 24 | "32": "data/icons/blue/32.png" 25 | } 26 | }, 27 | "background": { 28 | "page": "lib/wrapper/chrome/background.html" 29 | }, 30 | "options_ui": { 31 | "page": "data/options/index.html", 32 | "chrome_style": false, 33 | "open_in_tab": true 34 | }, 35 | "homepage_url": "http://add0n.com/gmail-notifier.html", 36 | "icons": { 37 | "16": "data/icons/red/16.png", 38 | "18": "data/icons/red/18.png", 39 | "19": "data/icons/red/19.png", 40 | "32": "data/icons/red/32.png", 41 | "48": "data/icons/red/48.png", 42 | "64": "data/icons/red/64.png", 43 | "128": "data/icons/red/128.png" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /v3.classic/LICENSE: -------------------------------------------------------------------------------- 1 | ../LICENSE -------------------------------------------------------------------------------- /v3.classic/core/offscreen.js: -------------------------------------------------------------------------------- 1 | /* global log */ 2 | 3 | const offscreen = { 4 | busy: false, 5 | cache: [] 6 | }; 7 | 8 | offscreen.command = async request => { 9 | if (offscreen.busy) { 10 | return new Promise(resolve => { 11 | offscreen.cache.push({request, resolve}); 12 | }); 13 | } 14 | offscreen.busy = true; 15 | 16 | // do we have an active offscreen worker 17 | const existingContexts = await chrome.runtime.getContexts({ 18 | contextTypes: ['OFFSCREEN_DOCUMENT'] 19 | }); 20 | if (existingContexts.length === 0) { 21 | log('[offscreen]', 'creating...'); 22 | await chrome.offscreen.createDocument({ 23 | url: '/core/offscreen/index.html', 24 | reasons: ['AUDIO_PLAYBACK', 'DOM_SCRAPING'], 25 | justification: 'parse a command or play alert' 26 | }); 27 | } 28 | offscreen.busy = false; 29 | for (const {request, resolve} of offscreen.cache) { 30 | chrome.runtime.sendMessage({ 31 | method: 'offscreen', 32 | request 33 | }, resolve); 34 | } 35 | offscreen.cache.length = 0; 36 | 37 | return new Promise(resolve => chrome.runtime.sendMessage({ 38 | method: 'offscreen', 39 | request 40 | }, resolve)); 41 | }; 42 | 43 | chrome.runtime.onMessage.addListener(request => { 44 | if (request.method === 'exit-offscreen') { 45 | chrome.offscreen.closeDocument().then(() => { 46 | log('[offscreen]', 'exited'); 47 | }); 48 | } 49 | }); 50 | -------------------------------------------------------------------------------- /v3.classic/core/offscreen/firefox/polyfill.js: -------------------------------------------------------------------------------- 1 | // Firefox workaround 2 | chrome.offscreen = { 3 | closeDocument() { 4 | for (const e of document.querySelectorAll('iframe.offscreen')) { 5 | e.remove(); 6 | } 7 | return Promise.resolve(); 8 | }, 9 | createDocument(q) { 10 | if (document.querySelector('iframe.offscreen')) { 11 | return Promise.reject(Error('ALREADY_ATTACHED')); 12 | } 13 | return new Promise(resolve => { 14 | const e = document.createElement('iframe'); 15 | e.classList.add('offscreen'); 16 | e.addEventListener('load', () => { 17 | e.addEventListener('load', resolve, { 18 | once: true 19 | }); 20 | e.contentWindow.location.replace(q.url); 21 | }, {once: true}); 22 | document.body.append(e); 23 | }); 24 | } 25 | }; 26 | chrome.runtime.getContexts = function(q) { 27 | if (q.contextTypes && q.contextTypes.includes('OFFSCREEN_DOCUMENT')) { 28 | return Promise.resolve([...document.querySelectorAll('iframe.offscreen')]); 29 | } 30 | else { 31 | return Promise.reject(Error('NOT_SUPPORTED')); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /v3.classic/core/offscreen/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /v3.classic/core/offscreen/index.js: -------------------------------------------------------------------------------- 1 | /* global gmail */ 2 | const ids = new Set(); 3 | 4 | const exit = () => { 5 | clearTimeout(exit.id); 6 | console.info('%c[offscreen iframe]', 'color:#ff9900', 'exit request', ids.size); 7 | exit.id = setTimeout(() => { 8 | if (ids.size === 0) { 9 | chrome.runtime.sendMessage({ 10 | method: 'exit-offscreen' 11 | }); 12 | } 13 | }, 60000); 14 | }; 15 | 16 | const play = request => new Promise((resolve, reject) => { 17 | stop(); 18 | const audio = document.createElement('audio'); 19 | audio.setAttribute('preload', 'auto'); 20 | audio.setAttribute('autobuffer', 'true'); 21 | audio.setAttribute('autoplay', 'true'); 22 | audio.onended = audio.onerror = e => { 23 | ids.delete(request.id); 24 | exit(); 25 | }; 26 | audio.iid = request.id; 27 | document.body.append(audio); 28 | 29 | const {index, media, prefs} = request; 30 | 31 | const type = index === null ? media.default.type : media['custom' + index].type; 32 | let path = '/data/sounds/' + type + '.mp4'; 33 | if (type === 4) { 34 | path = index === null ? media.default.file : media['custom' + index].file; 35 | } 36 | audio.src = path; 37 | audio.volume = prefs.soundVolume / 100; 38 | audio.play().then(() => resolve(true), e => reject(e)); 39 | }); 40 | 41 | const stop = () => { 42 | for (const e of document.querySelectorAll('audio')) { 43 | e.pause(); 44 | e.remove(); 45 | ids.delete(e.iid); 46 | } 47 | exit(); 48 | }; 49 | 50 | chrome.runtime.onMessage.addListener(({request, method}, sender, response) => { 51 | if (method === 'offscreen') { 52 | console.info('%c[offscreen iframe]', 'color:#ff9900', 'request', request); 53 | clearTimeout(exit.id); 54 | const id = request.cmd + ';' + Math.random(); 55 | request.id = id; 56 | ids.add(id); 57 | 58 | if (request.cmd === 'play') { 59 | play(request).then(() => response(true), e => response({ 60 | error: e.message 61 | })); 62 | 63 | return true; 64 | } 65 | else if (request.cmd === 'stop') { 66 | stop(request); 67 | response(true); 68 | ids.delete(request.id); 69 | exit(); 70 | } 71 | else if (request.cmd === 'gmail.action') { 72 | gmail.action(request.request).then(() => response(true)).catch(e => { 73 | console.error(e); 74 | response({ 75 | message: e.message 76 | }); 77 | }).finally(() => { 78 | ids.delete(request.id); 79 | exit(); 80 | }); 81 | return true; 82 | } 83 | else if (request.cmd === 'gmail.search') { 84 | gmail.search(request.request).then(response).catch(e => { 85 | console.error(e); 86 | response({ 87 | message: e.message 88 | }); 89 | }).finally(() => { 90 | ids.delete(request.id); 91 | exit(); 92 | }); 93 | return true; 94 | } 95 | } 96 | }); 97 | -------------------------------------------------------------------------------- /v3.classic/core/repeater.js: -------------------------------------------------------------------------------- 1 | /* global log, checkEmails */ 2 | const repeater = { 3 | reason: '' 4 | }; 5 | repeater.build = (type = 'normal', reason, delay) => chrome.storage.local.get({ 6 | 'period': 120, // seconds 7 | 'initialPeriod': 3 // seconds 8 | }, async prefs => { 9 | repeater.reason = reason; 10 | 11 | if (isNaN(delay)) { 12 | if (type === 'normal') { 13 | delay = (prefs.initialPeriod || 5) * 1000; 14 | } 15 | else if (type === 'fired') { 16 | delay = prefs.period * 1000; 17 | } 18 | else { 19 | delay = 100; 20 | } 21 | } 22 | 23 | const now = Date.now(); 24 | const when = now + delay; 25 | // ignore 26 | if (type !== 'fired') { 27 | const next = await chrome.alarms.get('repeater'); 28 | if (next) { 29 | if (next.scheduledTime > now) { 30 | if ((when - next.scheduledTime) > 0) { 31 | return log('[repeater]', 'ignored', when - next.scheduledTime); 32 | } 33 | } 34 | } 35 | } 36 | log('[repeater]', `Reason: "${reason}"`, `Type: "${type}"`, `Delay: ${(delay / 1000).toFixed(2)}s`); 37 | chrome.alarms.create('repeater', { 38 | when, 39 | periodInMinutes: prefs.period / 60 40 | }); 41 | }); 42 | 43 | repeater.reset = (reason, delay) => repeater.build('now', reason, delay); 44 | 45 | /* alarm */ 46 | chrome.alarms.onAlarm.addListener(o => { 47 | if (o.name === 'repeater') { 48 | repeater.build('fired', 'alarm.fired'); // make sure we can handle less than a minute calls 49 | 50 | const forced = ['user.request', 'options.changes', 'change.of.feeds', 'popup.forced'].includes(repeater.reason); 51 | checkEmails.execute(forced); 52 | 53 | chrome.storage.local.get({ 54 | 'initialPeriod': 3 // seconds 55 | }, prefs => { 56 | if (prefs.initialPeriod === 0) { // manual mode 57 | chrome.alarms.onAlarm.remove('repeater'); 58 | } 59 | }); 60 | } 61 | }); 62 | /* startup */ 63 | chrome.runtime.onStartup.addListener(() => repeater.build('normal', 'startup')); 64 | chrome.runtime.onInstalled.addListener(() => repeater.build('normal', 'startup')); 65 | 66 | /* idle */ 67 | chrome.runtime.onStartup.addListener(() => chrome.storage.local.get({ 68 | 'idle-detection': 5 // minutes 69 | }, prefs => { 70 | chrome.idle.setDetectionInterval(prefs['idle-detection'] * 60); 71 | })); 72 | chrome.idle.onStateChanged.addListener(name => { 73 | if (name === 'active') { 74 | repeater.reset('exit.idle'); 75 | } 76 | }); 77 | /* pref changes */ 78 | chrome.storage.onChanged.addListener(prefs => { 79 | if (prefs.minimal || 80 | prefs.feeds_0 || prefs.feeds_1 || prefs.feeds_2 || prefs.feeds_3 || prefs.feeds_4 || prefs.feeds_5 || 81 | prefs.feeds_custom 82 | ) { 83 | repeater.reset('change.of.feeds'); 84 | } 85 | if (prefs.clrPattern || prefs.badge) { 86 | repeater.reset('options.changes'); 87 | } 88 | if (prefs.period) { 89 | repeater.reset('period.changed'); 90 | } 91 | if (prefs.oldFashion) { 92 | repeater.reset('options.changes'); 93 | } 94 | }); 95 | -------------------------------------------------------------------------------- /v3.classic/core/utils/log.js: -------------------------------------------------------------------------------- 1 | const log = (origin, ...args) => { 2 | const cc = [ 3 | '#ff0099', 4 | '#ff9900', 5 | '#c46dff', 6 | '#0099ff', 7 | '#66cc00', 8 | '#00cc66' 9 | ]; 10 | 11 | let n = 0; 12 | switch (origin) { 13 | case '[offscreen]': 14 | n = 1; 15 | break; 16 | case '[menu]': 17 | n = 2; 18 | break; 19 | case '[feed]': 20 | n = 3; 21 | break; 22 | case '[repeater]': 23 | n = 4; 24 | break; 25 | case '[play]': 26 | n = 5; 27 | break; 28 | } 29 | console.info('%c' + origin, 'color:' + cc[n], ...args); 30 | }; 31 | -------------------------------------------------------------------------------- /v3.classic/core/watch.js: -------------------------------------------------------------------------------- 1 | /* global repeater */ 2 | 3 | /* updating badge when action is posted */ 4 | chrome.webRequest.onCompleted.addListener(d => { 5 | if (d.tabId) { 6 | if ( 7 | d.type === 'main_frame' || 8 | d.url.includes('&act=') || 9 | (d.url.includes('/sync/u/') && d.method === 'POST') || 10 | (d.url.includes('/mail/u/') && d.method === 'POST') 11 | ) { 12 | repeater.reset('webrequest', 1000); 13 | } 14 | } 15 | }, { 16 | urls: [ 17 | '*://mail.google.com/mail/u*', 18 | '*://mail.google.com/sync/u/*/i/s*', 19 | '*://mail.google.com/mail/logout*' 20 | ]}, 21 | []); 22 | -------------------------------------------------------------------------------- /v3.classic/data/icons/blue/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/blue/16.png -------------------------------------------------------------------------------- /v3.classic/data/icons/blue/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/blue/18.png -------------------------------------------------------------------------------- /v3.classic/data/icons/blue/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/blue/19.png -------------------------------------------------------------------------------- /v3.classic/data/icons/blue/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/blue/32.png -------------------------------------------------------------------------------- /v3.classic/data/icons/browsers/chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/browsers/chrome.png -------------------------------------------------------------------------------- /v3.classic/data/icons/browsers/edge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/browsers/edge.png -------------------------------------------------------------------------------- /v3.classic/data/icons/browsers/firefox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/browsers/firefox.png -------------------------------------------------------------------------------- /v3.classic/data/icons/browsers/opera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/browsers/opera.png -------------------------------------------------------------------------------- /v3.classic/data/icons/gray/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/gray/16.png -------------------------------------------------------------------------------- /v3.classic/data/icons/gray/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/gray/18.png -------------------------------------------------------------------------------- /v3.classic/data/icons/gray/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/gray/19.png -------------------------------------------------------------------------------- /v3.classic/data/icons/gray/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/gray/32.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load0/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load0/16.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load0/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load0/18.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load0/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load0/19.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load0/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load0/32.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load1/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load1/16.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load1/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load1/18.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load1/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load1/19.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load1/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load1/32.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load2/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load2/16.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load2/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load2/18.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load2/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load2/19.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load2/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load2/32.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load3/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load3/16.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load3/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load3/18.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load3/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load3/19.png -------------------------------------------------------------------------------- /v3.classic/data/icons/load3/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/load3/32.png -------------------------------------------------------------------------------- /v3.classic/data/icons/new/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/new/16.png -------------------------------------------------------------------------------- /v3.classic/data/icons/new/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/new/18.png -------------------------------------------------------------------------------- /v3.classic/data/icons/new/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/new/19.png -------------------------------------------------------------------------------- /v3.classic/data/icons/new/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/new/32.png -------------------------------------------------------------------------------- /v3.classic/data/icons/notification/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/notification/16.png -------------------------------------------------------------------------------- /v3.classic/data/icons/notification/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/notification/32.png -------------------------------------------------------------------------------- /v3.classic/data/icons/notification/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/notification/48.png -------------------------------------------------------------------------------- /v3.classic/data/icons/notification/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/notification/64.png -------------------------------------------------------------------------------- /v3.classic/data/icons/options/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/options/32.png -------------------------------------------------------------------------------- /v3.classic/data/icons/options/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/options/64.png -------------------------------------------------------------------------------- /v3.classic/data/icons/red/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/red/128.png -------------------------------------------------------------------------------- /v3.classic/data/icons/red/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/red/16.png -------------------------------------------------------------------------------- /v3.classic/data/icons/red/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/red/18.png -------------------------------------------------------------------------------- /v3.classic/data/icons/red/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/red/19.png -------------------------------------------------------------------------------- /v3.classic/data/icons/red/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/red/32.png -------------------------------------------------------------------------------- /v3.classic/data/icons/red/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/red/48.png -------------------------------------------------------------------------------- /v3.classic/data/icons/red/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/red/64.png -------------------------------------------------------------------------------- /v3.classic/data/icons/tray/blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/tray/blue.png -------------------------------------------------------------------------------- /v3.classic/data/icons/tray/gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/tray/gray.png -------------------------------------------------------------------------------- /v3.classic/data/icons/tray/red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/icons/tray/red.png -------------------------------------------------------------------------------- /v3.classic/data/images/archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/images/archive.png -------------------------------------------------------------------------------- /v3.classic/data/images/read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/images/read.png -------------------------------------------------------------------------------- /v3.classic/data/images/trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/images/trash.png -------------------------------------------------------------------------------- /v3.classic/data/locale.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var locale = { 4 | get: chrome.i18n.getMessage 5 | }; 6 | 7 | (elems => { 8 | elems.forEach(elem => { 9 | const att = elem.dataset.l10nValue; 10 | const value = locale.get(elem.dataset.l10nId); 11 | if (att) { 12 | elem.setAttribute(att, value); 13 | } 14 | else { 15 | elem.textContent = value; 16 | } 17 | }); 18 | })([...document.querySelectorAll('[data-l10n-id]')]); 19 | -------------------------------------------------------------------------------- /v3.classic/data/popup/accessibility.js: -------------------------------------------------------------------------------- 1 | /* global qs */ 2 | 'use strict'; 3 | 4 | // Link opener for html 5 | const opener = self.opener = e => { 6 | const target = e.target; 7 | 8 | const a = target.closest('a') || target; 9 | const link = a.dataset.href || a.href || a.src || target.src || target.href; 10 | 11 | if (link) { 12 | e.preventDefault(); 13 | e.stopPropagation(); 14 | chrome.runtime.sendMessage({ 15 | method: 'open', 16 | url: { 17 | link, 18 | button: e.button, 19 | ctrlKey: e.ctrlKey, 20 | shiftKey: e.shiftKey, 21 | altKey: e.altKey, 22 | metaKey: e.metaKey 23 | } 24 | }, () => e.button === 0 ? window.close() : null); 25 | } 26 | }; 27 | addEventListener('click', opener); 28 | 29 | // Support Gmail's keyboard shortcuts on the panel 30 | const keyup = self.keyup = e => { 31 | if (!keyup.doKeyUp) { 32 | return; 33 | } 34 | 35 | if (e.keyCode === 49 && e.shiftKey) { 36 | qs('spam').click(); 37 | } 38 | if (e.keyCode === 51 && e.shiftKey) { 39 | qs('trash').click(); 40 | } 41 | if (e.keyCode === 73 && e.shiftKey) { 42 | qs('read').click(); 43 | } 44 | if (e.keyCode === 69) { 45 | qs('archive').click(); 46 | } 47 | }; 48 | chrome.storage.local.get({ 49 | keyUp: false 50 | }, prefs => keyup.doKeyUp = prefs.keyUp); 51 | 52 | addEventListener('keyup', keyup); 53 | 54 | window.focus(); 55 | 56 | chrome.runtime.sendMessage({ 57 | method: 'stop-sound' 58 | }); 59 | -------------------------------------------------------------------------------- /v3.classic/data/popup/body/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #fff; 3 | color: #222; 4 | font: 12.8px arial, sans-serif; 5 | } 6 | body, 7 | td { 8 | font-size: 13px; 9 | } 10 | a { 11 | color: #15c; 12 | cursor: pointer; 13 | } 14 | a:visited { 15 | color: #61c; 16 | } 17 | img { 18 | border: 0; 19 | } 20 | pre { 21 | white-space: pre; 22 | white-space: -moz-pre-wrap; 23 | white-space: -o-pre-wrap; 24 | white-space: pre-wrap; 25 | word-wrap: break-word; 26 | max-width: 800px; 27 | overflow: auto; 28 | } 29 | 30 | /* custom CSS */ 31 | .root { 32 | width: 100%; 33 | border-collapse: collapse; 34 | border: none; 35 | } 36 | body { 37 | margin: 0; 38 | } 39 | body.summary { 40 | white-space: pre-wrap; 41 | } 42 | table { 43 | color: inherit; 44 | } 45 | 46 | html { 47 | color-scheme: light; 48 | scrollbar-color: #626262 #fff; 49 | } 50 | html.dark { 51 | background-color: #fff; 52 | filter: hue-rotate(180deg) invert(100%); 53 | color-scheme: dark; 54 | scrollbar-color: #9d9d9d #000; 55 | } 56 | html.dark em, 57 | html.dark img, 58 | html.dark svg, 59 | html.dark image, 60 | html.dark video, 61 | html.dark audio, 62 | html.dark embed, 63 | html.dark iframe, 64 | html.dark object, 65 | html.dark button, 66 | html.dark canvas { 67 | filter: hue-rotate(180deg) invert(100%); 68 | } 69 | -------------------------------------------------------------------------------- /v3.classic/data/popup/body/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Loading... 13 | 14 | -------------------------------------------------------------------------------- /v3.classic/data/popup/body/index.js: -------------------------------------------------------------------------------- 1 | { 2 | const block = e => { 3 | const target = e.target; 4 | 5 | const a = target.closest('a') || target; 6 | const url = a.dataset.href || a.href || a.src || target.src || target.href; 7 | 8 | if (url) { 9 | e.preventDefault(); 10 | e.stopPropagation(); 11 | 12 | chrome.tabs.query({ 13 | active: true, 14 | lastFocusedWindow: true 15 | }, tabs => { 16 | chrome.tabs.create({ 17 | url, 18 | active: false, // allow the user to open multiple links 19 | index: tabs && tabs.length ? tabs[0].index + 1 : undefined 20 | }); 21 | }); 22 | return false; 23 | } 24 | return true; 25 | }; 26 | 27 | // https://github.com/inbasic/ignotifier/issues/634 28 | onclick = e => { 29 | if (e.button === 0 && (e.ctrlKey || e.metaKey)) { 30 | return block(e); 31 | } 32 | return true; 33 | }; 34 | onauxclick = e => { 35 | if (e.button === 1) { 36 | return block(e); 37 | } 38 | return true; 39 | }; 40 | } 41 | 42 | // Key binding 43 | addEventListener('keyup', top.keyup); 44 | 45 | // styling 46 | // styling 47 | chrome.storage.local.get({ 48 | 'styling_body': '' 49 | }, prefs => { 50 | document.getElementById('styling_body').textContent = prefs['styling_body']; 51 | }); 52 | -------------------------------------------------------------------------------- /v3.classic/data/popup/fetch.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/fetch.gif -------------------------------------------------------------------------------- /v3.classic/data/popup/gmail.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const gmail = {}; 4 | 5 | /* gmail.get */ 6 | gmail.get = { 7 | base: url => /[^?]*/.exec(url)[0], 8 | id: url => { 9 | const tmp = /message_id=([^&]*)/.exec(url); 10 | if (tmp && tmp.length) { 11 | return tmp[1]; 12 | } 13 | return null; 14 | } 15 | }; 16 | 17 | /* gmail.body */ 18 | { 19 | const cache = {}; 20 | 21 | gmail.body = (link, mode) => { 22 | link = link.replace('http://', 'https://'); 23 | 24 | if (cache[link]) { 25 | return Promise.resolve(cache[link]); 26 | } 27 | 28 | const url = gmail.get.base(link); 29 | const thread = gmail.get.id(link); 30 | 31 | if (!thread) { 32 | return Promise.reject(Error('body -> Error at resolving thread. Please switch back to the summary mode.')); 33 | } 34 | 35 | const href = url + '/?ui=2&view=pt&dsqt=1&search=all&msg=' + thread; 36 | 37 | return fetch(href, { 38 | credentials: 'include' 39 | }).then(r => { 40 | if (!r.ok) { 41 | throw Error('body -> print failed -> ' + r.status); 42 | } 43 | return r.text(); 44 | }).then(content => { 45 | const body = gmail.render[mode ? 'getHTMLText' : 'getPlainText'](content, url, link); 46 | cache[link] = body; 47 | return body; 48 | }); 49 | }; 50 | } 51 | 52 | /* gmail.render */ 53 | { 54 | const getLastMessage = content => { 55 | const doc = new DOMParser().parseFromString(content, 'text/html'); 56 | 57 | const m = doc.querySelectorAll('.message > tbody > tr > td:last-child'); 58 | if (m.length) { 59 | const td = m[m.length - 1]; 60 | for (const a of td.querySelectorAll('a')) { 61 | if (a.href) { 62 | // prevent Google redirection 63 | if (a.href.startsWith('https://www.google.com/url?q=')) { 64 | try { 65 | const args = (new URL(a.href)).searchParams; 66 | a.href = args.get('q') || a.href; 67 | } 68 | catch (e) {} 69 | } 70 | } 71 | } 72 | return td; 73 | } 74 | return ''; 75 | }; 76 | gmail.render = { 77 | getHTMLText(content) { 78 | const td = getLastMessage(content); 79 | if (td) { 80 | // remove extra padding 81 | for (const table of td.querySelectorAll('table[cellpadding="12"]')) { 82 | table.removeAttribute('cellpadding'); 83 | } 84 | // 85 | const table = document.createElement('table'); 86 | table.classList.add('root'); 87 | const tr = document.createElement('tr'); 88 | table.appendChild(tr); 89 | tr.appendChild(td); 90 | 91 | return table; 92 | } 93 | return ''; 94 | }, 95 | getPlainText(content) { 96 | const td = getLastMessage(content); 97 | if (td) { 98 | const span = document.createElement('span'); 99 | span.style['white-space'] = 'pre-line'; 100 | span.textContent = td.innerText; 101 | return span; 102 | } 103 | return ''; 104 | } 105 | }; 106 | } 107 | -------------------------------------------------------------------------------- /v3.classic/data/popup/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/archive.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/arrow_drop_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/arrow_drop_down.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/check.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/check_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/check_all.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/check_box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/check_box.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/chevron_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/chevron_left.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/chevron_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/chevron_right.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/dark.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/delete.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/inbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/inbox.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/list.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/refresh.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/settings.png -------------------------------------------------------------------------------- /v3.classic/data/popup/icons/spam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/icons/spam.png -------------------------------------------------------------------------------- /v3.classic/data/popup/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
        12 |
        Email
        13 |
        - -
        14 |
        15 |
        16 |
        17 |
        18 |
        19 |
        20 |
        21 | Subject 22 |
        23 | 24 |
        25 | 31 |
        32 |
        33 | Sender 34 |
        35 |
        -
        36 |
        -
        37 |
        38 |
        39 | 40 |
        41 |
        42 | 43 | 52 | 53 | 64 |
          65 |
          66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /v3.classic/data/popup/plug-ins/labels.js: -------------------------------------------------------------------------------- 1 | /* global api, gmail, action, selected */ 2 | 'use strict'; 3 | 4 | { 5 | const hiddens = ['STARRED', 'Inbox', 'INBOX']; 6 | 7 | let response; 8 | let root; 9 | let query; 10 | let inprogress = ''; 11 | 12 | const star = url => { 13 | const id = gmail.get.id(url); 14 | 15 | const o = response.filter(o => o.thread === id).shift(); 16 | if (o) { 17 | document.body.dataset.star = o.labels.some(s => s === 'STARRED'); 18 | } 19 | else { 20 | document.body.dataset.star = 'hide'; 21 | } 22 | }; 23 | 24 | const labels = url => { 25 | return; 26 | const id = gmail.get.id(url); 27 | const o = response.filter(o => o.thread === id).shift(); 28 | if (o) { 29 | const parent = document.getElementById('labels'); 30 | const t = document.getElementById('label-template'); 31 | parent.textContent = ''; 32 | o.labels.map(s => s === '^i' ? 'Inbox' : s).filter(s => s.startsWith('^') === false && hiddens.indexOf(s) === -1).forEach(label => { 33 | const clone = document.importNode(t.content, true); 34 | clone.querySelector('span').textContent = label; 35 | clone.querySelector('div').dataset.value = label; 36 | parent.appendChild(clone); 37 | }); 38 | 39 | document.body.dataset.labels = true; 40 | } 41 | else { 42 | document.body.dataset.labels = false; 43 | } 44 | }; 45 | 46 | const update = (q = query, callback = () => {}) => chrome.runtime.sendMessage({ 47 | method: 'gmail.search', 48 | url: selected.parent.xml.rootLink, 49 | query: q 50 | }, r => { 51 | if (!r || r instanceof Error) { 52 | console.error(r); 53 | } 54 | else { 55 | response = r; 56 | query = q; 57 | root = selected.parent.xml.rootLink; 58 | callback(); 59 | } 60 | }); 61 | 62 | const fetch = (url = selected.entry.link) => { 63 | document.body.dataset.labels = false; 64 | document.body.dataset.star = 'hide'; 65 | 66 | const q = 'in:' + (selected.parent.xml.label || 'inbox') + ' is:unread'; 67 | if (q === query && root === selected.parent.xml.rootLink && response) { 68 | star(url); 69 | labels(url); 70 | } 71 | else { 72 | if (inprogress === q) { 73 | console.info('update is rejected; duplicated'); 74 | } 75 | else { 76 | inprogress = q; 77 | update(q, () => { 78 | inprogress = ''; 79 | star(url); 80 | labels(url); 81 | }); 82 | } 83 | } 84 | }; 85 | 86 | api.on('update-full-content', fetch); 87 | 88 | document.getElementById('star').addEventListener('click', () => { 89 | const cmd = document.body.dataset.star === 'true' ? 'xst' : 'st'; 90 | action(cmd, selected.entry.link, update); 91 | document.body.dataset.star = cmd === 'xst' ? 'false' : 'true'; 92 | }); 93 | document.getElementById('labels').addEventListener('click', ({target}) => { 94 | const cmd = target.dataset.cmd; 95 | if (cmd === 'remove-label') { 96 | const div = target.closest('div'); 97 | const label = div.dataset.value; 98 | action('rc_' + label, selected.entry.link, update); 99 | div.remove(); 100 | } 101 | }); 102 | } 103 | -------------------------------------------------------------------------------- /v3.classic/data/popup/plug-ins/no-star.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /v3.classic/data/popup/plug-ins/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /v3.classic/data/popup/utils.js: -------------------------------------------------------------------------------- 1 | /* globals locale */ 2 | 'use strict'; 3 | 4 | var utils = {}; 5 | 6 | utils.prettyDate = time => { 7 | const date = new Date((time || '')); 8 | const diff = (((new Date()).getTime() - date.getTime()) / 1000); 9 | const dayDiff = Math.floor(diff / 86400); 10 | 11 | if (isNaN(dayDiff) || dayDiff < 0) { 12 | return 'just now'; 13 | } 14 | return dayDiff === 0 && ( 15 | diff < 60 && locale.get('popup_msg_1') || 16 | diff < 120 && locale.get('popup_msg_2') || 17 | diff < 3600 && locale.get('popup_msg_3_format').replace('%d', Math.floor(diff / 60)) || 18 | diff < 7200 && locale.get('popup_msg_4') || 19 | diff < 86400 && Math.floor(diff / 3600) + ' ' + locale.get('popup_msg_5')) || 20 | dayDiff === 1 && locale.get('popup_msg_6') || 21 | dayDiff < 7 && locale.get('popup_msg_7_format').replace('%d', dayDiff) || 22 | dayDiff < 7 * 7 && locale.get('popup_msg_8_format').replace('%d', Math.ceil(dayDiff / 7)) || 23 | dayDiff < 7 * 4 * 3 && locale.get('popup_msg_9_format').replace('%d', Math.ceil(dayDiff / 7 / 4)) || 24 | locale.get('popup_date_format') 25 | .replace('%dd', date.getDate()) 26 | .replace('%yy', date.getFullYear().toString()) 27 | .replace('%mm', [ 28 | locale.get('popup_msg_10'), 29 | locale.get('popup_msg_11'), 30 | locale.get('popup_msg_12'), 31 | locale.get('popup_msg_13'), 32 | locale.get('popup_msg_14'), 33 | locale.get('popup_msg_15'), 34 | locale.get('popup_msg_16'), 35 | locale.get('popup_msg_17'), 36 | locale.get('popup_msg_18'), 37 | locale.get('popup_msg_19'), 38 | locale.get('popup_msg_20'), 39 | locale.get('popup_msg_21') 40 | ][date.getMonth()]); 41 | }; 42 | -------------------------------------------------------------------------------- /v3.classic/data/popup/wait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/popup/wait.gif -------------------------------------------------------------------------------- /v3.classic/data/sounds/0.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/sounds/0.mp4 -------------------------------------------------------------------------------- /v3.classic/data/sounds/1.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/sounds/1.mp4 -------------------------------------------------------------------------------- /v3.classic/data/sounds/2.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/sounds/2.mp4 -------------------------------------------------------------------------------- /v3.classic/data/sounds/3.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.classic/data/sounds/3.mp4 -------------------------------------------------------------------------------- /v3.classic/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Notifier for Gmail™", 3 | "description": "__MSG_description__", 4 | "author": "InBasic", 5 | "version": "1.2.0", 6 | "manifest_version": 3, 7 | "default_locale": "en", 8 | "permissions": [ 9 | "notifications", 10 | "contextMenus", 11 | "webRequest", 12 | "storage", 13 | "alarms", 14 | "idle", 15 | "offscreen", 16 | "cookies" 17 | ], 18 | "host_permissions": [ 19 | "*://mail.google.com/mail/", 20 | "*://mail.google.com/sync/" 21 | ], 22 | "action": { 23 | "default_icon": { 24 | "16": "/data/icons/blue/16.png", 25 | "18": "/data/icons/blue/18.png", 26 | "19": "/data/icons/blue/19.png", 27 | "32": "/data/icons/blue/32.png" 28 | } 29 | }, 30 | "background": { 31 | "service_worker": "worker.js", 32 | "scripts": [ 33 | "/core/utils/log.js", 34 | "/core/open.js", 35 | "/core/offscreen/firefox/polyfill.js", 36 | "/core/offscreen.js", 37 | "/core/context.js", 38 | "/core/button.js", 39 | "/core/sound.js", 40 | "/core/utils/sax.js", 41 | "/core/utils/feed.js", 42 | "/core/check.js", 43 | "/core/repeater.js", 44 | "/core/watch.js", 45 | "/worker.js" 46 | ] 47 | }, 48 | "options_ui": { 49 | "page": "/data/options/index.html", 50 | "open_in_tab": true 51 | }, 52 | "homepage_url": "https://webextension.org/listing/gmail-notifier.html", 53 | "icons": { 54 | "16": "/data/icons/red/16.png", 55 | "18": "/data/icons/red/18.png", 56 | "19": "/data/icons/red/19.png", 57 | "32": "/data/icons/red/32.png", 58 | "48": "/data/icons/red/48.png", 59 | "64": "/data/icons/red/64.png", 60 | "128": "/data/icons/red/128.png" 61 | }, 62 | "browser_specific_settings": { 63 | "gecko": { 64 | "id": "jid0-GjwrPchS3Ugt7xydvqVK4DQk8Ls@jetpack", 65 | "strict_min_version": "128.0" 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /v3.dev/LICENSE: -------------------------------------------------------------------------------- 1 | ../LICENSE -------------------------------------------------------------------------------- /v3.dev/accounts.js: -------------------------------------------------------------------------------- 1 | /* global core, CONFIGS, NativeEngine, query, clean */ 2 | 3 | const accounts = { 4 | number: 0, 5 | local: '', 6 | async check() { 7 | const db = []; 8 | for (let n = 0; n < 20; n += 3) { 9 | const hrefs = [ 10 | `https://mail.google.com/mail/u/${n}/feed/atom/inbox`, 11 | `https://mail.google.com/mail/u/${n + 1}/feed/atom/inbox`, 12 | `https://mail.google.com/mail/u/${n + 2}/feed/atom/inbox` 13 | ]; 14 | 15 | const bodies = await Promise.all(hrefs.map(h => fetch(h).then(r => r.text()))); 16 | const emails = []; 17 | for (let m = 0; m < 3; m += 1) { 18 | const o = await query(bodies[m], { 19 | match(node) { 20 | return node.name === 'TITLE'; 21 | } 22 | }); 23 | const email = o?.text.split(' for ')[1]; 24 | 25 | if (o && email && emails.indexOf(email) === -1) { 26 | emails.push(email); 27 | db.push({ 28 | href: hrefs[m].split('/feed/')[0], 29 | id: n + m, 30 | email 31 | }); 32 | } 33 | else { 34 | const r = await core.storage.read({ 35 | 'ignored-users': CONFIGS['ignored-users'] 36 | }).then(prefs => db.filter(o => { 37 | const n = prefs['ignored-users'].indexOf(o.email); 38 | if (n === -1) { 39 | return true; 40 | } 41 | core.log('ignoring', o.email); 42 | return false; 43 | })); 44 | if (accounts.local) { 45 | r.push({ 46 | email: accounts.local, 47 | native: true 48 | }); 49 | } 50 | return r; 51 | } 52 | } 53 | } 54 | throw Error('maximum reached'); 55 | }, 56 | 'is-logged-in'(forced = false) { 57 | // Google 58 | const g = async () => { 59 | const now = Date.now(); 60 | if (forced === false) { 61 | const prefs = await core.storage.read({ 62 | 'last-check': 0 63 | }); 64 | if (now - prefs['last-check'] < 60 * 60 * 1000) { 65 | return true; 66 | } 67 | } 68 | const r = await fetch('https://mail.google.com/mail/?ui=html&zy=h'); 69 | const b = r.ok && r.url.indexOf('accounts.google') === -1; 70 | core.storage.write({ 71 | 'last-check': b ? now : 0 72 | }); 73 | if (!b) { // make sure all caches are cleared 74 | clean(true); 75 | } 76 | return b; 77 | }; 78 | // notmuch 79 | const n = async () => { 80 | const engine = new NativeEngine(); 81 | try { 82 | await engine.authorize(); 83 | const user = await engine.introduce(); 84 | accounts.local = user; 85 | return Boolean(user); 86 | } 87 | catch (e) { 88 | return false; 89 | } 90 | }; 91 | 92 | return Promise.all([g(), n()]).then(([remote, local]) => { 93 | return remote || local; 94 | }); 95 | } 96 | }; 97 | -------------------------------------------------------------------------------- /v3.dev/configs.js: -------------------------------------------------------------------------------- 1 | const CONFIGS = { 2 | 'opening-mode': 'popup', // tab, popup 3 | 'default-page': 'https://mail.google.com/mail/u/0/#inbox', 4 | /* engine */ 5 | 'default-engine': 'rss', // 'rss' or 'api', 6 | 'default-engine-mapping': {}, // {'me@gmail.com': 'api', 'you@gmail.com': 'rss'} 7 | /* badge */ 8 | 'badge-text-format': `{EMAIL}: 9 | @@{QUERY} ({COUNT}) 10 | 11 | Last checked: {DATE}`, // valid keywords: "{EMAIL}", "{QUERY}", "{COUNT}", "{SNIPPET}", "{DATE}" 12 | 'badge-delay': 10, // minutes 13 | 'badge-period': 10, // minutes 14 | 'badge-color': '#666', 15 | 'idle-detection': 5, // minutes 16 | /* popup */ 17 | 'popup-csp': `default-src 'none'; style-src 'unsafe-inline';`, 18 | 'popup-switch-to-unread-user': true, // try to find a logged-in user with unread emails 19 | 'popup-switch-to-unread-query': true, // try to find a query for the current user with unread emails 20 | 'popup-mark-read-on-view': false, 21 | 'popup-switch-on-new': true, // switch to a user with unread emails 22 | /* notification */ 23 | 'queries': {}, // {me@gmail.com: ['label:inbox is:unread', ...]} 24 | 'default-queries': ['label:INBOX is:unread'], // if an email does not have a query, use this 25 | 'notification': {}, // {me@gmail.com: {'query': {sound: true, desktop: true, source: 0}}} 26 | 'ignored-users': [], 27 | 'notification-max-per-account': 3, // maximum number of simultaneous notifications per account 28 | 'notification-delay': 500, // delay between multiple notifications in ms 29 | 'notification-buttons': ['mark-as-read', 'archive'], 30 | 'notification-type': 'each', 31 | 'notification-text-format-combined': `{USER} {QUERY} ({COUNT})`, // valid keywords: "{USER}", "{QUERY}", "{COUNT}", "{SNIPPET}" 32 | 'notification-text-format-each': `{USER} 33 | 34 | {SNIPPET}`, // valid keywords: "{USER}", "{QUERY}", "{COUNT}", "{SNIPPET}" 35 | 'sound-volume': 0.8, 36 | 'api-client-id': '' // [user-client-id].apps.googleusercontent.com 37 | }; 38 | 39 | // preferences with no direct interaction 40 | Object.assign(CONFIGS, { 41 | 'popup-collapsed-message': 'snippet', // snippet or complete 42 | 'popup-view': 'grid', // single, grid 43 | 'grid-view': '12', // 11, 12, 1_1, 1_2 44 | 'popup-account': {}, // {user, query} 45 | 'popup-mode': 'expanded', // collapsed or expanded 46 | 'notification-counts': {}, // {email: {query: count}} 47 | 'custom-sounds': {} // {'hash': {binary: '', id}} 48 | }); 49 | -------------------------------------------------------------------------------- /v3.dev/data/icons/colors/blue/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/icons/colors/blue/16.png -------------------------------------------------------------------------------- /v3.dev/data/icons/colors/blue/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/icons/colors/blue/32.png -------------------------------------------------------------------------------- /v3.dev/data/icons/colors/gray/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/icons/colors/gray/16.png -------------------------------------------------------------------------------- /v3.dev/data/icons/colors/gray/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/icons/colors/gray/32.png -------------------------------------------------------------------------------- /v3.dev/data/icons/colors/red/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/icons/colors/red/128.png -------------------------------------------------------------------------------- /v3.dev/data/icons/colors/red/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/icons/colors/red/16.png -------------------------------------------------------------------------------- /v3.dev/data/icons/colors/red/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/icons/colors/red/256.png -------------------------------------------------------------------------------- /v3.dev/data/icons/colors/red/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/icons/colors/red/32.png -------------------------------------------------------------------------------- /v3.dev/data/icons/colors/red/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/icons/colors/red/48.png -------------------------------------------------------------------------------- /v3.dev/data/icons/colors/red/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/icons/colors/red/512.png -------------------------------------------------------------------------------- /v3.dev/data/icons/colors/red/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/icons/colors/red/64.png -------------------------------------------------------------------------------- /v3.dev/data/inject/watch.js: -------------------------------------------------------------------------------- 1 | let timeout = false; 2 | 3 | const script = document.createElement('script'); 4 | script.addEventListener('change', e => { 5 | e.stopPropagation(); 6 | e.preventDefault(); 7 | 8 | if (timeout === false) { 9 | timeout = setTimeout(() => { 10 | timeout = false; 11 | chrome.runtime.sendMessage({ 12 | method: 'soft-refresh' 13 | }); 14 | }, 3000); 15 | } 16 | }); 17 | script.textContent = `{ 18 | const script = document.currentScript; 19 | const pointer = Object.getOwnPropertyDescriptor(Document.prototype, 'title'); 20 | let title; 21 | Object.defineProperty(document, 'title', { 22 | enumerable: true, 23 | configurable: true, 24 | get() { 25 | return title; 26 | }, 27 | set(v) { 28 | if (title !== v) { 29 | script.dispatchEvent(new Event('change')); 30 | } 31 | title = v; 32 | pointer.set.call(this, v); 33 | } 34 | }); 35 | }`; 36 | document.documentElement.appendChild(script); 37 | script.remove(); 38 | 39 | window.addEventListener('beforeunload', () => chrome.runtime.sendMessage({ 40 | method: 'soft-refresh', 41 | delay: 1000 42 | })); 43 | -------------------------------------------------------------------------------- /v3.dev/data/popup/externals/moment/README: -------------------------------------------------------------------------------- 1 | Version 2.29.1 2 | https://momentjs.com/downloads/moment.js 3 | -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/archive.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/delete.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/down.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/expand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/expand.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/grid-view.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/inbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/inbox.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/loading.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/mark-all-as-read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/mark-all-as-read.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/next.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/options.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/previous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/previous.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/refresh.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/report.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/silent.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/single-view.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/sound.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/star_false.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/star_false.png -------------------------------------------------------------------------------- /v3.dev/data/popup/icons/star_true.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/popup/icons/star_true.png -------------------------------------------------------------------------------- /v3.dev/data/popup/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Gmail Notifier 5 | 6 | 7 | 8 | 9 | 10 | 22 | 23 | 37 |
          38 | 39 |
          40 | 41 |
          42 |
          43 | options! 44 |
          45 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /v3.dev/data/popup/view/sandbox/sandbox.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --dark-gray: #a0a0a0; 3 | } 4 | body, 5 | pre { 6 | font-size: 13px; 7 | font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; 8 | } 9 | body:empty::after { 10 | content: 'nothing to show!'; 11 | font-style: italic; 12 | color: var(--dark-gray); 13 | } 14 | pre { 15 | white-space: break-spaces; 16 | } 17 | -------------------------------------------------------------------------------- /v3.dev/data/popup/view/sandbox/sandbox.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Waiting for content... 9 | 10 | -------------------------------------------------------------------------------- /v3.dev/data/popup/view/view.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --white: #fff; 3 | --gray: #f5f5f5; 4 | --blue: #4083f2; 5 | --label-clr: #fff; 6 | --label-bg: var(--blue); 7 | --attch-bg: #f5f5f5; 8 | } 9 | body { 10 | font-size: 13px; 11 | font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; 12 | display: grid; 13 | grid-template-rows: min-content min-content min-content min-content 1fr 42px; 14 | grid-template-columns: min-content 1fr; 15 | grid-gap: 5px 10px; 16 | margin: 0; 17 | height: 100vh; 18 | align-items: center; 19 | padding: 0 5px; 20 | overflow-y: hidden; 21 | } 22 | 23 | #content { 24 | grid-column: 1/3; 25 | border: none; 26 | width: 100%; 27 | height: 100%; 28 | } 29 | #more { 30 | display: flex; 31 | align-items: center; 32 | grid-column: 1/3; 33 | gap: 5px; 34 | } 35 | #subject { 36 | flex: 1; 37 | font-size: 22px; 38 | text-decoration: none; 39 | color: inherit; 40 | font-weight: normal; 41 | } 42 | #subject, 43 | #from, 44 | #to { 45 | overflow: hidden; 46 | text-overflow: ellipsis; 47 | white-space: nowrap; 48 | } 49 | .label { 50 | color: var(--label-clr); 51 | background-color: var(--label-bg); 52 | display: flex; 53 | align-items: center; 54 | padding-left: 5px; 55 | font-size: 80%; 56 | } 57 | .label:not(:last-child) { 58 | margin-right: 2px; 59 | } 60 | .label input[type=button] { 61 | border: none; 62 | outline: none; 63 | cursor: pointer; 64 | margin-left: 5px; 65 | padding: 0 5px; 66 | opacity: 0.54; 67 | } 68 | .label input[type=button]:hover:not(:disabled) { 69 | opacity: 1; 70 | } 71 | .label input[type=button]:disabled { 72 | cursor: not-allowed; 73 | } 74 | #attachments { 75 | display: flex; 76 | flex-flow: wrap; 77 | gap: 5px; 78 | } 79 | 80 | .attachment { 81 | color: var(--attch-clr); 82 | background-color: var(--attch-bg); 83 | display: flex; 84 | align-items: center; 85 | padding: 2px 5px; 86 | cursor: pointer; 87 | } 88 | -------------------------------------------------------------------------------- /v3.dev/data/popup/view/view.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 16 | 19 |
          20 |

          Subject

          21 |
          22 | From 23 | 24 | To 25 | 26 | Attachments 27 |
          -
          28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /v3.dev/data/sounds/0.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/sounds/0.wav -------------------------------------------------------------------------------- /v3.dev/data/sounds/1.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/sounds/1.wav -------------------------------------------------------------------------------- /v3.dev/data/sounds/2.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/sounds/2.wav -------------------------------------------------------------------------------- /v3.dev/data/sounds/3.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/data/sounds/3.wav -------------------------------------------------------------------------------- /v3.dev/engines/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parserOptions": { 3 | "sourceType": "module" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /v3.dev/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "version": "2.1.0", 4 | "name": "Gmail™ Notifier (Developer Edition)", 5 | "description": "__MSG_description__", 6 | "default_locale": "en", 7 | "homepage_url": "https://webextension.org/listing/gmail-notifier.html?from=dev", 8 | "permissions": [ 9 | "notifications", 10 | "storage", 11 | "alarms", 12 | "identity", 13 | "idle", 14 | "https://mail.google.com/", 15 | "https://accounts.google.com/", 16 | "contextMenus" 17 | ], 18 | "optional_permissions": [ 19 | "nativeMessaging", 20 | "downloads" 21 | ], 22 | "icons": { 23 | "16": "data/icons/colors/red/16.png", 24 | "32": "data/icons/colors/red/32.png", 25 | "48": "data/icons/colors/red/48.png", 26 | "64": "data/icons/colors/red/64.png", 27 | "128": "data/icons/colors/red/128.png", 28 | "256": "data/icons/colors/red/256.png", 29 | "512": "data/icons/colors/red/512.png" 30 | }, 31 | "browser_action": {}, 32 | "background": { 33 | "persistent": false, 34 | "scripts": [ 35 | "core.js", 36 | "accounts.js", 37 | "configs.js", 38 | "utils/sax.js", 39 | "utils/query.js", 40 | "engines/rss/core.js", 41 | "engines/api/core.js", 42 | "engines/native/core.js", 43 | "worker.js", 44 | "badge.js" 45 | ] 46 | }, 47 | "content_scripts": [{ 48 | "matches": ["https://mail.google.com/mail/u/*"], 49 | "js": ["data/inject/watch.js"], 50 | "run_at": "document_start" 51 | }], 52 | "options_ui": { 53 | "page": "data/options/index.html", 54 | "chrome_style": false, 55 | "open_in_tab": true 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /v3.dev/plugins.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/v3.dev/plugins.js -------------------------------------------------------------------------------- /v3.dev/utils/query.js: -------------------------------------------------------------------------------- 1 | /* global sax */ 2 | 3 | const query = (code, query, stop = true) => { 4 | return new Promise((resolve, reject) => { 5 | const results = []; 6 | let tree; 7 | 8 | const validate = () => { 9 | if ((query.name ? query.name === tree.name : true) && (query.match ? query.match(tree) : true)) { 10 | results.push(tree); 11 | if (stop) { 12 | resolve(tree); 13 | throw Error('done'); 14 | } 15 | } 16 | }; 17 | 18 | class Node { 19 | constructor(name, attributes) { 20 | this.name = name; 21 | this.attributes = attributes; 22 | this.children = []; 23 | } 24 | closest(name) { 25 | let p = this.parent; 26 | while (p && p.name !== name) { 27 | p = p.parent; 28 | } 29 | return p; 30 | } 31 | child(query, reverse = false, stop = true) { 32 | const matches = []; 33 | const once = node => { 34 | if (node.children) { 35 | for (const n of (reverse ? [...node.children].reverse() : node.children)) { 36 | if ((query.name ? query.name === n.name : true) && (query.match ? query.match(n) : true)) { 37 | return n; 38 | } 39 | const r = once(n); 40 | if (r && stop) { 41 | return r; 42 | } 43 | else if (r) { 44 | matches.push(r); 45 | } 46 | } 47 | } 48 | }; 49 | const r = once(this); 50 | return stop ? r : matches; 51 | } 52 | } 53 | 54 | const parser = sax.parser(false); 55 | parser.onopentag = function(node) { 56 | const child = new Node(node.name, node.attributes); 57 | 58 | if (!tree) { 59 | tree = child; 60 | } 61 | else { 62 | child.parent = tree; 63 | tree.children.push(child); 64 | tree = child; 65 | } 66 | }; 67 | 68 | parser.onclosetag = function(name) { 69 | validate(); 70 | if (name === tree.name) { 71 | if (tree.parent) { 72 | tree = tree.parent; 73 | } 74 | } 75 | }; 76 | parser.ontext = text => tree.text = text; 77 | parser.onend = () => { 78 | resolve(results); 79 | }; 80 | parser.onerror = e => reject(e); 81 | parser.write(code).end(); 82 | }); 83 | }; 84 | --------------------------------------------------------------------------------