diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 1747985..476b392 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -145,5 +145,23 @@ }, "empty": { "message": "Empty" + }, + "cut": { + "message": "Cut" + }, + "copy": { + "message": "Copy" + }, + "paste": { + "message": "Paste" + }, + "clipboard": { + "message": "Clipboard" + }, + "select": { + "message": "Select" + }, + "dragAndDrop": { + "message": "Drag & Drop" } } diff --git a/assets/icons/128.png b/assets/icons/128.png new file mode 100644 index 0000000..5b6d179 Binary files /dev/null and b/assets/icons/128.png differ diff --git a/assets/icons/128.png~ b/assets/icons/128.png~ new file mode 100644 index 0000000..14227f9 Binary files /dev/null and b/assets/icons/128.png~ differ diff --git a/assets/icons/16.png b/assets/icons/16.png new file mode 100644 index 0000000..1030059 Binary files /dev/null and b/assets/icons/16.png differ diff --git a/assets/icons/16.png~ b/assets/icons/16.png~ new file mode 100644 index 0000000..5b6d179 Binary files /dev/null and b/assets/icons/16.png~ differ diff --git a/assets/icons/32.png b/assets/icons/32.png new file mode 100644 index 0000000..512eee1 Binary files /dev/null and b/assets/icons/32.png differ diff --git a/assets/icons/32.png~ b/assets/icons/32.png~ new file mode 100644 index 0000000..14227f9 Binary files /dev/null and b/assets/icons/32.png~ differ diff --git a/assets/icons/48.png b/assets/icons/48.png new file mode 100644 index 0000000..b28b42e Binary files /dev/null and b/assets/icons/48.png differ diff --git a/assets/icons/48.png~ b/assets/icons/48.png~ new file mode 100644 index 0000000..14227f9 Binary files /dev/null and b/assets/icons/48.png~ differ diff --git a/content-scripts.js b/content-scripts.js index a8dc3f5..f90b153 100644 --- a/content-scripts.js +++ b/content-scripts.js @@ -38,10 +38,10 @@ function prevent(event) { var data = JSON.parse(SETTINGS.data[key]); if ( - data.key === HID.key && - data.shiftKey === HID.shiftKey && - data.ctrlKey === HID.ctrlKey && - data.altKey === HID.altKey && + (data.key === HID.key || isset(data.key) === false) && + (data.shiftKey === HID.shiftKey || isset(data.shiftKey) === false) && + (data.ctrlKey === HID.ctrlKey || isset(data.ctrlKey) === false) && + (data.altKey === HID.altKey || isset(data.altKey) === false) && data.click === HID.click && data.context === HID.context && data.wheel === HID.wheel @@ -202,9 +202,75 @@ window.addEventListener('mouseup', function(event) { } }, true); +window.addEventListener('cut', function(event) { + if (SETTINGS.data.cut !== false) { + event.stopPropagation(); + } +}, true); + +window.addEventListener('copy', function(event) { + if (SETTINGS.data.copy !== false) { + console.log('COPY', event); + event.stopPropagation(); + } +}, true); + +window.addEventListener('paste', function(event) { + if (SETTINGS.data.paste !== false) { + event.stopPropagation(); + } +}, true); + +window.addEventListener('select', function(event) { + if (SETTINGS.data.select !== false) { + event.stopPropagation(); + } +}, true); + +window.addEventListener('drag', function(event) { + if (SETTINGS.data.drag_and_drop !== false) { + event.stopPropagation(); + } +}, true); + +window.addEventListener('dragend', function(event) { + if (SETTINGS.data.drag_and_drop !== false) { + event.stopPropagation(); + } +}, true); + +window.addEventListener('dragenter', function(event) { + if (SETTINGS.data.drag_and_drop !== false) { + event.stopPropagation(); + } +}, true); + +window.addEventListener('dragstart', function(event) { + if (SETTINGS.data.drag_and_drop !== false) { + event.stopPropagation(); + } +}, true); + +window.addEventListener('dragleave', function(event) { + if (SETTINGS.data.drag_and_drop !== false) { + event.stopPropagation(); + } +}, true); + +window.addEventListener('dragover', function(event) { + if (SETTINGS.data.drag_and_drop !== false) { + event.stopPropagation(); + } +}, true); + +window.addEventListener('drop', function(event) { + if (SETTINGS.data.drag_and_drop !== false) { + event.stopPropagation(); + } +}, true); + /*window.addEventListener('dbclick', prevent, true); -window.addEventListener('mousemove', prevent, true); -window.addEventListener('select', prevent, true);*/ +window.addEventListener('mousemove', prevent, true);*/ /*--------------------------------------------------------------- diff --git a/manifest.json b/manifest.json index e4f6387..e2460a8 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,13 @@ { "manifest_version": 2, "name": "HID control prevention", - "version": "0.61", + "version": "1.0", + "icons": { + "16": "assets/icons/16.png", + "32": "assets/icons/32.png", + "48": "assets/icons/48.png", + "128": "assets/icons/128.png" + }, "default_locale": "en", diff --git a/popup/popup.js b/popup/popup.js index 5968e5b..f752387 100644 --- a/popup/popup.js +++ b/popup/popup.js @@ -9,15 +9,14 @@ /*--------------------------------------------------------------- 1.0 OBJECT ---------------------------------------------------------------*/ - var Menu = { header: { type: 'header', - + section_start: { type: 'section', class: 'satus-section--align-start', - + go_back: { type: 'button', class: 'satus-button--back', @@ -34,14 +33,14 @@ var Menu = { section_end: { type: 'section', class: 'satus-section--align-end', - + button_vert: { type: 'button', icon: '', onClickRender: { type: 'dialog', class: 'satus-dialog--vertical-menu', - + rate_us: { type: 'folder', before: '', @@ -70,18 +69,18 @@ var Menu = { var self = (this === window ? document.querySelector('.satus-main') : this), item = self.history[self.history.length - 1], id = item.appearanceKey; - + if (!Satus.isset(container)) { container = document.querySelector('.satus-main__container'); } - + document.querySelector('.satus-text--title').innerText = Satus.locale.getMessage(this.history[this.history.length - 1].label) || 'HID control prevention'; document.body.dataset.appearance = id; container.dataset.appearance = id; } }, - + tooltip: { type: 'section', class: 'satus-section--tooltip', @@ -91,10 +90,10 @@ var Menu = { value: true } }, - + section: { type: 'section', - + filters: { type: 'folder', label: 'filters', @@ -106,19 +105,19 @@ var Menu = { label: 'websites', before: '', appearanceKey: 'websites', - + section: { type: 'section', - + onrender: function() { var data = satus.storage.get('websites') || {}, list = {}; - + for (var key in data) { list[key] = { type: 'folder', label: key, - + section: { type: 'section', class: 'satus-section--shortcuts', @@ -127,12 +126,12 @@ var Menu = { var data = satus.storage.get(this.storage_key) || {}, list = {}, length = 0; - + for (var key in data) { list[key] = { type: 'section', class: 'satus-section--row', - + shortcut: { type: 'shortcut', storage_key: this.storage_key + key @@ -144,19 +143,19 @@ var Menu = { storage_key: this.storage_key + key, onclick: function() { satus.storage.set(this.storage_key, undefined); - + this.parentNode.style.height = 0; - - setTimeout(function(){ + + setTimeout(function() { this.parentNode.remove(); }, .2); } } }; - + length++; } - + if (length > 0) { satus.render(list, this); } else { @@ -173,7 +172,7 @@ var Menu = { footer: { type: 'div', class: 'satus-div--create', - + button: { type: 'shortcut', class: 'satus-shortcut--create', @@ -185,7 +184,7 @@ var Menu = { } }; } - + if (Object.keys(list).length > 0) { satus.render(list, this); } else { @@ -503,7 +502,7 @@ var Menu = { } } }, - + made_with_love: { type: 'text', class: 'made-with-love', @@ -522,10 +521,10 @@ var Menu = { function init(response) { HOSTNAME = response || ''; - + satus.storage.import(function() { var language = satus.storage.get('language') || 'en'; - + satus.locale.import('../_locales/' + language + '/messages.json', function() { satus.modules.updateStorageKeys(Menu, function() { if (HOSTNAME === '') { @@ -538,70 +537,118 @@ function init(response) { Menu.main.tooltip.enable.label = HOSTNAME; Menu.main.tooltip.enable.storage_key = 'websites/' + HOSTNAME + '/enabled'; } - + if (HOSTNAME !== '') { Menu.main.section.filters.tabs = { type: 'tabs', - + global: { type: 'tab', label: 'global', - + + section_00: { + type: 'section', + + clipboard: { + type: 'folder', + label: 'clipboard', + + section: { + type: 'section', + + cut: { + type: 'switch', + label: 'cut', + value: true, + storage_key: 'global/cut' + }, + copy: { + type: 'switch', + label: 'copy', + value: true, + storage_key: 'global/copy' + }, + paste: { + type: 'switch', + label: 'paste', + value: true, + storage_key: 'global/paste' + } + } + }, + select: { + type: 'switch', + label: 'select', + value: true, + storage_key: 'global/select' + }, + drag_and_drop: { + type: 'switch', + label: 'dragAndDrop', + value: true, + storage_key: 'global/drag_and_drop' + } + }, + section: { type: 'section', class: 'satus-section--shortcuts global', onrender: function() { var data = satus.storage.get('global') || {}, - list = {}, - length = 0; - - for (var key in data) { - list[key] = { - type: 'section', - class: 'satus-section--row', - - shortcut: { + list = { + search: { type: 'shortcut', - storage_key: 'global/' + key - }, - remove: { - type: 'button', - class: 'satus-button--remove', - before: '', - storage_key: 'global/' + key, - onclick: function() { - satus.storage.set(this.storage_key, undefined); - - this.parentNode.style.height = 0; - - setTimeout(function(){ - this.parentNode.remove(); - }, .2); - } + value: { + key: "f", + keyCode: 70, + shiftKey: false, + ctrlKey: true, + altKey: false, + click: false, + context: false, + wheel: false + }, + storage_key: 'global/search' } }; - - length++; - } - - if (length > 0) { - satus.render(list, this); - } else { - satus.render({ - type: 'text', - label: 'empty', - style: { - margin: '0 16px' - } - }, this); + + for (var key in data) { + if (['cut', 'copy', 'paste', 'select', 'drag_and_drop'].indexOf(key) === -1) { + list[key] = { + type: 'section', + class: 'satus-section--row', + + shortcut: { + type: 'shortcut', + storage_key: 'global/' + key + }, + remove: { + type: 'button', + class: 'satus-button--remove', + before: '', + storage_key: 'global/' + key, + onclick: function() { + satus.storage.set(this.storage_key, undefined); + + this.parentNode.style.height = 0; + + setTimeout(function() { + this.parentNode.remove(); + }, 200); + } + } + }; + } } + + satus.render(list, this); } } }, current: { type: 'tab', label: 'current', - + section: { type: 'section', class: 'satus-section--shortcuts', @@ -609,12 +656,12 @@ function init(response) { var data = satus.storage.get('websites/' + HOSTNAME + '/items') || {}, list = {}, length = 0; - + for (var key in data) { list[key] = { type: 'section', class: 'satus-section--row', - + shortcut: { type: 'shortcut', storage_key: 'websites/' + HOSTNAME + '/items/' + key @@ -626,19 +673,19 @@ function init(response) { storage_key: 'websites/' + HOSTNAME + '/items/' + key, onclick: function() { satus.storage.set(this.storage_key, undefined); - + this.parentNode.style.height = 0; - - setTimeout(function(){ + + setTimeout(function() { this.parentNode.remove(); }, .2); } } }; - + length++; } - + if (length > 0) { satus.render(list, this); } else { @@ -660,63 +707,111 @@ function init(response) { class: 'satus-section--label', label: 'global' }; - + + Menu.main.section.filters.section_00 = { + type: 'section', + + clipboard: { + type: 'folder', + label: 'clipboard', + + section: { + type: 'section', + + cut: { + type: 'switch', + label: 'cut', + value: true, + storage_key: 'global/cut' + }, + copy: { + type: 'switch', + label: 'copy', + value: true, + storage_key: 'global/copy' + }, + paste: { + type: 'switch', + label: 'paste', + value: true, + storage_key: 'global/paste' + } + } + }, + select: { + type: 'switch', + label: 'select', + value: true, + storage_key: 'global/select' + }, + drag_and_drop: { + type: 'switch', + label: 'dragAndDrop', + value: true, + storage_key: 'global/drag_and_drop' + } + }; + Menu.main.section.filters.section = { type: 'section', - class: 'satus-section--shortcuts', + class: 'satus-section--shortcuts global', onrender: function() { var data = satus.storage.get('global') || {}, - list = {}, - length = 0; - - for (var key in data) { - list[key] = { - type: 'section', - class: 'satus-section--row', - - shortcut: { + list = { + search: { type: 'shortcut', - storage_key: 'global/' + key - }, - remove: { - type: 'button', - class: 'satus-button--remove', - before: '', - storage_key: 'global/' + key, - onclick: function() { - satus.storage.set(this.storage_key, undefined); - - this.parentNode.style.height = 0; - - setTimeout(function(){ - this.parentNode.remove(); - }, .2); - } + value: { + key: "f", + keyCode: 70, + shiftKey: false, + ctrlKey: true, + altKey: false, + click: false, + context: false, + wheel: false + }, + storage_key: 'global/search' } }; - - length++; - } - - if (length > 0) { - satus.render(list, this); - } else { - satus.render({ - type: 'text', - label: 'empty', - style: { - margin: '0 16px' - } - }, this); + + for (var key in data) { + if (['cut', 'copy', 'paste', 'select', 'drag_and_drop'].indexOf(key) === -1) { + list[key] = { + type: 'section', + class: 'satus-section--row', + + shortcut: { + type: 'shortcut', + storage_key: 'global/' + key + }, + remove: { + type: 'button', + class: 'satus-button--remove', + before: '', + storage_key: 'global/' + key, + onclick: function() { + satus.storage.set(this.storage_key, undefined); + + this.parentNode.style.height = 0; + + setTimeout(function() { + this.parentNode.remove(); + }, .2); + } + } + }; + } } + + satus.render(list, this); } }; } - + Menu.main.section.filters.footer = { type: 'div', class: 'satus-div--create', - + button: { type: 'shortcut', class: 'satus-shortcut--create', @@ -727,10 +822,46 @@ function init(response) { } else { this.skelet.storage_key = 'websites/' + HOSTNAME + '/items/' + new Date().getTime(); } + }, + onchange: function(object, value) { + var item = { + type: 'section', + class: 'satus-section--row', + + shortcut: { + type: 'shortcut', + storage_key: object.storage_key + }, + remove: { + type: 'button', + class: 'satus-button--remove', + before: '', + storage_key: object.storage_key, + onclick: function() { + satus.storage.set(this.storage_key, undefined); + + this.parentNode.style.height = 0; + + setTimeout(function() { + this.parentNode.remove(); + }, 200); + } + } + }; + + if (document.querySelector('.global')) { + satus.render(item, document.querySelector('.global')); + } else { + if (document.querySelector('.satus-section--shortcuts .satus-text')) { + document.querySelector('.satus-section--shortcuts .satus-text').remove(); + } + + satus.render(item, document.querySelector('.satus-section--shortcuts')); + } } } }; - + satus.render(Menu); }); }); diff --git a/satus/satus.js b/satus/satus.js index 9590690..bcd4825 100644 --- a/satus/satus.js +++ b/satus/satus.js @@ -525,26 +525,26 @@ Satus.modules.user = function() { return data; }; -/*-------------------------------------------------------------- +/*--------------------------------------------------------------- >>> CHROMIUM STORAGE ----------------------------------------------------------------- +----------------------------------------------------------------- 1.0 Get 2.0 Set 3.0 Import 4.0 Clear ---------------------------------------------------------------*/ +---------------------------------------------------------------*/ -Satus.storage = { +satus.storage = { data: {} }; -/*-------------------------------------------------------------- -# GET ---------------------------------------------------------------*/ +/*--------------------------------------------------------------- +1.0 GET +---------------------------------------------------------------*/ -Satus.storage.get = function(name) { +satus.storage.get = function(name) { if (satus.isset(name)) { - var target = Satus.storage; + var target = satus.storage.data; name = name.split('/').filter(function(value) { return value != ''; @@ -563,15 +563,15 @@ Satus.storage.get = function(name) { }; -/*-------------------------------------------------------------- -# SET ---------------------------------------------------------------*/ +/*--------------------------------------------------------------- +2.0 SET +---------------------------------------------------------------*/ -Satus.storage.set = function(name, value) { +satus.storage.set = function(name, value) { var items = {}, - target = Satus.storage; + target = Satus.storage.data; - if (!Satus.isset(name)) { + if (!satus.isset(name)) { return false; } @@ -596,25 +596,21 @@ Satus.storage.set = function(name, value) { } } - for (var key in Satus.storage) { - if (typeof Satus.storage[key] !== 'function') { - items[key] = Satus.storage[key]; - } + for (var key in satus.storage.data) { + items[key] = satus.storage.data[key]; } chrome.storage.local.set(items); }; -/*-------------------------------------------------------------- -# IMPORT ---------------------------------------------------------------*/ +/*--------------------------------------------------------------- +3.0 IMPORT +---------------------------------------------------------------*/ -Satus.storage.import = function(callback) { +satus.storage.import = function(callback) { chrome.storage.local.get(function(items) { - for (var key in items) { - Satus.storage[key] = items[key]; - } + satus.storage.data = items; if (callback) { callback(); @@ -623,18 +619,14 @@ Satus.storage.import = function(callback) { }; -/*-------------------------------------------------------------- -# CLEAR ---------------------------------------------------------------*/ +/*--------------------------------------------------------------- +4.0 CLEAR +---------------------------------------------------------------*/ -Satus.storage.clear = function() { +satus.storage.clear = function() { chrome.storage.local.clear(); - for (var key in Satus.storage) { - if (typeof Satus.storage[key] !== 'function') { - delete Satus.storage[key]; - } - } + delete satus.storage.data; }; /*----------------------------------------------------------------------------- @@ -868,25 +860,27 @@ Satus.components.table = function(item) { } function sortArray(array, index, mode) { - if (mode === 'asc') { - if (typeof array[0][index].text === 'number') { - sorted = array.sort(function(a, b) { - return a[index].text - b[index].text; - }); - } else { - sorted = array.sort(function(a, b) { - return a[index].text.localeCompare(b[index].text); - }); - } - } else { - if (typeof array[0][index].text === 'number') { - sorted = array.sort(function(a, b) { - return b[index].text - a[index].text; - }); + if (array[0]) { + if (mode === 'asc') { + if (typeof array[0][index].text === 'number') { + sorted = array.sort(function(a, b) { + return a[index].text - b[index].text; + }); + } else { + sorted = array.sort(function(a, b) { + return a[index].text.localeCompare(b[index].text); + }); + } } else { - sorted = array.sort(function(a, b) { - return b[index].text.localeCompare(a[index].text); - }); + if (typeof array[0][index].text === 'number') { + sorted = array.sort(function(a, b) { + return b[index].text - a[index].text; + }); + } else { + sorted = array.sort(function(a, b) { + return b[index].text.localeCompare(a[index].text); + }); + } } } @@ -940,7 +934,7 @@ Satus.components.table = function(item) { component.data = item.data; component.paging = item.paging; - component.pagingIndex = 0; + component.pagingIndex = 1; component.update = function(data, index, mode) { if (Satus.isset(data)) { @@ -971,35 +965,54 @@ Satus.components.table = function(item) { // PAGING + function pagingButton(i, c) { + var button = document.createElement('button'); + + if (i === component.pagingIndex) { + button.className = 'active'; + } - function pagingUpdate() { - if (typeof this.paging === 'number') { - var pages = Math.ceil(this.data.length / this.paging); - - this.querySelector('.satus-table__paging').innerHTML = ''; - - for (var i = 1; i <= pages; i++) { - var button = document.createElement('button'); - - if (i === (this.pagingIndex || 1)) { - button.className = 'active'; - } + button.innerText = i; + button.parentComponent = component; + button.addEventListener('click', function() { + this.parentComponent.pagingIndex = Number(this.innerText); + this.parentComponent.update(this.parentComponent.data); + this.parentComponent.pagingUpdate(); + }); - button.innerText = i; - button.parentComponent = this; - button.addEventListener('click', function() { - if (this.parentNode.querySelector('button.active')) { - this.parentNode.querySelector('button.active').classList.remove('active'); - } + c.appendChild(button); + } - this.classList.add('active'); + function pagingUpdate() { + if (typeof this.paging === 'number') { + var pages = Math.ceil(this.data.length / this.paging), + c = this.querySelector('.satus-table__paging'); - this.parentComponent.pagingIndex = Number(this.innerText); - this.parentComponent.update(this.parentComponent.data); - }); + c.innerHTML = ''; + + pagingButton(1, c); + + if (component.pagingIndex - 2 > 2) { + var span = document.createElement('span'); + + span.innerText = '...'; + + c.appendChild(span); + } - this.querySelector('.satus-table__paging').appendChild(button); + for (var i = component.pagingIndex - 2 < 2 ? 2 : component.pagingIndex - 2, l = component.pagingIndex + 2 > pages - 1 ? pages - 1 : component.pagingIndex + 2; i <= l; i++) { + pagingButton(i, c); } + + if (component.pagingIndex + 2 < pages - 1) { + var span = document.createElement('span'); + + span.innerText = '...'; + + c.appendChild(span); + } + + pagingButton(pages, c); } resize(); @@ -2315,6 +2328,11 @@ satus.components.shortcut = function(object) { component_button_save.addEventListener('click', function() { Satus.storage.set(object.storage_key, JSON.stringify(value)); + + if (typeof object.onchange === 'function') { + object.onchange(object, value); + } + close(); });