sourcemonkey 0.0.0-stage → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +87 -2
- package/dist/bytes.js +37 -0
- package/dist/channel-placeholder.js +5 -0
- package/dist/collection-scan.js +17 -0
- package/dist/collections.html +353 -0
- package/dist/compare.html +358 -0
- package/dist/composed-source.js +205 -0
- package/dist/connect-prompt.html +47 -0
- package/dist/debug/icons.html +211 -0
- package/dist/debug/storage.html +163 -0
- package/dist/debug-log.js +75 -0
- package/dist/diagnostic-location.js +64 -0
- package/dist/eval-hook.js +308 -0
- package/dist/extension/background.js +5263 -0
- package/dist/extension/channel.js +133 -0
- package/dist/extension/code-links.js +187 -0
- package/dist/extension/code-tabs.js +460 -0
- package/dist/extension/collection-dialog.js +619 -0
- package/dist/extension/collection-display.js +322 -0
- package/dist/extension/collections.js +2905 -0
- package/dist/extension/compare.js +867 -0
- package/dist/extension/concurrency.js +186 -0
- package/dist/extension/connect-grants.js +109 -0
- package/dist/extension/connect-prompt-page.js +70 -0
- package/dist/extension/connect-prompt.js +266 -0
- package/dist/extension/copy-button.js +63 -0
- package/dist/extension/copy-dialog.js +502 -0
- package/dist/extension/copy-preference.js +66 -0
- package/dist/extension/debug/icons.js +203 -0
- package/dist/extension/debug/storage.js +365 -0
- package/dist/extension/deep-link.js +77 -0
- package/dist/extension/delete-dialog.js +432 -0
- package/dist/extension/delete-icon.js +40 -0
- package/dist/extension/details-tooltips.js +66 -0
- package/dist/extension/directories.js +679 -0
- package/dist/extension/export-backup.js +407 -0
- package/dist/extension/export-dialog.js +142 -0
- package/dist/extension/file-access.js +74 -0
- package/dist/extension/file-changes.js +346 -0
- package/dist/extension/frame-info.js +85 -0
- package/dist/extension/github-provider.js +336 -0
- package/dist/extension/glyph.js +84 -0
- package/dist/extension/gm-bindings.js +601 -0
- package/dist/extension/gm-download.js +419 -0
- package/dist/extension/gm-menu.js +228 -0
- package/dist/extension/gm-notification.js +141 -0
- package/dist/extension/gm-originator-map.js +23 -0
- package/dist/extension/gm-tab-data.js +121 -0
- package/dist/extension/gm-tab.js +160 -0
- package/dist/extension/gm-url-change.js +111 -0
- package/dist/extension/gm-url-scheme.js +27 -0
- package/dist/extension/gm-values.js +176 -0
- package/dist/extension/gm-window-control.js +104 -0
- package/dist/extension/gm-xhr-headers.js +333 -0
- package/dist/extension/gm-xhr.js +584 -0
- package/dist/extension/injector.js +3145 -0
- package/dist/extension/install-capture.js +277 -0
- package/dist/extension/line-diff.js +233 -0
- package/dist/extension/local-copy.js +560 -0
- package/dist/extension/local-delete.js +276 -0
- package/dist/extension/location-kinds.js +108 -0
- package/dist/extension/log-format.js +158 -0
- package/dist/extension/managed-changes.js +361 -0
- package/dist/extension/managed-items.js +57 -0
- package/dist/extension/match-index.js +375 -0
- package/dist/extension/missing-scripts.js +66 -0
- package/dist/extension/more-menu.js +109 -0
- package/dist/extension/move-dialog.js +197 -0
- package/dist/extension/offscreen.js +37 -0
- package/dist/extension/options.js +504 -0
- package/dist/extension/page-heading.js +170 -0
- package/dist/extension/page-links.js +199 -0
- package/dist/extension/parse-check-client.js +70 -0
- package/dist/extension/parse-check.js +161 -0
- package/dist/extension/parse-sandbox-host.js +172 -0
- package/dist/extension/parse-sandbox.js +175 -0
- package/dist/extension/popup-commands-open.js +41 -0
- package/dist/extension/popup-view.js +387 -0
- package/dist/extension/popup.js +703 -0
- package/dist/extension/prism-userscript.js +53 -0
- package/dist/extension/refresh-error.js +136 -0
- package/dist/extension/refresh-targets.js +160 -0
- package/dist/extension/related-versions.js +1144 -0
- package/dist/extension/resize-observer-loop.js +19 -0
- package/dist/extension/row-cache.js +387 -0
- package/dist/extension/script-blobs.js +413 -0
- package/dist/extension/script-details.js +658 -0
- package/dist/extension/script-enablement.js +285 -0
- package/dist/extension/script-identity.js +310 -0
- package/dist/extension/script-keys.js +54 -0
- package/dist/extension/script-log-id.js +155 -0
- package/dist/extension/script-log.js +290 -0
- package/dist/extension/script-rejection.js +104 -0
- package/dist/extension/script-sites.js +158 -0
- package/dist/extension/script-store.js +3507 -0
- package/dist/extension/script-updater.js +991 -0
- package/dist/extension/script-url-hash.js +61 -0
- package/dist/extension/select-all.js +37 -0
- package/dist/extension/select-open-guard.js +90 -0
- package/dist/extension/site-icon.js +1261 -0
- package/dist/extension/sm-dev-link.js +302 -0
- package/dist/extension/solo-click.js +58 -0
- package/dist/extension/sticky-numbers.js +188 -0
- package/dist/extension/storage-breakdown.js +253 -0
- package/dist/extension/storage-scan.js +86 -0
- package/dist/extension/storage-usage.js +194 -0
- package/dist/extension/structural-keys.js +29 -0
- package/dist/extension/sw-teardown.js +36 -0
- package/dist/extension/tab-status.js +403 -0
- package/dist/extension/toolbar-summary.js +105 -0
- package/dist/extension/user-scripts-access.js +43 -0
- package/dist/extension/userscript.js +3672 -0
- package/dist/extension/value-store.js +204 -0
- package/dist/extension/version-probe-fetch.js +68 -0
- package/dist/extension/worker-client.js +109 -0
- package/dist/extension/worker-ops.js +171 -0
- package/dist/extension/zip-writer.js +24 -0
- package/dist/external-files.js +878 -0
- package/dist/file-loader.js +436 -0
- package/dist/file-locations.js +439 -0
- package/dist/generated-wrappers.js +5 -0
- package/dist/github-auth.js +148 -0
- package/dist/github-urls.js +46 -0
- package/dist/gm-api-catalog.js +217 -0
- package/dist/gm-connect.js +273 -0
- package/dist/gm-xhr-types.js +5 -0
- package/dist/http-read.js +142 -0
- package/dist/icons/icon-128.png +0 -0
- package/dist/icons/icon-16.png +0 -0
- package/dist/icons/icon-48.png +0 -0
- package/dist/local-file-overrides.js +558 -0
- package/dist/manifest.json +38 -0
- package/dist/markup-response.js +126 -0
- package/dist/match-targets.js +305 -0
- package/dist/menu-captions.js +22 -0
- package/dist/offscreen.html +39 -0
- package/dist/options.html +197 -0
- package/dist/parse-check-protocol.js +51 -0
- package/dist/parse-location.js +171 -0
- package/dist/parse-sandbox.html +56 -0
- package/dist/phase-timing.js +155 -0
- package/dist/popup.html +197 -0
- package/dist/public-suffixes.js +6957 -0
- package/dist/run-context.js +31 -0
- package/dist/runtime-messages.js +34 -0
- package/dist/sandboxed-page.js +35 -0
- package/dist/script-build.js +787 -0
- package/dist/script-display.js +383 -0
- package/dist/script-icon.js +43 -0
- package/dist/script-links.js +204 -0
- package/dist/script-source-url.js +214 -0
- package/dist/script-world.js +65 -0
- package/dist/sm-dev-protocol.js +84 -0
- package/dist/source-map.js +177 -0
- package/dist/stack-link.js +138 -0
- package/dist/styles.css +825 -0
- package/dist/unsafe-window-use.js +229 -0
- package/dist/url-match.js +734 -0
- package/dist/userscript-header.js +248 -0
- package/dist/userscript.html +1165 -0
- package/dist/vendor/fflate.LICENSE +21 -0
- package/dist/vendor/fflate.js +2692 -0
- package/dist/vendor/prism/prism-line-numbers.css +1 -0
- package/dist/vendor/prism/prism-line-numbers.js +1 -0
- package/dist/vendor/prism/prism.css +1 -0
- package/dist/vendor/prism/prism.js +1946 -0
- package/dist/version-compare.js +141 -0
- package/dist/version-probe.js +120 -0
- package/lib/build-info.json +1 -0
- package/lib/bytes.d.ts +3 -0
- package/lib/bytes.js +37 -0
- package/lib/channel-placeholder.d.ts +1 -0
- package/lib/channel-placeholder.js +5 -0
- package/lib/collection-scan.d.ts +8 -0
- package/lib/collection-scan.js +17 -0
- package/lib/composed-source.d.ts +28 -0
- package/lib/composed-source.js +205 -0
- package/lib/debug-log.d.ts +9 -0
- package/lib/debug-log.js +75 -0
- package/lib/diagnostic-location.d.ts +8 -0
- package/lib/diagnostic-location.js +64 -0
- package/lib/eval-hook.d.ts +34 -0
- package/lib/eval-hook.js +308 -0
- package/lib/external-files.d.ts +111 -0
- package/lib/external-files.js +878 -0
- package/lib/file-loader.d.ts +48 -0
- package/lib/file-loader.js +436 -0
- package/lib/file-locations.d.ts +44 -0
- package/lib/file-locations.js +439 -0
- package/lib/generated-wrappers.d.ts +11 -0
- package/lib/generated-wrappers.js +5 -0
- package/lib/github-auth.d.ts +12 -0
- package/lib/github-auth.js +148 -0
- package/lib/github-urls.d.ts +1 -0
- package/lib/github-urls.js +46 -0
- package/lib/gm-api-catalog.d.ts +24 -0
- package/lib/gm-api-catalog.js +217 -0
- package/lib/gm-connect.d.ts +34 -0
- package/lib/gm-connect.js +273 -0
- package/lib/gm-xhr-types.d.ts +68 -0
- package/lib/gm-xhr-types.js +5 -0
- package/lib/harness/browser-extensions.d.ts +73 -0
- package/lib/harness/browser-extensions.js +285 -0
- package/lib/harness/browser-lang.d.ts +20 -0
- package/lib/harness/browser-lang.js +86 -0
- package/lib/harness/browser-launch.d.ts +14 -0
- package/lib/harness/browser-launch.js +184 -0
- package/lib/harness/checks.d.ts +110 -0
- package/lib/harness/checks.js +321 -0
- package/lib/harness/cli.d.ts +2 -0
- package/lib/harness/cli.js +2259 -0
- package/lib/harness/command-args.d.ts +91 -0
- package/lib/harness/command-args.js +369 -0
- package/lib/harness/command-lines.d.ts +80 -0
- package/lib/harness/command-lines.js +180 -0
- package/lib/harness/command-list.d.ts +206 -0
- package/lib/harness/command-list.js +1475 -0
- package/lib/harness/console-commands.d.ts +463 -0
- package/lib/harness/console-commands.js +3216 -0
- package/lib/harness/download-watch.d.ts +21 -0
- package/lib/harness/download-watch.js +156 -0
- package/lib/harness/extension-backend.d.ts +41 -0
- package/lib/harness/extension-backend.js +100 -0
- package/lib/harness/extension-host.d.ts +112 -0
- package/lib/harness/extension-host.js +552 -0
- package/lib/harness/extension-launch.d.ts +67 -0
- package/lib/harness/extension-launch.js +285 -0
- package/lib/harness/extension-link.d.ts +315 -0
- package/lib/harness/extension-link.js +607 -0
- package/lib/harness/external-manager.d.ts +146 -0
- package/lib/harness/external-manager.js +414 -0
- package/lib/harness/fixture.d.ts +165 -0
- package/lib/harness/fixture.js +461 -0
- package/lib/harness/frame-sessions.d.ts +71 -0
- package/lib/harness/frame-sessions.js +248 -0
- package/lib/harness/frames.d.ts +68 -0
- package/lib/harness/frames.js +216 -0
- package/lib/harness/help-format.d.ts +17 -0
- package/lib/harness/help-format.js +127 -0
- package/lib/harness/host.d.ts +352 -0
- package/lib/harness/host.js +423 -0
- package/lib/harness/index.d.ts +8 -0
- package/lib/harness/index.js +10 -0
- package/lib/harness/input-file.d.ts +18 -0
- package/lib/harness/input-file.js +61 -0
- package/lib/harness/json-output.d.ts +565 -0
- package/lib/harness/json-output.js +71 -0
- package/lib/harness/manager-actions.d.ts +21 -0
- package/lib/harness/manager-actions.js +129 -0
- package/lib/harness/manager-commands.d.ts +142 -0
- package/lib/harness/manager-commands.js +1196 -0
- package/lib/harness/manager-fetch.d.ts +33 -0
- package/lib/harness/manager-fetch.js +239 -0
- package/lib/harness/managers.d.ts +24 -0
- package/lib/harness/managers.js +27 -0
- package/lib/harness/output-style.d.ts +125 -0
- package/lib/harness/output-style.js +322 -0
- package/lib/harness/page-commands.d.ts +134 -0
- package/lib/harness/page-commands.js +1141 -0
- package/lib/harness/page-output.d.ts +67 -0
- package/lib/harness/page-output.js +139 -0
- package/lib/harness/page-watch.d.ts +171 -0
- package/lib/harness/page-watch.js +607 -0
- package/lib/harness/parse-check-node.d.ts +3 -0
- package/lib/harness/parse-check-node.js +132 -0
- package/lib/harness/path-args.d.ts +22 -0
- package/lib/harness/path-args.js +148 -0
- package/lib/harness/playwright-chromium.d.ts +16 -0
- package/lib/harness/playwright-chromium.js +86 -0
- package/lib/harness/prepare.d.ts +168 -0
- package/lib/harness/prepare.js +364 -0
- package/lib/harness/prompt-editor.d.ts +17 -0
- package/lib/harness/prompt-editor.js +354 -0
- package/lib/harness/prompt-history.d.ts +13 -0
- package/lib/harness/prompt-history.js +89 -0
- package/lib/harness/rebuild-advice.d.ts +6 -0
- package/lib/harness/rebuild-advice.js +39 -0
- package/lib/harness/run-log.d.ts +47 -0
- package/lib/harness/run-log.js +140 -0
- package/lib/harness/run-logs.d.ts +132 -0
- package/lib/harness/run-logs.js +241 -0
- package/lib/harness/run.d.ts +194 -0
- package/lib/harness/run.js +1973 -0
- package/lib/harness/runs.d.ts +229 -0
- package/lib/harness/runs.js +726 -0
- package/lib/harness/save-html.d.ts +39 -0
- package/lib/harness/save-html.js +89 -0
- package/lib/harness/saved-pages.d.ts +120 -0
- package/lib/harness/saved-pages.js +275 -0
- package/lib/harness/script-mark.d.ts +17 -0
- package/lib/harness/script-mark.js +56 -0
- package/lib/harness/snapshot.d.ts +143 -0
- package/lib/harness/snapshot.js +474 -0
- package/lib/harness/stuck-tabs.d.ts +19 -0
- package/lib/harness/stuck-tabs.js +131 -0
- package/lib/harness/tab-refs.d.ts +20 -0
- package/lib/harness/tab-refs.js +80 -0
- package/lib/harness/tampermonkey.d.ts +71 -0
- package/lib/harness/tampermonkey.js +356 -0
- package/lib/harness/tm-ids.d.ts +18 -0
- package/lib/harness/tm-ids.js +88 -0
- package/lib/harness/violentmonkey.d.ts +34 -0
- package/lib/harness/violentmonkey.js +162 -0
- package/lib/harness/wait.d.ts +77 -0
- package/lib/harness/wait.js +458 -0
- package/lib/http-read.d.ts +30 -0
- package/lib/http-read.js +142 -0
- package/lib/local-file-overrides.d.ts +35 -0
- package/lib/local-file-overrides.js +558 -0
- package/lib/manifest.json +38 -0
- package/lib/markup-response.d.ts +11 -0
- package/lib/markup-response.js +126 -0
- package/lib/match-targets.d.ts +18 -0
- package/lib/match-targets.js +305 -0
- package/lib/menu-captions.d.ts +1 -0
- package/lib/menu-captions.js +22 -0
- package/lib/parse-check-protocol.d.ts +27 -0
- package/lib/parse-check-protocol.js +51 -0
- package/lib/parse-location.d.ts +12 -0
- package/lib/parse-location.js +171 -0
- package/lib/phase-timing.d.ts +12 -0
- package/lib/phase-timing.js +155 -0
- package/lib/public-suffixes.d.ts +1 -0
- package/lib/public-suffixes.js +6957 -0
- package/lib/run-context.d.ts +2 -0
- package/lib/run-context.js +31 -0
- package/lib/runtime-messages.d.ts +10 -0
- package/lib/runtime-messages.js +34 -0
- package/lib/sandboxed-page.d.ts +5 -0
- package/lib/sandboxed-page.js +35 -0
- package/lib/script-build.d.ts +111 -0
- package/lib/script-build.js +787 -0
- package/lib/script-display.d.ts +51 -0
- package/lib/script-display.js +383 -0
- package/lib/script-icon.d.ts +16 -0
- package/lib/script-icon.js +43 -0
- package/lib/script-links.d.ts +24 -0
- package/lib/script-links.js +204 -0
- package/lib/script-source-url.d.ts +8 -0
- package/lib/script-source-url.js +214 -0
- package/lib/script-world.d.ts +6 -0
- package/lib/script-world.js +65 -0
- package/lib/sm-dev-protocol.d.ts +251 -0
- package/lib/sm-dev-protocol.js +84 -0
- package/lib/source-map.d.ts +32 -0
- package/lib/source-map.js +177 -0
- package/lib/stack-link.d.ts +15 -0
- package/lib/stack-link.js +138 -0
- package/lib/unsafe-window-use.d.ts +1 -0
- package/lib/unsafe-window-use.js +229 -0
- package/lib/url-match.d.ts +40 -0
- package/lib/url-match.js +734 -0
- package/lib/userscript-header.d.ts +33 -0
- package/lib/userscript-header.js +248 -0
- package/lib/version-compare.d.ts +6 -0
- package/lib/version-compare.js +141 -0
- package/lib/version-probe.d.ts +17 -0
- package/lib/version-probe.js +120 -0
- package/package.json +55 -3
- package/skills/SourceMonkey-dev/SKILL.md +868 -0
- package/skills/SourceMonkey-dev/references/cdp.md +293 -0
- package/skills/SourceMonkey-dev/references/commands.md +297 -0
- package/skills/SourceMonkey-dev/references/other-managers.md +63 -0
- package/skills/SourceMonkey-dev/references/specs.md +46 -0
- package/skills/SourceMonkey-friction/SKILL.md +103 -0
- package/skills/SourceMonkey-friction/references/template.md +59 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ConsoleMessage } from '@playwright/test';
|
|
2
|
+
export interface ConsoleLine {
|
|
3
|
+
type: string;
|
|
4
|
+
text: string;
|
|
5
|
+
/** Where the line was logged from, `''` when unknown. */
|
|
6
|
+
url: string;
|
|
7
|
+
/**
|
|
8
|
+
* The URLs of the call's stack frames, innermost first, async parents
|
|
9
|
+
* included; empty when not known.
|
|
10
|
+
*/
|
|
11
|
+
frames: string[];
|
|
12
|
+
/** Logged from SourceMonkey's own JavaScript world (`USER_SCRIPT`), where only its code runs. */
|
|
13
|
+
extensionWorld?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* How many values were passed. Zero for the browser's own entries
|
|
16
|
+
* (a blocked request, a policy violation), which are not console
|
|
17
|
+
* calls at all.
|
|
18
|
+
*/
|
|
19
|
+
argCount: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A line the prelude logs, which repeats a report the host already
|
|
23
|
+
* printed, so it's only `page`.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isPreludeLine(text: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Whose a console line is: the scripts', when it was logged from
|
|
28
|
+
* SourceMonkey's world or any frame of its stack is SourceMonkey's
|
|
29
|
+
* code (a script calling a page helper that logs), else the page's.
|
|
30
|
+
* The browser's own entries are always the page's. `ours`: what the
|
|
31
|
+
* manager's code URLs start with, when it isn't SourceMonkey.
|
|
32
|
+
*/
|
|
33
|
+
export declare function consoleSource(line: ConsoleLine, ours?: string): 'script' | 'page';
|
|
34
|
+
/** `stack` is Playwright's for the error: the message, then its frames. */
|
|
35
|
+
/** An error a script body threw, which the host printed already. */
|
|
36
|
+
export declare function hostReportedError(stack: string, hostReports: boolean): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Whose an uncaught error is (`stack`: the message, then its frames),
|
|
39
|
+
* or null for a script body's throw the host printed already.
|
|
40
|
+
*/
|
|
41
|
+
export declare function pageErrorSource(stack: string, hostReports: boolean, ours?: string): 'script' | 'page' | null;
|
|
42
|
+
/**
|
|
43
|
+
* A console call's text, as `msg.text()` gives it but with each DOM
|
|
44
|
+
* node described (see NODE_TEXT_CHARS) and `%` directives applied
|
|
45
|
+
* (`formatConsoleArgs`). Every level goes through this,
|
|
46
|
+
* so `debug` and `error` lines read alike. A node that can't be read
|
|
47
|
+
* now keeps Playwright's text: its page gone, or not answering within
|
|
48
|
+
* NODE_LOOKUP_MS (a dialog open, paused in the debugger), since the
|
|
49
|
+
* page's later lines wait for this one.
|
|
50
|
+
*/
|
|
51
|
+
export declare function consoleText(msg: ConsoleMessage): Promise<string>;
|
|
52
|
+
/**
|
|
53
|
+
* A console call's values as one line, the first one's `%` directives
|
|
54
|
+
* applied as the browser's console does: `%s`, `%d`, `%i`, `%f`, `%o`
|
|
55
|
+
* and `%O` take the next value in its place, `%c` takes the next value
|
|
56
|
+
* (its CSS) and shows nothing, and `%%` is a `%`. The values left over
|
|
57
|
+
* follow, space-separated. A string the page logged with `%` and no
|
|
58
|
+
* values to take reads as written.
|
|
59
|
+
*/
|
|
60
|
+
export declare function formatConsoleArgs(parts: string[]): string;
|
|
61
|
+
/**
|
|
62
|
+
* `text` with each stack ref to SourceMonkey's own `sourcemonkey://`
|
|
63
|
+
* URLs decoded once, as the viewer's Log tab shows them: a file named
|
|
64
|
+
* `Video%20Speed%20Buttons.user.js` is in the URL as
|
|
65
|
+
* `Video%2520Speed%2520Buttons.user.js`. Other refs stay as they are.
|
|
66
|
+
*/
|
|
67
|
+
export declare function decodeOwnRefs(text: string): string;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// Whose the page's console lines and uncaught errors are: the run's
|
|
2
|
+
// scripts' (the `script` log source) or the page's own (`page`). A
|
|
3
|
+
// busy site logs plenty of its own (blocked trackers, failed ads) that
|
|
4
|
+
// would bury the scripts' lines, so the stream shows only `script`
|
|
5
|
+
// unless asked. See docs/sm-dev-logs.md.
|
|
6
|
+
// Also how a console line reads when it logs a DOM node.
|
|
7
|
+
import { ROOT } from '../script-source-url.js';
|
|
8
|
+
import { displayRefText, parseStackRefs } from '../stack-link.js';
|
|
9
|
+
// Every URL SourceMonkey runs code under: the scripts, and its own
|
|
10
|
+
// prelude, bridge and GM runtime, whose failures are ours to show too.
|
|
11
|
+
const OURS = `${ROOT}/`;
|
|
12
|
+
// A script's main body, `<ROOT>/<folder>/<name>.user.js`, as a stack
|
|
13
|
+
// frame (`:line:col` follows). The extension concatenates `@require`s
|
|
14
|
+
// into it, so their frames carry this URL too.
|
|
15
|
+
const SCRIPT_BODY_FRAME = new RegExp(`${ROOT.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&')}/[^/\\s]+/[^/\\s]+\\.user\\.js:`);
|
|
16
|
+
/**
|
|
17
|
+
* A line the prelude logs, which repeats a report the host already
|
|
18
|
+
* printed, so it's only `page`.
|
|
19
|
+
*/
|
|
20
|
+
export function isPreludeLine(text) {
|
|
21
|
+
return text.startsWith('[SourceMonkey]');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Whose a console line is: the scripts', when it was logged from
|
|
25
|
+
* SourceMonkey's world or any frame of its stack is SourceMonkey's
|
|
26
|
+
* code (a script calling a page helper that logs), else the page's.
|
|
27
|
+
* The browser's own entries are always the page's. `ours`: what the
|
|
28
|
+
* manager's code URLs start with, when it isn't SourceMonkey.
|
|
29
|
+
*/
|
|
30
|
+
export function consoleSource(line, ours = OURS) {
|
|
31
|
+
if (line.argCount === 0)
|
|
32
|
+
return 'page';
|
|
33
|
+
if (line.extensionWorld)
|
|
34
|
+
return 'script';
|
|
35
|
+
return [line.url, ...line.frames].some((url) => url.startsWith(ours)) ? 'script' : 'page';
|
|
36
|
+
}
|
|
37
|
+
/** `stack` is Playwright's for the error: the message, then its frames. */
|
|
38
|
+
/** An error a script body threw, which the host printed already. */
|
|
39
|
+
export function hostReportedError(stack, hostReports) {
|
|
40
|
+
return hostReports && SCRIPT_BODY_FRAME.test(stack);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Whose an uncaught error is (`stack`: the message, then its frames),
|
|
44
|
+
* or null for a script body's throw the host printed already.
|
|
45
|
+
*/
|
|
46
|
+
export function pageErrorSource(stack, hostReports, ours = OURS) {
|
|
47
|
+
if (hostReportedError(stack, hostReports))
|
|
48
|
+
return null;
|
|
49
|
+
// A thrown or rejected non-Error value (`Promise.reject('nope')`)
|
|
50
|
+
// has no frames, so there's no telling from its stack. The run looks
|
|
51
|
+
// at where it was thrown (`stacklessIsScripts` in run.ts).
|
|
52
|
+
if (!/\n\s+at /.test(stack))
|
|
53
|
+
return 'script';
|
|
54
|
+
return stack.includes(ours) ? 'script' : 'page';
|
|
55
|
+
}
|
|
56
|
+
// How a node logged to the console reads: its opening tag, as in
|
|
57
|
+
// `<div id="x" class="a b">`, rather than Playwright's `JSHandle@node`.
|
|
58
|
+
// Cut at this length, attribute values first.
|
|
59
|
+
const NODE_TEXT_CHARS = 120;
|
|
60
|
+
const NODE_LOOKUP_MS = 1000;
|
|
61
|
+
/**
|
|
62
|
+
* A console call's text, as `msg.text()` gives it but with each DOM
|
|
63
|
+
* node described (see NODE_TEXT_CHARS) and `%` directives applied
|
|
64
|
+
* (`formatConsoleArgs`). Every level goes through this,
|
|
65
|
+
* so `debug` and `error` lines read alike. A node that can't be read
|
|
66
|
+
* now keeps Playwright's text: its page gone, or not answering within
|
|
67
|
+
* NODE_LOOKUP_MS (a dialog open, paused in the debugger), since the
|
|
68
|
+
* page's later lines wait for this one.
|
|
69
|
+
*/
|
|
70
|
+
export async function consoleText(msg) {
|
|
71
|
+
const parts = await Promise.all(msg.args().map(async (arg) => {
|
|
72
|
+
const node = arg.asElement();
|
|
73
|
+
if (!node)
|
|
74
|
+
return arg.toString();
|
|
75
|
+
let timer;
|
|
76
|
+
const late = new Promise((resolve) => { timer = setTimeout(() => resolve(arg.toString()), NODE_LOOKUP_MS); });
|
|
77
|
+
try {
|
|
78
|
+
return await Promise.race([node.evaluate(describeNode, NODE_TEXT_CHARS), late]);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return arg.toString();
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
clearTimeout(timer);
|
|
85
|
+
}
|
|
86
|
+
}));
|
|
87
|
+
return formatConsoleArgs(parts);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* A console call's values as one line, the first one's `%` directives
|
|
91
|
+
* applied as the browser's console does: `%s`, `%d`, `%i`, `%f`, `%o`
|
|
92
|
+
* and `%O` take the next value in its place, `%c` takes the next value
|
|
93
|
+
* (its CSS) and shows nothing, and `%%` is a `%`. The values left over
|
|
94
|
+
* follow, space-separated. A string the page logged with `%` and no
|
|
95
|
+
* values to take reads as written.
|
|
96
|
+
*/
|
|
97
|
+
export function formatConsoleArgs(parts) {
|
|
98
|
+
if (parts.length < 2 || !parts[0].includes('%'))
|
|
99
|
+
return parts.join(' ');
|
|
100
|
+
let next = 1;
|
|
101
|
+
const first = parts[0].replace(/%([sdifoOc%])/g, (whole, kind) => {
|
|
102
|
+
if (kind === '%')
|
|
103
|
+
return '%';
|
|
104
|
+
if (next >= parts.length)
|
|
105
|
+
return whole;
|
|
106
|
+
const value = parts[next++];
|
|
107
|
+
if (kind === 'c')
|
|
108
|
+
return '';
|
|
109
|
+
if (kind === 'd' || kind === 'i')
|
|
110
|
+
return String(parseInt(value, 10));
|
|
111
|
+
if (kind === 'f')
|
|
112
|
+
return String(parseFloat(value));
|
|
113
|
+
return value;
|
|
114
|
+
});
|
|
115
|
+
return [first, ...parts.slice(next)].join(' ');
|
|
116
|
+
}
|
|
117
|
+
// Runs in the page.
|
|
118
|
+
function describeNode(node, limit) {
|
|
119
|
+
const cut = (s, n) => (s.length > n ? `${s.slice(0, n)}...` : s);
|
|
120
|
+
if (node.nodeType === Node.TEXT_NODE)
|
|
121
|
+
return `#text ${JSON.stringify(cut(node.textContent ?? '', 40))}`;
|
|
122
|
+
if (!(node instanceof Element))
|
|
123
|
+
return node.nodeName;
|
|
124
|
+
const attrs = Array.from(node.attributes, (a) => (a.value === '' ? a.name : `${a.name}="${cut(a.value, 40)}"`));
|
|
125
|
+
const tag = node.tagName.toLowerCase();
|
|
126
|
+
const open = `<${[tag, ...attrs].join(' ')}>`;
|
|
127
|
+
return open.length > limit ? `${open.slice(0, limit - 4)}...>` : open;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* `text` with each stack ref to SourceMonkey's own `sourcemonkey://`
|
|
131
|
+
* URLs decoded once, as the viewer's Log tab shows them: a file named
|
|
132
|
+
* `Video%20Speed%20Buttons.user.js` is in the URL as
|
|
133
|
+
* `Video%2520Speed%2520Buttons.user.js`. Other refs stay as they are.
|
|
134
|
+
*/
|
|
135
|
+
export function decodeOwnRefs(text) {
|
|
136
|
+
if (!text.includes(`${ROOT}/`))
|
|
137
|
+
return text;
|
|
138
|
+
return parseStackRefs(text).map((run) => (run.kind === 'ref' ? displayRefText(run.text, run.url) : run.text)).join('');
|
|
139
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import type { Frame, Page } from '@playwright/test';
|
|
2
|
+
import type { HarnessHost, PageLink } from './host.js';
|
|
3
|
+
import type { PreparedScript } from './prepare.js';
|
|
4
|
+
import type { InjectionWorld } from '../script-world.js';
|
|
5
|
+
/** What `activity` reads from a page, for `wait`. */
|
|
6
|
+
export interface PageActivity {
|
|
7
|
+
readyState: string;
|
|
8
|
+
/** Milliseconds since the DOM last changed. */
|
|
9
|
+
sinceDom: number;
|
|
10
|
+
/** The element that changed last, as `div#id.class`. */
|
|
11
|
+
lastChanged: string;
|
|
12
|
+
}
|
|
13
|
+
/** A request the page has in flight, and for how long. */
|
|
14
|
+
export interface PendingRequest {
|
|
15
|
+
url: string;
|
|
16
|
+
ms: number;
|
|
17
|
+
}
|
|
18
|
+
/** What an expression `evaluate` ran threw, as opposed to evaluate failing. */
|
|
19
|
+
export declare class ScriptThrew extends Error {
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A script's own scope, for `eval` in a script: the world it runs in, and
|
|
23
|
+
* where its eval hook is kept there (see src/eval-hook.ts).
|
|
24
|
+
*/
|
|
25
|
+
export interface ScriptScope {
|
|
26
|
+
world: InjectionWorld;
|
|
27
|
+
key: string;
|
|
28
|
+
id: string;
|
|
29
|
+
}
|
|
30
|
+
/** `evaluate` found no eval hook for the script: it hasn't run in this document. */
|
|
31
|
+
export declare class NoEvalHook extends Error {
|
|
32
|
+
}
|
|
33
|
+
/** `evaluate` found no document to run in: the page stayed between documents. */
|
|
34
|
+
export declare class NoDocument extends Error {
|
|
35
|
+
}
|
|
36
|
+
export interface AttachOptions {
|
|
37
|
+
/**
|
|
38
|
+
* The extension's origin (`chrome-extension://<id>`), which names the
|
|
39
|
+
* world its scripts run in, for `eval` in a script.
|
|
40
|
+
*/
|
|
41
|
+
watchOnly: {
|
|
42
|
+
extensionOrigin: string;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export interface InjectOptions {
|
|
46
|
+
/**
|
|
47
|
+
* The script runs in the current document too, not only from the
|
|
48
|
+
* next navigation: one the tab already showed when it was set up.
|
|
49
|
+
*/
|
|
50
|
+
immediately?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* One page watched for a host. Create with `attachPage`, then record the
|
|
54
|
+
* scripts its tab runs with `inject`.
|
|
55
|
+
*/
|
|
56
|
+
export declare class PageAttachment implements PageLink {
|
|
57
|
+
readonly page: Page;
|
|
58
|
+
readonly host: HarnessHost;
|
|
59
|
+
private readonly cdp;
|
|
60
|
+
private readonly options;
|
|
61
|
+
private readonly injected;
|
|
62
|
+
private disposing;
|
|
63
|
+
private closed;
|
|
64
|
+
private mainFrameId;
|
|
65
|
+
private readonly documents;
|
|
66
|
+
private currentDocument;
|
|
67
|
+
private readonly contexts;
|
|
68
|
+
private frameSessions?;
|
|
69
|
+
private readonly requests;
|
|
70
|
+
private lastRequestEnd;
|
|
71
|
+
private readonly onRequest;
|
|
72
|
+
private readonly onRequestEnd;
|
|
73
|
+
private readonly onClose;
|
|
74
|
+
private constructor();
|
|
75
|
+
static create(page: Page, host: HarnessHost, options: AttachOptions): Promise<PageAttachment>;
|
|
76
|
+
private install;
|
|
77
|
+
/**
|
|
78
|
+
* When the main frame entered its current document, by the host's
|
|
79
|
+
* clock, as reports are stamped. Changes only when a new document
|
|
80
|
+
* loads, not on a same-document (hash or `pushState`) navigation.
|
|
81
|
+
*/
|
|
82
|
+
documentStart(): number;
|
|
83
|
+
/**
|
|
84
|
+
* Resolves once the page has run the tasks it already had queued, and
|
|
85
|
+
* the console lines they printed have arrived. A round trip through
|
|
86
|
+
* Playwright's own session, as those lines are, so none comes after
|
|
87
|
+
* it. Then one through the attachment's session, so the events it
|
|
88
|
+
* was sent meanwhile have arrived too. For a
|
|
89
|
+
* command to end after what it set off in the page, such as a menu
|
|
90
|
+
* handler, or a script body, which runs after its start report.
|
|
91
|
+
*/
|
|
92
|
+
drain(): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Resolves once the events the attachment's session had already been
|
|
95
|
+
* sent have arrived: a navigation's new document. Playwright's own
|
|
96
|
+
* session can run ahead of it.
|
|
97
|
+
*/
|
|
98
|
+
caughtUp(): Promise<void>;
|
|
99
|
+
private enterDocument;
|
|
100
|
+
/**
|
|
101
|
+
* The page's document state and its DOM's last change, for `wait`.
|
|
102
|
+
* Null when there is no document to ask. Can wait on a page busy in
|
|
103
|
+
* a long script, so the caller bounds it.
|
|
104
|
+
*/
|
|
105
|
+
activity(): Promise<PageActivity | null>;
|
|
106
|
+
/**
|
|
107
|
+
* Resolves once the page's main thread has a moment with nothing to
|
|
108
|
+
* do (`requestIdleCallback`), or after `maxMs`.
|
|
109
|
+
*/
|
|
110
|
+
idle(maxMs: number): Promise<void>;
|
|
111
|
+
/** The page's requests in flight, and milliseconds since one last ended. */
|
|
112
|
+
network(): {
|
|
113
|
+
pending: PendingRequest[];
|
|
114
|
+
sinceLast: number;
|
|
115
|
+
};
|
|
116
|
+
url(): string;
|
|
117
|
+
private scriptsContext;
|
|
118
|
+
private contextFor;
|
|
119
|
+
/**
|
|
120
|
+
* Evaluates `expression` in the main frame, or in `frame` (one of the
|
|
121
|
+
* page's iframes), in the page's own world or one script's own
|
|
122
|
+
* scope, for `eval`. Resolves to the result as a
|
|
123
|
+
* line to print; rejects with a `ScriptThrew` for what the expression
|
|
124
|
+
* threw, a `NoEvalHook` for a script that hasn't run here, a
|
|
125
|
+
* `NoDocument` for a frame that has gone, or an error of the
|
|
126
|
+
* evaluation's own (the page gone, say).
|
|
127
|
+
*/
|
|
128
|
+
evaluate(expression: string, world: 'page' | ScriptScope, documentWaitMs?: number, frame?: Frame): Promise<string>;
|
|
129
|
+
private topContexts;
|
|
130
|
+
/**
|
|
131
|
+
* The CDP target id of an iframe in a process of its own, for a raw
|
|
132
|
+
* CDP client; undefined for one in its parent's (see frame-sessions.ts).
|
|
133
|
+
*/
|
|
134
|
+
frameTargetId(frame: Frame): Promise<string | undefined>;
|
|
135
|
+
/** An iframe's CDP frame id in the session that covers it, if found. */
|
|
136
|
+
frameCdpId(frame: Frame): Promise<string | undefined>;
|
|
137
|
+
private frameContexts;
|
|
138
|
+
private documentReady;
|
|
139
|
+
private evaluateInScript;
|
|
140
|
+
private evaluated;
|
|
141
|
+
private describe;
|
|
142
|
+
/**
|
|
143
|
+
* Records a script the tab runs. Re-recording the same script
|
|
144
|
+
* replaces it.
|
|
145
|
+
*/
|
|
146
|
+
inject(prepared: PreparedScript, options?: InjectOptions): Promise<void>;
|
|
147
|
+
/** The tab no longer runs a script, from its next navigation. */
|
|
148
|
+
remove(scriptId: string): Promise<void>;
|
|
149
|
+
injectedScripts(): PreparedScript[];
|
|
150
|
+
/**
|
|
151
|
+
* The scripts the current document runs, and so hears from: recorded
|
|
152
|
+
* before it started, or run in it at once. One added later (a `load`
|
|
153
|
+
* into a tab a dialog kept from reloading) waits for the next load.
|
|
154
|
+
*/
|
|
155
|
+
scriptsInDocument(): PreparedScript[];
|
|
156
|
+
/**
|
|
157
|
+
* When the main frame first entered its current document. Unlike
|
|
158
|
+
* `documentStart`, the same after the back/forward cache restores it,
|
|
159
|
+
* when its scripts don't run again.
|
|
160
|
+
*/
|
|
161
|
+
documentFirstStart(): number;
|
|
162
|
+
/** Stop watching, and drop the CDP session. */
|
|
163
|
+
dispose(): Promise<void>;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The page's CDP target id (the `id` in `/json/list`, and what CDP's
|
|
167
|
+
* `Target.*` calls take), or null when it can't be read, as once the
|
|
168
|
+
* page has closed.
|
|
169
|
+
*/
|
|
170
|
+
export declare function targetIdOf(page: Page): Promise<string | null>;
|
|
171
|
+
export declare function attachPage(page: Page, host: HarnessHost, options: AttachOptions): Promise<PageAttachment>;
|