├── data ├── icons │ ├── 128.png │ ├── 16.png │ ├── 256.png │ ├── 32.png │ ├── 48.png │ ├── 512.png │ ├── 64.png │ ├── success │ │ ├── 16.png │ │ ├── 32.png │ │ └── 48.png │ └── warn │ │ ├── 16.png │ │ ├── 32.png │ │ └── 48.png ├── options │ ├── index.css │ ├── index.html │ ├── index.js │ ├── matched.js │ └── matched.json └── window │ ├── index.css │ ├── index.html │ ├── index.js │ └── warn.svg ├── manifest.json └── worker.js /data/icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/128.png -------------------------------------------------------------------------------- /data/icons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/16.png -------------------------------------------------------------------------------- /data/icons/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/256.png -------------------------------------------------------------------------------- /data/icons/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/32.png -------------------------------------------------------------------------------- /data/icons/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/48.png -------------------------------------------------------------------------------- /data/icons/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/512.png -------------------------------------------------------------------------------- /data/icons/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/64.png -------------------------------------------------------------------------------- /data/icons/success/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/success/16.png -------------------------------------------------------------------------------- /data/icons/success/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/success/32.png -------------------------------------------------------------------------------- /data/icons/success/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/success/48.png -------------------------------------------------------------------------------- /data/icons/warn/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/warn/16.png -------------------------------------------------------------------------------- /data/icons/warn/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/warn/32.png -------------------------------------------------------------------------------- /data/icons/warn/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/james-fray/download-virus-check/e7206bc3f25c465df86505e5aa4451de1b25cd57/data/icons/warn/48.png -------------------------------------------------------------------------------- /data/options/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-size: 13px; 3 | font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; 4 | background-color: #fff; 5 | color: #4d5156; 6 | margin: 10px; 7 | } 8 | select, 9 | button, 10 | input[type=submit], 11 | input[type=button] { 12 | height: 24px; 13 | color: #444; 14 | background-image: linear-gradient(rgb(237, 237, 237), rgb(237, 237, 237) 38%, rgb(222, 222, 222)); 15 | box-shadow: rgba(0, 0, 0, 0.08) 0 1px 0, rgba(255, 255, 255, 0.75) 0 1px 2px inset; 16 | text-shadow: rgb(240, 240, 240) 0 1px 0; 17 | } 18 | select, 19 | button, 20 | textarea, 21 | input[type=text], 22 | input[type=number], 23 | input[type=submit], 24 | input[type=button] { 25 | border: solid 1px rgba(0, 0, 0, 0.25); 26 | } 27 | input[type=button]:disabled { 28 | opacity: 0.5; 29 | } 30 | textarea { 31 | width: 100%; 32 | box-sizing: border-box; 33 | display: block; 34 | padding: 5px; 35 | margin-top: 5px; 36 | } 37 | a, 38 | a:visited { 39 | color: #07c; 40 | } 41 | 42 | input[type=number], 43 | input[type=text], 44 | textarea { 45 | min-width: 200px; 46 | padding: 5px; 47 | } 48 | td ~ td { 49 | text-align: right; 50 | } 51 | .grid { 52 | display: grid; 53 | grid-template-columns: 1fr min-content; 54 | grid-gap: 10px; 55 | align-items: center; 56 | justify-items: left; 57 | } 58 | .note { 59 | margin: 0; 60 | padding: 2px 10px; 61 | color: #7d7d7d; 62 | grid-column: 1/3; 63 | background-color: #dbf5ff; 64 | } 65 | -------------------------------------------------------------------------------- /data/options/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |30 | 31 | 32 |
33 |34 | 35 |
36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /data/options/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const toast = document.getElementById('toast'); 4 | 5 | const restore = () => chrome.storage.local.get({ 6 | positives: 3, 7 | whitelist: 'image/, audio/, video/, text/', 8 | key: '', 9 | log: false 10 | }, prefs => { 11 | document.getElementById('key').value = prefs.key; 12 | document.getElementById('whitelist').value = prefs.whitelist; 13 | document.getElementById('positives').value = prefs.positives; 14 | document.getElementById('log').checked = prefs.log; 15 | }); 16 | 17 | document.addEventListener('DOMContentLoaded', restore); 18 | document.getElementById('save').addEventListener('click', () => { 19 | const prefs = { 20 | whitelist: document.getElementById('whitelist').value 21 | .split(/\s*,\s*/) 22 | .filter((s, i, l) => s && l.indexOf(s) === i) 23 | .join(', '), 24 | positives: Math.max(1, document.getElementById('positives').value), 25 | key: document.getElementById('key').value, 26 | log: document.getElementById('log').checked 27 | }; 28 | 29 | chrome.storage.local.set(prefs, () => { 30 | toast.textContent = 'Options saved.'; 31 | setTimeout(() => toast.textContent = '', 750); 32 | restore(); 33 | }); 34 | }); 35 | 36 | // reset 37 | document.getElementById('reset').addEventListener('click', e => { 38 | if (e.detail === 1) { 39 | toast.textContent = 'Double-click to reset!'; 40 | window.setTimeout(() => toast.textContent = '', 750); 41 | } 42 | else { 43 | localStorage.clear(); 44 | chrome.storage.local.clear(() => { 45 | chrome.runtime.reload(); 46 | window.close(); 47 | }); 48 | } 49 | }); 50 | // support 51 | document.getElementById('support').addEventListener('click', () => chrome.tabs.create({ 52 | url: chrome.runtime.getManifest().homepage_url + '?rd=donate' 53 | })); 54 | -------------------------------------------------------------------------------- /data/options/matched.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | { 4 | const shuffle = array => { 5 | for (let i = array.length - 1; i > 0; i -= 1) { 6 | const j = Math.floor(Math.random() * (i + 1)); 7 | [array[i], array[j]] = [array[j], array[i]]; 8 | } 9 | 10 | return array; 11 | }; 12 | 13 | const root = document.getElementById('explore'); 14 | 15 | const INC = Number(root.dataset.inc || 100); 16 | const count = Number(localStorage.getItem('explore-count') || INC - 5); 17 | const cols = Number(root.dataset.cols || 3); 18 | 19 | const style = document.createElement('style'); 20 | style.textContent = ` 21 | #explore { 22 | background-color: #fff; 23 | position: relative; 24 | color: #969696; 25 | user-select: none; 26 | } 27 | #explore[data-loaded=true] { 28 | margin: 4px; 29 | padding: 5px; 30 | box-shadow: 0 0 4px #ccc; 31 | border: solid 1px #ccc; 32 | } 33 | #explore .close { 34 | position: absolute; 35 | right: 6px; 36 | top: 4px; 37 | cursor: pointer; 38 | } 39 | #explore>table { 40 | margin-top: 10px; 41 | table-layout: fixed; 42 | width: 100%; 43 | border-collapse: collapse; 44 | } 45 | #explore a { 46 | text-decoration: none; 47 | color: #000; 48 | display: flex; 49 | align-items: center; 50 | justify-content: center; 51 | } 52 | #explore td:first-child a { 53 | justify-content: flex-start; 54 | } 55 | #explore td:last-child a { 56 | justify-content: flex-end; 57 | } 58 | #explore .title { 59 | border-left: solid 1px #ccc; 60 | display: inline-block; 61 | align-items: center; 62 | overflow: hidden; 63 | text-overflow: ellipsis; 64 | white-space: nowrap; 65 | padding-left: 5px; 66 | } 67 | #explore .icon { 68 | min-width: 28px; 69 | height: 28px; 70 | display: inline-flex; 71 | align-items: center; 72 | justify-content: center; 73 | border-radius: 50%; 74 | color: #fff; 75 | margin-right: 5px; 76 | font-size: 10px; 77 | font-weight: 100; 78 | } 79 | #explore .explore { 80 | position: absolute; 81 | right: 10px; 82 | z-index: 1000000; 83 | cursor: pointer; 84 | font-size: 15px; 85 | }`; 86 | document.documentElement.appendChild(style); 87 | 88 | const cload = () => fetch('matched.json').then(r => r.json()).then(build); 89 | const explore = () => { 90 | const span = document.createElement('span'); 91 | span.textContent = '↯'; 92 | span.title = 'Explore more'; 93 | span.classList.add('explore'); 94 | root.appendChild(span); 95 | span.onclick = () => { 96 | root.textContent = ''; 97 | localStorage.setItem('explore-count', INC); 98 | cload(); 99 | }; 100 | }; 101 | const build = json => { 102 | if (json.length === 0) { 103 | return; 104 | } 105 | root.dataset.loaded = true; 106 | root.textContent = 'Explore more'; 107 | const table = document.createElement('table'); 108 | const tr = document.createElement('tr'); 109 | const span = document.createElement('span'); 110 | span.classList.add('close'); 111 | span.textContent = '✕'; 112 | span.onclick = () => { 113 | root.textContent = ''; 114 | root.dataset.loaded = false; 115 | localStorage.setItem('explore-count', 0); 116 | explore(); 117 | }; 118 | root.appendChild(span); 119 | 120 | const {homepage_url} = chrome.runtime.getManifest(); 121 | const origin = homepage_url.split('/').slice(0, -1).join('/'); 122 | const colors = shuffle( 123 | ['524c84', '606470', '755da3', 'c06c84', '393e46', '446e5c', '693e52', '1d566e', '693e52', 'd95858', 'f27370'] 124 | ); 125 | shuffle(Object.entries(json)).slice(0, cols).forEach(([id, {name}], i) => { 126 | const td = document.createElement('td'); 127 | const a = Object.assign(document.createElement('a'), { 128 | target: '_blank', 129 | title: 'Click to browse', 130 | href: origin + '/' + id + '.html?context=explore' 131 | }); 132 | 133 | const icon = document.createElement('span'); 134 | icon.textContent = name.split(' ').slice(0, 2).map(s => s[0]).join('').toUpperCase(); 135 | icon.classList.add('icon'); 136 | icon.style['background-color'] = '#' + colors[i]; 137 | a.appendChild(icon); 138 | 139 | const span = document.createElement('span'); 140 | span.classList.add('title'); 141 | span.textContent = name; 142 | a.appendChild(span); 143 | td.appendChild(a); 144 | tr.appendChild(td); 145 | }); 146 | table.appendChild(tr); 147 | root.appendChild(table); 148 | }; 149 | const init = () => { 150 | if (count >= INC) { 151 | if (count < INC + 3) { 152 | cload(); 153 | } 154 | else { 155 | explore(); 156 | } 157 | if (count > INC + 5) { 158 | localStorage.setItem('explore-count', INC - 6); 159 | } 160 | else { 161 | localStorage.setItem('explore-count', count + 1); 162 | } 163 | } 164 | else { 165 | explore(); 166 | localStorage.setItem('explore-count', count + 1); 167 | } 168 | }; 169 | if (/Edg/.test(navigator.userAgent) === false) { 170 | init(); 171 | } 172 | } 173 | -------------------------------------------------------------------------------- /data/options/matched.json: -------------------------------------------------------------------------------- 1 | { 2 | "country-flags": { 3 | "name": "Country Flags & IP WHOIS" 4 | }, 5 | "save-images": { 6 | "name": "Download All Images" 7 | }, 8 | "media-player": { 9 | "name": "YouTube Media Player" 10 | }, 11 | "tab-discard": { 12 | "name": "Auto Tab Discard" 13 | }, 14 | "useragent-switcher": { 15 | "name": "User-Agent Switcher and Manager" 16 | }, 17 | "block-site": { 18 | "name": "Block Site" 19 | }, 20 | "chrome-reader-view": { 21 | "name": "Reader View" 22 | }, 23 | "dark-theme": { 24 | "name": "Dark Theme" 25 | }, 26 | "mute-tab": { 27 | "name": "Mute Tab" 28 | }, 29 | "proxy-switcher": { 30 | "name": "Proxy Switcher" 31 | }, 32 | "popup-blocker": { 33 | "name": "Popup Blocker" 34 | }, 35 | "audio-equalizer": { 36 | "name": "Audio Equalizer" 37 | }, 38 | "clipboard-manager": { 39 | "name": "Clipboard Manager" 40 | }, 41 | "sqlite-viewer": { 42 | "name": "SQLite Viewer" 43 | }, 44 | "audio-joiner": { 45 | "name": "Audio Joiner" 46 | }, 47 | "search-all-tabs": { 48 | "name": "Search all Tabs" 49 | }, 50 | "bookmarks-commander": { 51 | "name": "Bookmarks Commander" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /data/window/index.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | height: 100%; 4 | } 5 | body { 6 | margin: 0; 7 | padding: 10px; 8 | box-sizing: border-box; 9 | font-size: 13px; 10 | font-family: Arial,"Helvetica Neue",Helvetica,sans-serif; 11 | display: flex; 12 | flex-direction: column; 13 | align-items: center; 14 | } 15 | iframe { 16 | flex: 1; 17 | width: 100%; 18 | border: solid 1px #ccc; 19 | margin-top: 10px; 20 | } 21 | h1 { 22 | text-align: center; 23 | width: 100%; 24 | max-width: 480px; 25 | color: red; 26 | font-weight: 300; 27 | } 28 | table { 29 | width: 100%; 30 | table-layout: fixed; 31 | } 32 | 33 | td { 34 | overflow: hidden; 35 | text-overflow: ellipsis; 36 | white-space: nowrap; 37 | } 38 | 39 | p { 40 | background-color: #fff8c4; 41 | border: solid 2px #f7deae; 42 | padding: 10px; 43 | border-radius: 2px; 44 | } 45 | -------------------------------------------------------------------------------- /data/window/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |File name: | 18 |19 | |
URL: | 22 |23 | |
Start Time: | 26 |27 | |
Reported: | 30 |31 | |
View online: | 34 |35 | |
38 | Based on this report, decide whether you want to cancel the download and delete the local file or keep it. This is just a warning report! 39 |
40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /data/window/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const args = document.location.search.substr(1).split('&').map(s => s.split('=')).reduce((p, c) => { 4 | p[c[0]] = decodeURIComponent(c[1]); 5 | return p; 6 | }, {}); 7 | 8 | function summary(obj) { 9 | const styles = 10 | 'table {' + 11 | ' white-space: nowrap;' + 12 | ' font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;' + 13 | ' border-collapse: collapse;' + 14 | ' border-spacing: 0px;' + 15 | ' font-size: 13px;' + 16 | ' line-height: 20px;' + 17 | ' color: #333;' + 18 | ' table-layout: fixed;' + 19 | '}' + 20 | 'th {' + 21 | ' border-bottom: 1px solid #DDD;' + 22 | ' padding: 8px;' + 23 | ' text-align: left;' + 24 | '}' + 25 | 'td {' + 26 | ' padding: 8px;' + 27 | ' overflow: hidden;' + 28 | ' text-overflow: ellipsis;' + 29 | '}' + 30 | 'tr:nth-child(even) {' + 31 | ' background: #F9F9F9;' + 32 | '}' + 33 | '.clean {' + 34 | ' color: #33AF99;' + 35 | '}' + 36 | '.defected {' + 37 | ' color: #ED3237;' + 38 | '}'; 39 | const html = 40 | '' + 41 | ' ' + 42 | ' ' + 43 | ' ' + 44 | ' ' + 45 | 'URL Scanner | Result | Detail | ' + 56 | '
---|