@statewalker/webrun-devtools
Version:
DevTools Extension for the StateWalker WebRun framework
577 lines (576 loc) • 16.5 kB
JavaScript
async function M(t, n) {
const s = new WebSocket(t);
await new Promise(
(b) => s.onopen = function() {
s.onopen = null, b();
}
);
const g = new MessageChannel(), l = g.port1, i = g.port2;
s.onmessage = ({ data: b }) => l.postMessage(JSON.parse(b)), l.onmessage = ({ data: b }) => s.send(JSON.stringify(b));
const u = l.close.bind(l), v = s.close.bind(s), h = i.close.bind(g.port2), S = () => {
h(), u(), v();
};
return l.close = S, g.port2.close = S, n && (n.aborted && S(), n.addEventListener("abort", () => S())), g.port2;
}
function f({
port: t,
versionUrl: n = `http://127.0.0.1:${t}/json/version`,
http: s = console.log,
retryPeriod: g = 500,
fetchJson: l = async (i) => await (await fetch(i, {
mode: "cors"
})).json()
}) {
let i, u, v = new Promise((h, S) => {
const b = h;
u = S, i = setInterval(async () => {
try {
const O = await l(n);
clearInterval(i), i = 0, b(O);
} catch {
}
}, g);
});
return v.finally(() => i && clearInterval(i)), Object.assign(v, { close: u });
}
const T = [
"Accessibility.disable",
"Accessibility.enable",
"Animation.disable",
"Animation.enable",
"Animation.releaseAnimations",
"Animation.seekAnimations",
"Animation.setPaused",
"Animation.setPlaybackRate",
"Animation.setTiming",
"Audits.checkContrast",
"Audits.disable",
"Audits.enable",
"Autofill.disable",
"Autofill.enable",
"Autofill.setAddresses",
"Autofill.trigger",
"BackgroundService.clearEvents",
"BackgroundService.setRecording",
"BackgroundService.startObserving",
"BackgroundService.stopObserving",
"Browser.addPrivacySandboxEnrollmentOverride",
"Browser.cancelDownload",
"Browser.close",
"Browser.crash",
"Browser.crashGpuProcess",
"Browser.executeBrowserCommand",
"Browser.grantPermissions",
"Browser.resetPermissions",
"Browser.setDockTile",
"Browser.setDownloadBehavior",
"Browser.setPermission",
"Browser.setWindowBounds",
"CSS.disable",
"CSS.enable",
"CSS.forcePseudoState",
"CSS.setEffectivePropertyValueForNode",
"CSS.setLocalFontsEnabled",
"CSS.startRuleUsageTracking",
"CSS.trackComputedStyleUpdates",
"CacheStorage.deleteCache",
"CacheStorage.deleteEntry",
"Cast.disable",
"Cast.enable",
"Cast.setSinkToUse",
"Cast.startDesktopMirroring",
"Cast.startTabMirroring",
"Cast.stopCasting",
"Console.clearMessages",
"Console.disable",
"Console.enable",
"DOM.disable",
"DOM.discardSearchResults",
"DOM.enable",
"DOM.focus",
"DOM.hideHighlight",
"DOM.highlightNode",
"DOM.highlightRect",
"DOM.markUndoableState",
"DOM.redo",
"DOM.removeAttribute",
"DOM.removeNode",
"DOM.requestChildNodes",
"DOM.scrollIntoViewIfNeeded",
"DOM.setAttributeValue",
"DOM.setAttributesAsText",
"DOM.setFileInputFiles",
"DOM.setInspectedNode",
"DOM.setNodeStackTracesEnabled",
"DOM.setNodeValue",
"DOM.setOuterHTML",
"DOM.undo",
"DOMDebugger.removeDOMBreakpoint",
"DOMDebugger.removeEventListenerBreakpoint",
"DOMDebugger.removeInstrumentationBreakpoint",
"DOMDebugger.removeXHRBreakpoint",
"DOMDebugger.setBreakOnCSPViolation",
"DOMDebugger.setDOMBreakpoint",
"DOMDebugger.setEventListenerBreakpoint",
"DOMDebugger.setInstrumentationBreakpoint",
"DOMDebugger.setXHRBreakpoint",
"DOMSnapshot.disable",
"DOMSnapshot.enable",
"DOMStorage.clear",
"DOMStorage.disable",
"DOMStorage.enable",
"DOMStorage.removeDOMStorageItem",
"DOMStorage.setDOMStorageItem",
"Database.disable",
"Database.enable",
"Debugger.continueToLocation",
"Debugger.disable",
"Debugger.pause",
"Debugger.pauseOnAsyncCall",
"Debugger.removeBreakpoint",
"Debugger.resume",
"Debugger.setAsyncCallStackDepth",
"Debugger.setBlackboxPatterns",
"Debugger.setBlackboxedRanges",
"Debugger.setBreakpointsActive",
"Debugger.setPauseOnExceptions",
"Debugger.setReturnValue",
"Debugger.setSkipAllPauses",
"Debugger.setVariableValue",
"Debugger.stepInto",
"Debugger.stepOut",
"Debugger.stepOver",
"DeviceAccess.cancelPrompt",
"DeviceAccess.disable",
"DeviceAccess.enable",
"DeviceAccess.selectPrompt",
"DeviceOrientation.clearDeviceOrientationOverride",
"DeviceOrientation.setDeviceOrientationOverride",
"Emulation.clearDeviceMetricsOverride",
"Emulation.clearGeolocationOverride",
"Emulation.clearIdleOverride",
"Emulation.resetPageScaleFactor",
"Emulation.setAutoDarkModeOverride",
"Emulation.setAutomationOverride",
"Emulation.setCPUThrottlingRate",
"Emulation.setDefaultBackgroundColorOverride",
"Emulation.setDeviceMetricsOverride",
"Emulation.setDisabledImageTypes",
"Emulation.setDocumentCookieDisabled",
"Emulation.setEmitTouchEventsForMouse",
"Emulation.setEmulatedMedia",
"Emulation.setEmulatedVisionDeficiency",
"Emulation.setFocusEmulationEnabled",
"Emulation.setGeolocationOverride",
"Emulation.setHardwareConcurrencyOverride",
"Emulation.setIdleOverride",
"Emulation.setLocaleOverride",
"Emulation.setNavigatorOverrides",
"Emulation.setPageScaleFactor",
"Emulation.setScriptExecutionDisabled",
"Emulation.setScrollbarsHidden",
"Emulation.setTimezoneOverride",
"Emulation.setTouchEmulationEnabled",
"Emulation.setUserAgentOverride",
"Emulation.setVisibleSize",
"EventBreakpoints.removeInstrumentationBreakpoint",
"EventBreakpoints.setInstrumentationBreakpoint",
"FedCm.confirmIdpLogin",
"FedCm.disable",
"FedCm.dismissDialog",
"FedCm.enable",
"FedCm.resetCooldown",
"FedCm.selectAccount",
"Fetch.continueRequest",
"Fetch.continueResponse",
"Fetch.continueWithAuth",
"Fetch.disable",
"Fetch.enable",
"Fetch.failRequest",
"Fetch.fulfillRequest",
"HeadlessExperimental.disable",
"HeadlessExperimental.enable",
"HeapProfiler.addInspectedHeapObject",
"HeapProfiler.collectGarbage",
"HeapProfiler.disable",
"HeapProfiler.enable",
"HeapProfiler.startSampling",
"HeapProfiler.startTrackingHeapObjects",
"HeapProfiler.stopTrackingHeapObjects",
"HeapProfiler.takeHeapSnapshot",
"IO.close",
"IndexedDB.clearObjectStore",
"IndexedDB.deleteDatabase",
"IndexedDB.deleteObjectStoreEntries",
"IndexedDB.disable",
"IndexedDB.enable",
"Input.cancelDragging",
"Input.dispatchDragEvent",
"Input.dispatchKeyEvent",
"Input.dispatchMouseEvent",
"Input.dispatchTouchEvent",
"Input.emulateTouchFromMouseEvent",
"Input.imeSetComposition",
"Input.insertText",
"Input.setIgnoreInputEvents",
"Input.setInterceptDrags",
"Input.synthesizePinchGesture",
"Input.synthesizeScrollGesture",
"Input.synthesizeTapGesture",
"Inspector.disable",
"Inspector.enable",
"LayerTree.disable",
"LayerTree.enable",
"LayerTree.releaseSnapshot",
"Log.clear",
"Log.disable",
"Log.enable",
"Log.startViolationsReport",
"Log.stopViolationsReport",
"Media.disable",
"Media.enable",
"Memory.forciblyPurgeJavaScriptMemory",
"Memory.prepareForLeakDetection",
"Memory.setPressureNotificationsSuppressed",
"Memory.simulatePressureNotification",
"Memory.startSampling",
"Memory.stopSampling",
"Network.clearAcceptedEncodingsOverride",
"Network.clearBrowserCache",
"Network.clearBrowserCookies",
"Network.continueInterceptedRequest",
"Network.deleteCookies",
"Network.disable",
"Network.emulateNetworkConditions",
"Network.enable",
"Network.enableReportingApi",
"Network.replayXHR",
"Network.setAcceptedEncodings",
"Network.setAttachDebugStack",
"Network.setBlockedURLs",
"Network.setBypassServiceWorker",
"Network.setCacheDisabled",
"Network.setCookies",
"Network.setExtraHTTPHeaders",
"Network.setRequestInterception",
"Network.setUserAgentOverride",
"Overlay.disable",
"Overlay.enable",
"Overlay.hideHighlight",
"Overlay.highlightFrame",
"Overlay.highlightNode",
"Overlay.highlightQuad",
"Overlay.highlightRect",
"Overlay.highlightSourceOrder",
"Overlay.setInspectMode",
"Overlay.setPausedInDebuggerMessage",
"Overlay.setShowAdHighlights",
"Overlay.setShowContainerQueryOverlays",
"Overlay.setShowDebugBorders",
"Overlay.setShowFPSCounter",
"Overlay.setShowFlexOverlays",
"Overlay.setShowGridOverlays",
"Overlay.setShowHinge",
"Overlay.setShowHitTestBorders",
"Overlay.setShowIsolatedElements",
"Overlay.setShowLayoutShiftRegions",
"Overlay.setShowPaintRects",
"Overlay.setShowScrollBottleneckRects",
"Overlay.setShowScrollSnapOverlays",
"Overlay.setShowViewportSizeOnResize",
"Overlay.setShowWebVitals",
"Page.addCompilationCache",
"Page.bringToFront",
"Page.clearCompilationCache",
"Page.clearDeviceMetricsOverride",
"Page.clearDeviceOrientationOverride",
"Page.clearGeolocationOverride",
"Page.close",
"Page.crash",
"Page.deleteCookie",
"Page.disable",
"Page.enable",
"Page.generateTestReport",
"Page.handleJavaScriptDialog",
"Page.navigateToHistoryEntry",
"Page.produceCompilationCache",
"Page.reload",
"Page.removeScriptToEvaluateOnLoad",
"Page.removeScriptToEvaluateOnNewDocument",
"Page.resetNavigationHistory",
"Page.screencastFrameAck",
"Page.setAdBlockingEnabled",
"Page.setBypassCSP",
"Page.setDeviceMetricsOverride",
"Page.setDeviceOrientationOverride",
"Page.setDocumentContent",
"Page.setDownloadBehavior",
"Page.setFontFamilies",
"Page.setFontSizes",
"Page.setGeolocationOverride",
"Page.setInterceptFileChooserDialog",
"Page.setLifecycleEventsEnabled",
"Page.setPrerenderingAllowed",
"Page.setRPHRegistrationMode",
"Page.setSPCTransactionMode",
"Page.setTouchEmulationEnabled",
"Page.setWebLifecycleState",
"Page.startScreencast",
"Page.stopLoading",
"Page.stopScreencast",
"Page.waitForDebugger",
"Performance.disable",
"Performance.enable",
"Performance.setTimeDomain",
"PerformanceTimeline.enable",
"Preload.disable",
"Preload.enable",
"Profiler.disable",
"Profiler.enable",
"Profiler.setSamplingInterval",
"Profiler.start",
"Profiler.stopPreciseCoverage",
"Runtime.addBinding",
"Runtime.disable",
"Runtime.discardConsoleEntries",
"Runtime.enable",
"Runtime.releaseObject",
"Runtime.releaseObjectGroup",
"Runtime.removeBinding",
"Runtime.runIfWaitingForDebugger",
"Runtime.setAsyncCallStackDepth",
"Runtime.setCustomObjectFormatterEnabled",
"Runtime.setMaxCallStackSizeToCapture",
"Runtime.terminateExecution",
"Security.disable",
"Security.enable",
"Security.handleCertificateError",
"Security.setIgnoreCertificateErrors",
"Security.setOverrideCertificateErrors",
"ServiceWorker.deliverPushMessage",
"ServiceWorker.disable",
"ServiceWorker.dispatchPeriodicSyncEvent",
"ServiceWorker.dispatchSyncEvent",
"ServiceWorker.enable",
"ServiceWorker.inspectWorker",
"ServiceWorker.setForceUpdateOnPageLoad",
"ServiceWorker.skipWaiting",
"ServiceWorker.startWorker",
"ServiceWorker.stopAllWorkers",
"ServiceWorker.stopWorker",
"ServiceWorker.unregister",
"ServiceWorker.updateRegistration",
"Storage.clearCookies",
"Storage.clearDataForOrigin",
"Storage.clearDataForStorageKey",
"Storage.clearSharedStorageEntries",
"Storage.deleteSharedStorageEntry",
"Storage.deleteStorageBucket",
"Storage.overrideQuotaForOrigin",
"Storage.resetSharedStorageBudget",
"Storage.setAttributionReportingLocalTestingMode",
"Storage.setAttributionReportingTracking",
"Storage.setCookies",
"Storage.setInterestGroupTracking",
"Storage.setSharedStorageEntry",
"Storage.setSharedStorageTracking",
"Storage.setStorageBucketTracking",
"Storage.trackCacheStorageForOrigin",
"Storage.trackCacheStorageForStorageKey",
"Storage.trackIndexedDBForOrigin",
"Storage.trackIndexedDBForStorageKey",
"Storage.untrackCacheStorageForOrigin",
"Storage.untrackCacheStorageForStorageKey",
"Storage.untrackIndexedDBForOrigin",
"Storage.untrackIndexedDBForStorageKey",
"Target.activateTarget",
"Target.autoAttachRelated",
"Target.detachFromTarget",
"Target.disposeBrowserContext",
"Target.exposeDevToolsProtocol",
"Target.sendMessageToTarget",
"Target.setAutoAttach",
"Target.setDiscoverTargets",
"Target.setRemoteLocations",
"Tethering.bind",
"Tethering.unbind",
"Tracing.end",
"Tracing.recordClockSyncMarker",
"Tracing.start",
"WebAudio.disable",
"WebAudio.enable",
"WebAuthn.addCredential",
"WebAuthn.clearCredentials",
"WebAuthn.disable",
"WebAuthn.enable",
"WebAuthn.removeCredential",
"WebAuthn.removeVirtualAuthenticator",
"WebAuthn.setAutomaticPresenceSimulation",
"WebAuthn.setResponseOverrideBits",
"WebAuthn.setUserVerified"
], I = T.reduce((t, n) => (t[n] = !0, t), {});
function A(t) {
return !I[t];
}
const B = [
"Accessibility",
"Audits",
"CSS",
"CacheStorage",
"Console",
"DOM",
"DOMDebugger",
"DOMSnapshot",
"Database",
"Debugger",
"Emulation",
"Fetch",
"IO",
"Input",
"Inspector",
"Log",
"Network",
"Overlay",
"Page",
"Performance",
"Profiler",
"Runtime",
"Storage",
"Target",
"Tracing",
"WebAudio",
"WebAuthn"
];
B.reduce((t, n) => (t[n] = !0, t), {});
function F(t) {
return A;
}
async function R(t, { inBrowser: n = !1, hasResponse: s = F() } = {}) {
let g = 1;
async function l(o, e = {}, ...r) {
const c = g++, a = new Promise((d, p) => {
try {
const m = s(o);
m && t.addEventListener("message", function D({ data: k }) {
if (c !== k.id)
return;
t.removeEventListener("message", D);
const { result: P, error: y } = k;
y ? p(y) : d(P);
}), t.postMessage(
Object.assign(
{
id: c,
method: o,
params: e
},
...r
)
), m || d();
} catch (m) {
p(m);
}
});
return console.log("[>>>]", { callId: c, method: o, params: e }), a.then(
(d) => console.log("[<<<]", { callId: c, method: o, params: e, result: d })
).catch(
(d) => console.log("[<<<]", { callId: c, method: o, params: e, error: d })
), a;
}
const i = {}, u = {};
let v = [], h = [];
async function S(o, e, r = {}) {
const { targetId: c } = o, a = i[c];
return await l(e, r, { sessionId: a });
}
async function b() {
return (await l("Target.getTargets")).targetInfos;
}
async function O(o) {
const { targetId: e } = o, { sessionId: r } = await l("Target.attachToTarget", {
targetId: e,
flatten: !0
});
i[e] = r, u[r] = e;
}
async function C(o) {
const { targetId: e } = o, r = i[e];
delete i[e], delete u[r], await l("Target.detachFromTarget", {
// targetId, // depricated
sessionId: r
});
}
function E(o, e) {
let r;
return {
addListener: (c) => {
e.push(c), r || (r = ({ data: a }) => {
if (!a.method || a.method === "Target.detachedFromTarget")
return;
const { method: d, params: p, sessionId: m } = a, k = { targetId: u[m], sessionId: m };
for (let P of e)
P(k, d, p);
}, o.addEventListener("message", r));
},
removeListener: (c) => {
for (let a = e.length - 1; a >= 0; a--)
e[a] === c && e.splice(a, 1);
!e.length && r && (o.removeEventListener("message", r), r = null);
}
};
}
function w(o, e) {
let r;
return {
addListener: (c) => {
e.push(c), r || (r = ({ data: a }) => {
const { method: d, params: p } = a;
if (d !== "Target.detachedFromTarget")
return;
const m = "canceled_by_user";
for (let D of e)
D(p, m);
}, o.addEventListener("message", r));
},
removeListener: (c) => {
for (let a = e.length - 1; a >= 0; a--)
e[a] === c && e.splice(a, 1);
!e.length && r && (o.removeEventListener("message", r), r = null);
}
};
}
return {
sendCommand: S,
attach: O,
detach: C,
getTargets: b,
onEvent: E(t, v),
onDetach: w(t, h)
};
}
async function* L(t) {
let n;
try {
for (; ; ) {
const s = f(t);
n = s.close, yield await s;
}
} finally {
n && n();
}
}
async function W({ wsUrl: t, ...n }) {
t || (t = (await f(n)).webSocketDebuggerUrl);
const s = new AbortController(), g = await M(t, s.signal);
return {
debugger: await R(g),
close: () => s.abort()
};
}
export {
M as connectToWs,
W as default,
L as listenConnectionInfo,
f as loadConnectionInfo,
R as newDebuggerApi
};