From e84e19069d2567112ac9c8e8448cf6829e20b671 Mon Sep 17 00:00:00 2001 From: Can Arslan Date: Tue, 15 May 2018 09:20:42 +0200 Subject: [PATCH 01/52] fixes #332 with adding keydown listener to parent (#334) fixes #332 this adds keydown listener to parent document if there is one. it does not use background files which uses unnecessary ram --- inject.js | 87 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 38 deletions(-) diff --git a/inject.js b/inject.js index b85b23b..c253825 100644 --- a/inject.js +++ b/inject.js @@ -203,7 +203,13 @@ chrome.runtime.sendMessage({}, function(response) { } } } - + inIframe () { + try { + return window.self !== window.top; + } catch (e) { + return true; + } + } function initializeNow(document) { // enforce init-once due to redundant callers if (!document.body || document.body.classList.contains('vsc-initialized')) { @@ -220,47 +226,52 @@ chrome.runtime.sendMessage({}, function(response) { link.rel = 'stylesheet'; document.head.appendChild(link); } + var docs = Array(document) + if(inIframe()) + docs.push(window.top.document); + + docs.forEach(function(doc) { + doc.addEventListener('keydown', function(event) { + var keyCode = event.keyCode; - document.addEventListener('keydown', function(event) { - var keyCode = event.keyCode; + // Ignore if following modifier is active. + if (!event.getModifierState + || event.getModifierState("Alt") + || event.getModifierState("Control") + || event.getModifierState("Fn") + || event.getModifierState("Meta") + || event.getModifierState("Hyper") + || event.getModifierState("OS")) { + return; + } - // Ignore if following modifier is active. - if (!event.getModifierState - || event.getModifierState("Alt") - || event.getModifierState("Control") - || event.getModifierState("Fn") - || event.getModifierState("Meta") - || event.getModifierState("Hyper") - || event.getModifierState("OS")) { - return; - } + // Ignore keydown event if typing in an input box + if ((document.activeElement.nodeName === 'INPUT' + && document.activeElement.getAttribute('type') === 'text') + || document.activeElement.nodeName === 'TEXTAREA' + || document.activeElement.isContentEditable) { + return false; + } + + if (keyCode == tc.settings.rewindKeyCode) { + runAction('rewind', document, true) + } else if (keyCode == tc.settings.advanceKeyCode) { + runAction('advance', document, true) + } else if (keyCode == tc.settings.fasterKeyCode) { + runAction('faster', document, true) + } else if (keyCode == tc.settings.slowerKeyCode) { + runAction('slower', document, true) + } else if (keyCode == tc.settings.resetKeyCode) { + runAction('reset', document, true) + } else if (keyCode == tc.settings.displayKeyCode) { + runAction('display', document, true) + } else if (keyCode == tc.settings.fastKeyCode) { + runAction('fast', document, true); + } - // Ignore keydown event if typing in an input box - if ((document.activeElement.nodeName === 'INPUT' - && document.activeElement.getAttribute('type') === 'text') - || document.activeElement.nodeName === 'TEXTAREA' - || document.activeElement.isContentEditable) { return false; - } - - if (keyCode == tc.settings.rewindKeyCode) { - runAction('rewind', document, true) - } else if (keyCode == tc.settings.advanceKeyCode) { - runAction('advance', document, true) - } else if (keyCode == tc.settings.fasterKeyCode) { - runAction('faster', document, true) - } else if (keyCode == tc.settings.slowerKeyCode) { - runAction('slower', document, true) - } else if (keyCode == tc.settings.resetKeyCode) { - runAction('reset', document, true) - } else if (keyCode == tc.settings.displayKeyCode) { - runAction('display', document, true) - } else if (keyCode == tc.settings.fastKeyCode) { - runAction('fast', document, true); - } - - return false; - }, true); + }, true); + }); function checkForVideo(node, parent, added) { if (node.nodeName === 'VIDEO') { From bcf3a0716f2bc4cbcdb7837c176afad24dfc87e3 Mon Sep 17 00:00:00 2001 From: Can Arslan Date: Tue, 15 May 2018 14:42:22 +0200 Subject: [PATCH 02/52] unclickable overlay fix on reddit video - #315 (#325) * Overlay on reddit fix - #315 - not fixing "in the middle of the video" part --- inject.js | 1 + 1 file changed, 1 insertion(+) diff --git a/inject.js b/inject.js index c253825..3a39684 100644 --- a/inject.js +++ b/inject.js @@ -151,6 +151,7 @@ chrome.runtime.sendMessage({}, function(response) { switch (true) { case (location.hostname == 'www.amazon.com'): + case (location.hostname == 'www.reddit.com'): case (/hbogo\./).test(location.hostname): // insert before parent to bypass overlay this.parent.parentElement.insertBefore(fragment, this.parent); From 912165605c4eb76719ff7e39ded05ba993511c51 Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Sun, 1 Apr 2018 13:48:42 -0700 Subject: [PATCH 03/52] bump to 0.5.1 --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 1561516..a68ff1f 100755 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "Video Speed Controller", "short_name": "videospeed", - "version": "0.5.0", + "version": "0.5.1", "manifest_version": 2, "description": "Speed up, slow down, advance and rewind any HTML5 video with quick shortcuts.", "homepage_url": "https://github.com/igrigorik/videospeed", From 1718872d98c97429d9543b8ef24ec4f405fca39b Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Fri, 18 May 2018 12:04:38 +0100 Subject: [PATCH 04/52] fix missing function keyword --- inject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inject.js b/inject.js index 3a39684..1b1534d 100644 --- a/inject.js +++ b/inject.js @@ -204,7 +204,7 @@ chrome.runtime.sendMessage({}, function(response) { } } } - inIframe () { + function inIframe () { try { return window.self !== window.top; } catch (e) { From 4e96e57e7d234c575764bc32db6a00515d032cc6 Mon Sep 17 00:00:00 2001 From: Can Arslan Date: Sat, 16 Jun 2018 18:39:46 +0200 Subject: [PATCH 05/52] Update inject.js (#346) --- inject.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/inject.js b/inject.js index 1b1534d..1a1e2ec 100644 --- a/inject.js +++ b/inject.js @@ -228,8 +228,11 @@ chrome.runtime.sendMessage({}, function(response) { document.head.appendChild(link); } var docs = Array(document) - if(inIframe()) - docs.push(window.top.document); + try { + if (inIframe()) + docs.push(window.top.document); + } catch (e) { + } docs.forEach(function(doc) { doc.addEventListener('keydown', function(event) { From cb6d3257234e670c1246f3eecbb0948b6bbb2a73 Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Sat, 16 Jun 2018 09:58:24 -0700 Subject: [PATCH 06/52] expand Google Hangouts wildcard; disable VSC on Hangouts --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index a68ff1f..1666c87 100755 --- a/manifest.json +++ b/manifest.json @@ -25,7 +25,7 @@ "matches": [ "http://*/*", "https://*/*", "file:///*" ], "exclude_matches": [ "https://plus.google.com/hangouts/*", - "https://hangouts.google.com/hangouts/*", + "https://hangouts.google.com/*", "https://meet.google.com/*", "https://teamtreehouse.com/*", "http://www.hitbox.tv/*" From 8b9c7de29e20054c6634cc724be522e50c6bd354 Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Sun, 1 Jul 2018 12:12:01 -0700 Subject: [PATCH 07/52] ignore local --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 46addde..03c6b3a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store +local # IntelliJ IDEA .idea/ From 0ad52bbed9897b2e5cef41812033bfd8a6d61b85 Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Sun, 1 Jul 2018 12:18:16 -0700 Subject: [PATCH 08/52] bump to 0.5.2 --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 1666c87..22948d8 100755 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "Video Speed Controller", "short_name": "videospeed", - "version": "0.5.1", + "version": "0.5.2", "manifest_version": 2, "description": "Speed up, slow down, advance and rewind any HTML5 video with quick shortcuts.", "homepage_url": "https://github.com/igrigorik/videospeed", From 0256ccb593c13671a73be7df540791688297e880 Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Thu, 6 Sep 2018 21:38:27 -0700 Subject: [PATCH 09/52] facebook.com: move controls lower to avoid overlap with player Closes #372 --- inject.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/inject.css b/inject.css index 254c408..d1ac0dc 100644 --- a/inject.css +++ b/inject.css @@ -29,6 +29,12 @@ top: 40px; } +/* Facebook player */ +#facebook .vsc-controller { + position: relative; + top: 40px; +} + /* Google Photos player */ /* Inline preview doesn't have any additional hooks, relying on Aria label */ a[aria-label^="Video"] .vsc-controller { From 86ccce0a862e91497a05ccd66c82b08794eeedb2 Mon Sep 17 00:00:00 2001 From: Rongjian Zhang Date: Tue, 6 Nov 2018 00:43:46 +0800 Subject: [PATCH 10/52] fix: replace deprecated createShadowRoot with attachShadow (#386) fix #384 --- inject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inject.js b/inject.js index 1a1e2ec..f967208 100644 --- a/inject.js +++ b/inject.js @@ -114,7 +114,7 @@ chrome.runtime.sendMessage({}, function(response) { wrapper.classList.add('vsc-hidden'); } - var shadow = wrapper.createShadowRoot(); + var shadow = wrapper.attachShadow({ mode: 'open' }); var shadowTemplate = ` -
+
${speed} diff --git a/options.html b/options.html index 0119bd8..102906f 100644 --- a/options.html +++ b/options.html @@ -81,7 +81,7 @@
-

