From 722f5b96241ef1d92998b87f941690e47e475379 Mon Sep 17 00:00:00 2001 From: pixeltris <6952411+pixeltris@users.noreply.github.com> Date: Sun, 3 Nov 2024 17:55:59 +0000 Subject: [PATCH] Fix Worker conflict detection #294 --- vaft/vaft-ublock-origin.js | 19 ++++++++++++++--- vaft/vaft.user.js | 21 +++++++++++++++---- .../video-swap-new-ublock-origin.js | 19 ++++++++++++++--- video-swap-new/video-swap-new.user.js | 21 +++++++++++++++---- 4 files changed, 66 insertions(+), 14 deletions(-) diff --git a/vaft/vaft-ublock-origin.js b/vaft/vaft-ublock-origin.js index 76a4b77..216f912 100644 --- a/vaft/vaft-ublock-origin.js +++ b/vaft/vaft-ublock-origin.js @@ -26,6 +26,19 @@ twitch-videoad.js text/javascript var OriginalVideoPlayerQuality = null; var IsPlayerAutoQuality = null; const oldWorker = window.Worker; + function isWorkerDoubleHooked(ourWorker, identifier) { + var ourWorkerString = ourWorker ? ourWorker.toString() : null; + var proto = window.Worker; + while (proto) + { + var workerString = proto.toString(); + if (workerString.includes(identifier) && workerString !== ourWorkerString) { + return true; + } + proto = Object.getPrototypeOf(proto); + } + return false; + } function hookWindowWorker() { var newWorker = window.Worker = class Worker extends oldWorker { constructor(twitchBlobUrl, options) { @@ -33,7 +46,7 @@ twitch-videoad.js text/javascript try { isTwitchWorker = new URL(twitchBlobUrl).origin.endsWith('.twitch.tv'); } catch {} - if (newWorker.toString() !== window.Worker.toString()) { + if (isWorkerDoubleHooked(newWorker, 'twitch')) { console.log('Multiple twitch adblockers installed. Skipping Worker hook (vaft)'); isTwitchWorker = false; } @@ -862,8 +875,8 @@ twitch-videoad.js text/javascript } }catch{} } - if (window.Worker.toString().includes('twitch')) { - console.log('Twitch Worker is already hooked'); + if (isWorkerDoubleHooked(null, 'twitch')) { + console.log('Twitch Worker is already hooked. Skipping (vaft)'); } else { window.reloadTwitchPlayer = reloadTwitchPlayer; declareOptions(window); diff --git a/vaft/vaft.user.js b/vaft/vaft.user.js index 2a9a774..cde6145 100644 --- a/vaft/vaft.user.js +++ b/vaft/vaft.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name TwitchAdSolutions (vaft) // @namespace https://github.com/pixeltris/TwitchAdSolutions -// @version 13.0.0 +// @version 14.0.0 // @description Multiple solutions for blocking Twitch ads (vaft) // @updateURL https://github.com/pixeltris/TwitchAdSolutions/raw/master/vaft/vaft.user.js // @downloadURL https://github.com/pixeltris/TwitchAdSolutions/raw/master/vaft/vaft.user.js @@ -38,6 +38,19 @@ var OriginalVideoPlayerQuality = null; var IsPlayerAutoQuality = null; const oldWorker = window.Worker; + function isWorkerDoubleHooked(ourWorker, identifier) { + var ourWorkerString = ourWorker ? ourWorker.toString() : null; + var proto = window.Worker; + while (proto) + { + var workerString = proto.toString(); + if (workerString.includes(identifier) && workerString !== ourWorkerString) { + return true; + } + proto = Object.getPrototypeOf(proto); + } + return false; + } function hookWindowWorker() { var newWorker = window.Worker = class Worker extends oldWorker { constructor(twitchBlobUrl, options) { @@ -45,7 +58,7 @@ try { isTwitchWorker = new URL(twitchBlobUrl).origin.endsWith('.twitch.tv'); } catch {} - if (newWorker.toString() !== window.Worker.toString()) { + if (isWorkerDoubleHooked(newWorker, 'twitch')) { console.log('Multiple twitch adblockers installed. Skipping Worker hook (vaft)'); isTwitchWorker = false; } @@ -874,8 +887,8 @@ } }catch{} } - if (window.Worker.toString().includes('twitch')) { - console.log('Twitch Worker is already hooked'); + if (isWorkerDoubleHooked(null, 'twitch')) { + console.log('Twitch Worker is already hooked. Skipping (vaft)'); } else { window.reloadTwitchPlayer = reloadTwitchPlayer; declareOptions(window); diff --git a/video-swap-new/video-swap-new-ublock-origin.js b/video-swap-new/video-swap-new-ublock-origin.js index ed9621f..d53a203 100644 --- a/video-swap-new/video-swap-new-ublock-origin.js +++ b/video-swap-new/video-swap-new-ublock-origin.js @@ -25,6 +25,19 @@ twitch-videoad.js text/javascript } var twitchWorkers = []; const oldWorker = window.Worker; + function isWorkerDoubleHooked(ourWorker, identifier) { + var ourWorkerString = ourWorker ? ourWorker.toString() : null; + var proto = window.Worker; + while (proto) + { + var workerString = proto.toString(); + if (workerString.includes(identifier) && workerString !== ourWorkerString) { + return true; + } + proto = Object.getPrototypeOf(proto); + } + return false; + } function hookWindowWorker() { var newWorker = window.Worker = class Worker extends oldWorker { constructor(twitchBlobUrl, options) { @@ -32,7 +45,7 @@ twitch-videoad.js text/javascript try { isTwitchWorker = new URL(twitchBlobUrl).origin.endsWith('.twitch.tv'); } catch {} - if (newWorker.toString() !== window.Worker.toString()) { + if (isWorkerDoubleHooked(newWorker, 'twitch')) { console.log('Multiple twitch adblockers installed. Skipping Worker hook (video-swap-new)'); isTwitchWorker = false; } @@ -653,8 +666,8 @@ twitch-videoad.js text/javascript return realGetItem.apply(this, arguments); }; } - if (window.Worker.toString().includes('twitch')) { - console.log('Twitch Worker is already hooked'); + if (isWorkerDoubleHooked(null, 'twitch')) { + console.log('Twitch Worker is already hooked. Skipping (video-swap-new)'); } else { window.reloadTwitchPlayer = reloadTwitchPlayer; declareOptions(window); diff --git a/video-swap-new/video-swap-new.user.js b/video-swap-new/video-swap-new.user.js index f450d73..9836390 100644 --- a/video-swap-new/video-swap-new.user.js +++ b/video-swap-new/video-swap-new.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name TwitchAdSolutions (video-swap-new) // @namespace https://github.com/pixeltris/TwitchAdSolutions -// @version 1.31 +// @version 1.32 // @updateURL https://github.com/pixeltris/TwitchAdSolutions/raw/master/video-swap-new/video-swap-new.user.js // @downloadURL https://github.com/pixeltris/TwitchAdSolutions/raw/master/video-swap-new/video-swap-new.user.js // @description Multiple solutions for blocking Twitch ads (video-swap-new) @@ -37,6 +37,19 @@ } var twitchWorkers = []; const oldWorker = window.Worker; + function isWorkerDoubleHooked(ourWorker, identifier) { + var ourWorkerString = ourWorker ? ourWorker.toString() : null; + var proto = window.Worker; + while (proto) + { + var workerString = proto.toString(); + if (workerString.includes(identifier) && workerString !== ourWorkerString) { + return true; + } + proto = Object.getPrototypeOf(proto); + } + return false; + } function hookWindowWorker() { var newWorker = window.Worker = class Worker extends oldWorker { constructor(twitchBlobUrl, options) { @@ -44,7 +57,7 @@ try { isTwitchWorker = new URL(twitchBlobUrl).origin.endsWith('.twitch.tv'); } catch {} - if (newWorker.toString() !== window.Worker.toString()) { + if (isWorkerDoubleHooked(newWorker, 'twitch')) { console.log('Multiple twitch adblockers installed. Skipping Worker hook (video-swap-new)'); isTwitchWorker = false; } @@ -665,8 +678,8 @@ return realGetItem.apply(this, arguments); }; } - if (window.Worker.toString().includes('twitch')) { - console.log('Twitch Worker is already hooked'); + if (isWorkerDoubleHooked(null, 'twitch')) { + console.log('Twitch Worker is already hooked. Skipping (video-swap-new)'); } else { window.reloadTwitchPlayer = reloadTwitchPlayer; declareOptions(window);