AI Newsletter Digest improvements: fixed QP soft line break decoding, URL extraction, and content cleaning
This commit is contained in:
68
skills/ghost-browser/extensions/cdp-input-fix/content.js
Normal file
68
skills/ghost-browser/extensions/cdp-input-fix/content.js
Normal file
@@ -0,0 +1,68 @@
|
||||
// Patch MouseEvent and PointerEvent constructors so that CDP-dispatched
|
||||
// clicks carry realistic screenX / screenY values.
|
||||
//
|
||||
// Chromium bug (crbug.com/40280325): Input.dispatchMouseEvent sets
|
||||
// screenX/screenY equal to clientX/clientY, which makes screenY < 100
|
||||
// in most cases. Cloudflare Turnstile checks for this inside its iframe.
|
||||
//
|
||||
// Fix: override the constructors to compute screen coordinates from the
|
||||
// window's position on the physical display.
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
function patchedInit(OriginalClass) {
|
||||
const Original = OriginalClass;
|
||||
function Patched(type, init) {
|
||||
if (init && typeof init === 'object') {
|
||||
const clientX = init.clientX || 0;
|
||||
const clientY = init.clientY || 0;
|
||||
|
||||
// Chrome exposes window.screenX/screenY for the browser window's
|
||||
// position on the monitor. outerWidth - innerWidth gives the chrome
|
||||
// (dev-tools, scrollbar, etc.) offset on the X axis; similarly for Y
|
||||
// with outerHeight - innerHeight (which includes the tab bar / URL bar).
|
||||
let offsetX = window.screenX + (window.outerWidth - window.innerWidth);
|
||||
let offsetY = window.screenY + (window.outerHeight - window.innerHeight);
|
||||
|
||||
// Fallback for headless or environments where screenX/screenY are 0
|
||||
if (window.screenX === 0 && window.screenY === 0) {
|
||||
offsetX = 100;
|
||||
offsetY = 200;
|
||||
}
|
||||
|
||||
// Only patch if screenX/screenY were not explicitly set to a
|
||||
// realistic value by the caller.
|
||||
if (!('screenX' in init) || init.screenX === init.clientX) {
|
||||
init.screenX = offsetX + clientX;
|
||||
}
|
||||
if (!('screenY' in init) || init.screenY === init.clientY) {
|
||||
init.screenY = offsetY + clientY;
|
||||
}
|
||||
}
|
||||
return new Original(type, init);
|
||||
}
|
||||
|
||||
Patched.prototype = Original.prototype;
|
||||
Object.defineProperty(Patched, 'name', { value: Original.name });
|
||||
|
||||
// Preserve static properties / constants
|
||||
for (const key of Object.getOwnPropertyNames(Original)) {
|
||||
if (['prototype', 'length', 'name'].includes(key)) continue;
|
||||
try {
|
||||
const desc = Object.getOwnPropertyDescriptor(Original, key);
|
||||
if (desc) Object.defineProperty(Patched, desc.configurable ? key : key, desc);
|
||||
} catch (_) { /* skip non-configurable */ }
|
||||
}
|
||||
|
||||
return Patched;
|
||||
}
|
||||
|
||||
try {
|
||||
window.MouseEvent = patchedInit(window.MouseEvent);
|
||||
} catch (_) {}
|
||||
|
||||
try {
|
||||
window.PointerEvent = patchedInit(window.PointerEvent);
|
||||
} catch (_) {}
|
||||
})();
|
||||
Reference in New Issue
Block a user