Other

+

Other

@@ -94,6 +94,10 @@
+
+ + +
diff --git a/options.js b/options.js index 6071d0a..eed88a4 100644 --- a/options.js +++ b/options.js @@ -6,6 +6,7 @@ var tcDefaults = { rememberSpeed: false, // default: false audioBoolean: false, // default: false startHidden: false, // default: false + controllerOpacity: 0.3, // default: 0.3 keyBindings: [ {action: "slower", key: 83, value: 0.1, force: false, predefined: true}, // S {action: "faster", key: 68, value: 0.1, force: false, predefined: true}, // D @@ -151,6 +152,7 @@ function save_options() { var rememberSpeed = document.getElementById('rememberSpeed').checked; var audioBoolean = document.getElementById('audioBoolean').checked; var startHidden = document.getElementById('startHidden').checked; + var controllerOpacity = document.getElementById('controllerOpacity').value; var blacklist = document.getElementById('blacklist').value; displayKeyCode = isNaN(displayKeyCode) ? tcDefaults.displayKeyCode : displayKeyCode; @@ -161,6 +163,7 @@ function save_options() { rememberSpeed: rememberSpeed, audioBoolean: audioBoolean, startHidden: startHidden, + controllerOpacity: controllerOpacity, keyBindings: keyBindings, blacklist: blacklist.replace(regStrip,'') }, function() { @@ -180,6 +183,7 @@ function restore_options() { document.getElementById('rememberSpeed').checked = storage.rememberSpeed; document.getElementById('audioBoolean').checked = storage.audioBoolean; document.getElementById('startHidden').checked = storage.startHidden; + document.getElementById('controllerOpacity').value = storage.controllerOpacity; document.getElementById('blacklist').value = storage.blacklist; for (let i in storage.keyBindings) { diff --git a/shadow.css b/shadow.css index da96519..3b9a7e1 100644 --- a/shadow.css +++ b/shadow.css @@ -22,7 +22,6 @@ cursor: default; z-index: 9999999; - opacity: 0.3; } #controller:hover { From 5641369385cf4175e308c8e188c9bb70226a12da Mon Sep 17 00:00:00 2001 From: Joe Lencioni Date: Sat, 3 Aug 2019 11:09:23 -0700 Subject: [PATCH 36/52] Add teams.microsoft.com to default blacklist (#495) Microsoft Teams is used for video conferencing, and this extension causes all of the videos to be half cut off. I think it would be a good idea to add it to the default blacklist. --- inject.js | 1 + options.js | 1 + 2 files changed, 2 insertions(+) diff --git a/inject.js b/inject.js index 9d888ca..ad831b4 100644 --- a/inject.js +++ b/inject.js @@ -16,6 +16,7 @@ twitter.com vine.co imgur.com + teams.microsoft.com `.replace(regStrip,'') } }; diff --git a/options.js b/options.js index eed88a4..ebf3f40 100644 --- a/options.js +++ b/options.js @@ -20,6 +20,7 @@ var tcDefaults = { twitter.com vine.co imgur.com + teams.microsoft.com `.replace(regStrip, '') }; From 49e9f4b78db4e3cc705979acbd78bd852eeb35f2 Mon Sep 17 00:00:00 2001 From: Timothy Lim Date: Sun, 6 Oct 2019 07:54:11 +0800 Subject: [PATCH 37/52] Use .currentSrc instead of .src to correctly identify video (#529) --- inject.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/inject.js b/inject.js index ad831b4..46a9c14 100644 --- a/inject.js +++ b/inject.js @@ -122,28 +122,28 @@ this.speed = 1.0; if (!tc.settings.rememberSpeed) { - if (!tc.settings.speeds[target.src]) { - tc.settings.speeds[target.src] = this.speed; + if (!tc.settings.speeds[target.currentSrc]) { + tc.settings.speeds[target.currentSrc] = this.speed; } setKeyBindings("reset", getKeyBindings("fast")); // resetSpeed = fastSpeed } else { - tc.settings.speeds[target.src] = tc.settings.lastSpeed; + tc.settings.speeds[target.currentSrc] = tc.settings.lastSpeed; } - target.playbackRate = tc.settings.speeds[target.src]; + target.playbackRate = tc.settings.speeds[target.currentSrc]; this.div=this.initializeControls(); target.addEventListener('play', this.handlePlay = function(event) { if (!tc.settings.rememberSpeed) { - if (!tc.settings.speeds[target.src]) { - tc.settings.speeds[target.src] = this.speed; + if (!tc.settings.speeds[target.currentSrc]) { + tc.settings.speeds[target.currentSrc] = this.speed; } setKeyBindings("reset", getKeyBindings("fast")); // resetSpeed = fastSpeed } else { - tc.settings.speeds[target.src] = tc.settings.lastSpeed; + tc.settings.speeds[target.currentSrc] = tc.settings.lastSpeed; } - target.playbackRate = tc.settings.speeds[target.src]; + target.playbackRate = tc.settings.speeds[target.currentSrc]; }.bind(this)); target.addEventListener('ratechange', this.handleRatechange = function(event) { @@ -152,7 +152,7 @@ if (event.target.readyState > 0) { var speed = this.getSpeed(); this.speedIndicator.textContent = speed; - tc.settings.speeds[this.video.src] = speed; + tc.settings.speeds[this.video.currentSrc] = speed; tc.settings.lastSpeed = speed; this.speed = speed; chrome.storage.sync.set({'lastSpeed': speed}, function() { @@ -163,12 +163,12 @@ var observer=new MutationObserver((mutations) => { mutations.forEach((mutation) => { - if (mutation.type === 'attributes' && mutation.attributeName === 'src'){ + if (mutation.type === 'attributes' && (mutation.attributeName === 'src' || mutation.attributeName === 'currentSrc')){ var controller = document.querySelector(`div[data-vscid="${this.id}"]`); if(!controller){ return; } - if (!mutation.target.src) { + if (!mutation.target.currentSrc) { controller.classList.add('vsc-nosource'); } else { controller.classList.remove('vsc-nosource'); @@ -177,7 +177,7 @@ }); }); observer.observe(target, { - attributeFilter: ["src"] + attributeFilter: ["src", "currentSrc"] }); }; @@ -195,7 +195,7 @@ tc.videoController.prototype.initializeControls = function() { var document = this.document; - var speed = parseFloat(tc.settings.speeds[this.video.src]).toFixed(2), + var speed = parseFloat(tc.settings.speeds[this.video.currentSrc]).toFixed(2), top = Math.max(this.video.offsetTop, 0) + "px", left = Math.max(this.video.offsetLeft, 0) + "px"; @@ -203,7 +203,7 @@ wrapper.classList.add('vsc-controller'); wrapper.dataset['vscid'] = this.id; - if (!this.video.src) { + if (!this.video.currentSrc) { wrapper.classList.add('vsc-nosource'); } From 823a24475cbfa7b4885cd27b7375197058f544c5 Mon Sep 17 00:00:00 2001 From: Timothy Lim Date: Fri, 11 Oct 2019 17:29:55 +0800 Subject: [PATCH 38/52] Add ability to disable website keybindings for show/hide controller --- inject.js | 7 +++++++ options.html | 4 ++++ options.js | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/inject.js b/inject.js index ad831b4..8d213f7 100644 --- a/inject.js +++ b/inject.js @@ -6,6 +6,7 @@ speeds: {}, // empty object to hold speed for each source displayKeyCode: 86, // default: V + displayForce: false, rememberSpeed: false, // default: false audioBoolean: false, // default: false startHidden: false, // default: false @@ -74,6 +75,7 @@ keyBindings: tc.settings.keyBindings, version: tc.settings.version, displayKeyCode: tc.settings.displayKeyCode, + displayForce: tc.settings.displayForce, rememberSpeed: tc.settings.rememberSpeed, audioBoolean: tc.settings.audioBoolean, startHidden: tc.settings.startHidden, @@ -83,6 +85,7 @@ } tc.settings.lastSpeed = Number(storage.lastSpeed); tc.settings.displayKeyCode = Number(storage.displayKeyCode); + tc.settings.displayForce = String(storage.displayForce); tc.settings.rememberSpeed = Boolean(storage.rememberSpeed); tc.settings.audioBoolean = Boolean(storage.audioBoolean); tc.settings.startHidden = Boolean(storage.startHidden); @@ -360,6 +363,10 @@ if (keyCode == tc.settings.displayKeyCode) { runAction('display', document, true) + if (tc.settings.displayForce === "true") {// disable websites key bindings + event.preventDefault(); + event.stopPropagation(); + } } var item = tc.settings.keyBindings.find(item => item.key === keyCode); if (item) { diff --git a/options.html b/options.html index 102906f..1682d55 100644 --- a/options.html +++ b/options.html @@ -15,6 +15,10 @@
+
- -
+
+ + + +
@@ -120,6 +120,7 @@ function add_shortcut() { + @@ -150,20 +151,14 @@ function save_options() { keyBindings = []; Array.from(document.querySelectorAll(".customs")).forEach(item => createKeyBindings(item)); // Remove added shortcuts - var displayKeyCode = document.getElementById('displayKeyInput').keyCode; - var displayForce = document.getElementById('displayForce').value; var rememberSpeed = document.getElementById('rememberSpeed').checked; var audioBoolean = document.getElementById('audioBoolean').checked; var startHidden = document.getElementById('startHidden').checked; var controllerOpacity = document.getElementById('controllerOpacity').value; var blacklist = document.getElementById('blacklist').value; - displayKeyCode = isNaN(displayKeyCode) ? tcDefaults.displayKeyCode : displayKeyCode; - chrome.storage.sync.remove(["resetSpeed", "speedStep", "fastSpeed", "rewindTime", "advanceTime", "resetKeyCode", "slowerKeyCode", "fasterKeyCode", "rewindKeyCode", "advanceKeyCode", "fastKeyCode"]); chrome.storage.sync.set({ - displayKeyCode: displayKeyCode, - displayForce: displayForce, rememberSpeed: rememberSpeed, audioBoolean: audioBoolean, startHidden: startHidden, @@ -183,19 +178,29 @@ function save_options() { // Restores options from chrome.storage function restore_options() { chrome.storage.sync.get(tcDefaults, function(storage) { - updateShortcutInputText('displayKeyInput', storage.displayKeyCode); - document.getElementById('displayForce').value = storage.displayForce; document.getElementById('rememberSpeed').checked = storage.rememberSpeed; document.getElementById('audioBoolean').checked = storage.audioBoolean; document.getElementById('startHidden').checked = storage.startHidden; document.getElementById('controllerOpacity').value = storage.controllerOpacity; document.getElementById('blacklist').value = storage.blacklist; + // ensure that there is a "display" binding for upgrades from versions that had it as a separate binding + if(storage.keyBindings.filter(x => x.action == "display").length == 0){ + storage.keyBindings.push({ action: "display", value: 0, force: false, predefined: true }); + } + for (let i in storage.keyBindings) { var item = storage.keyBindings[i]; if (item.predefined) { //do predefined ones because their value needed for overlay // document.querySelector("#" + item["action"] + " .customDo").value = item["action"]; + if (item["action"] == "display" && typeof (item["key"]) === "undefined"){ + item["key"] = storage.displayKeyCode || tcDefaults.displayKeyCode; // V + } + + if (customActionsNoValues.includes(item["action"])) + document.querySelector("#" + item["action"] + " .customValue").disabled = true; + updateCustomShortcutInputText(document.querySelector("#" + item["action"] + " .customKey"), item["key"]); document.querySelector("#" + item["action"] + " .customValue").value = item["value"]; document.querySelector("#" + item["action"] + " .customForce").value = item["force"]; @@ -234,12 +239,6 @@ function show_experimental() { document.querySelectorAll(".customForce").forEach(item => item.style.display = 'inline-block'); } -function initShortcutInput(inputId) { - document.getElementById(inputId).addEventListener('focus', inputFocus); - document.getElementById(inputId).addEventListener('blur', inputBlur); - document.getElementById(inputId).addEventListener('keydown', recordKeyPress); -} - document.addEventListener('DOMContentLoaded', function () { restore_options(); @@ -248,8 +247,6 @@ document.addEventListener('DOMContentLoaded', function () { document.getElementById('restore').addEventListener('click', restore_defaults); document.getElementById('experimental').addEventListener('click', show_experimental); - initShortcutInput('displayKeyInput'); - function eventCaller(event, className, funcName) { if (!event.target.classList.contains(className)) { return From c3f44db1bfc8cb65253a034ee57a50bfb91f6341 Mon Sep 17 00:00:00 2001 From: Timothy Lim Date: Sat, 19 Oct 2019 03:28:52 +0800 Subject: [PATCH 41/52] Add ability to enable/disable from toolbar (#528) * Add ability to enable/disable from toolbar --- icons/icon19_disabled.png | Bin 0 -> 3311 bytes icons/icon38_disabled.png | Bin 0 -> 4307 bytes icons/icon48_disabled.png | Bin 0 -> 4871 bytes inject.js | 4 ++++ options.html | 42 +++++++++++++++++++---------------- options.js | 4 ++++ popup.css | 4 ++++ popup.html | 4 ++++ popup.js | 45 ++++++++++++++++++++++++++++++++++++++ 9 files changed, 84 insertions(+), 19 deletions(-) create mode 100644 icons/icon19_disabled.png create mode 100644 icons/icon38_disabled.png create mode 100644 icons/icon48_disabled.png diff --git a/icons/icon19_disabled.png b/icons/icon19_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..acafee2f9a959ec64a3991eec7b41861b004a6b1 GIT binary patch literal 3311 zcmdT{e@qj16hDkZ1vLtYW;3%EHK4oRwWTdR%PCM0j36R1bf{eKM>%cpYVUxe=y19@ zP@>K`Q8di?D{O)~r%stmCjOWcHPbkCZiUwJ86YZ6|F**c#uM&FgYm(%P=Q-;NU4%nJ0=43_%JD3sr?$74NhnYNOGJpc+J@ zfq?}q6mcTqf;l0=P2%M-(*o&a9U{wf3W=An@cCk_QYkrV|G486S*F7iCwS5V2_ljP zQL9kIAB=Xf-M}PGw=jxq&&rYSw8=S9BtqM0JI#p#z^VPZ18bX_+79g$ri*aM?(BBI zNI^_20I7SH(l1iTEOO9D1}*UUPLfV60Fgxa%NYdmVj_PaM;I1o^zGV3L@_;@~IoBo;=Ib=>?soUWJX7XVO791zPI7Sf#i1+K0G(MkS2g z!I;1^Vj`0*9hsQx-9?jtr z35>?Tn&?c87SpORR0E?13`Mj=F!%70QlfhhQwwR2ar^K^M9_W5ZvxkowW`M&H~X3xPpO5maP*<{== ze2OPQ+qZA*7-`g?F*=ljQxuEd_@#JO~uTd!WOE$W=GM5w91UVvfs<8GJT#{K`#n zVMlM&_sN=1tsQ3XUlG}FWVt@5fTOXI+mjFNtut3{e>mY?#g$171qZ7yWbZ7iIK`DE zmRllve@ic}6aua4krQ%}9P90d*d{z_$l*_zdqcBovPRhSm0vGBy2Li@eZ`A&DP`1kDjcYv!^Y5>4RSiT9yZI37j%9 zq;J%!n2@o?efLfhVCfQw;qTLT`;0Nsp|V>Up0;n z*l=dY*x##4#RTLST*;zdx*P#flZZavodu4QiNDj8{1(RGptu z`9;&l_*-eaE?UP7Y};5`65hb<&v-5TrGzYM^{I%8(pygBXy~Jmt$TlKX=(Xz{p20j zx1L>OTYqlVO-FXGr6t=hvbxpWp>d_=`1q}Bjy-w$W&aiR*KUn(Z7}P?FXad46jj6P zPA8jQeZ6LI{pI+ysZ)P$Y-}tDtEG?j^ z+iibbV@8EMo;dj6kwrre%p-!DkAA1vxn+1Ox$ny1(h z^zr$y+%t`{Ej#(Nv^4zLqdg0Xi~k%Hpw7JCTf1`Uy@b85z(?-S5;iwwzgdqo&Rx(p i;92yBBR|#E{S|N-iz<$94sVnGS)?SUnQP;7-})Ohf;t%h literal 0 HcmV?d00001 diff --git a/icons/icon38_disabled.png b/icons/icon38_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..7666e21cf86a9cf3a8251b45e5d7f61622d9daed GIT binary patch literal 4307 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 literal 0 HcmV?d00001 diff --git a/icons/icon48_disabled.png b/icons/icon48_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..d54e8494ba4c38849576bad5ab6db9e965ebcc3e GIT binary patch literal 4871 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 eIbJn*qeRQP!P7WJfZ1dI!#QY1>fM6j2 literal 0 HcmV?d00001 diff --git a/inject.js b/inject.js index 46a9c14..7ee0a08 100644 --- a/inject.js +++ b/inject.js @@ -3,6 +3,7 @@ var tc = { settings: { lastSpeed: 1.0, // default 1x + enabled: true, // default enabled speeds: {}, // empty object to hold speed for each source displayKeyCode: 86, // default: V @@ -77,6 +78,7 @@ rememberSpeed: tc.settings.rememberSpeed, audioBoolean: tc.settings.audioBoolean, startHidden: tc.settings.startHidden, + enabled: tc.settings.enabled, controllerOpacity: tc.settings.controllerOpacity, blacklist: tc.settings.blacklist.replace(regStrip, '') }); @@ -85,6 +87,7 @@ tc.settings.displayKeyCode = Number(storage.displayKeyCode); tc.settings.rememberSpeed = Boolean(storage.rememberSpeed); tc.settings.audioBoolean = Boolean(storage.audioBoolean); + tc.settings.enabled = Boolean(storage.enabled); tc.settings.startHidden = Boolean(storage.startHidden); tc.settings.controllerOpacity = Number(storage.controllerOpacity); tc.settings.blacklist = String(storage.blacklist); @@ -309,6 +312,7 @@ } } function initializeNow(document) { + if (!tc.settings.enabled) return; // enforce init-once due to redundant callers if (!document.body || document.body.classList.contains('vsc-initialized')) { return; diff --git a/options.html b/options.html index 102906f..2f07c0c 100644 --- a/options.html +++ b/options.html @@ -1,14 +1,14 @@ - - Video Speed Controller: Options - - - - -
-

Video Speed Controller

-
+ + Video Speed Controller: Options + + + + +
+

Video Speed Controller

+

Shortcuts

@@ -81,26 +81,30 @@
-

Other

-
+

Other

+
+ + +
+
- - + +
- - + +
- - + +
- - + +
diff --git a/options.js b/options.js index 32bd02f..cf64c40 100644 --- a/options.js +++ b/options.js @@ -6,6 +6,7 @@ var tcDefaults = { rememberSpeed: false, // default: false audioBoolean: false, // default: false startHidden: false, // default: false + enabled: true, // default enabled controllerOpacity: 0.3, // default: 0.3 keyBindings: [ {action: "slower", key: 83, value: 0.1, force: false, predefined: true}, // S @@ -168,6 +169,7 @@ function save_options() { var displayKeyCode = document.getElementById('displayKeyInput').keyCode; var rememberSpeed = document.getElementById('rememberSpeed').checked; var audioBoolean = document.getElementById('audioBoolean').checked; + var enabled = document.getElementById('enabled').checked; var startHidden = document.getElementById('startHidden').checked; var controllerOpacity = document.getElementById('controllerOpacity').value; var blacklist = document.getElementById('blacklist').value; @@ -179,6 +181,7 @@ function save_options() { displayKeyCode: displayKeyCode, rememberSpeed: rememberSpeed, audioBoolean: audioBoolean, + enabled: enabled, startHidden: startHidden, controllerOpacity: controllerOpacity, keyBindings: keyBindings, @@ -199,6 +202,7 @@ function restore_options() { updateShortcutInputText('displayKeyInput', storage.displayKeyCode); document.getElementById('rememberSpeed').checked = storage.rememberSpeed; document.getElementById('audioBoolean').checked = storage.audioBoolean; + document.getElementById('enabled').checked = storage.enabled; document.getElementById('startHidden').checked = storage.startHidden; document.getElementById('controllerOpacity').value = storage.controllerOpacity; document.getElementById('blacklist').value = storage.blacklist; diff --git a/popup.css b/popup.css index 74bfe99..f8b9a92 100644 --- a/popup.css +++ b/popup.css @@ -27,3 +27,7 @@ button { font-size: 0.95em; margin: 0.15em 0; } + +.hide { + display: none; +} diff --git a/popup.html b/popup.html index 9fd9ae0..51536d5 100644 --- a/popup.html +++ b/popup.html @@ -6,6 +6,10 @@ + + + +

diff --git a/popup.js b/popup.js index a60b107..1a0dfb4 100644 --- a/popup.js +++ b/popup.js @@ -10,4 +10,49 @@ document.addEventListener('DOMContentLoaded', function () { document.querySelector('#feedback').addEventListener('click', function() { window.open("https://github.com/igrigorik/videospeed/issues"); }); + + document.querySelector('#enable').addEventListener('click', function() { + toggleEnabled(true, settingsSavedReloadMessage); + }); + + document.querySelector('#disable').addEventListener('click', function() { + toggleEnabled(false, settingsSavedReloadMessage); + }); + + chrome.storage.sync.get({enabled: true}, function(storage) { + toggleEnabledUI(storage.enabled); + }); + + function toggleEnabled(enabled, callback){ + chrome.storage.sync.set({ + enabled: enabled, + }, function() { + toggleEnabledUI(enabled); + if(callback) callback(enabled); + }); + } + + function toggleEnabledUI(enabled){ + document.querySelector('#enable').classList.toggle("hide", enabled); + document.querySelector('#disable').classList.toggle("hide", !enabled); + + const suffix = `${(enabled ? "" : "_disabled")}.png` + chrome.browserAction.setIcon({ + "path": { + "19": "icons/icon19" + suffix, + "38": "icons/icon38" + suffix, + "48": "icons/icon48" + suffix + } + }); + } + + function settingsSavedReloadMessage(enabled){ + setStatusMessage(`${enabled ? "Enabled" : "Disabled"}. Reload page to see changes`); + } + + function setStatusMessage(str){ + const status_element = document.querySelector('#status') + status_element.classList.toggle("hide", false); + status_element.innerText = str; + } }); From ac53d3ea2ba5ca508cc46e1295e81be36416e5af Mon Sep 17 00:00:00 2001 From: Yang Date: Thu, 14 Nov 2019 01:55:25 -0500 Subject: [PATCH 42/52] Adding feature - Show the controller briefly when adjusting speed and the controller is set to hidden. (#538) Adding new feature: when the controller is hidden and the user changes rate, show the controller briefly. A new action called `blink` is added, and is called when the rate changes. Then if the controller is hidden, remove `vsc-hidden` and add it back after `value` millisecends. --- inject.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/inject.js b/inject.js index a09e49e..2971df7 100644 --- a/inject.js +++ b/inject.js @@ -172,6 +172,8 @@ chrome.storage.sync.set({'lastSpeed': speed}, function() { console.log('Speed setting saved: ' + speed); }); + // show the controller for 1000ms if it's hidden. + runAction('blink', document, null, null); } }.bind(this)); @@ -494,6 +496,16 @@ } else if (action === 'display') { controller.classList.add('vsc-manual'); controller.classList.toggle('vsc-hidden'); + } else if (action === 'blink') { + // if vsc is hidden, show it briefly to give the use visual feedback that the action is excuted. + if(controller.classList.contains('vsc-hidden') || controller.blinkTimeOut !== undefined){ + clearTimeout(controller.blinkTimeOut); + controller.classList.remove('vsc-hidden'); + controller.blinkTimeOut = setTimeout(()=>{ + controller.classList.add('vsc-hidden'); + controller.blinkTimeOut = undefined; + }, value ? value : 1000); + } } else if (action === 'drag') { handleDrag(v, controller, e); } else if (action === 'fast') { From 17bff8affb3d6ef1eb7cc00c22b35ce0a9198934 Mon Sep 17 00:00:00 2001 From: jacobcolbert Date: Tue, 19 Nov 2019 01:58:01 -0500 Subject: [PATCH 43/52] Check target of keyEvent instead of activeElement for text editability --- inject.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/inject.js b/inject.js index 2971df7..adf160b 100644 --- a/inject.js +++ b/inject.js @@ -364,9 +364,9 @@ } // Ignore keydown event if typing in an input box - if (document.activeElement.nodeName === 'INPUT' - || document.activeElement.nodeName === 'TEXTAREA' - || document.activeElement.isContentEditable) { + if (event.target.nodeName === 'INPUT' + || event.target.nodeName === 'TEXTAREA' + || event.target.isContentEditable) { return false; } From ac7471edfc7542e40451208698e8c38e21f46c89 Mon Sep 17 00:00:00 2001 From: Chad Bailey Date: Mon, 25 Nov 2019 15:43:05 -0600 Subject: [PATCH 44/52] Allow regex in blacklist fixes #167 #542 (#546) * Allow regex in blacklist fixes #167 #542 * Added protection against invalid regex causing failed initialization * Added regex input validation --- inject.js | 13 +++++++++++-- options.html | 7 ++++++- options.js | 23 +++++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/inject.js b/inject.js index adf160b..5ca7084 100644 --- a/inject.js +++ b/inject.js @@ -275,7 +275,7 @@ // the first element of the target, which may not be the parent. this.parent.insertBefore(fragment, this.parent.firstChild); } - return wrapper; + return wrapper; } } @@ -292,7 +292,16 @@ return; } - var regexp = new RegExp(escapeStringRegExp(match)); + if (match.startsWith('/')) { + try { + var regexp = new RegExp(match); + } catch(err) { + return; + } + } else { + var regexp = new RegExp(escapeStringRegExp(match)); + } + if (regexp.test(location.href)) { blacklisted = true; return; diff --git a/options.html b/options.html index 770dd34..765809b 100644 --- a/options.html +++ b/options.html @@ -109,7 +109,12 @@
- +
diff --git a/options.js b/options.js index 7d2c728..8bc0719 100644 --- a/options.js +++ b/options.js @@ -163,8 +163,31 @@ function createKeyBindings(item) { keyBindings.push({action: action, key: key, value: value, force: force, predefined: predefined}); } +// Validates settings before saving +function validate() { + var valid = true; + var status = document.getElementById('status'); + document.getElementById('blacklist').value.split("\n").forEach(match => { + match = match.replace(regStrip,'') + if (match.startsWith('/')) { + try { + var regexp = new RegExp(match); + } catch(err) { + status.textContent = 'Error: Invalid Regex: ' + match + + '. Unable to save'; + valid = false; + return; + } + } + }) + return valid; +} + // Saves options to chrome.storage function save_options() { + if (validate() === false) { + return; + } keyBindings = []; Array.from(document.querySelectorAll(".customs")).forEach(item => createKeyBindings(item)); // Remove added shortcuts From c7f72f5d5b029593e66ad49f866e7fb013453660 Mon Sep 17 00:00:00 2001 From: Aaron Evan-Browning Date: Sat, 21 Dec 2019 23:17:31 -0500 Subject: [PATCH 45/52] Add width styling to .customForce class. (#561) Width of customForce class is too narrow to display the full text of the experimental options ("Do not disable website keybindings.", "Disables websites keybindings"). 250px might be too wide still but it seems like a good start. --- options.css | 1 + 1 file changed, 1 insertion(+) diff --git a/options.css b/options.css index eb47e18..352ca29 100644 --- a/options.css +++ b/options.css @@ -100,6 +100,7 @@ select { .customForce { display: none; + width: 250px; } .customKey { From eb4d2b9968ee3180de8b1cd9f32370827f885be9 Mon Sep 17 00:00:00 2001 From: deef Date: Mon, 23 Dec 2019 12:06:41 -0600 Subject: [PATCH 46/52] Create Github Action to upload to chrome web store on version tagging (#555) * Create Github Action to upload to chrome web store on version tagging --- .github/workflows/chrome-store-upload.yaml | 29 ++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/chrome-store-upload.yaml diff --git a/.github/workflows/chrome-store-upload.yaml b/.github/workflows/chrome-store-upload.yaml new file mode 100644 index 0000000..8343266 --- /dev/null +++ b/.github/workflows/chrome-store-upload.yaml @@ -0,0 +1,29 @@ +name: Upload To Chrome Web Store +# This workflow is triggered on pushes to the repository. +on: + push: + tags: + - v** +jobs: + build: + name: Upload + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v1 + + - name: zip + uses: montudor/action-zip@v0.1.0 + with: + args: zip -r ./vscd.zip * + + - name: Upload to + uses: trmcnvn/chrome-addon@v1 + with: + # extension is only necessary when updating an existing addon, + # omitting it will create a new addon + extension: video-speed-controller + zip: vscd.zip + client-id: ${{ secrets.CHROME_CLIENT_ID }} + client-secret: ${{ secrets.CHROME_CLIENT_SECRET }} + refresh-token: ${{ secrets.CHROME_REFRESH_TOKEN }} From 9f23270bf2ea9f9cf5eebe5f7ad9cd94d6bb0078 Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Mon, 23 Dec 2019 14:53:47 -0500 Subject: [PATCH 47/52] bump to v0.5.8 --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index d012441..6329c98 100755 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "Video Speed Controller", "short_name": "videospeed", - "version": "0.5.6", + "version": "0.5.8", "manifest_version": 2, "description": "Speed up, slow down, advance and rewind any HTML5 video with quick shortcuts.", "homepage_url": "https://github.com/igrigorik/videospeed", From fc4d713be84308aeee35dc7be04762852a4a3a44 Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Mon, 23 Dec 2019 15:00:14 -0500 Subject: [PATCH 48/52] add include param on zip --- .github/workflows/chrome-store-upload.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/chrome-store-upload.yaml b/.github/workflows/chrome-store-upload.yaml index 8343266..42326e9 100644 --- a/.github/workflows/chrome-store-upload.yaml +++ b/.github/workflows/chrome-store-upload.yaml @@ -15,7 +15,7 @@ jobs: - name: zip uses: montudor/action-zip@v0.1.0 with: - args: zip -r ./vscd.zip * + args: zip -r ./vscd.zip -i * - name: Upload to uses: trmcnvn/chrome-addon@v1 From 98d938741d158143f3530ba7ae3dceb9cee91d4d Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Mon, 23 Dec 2019 15:03:50 -0500 Subject: [PATCH 49/52] fix zip params, again! --- .github/workflows/chrome-store-upload.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/chrome-store-upload.yaml b/.github/workflows/chrome-store-upload.yaml index 42326e9..3a7beec 100644 --- a/.github/workflows/chrome-store-upload.yaml +++ b/.github/workflows/chrome-store-upload.yaml @@ -15,7 +15,7 @@ jobs: - name: zip uses: montudor/action-zip@v0.1.0 with: - args: zip -r ./vscd.zip -i * + args: zip -r ./vscd.zip . -i * - name: Upload to uses: trmcnvn/chrome-addon@v1 From 9b48bfa7c02869681196bdfe9c74af2cdd0e5956 Mon Sep 17 00:00:00 2001 From: deef Date: Tue, 24 Dec 2019 09:36:57 -0600 Subject: [PATCH 50/52] Update chrome-store-upload.yaml to use proper name (#563) Also add exclude to exclude .git files. --- .github/workflows/chrome-store-upload.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/chrome-store-upload.yaml b/.github/workflows/chrome-store-upload.yaml index 3a7beec..eb1adcf 100644 --- a/.github/workflows/chrome-store-upload.yaml +++ b/.github/workflows/chrome-store-upload.yaml @@ -15,14 +15,14 @@ jobs: - name: zip uses: montudor/action-zip@v0.1.0 with: - args: zip -r ./vscd.zip . -i * + args: zip -r ./vscd.zip . -i * -x *.git* - name: Upload to uses: trmcnvn/chrome-addon@v1 with: # extension is only necessary when updating an existing addon, # omitting it will create a new addon - extension: video-speed-controller + extension: "nffaoalbilbmmfgbnbgppjihopabppdk" zip: vscd.zip client-id: ${{ secrets.CHROME_CLIENT_ID }} client-secret: ${{ secrets.CHROME_CLIENT_SECRET }} From 23591c6077414f3386b3053a251b1c6bf53b7ed0 Mon Sep 17 00:00:00 2001 From: Timothy Lim Date: Fri, 27 Dec 2019 00:32:49 +0800 Subject: [PATCH 51/52] Check for both .src and .currentSrc in mutation (#567) --- inject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inject.js b/inject.js index 5ca7084..b15455e 100644 --- a/inject.js +++ b/inject.js @@ -184,7 +184,7 @@ if(!controller){ return; } - if (!mutation.target.currentSrc) { + if (!mutation.target.src && !mutation.target.currentSrc) { controller.classList.add('vsc-nosource'); } else { controller.classList.remove('vsc-nosource'); From 0389c61db733e86698edc1e1cd5e4298a2777c1d Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Mon, 13 Jan 2020 21:45:05 -0800 Subject: [PATCH 52/52] bump to 0.5.9 --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 6329c98..0eaab53 100755 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "Video Speed Controller", "short_name": "videospeed", - "version": "0.5.8", + "version": "0.5.9", "manifest_version": 2, "description": "Speed up, slow down, advance and rewind any HTML5 video with quick shortcuts.", "homepage_url": "https://github.com/igrigorik/videospeed",