├── 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 | [](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 |
54 |
--------------------------------------------------------------------------------
/drawings/gray.cdr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/gray.cdr
--------------------------------------------------------------------------------
/drawings/gray.svg:
--------------------------------------------------------------------------------
1 |
2 |
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 |
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 |
63 |
--------------------------------------------------------------------------------
/drawings/red.cdr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inbasic/ignotifier/90425817ea081df008abbb7e1e01e6a8e53d963e/drawings/red.cdr
--------------------------------------------------------------------------------
/drawings/red.svg:
--------------------------------------------------------------------------------
1 |
2 |
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 |
17 |
18 |
19 |
22 |
23 |
26 |
Email
27 |
date
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
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 |
17 |
18 |
19 |
22 |
23 |
26 |
Email
27 |
date
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
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 |
17 |
18 |
19 |
20 |
Title
21 |
22 |
23 |
24 |
25 |
26 |
27 | x
28 |
29 |
30 |
31 |
34 |
Email
35 |
date
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
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 |
18 |
19 |
20 |
25 |
26 |
27 |
28 | x
29 |
30 |
31 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
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 |
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 |
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 |
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 |
7 |
--------------------------------------------------------------------------------
/v3.dev/data/popup/icons/single-view.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/v3.dev/data/popup/icons/sound.svg:
--------------------------------------------------------------------------------
1 |
2 |
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 |
11 |
12 |
20 |
21 |
22 |
23 |
37 |
42 |
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 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
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 |
--------------------------------------------------------------------------------