add initial marp implementation with sample content and build configuration
This commit is contained in:
1
node_modules/chromium-bidi/.browser
generated
vendored
Normal file
1
node_modules/chromium-bidi/.browser
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
chrome@141.0.7354.0
|
||||
201
node_modules/chromium-bidi/LICENSE
generated
vendored
Normal file
201
node_modules/chromium-bidi/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
626
node_modules/chromium-bidi/README.md
generated
vendored
Normal file
626
node_modules/chromium-bidi/README.md
generated
vendored
Normal file
@@ -0,0 +1,626 @@
|
||||
# WebDriver BiDi for Chromium [](https://www.npmjs.com/package/chromium-bidi)
|
||||
|
||||
## CI status
|
||||
|
||||

|
||||

|
||||

|
||||
|
||||

|
||||
|
||||
This is an implementation of the
|
||||
[WebDriver BiDi](https://w3c.github.io/webdriver-bidi/) protocol with some
|
||||
extensions (**BiDi+**)
|
||||
for Chromium, implemented as a JavaScript layer translating between BiDi and CDP,
|
||||
running inside a Chrome tab.
|
||||
|
||||
Current status can be checked
|
||||
at [WPT WebDriver BiDi status](https://wpt.fyi/results/webdriver/tests/bidi).
|
||||
|
||||
## BiDi+
|
||||
|
||||
**"BiDi+"** is an extension of the WebDriver BiDi protocol. In addition to [WebDriver BiDi](https://w3c.github.io/webdriver-bidi/) it has:
|
||||
|
||||
### Command `goog:cdp.sendCommand`
|
||||
|
||||
```cddl
|
||||
CdpSendCommandCommand = {
|
||||
method: "goog:cdp.sendCommand",
|
||||
params: CdpSendCommandParameters,
|
||||
}
|
||||
|
||||
CdpSendCommandParameters = {
|
||||
method: text,
|
||||
params: any,
|
||||
session?: text,
|
||||
}
|
||||
|
||||
CdpSendCommandResult = {
|
||||
result: any,
|
||||
session: text,
|
||||
}
|
||||
```
|
||||
|
||||
The command runs the
|
||||
described [CDP command](https://chromedevtools.github.io/devtools-protocol)
|
||||
and returns the result.
|
||||
|
||||
### Command `goog:cdp.getSession`
|
||||
|
||||
```cddl
|
||||
CdpGetSessionCommand = {
|
||||
method: "goog:cdp.getSession",
|
||||
params: CdpGetSessionParameters,
|
||||
}
|
||||
|
||||
CdpGetSessionParameters = {
|
||||
context: BrowsingContext,
|
||||
}
|
||||
|
||||
CdpGetSessionResult = {
|
||||
session: text,
|
||||
}
|
||||
```
|
||||
|
||||
The command returns the default CDP session for the selected browsing context.
|
||||
|
||||
### Command `goog:cdp.resolveRealm`
|
||||
|
||||
```cddl
|
||||
CdpResolveRealmCommand = {
|
||||
method: "goog:cdp.resolveRealm",
|
||||
params: CdpResolveRealmParameters,
|
||||
}
|
||||
|
||||
CdpResolveRealmParameters = {
|
||||
realm: Script.Realm,
|
||||
}
|
||||
|
||||
CdpResolveRealmResult = {
|
||||
executionContextId: text,
|
||||
}
|
||||
```
|
||||
|
||||
The command returns resolves a BiDi realm to its CDP execution context ID.
|
||||
|
||||
### Events `goog:cdp`
|
||||
|
||||
```cddl
|
||||
CdpEventReceivedEvent = {
|
||||
method: "goog:cdp.<CDP Event Name>",
|
||||
params: CdpEventReceivedParameters,
|
||||
}
|
||||
|
||||
CdpEventReceivedParameters = {
|
||||
event: text,
|
||||
params: any,
|
||||
session: text,
|
||||
}
|
||||
```
|
||||
|
||||
The event contains a CDP event.
|
||||
|
||||
### Field `goog:channel`
|
||||
|
||||
Each command can be extended with a `goog:channel`:
|
||||
|
||||
```cddl
|
||||
Command = {
|
||||
id: js-uint,
|
||||
"goog:channel"?: text,
|
||||
CommandData,
|
||||
Extensible,
|
||||
}
|
||||
```
|
||||
|
||||
If provided and non-empty string, the very same `goog:channel` is added to the response:
|
||||
|
||||
```cddl
|
||||
CommandResponse = {
|
||||
id: js-uint,
|
||||
"goog:channel"?: text,
|
||||
result: ResultData,
|
||||
Extensible,
|
||||
}
|
||||
|
||||
ErrorResponse = {
|
||||
id: js-uint / null,
|
||||
"goog:channel"?: text,
|
||||
error: ErrorCode,
|
||||
message: text,
|
||||
?stacktrace: text,
|
||||
Extensible
|
||||
}
|
||||
```
|
||||
|
||||
When client uses
|
||||
commands [`session.subscribe`](https://w3c.github.io/webdriver-bidi/#command-session-subscribe)
|
||||
and [`session.unsubscribe`](https://w3c.github.io/webdriver-bidi/#command-session-unsubscribe)
|
||||
with `goog:channel`, the subscriptions are handled per channel, and the corresponding
|
||||
`goog:channel` filed is added to the event message:
|
||||
|
||||
```cddl
|
||||
Event = {
|
||||
"goog:channel"?: text,
|
||||
EventData,
|
||||
Extensible,
|
||||
}
|
||||
```
|
||||
|
||||
## Dev Setup
|
||||
|
||||
### `npm`
|
||||
|
||||
This is a Node.js project, so install dependencies as usual:
|
||||
|
||||
```sh
|
||||
npm install
|
||||
```
|
||||
|
||||
### `cargo`
|
||||
|
||||
<!-- TODO(jrandolf): Remove after binaries get published -->
|
||||
|
||||
We use [cddlconv](https://github.com/google/cddlconv) to generate our WebDriverBiDi types before building.
|
||||
|
||||
1. Install [Rust](https://rustup.rs/).
|
||||
2. Run `cargo install --git https://github.com/google/cddlconv.git cddlconv`
|
||||
|
||||
### pre-commit.com integration
|
||||
|
||||
Refer to the documentation at [.pre-commit-config.yaml](.pre-commit-config.yaml).
|
||||
|
||||
```sh
|
||||
pre-commit install --hook-type pre-push
|
||||
```
|
||||
|
||||
Re-installing pre-commit locally:
|
||||
|
||||
```
|
||||
pre-commit clean && pip install pre-commit
|
||||
```
|
||||
|
||||
### Starting WebDriver BiDi Server
|
||||
|
||||
This will run the server on port `8080`:
|
||||
|
||||
```sh
|
||||
npm run server
|
||||
```
|
||||
|
||||
Use the `PORT=` environment variable or `--port=` argument to run it on another port:
|
||||
|
||||
```sh
|
||||
PORT=8081 npm run server
|
||||
npm run server -- --port=8081
|
||||
```
|
||||
|
||||
Use the `DEBUG` environment variable to see debug info:
|
||||
|
||||
```sh
|
||||
DEBUG=* npm run server
|
||||
```
|
||||
|
||||
Use the `DEBUG_DEPTH` (default: `10`) environment variable to see debug deeply nested objects:
|
||||
|
||||
```sh
|
||||
DEBUG_DEPTH=100 DEBUG=* npm run server
|
||||
```
|
||||
|
||||
Use the `CHANNEL=...` environment variable with one of the following values to run
|
||||
the specific Chrome channel: `stable`, `beta`, `canary`, `dev`, `local`. Default is
|
||||
`local`. The `local` channel means the pinned in `.browser` Chrome version will be
|
||||
downloaded if it is not yet in cache. Otherwise, the requested Chrome version should
|
||||
be installed.
|
||||
|
||||
```sh
|
||||
CHANNEL=dev npm run server
|
||||
```
|
||||
|
||||
Use the CLI argument `--verbose` to have CDP events printed to the console. Note: you have to enable debugging output `bidi:mapper:debug:*` as well.
|
||||
|
||||
```sh
|
||||
DEBUG=bidi:mapper:debug:* npm run server -- --verbose
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```sh
|
||||
DEBUG=* npm run server -- --verbose
|
||||
```
|
||||
|
||||
### Starting on Linux and Mac
|
||||
|
||||
TODO: verify it works on Windows.
|
||||
|
||||
You can also run the server by using `npm run server`. It will write
|
||||
output to the file `log.txt`:
|
||||
|
||||
```sh
|
||||
npm run server -- --port=8081 --headless=false
|
||||
```
|
||||
|
||||
### Running with in other project
|
||||
|
||||
Sometimes it good to verify that a change will not affect thing downstream for other packages.
|
||||
There is a useful `puppeteer` label you can add to any PR to run Puppeteer test with your changes.
|
||||
It will bundle `chromium-bidi` and install it in Puppeteer project then run that package test.
|
||||
|
||||
## Running
|
||||
|
||||
### Unit tests
|
||||
|
||||
Running:
|
||||
|
||||
```sh
|
||||
npm run unit
|
||||
```
|
||||
|
||||
### E2E tests
|
||||
|
||||
The e2e tests serve the following purposes:
|
||||
|
||||
1. Brief checks of the scenarios (the detailed check is done in WPT)
|
||||
2. Test Chromium-specific behavior nuances
|
||||
3. Add a simple setup for engaging the specific command
|
||||
|
||||
The E2E tests are written using Python, in order to more-or-less align with the web-platform-tests.
|
||||
|
||||
#### Installation
|
||||
|
||||
Python 3.10+ and some dependencies are required:
|
||||
|
||||
```sh
|
||||
python -m pip install --user pipenv
|
||||
pipenv install
|
||||
```
|
||||
|
||||
#### Running
|
||||
|
||||
The E2E tests require BiDi server running on the same host. By default, tests
|
||||
try to connect to the port `8080`. The server can be run from the project root:
|
||||
|
||||
```sh
|
||||
npm run e2e # alias to to e2e:headless
|
||||
npm run e2e:headful
|
||||
npm run e2e:headless
|
||||
```
|
||||
|
||||
This commands will run `./tools/run-e2e.mjs`, which will log the PyTest output to console,
|
||||
Additionally the output is also recorded under `./logs/<DATE>.e2e.log`, this will contain
|
||||
both the PyTest logs and in the event of `FAILED` test all the Chromium-BiDi logs.
|
||||
|
||||
If you need to see the logs for all test run the command with `VERBOSE=true`.
|
||||
|
||||
Simply pass `npm run e2e -- tests/<PathOrFile>` and the e2e will run only the selected one.
|
||||
You run a specific test by running `npm run e2e -- -k <TestName>`.
|
||||
|
||||
Use `CHROMEDRIVER` environment to run tests in `chromedriver` instead of NodeJS runner:
|
||||
|
||||
```shell
|
||||
CHROMEDRIVER=true npm run e2e
|
||||
```
|
||||
|
||||
Use the `PORT` environment variable to connect to another port:
|
||||
|
||||
```sh
|
||||
PORT=8081 npm run e2e
|
||||
```
|
||||
|
||||
Use the `HEADLESS` to run the tests in headless (new or old) or headful modes.
|
||||
Values: `new`, `old`, `false`, default: `new`.
|
||||
|
||||
```sh
|
||||
HEADLESS=new npm run e2e
|
||||
```
|
||||
|
||||
#### Updating snapshots
|
||||
|
||||
```sh
|
||||
npm run e2e -- --snapshot-update true
|
||||
```
|
||||
|
||||
See https://github.com/tophat/syrupy for more information.
|
||||
|
||||
### Local http server
|
||||
|
||||
E2E tests use local http
|
||||
server [`pytest-httpserver`](https://pytest-httpserver.readthedocs.io/), which is run
|
||||
automatically with the tests. However,
|
||||
sometimes it is useful to run the http server outside the test
|
||||
case, for example for manual debugging. This can be done by running:
|
||||
|
||||
```sh
|
||||
pipenv run local_http_server
|
||||
```
|
||||
|
||||
...or directly:
|
||||
|
||||
```sh
|
||||
python tests/tools/local_http_server.py
|
||||
```
|
||||
|
||||
### Examples
|
||||
|
||||
Refer to [examples/README.md](examples/README.md).
|
||||
|
||||
## WPT (Web Platform Tests)
|
||||
|
||||
WPT is added as
|
||||
a [git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules). To get run
|
||||
WPT tests:
|
||||
|
||||
### Check out and setup WPT
|
||||
|
||||
#### 1. Check out WPT
|
||||
|
||||
```sh
|
||||
git submodule update --init
|
||||
```
|
||||
|
||||
#### 2. Go to the WPT folder
|
||||
|
||||
```sh
|
||||
cd wpt
|
||||
```
|
||||
|
||||
#### 3. Set up virtualenv
|
||||
|
||||
Follow the [_System
|
||||
Setup_](https://web-platform-tests.org/running-tests/from-local-system.html#system-setup)
|
||||
instructions.
|
||||
|
||||
#### 4. Setup `hosts` file
|
||||
|
||||
Follow
|
||||
the [`hosts` File Setup](https://web-platform-tests.org/running-tests/from-local-system.html#hosts-file-setup)
|
||||
instructions.
|
||||
|
||||
##### 4.a On Linux, macOS or other UNIX-like system
|
||||
|
||||
```sh
|
||||
./wpt make-hosts-file | sudo tee -a /etc/hosts
|
||||
```
|
||||
|
||||
##### 4.b On **Windows**
|
||||
|
||||
This must be run in a PowerShell session with Administrator privileges:
|
||||
|
||||
```sh
|
||||
python wpt make-hosts-file | Out-File $env:SystemRoot\System32\drivers\etc\hosts -Encoding ascii -Append
|
||||
```
|
||||
|
||||
If you are behind a proxy, you also need to make sure the domains above are excluded
|
||||
from your proxy lookups.
|
||||
|
||||
#### 5. Set `BROWSER_BIN`
|
||||
|
||||
Set the `BROWSER_BIN` environment variable to a Chrome, Edge or Chromium binary to launch.
|
||||
For example, on macOS:
|
||||
|
||||
```sh
|
||||
# Chrome
|
||||
export BROWSER_BIN="/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary"
|
||||
export BROWSER_BIN="/Applications/Google Chrome Dev.app/Contents/MacOS/Google Chrome Dev"
|
||||
export BROWSER_BIN="/Applications/Google Chrome Beta.app/Contents/MacOS/Google Chrome Beta"
|
||||
export BROWSER_BIN="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
|
||||
export BROWSER_BIN="/Applications/Chromium.app/Contents/MacOS/Chromium"
|
||||
|
||||
# Edge
|
||||
export BROWSER_BIN="/Applications/Microsoft Edge Canary.app/Contents/MacOS/Microsoft Edge Canary"
|
||||
export BROWSER_BIN="/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"
|
||||
```
|
||||
|
||||
### Run WPT tests
|
||||
|
||||
#### 1. Make sure you have Chrome Dev installed
|
||||
|
||||
https://www.google.com/chrome/dev/
|
||||
|
||||
#### 2. Build Chromedriver BiDi
|
||||
|
||||
Oneshot:
|
||||
|
||||
```sh
|
||||
npm run build
|
||||
```
|
||||
|
||||
Continuously:
|
||||
|
||||
```sh
|
||||
npm run build --watch
|
||||
```
|
||||
|
||||
#### 3. Run
|
||||
|
||||
```sh
|
||||
npm run wpt -- webdriver/tests/bidi/
|
||||
```
|
||||
|
||||
### Update WPT expectations if needed
|
||||
|
||||
```sh
|
||||
UPDATE_EXPECTATIONS=true npm run wpt -- webdriver/tests/bidi/
|
||||
```
|
||||
|
||||
## How does it work?
|
||||
|
||||
The architecture is described in the
|
||||
[WebDriver BiDi in Chrome Context implementation plan](https://docs.google.com/document/d/1VfQ9tv0wPSnb5TI-MOobjoQ5CXLnJJx9F_PxOMQc8kY)
|
||||
.
|
||||
|
||||
There are 2 main modules:
|
||||
|
||||
1. backend WS server in `src`. It runs webSocket server, and for each ws connection
|
||||
runs an instance of browser with BiDi Mapper.
|
||||
2. front-end BiDi Mapper in `src/bidiMapper`. Gets BiDi commands from the backend,
|
||||
and map them to CDP commands.
|
||||
|
||||
## Contributing
|
||||
|
||||
The BiDi commands are processed in the `src/bidiMapper/commandProcessor.ts`. To add a
|
||||
new command, add it to `_processCommand`, write and call processor for it.
|
||||
|
||||
### Publish new `npm` release
|
||||
|
||||
#### Release branches
|
||||
|
||||
`chromium-bidi` maintains release branches corresponding to Chrome releases. The
|
||||
branches are named using the following pattern: `releases/m$MAJOR_VERSION`.
|
||||
|
||||
The new release branch is created as soon a new major browser version is
|
||||
published by the
|
||||
[update-browser-version](https://github.com/GoogleChromeLabs/chromium-bidi/blob/main/.github/workflows/update-browser-version.yml)
|
||||
job:
|
||||
|
||||
- the PR created by this job should be marked as a feature and it should cause the
|
||||
major package version to be bumped.
|
||||
- once the browser version is bumped, the commit preceding the version bump
|
||||
should be used to create a release branch for major version pinned before the bump.
|
||||
|
||||
Changes that need to be cherry-picked into the release branch should be marked
|
||||
as patches. Either major or minor version bumps are not allowed on the release
|
||||
branch.
|
||||
|
||||
Example workflow:
|
||||
|
||||
```mermaid
|
||||
gitGraph
|
||||
commit id: "feat: featA"
|
||||
commit id: "release: v0.5.0"
|
||||
branch release/m129
|
||||
checkout main
|
||||
commit id: "feat: roll Chrome to M130 from 129"
|
||||
commit id: "release: v0.6.0"
|
||||
commit id: "fix: for m129"
|
||||
checkout release/m129
|
||||
cherry-pick id: "fix: for m129"
|
||||
commit id: "release: v0.5.1 "
|
||||
```
|
||||
|
||||
Currently, the releases from release branches are not automated.
|
||||
|
||||
#### Automatic release
|
||||
|
||||
We use [release-please](https://github.com/googleapis/release-please) to automate releases. When a release should be done, check for the release PR in our [pull requests](https://github.com/GoogleChromeLabs/chromium-bidi/pulls) and merge it.
|
||||
|
||||
#### Manual release
|
||||
|
||||
1. Dry-run
|
||||
|
||||
```sh
|
||||
npm publish --dry-run
|
||||
```
|
||||
|
||||
1. Open a PR bumping the chromium-bidi version number in `package.json` for review:
|
||||
|
||||
```sh
|
||||
npm version patch -m 'chore: Release v%s' --no-git-tag-version
|
||||
```
|
||||
|
||||
Instead of `patch`, use `minor` or `major` [as needed](https://semver.org/).
|
||||
|
||||
1. After the PR is reviewed, [create a GitHub release](https://github.com/GoogleChromeLabs/chromium-bidi/releases/new) specifying the tag name matching the bumped version.
|
||||
Our CI then automatically publishes the new release to npm based on the tag name.
|
||||
|
||||
#### Roll into Chromium
|
||||
|
||||
This section assumes you already have a Chromium set-up locally,
|
||||
and knowledge on [how to submit changes to the repo](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/contributing.md).
|
||||
Otherwise submit an issue for a project maintainer.
|
||||
|
||||
1. Create a new branch in chromium `src/`.
|
||||
2. Update the mapper version:
|
||||
|
||||
```shell
|
||||
third_party/bidimapper/roll_bidimapper
|
||||
```
|
||||
|
||||
3. Submit a CL with bug `42323268` ([link](https://crbug.com/42323268)).
|
||||
|
||||
4. [Regenerate WPT expectations or baselines](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/testing/run_web_platform_tests.md#test-expectations-and-baselines):
|
||||
|
||||
4.1. Trigger a build and test run:
|
||||
|
||||
```shell
|
||||
third_party/blink/tools/blink_tool.py rebaseline-cl --build="linux-blink-rel" --verbose
|
||||
```
|
||||
|
||||
4.2. Once the test completes on the builder, rerun that command to update the
|
||||
baselines. Update test expectations if there are any crashes or timeouts.
|
||||
Commit the changes (if any), and upload the new patch to the CL.
|
||||
|
||||
5. Add appropriate reviewers or comment the CL link on the PR.
|
||||
|
||||
## Adding new command
|
||||
|
||||
Want to add a shiny new command to WebDriver BiDi for Chromium? Here's the playbook:
|
||||
|
||||
### Prerequisites
|
||||
|
||||
#### Specification
|
||||
|
||||
The WebDriver BiDi [module](https://w3c.github.io/webdriver-bidi/#protocol-modules), [command](https://w3c.github.io/webdriver-bidi/#commands), or [event](https://w3c.github.io/webdriver-bidi/#events) must be specified either in the [WebDriver BiDi specification](https://w3c.github.io/webdriver-bidi) or as an extension in a separate specification (e.g., the [Permissions specification](https://www.w3.org/TR/permissions/#automation-webdriver-bidi)). The specification should include the command's type definitions in valid [CDDL](https://datatracker.ietf.org/doc/html/rfc8610) format.
|
||||
|
||||
#### WPT wdspec tests
|
||||
|
||||
You'll need tests to prove your command works as expected. These tests should be written using [WPT wdspec](https://web-platform-tests.org/writing-tests/wdspec.html) and submitted along with the spec itself. Don't forget to roll the WPT repo into the Mapper ([dependabot](https://github.com/GoogleChromeLabs/chromium-bidi/network/updates/10663151/jobs) can help, and you will likely need to tweak some expectations afterward).
|
||||
|
||||
#### CDP implementation
|
||||
|
||||
Make sure Chromium already has the CDP methods your command will rely on.
|
||||
|
||||
### Update CDDL types
|
||||
|
||||
1. If your command lives in a separate spec, add a link to that spec in the ["Build WebDriverBiDi types"](https://github.com/GoogleChromeLabs/chromium-bidi/blob/0f971303281aba1910786035facc5eb54a833232/.github/workflows/update-bidi-types.yml#L27) GitHub action (check out the ["bluetooth" pull request](https://github.com/GoogleChromeLabs/chromium-bidi/pull/2585) for an example).
|
||||
2. Run the ["Update WebdriverBiDi types"](https://github.com/GoogleChromeLabs/chromium-bidi/actions/workflows/update-bidi-types.yml) GitHub action. This will create a pull request with your new types. If you added a command, this PR will have a failing check complaining about a non-exhaustive switch statement:
|
||||
> error: Switch is not exhaustive. Cases not matched: "{NEW_COMMAND_NAME}" @typescript-eslint/switch-exhaustiveness-check
|
||||
3. Update the created pull request. Add your new command to [`CommandProcessor.#processCommand`](https://github.com/GoogleChromeLabs/chromium-bidi/blob/0f971303281aba1910786035facc5eb54a833232/src/bidiMapper/CommandProcessor.ts#L140). For now, just have it throw an UnknownErrorException (see the [example](https://github.com/GoogleChromeLabs/chromium-bidi/pull/2647/files#diff-7f06ce28b8514fd75b759d217bff9f5a471b657bcf78bd893cc291c7945c1cacR169) for how to do this).
|
||||
|
||||
```typescript
|
||||
case '{NEW_COMMAND_NAME}':
|
||||
throw new UnknownErrorException(
|
||||
`Method ${command.method} is not implemented.`,
|
||||
);
|
||||
```
|
||||
|
||||
4. Merge it! Standard PR process: create, review, merge.
|
||||
|
||||
### Implement the new command
|
||||
|
||||
[`CommandProcessor.#processCommand`](https://github.com/GoogleChromeLabs/chromium-bidi/blob/0f971303281aba1910786035facc5eb54a833232/src/bidiMapper/CommandProcessor.ts#L140) handles parsing parameters and running your command.
|
||||
|
||||
#### (only if the new command has non-empty parameters) parse command parameters
|
||||
|
||||
If your command has parameters, update the [`BidiCommandParameterParser`](https://github.com/GoogleChromeLabs/chromium-bidi/blob/0f971303281aba1910786035facc5eb54a833232/src/bidiMapper/BidiParser.ts#L31) and implement the parsing logic in [`BidiNoOpParser`](https://github.com/GoogleChromeLabs/chromium-bidi/blob/0f971303281aba1910786035facc5eb54a833232/src/bidiMapper/BidiNoOpParser.ts#L209), [`BidiParser`](https://github.com/GoogleChromeLabs/chromium-bidi/blob/0f971303281aba1910786035facc5eb54a833232/src/bidiTab/BidiParser.ts#L182) and [`protocol-parser`](https://github.com/GoogleChromeLabs/chromium-bidi/blob/0f971303281aba1910786035facc5eb54a833232/src/protocol-parser/protocol-parser.ts#L386). Look at the [example](https://github.com/GoogleChromeLabs/chromium-bidi/blob/0f971303281aba1910786035facc5eb54a833232/src/bidiMapper/BidiParser.ts#L97) for guidance.
|
||||
|
||||
#### Implement the new command
|
||||
|
||||
Write the core logic for your command in the appropriate domain processor. Again, [example](https://github.com/GoogleChromeLabs/chromium-bidi/blob/0f971303281aba1910786035facc5eb54a833232/src/bidiMapper/modules/permissions/PermissionsProcessor.ts#L32) is your friend.
|
||||
|
||||
#### Call the module processor's method
|
||||
|
||||
Call your new module processor method from `CommandProcessor.#processCommand`, passing in the parsed parameters. [Example](https://github.com/GoogleChromeLabs/chromium-bidi/blob/0f971303281aba1910786035facc5eb54a833232/src/bidiMapper/CommandProcessor.ts#L313).
|
||||
|
||||
#### Add e2e tests
|
||||
|
||||
Write end-to-end tests for your command, including the happy path and any edge cases that might trip things up. Focus on testing the code in the mapper.
|
||||
|
||||
#### Update WPT expectations
|
||||
|
||||
Your WPT tests will probably fail now.
|
||||
|
||||
> Tests with unexpected results: PASS [expected FAIL] ...
|
||||
|
||||
Update the expectations in a draft PR with the "update-expectations" label. This will trigger an automated PR "test: update the expectations for PR" that you'll need to merge to your branch.
|
||||
|
||||
#### Merge it!
|
||||
|
||||
Mark your PR as ready, get it reviewed, and merge it in.
|
||||
|
||||
### Roll in ChromeDriver
|
||||
|
||||
This bit usually involves the core devs:
|
||||
|
||||
1. [Release](#automatic-release) your changes.
|
||||
2. [Roll the changes into ChromeDriver](#roll-into-chromium).
|
||||
56
node_modules/chromium-bidi/lib/THIRD_PARTY_NOTICES
generated
vendored
Normal file
56
node_modules/chromium-bidi/lib/THIRD_PARTY_NOTICES
generated
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
Name: mitt
|
||||
URL: https://github.com/developit/mitt
|
||||
Version: 3.0.1
|
||||
License: MIT
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 Jason Miller
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
|
||||
-------------------- DEPENDENCY DIVIDER --------------------
|
||||
|
||||
Name: zod
|
||||
URL: https://zod.dev
|
||||
Version: 3.25.76
|
||||
License: MIT
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Colin McDonnell
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
29
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiMapper.d.ts
generated
vendored
Normal file
29
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiMapper.d.ts
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright 2022 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/**
|
||||
* @fileoverview The entry point to the BiDi Mapper namespace.
|
||||
* Other modules should only access exports defined in this file.
|
||||
* XXX: Add ESlint rule for this (https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-restricted-paths.md)
|
||||
*/
|
||||
export { BidiServer } from './BidiServer.js';
|
||||
export { MapperOptions } from './MapperOptions.js';
|
||||
export type { CdpConnection } from '../cdp/CdpConnection.js';
|
||||
export type { CdpClient } from '../cdp/CdpClient.js';
|
||||
export { EventEmitter } from '../utils/EventEmitter.js';
|
||||
export type { BidiTransport } from './BidiTransport.js';
|
||||
export { OutgoingMessage } from './OutgoingMessage.js';
|
||||
export type { BidiCommandParameterParser } from './BidiParser.js';
|
||||
31
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiMapper.js
generated
vendored
Normal file
31
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiMapper.js
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2022 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.OutgoingMessage = exports.EventEmitter = exports.BidiServer = void 0;
|
||||
/**
|
||||
* @fileoverview The entry point to the BiDi Mapper namespace.
|
||||
* Other modules should only access exports defined in this file.
|
||||
* XXX: Add ESlint rule for this (https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-restricted-paths.md)
|
||||
*/
|
||||
var BidiServer_js_1 = require("./BidiServer.js");
|
||||
Object.defineProperty(exports, "BidiServer", { enumerable: true, get: function () { return BidiServer_js_1.BidiServer; } });
|
||||
var EventEmitter_js_1 = require("../utils/EventEmitter.js");
|
||||
Object.defineProperty(exports, "EventEmitter", { enumerable: true, get: function () { return EventEmitter_js_1.EventEmitter; } });
|
||||
var OutgoingMessage_js_1 = require("./OutgoingMessage.js");
|
||||
Object.defineProperty(exports, "OutgoingMessage", { enumerable: true, get: function () { return OutgoingMessage_js_1.OutgoingMessage; } });
|
||||
//# sourceMappingURL=BidiMapper.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiMapper.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiMapper.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"BidiMapper.js","sourceRoot":"","sources":["../../../src/bidiMapper/BidiMapper.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAEH;;;;GAIG;AACH,iDAA2C;AAAnC,2GAAA,UAAU,OAAA;AAIlB,4DAAsD;AAA9C,+GAAA,YAAY,OAAA;AAEpB,2DAAqD;AAA7C,qHAAA,eAAe,OAAA"}
|
||||
86
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiNoOpParser.d.ts
generated
vendored
Normal file
86
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiNoOpParser.d.ts
generated
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { Browser, BrowsingContext, Cdp, Emulation, Input, Network, Script, Session, Storage, Permissions, Bluetooth, WebExtension } from '../protocol/protocol.js';
|
||||
import type { BidiCommandParameterParser } from './BidiParser.js';
|
||||
export declare class BidiNoOpParser implements BidiCommandParameterParser {
|
||||
parseDisableSimulationParameters(params: unknown): Bluetooth.DisableSimulationParameters;
|
||||
parseHandleRequestDevicePromptParams(params: unknown): Bluetooth.HandleRequestDevicePromptParameters;
|
||||
parseSimulateAdapterParameters(params: unknown): Bluetooth.SimulateAdapterParameters;
|
||||
parseSimulateAdvertisementParameters(params: unknown): Bluetooth.SimulateAdvertisementParameters;
|
||||
parseSimulateCharacteristicParameters(params: unknown): Bluetooth.SimulateCharacteristicParameters;
|
||||
parseSimulateCharacteristicResponseParameters(params: unknown): Bluetooth.SimulateCharacteristicResponseParameters;
|
||||
parseSimulateDescriptorParameters(params: unknown): Bluetooth.SimulateDescriptorParameters;
|
||||
parseSimulateDescriptorResponseParameters(params: unknown): Bluetooth.SimulateDescriptorResponseParameters;
|
||||
parseSimulateGattConnectionResponseParameters(params: unknown): Bluetooth.SimulateGattConnectionResponseParameters;
|
||||
parseSimulateGattDisconnectionParameters(params: unknown): Bluetooth.SimulateGattDisconnectionParameters;
|
||||
parseSimulatePreconnectedPeripheralParameters(params: unknown): Bluetooth.SimulatePreconnectedPeripheralParameters;
|
||||
parseSimulateServiceParameters(params: unknown): Bluetooth.SimulateServiceParameters;
|
||||
parseCreateUserContextParameters(params: unknown): Browser.CreateUserContextParameters;
|
||||
parseRemoveUserContextParameters(params: unknown): Browser.RemoveUserContextParameters;
|
||||
parseSetClientWindowStateParameters(params: unknown): Browser.SetClientWindowStateParameters;
|
||||
parseActivateParams(params: unknown): BrowsingContext.ActivateParameters;
|
||||
parseCaptureScreenshotParams(params: unknown): BrowsingContext.CaptureScreenshotParameters;
|
||||
parseCloseParams(params: unknown): BrowsingContext.CloseParameters;
|
||||
parseCreateParams(params: unknown): BrowsingContext.CreateParameters;
|
||||
parseGetTreeParams(params: unknown): BrowsingContext.GetTreeParameters;
|
||||
parseHandleUserPromptParams(params: unknown): BrowsingContext.HandleUserPromptParameters;
|
||||
parseLocateNodesParams(params: unknown): BrowsingContext.LocateNodesParameters;
|
||||
parseNavigateParams(params: unknown): BrowsingContext.NavigateParameters;
|
||||
parsePrintParams(params: unknown): BrowsingContext.PrintParameters;
|
||||
parseReloadParams(params: unknown): BrowsingContext.ReloadParameters;
|
||||
parseSetViewportParams(params: unknown): BrowsingContext.SetViewportParameters;
|
||||
parseTraverseHistoryParams(params: unknown): BrowsingContext.TraverseHistoryParameters;
|
||||
parseGetSessionParams(params: unknown): Cdp.GetSessionParameters;
|
||||
parseResolveRealmParams(params: unknown): Cdp.ResolveRealmParameters;
|
||||
parseSendCommandParams(params: unknown): Cdp.SendCommandParameters;
|
||||
parseSetForcedColorsModeThemeOverrideParams(params: unknown): Emulation.SetForcedColorsModeThemeOverrideParameters;
|
||||
parseSetGeolocationOverrideParams(params: unknown): Emulation.SetGeolocationOverrideParameters;
|
||||
parseSetLocaleOverrideParams(params: unknown): Emulation.SetLocaleOverrideParameters;
|
||||
parseSetScreenOrientationOverrideParams(params: unknown): Emulation.SetScreenOrientationOverrideParameters;
|
||||
parseSetScriptingEnabledParams(params: unknown): Emulation.SetScriptingEnabledParameters;
|
||||
parseSetTimezoneOverrideParams(params: unknown): Emulation.SetTimezoneOverrideParameters;
|
||||
parseAddPreloadScriptParams(params: unknown): Script.AddPreloadScriptParameters;
|
||||
parseCallFunctionParams(params: unknown): Script.CallFunctionParameters;
|
||||
parseDisownParams(params: unknown): Script.DisownParameters;
|
||||
parseEvaluateParams(params: unknown): Script.EvaluateParameters;
|
||||
parseGetRealmsParams(params: unknown): Script.GetRealmsParameters;
|
||||
parseRemovePreloadScriptParams(params: unknown): Script.RemovePreloadScriptParameters;
|
||||
parsePerformActionsParams(params: unknown): Input.PerformActionsParameters;
|
||||
parseReleaseActionsParams(params: unknown): Input.ReleaseActionsParameters;
|
||||
parseSetFilesParams(params: unknown): Input.SetFilesParameters;
|
||||
parseAddDataCollectorParams(params: unknown): Network.AddDataCollectorParameters;
|
||||
parseAddInterceptParams(params: unknown): Network.AddInterceptParameters;
|
||||
parseContinueRequestParams(params: unknown): Network.ContinueRequestParameters;
|
||||
parseContinueResponseParams(params: unknown): Network.ContinueResponseParameters;
|
||||
parseContinueWithAuthParams(params: unknown): Network.ContinueWithAuthParameters;
|
||||
parseDisownDataParams(params: unknown): Network.DisownDataParameters;
|
||||
parseFailRequestParams(params: unknown): Network.FailRequestParameters;
|
||||
parseGetDataParams(params: unknown): Network.GetDataParameters;
|
||||
parseProvideResponseParams(params: unknown): Network.ProvideResponseParameters;
|
||||
parseRemoveDataCollectorParams(params: unknown): Network.RemoveDataCollectorParameters;
|
||||
parseRemoveInterceptParams(params: unknown): Network.RemoveInterceptParameters;
|
||||
parseSetCacheBehaviorParams(params: unknown): Network.SetCacheBehaviorParameters;
|
||||
parseSetExtraHeadersParams(params: unknown): Network.SetExtraHeadersParameters;
|
||||
parseSetPermissionsParams(params: unknown): Permissions.SetPermissionParameters;
|
||||
parseSubscribeParams(params: unknown): Session.SubscriptionRequest;
|
||||
parseUnsubscribeParams(params: unknown): Session.UnsubscribeByAttributesRequest | Session.UnsubscribeByIdRequest;
|
||||
parseDeleteCookiesParams(params: unknown): Storage.DeleteCookiesParameters;
|
||||
parseGetCookiesParams(params: unknown): Storage.GetCookiesParameters;
|
||||
parseSetCookieParams(params: unknown): Storage.SetCookieParameters;
|
||||
parseInstallParams(params: unknown): WebExtension.InstallParameters;
|
||||
parseUninstallParams(params: unknown): WebExtension.UninstallParameters;
|
||||
}
|
||||
256
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiNoOpParser.js
generated
vendored
Normal file
256
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiNoOpParser.js
generated
vendored
Normal file
@@ -0,0 +1,256 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.BidiNoOpParser = void 0;
|
||||
class BidiNoOpParser {
|
||||
// Bluetooth module
|
||||
// keep-sorted start block=yes
|
||||
parseDisableSimulationParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseHandleRequestDevicePromptParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSimulateAdapterParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseSimulateAdvertisementParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseSimulateCharacteristicParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseSimulateCharacteristicResponseParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseSimulateDescriptorParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseSimulateDescriptorResponseParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseSimulateGattConnectionResponseParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseSimulateGattDisconnectionParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseSimulatePreconnectedPeripheralParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseSimulateServiceParameters(params) {
|
||||
return params;
|
||||
}
|
||||
// keep-sorted end
|
||||
// Browser module
|
||||
// keep-sorted start block=yes
|
||||
parseCreateUserContextParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseRemoveUserContextParameters(params) {
|
||||
return params;
|
||||
}
|
||||
parseSetClientWindowStateParameters(params) {
|
||||
return params;
|
||||
}
|
||||
// keep-sorted end
|
||||
// Browsing Context module
|
||||
// keep-sorted start block=yes
|
||||
parseActivateParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseCaptureScreenshotParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseCloseParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseCreateParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseGetTreeParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseHandleUserPromptParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseLocateNodesParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseNavigateParams(params) {
|
||||
return params;
|
||||
}
|
||||
parsePrintParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseReloadParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSetViewportParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseTraverseHistoryParams(params) {
|
||||
return params;
|
||||
}
|
||||
// keep-sorted end
|
||||
// CDP module
|
||||
// keep-sorted start block=yes
|
||||
parseGetSessionParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseResolveRealmParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSendCommandParams(params) {
|
||||
return params;
|
||||
}
|
||||
// keep-sorted end
|
||||
// Emulation module
|
||||
// keep-sorted start block=yes
|
||||
parseSetForcedColorsModeThemeOverrideParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSetGeolocationOverrideParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSetLocaleOverrideParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSetScreenOrientationOverrideParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSetScriptingEnabledParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSetTimezoneOverrideParams(params) {
|
||||
return params;
|
||||
}
|
||||
// keep-sorted end
|
||||
// Script module
|
||||
// keep-sorted start block=yes
|
||||
parseAddPreloadScriptParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseCallFunctionParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseDisownParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseEvaluateParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseGetRealmsParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseRemovePreloadScriptParams(params) {
|
||||
return params;
|
||||
}
|
||||
// keep-sorted end
|
||||
// Input module
|
||||
// keep-sorted start block=yes
|
||||
parsePerformActionsParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseReleaseActionsParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSetFilesParams(params) {
|
||||
return params;
|
||||
}
|
||||
// keep-sorted end
|
||||
// Network module
|
||||
// keep-sorted start block=yes
|
||||
parseAddDataCollectorParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseAddInterceptParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseContinueRequestParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseContinueResponseParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseContinueWithAuthParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseDisownDataParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseFailRequestParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseGetDataParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseProvideResponseParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseRemoveDataCollectorParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseRemoveInterceptParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSetCacheBehaviorParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSetExtraHeadersParams(params) {
|
||||
return params;
|
||||
}
|
||||
// keep-sorted end
|
||||
// Permissions module
|
||||
// keep-sorted start block=yes
|
||||
parseSetPermissionsParams(params) {
|
||||
return params;
|
||||
}
|
||||
// keep-sorted end
|
||||
// Session module
|
||||
// keep-sorted start block=yes
|
||||
parseSubscribeParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseUnsubscribeParams(params) {
|
||||
return params;
|
||||
}
|
||||
// keep-sorted end
|
||||
// Storage module
|
||||
// keep-sorted start block=yes
|
||||
parseDeleteCookiesParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseGetCookiesParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseSetCookieParams(params) {
|
||||
return params;
|
||||
}
|
||||
// keep-sorted end
|
||||
// WebExtenstion module
|
||||
// keep-sorted start block=yes
|
||||
parseInstallParams(params) {
|
||||
return params;
|
||||
}
|
||||
parseUninstallParams(params) {
|
||||
return params;
|
||||
}
|
||||
}
|
||||
exports.BidiNoOpParser = BidiNoOpParser;
|
||||
//# sourceMappingURL=BidiNoOpParser.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiNoOpParser.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiNoOpParser.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"BidiNoOpParser.js","sourceRoot":"","sources":["../../../src/bidiMapper/BidiNoOpParser.ts"],"names":[],"mappings":"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"}
|
||||
85
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiParser.d.ts
generated
vendored
Normal file
85
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiParser.d.ts
generated
vendored
Normal file
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { Bluetooth, Browser, BrowsingContext, Cdp, Emulation, Input, Network, Permissions, Script, Session, Storage, WebExtension } from '../protocol/protocol.js';
|
||||
export interface BidiCommandParameterParser {
|
||||
parseDisableSimulationParameters(params: unknown): Bluetooth.DisableSimulationParameters;
|
||||
parseHandleRequestDevicePromptParams(params: unknown): Bluetooth.HandleRequestDevicePromptParameters;
|
||||
parseSimulateAdapterParameters(params: unknown): Bluetooth.SimulateAdapterParameters;
|
||||
parseSimulateAdvertisementParameters(params: unknown): Bluetooth.SimulateAdvertisementParameters;
|
||||
parseSimulateCharacteristicParameters(params: unknown): Bluetooth.SimulateCharacteristicParameters;
|
||||
parseSimulateCharacteristicResponseParameters(params: unknown): Bluetooth.SimulateCharacteristicResponseParameters;
|
||||
parseSimulateDescriptorParameters(params: unknown): Bluetooth.SimulateDescriptorParameters;
|
||||
parseSimulateDescriptorResponseParameters(params: unknown): Bluetooth.SimulateDescriptorResponseParameters;
|
||||
parseSimulateGattConnectionResponseParameters(params: unknown): Bluetooth.SimulateGattConnectionResponseParameters;
|
||||
parseSimulateGattDisconnectionParameters(params: unknown): Bluetooth.SimulateGattDisconnectionParameters;
|
||||
parseSimulatePreconnectedPeripheralParameters(params: unknown): Bluetooth.SimulatePreconnectedPeripheralParameters;
|
||||
parseSimulateServiceParameters(params: unknown): Bluetooth.SimulateServiceParameters;
|
||||
parseCreateUserContextParameters(params: unknown): Browser.CreateUserContextParameters;
|
||||
parseRemoveUserContextParameters(params: unknown): Browser.RemoveUserContextParameters;
|
||||
parseSetClientWindowStateParameters(params: unknown): Browser.SetClientWindowStateParameters;
|
||||
parseActivateParams(params: unknown): BrowsingContext.ActivateParameters;
|
||||
parseCaptureScreenshotParams(params: unknown): BrowsingContext.CaptureScreenshotParameters;
|
||||
parseCloseParams(params: unknown): BrowsingContext.CloseParameters;
|
||||
parseCreateParams(params: unknown): BrowsingContext.CreateParameters;
|
||||
parseGetTreeParams(params: unknown): BrowsingContext.GetTreeParameters;
|
||||
parseHandleUserPromptParams(params: unknown): BrowsingContext.HandleUserPromptParameters;
|
||||
parseLocateNodesParams(params: unknown): BrowsingContext.LocateNodesParameters;
|
||||
parseNavigateParams(params: unknown): BrowsingContext.NavigateParameters;
|
||||
parsePrintParams(params: unknown): BrowsingContext.PrintParameters;
|
||||
parseReloadParams(params: unknown): BrowsingContext.ReloadParameters;
|
||||
parseSetViewportParams(params: unknown): BrowsingContext.SetViewportParameters;
|
||||
parseTraverseHistoryParams(params: unknown): BrowsingContext.TraverseHistoryParameters;
|
||||
parseGetSessionParams(params: unknown): Cdp.GetSessionParameters;
|
||||
parseResolveRealmParams(params: unknown): Cdp.ResolveRealmParameters;
|
||||
parseSendCommandParams(params: unknown): Cdp.SendCommandParameters;
|
||||
parseSetForcedColorsModeThemeOverrideParams(params: unknown): Emulation.SetForcedColorsModeThemeOverrideParameters;
|
||||
parseSetGeolocationOverrideParams(params: unknown): Emulation.SetGeolocationOverrideParameters;
|
||||
parseSetLocaleOverrideParams(params: unknown): Emulation.SetLocaleOverrideParameters;
|
||||
parseSetScreenOrientationOverrideParams(params: unknown): Emulation.SetScreenOrientationOverrideParameters;
|
||||
parseSetScriptingEnabledParams(params: unknown): Emulation.SetScriptingEnabledParameters;
|
||||
parseSetTimezoneOverrideParams(params: unknown): Emulation.SetTimezoneOverrideParameters;
|
||||
parsePerformActionsParams(params: unknown): Input.PerformActionsParameters;
|
||||
parseReleaseActionsParams(params: unknown): Input.ReleaseActionsParameters;
|
||||
parseSetFilesParams(params: unknown): Input.SetFilesParameters;
|
||||
parseSetPermissionsParams(params: unknown): Permissions.SetPermissionParameters;
|
||||
parseAddDataCollectorParams(params: unknown): Network.AddDataCollectorParameters;
|
||||
parseAddInterceptParams(params: unknown): Network.AddInterceptParameters;
|
||||
parseContinueRequestParams(params: unknown): Network.ContinueRequestParameters;
|
||||
parseContinueResponseParams(params: unknown): Network.ContinueResponseParameters;
|
||||
parseContinueWithAuthParams(params: unknown): Network.ContinueWithAuthParameters;
|
||||
parseDisownDataParams(params: unknown): Network.DisownDataParameters;
|
||||
parseFailRequestParams(params: unknown): Network.FailRequestParameters;
|
||||
parseGetDataParams(params: unknown): Network.GetDataParameters;
|
||||
parseProvideResponseParams(params: unknown): Network.ProvideResponseParameters;
|
||||
parseRemoveDataCollectorParams(params: unknown): Network.RemoveDataCollectorParameters;
|
||||
parseRemoveInterceptParams(params: unknown): Network.RemoveInterceptParameters;
|
||||
parseSetCacheBehaviorParams(params: unknown): Network.SetCacheBehaviorParameters;
|
||||
parseSetExtraHeadersParams(params: unknown): Network.SetExtraHeadersParameters;
|
||||
parseAddPreloadScriptParams(params: unknown): Script.AddPreloadScriptParameters;
|
||||
parseCallFunctionParams(params: unknown): Script.CallFunctionParameters;
|
||||
parseDisownParams(params: unknown): Script.DisownParameters;
|
||||
parseEvaluateParams(params: unknown): Script.EvaluateParameters;
|
||||
parseGetRealmsParams(params: unknown): Script.GetRealmsParameters;
|
||||
parseRemovePreloadScriptParams(params: unknown): Script.RemovePreloadScriptParameters;
|
||||
parseSubscribeParams(params: unknown): Session.SubscriptionRequest;
|
||||
parseUnsubscribeParams(params: unknown): Session.UnsubscribeParameters;
|
||||
parseDeleteCookiesParams(params: unknown): Storage.DeleteCookiesParameters;
|
||||
parseGetCookiesParams(params: unknown): Storage.GetCookiesParameters;
|
||||
parseSetCookieParams(params: unknown): Storage.SetCookieParameters;
|
||||
parseInstallParams(params: unknown): WebExtension.InstallParameters;
|
||||
parseUninstallParams(params: unknown): WebExtension.UninstallParameters;
|
||||
}
|
||||
19
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiParser.js
generated
vendored
Normal file
19
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiParser.js
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=BidiParser.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiParser.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiParser.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"BidiParser.js","sourceRoot":"","sources":["../../../src/bidiMapper/BidiParser.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG"}
|
||||
42
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiServer.d.ts
generated
vendored
Normal file
42
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiServer.d.ts
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* Copyright 2021 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { CdpClient } from '../cdp/CdpClient.js';
|
||||
import type { CdpConnection } from '../cdp/CdpConnection.js';
|
||||
import type { ChromiumBidi } from '../protocol/protocol.js';
|
||||
import { EventEmitter } from '../utils/EventEmitter.js';
|
||||
import { type LoggerFn } from '../utils/log.js';
|
||||
import type { Result } from '../utils/result.js';
|
||||
import type { BidiCommandParameterParser } from './BidiParser.js';
|
||||
import type { BidiTransport } from './BidiTransport.js';
|
||||
import type { OutgoingMessage } from './OutgoingMessage.js';
|
||||
interface BidiServerEvent extends Record<string | symbol, unknown> {
|
||||
message: ChromiumBidi.Command;
|
||||
}
|
||||
export declare class BidiServer extends EventEmitter<BidiServerEvent> {
|
||||
#private;
|
||||
private constructor();
|
||||
/**
|
||||
* Creates and starts BiDi Mapper instance.
|
||||
*/
|
||||
static createAndStart(bidiTransport: BidiTransport, cdpConnection: CdpConnection, browserCdpClient: CdpClient, selfTargetId: string, parser?: BidiCommandParameterParser, logger?: LoggerFn): Promise<BidiServer>;
|
||||
/**
|
||||
* Sends BiDi message.
|
||||
*/
|
||||
emitOutgoingMessage(messageEntry: Promise<Result<OutgoingMessage>>, event: string): void;
|
||||
close(): void;
|
||||
}
|
||||
export {};
|
||||
149
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiServer.js
generated
vendored
Normal file
149
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiServer.js
generated
vendored
Normal file
@@ -0,0 +1,149 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2021 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.BidiServer = void 0;
|
||||
const EventEmitter_js_1 = require("../utils/EventEmitter.js");
|
||||
const log_js_1 = require("../utils/log.js");
|
||||
const ProcessingQueue_js_1 = require("../utils/ProcessingQueue.js");
|
||||
const CommandProcessor_js_1 = require("./CommandProcessor.js");
|
||||
const BluetoothProcessor_js_1 = require("./modules/bluetooth/BluetoothProcessor.js");
|
||||
const ContextConfigStorage_js_1 = require("./modules/browser/ContextConfigStorage.js");
|
||||
const UserContextStorage_js_1 = require("./modules/browser/UserContextStorage.js");
|
||||
const CdpTargetManager_js_1 = require("./modules/cdp/CdpTargetManager.js");
|
||||
const BrowsingContextStorage_js_1 = require("./modules/context/BrowsingContextStorage.js");
|
||||
const NetworkStorage_js_1 = require("./modules/network/NetworkStorage.js");
|
||||
const PreloadScriptStorage_js_1 = require("./modules/script/PreloadScriptStorage.js");
|
||||
const RealmStorage_js_1 = require("./modules/script/RealmStorage.js");
|
||||
const EventManager_js_1 = require("./modules/session/EventManager.js");
|
||||
class BidiServer extends EventEmitter_js_1.EventEmitter {
|
||||
#messageQueue;
|
||||
#transport;
|
||||
#commandProcessor;
|
||||
#eventManager;
|
||||
#browsingContextStorage = new BrowsingContextStorage_js_1.BrowsingContextStorage();
|
||||
#realmStorage = new RealmStorage_js_1.RealmStorage();
|
||||
#preloadScriptStorage = new PreloadScriptStorage_js_1.PreloadScriptStorage();
|
||||
#bluetoothProcessor;
|
||||
#logger;
|
||||
#handleIncomingMessage = (message) => {
|
||||
void this.#commandProcessor.processCommand(message).catch((error) => {
|
||||
this.#logger?.(log_js_1.LogType.debugError, error);
|
||||
});
|
||||
};
|
||||
#processOutgoingMessage = async (messageEntry) => {
|
||||
const message = messageEntry.message;
|
||||
if (messageEntry.googChannel !== null) {
|
||||
message['goog:channel'] = messageEntry.googChannel;
|
||||
}
|
||||
await this.#transport.sendMessage(message);
|
||||
};
|
||||
constructor(bidiTransport, cdpConnection, browserCdpClient, selfTargetId, defaultUserContextId, parser, logger) {
|
||||
super();
|
||||
this.#logger = logger;
|
||||
this.#messageQueue = new ProcessingQueue_js_1.ProcessingQueue(this.#processOutgoingMessage, this.#logger);
|
||||
this.#transport = bidiTransport;
|
||||
this.#transport.setOnMessage(this.#handleIncomingMessage);
|
||||
const contextConfigStorage = new ContextConfigStorage_js_1.ContextConfigStorage();
|
||||
const userContextStorage = new UserContextStorage_js_1.UserContextStorage(browserCdpClient);
|
||||
this.#eventManager = new EventManager_js_1.EventManager(this.#browsingContextStorage, userContextStorage);
|
||||
const networkStorage = new NetworkStorage_js_1.NetworkStorage(this.#eventManager, this.#browsingContextStorage, browserCdpClient, logger);
|
||||
this.#bluetoothProcessor = new BluetoothProcessor_js_1.BluetoothProcessor(this.#eventManager, this.#browsingContextStorage);
|
||||
this.#commandProcessor = new CommandProcessor_js_1.CommandProcessor(cdpConnection, browserCdpClient, this.#eventManager, this.#browsingContextStorage, this.#realmStorage, this.#preloadScriptStorage, networkStorage, contextConfigStorage, this.#bluetoothProcessor, userContextStorage, parser, async (options) => {
|
||||
// This is required to ignore certificate errors when service worker is fetched.
|
||||
await browserCdpClient.sendCommand('Security.setIgnoreCertificateErrors', {
|
||||
ignore: options.acceptInsecureCerts ?? false,
|
||||
});
|
||||
contextConfigStorage.updateGlobalConfig({
|
||||
acceptInsecureCerts: options.acceptInsecureCerts ?? false,
|
||||
userPromptHandler: options.unhandledPromptBehavior,
|
||||
prerenderingDisabled: options?.['goog:prerenderingDisabled'] ?? false,
|
||||
});
|
||||
new CdpTargetManager_js_1.CdpTargetManager(cdpConnection, browserCdpClient, selfTargetId, this.#eventManager, this.#browsingContextStorage, this.#realmStorage, networkStorage, contextConfigStorage, this.#bluetoothProcessor, this.#preloadScriptStorage, defaultUserContextId, logger);
|
||||
// Needed to get events about new targets.
|
||||
await browserCdpClient.sendCommand('Target.setDiscoverTargets', {
|
||||
discover: true,
|
||||
});
|
||||
// Needed to automatically attach to new targets.
|
||||
await browserCdpClient.sendCommand('Target.setAutoAttach', {
|
||||
autoAttach: true,
|
||||
waitForDebuggerOnStart: true,
|
||||
flatten: true,
|
||||
// Browser session should attach to tab instead of the page, so that
|
||||
// prerendering is not blocked.
|
||||
filter: [
|
||||
{
|
||||
type: 'page',
|
||||
exclude: true,
|
||||
},
|
||||
{},
|
||||
],
|
||||
});
|
||||
await this.#topLevelContextsLoaded();
|
||||
}, this.#logger);
|
||||
this.#eventManager.on("event" /* EventManagerEvents.Event */, ({ message, event }) => {
|
||||
this.emitOutgoingMessage(message, event);
|
||||
});
|
||||
this.#commandProcessor.on("response" /* CommandProcessorEvents.Response */, ({ message, event }) => {
|
||||
this.emitOutgoingMessage(message, event);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Creates and starts BiDi Mapper instance.
|
||||
*/
|
||||
static async createAndStart(bidiTransport, cdpConnection, browserCdpClient, selfTargetId, parser, logger) {
|
||||
// The default context is not exposed in Target.getBrowserContexts but can
|
||||
// be observed via Target.getTargets. To determine the default browser
|
||||
// context, we check which one is mentioned in Target.getTargets and not in
|
||||
// Target.getBrowserContexts.
|
||||
const [{ browserContextIds }, { targetInfos }] = await Promise.all([
|
||||
browserCdpClient.sendCommand('Target.getBrowserContexts'),
|
||||
browserCdpClient.sendCommand('Target.getTargets'),
|
||||
// Required for `Browser.downloadWillBegin` events.
|
||||
browserCdpClient.sendCommand('Browser.setDownloadBehavior', {
|
||||
behavior: 'default',
|
||||
eventsEnabled: true,
|
||||
}),
|
||||
]);
|
||||
let defaultUserContextId = 'default';
|
||||
for (const info of targetInfos) {
|
||||
if (info.browserContextId &&
|
||||
!browserContextIds.includes(info.browserContextId)) {
|
||||
defaultUserContextId = info.browserContextId;
|
||||
break;
|
||||
}
|
||||
}
|
||||
const server = new BidiServer(bidiTransport, cdpConnection, browserCdpClient, selfTargetId, defaultUserContextId, parser, logger);
|
||||
return server;
|
||||
}
|
||||
/**
|
||||
* Sends BiDi message.
|
||||
*/
|
||||
emitOutgoingMessage(messageEntry, event) {
|
||||
this.#messageQueue.add(messageEntry, event);
|
||||
}
|
||||
close() {
|
||||
this.#transport.close();
|
||||
}
|
||||
async #topLevelContextsLoaded() {
|
||||
await Promise.all(this.#browsingContextStorage
|
||||
.getTopLevelContexts()
|
||||
.map((c) => c.lifecycleLoaded()));
|
||||
}
|
||||
}
|
||||
exports.BidiServer = BidiServer;
|
||||
//# sourceMappingURL=BidiServer.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiServer.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiServer.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"BidiServer.js","sourceRoot":"","sources":["../../../src/bidiMapper/BidiServer.ts"],"names":[],"mappings":"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"}
|
||||
22
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiTransport.d.ts
generated
vendored
Normal file
22
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiTransport.d.ts
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Copyright 2022 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { ChromiumBidi } from '../protocol/protocol.js';
|
||||
export interface BidiTransport {
|
||||
setOnMessage: (handler: (message: ChromiumBidi.Command) => Promise<void> | void) => void;
|
||||
sendMessage: (message: ChromiumBidi.Message) => Promise<void> | void;
|
||||
close(): void;
|
||||
}
|
||||
19
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiTransport.js
generated
vendored
Normal file
19
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiTransport.js
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2022 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=BidiTransport.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiTransport.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/BidiTransport.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"BidiTransport.js","sourceRoot":"","sources":["../../../src/bidiMapper/BidiTransport.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG"}
|
||||
48
node_modules/chromium-bidi/lib/cjs/bidiMapper/CommandProcessor.d.ts
generated
vendored
Normal file
48
node_modules/chromium-bidi/lib/cjs/bidiMapper/CommandProcessor.d.ts
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
/**
|
||||
* Copyright 2021 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { CdpClient } from '../cdp/CdpClient.js';
|
||||
import type { CdpConnection } from '../cdp/CdpConnection.js';
|
||||
import { type ChromiumBidi } from '../protocol/protocol.js';
|
||||
import { EventEmitter } from '../utils/EventEmitter.js';
|
||||
import { type LoggerFn } from '../utils/log.js';
|
||||
import type { Result } from '../utils/result.js';
|
||||
import type { BidiCommandParameterParser } from './BidiParser.js';
|
||||
import type { MapperOptions } from './MapperOptions.js';
|
||||
import type { BluetoothProcessor } from './modules/bluetooth/BluetoothProcessor.js';
|
||||
import type { ContextConfigStorage } from './modules/browser/ContextConfigStorage.js';
|
||||
import type { UserContextStorage } from './modules/browser/UserContextStorage.js';
|
||||
import type { BrowsingContextStorage } from './modules/context/BrowsingContextStorage.js';
|
||||
import type { NetworkStorage } from './modules/network/NetworkStorage.js';
|
||||
import type { PreloadScriptStorage } from './modules/script/PreloadScriptStorage.js';
|
||||
import type { RealmStorage } from './modules/script/RealmStorage.js';
|
||||
import type { EventManager } from './modules/session/EventManager.js';
|
||||
import { OutgoingMessage } from './OutgoingMessage.js';
|
||||
export declare const enum CommandProcessorEvents {
|
||||
Response = "response"
|
||||
}
|
||||
interface CommandProcessorEventsMap extends Record<string | symbol, unknown> {
|
||||
[CommandProcessorEvents.Response]: {
|
||||
message: Promise<Result<OutgoingMessage>>;
|
||||
event: string;
|
||||
};
|
||||
}
|
||||
export declare class CommandProcessor extends EventEmitter<CommandProcessorEventsMap> {
|
||||
#private;
|
||||
constructor(cdpConnection: CdpConnection, browserCdpClient: CdpClient, eventManager: EventManager, browsingContextStorage: BrowsingContextStorage, realmStorage: RealmStorage, preloadScriptStorage: PreloadScriptStorage, networkStorage: NetworkStorage, contextConfigStorage: ContextConfigStorage, bluetoothProcessor: BluetoothProcessor, userContextStorage: UserContextStorage, parser: BidiCommandParameterParser | undefined, initConnection: (options: MapperOptions) => Promise<void>, logger?: LoggerFn);
|
||||
processCommand(command: ChromiumBidi.Command): Promise<void>;
|
||||
}
|
||||
export {};
|
||||
315
node_modules/chromium-bidi/lib/cjs/bidiMapper/CommandProcessor.js
generated
vendored
Normal file
315
node_modules/chromium-bidi/lib/cjs/bidiMapper/CommandProcessor.js
generated
vendored
Normal file
@@ -0,0 +1,315 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2021 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CommandProcessor = void 0;
|
||||
const protocol_js_1 = require("../protocol/protocol.js");
|
||||
const EventEmitter_js_1 = require("../utils/EventEmitter.js");
|
||||
const log_js_1 = require("../utils/log.js");
|
||||
const BidiNoOpParser_js_1 = require("./BidiNoOpParser.js");
|
||||
const BrowserProcessor_js_1 = require("./modules/browser/BrowserProcessor.js");
|
||||
const CdpProcessor_js_1 = require("./modules/cdp/CdpProcessor.js");
|
||||
const BrowsingContextProcessor_js_1 = require("./modules/context/BrowsingContextProcessor.js");
|
||||
const EmulationProcessor_js_1 = require("./modules/emulation/EmulationProcessor.js");
|
||||
const InputProcessor_js_1 = require("./modules/input/InputProcessor.js");
|
||||
const NetworkProcessor_js_1 = require("./modules/network/NetworkProcessor.js");
|
||||
const PermissionsProcessor_js_1 = require("./modules/permissions/PermissionsProcessor.js");
|
||||
const ScriptProcessor_js_1 = require("./modules/script/ScriptProcessor.js");
|
||||
const SessionProcessor_js_1 = require("./modules/session/SessionProcessor.js");
|
||||
const StorageProcessor_js_1 = require("./modules/storage/StorageProcessor.js");
|
||||
const WebExtensionProcessor_js_1 = require("./modules/webExtension/WebExtensionProcessor.js");
|
||||
const OutgoingMessage_js_1 = require("./OutgoingMessage.js");
|
||||
class CommandProcessor extends EventEmitter_js_1.EventEmitter {
|
||||
// keep-sorted start
|
||||
#bluetoothProcessor;
|
||||
#browserCdpClient;
|
||||
#browserProcessor;
|
||||
#browsingContextProcessor;
|
||||
#cdpProcessor;
|
||||
#emulationProcessor;
|
||||
#inputProcessor;
|
||||
#networkProcessor;
|
||||
#permissionsProcessor;
|
||||
#scriptProcessor;
|
||||
#sessionProcessor;
|
||||
#storageProcessor;
|
||||
#webExtensionProcessor;
|
||||
// keep-sorted end
|
||||
#parser;
|
||||
#logger;
|
||||
constructor(cdpConnection, browserCdpClient, eventManager, browsingContextStorage, realmStorage, preloadScriptStorage, networkStorage, contextConfigStorage, bluetoothProcessor, userContextStorage, parser = new BidiNoOpParser_js_1.BidiNoOpParser(), initConnection, logger) {
|
||||
super();
|
||||
this.#browserCdpClient = browserCdpClient;
|
||||
this.#parser = parser;
|
||||
this.#logger = logger;
|
||||
this.#bluetoothProcessor = bluetoothProcessor;
|
||||
// keep-sorted start block=yes
|
||||
this.#browserProcessor = new BrowserProcessor_js_1.BrowserProcessor(browserCdpClient, browsingContextStorage, contextConfigStorage, userContextStorage);
|
||||
this.#browsingContextProcessor = new BrowsingContextProcessor_js_1.BrowsingContextProcessor(browserCdpClient, browsingContextStorage, userContextStorage, contextConfigStorage, eventManager);
|
||||
this.#cdpProcessor = new CdpProcessor_js_1.CdpProcessor(browsingContextStorage, realmStorage, cdpConnection, browserCdpClient);
|
||||
this.#emulationProcessor = new EmulationProcessor_js_1.EmulationProcessor(browsingContextStorage, userContextStorage, contextConfigStorage);
|
||||
this.#inputProcessor = new InputProcessor_js_1.InputProcessor(browsingContextStorage);
|
||||
this.#networkProcessor = new NetworkProcessor_js_1.NetworkProcessor(browsingContextStorage, networkStorage, userContextStorage, contextConfigStorage);
|
||||
this.#permissionsProcessor = new PermissionsProcessor_js_1.PermissionsProcessor(browserCdpClient);
|
||||
this.#scriptProcessor = new ScriptProcessor_js_1.ScriptProcessor(eventManager, browsingContextStorage, realmStorage, preloadScriptStorage, userContextStorage, logger);
|
||||
this.#sessionProcessor = new SessionProcessor_js_1.SessionProcessor(eventManager, browserCdpClient, initConnection);
|
||||
this.#storageProcessor = new StorageProcessor_js_1.StorageProcessor(browserCdpClient, browsingContextStorage, logger);
|
||||
this.#webExtensionProcessor = new WebExtensionProcessor_js_1.WebExtensionProcessor(browserCdpClient);
|
||||
// keep-sorted end
|
||||
}
|
||||
async #processCommand(command) {
|
||||
switch (command.method) {
|
||||
// Bluetooth module
|
||||
// keep-sorted start block=yes
|
||||
case 'bluetooth.disableSimulation':
|
||||
return await this.#bluetoothProcessor.disableSimulation(this.#parser.parseDisableSimulationParameters(command.params));
|
||||
case 'bluetooth.handleRequestDevicePrompt':
|
||||
return await this.#bluetoothProcessor.handleRequestDevicePrompt(this.#parser.parseHandleRequestDevicePromptParams(command.params));
|
||||
case 'bluetooth.simulateAdapter':
|
||||
return await this.#bluetoothProcessor.simulateAdapter(this.#parser.parseSimulateAdapterParameters(command.params));
|
||||
case 'bluetooth.simulateAdvertisement':
|
||||
return await this.#bluetoothProcessor.simulateAdvertisement(this.#parser.parseSimulateAdvertisementParameters(command.params));
|
||||
case 'bluetooth.simulateCharacteristic':
|
||||
return await this.#bluetoothProcessor.simulateCharacteristic(this.#parser.parseSimulateCharacteristicParameters(command.params));
|
||||
case 'bluetooth.simulateCharacteristicResponse':
|
||||
return await this.#bluetoothProcessor.simulateCharacteristicResponse(this.#parser.parseSimulateCharacteristicResponseParameters(command.params));
|
||||
case 'bluetooth.simulateDescriptor':
|
||||
return await this.#bluetoothProcessor.simulateDescriptor(this.#parser.parseSimulateDescriptorParameters(command.params));
|
||||
case 'bluetooth.simulateDescriptorResponse':
|
||||
return await this.#bluetoothProcessor.simulateDescriptorResponse(this.#parser.parseSimulateDescriptorResponseParameters(command.params));
|
||||
case 'bluetooth.simulateGattConnectionResponse':
|
||||
return await this.#bluetoothProcessor.simulateGattConnectionResponse(this.#parser.parseSimulateGattConnectionResponseParameters(command.params));
|
||||
case 'bluetooth.simulateGattDisconnection':
|
||||
return await this.#bluetoothProcessor.simulateGattDisconnection(this.#parser.parseSimulateGattDisconnectionParameters(command.params));
|
||||
case 'bluetooth.simulatePreconnectedPeripheral':
|
||||
return await this.#bluetoothProcessor.simulatePreconnectedPeripheral(this.#parser.parseSimulatePreconnectedPeripheralParameters(command.params));
|
||||
case 'bluetooth.simulateService':
|
||||
return await this.#bluetoothProcessor.simulateService(this.#parser.parseSimulateServiceParameters(command.params));
|
||||
// keep-sorted end
|
||||
// Browser module
|
||||
// keep-sorted start block=yes
|
||||
case 'browser.close':
|
||||
return this.#browserProcessor.close();
|
||||
case 'browser.createUserContext':
|
||||
return await this.#browserProcessor.createUserContext(this.#parser.parseCreateUserContextParameters(command.params));
|
||||
case 'browser.getClientWindows':
|
||||
return await this.#browserProcessor.getClientWindows();
|
||||
case 'browser.getUserContexts':
|
||||
return await this.#browserProcessor.getUserContexts();
|
||||
case 'browser.removeUserContext':
|
||||
return await this.#browserProcessor.removeUserContext(this.#parser.parseRemoveUserContextParameters(command.params));
|
||||
case 'browser.setClientWindowState':
|
||||
this.#parser.parseSetClientWindowStateParameters(command.params);
|
||||
throw new protocol_js_1.UnknownErrorException(`Method ${command.method} is not implemented.`);
|
||||
// keep-sorted end
|
||||
// Browsing Context module
|
||||
// keep-sorted start block=yes
|
||||
case 'browsingContext.activate':
|
||||
return await this.#browsingContextProcessor.activate(this.#parser.parseActivateParams(command.params));
|
||||
case 'browsingContext.captureScreenshot':
|
||||
return await this.#browsingContextProcessor.captureScreenshot(this.#parser.parseCaptureScreenshotParams(command.params));
|
||||
case 'browsingContext.close':
|
||||
return await this.#browsingContextProcessor.close(this.#parser.parseCloseParams(command.params));
|
||||
case 'browsingContext.create':
|
||||
return await this.#browsingContextProcessor.create(this.#parser.parseCreateParams(command.params));
|
||||
case 'browsingContext.getTree':
|
||||
return this.#browsingContextProcessor.getTree(this.#parser.parseGetTreeParams(command.params));
|
||||
case 'browsingContext.handleUserPrompt':
|
||||
return await this.#browsingContextProcessor.handleUserPrompt(this.#parser.parseHandleUserPromptParams(command.params));
|
||||
case 'browsingContext.locateNodes':
|
||||
return await this.#browsingContextProcessor.locateNodes(this.#parser.parseLocateNodesParams(command.params));
|
||||
case 'browsingContext.navigate':
|
||||
return await this.#browsingContextProcessor.navigate(this.#parser.parseNavigateParams(command.params));
|
||||
case 'browsingContext.print':
|
||||
return await this.#browsingContextProcessor.print(this.#parser.parsePrintParams(command.params));
|
||||
case 'browsingContext.reload':
|
||||
return await this.#browsingContextProcessor.reload(this.#parser.parseReloadParams(command.params));
|
||||
case 'browsingContext.setViewport':
|
||||
return await this.#browsingContextProcessor.setViewport(this.#parser.parseSetViewportParams(command.params));
|
||||
case 'browsingContext.traverseHistory':
|
||||
return await this.#browsingContextProcessor.traverseHistory(this.#parser.parseTraverseHistoryParams(command.params));
|
||||
// keep-sorted end
|
||||
// CDP module
|
||||
// keep-sorted start block=yes
|
||||
case 'goog:cdp.getSession':
|
||||
return this.#cdpProcessor.getSession(this.#parser.parseGetSessionParams(command.params));
|
||||
case 'goog:cdp.resolveRealm':
|
||||
return this.#cdpProcessor.resolveRealm(this.#parser.parseResolveRealmParams(command.params));
|
||||
case 'goog:cdp.sendCommand':
|
||||
return await this.#cdpProcessor.sendCommand(this.#parser.parseSendCommandParams(command.params));
|
||||
// keep-sorted end
|
||||
// Emulation module
|
||||
// keep-sorted start block=yes
|
||||
case 'emulation.setForcedColorsModeThemeOverride':
|
||||
this.#parser.parseSetForcedColorsModeThemeOverrideParams(command.params);
|
||||
throw new protocol_js_1.UnknownErrorException(`Method ${command.method} is not implemented.`);
|
||||
case 'emulation.setGeolocationOverride':
|
||||
return await this.#emulationProcessor.setGeolocationOverride(this.#parser.parseSetGeolocationOverrideParams(command.params));
|
||||
case 'emulation.setLocaleOverride':
|
||||
return await this.#emulationProcessor.setLocaleOverride(this.#parser.parseSetLocaleOverrideParams(command.params));
|
||||
case 'emulation.setScreenOrientationOverride':
|
||||
return await this.#emulationProcessor.setScreenOrientationOverride(this.#parser.parseSetScreenOrientationOverrideParams(command.params));
|
||||
case 'emulation.setScriptingEnabled':
|
||||
return await this.#emulationProcessor.setScriptingEnabled(this.#parser.parseSetScriptingEnabledParams(command.params));
|
||||
case 'emulation.setTimezoneOverride':
|
||||
return await this.#emulationProcessor.setTimezoneOverride(this.#parser.parseSetTimezoneOverrideParams(command.params));
|
||||
// keep-sorted end
|
||||
// Input module
|
||||
// keep-sorted start block=yes
|
||||
case 'input.performActions':
|
||||
return await this.#inputProcessor.performActions(this.#parser.parsePerformActionsParams(command.params));
|
||||
case 'input.releaseActions':
|
||||
return await this.#inputProcessor.releaseActions(this.#parser.parseReleaseActionsParams(command.params));
|
||||
case 'input.setFiles':
|
||||
return await this.#inputProcessor.setFiles(this.#parser.parseSetFilesParams(command.params));
|
||||
// keep-sorted end
|
||||
// Network module
|
||||
// keep-sorted start block=yes
|
||||
case 'network.addDataCollector':
|
||||
return await this.#networkProcessor.addDataCollector(this.#parser.parseAddDataCollectorParams(command.params));
|
||||
case 'network.addIntercept':
|
||||
return await this.#networkProcessor.addIntercept(this.#parser.parseAddInterceptParams(command.params));
|
||||
case 'network.continueRequest':
|
||||
return await this.#networkProcessor.continueRequest(this.#parser.parseContinueRequestParams(command.params));
|
||||
case 'network.continueResponse':
|
||||
return await this.#networkProcessor.continueResponse(this.#parser.parseContinueResponseParams(command.params));
|
||||
case 'network.continueWithAuth':
|
||||
return await this.#networkProcessor.continueWithAuth(this.#parser.parseContinueWithAuthParams(command.params));
|
||||
case 'network.disownData':
|
||||
return this.#networkProcessor.disownData(this.#parser.parseDisownDataParams(command.params));
|
||||
case 'network.failRequest':
|
||||
return await this.#networkProcessor.failRequest(this.#parser.parseFailRequestParams(command.params));
|
||||
case 'network.getData':
|
||||
return await this.#networkProcessor.getData(this.#parser.parseGetDataParams(command.params));
|
||||
case 'network.provideResponse':
|
||||
return await this.#networkProcessor.provideResponse(this.#parser.parseProvideResponseParams(command.params));
|
||||
case 'network.removeDataCollector':
|
||||
return await this.#networkProcessor.removeDataCollector(this.#parser.parseRemoveDataCollectorParams(command.params));
|
||||
case 'network.removeIntercept':
|
||||
return await this.#networkProcessor.removeIntercept(this.#parser.parseRemoveInterceptParams(command.params));
|
||||
case 'network.setCacheBehavior':
|
||||
return await this.#networkProcessor.setCacheBehavior(this.#parser.parseSetCacheBehaviorParams(command.params));
|
||||
case 'network.setExtraHeaders':
|
||||
return await this.#networkProcessor.setExtraHeaders(this.#parser.parseSetExtraHeadersParams(command.params));
|
||||
// keep-sorted end
|
||||
// Permissions module
|
||||
// keep-sorted start block=yes
|
||||
case 'permissions.setPermission':
|
||||
return await this.#permissionsProcessor.setPermissions(this.#parser.parseSetPermissionsParams(command.params));
|
||||
// keep-sorted end
|
||||
// Script module
|
||||
// keep-sorted start block=yes
|
||||
case 'script.addPreloadScript':
|
||||
return await this.#scriptProcessor.addPreloadScript(this.#parser.parseAddPreloadScriptParams(command.params));
|
||||
case 'script.callFunction':
|
||||
return await this.#scriptProcessor.callFunction(this.#parser.parseCallFunctionParams(this.#processTargetParams(command.params)));
|
||||
case 'script.disown':
|
||||
return await this.#scriptProcessor.disown(this.#parser.parseDisownParams(this.#processTargetParams(command.params)));
|
||||
case 'script.evaluate':
|
||||
return await this.#scriptProcessor.evaluate(this.#parser.parseEvaluateParams(this.#processTargetParams(command.params)));
|
||||
case 'script.getRealms':
|
||||
return this.#scriptProcessor.getRealms(this.#parser.parseGetRealmsParams(command.params));
|
||||
case 'script.removePreloadScript':
|
||||
return await this.#scriptProcessor.removePreloadScript(this.#parser.parseRemovePreloadScriptParams(command.params));
|
||||
// keep-sorted end
|
||||
// Session module
|
||||
// keep-sorted start block=yes
|
||||
case 'session.end':
|
||||
throw new protocol_js_1.UnknownErrorException(`Method ${command.method} is not implemented.`);
|
||||
case 'session.new':
|
||||
return await this.#sessionProcessor.new(command.params);
|
||||
case 'session.status':
|
||||
return this.#sessionProcessor.status();
|
||||
case 'session.subscribe':
|
||||
return await this.#sessionProcessor.subscribe(this.#parser.parseSubscribeParams(command.params), command['goog:channel']);
|
||||
case 'session.unsubscribe':
|
||||
return await this.#sessionProcessor.unsubscribe(this.#parser.parseUnsubscribeParams(command.params), command['goog:channel']);
|
||||
// keep-sorted end
|
||||
// Storage module
|
||||
// keep-sorted start block=yes
|
||||
case 'storage.deleteCookies':
|
||||
return await this.#storageProcessor.deleteCookies(this.#parser.parseDeleteCookiesParams(command.params));
|
||||
case 'storage.getCookies':
|
||||
return await this.#storageProcessor.getCookies(this.#parser.parseGetCookiesParams(command.params));
|
||||
case 'storage.setCookie':
|
||||
return await this.#storageProcessor.setCookie(this.#parser.parseSetCookieParams(command.params));
|
||||
// keep-sorted end
|
||||
// WebExtension module
|
||||
// keep-sorted start block=yes
|
||||
case 'webExtension.install':
|
||||
return await this.#webExtensionProcessor.install(this.#parser.parseInstallParams(command.params));
|
||||
case 'webExtension.uninstall':
|
||||
return await this.#webExtensionProcessor.uninstall(this.#parser.parseUninstallParams(command.params));
|
||||
// keep-sorted end
|
||||
}
|
||||
// Intentionally kept outside the switch statement to ensure that
|
||||
// ESLint @typescript-eslint/switch-exhaustiveness-check triggers if a new
|
||||
// command is added.
|
||||
throw new protocol_js_1.UnknownCommandException(`Unknown command '${command?.method}'.`);
|
||||
}
|
||||
// Workaround for as zod.union always take the first schema
|
||||
// https://github.com/w3c/webdriver-bidi/issues/635
|
||||
#processTargetParams(params) {
|
||||
if (typeof params === 'object' &&
|
||||
params &&
|
||||
'target' in params &&
|
||||
typeof params.target === 'object' &&
|
||||
params.target &&
|
||||
'context' in params.target) {
|
||||
delete params.target['realm'];
|
||||
}
|
||||
return params;
|
||||
}
|
||||
async processCommand(command) {
|
||||
try {
|
||||
const result = await this.#processCommand(command);
|
||||
const response = {
|
||||
type: 'success',
|
||||
id: command.id,
|
||||
result,
|
||||
};
|
||||
this.emit("response" /* CommandProcessorEvents.Response */, {
|
||||
message: OutgoingMessage_js_1.OutgoingMessage.createResolved(response, command['goog:channel']),
|
||||
event: command.method,
|
||||
});
|
||||
}
|
||||
catch (e) {
|
||||
if (e instanceof protocol_js_1.Exception) {
|
||||
this.emit("response" /* CommandProcessorEvents.Response */, {
|
||||
message: OutgoingMessage_js_1.OutgoingMessage.createResolved(e.toErrorResponse(command.id), command['goog:channel']),
|
||||
event: command.method,
|
||||
});
|
||||
}
|
||||
else {
|
||||
const error = e;
|
||||
this.#logger?.(log_js_1.LogType.bidi, error);
|
||||
// Heuristic required for processing cases when a browsing context is gone
|
||||
// during the command processing, e.g. like in test
|
||||
// `test_input_keyDown_closes_browsing_context`.
|
||||
const errorException = this.#browserCdpClient.isCloseError(e)
|
||||
? new protocol_js_1.NoSuchFrameException(`Browsing context is gone`)
|
||||
: new protocol_js_1.UnknownErrorException(error.message, error.stack);
|
||||
this.emit("response" /* CommandProcessorEvents.Response */, {
|
||||
message: OutgoingMessage_js_1.OutgoingMessage.createResolved(errorException.toErrorResponse(command.id), command['goog:channel']),
|
||||
event: command.method,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.CommandProcessor = CommandProcessor;
|
||||
//# sourceMappingURL=CommandProcessor.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/CommandProcessor.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/CommandProcessor.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
6
node_modules/chromium-bidi/lib/cjs/bidiMapper/MapperOptions.d.ts
generated
vendored
Normal file
6
node_modules/chromium-bidi/lib/cjs/bidiMapper/MapperOptions.d.ts
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
import type { Session } from '../protocol/generated/webdriver-bidi.js';
|
||||
export interface MapperOptions {
|
||||
acceptInsecureCerts?: boolean;
|
||||
unhandledPromptBehavior?: Session.UserPromptHandler;
|
||||
'goog:prerenderingDisabled'?: boolean;
|
||||
}
|
||||
20
node_modules/chromium-bidi/lib/cjs/bidiMapper/MapperOptions.js
generated
vendored
Normal file
20
node_modules/chromium-bidi/lib/cjs/bidiMapper/MapperOptions.js
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
"use strict";
|
||||
/*
|
||||
* Copyright 2025 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=MapperOptions.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/MapperOptions.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/MapperOptions.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"MapperOptions.js","sourceRoot":"","sources":["../../../src/bidiMapper/MapperOptions.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
||||
27
node_modules/chromium-bidi/lib/cjs/bidiMapper/OutgoingMessage.d.ts
generated
vendored
Normal file
27
node_modules/chromium-bidi/lib/cjs/bidiMapper/OutgoingMessage.d.ts
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Copyright 2021 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { GoogChannel } from '../protocol/chromium-bidi.js';
|
||||
import type { ChromiumBidi } from '../protocol/protocol.js';
|
||||
import type { Result } from '../utils/result.js';
|
||||
export declare class OutgoingMessage {
|
||||
#private;
|
||||
private constructor();
|
||||
static createFromPromise(messagePromise: Promise<Result<ChromiumBidi.Message>>, googChannel: GoogChannel): Promise<Result<OutgoingMessage>>;
|
||||
static createResolved(message: ChromiumBidi.Message, googChannel?: GoogChannel): Promise<Result<OutgoingMessage>>;
|
||||
get message(): ChromiumBidi.Message;
|
||||
get googChannel(): GoogChannel;
|
||||
}
|
||||
52
node_modules/chromium-bidi/lib/cjs/bidiMapper/OutgoingMessage.js
generated
vendored
Normal file
52
node_modules/chromium-bidi/lib/cjs/bidiMapper/OutgoingMessage.js
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2021 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.OutgoingMessage = void 0;
|
||||
class OutgoingMessage {
|
||||
#message;
|
||||
#googChannel;
|
||||
constructor(message, googChannel = null) {
|
||||
this.#message = message;
|
||||
this.#googChannel = googChannel;
|
||||
}
|
||||
static createFromPromise(messagePromise, googChannel) {
|
||||
return messagePromise.then((message) => {
|
||||
if (message.kind === 'success') {
|
||||
return {
|
||||
kind: 'success',
|
||||
value: new OutgoingMessage(message.value, googChannel),
|
||||
};
|
||||
}
|
||||
return message;
|
||||
});
|
||||
}
|
||||
static createResolved(message, googChannel = null) {
|
||||
return Promise.resolve({
|
||||
kind: 'success',
|
||||
value: new OutgoingMessage(message, googChannel),
|
||||
});
|
||||
}
|
||||
get message() {
|
||||
return this.#message;
|
||||
}
|
||||
get googChannel() {
|
||||
return this.#googChannel;
|
||||
}
|
||||
}
|
||||
exports.OutgoingMessage = OutgoingMessage;
|
||||
//# sourceMappingURL=OutgoingMessage.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/OutgoingMessage.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/OutgoingMessage.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"OutgoingMessage.js","sourceRoot":"","sources":["../../../src/bidiMapper/OutgoingMessage.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAMH,MAAa,eAAe;IACjB,QAAQ,CAAuB;IAC/B,YAAY,CAAc;IAEnC,YACE,OAA6B,EAC7B,cAA2B,IAAI;QAE/B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,iBAAiB,CACtB,cAAqD,EACrD,WAAwB;QAExB,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACrC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,IAAI,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC;iBACvD,CAAC;YACJ,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,cAAc,CACnB,OAA6B,EAC7B,cAA2B,IAAI;QAE/B,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,IAAI,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF;AA5CD,0CA4CC"}
|
||||
37
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/bluetooth/BluetoothProcessor.d.ts
generated
vendored
Normal file
37
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/bluetooth/BluetoothProcessor.d.ts
generated
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* Copyright 2024 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import { type Bluetooth, type EmptyResult } from '../../../protocol/protocol.js';
|
||||
import type { CdpTarget } from '../cdp/CdpTarget.js';
|
||||
import type { BrowsingContextStorage } from '../context/BrowsingContextStorage.js';
|
||||
import type { EventManager } from '../session/EventManager.js';
|
||||
export declare class BluetoothProcessor {
|
||||
#private;
|
||||
constructor(eventManager: EventManager, browsingContextStorage: BrowsingContextStorage);
|
||||
simulateAdapter(params: Bluetooth.SimulateAdapterParameters): Promise<EmptyResult>;
|
||||
disableSimulation(params: Bluetooth.DisableSimulationParameters): Promise<EmptyResult>;
|
||||
simulatePreconnectedPeripheral(params: Bluetooth.SimulatePreconnectedPeripheralParameters): Promise<EmptyResult>;
|
||||
simulateAdvertisement(params: Bluetooth.SimulateAdvertisementParameters): Promise<EmptyResult>;
|
||||
simulateCharacteristic(params: Bluetooth.SimulateCharacteristicParameters): Promise<EmptyResult>;
|
||||
simulateCharacteristicResponse(params: Bluetooth.SimulateCharacteristicResponseParameters): Promise<EmptyResult>;
|
||||
simulateDescriptor(params: Bluetooth.SimulateDescriptorParameters): Promise<EmptyResult>;
|
||||
simulateDescriptorResponse(params: Bluetooth.SimulateDescriptorResponseParameters): Promise<EmptyResult>;
|
||||
simulateGattConnectionResponse(params: Bluetooth.SimulateGattConnectionResponseParameters): Promise<EmptyResult>;
|
||||
simulateGattDisconnection(params: Bluetooth.SimulateGattDisconnectionParameters): Promise<EmptyResult>;
|
||||
simulateService(params: Bluetooth.SimulateServiceParameters): Promise<EmptyResult>;
|
||||
onCdpTargetCreated(cdpTarget: CdpTarget): void;
|
||||
handleRequestDevicePrompt(params: Bluetooth.HandleRequestDevicePromptParameters): Promise<EmptyResult>;
|
||||
}
|
||||
411
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/bluetooth/BluetoothProcessor.js
generated
vendored
Normal file
411
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/bluetooth/BluetoothProcessor.js
generated
vendored
Normal file
@@ -0,0 +1,411 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2024 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.BluetoothProcessor = void 0;
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
/** Represents a base Bluetooth GATT item. */
|
||||
class BluetoothGattItem {
|
||||
id;
|
||||
uuid;
|
||||
constructor(id, uuid) {
|
||||
this.id = id;
|
||||
this.uuid = uuid;
|
||||
}
|
||||
}
|
||||
/** Represents a Bluetooth descriptor. */
|
||||
class BluetoothDescriptor extends BluetoothGattItem {
|
||||
characteristic;
|
||||
constructor(id, uuid, characteristic) {
|
||||
super(id, uuid);
|
||||
this.characteristic = characteristic;
|
||||
}
|
||||
}
|
||||
/** Represents a Bluetooth characteristic. */
|
||||
class BluetoothCharacteristic extends BluetoothGattItem {
|
||||
descriptors = new Map();
|
||||
service;
|
||||
constructor(id, uuid, service) {
|
||||
super(id, uuid);
|
||||
this.service = service;
|
||||
}
|
||||
}
|
||||
/** Represents a Bluetooth service. */
|
||||
class BluetoothService extends BluetoothGattItem {
|
||||
characteristics = new Map();
|
||||
device;
|
||||
constructor(id, uuid, device) {
|
||||
super(id, uuid);
|
||||
this.device = device;
|
||||
}
|
||||
}
|
||||
/** Represents a Bluetooth device. */
|
||||
class BluetoothDevice {
|
||||
address;
|
||||
services = new Map();
|
||||
constructor(address) {
|
||||
this.address = address;
|
||||
}
|
||||
}
|
||||
class BluetoothProcessor {
|
||||
#eventManager;
|
||||
#browsingContextStorage;
|
||||
#bluetoothDevices = new Map();
|
||||
// A map from a characteristic id from CDP to its BluetoothCharacteristic object.
|
||||
#bluetoothCharacteristics = new Map();
|
||||
// A map from a descriptor id from CDP to its BluetoothDescriptor object.
|
||||
#bluetoothDescriptors = new Map();
|
||||
constructor(eventManager, browsingContextStorage) {
|
||||
this.#eventManager = eventManager;
|
||||
this.#browsingContextStorage = browsingContextStorage;
|
||||
}
|
||||
#getDevice(address) {
|
||||
const device = this.#bluetoothDevices.get(address);
|
||||
if (!device) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Bluetooth device with address ${address} does not exist`);
|
||||
}
|
||||
return device;
|
||||
}
|
||||
#getService(device, serviceUuid) {
|
||||
const service = device.services.get(serviceUuid);
|
||||
if (!service) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Service with UUID ${serviceUuid} on device ${device.address} does not exist`);
|
||||
}
|
||||
return service;
|
||||
}
|
||||
#getCharacteristic(service, characteristicUuid) {
|
||||
const characteristic = service.characteristics.get(characteristicUuid);
|
||||
if (!characteristic) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Characteristic with UUID ${characteristicUuid} does not exist for service ${service.uuid} on device ${service.device.address}`);
|
||||
}
|
||||
return characteristic;
|
||||
}
|
||||
#getDescriptor(characteristic, descriptorUuid) {
|
||||
const descriptor = characteristic.descriptors.get(descriptorUuid);
|
||||
if (!descriptor) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Descriptor with UUID ${descriptorUuid} does not exist for characteristic ${characteristic.uuid} on service ${characteristic.service.uuid} on device ${characteristic.service.device.address}`);
|
||||
}
|
||||
return descriptor;
|
||||
}
|
||||
async simulateAdapter(params) {
|
||||
if (params.state === undefined) {
|
||||
// The bluetooth.simulateAdapter Command
|
||||
// Step 4.2. If params["state"] does not exist, return error with error code invalid argument.
|
||||
// https://webbluetoothcg.github.io/web-bluetooth/#bluetooth-simulateAdapter-command
|
||||
throw new protocol_js_1.InvalidArgumentException(`Parameter "state" is required for creating a Bluetooth adapter`);
|
||||
}
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
// Bluetooth spec requires overriding the existing adapter (step 6). From the CDP
|
||||
// perspective, we need to disable the emulation first.
|
||||
// https://webbluetoothcg.github.io/web-bluetooth/#bluetooth-simulateAdapter-command
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.disable');
|
||||
this.#bluetoothDevices.clear();
|
||||
this.#bluetoothCharacteristics.clear();
|
||||
this.#bluetoothDescriptors.clear();
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.enable', {
|
||||
state: params.state,
|
||||
leSupported: params.leSupported ?? true,
|
||||
});
|
||||
return {};
|
||||
}
|
||||
async disableSimulation(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.disable');
|
||||
this.#bluetoothDevices.clear();
|
||||
this.#bluetoothCharacteristics.clear();
|
||||
this.#bluetoothDescriptors.clear();
|
||||
return {};
|
||||
}
|
||||
async simulatePreconnectedPeripheral(params) {
|
||||
if (this.#bluetoothDevices.has(params.address)) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Bluetooth device with address ${params.address} already exists`);
|
||||
}
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.simulatePreconnectedPeripheral', {
|
||||
address: params.address,
|
||||
name: params.name,
|
||||
knownServiceUuids: params.knownServiceUuids,
|
||||
manufacturerData: params.manufacturerData,
|
||||
});
|
||||
this.#bluetoothDevices.set(params.address, new BluetoothDevice(params.address));
|
||||
return {};
|
||||
}
|
||||
async simulateAdvertisement(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.simulateAdvertisement', {
|
||||
entry: params.scanEntry,
|
||||
});
|
||||
return {};
|
||||
}
|
||||
async simulateCharacteristic(params) {
|
||||
const device = this.#getDevice(params.address);
|
||||
const service = this.#getService(device, params.serviceUuid);
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
switch (params.type) {
|
||||
case 'add': {
|
||||
if (params.characteristicProperties === undefined) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Parameter "characteristicProperties" is required for adding a Bluetooth characteristic`);
|
||||
}
|
||||
if (service.characteristics.has(params.characteristicUuid)) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Characteristic with UUID ${params.characteristicUuid} already exists`);
|
||||
}
|
||||
const response = await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.addCharacteristic', {
|
||||
serviceId: service.id,
|
||||
characteristicUuid: params.characteristicUuid,
|
||||
properties: params.characteristicProperties,
|
||||
});
|
||||
const characteristic = new BluetoothCharacteristic(response.characteristicId, params.characteristicUuid, service);
|
||||
service.characteristics.set(params.characteristicUuid, characteristic);
|
||||
this.#bluetoothCharacteristics.set(characteristic.id, characteristic);
|
||||
return {};
|
||||
}
|
||||
case 'remove': {
|
||||
if (params.characteristicProperties !== undefined) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Parameter "characteristicProperties" should not be provided for removing a Bluetooth characteristic`);
|
||||
}
|
||||
const characteristic = this.#getCharacteristic(service, params.characteristicUuid);
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.removeCharacteristic', {
|
||||
characteristicId: characteristic.id,
|
||||
});
|
||||
service.characteristics.delete(params.characteristicUuid);
|
||||
this.#bluetoothCharacteristics.delete(characteristic.id);
|
||||
return {};
|
||||
}
|
||||
default:
|
||||
throw new protocol_js_1.InvalidArgumentException(`Parameter "type" of ${params.type} is not supported`);
|
||||
}
|
||||
}
|
||||
async simulateCharacteristicResponse(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
const device = this.#getDevice(params.address);
|
||||
const service = this.#getService(device, params.serviceUuid);
|
||||
const characteristic = this.#getCharacteristic(service, params.characteristicUuid);
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.simulateCharacteristicOperationResponse', {
|
||||
characteristicId: characteristic.id,
|
||||
type: params.type,
|
||||
code: params.code,
|
||||
...(params.data && {
|
||||
data: btoa(String.fromCharCode(...params.data)),
|
||||
}),
|
||||
});
|
||||
return {};
|
||||
}
|
||||
async simulateDescriptor(params) {
|
||||
const device = this.#getDevice(params.address);
|
||||
const service = this.#getService(device, params.serviceUuid);
|
||||
const characteristic = this.#getCharacteristic(service, params.characteristicUuid);
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
switch (params.type) {
|
||||
case 'add': {
|
||||
if (characteristic.descriptors.has(params.descriptorUuid)) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Descriptor with UUID ${params.descriptorUuid} already exists`);
|
||||
}
|
||||
const response = await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.addDescriptor', {
|
||||
characteristicId: characteristic.id,
|
||||
descriptorUuid: params.descriptorUuid,
|
||||
});
|
||||
const descriptor = new BluetoothDescriptor(response.descriptorId, params.descriptorUuid, characteristic);
|
||||
characteristic.descriptors.set(params.descriptorUuid, descriptor);
|
||||
this.#bluetoothDescriptors.set(descriptor.id, descriptor);
|
||||
return {};
|
||||
}
|
||||
case 'remove': {
|
||||
const descriptor = this.#getDescriptor(characteristic, params.descriptorUuid);
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.removeDescriptor', {
|
||||
descriptorId: descriptor.id,
|
||||
});
|
||||
characteristic.descriptors.delete(params.descriptorUuid);
|
||||
this.#bluetoothDescriptors.delete(descriptor.id);
|
||||
return {};
|
||||
}
|
||||
default:
|
||||
throw new protocol_js_1.InvalidArgumentException(`Parameter "type" of ${params.type} is not supported`);
|
||||
}
|
||||
}
|
||||
async simulateDescriptorResponse(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
const device = this.#getDevice(params.address);
|
||||
const service = this.#getService(device, params.serviceUuid);
|
||||
const characteristic = this.#getCharacteristic(service, params.characteristicUuid);
|
||||
const descriptor = this.#getDescriptor(characteristic, params.descriptorUuid);
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.simulateDescriptorOperationResponse', {
|
||||
descriptorId: descriptor.id,
|
||||
type: params.type,
|
||||
code: params.code,
|
||||
...(params.data && {
|
||||
data: btoa(String.fromCharCode(...params.data)),
|
||||
}),
|
||||
});
|
||||
return {};
|
||||
}
|
||||
async simulateGattConnectionResponse(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.simulateGATTOperationResponse', {
|
||||
address: params.address,
|
||||
type: 'connection',
|
||||
code: params.code,
|
||||
});
|
||||
return {};
|
||||
}
|
||||
async simulateGattDisconnection(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.simulateGATTDisconnection', {
|
||||
address: params.address,
|
||||
});
|
||||
return {};
|
||||
}
|
||||
async simulateService(params) {
|
||||
const device = this.#getDevice(params.address);
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
switch (params.type) {
|
||||
case 'add': {
|
||||
if (device.services.has(params.uuid)) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Service with UUID ${params.uuid} already exists`);
|
||||
}
|
||||
const response = await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.addService', {
|
||||
address: params.address,
|
||||
serviceUuid: params.uuid,
|
||||
});
|
||||
device.services.set(params.uuid, new BluetoothService(response.serviceId, params.uuid, device));
|
||||
return {};
|
||||
}
|
||||
case 'remove': {
|
||||
const service = this.#getService(device, params.uuid);
|
||||
await context.cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.removeService', {
|
||||
serviceId: service.id,
|
||||
});
|
||||
device.services.delete(params.uuid);
|
||||
return {};
|
||||
}
|
||||
default:
|
||||
throw new protocol_js_1.InvalidArgumentException(`Parameter "type" of ${params.type} is not supported`);
|
||||
}
|
||||
}
|
||||
onCdpTargetCreated(cdpTarget) {
|
||||
cdpTarget.cdpClient.on('DeviceAccess.deviceRequestPrompted', (event) => {
|
||||
this.#eventManager.registerEvent({
|
||||
type: 'event',
|
||||
method: 'bluetooth.requestDevicePromptUpdated',
|
||||
params: {
|
||||
context: cdpTarget.id,
|
||||
prompt: event.id,
|
||||
devices: event.devices,
|
||||
},
|
||||
}, cdpTarget.id);
|
||||
});
|
||||
cdpTarget.browserCdpClient.on('BluetoothEmulation.gattOperationReceived', async (event) => {
|
||||
switch (event.type) {
|
||||
case 'connection':
|
||||
this.#eventManager.registerEvent({
|
||||
type: 'event',
|
||||
method: 'bluetooth.gattConnectionAttempted',
|
||||
params: {
|
||||
context: cdpTarget.id,
|
||||
address: event.address,
|
||||
},
|
||||
}, cdpTarget.id);
|
||||
return;
|
||||
case 'discovery':
|
||||
// Chromium Web Bluetooth simulation generates this GATT discovery event when
|
||||
// a page attempts to get services for a given Bluetooth device for the first time.
|
||||
// This 'get services' operation is put on hold until a GATT discovery response
|
||||
// is sent to the simulation.
|
||||
// Note: Web Bluetooth automation (see https://webbluetoothcg.github.io/web-bluetooth/#automated-testing)
|
||||
// does not support simulating a GATT discovery response. This is because simulated services, characteristics,
|
||||
// or descriptors are immediately visible to the simulation, meaning it doesn't have a distinct
|
||||
// DISCOVERY state. Therefore, this code simulates a successful GATT discovery
|
||||
// response upon receiving this event.
|
||||
await cdpTarget.browserCdpClient.sendCommand('BluetoothEmulation.simulateGATTOperationResponse', {
|
||||
address: event.address,
|
||||
type: 'discovery',
|
||||
code: 0x0,
|
||||
});
|
||||
}
|
||||
});
|
||||
cdpTarget.browserCdpClient.on('BluetoothEmulation.characteristicOperationReceived', (event) => {
|
||||
if (!this.#bluetoothCharacteristics.has(event.characteristicId)) {
|
||||
return;
|
||||
}
|
||||
let type;
|
||||
if (event.type === 'write') {
|
||||
// write-default-deprecated comes from
|
||||
// https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-writevalue,
|
||||
// which is deprecated so not supported.
|
||||
if (event.writeType === 'write-default-deprecated') {
|
||||
return;
|
||||
}
|
||||
type = event.writeType;
|
||||
}
|
||||
else {
|
||||
type = event.type;
|
||||
}
|
||||
const characteristic = this.#bluetoothCharacteristics.get(event.characteristicId);
|
||||
this.#eventManager.registerEvent({
|
||||
type: 'event',
|
||||
method: 'bluetooth.characteristicEventGenerated',
|
||||
params: {
|
||||
context: cdpTarget.id,
|
||||
address: characteristic.service.device.address,
|
||||
serviceUuid: characteristic.service.uuid,
|
||||
characteristicUuid: characteristic.uuid,
|
||||
type,
|
||||
...(event.data && {
|
||||
data: Array.from(atob(event.data), (c) => c.charCodeAt(0)),
|
||||
}),
|
||||
},
|
||||
}, cdpTarget.id);
|
||||
});
|
||||
cdpTarget.browserCdpClient.on('BluetoothEmulation.descriptorOperationReceived', (event) => {
|
||||
if (!this.#bluetoothDescriptors.has(event.descriptorId)) {
|
||||
return;
|
||||
}
|
||||
const descriptor = this.#bluetoothDescriptors.get(event.descriptorId);
|
||||
this.#eventManager.registerEvent({
|
||||
type: 'event',
|
||||
method: 'bluetooth.descriptorEventGenerated',
|
||||
params: {
|
||||
context: cdpTarget.id,
|
||||
address: descriptor.characteristic.service.device.address,
|
||||
serviceUuid: descriptor.characteristic.service.uuid,
|
||||
characteristicUuid: descriptor.characteristic.uuid,
|
||||
descriptorUuid: descriptor.uuid,
|
||||
type: event.type,
|
||||
...(event.data && {
|
||||
data: Array.from(atob(event.data), (c) => c.charCodeAt(0)),
|
||||
}),
|
||||
},
|
||||
}, cdpTarget.id);
|
||||
});
|
||||
}
|
||||
async handleRequestDevicePrompt(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
if (params.accept) {
|
||||
await context.cdpTarget.cdpClient.sendCommand('DeviceAccess.selectPrompt', {
|
||||
id: params.prompt,
|
||||
deviceId: params.device,
|
||||
});
|
||||
}
|
||||
else {
|
||||
await context.cdpTarget.cdpClient.sendCommand('DeviceAccess.cancelPrompt', {
|
||||
id: params.prompt,
|
||||
});
|
||||
}
|
||||
return {};
|
||||
}
|
||||
}
|
||||
exports.BluetoothProcessor = BluetoothProcessor;
|
||||
//# sourceMappingURL=BluetoothProcessor.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/bluetooth/BluetoothProcessor.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/bluetooth/BluetoothProcessor.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
35
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/BrowserProcessor.d.ts
generated
vendored
Normal file
35
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/BrowserProcessor.d.ts
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import { type Browser, type EmptyResult, type Session } from '../../../protocol/protocol.js';
|
||||
import type { CdpClient } from '../../BidiMapper.js';
|
||||
import type { BrowsingContextStorage } from '../context/BrowsingContextStorage.js';
|
||||
import type { ContextConfigStorage } from './ContextConfigStorage.js';
|
||||
import type { UserContextStorage } from './UserContextStorage.js';
|
||||
export declare class BrowserProcessor {
|
||||
#private;
|
||||
constructor(browserCdpClient: CdpClient, browsingContextStorage: BrowsingContextStorage, configStorage: ContextConfigStorage, userContextStorage: UserContextStorage);
|
||||
close(): EmptyResult;
|
||||
createUserContext(params: Record<string, any>): Promise<Browser.CreateUserContextResult>;
|
||||
removeUserContext(params: Browser.RemoveUserContextParameters): Promise<EmptyResult>;
|
||||
getUserContexts(): Promise<Browser.GetUserContextsResult>;
|
||||
getClientWindows(): Promise<Browser.GetClientWindowsResult>;
|
||||
}
|
||||
/**
|
||||
* Proxy config parse implementation:
|
||||
* https://source.chromium.org/chromium/chromium/src/+/main:net/proxy_resolution/proxy_config.h;drc=743a82d08e59d803c94ee1b8564b8b11dd7b462f;l=107
|
||||
*/
|
||||
export declare function getProxyStr(proxyConfig: Session.ProxyConfiguration): string | undefined;
|
||||
193
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/BrowserProcessor.js
generated
vendored
Normal file
193
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/BrowserProcessor.js
generated
vendored
Normal file
@@ -0,0 +1,193 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.BrowserProcessor = void 0;
|
||||
exports.getProxyStr = getProxyStr;
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
class BrowserProcessor {
|
||||
#browserCdpClient;
|
||||
#browsingContextStorage;
|
||||
#configStorage;
|
||||
#userContextStorage;
|
||||
constructor(browserCdpClient, browsingContextStorage, configStorage, userContextStorage) {
|
||||
this.#browserCdpClient = browserCdpClient;
|
||||
this.#browsingContextStorage = browsingContextStorage;
|
||||
this.#configStorage = configStorage;
|
||||
this.#userContextStorage = userContextStorage;
|
||||
}
|
||||
close() {
|
||||
// Ensure that it is put at the end of the event loop.
|
||||
// This way we send back the response before closing the tab.
|
||||
setTimeout(() => this.#browserCdpClient.sendCommand('Browser.close'), 0);
|
||||
return {};
|
||||
}
|
||||
async createUserContext(params) {
|
||||
// `params` is a record to provide legacy `goog:` parameters. Now as the `proxy`
|
||||
// parameter is specified, we should get rid of `goog:proxyServer` and
|
||||
// `goog:proxyBypassList` and make the params of type
|
||||
// `Browser.CreateUserContextParameters`.
|
||||
const w3cParams = params;
|
||||
if (w3cParams.acceptInsecureCerts !== undefined) {
|
||||
const globalConfig = this.#configStorage.getGlobalConfig();
|
||||
if (w3cParams.acceptInsecureCerts === false &&
|
||||
globalConfig.acceptInsecureCerts === true)
|
||||
// TODO: https://github.com/GoogleChromeLabs/chromium-bidi/issues/3398
|
||||
throw new protocol_js_1.UnknownErrorException(`Cannot set user context's "acceptInsecureCerts" to false, when a capability "acceptInsecureCerts" is set to true`);
|
||||
}
|
||||
const request = {};
|
||||
if (w3cParams.proxy) {
|
||||
const proxyStr = getProxyStr(w3cParams.proxy);
|
||||
if (proxyStr) {
|
||||
request.proxyServer = proxyStr;
|
||||
}
|
||||
if (w3cParams.proxy.noProxy) {
|
||||
request.proxyBypassList = w3cParams.proxy.noProxy.join(',');
|
||||
}
|
||||
}
|
||||
else {
|
||||
// TODO: remove after Puppeteer stops using it.
|
||||
if (params['goog:proxyServer'] !== undefined) {
|
||||
request.proxyServer = params['goog:proxyServer'];
|
||||
}
|
||||
const proxyBypassList = params['goog:proxyBypassList'] ?? undefined;
|
||||
if (proxyBypassList) {
|
||||
request.proxyBypassList = proxyBypassList.join(',');
|
||||
}
|
||||
}
|
||||
const context = await this.#browserCdpClient.sendCommand('Target.createBrowserContext', request);
|
||||
this.#configStorage.updateUserContextConfig(context.browserContextId, {
|
||||
acceptInsecureCerts: params['acceptInsecureCerts'],
|
||||
userPromptHandler: params['unhandledPromptBehavior'],
|
||||
});
|
||||
return {
|
||||
userContext: context.browserContextId,
|
||||
};
|
||||
}
|
||||
async removeUserContext(params) {
|
||||
const userContext = params.userContext;
|
||||
if (userContext === 'default') {
|
||||
throw new protocol_js_1.InvalidArgumentException('`default` user context cannot be removed');
|
||||
}
|
||||
try {
|
||||
await this.#browserCdpClient.sendCommand('Target.disposeBrowserContext', {
|
||||
browserContextId: userContext,
|
||||
});
|
||||
}
|
||||
catch (err) {
|
||||
// https://source.chromium.org/chromium/chromium/src/+/main:content/browser/devtools/protocol/target_handler.cc;l=1424;drc=c686e8f4fd379312469fe018f5c390e9c8f20d0d
|
||||
if (err.message.startsWith('Failed to find context with id')) {
|
||||
throw new protocol_js_1.NoSuchUserContextException(err.message);
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
return {};
|
||||
}
|
||||
async getUserContexts() {
|
||||
return {
|
||||
userContexts: await this.#userContextStorage.getUserContexts(),
|
||||
};
|
||||
}
|
||||
async #getWindowInfo(targetId) {
|
||||
const windowInfo = await this.#browserCdpClient.sendCommand('Browser.getWindowForTarget', { targetId });
|
||||
return {
|
||||
// `active` is not supported in CDP yet.
|
||||
active: false,
|
||||
clientWindow: `${windowInfo.windowId}`,
|
||||
state: windowInfo.bounds.windowState ?? 'normal',
|
||||
height: windowInfo.bounds.height ?? 0,
|
||||
width: windowInfo.bounds.width ?? 0,
|
||||
x: windowInfo.bounds.left ?? 0,
|
||||
y: windowInfo.bounds.top ?? 0,
|
||||
};
|
||||
}
|
||||
async getClientWindows() {
|
||||
const topLevelTargetIds = this.#browsingContextStorage
|
||||
.getTopLevelContexts()
|
||||
.map((b) => b.cdpTarget.id);
|
||||
const clientWindows = await Promise.all(topLevelTargetIds.map(async (targetId) => await this.#getWindowInfo(targetId)));
|
||||
const uniqueClientWindowIds = new Set();
|
||||
const uniqueClientWindows = new Array();
|
||||
// Filter out duplicated client windows.
|
||||
for (const window of clientWindows) {
|
||||
if (!uniqueClientWindowIds.has(window.clientWindow)) {
|
||||
uniqueClientWindowIds.add(window.clientWindow);
|
||||
uniqueClientWindows.push(window);
|
||||
}
|
||||
}
|
||||
return { clientWindows: uniqueClientWindows };
|
||||
}
|
||||
}
|
||||
exports.BrowserProcessor = BrowserProcessor;
|
||||
/**
|
||||
* Proxy config parse implementation:
|
||||
* https://source.chromium.org/chromium/chromium/src/+/main:net/proxy_resolution/proxy_config.h;drc=743a82d08e59d803c94ee1b8564b8b11dd7b462f;l=107
|
||||
*/
|
||||
function getProxyStr(proxyConfig) {
|
||||
if (proxyConfig.proxyType === 'direct' ||
|
||||
proxyConfig.proxyType === 'system') {
|
||||
// These types imply that Chrome should use its default behavior (e.g., direct
|
||||
// connection or system-configured proxy). No specific `proxyServer` string is
|
||||
// needed.
|
||||
return undefined;
|
||||
}
|
||||
if (proxyConfig.proxyType === 'pac') {
|
||||
throw new protocol_js_1.UnsupportedOperationException(`PAC proxy configuration is not supported per user context`);
|
||||
}
|
||||
if (proxyConfig.proxyType === 'autodetect') {
|
||||
throw new protocol_js_1.UnsupportedOperationException(`Autodetect proxy is not supported per user context`);
|
||||
}
|
||||
if (proxyConfig.proxyType === 'manual') {
|
||||
const servers = [];
|
||||
// HTTP Proxy
|
||||
if (proxyConfig.httpProxy !== undefined) {
|
||||
// servers.push(proxyConfig.httpProxy);
|
||||
servers.push(`http=${proxyConfig.httpProxy}`);
|
||||
}
|
||||
// SSL Proxy (uses 'https' scheme)
|
||||
if (proxyConfig.sslProxy !== undefined) {
|
||||
// servers.push(proxyConfig.sslProxy);
|
||||
servers.push(`https=${proxyConfig.sslProxy}`);
|
||||
}
|
||||
// SOCKS Proxy
|
||||
if (proxyConfig.socksProxy !== undefined ||
|
||||
proxyConfig.socksVersion !== undefined) {
|
||||
// socksVersion is mandatory and must be a valid integer if socksProxy is
|
||||
// specified.
|
||||
if (proxyConfig.socksProxy === undefined) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`'socksVersion' cannot be set without 'socksProxy'`);
|
||||
}
|
||||
if (proxyConfig.socksVersion === undefined ||
|
||||
typeof proxyConfig.socksVersion !== 'number' ||
|
||||
!Number.isInteger(proxyConfig.socksVersion) ||
|
||||
proxyConfig.socksVersion < 0 ||
|
||||
proxyConfig.socksVersion > 255) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`'socksVersion' must be between 0 and 255`);
|
||||
}
|
||||
servers.push(`socks=socks${proxyConfig.socksVersion}://${proxyConfig.socksProxy}`);
|
||||
}
|
||||
if (servers.length === 0) {
|
||||
// If 'manual' proxyType is chosen but no specific proxy servers (http, ssl, socks)
|
||||
// are provided, it means no proxy server should be configured.
|
||||
return undefined;
|
||||
}
|
||||
return servers.join(';');
|
||||
}
|
||||
// Unreachable.
|
||||
throw new protocol_js_1.UnknownErrorException(`Unknown proxy type`);
|
||||
}
|
||||
//# sourceMappingURL=BrowserProcessor.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/BrowserProcessor.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/BrowserProcessor.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
43
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfig.d.ts
generated
vendored
Normal file
43
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfig.d.ts
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* Copyright 2025 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { Protocol } from 'devtools-protocol';
|
||||
import type { BrowsingContext, Emulation, Session } from '../../../protocol/protocol.js';
|
||||
/**
|
||||
* Represents a context configurations. It can be global, per User Context, or per
|
||||
* Browsing Context. The undefined value means the config will be taken from the upstream
|
||||
* config. `null` values means the value should be default regardless of the upstream.
|
||||
*/
|
||||
export declare class ContextConfig {
|
||||
acceptInsecureCerts?: boolean;
|
||||
viewport?: BrowsingContext.Viewport | null;
|
||||
devicePixelRatio?: number | null;
|
||||
extraHeaders?: Protocol.Network.Headers;
|
||||
geolocation?: Emulation.GeolocationCoordinates | Emulation.GeolocationPositionError | null;
|
||||
locale?: string | null;
|
||||
prerenderingDisabled?: boolean;
|
||||
screenOrientation?: Emulation.ScreenOrientation | null;
|
||||
scriptingEnabled?: false | null;
|
||||
timezone?: string | null;
|
||||
userPromptHandler?: Session.UserPromptHandler;
|
||||
/**
|
||||
* Merges multiple `ContextConfig` objects. The configs are merged in the
|
||||
* order they are provided. For each property, the value from the last config
|
||||
* that defines it (i.e., the value is not `undefined`) will be used.
|
||||
* The final result will not contain any `undefined` properties.
|
||||
*/
|
||||
static merge(...configs: (ContextConfig | undefined)[]): ContextConfig;
|
||||
}
|
||||
62
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfig.js
generated
vendored
Normal file
62
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfig.js
generated
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2025 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ContextConfig = void 0;
|
||||
/**
|
||||
* Represents a context configurations. It can be global, per User Context, or per
|
||||
* Browsing Context. The undefined value means the config will be taken from the upstream
|
||||
* config. `null` values means the value should be default regardless of the upstream.
|
||||
*/
|
||||
class ContextConfig {
|
||||
acceptInsecureCerts;
|
||||
viewport;
|
||||
devicePixelRatio;
|
||||
// Extra headers are kept in CDP format.
|
||||
extraHeaders;
|
||||
geolocation;
|
||||
locale;
|
||||
prerenderingDisabled;
|
||||
screenOrientation;
|
||||
scriptingEnabled;
|
||||
// Timezone is kept in CDP format with GMT prefix for offset values.
|
||||
timezone;
|
||||
userPromptHandler;
|
||||
/**
|
||||
* Merges multiple `ContextConfig` objects. The configs are merged in the
|
||||
* order they are provided. For each property, the value from the last config
|
||||
* that defines it (i.e., the value is not `undefined`) will be used.
|
||||
* The final result will not contain any `undefined` properties.
|
||||
*/
|
||||
static merge(...configs) {
|
||||
const result = new ContextConfig();
|
||||
for (const config of configs) {
|
||||
if (!config) {
|
||||
continue;
|
||||
}
|
||||
for (const key in config) {
|
||||
const value = config[key];
|
||||
if (value !== undefined) {
|
||||
result[key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
exports.ContextConfig = ContextConfig;
|
||||
//# sourceMappingURL=ContextConfig.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfig.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfig.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ContextConfig.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/browser/ContextConfig.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAUH;;;;GAIG;AACH,MAAa,aAAa;IACxB,mBAAmB,CAAW;IAC9B,QAAQ,CAAmC;IAC3C,gBAAgB,CAAiB;IACjC,wCAAwC;IACxC,YAAY,CAA4B;IACxC,WAAW,CAGF;IACT,MAAM,CAAiB;IACvB,oBAAoB,CAAW;IAC/B,iBAAiB,CAAsC;IACvD,gBAAgB,CAAgB;IAChC,oEAAoE;IACpE,QAAQ,CAAiB;IACzB,iBAAiB,CAA6B;IAE9C;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,OAAsC;QACpD,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAS;YACX,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAA0B,CAAC,CAAC;gBACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACvB,MAAc,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAxCD,sCAwCC"}
|
||||
42
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfigStorage.d.ts
generated
vendored
Normal file
42
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfigStorage.d.ts
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
import { ContextConfig } from './ContextConfig.js';
|
||||
/**
|
||||
* Manages context-specific configurations. This class allows setting
|
||||
* configurations at three levels: global, user context, and browsing context.
|
||||
*
|
||||
* When `getActiveConfig` is called, it merges the configurations in a specific
|
||||
* order of precedence: `global -> user context -> browsing context`. For each
|
||||
* configuration property, the value from the highest-precedence level that has a
|
||||
* non-`undefined` value is used.
|
||||
*
|
||||
* The `update` methods (`updateGlobalConfig`, `updateUserContextConfig`,
|
||||
* `updateBrowsingContextConfig`) merge the provided configuration with the
|
||||
* existing one at the corresponding level. Properties with `undefined` values in
|
||||
* the provided configuration are ignored, preserving the existing value.
|
||||
*/
|
||||
export declare class ContextConfigStorage {
|
||||
#private;
|
||||
/**
|
||||
* Updates the global configuration. Properties with `undefined` values in the
|
||||
* provided `config` are ignored.
|
||||
*/
|
||||
updateGlobalConfig(config: ContextConfig): void;
|
||||
/**
|
||||
* Updates the configuration for a specific browsing context. Properties with
|
||||
* `undefined` values in the provided `config` are ignored.
|
||||
*/
|
||||
updateBrowsingContextConfig(browsingContextId: string, config: ContextConfig): void;
|
||||
/**
|
||||
* Updates the configuration for a specific user context. Properties with
|
||||
* `undefined` values in the provided `config` are ignored.
|
||||
*/
|
||||
updateUserContextConfig(userContext: string, config: ContextConfig): void;
|
||||
/**
|
||||
* Returns the current global configuration.
|
||||
*/
|
||||
getGlobalConfig(): ContextConfig;
|
||||
/**
|
||||
* Calculates the active configuration by merging global, user context, and
|
||||
* browsing context settings.
|
||||
*/
|
||||
getActiveConfig(topLevelBrowsingContextId: string, userContext: string): ContextConfig;
|
||||
}
|
||||
75
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfigStorage.js
generated
vendored
Normal file
75
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfigStorage.js
generated
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
"use strict";
|
||||
/*
|
||||
* Copyright 2025 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ContextConfigStorage = void 0;
|
||||
const ContextConfig_js_1 = require("./ContextConfig.js");
|
||||
/**
|
||||
* Manages context-specific configurations. This class allows setting
|
||||
* configurations at three levels: global, user context, and browsing context.
|
||||
*
|
||||
* When `getActiveConfig` is called, it merges the configurations in a specific
|
||||
* order of precedence: `global -> user context -> browsing context`. For each
|
||||
* configuration property, the value from the highest-precedence level that has a
|
||||
* non-`undefined` value is used.
|
||||
*
|
||||
* The `update` methods (`updateGlobalConfig`, `updateUserContextConfig`,
|
||||
* `updateBrowsingContextConfig`) merge the provided configuration with the
|
||||
* existing one at the corresponding level. Properties with `undefined` values in
|
||||
* the provided configuration are ignored, preserving the existing value.
|
||||
*/
|
||||
class ContextConfigStorage {
|
||||
#global = new ContextConfig_js_1.ContextConfig();
|
||||
#userContextConfigs = new Map();
|
||||
#browsingContextConfigs = new Map();
|
||||
/**
|
||||
* Updates the global configuration. Properties with `undefined` values in the
|
||||
* provided `config` are ignored.
|
||||
*/
|
||||
updateGlobalConfig(config) {
|
||||
this.#global = ContextConfig_js_1.ContextConfig.merge(this.#global, config);
|
||||
}
|
||||
/**
|
||||
* Updates the configuration for a specific browsing context. Properties with
|
||||
* `undefined` values in the provided `config` are ignored.
|
||||
*/
|
||||
updateBrowsingContextConfig(browsingContextId, config) {
|
||||
this.#browsingContextConfigs.set(browsingContextId, ContextConfig_js_1.ContextConfig.merge(this.#browsingContextConfigs.get(browsingContextId), config));
|
||||
}
|
||||
/**
|
||||
* Updates the configuration for a specific user context. Properties with
|
||||
* `undefined` values in the provided `config` are ignored.
|
||||
*/
|
||||
updateUserContextConfig(userContext, config) {
|
||||
this.#userContextConfigs.set(userContext, ContextConfig_js_1.ContextConfig.merge(this.#userContextConfigs.get(userContext), config));
|
||||
}
|
||||
/**
|
||||
* Returns the current global configuration.
|
||||
*/
|
||||
getGlobalConfig() {
|
||||
return this.#global;
|
||||
}
|
||||
/**
|
||||
* Calculates the active configuration by merging global, user context, and
|
||||
* browsing context settings.
|
||||
*/
|
||||
getActiveConfig(topLevelBrowsingContextId, userContext) {
|
||||
return ContextConfig_js_1.ContextConfig.merge(this.#global, this.#userContextConfigs.get(userContext), this.#browsingContextConfigs.get(topLevelBrowsingContextId));
|
||||
}
|
||||
}
|
||||
exports.ContextConfigStorage = ContextConfigStorage;
|
||||
//# sourceMappingURL=ContextConfigStorage.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfigStorage.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/ContextConfigStorage.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ContextConfigStorage.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/browser/ContextConfigStorage.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAEH,yDAAiD;AAEjD;;;;;;;;;;;;;GAaG;AACH,MAAa,oBAAoB;IAC/B,OAAO,GAAG,IAAI,gCAAa,EAAE,CAAC;IAC9B,mBAAmB,GAAG,IAAI,GAAG,EAAyB,CAAC;IACvD,uBAAuB,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE3D;;;OAGG;IACH,kBAAkB,CAAC,MAAqB;QACtC,IAAI,CAAC,OAAO,GAAG,gCAAa,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED;;;OAGG;IACH,2BAA2B,CACzB,iBAAyB,EACzB,MAAqB;QAErB,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAC9B,iBAAiB,EACjB,gCAAa,CAAC,KAAK,CACjB,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EACnD,MAAM,CACP,CACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,uBAAuB,CAAC,WAAmB,EAAE,MAAqB;QAChE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAC1B,WAAW,EACX,gCAAa,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CACvE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,yBAAiC,EAAE,WAAmB;QACpE,OAAO,gCAAa,CAAC,KAAK,CACxB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,EACzC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAC5D,CAAC;IACJ,CAAC;CACF;AA3DD,oDA2DC"}
|
||||
27
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/UserContextStorage.d.ts
generated
vendored
Normal file
27
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/UserContextStorage.d.ts
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Copyright 2025 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { CdpClient } from '../../../cdp/CdpClient.js';
|
||||
import { type Browser } from '../../../protocol/protocol.js';
|
||||
export declare class UserContextStorage {
|
||||
#private;
|
||||
constructor(browserClient: CdpClient);
|
||||
getUserContexts(): Promise<[
|
||||
Browser.UserContextInfo,
|
||||
...Browser.UserContextInfo[]
|
||||
]>;
|
||||
verifyUserContextIdList(userContextIds: Browser.UserContext[]): Promise<Set<string>>;
|
||||
}
|
||||
56
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/UserContextStorage.js
generated
vendored
Normal file
56
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/UserContextStorage.js
generated
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2025 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.UserContextStorage = void 0;
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
class UserContextStorage {
|
||||
#browserClient;
|
||||
constructor(browserClient) {
|
||||
this.#browserClient = browserClient;
|
||||
}
|
||||
async getUserContexts() {
|
||||
const result = await this.#browserClient.sendCommand('Target.getBrowserContexts');
|
||||
return [
|
||||
{
|
||||
userContext: 'default',
|
||||
},
|
||||
...result.browserContextIds.map((id) => {
|
||||
return {
|
||||
userContext: id,
|
||||
};
|
||||
}),
|
||||
];
|
||||
}
|
||||
async verifyUserContextIdList(userContextIds) {
|
||||
const foundContexts = new Set();
|
||||
if (!userContextIds.length) {
|
||||
return foundContexts;
|
||||
}
|
||||
const userContexts = await this.getUserContexts();
|
||||
const knownUserContextIds = new Set(userContexts.map((userContext) => userContext.userContext));
|
||||
for (const userContextId of userContextIds) {
|
||||
if (!knownUserContextIds.has(userContextId)) {
|
||||
throw new protocol_js_1.NoSuchUserContextException(`User context ${userContextId} not found`);
|
||||
}
|
||||
foundContexts.add(userContextId);
|
||||
}
|
||||
return foundContexts;
|
||||
}
|
||||
}
|
||||
exports.UserContextStorage = UserContextStorage;
|
||||
//# sourceMappingURL=UserContextStorage.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/UserContextStorage.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/browser/UserContextStorage.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"UserContextStorage.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/browser/UserContextStorage.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAGH,+DAGuC;AAEvC,MAAa,kBAAkB;IAC7B,cAAc,CAAY;IAC1B,YAAY,aAAwB;QAClC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,eAAe;QAGnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAClD,2BAA2B,CAC5B,CAAC;QACF,OAAO;YACL;gBACE,WAAW,EAAE,SAAS;aACvB;YACD,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACrC,OAAO;oBACL,WAAW,EAAE,EAAE;iBAChB,CAAC;YACJ,CAAC,CAAC;SACH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,cAAqC;QACjE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;QACrD,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAC3B,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAClD,MAAM,mBAAmB,GAAG,IAAI,GAAG,CACjC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAC3D,CAAC;QACF,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;YAC3C,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,wCAA0B,CAClC,gBAAgB,aAAa,YAAY,CAC1C,CAAC;YACJ,CAAC;YACD,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;CACF;AA7CD,gDA6CC"}
|
||||
27
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpProcessor.d.ts
generated
vendored
Normal file
27
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpProcessor.d.ts
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import { type Cdp } from '../../../protocol/protocol.js';
|
||||
import type { CdpClient, CdpConnection } from '../../BidiMapper.js';
|
||||
import type { BrowsingContextStorage } from '../context/BrowsingContextStorage.js';
|
||||
import type { RealmStorage } from '../script/RealmStorage.js';
|
||||
export declare class CdpProcessor {
|
||||
#private;
|
||||
constructor(browsingContextStorage: BrowsingContextStorage, realmStorage: RealmStorage, cdpConnection: CdpConnection, browserCdpClient: CdpClient);
|
||||
getSession(params: Cdp.GetSessionParameters): Cdp.GetSessionResult;
|
||||
resolveRealm(params: Cdp.ResolveRealmParameters): Cdp.ResolveRealmResult;
|
||||
sendCommand(params: Cdp.SendCommandParameters): Promise<Cdp.SendCommandResult>;
|
||||
}
|
||||
60
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpProcessor.js
generated
vendored
Normal file
60
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpProcessor.js
generated
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CdpProcessor = void 0;
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
class CdpProcessor {
|
||||
#browsingContextStorage;
|
||||
#realmStorage;
|
||||
#cdpConnection;
|
||||
#browserCdpClient;
|
||||
constructor(browsingContextStorage, realmStorage, cdpConnection, browserCdpClient) {
|
||||
this.#browsingContextStorage = browsingContextStorage;
|
||||
this.#realmStorage = realmStorage;
|
||||
this.#cdpConnection = cdpConnection;
|
||||
this.#browserCdpClient = browserCdpClient;
|
||||
}
|
||||
getSession(params) {
|
||||
const context = params.context;
|
||||
const sessionId = this.#browsingContextStorage.getContext(context).cdpTarget.cdpSessionId;
|
||||
if (sessionId === undefined) {
|
||||
return {};
|
||||
}
|
||||
return { session: sessionId };
|
||||
}
|
||||
resolveRealm(params) {
|
||||
const context = params.realm;
|
||||
const realm = this.#realmStorage.getRealm({ realmId: context });
|
||||
if (realm === undefined) {
|
||||
throw new protocol_js_1.UnknownErrorException(`Could not find realm ${params.realm}`);
|
||||
}
|
||||
return { executionContextId: realm.executionContextId };
|
||||
}
|
||||
async sendCommand(params) {
|
||||
const client = params.session
|
||||
? this.#cdpConnection.getCdpClient(params.session)
|
||||
: this.#browserCdpClient;
|
||||
const result = await client.sendCommand(params.method, params.params);
|
||||
return {
|
||||
result,
|
||||
session: params.session,
|
||||
};
|
||||
}
|
||||
}
|
||||
exports.CdpProcessor = CdpProcessor;
|
||||
//# sourceMappingURL=CdpProcessor.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpProcessor.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpProcessor.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"CdpProcessor.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/cdp/CdpProcessor.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAEH,+DAA8E;AAK9E,MAAa,YAAY;IACd,uBAAuB,CAAyB;IAChD,aAAa,CAAe;IAC5B,cAAc,CAAgB;IAC9B,iBAAiB,CAAY;IAEtC,YACE,sBAA8C,EAC9C,YAA0B,EAC1B,aAA4B,EAC5B,gBAA2B;QAE3B,IAAI,CAAC,uBAAuB,GAAG,sBAAsB,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;IAC5C,CAAC;IAED,UAAU,CAAC,MAAgC;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,SAAS,GACb,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC;QAC1E,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,EAAC,OAAO,EAAE,SAAS,EAAC,CAAC;IAC9B,CAAC;IAED,YAAY,CAAC,MAAkC;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC,CAAC;QAC9D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,mCAAqB,CAAC,wBAAwB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,EAAC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,EAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAiC;QAEjC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO;YAC3B,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC;YAClD,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACtE,OAAO;YACL,MAAM;YACN,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;CACF;AAjDD,oCAiDC"}
|
||||
53
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTarget.d.ts
generated
vendored
Normal file
53
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTarget.d.ts
generated
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
import type { Protocol } from 'devtools-protocol';
|
||||
import type { CdpClient } from '../../../cdp/CdpClient.js';
|
||||
import { type Browser, type BrowsingContext, type ChromiumBidi, Emulation } from '../../../protocol/protocol.js';
|
||||
import { Deferred } from '../../../utils/Deferred.js';
|
||||
import type { LoggerFn } from '../../../utils/log.js';
|
||||
import type { Result } from '../../../utils/result.js';
|
||||
import type { ContextConfigStorage } from '../browser/ContextConfigStorage.js';
|
||||
import type { BrowsingContextStorage } from '../context/BrowsingContextStorage.js';
|
||||
import type { NetworkStorage } from '../network/NetworkStorage.js';
|
||||
import type { ChannelProxy } from '../script/ChannelProxy.js';
|
||||
import type { PreloadScriptStorage } from '../script/PreloadScriptStorage.js';
|
||||
import type { RealmStorage } from '../script/RealmStorage.js';
|
||||
import type { EventManager } from '../session/EventManager.js';
|
||||
export declare class CdpTarget {
|
||||
#private;
|
||||
readonly contextConfigStorage: ContextConfigStorage;
|
||||
static create(targetId: Protocol.Target.TargetID, cdpClient: CdpClient, browserCdpClient: CdpClient, parentCdpClient: CdpClient, realmStorage: RealmStorage, eventManager: EventManager, preloadScriptStorage: PreloadScriptStorage, browsingContextStorage: BrowsingContextStorage, networkStorage: NetworkStorage, configStorage: ContextConfigStorage, userContext: Browser.UserContext, logger?: LoggerFn): CdpTarget;
|
||||
constructor(targetId: Protocol.Target.TargetID, cdpClient: CdpClient, browserCdpClient: CdpClient, parentCdpClient: CdpClient, eventManager: EventManager, realmStorage: RealmStorage, preloadScriptStorage: PreloadScriptStorage, browsingContextStorage: BrowsingContextStorage, configStorage: ContextConfigStorage, networkStorage: NetworkStorage, userContext: Browser.UserContext, logger: LoggerFn | undefined);
|
||||
/** Returns a deferred that resolves when the target is unblocked. */
|
||||
get unblocked(): Deferred<Result<void>>;
|
||||
get id(): Protocol.Target.TargetID;
|
||||
get cdpClient(): CdpClient;
|
||||
get parentCdpClient(): CdpClient;
|
||||
get browserCdpClient(): CdpClient;
|
||||
/** Needed for CDP escape path. */
|
||||
get cdpSessionId(): Protocol.Target.SessionID;
|
||||
/**
|
||||
* Window id the target belongs to. If not known, returns 0.
|
||||
*/
|
||||
get windowId(): number;
|
||||
toggleFetchIfNeeded(): Promise<void>;
|
||||
/**
|
||||
* Toggles CDP "Fetch" domain and enable/disable network cache.
|
||||
*/
|
||||
toggleNetworkIfNeeded(): Promise<void>;
|
||||
toggleSetCacheDisabled(disable?: boolean): Promise<void>;
|
||||
toggleDeviceAccessIfNeeded(): Promise<void>;
|
||||
toggleNetwork(): Promise<void>;
|
||||
/**
|
||||
* All the ProxyChannels from all the preload scripts of the given
|
||||
* BrowsingContext.
|
||||
*/
|
||||
getChannels(): ChannelProxy[];
|
||||
setViewport(viewport?: BrowsingContext.Viewport | null, devicePixelRatio?: number | null): Promise<void>;
|
||||
get topLevelId(): string;
|
||||
isSubscribedTo(moduleOrEvent: ChromiumBidi.EventNames): boolean;
|
||||
setGeolocationOverride(geolocation: Emulation.GeolocationCoordinates | Emulation.GeolocationPositionError | null): Promise<void>;
|
||||
setScreenOrientationOverride(screenOrientation: Emulation.ScreenOrientation | null): Promise<void>;
|
||||
setLocaleOverride(locale: string | null): Promise<void>;
|
||||
setScriptingEnabled(scriptingEnabled: false | null): Promise<void>;
|
||||
setTimezoneOverride(timezone: string | null): Promise<void>;
|
||||
setExtraHeaders(headers: Protocol.Network.Headers): Promise<void>;
|
||||
}
|
||||
637
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTarget.js
generated
vendored
Normal file
637
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTarget.js
generated
vendored
Normal file
@@ -0,0 +1,637 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CdpTarget = void 0;
|
||||
const chromium_bidi_js_1 = require("../../../protocol/chromium-bidi.js");
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
const Deferred_js_1 = require("../../../utils/Deferred.js");
|
||||
const log_js_1 = require("../../../utils/log.js");
|
||||
const BrowsingContextImpl_js_1 = require("../context/BrowsingContextImpl.js");
|
||||
const LogManager_js_1 = require("../log/LogManager.js");
|
||||
class CdpTarget {
|
||||
#id;
|
||||
#userContext;
|
||||
#cdpClient;
|
||||
#browserCdpClient;
|
||||
#parentCdpClient;
|
||||
#realmStorage;
|
||||
#eventManager;
|
||||
#preloadScriptStorage;
|
||||
#browsingContextStorage;
|
||||
#networkStorage;
|
||||
contextConfigStorage;
|
||||
#unblocked = new Deferred_js_1.Deferred();
|
||||
#logger;
|
||||
// Keeps track of the previously set viewport.
|
||||
#previousDeviceMetricsOverride = {
|
||||
width: 0,
|
||||
height: 0,
|
||||
deviceScaleFactor: 0,
|
||||
mobile: false,
|
||||
dontSetVisibleSize: true,
|
||||
};
|
||||
/**
|
||||
* Target's window id. Is filled when the CDP target is created and do not reflect
|
||||
* moving targets from one window to another. The actual values
|
||||
* will be set during `#unblock`.
|
||||
* */
|
||||
#windowId;
|
||||
#deviceAccessEnabled = false;
|
||||
#cacheDisableState = false;
|
||||
#fetchDomainStages = {
|
||||
request: false,
|
||||
response: false,
|
||||
auth: false,
|
||||
};
|
||||
static create(targetId, cdpClient, browserCdpClient, parentCdpClient, realmStorage, eventManager, preloadScriptStorage, browsingContextStorage, networkStorage, configStorage, userContext, logger) {
|
||||
const cdpTarget = new CdpTarget(targetId, cdpClient, browserCdpClient, parentCdpClient, eventManager, realmStorage, preloadScriptStorage, browsingContextStorage, configStorage, networkStorage, userContext, logger);
|
||||
LogManager_js_1.LogManager.create(cdpTarget, realmStorage, eventManager, logger);
|
||||
cdpTarget.#setEventListeners();
|
||||
// No need to await.
|
||||
// Deferred will be resolved when the target is unblocked.
|
||||
void cdpTarget.#unblock();
|
||||
return cdpTarget;
|
||||
}
|
||||
constructor(targetId, cdpClient, browserCdpClient, parentCdpClient, eventManager, realmStorage, preloadScriptStorage, browsingContextStorage, configStorage, networkStorage, userContext, logger) {
|
||||
this.#userContext = userContext;
|
||||
this.#id = targetId;
|
||||
this.#cdpClient = cdpClient;
|
||||
this.#browserCdpClient = browserCdpClient;
|
||||
this.#parentCdpClient = parentCdpClient;
|
||||
this.#eventManager = eventManager;
|
||||
this.#realmStorage = realmStorage;
|
||||
this.#preloadScriptStorage = preloadScriptStorage;
|
||||
this.#networkStorage = networkStorage;
|
||||
this.#browsingContextStorage = browsingContextStorage;
|
||||
this.contextConfigStorage = configStorage;
|
||||
this.#logger = logger;
|
||||
}
|
||||
/** Returns a deferred that resolves when the target is unblocked. */
|
||||
get unblocked() {
|
||||
return this.#unblocked;
|
||||
}
|
||||
get id() {
|
||||
return this.#id;
|
||||
}
|
||||
get cdpClient() {
|
||||
return this.#cdpClient;
|
||||
}
|
||||
get parentCdpClient() {
|
||||
return this.#parentCdpClient;
|
||||
}
|
||||
get browserCdpClient() {
|
||||
return this.#browserCdpClient;
|
||||
}
|
||||
/** Needed for CDP escape path. */
|
||||
get cdpSessionId() {
|
||||
// SAFETY we got the client by it's id for creating
|
||||
return this.#cdpClient.sessionId;
|
||||
}
|
||||
/**
|
||||
* Window id the target belongs to. If not known, returns 0.
|
||||
*/
|
||||
get windowId() {
|
||||
if (this.#windowId === undefined) {
|
||||
this.#logger?.(log_js_1.LogType.debugError, 'Getting windowId before it was set, returning 0');
|
||||
}
|
||||
return this.#windowId ?? 0;
|
||||
}
|
||||
/**
|
||||
* Enables all the required CDP domains and unblocks the target.
|
||||
*/
|
||||
async #unblock() {
|
||||
try {
|
||||
await Promise.all([
|
||||
this.#cdpClient.sendCommand('Page.enable', {
|
||||
enableFileChooserOpenedEvent: true,
|
||||
}),
|
||||
...(this.#ignoreFileDialog()
|
||||
? []
|
||||
: [
|
||||
this.#cdpClient.sendCommand('Page.setInterceptFileChooserDialog', {
|
||||
enabled: true,
|
||||
// The intercepted dialog should be canceled.
|
||||
cancel: true,
|
||||
}),
|
||||
]),
|
||||
// There can be some existing frames in the target, if reconnecting to an
|
||||
// existing browser instance, e.g. via Puppeteer. Need to restore the browsing
|
||||
// contexts for the frames to correctly handle further events, like
|
||||
// `Runtime.executionContextCreated`.
|
||||
// It's important to schedule this task together with enabling domains commands to
|
||||
// prepare the tree before the events (e.g. Runtime.executionContextCreated) start
|
||||
// coming.
|
||||
// https://github.com/GoogleChromeLabs/chromium-bidi/issues/2282
|
||||
this.#cdpClient
|
||||
.sendCommand('Page.getFrameTree')
|
||||
.then((frameTree) => this.#restoreFrameTreeState(frameTree.frameTree)),
|
||||
this.#cdpClient.sendCommand('Runtime.enable'),
|
||||
this.#cdpClient.sendCommand('Page.setLifecycleEventsEnabled', {
|
||||
enabled: true,
|
||||
}),
|
||||
// Enabling CDP Network domain is required for navigation detection:
|
||||
// https://github.com/GoogleChromeLabs/chromium-bidi/issues/2856.
|
||||
this.#cdpClient
|
||||
.sendCommand('Network.enable')
|
||||
.then(() => this.toggleNetworkIfNeeded()),
|
||||
this.#cdpClient.sendCommand('Target.setAutoAttach', {
|
||||
autoAttach: true,
|
||||
waitForDebuggerOnStart: true,
|
||||
flatten: true,
|
||||
}),
|
||||
this.#updateWindowId(),
|
||||
this.#setUserContextConfig(),
|
||||
this.#initAndEvaluatePreloadScripts(),
|
||||
this.#cdpClient.sendCommand('Runtime.runIfWaitingForDebugger'),
|
||||
// Resume tab execution as well if it was paused by the debugger.
|
||||
this.#parentCdpClient.sendCommand('Runtime.runIfWaitingForDebugger'),
|
||||
this.toggleDeviceAccessIfNeeded(),
|
||||
]);
|
||||
}
|
||||
catch (error) {
|
||||
this.#logger?.(log_js_1.LogType.debugError, 'Failed to unblock target', error);
|
||||
// The target might have been closed before the initialization finished.
|
||||
if (!this.#cdpClient.isCloseError(error)) {
|
||||
this.#unblocked.resolve({
|
||||
kind: 'error',
|
||||
error,
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.#unblocked.resolve({
|
||||
kind: 'success',
|
||||
value: undefined,
|
||||
});
|
||||
}
|
||||
#restoreFrameTreeState(frameTree) {
|
||||
const frame = frameTree.frame;
|
||||
const maybeContext = this.#browsingContextStorage.findContext(frame.id);
|
||||
if (maybeContext !== undefined) {
|
||||
// Restoring parent of already known browsing context. This means the target is
|
||||
// OOPiF and the BiDi session was connected to already existing browser instance.
|
||||
if (maybeContext.parentId === null &&
|
||||
frame.parentId !== null &&
|
||||
frame.parentId !== undefined) {
|
||||
maybeContext.parentId = frame.parentId;
|
||||
}
|
||||
}
|
||||
if (maybeContext === undefined && frame.parentId !== undefined) {
|
||||
// Restore not yet known nested frames. The top-level frame is created when the
|
||||
// target is attached.
|
||||
const parentBrowsingContext = this.#browsingContextStorage.getContext(frame.parentId);
|
||||
BrowsingContextImpl_js_1.BrowsingContextImpl.create(frame.id, frame.parentId, this.#userContext, parentBrowsingContext.cdpTarget, this.#eventManager, this.#browsingContextStorage, this.#realmStorage, this.contextConfigStorage, frame.url, undefined, this.#logger);
|
||||
}
|
||||
frameTree.childFrames?.map((frameTree) => this.#restoreFrameTreeState(frameTree));
|
||||
}
|
||||
async toggleFetchIfNeeded() {
|
||||
const stages = this.#networkStorage.getInterceptionStages(this.topLevelId);
|
||||
if (this.#fetchDomainStages.request === stages.request &&
|
||||
this.#fetchDomainStages.response === stages.response &&
|
||||
this.#fetchDomainStages.auth === stages.auth) {
|
||||
return;
|
||||
}
|
||||
const patterns = [];
|
||||
this.#fetchDomainStages = stages;
|
||||
if (stages.request || stages.auth) {
|
||||
// CDP quirk we need request interception when we intercept auth
|
||||
patterns.push({
|
||||
urlPattern: '*',
|
||||
requestStage: 'Request',
|
||||
});
|
||||
}
|
||||
if (stages.response) {
|
||||
patterns.push({
|
||||
urlPattern: '*',
|
||||
requestStage: 'Response',
|
||||
});
|
||||
}
|
||||
if (patterns.length) {
|
||||
await this.#cdpClient.sendCommand('Fetch.enable', {
|
||||
patterns,
|
||||
handleAuthRequests: stages.auth,
|
||||
});
|
||||
}
|
||||
else {
|
||||
const blockedRequest = this.#networkStorage
|
||||
.getRequestsByTarget(this)
|
||||
.filter((request) => request.interceptPhase);
|
||||
void Promise.allSettled(blockedRequest.map((request) => request.waitNextPhase))
|
||||
.then(async () => {
|
||||
const blockedRequest = this.#networkStorage
|
||||
.getRequestsByTarget(this)
|
||||
.filter((request) => request.interceptPhase);
|
||||
if (blockedRequest.length) {
|
||||
return await this.toggleFetchIfNeeded();
|
||||
}
|
||||
return await this.#cdpClient.sendCommand('Fetch.disable');
|
||||
})
|
||||
.catch((error) => {
|
||||
this.#logger?.(log_js_1.LogType.bidi, 'Disable failed', error);
|
||||
});
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Toggles CDP "Fetch" domain and enable/disable network cache.
|
||||
*/
|
||||
async toggleNetworkIfNeeded() {
|
||||
// Although the Network domain remains active, Fetch domain activation and caching
|
||||
// settings should be managed dynamically.
|
||||
try {
|
||||
await Promise.all([
|
||||
this.toggleSetCacheDisabled(),
|
||||
this.toggleFetchIfNeeded(),
|
||||
]);
|
||||
}
|
||||
catch (err) {
|
||||
this.#logger?.(log_js_1.LogType.debugError, err);
|
||||
if (!this.#isExpectedError(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
async toggleSetCacheDisabled(disable) {
|
||||
const defaultCacheDisabled = this.#networkStorage.defaultCacheBehavior === 'bypass';
|
||||
const cacheDisabled = disable ?? defaultCacheDisabled;
|
||||
if (this.#cacheDisableState === cacheDisabled) {
|
||||
return;
|
||||
}
|
||||
this.#cacheDisableState = cacheDisabled;
|
||||
try {
|
||||
await this.#cdpClient.sendCommand('Network.setCacheDisabled', {
|
||||
cacheDisabled,
|
||||
});
|
||||
}
|
||||
catch (err) {
|
||||
this.#logger?.(log_js_1.LogType.debugError, err);
|
||||
this.#cacheDisableState = !cacheDisabled;
|
||||
if (!this.#isExpectedError(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
async toggleDeviceAccessIfNeeded() {
|
||||
const enabled = this.isSubscribedTo(chromium_bidi_js_1.Bluetooth.EventNames.RequestDevicePromptUpdated);
|
||||
if (this.#deviceAccessEnabled === enabled) {
|
||||
return;
|
||||
}
|
||||
this.#deviceAccessEnabled = enabled;
|
||||
try {
|
||||
await this.#cdpClient.sendCommand(enabled ? 'DeviceAccess.enable' : 'DeviceAccess.disable');
|
||||
}
|
||||
catch (err) {
|
||||
this.#logger?.(log_js_1.LogType.debugError, err);
|
||||
this.#deviceAccessEnabled = !enabled;
|
||||
if (!this.#isExpectedError(err)) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Heuristic checking if the error is due to the session being closed. If so, ignore the
|
||||
* error.
|
||||
*/
|
||||
#isExpectedError(err) {
|
||||
const error = err;
|
||||
return ((error.code === -32001 &&
|
||||
error.message === 'Session with given id not found.') ||
|
||||
this.#cdpClient.isCloseError(err));
|
||||
}
|
||||
#setEventListeners() {
|
||||
this.#cdpClient.on('*', (event, params) => {
|
||||
// We may encounter uses for EventEmitter other than CDP events,
|
||||
// which we want to skip.
|
||||
if (typeof event !== 'string') {
|
||||
return;
|
||||
}
|
||||
this.#eventManager.registerEvent({
|
||||
type: 'event',
|
||||
method: `goog:cdp.${event}`,
|
||||
params: {
|
||||
event,
|
||||
params,
|
||||
session: this.cdpSessionId,
|
||||
},
|
||||
}, this.id);
|
||||
});
|
||||
}
|
||||
async #enableFetch(stages) {
|
||||
const patterns = [];
|
||||
if (stages.request || stages.auth) {
|
||||
// CDP quirk we need request interception when we intercept auth
|
||||
patterns.push({
|
||||
urlPattern: '*',
|
||||
requestStage: 'Request',
|
||||
});
|
||||
}
|
||||
if (stages.response) {
|
||||
patterns.push({
|
||||
urlPattern: '*',
|
||||
requestStage: 'Response',
|
||||
});
|
||||
}
|
||||
if (patterns.length) {
|
||||
const oldStages = this.#fetchDomainStages;
|
||||
this.#fetchDomainStages = stages;
|
||||
try {
|
||||
await this.#cdpClient.sendCommand('Fetch.enable', {
|
||||
patterns,
|
||||
handleAuthRequests: stages.auth,
|
||||
});
|
||||
}
|
||||
catch {
|
||||
this.#fetchDomainStages = oldStages;
|
||||
}
|
||||
}
|
||||
}
|
||||
async #disableFetch() {
|
||||
const blockedRequest = this.#networkStorage
|
||||
.getRequestsByTarget(this)
|
||||
.filter((request) => request.interceptPhase);
|
||||
if (blockedRequest.length === 0) {
|
||||
this.#fetchDomainStages = {
|
||||
request: false,
|
||||
response: false,
|
||||
auth: false,
|
||||
};
|
||||
await this.#cdpClient.sendCommand('Fetch.disable');
|
||||
}
|
||||
}
|
||||
async toggleNetwork() {
|
||||
// TODO: respect the data collectors once CDP Network domain is enabled on-demand:
|
||||
// const networkEnable = this.#networkStorage.getCollectorsForBrowsingContext(this.topLevelId).length > 0;
|
||||
const stages = this.#networkStorage.getInterceptionStages(this.topLevelId);
|
||||
const fetchEnable = Object.values(stages).some((value) => value);
|
||||
const fetchChanged = this.#fetchDomainStages.request !== stages.request ||
|
||||
this.#fetchDomainStages.response !== stages.response ||
|
||||
this.#fetchDomainStages.auth !== stages.auth;
|
||||
this.#logger?.(log_js_1.LogType.debugInfo, 'Toggle Network', `Fetch (${fetchEnable}) ${fetchChanged}`);
|
||||
if (fetchEnable && fetchChanged) {
|
||||
await this.#enableFetch(stages);
|
||||
}
|
||||
if (!fetchEnable && fetchChanged) {
|
||||
await this.#disableFetch();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* All the ProxyChannels from all the preload scripts of the given
|
||||
* BrowsingContext.
|
||||
*/
|
||||
getChannels() {
|
||||
return this.#preloadScriptStorage
|
||||
.find()
|
||||
.flatMap((script) => script.channels);
|
||||
}
|
||||
async #updateWindowId() {
|
||||
const { windowId } = await this.#browserCdpClient.sendCommand('Browser.getWindowForTarget', { targetId: this.id });
|
||||
this.#windowId = windowId;
|
||||
}
|
||||
/** Loads all top-level preload scripts. */
|
||||
async #initAndEvaluatePreloadScripts() {
|
||||
await Promise.all(this.#preloadScriptStorage
|
||||
.find({
|
||||
// Needed for OOPIF
|
||||
targetId: this.topLevelId,
|
||||
})
|
||||
.map((script) => {
|
||||
return script.initInTarget(this, true);
|
||||
}));
|
||||
}
|
||||
async setViewport(viewport, devicePixelRatio) {
|
||||
if (viewport === null && devicePixelRatio === null) {
|
||||
await this.cdpClient.sendCommand('Emulation.clearDeviceMetricsOverride');
|
||||
return;
|
||||
}
|
||||
const newViewport = { ...this.#previousDeviceMetricsOverride };
|
||||
if (viewport === null) {
|
||||
// Disable override.
|
||||
newViewport.width = 0;
|
||||
newViewport.height = 0;
|
||||
}
|
||||
else if (viewport !== undefined) {
|
||||
newViewport.width = viewport.width;
|
||||
newViewport.height = viewport.height;
|
||||
}
|
||||
if (devicePixelRatio === null) {
|
||||
// Disable override.
|
||||
newViewport.deviceScaleFactor = 0;
|
||||
}
|
||||
else if (devicePixelRatio !== undefined) {
|
||||
newViewport.deviceScaleFactor = devicePixelRatio;
|
||||
}
|
||||
try {
|
||||
await this.cdpClient.sendCommand('Emulation.setDeviceMetricsOverride', newViewport);
|
||||
this.#previousDeviceMetricsOverride = newViewport;
|
||||
}
|
||||
catch (err) {
|
||||
if (err.message.startsWith(
|
||||
// https://crsrc.org/c/content/browser/devtools/protocol/emulation_handler.cc;l=257;drc=2f6eee84cf98d4227e7c41718dd71b82f26d90ff
|
||||
'Width and height values must be positive')) {
|
||||
throw new protocol_js_1.UnsupportedOperationException('Provided viewport dimensions are not supported');
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Immediately schedules all the required commands to configure user context
|
||||
* configuration and waits for them to finish. It's important to schedule them
|
||||
* in parallel, so that they are enqueued before any page's scripts.
|
||||
*/
|
||||
async #setUserContextConfig() {
|
||||
const promises = [];
|
||||
const config = this.contextConfigStorage.getActiveConfig(this.topLevelId, this.#userContext);
|
||||
promises.push(this.#cdpClient
|
||||
.sendCommand('Page.setPrerenderingAllowed', {
|
||||
isAllowed: !config.prerenderingDisabled,
|
||||
})
|
||||
.catch(() => {
|
||||
// Ignore CDP errors, as the command is not supported by iframe targets or
|
||||
// prerendered pages. Generic catch, as the error can vary between CdpClient
|
||||
// implementations: Tab vs Puppeteer.
|
||||
}));
|
||||
if (config.viewport !== undefined ||
|
||||
config.devicePixelRatio !== undefined) {
|
||||
promises.push(this.setViewport(config.viewport, config.devicePixelRatio).catch(() => {
|
||||
// Ignore CDP errors, as the command is not supported by iframe targets. Generic
|
||||
// catch, as the error can vary between CdpClient implementations: Tab vs
|
||||
// Puppeteer.
|
||||
}));
|
||||
}
|
||||
if (config.screenOrientation !== undefined &&
|
||||
config.screenOrientation !== null) {
|
||||
promises.push(this.setScreenOrientationOverride(config.screenOrientation).catch(() => {
|
||||
// Ignore CDP errors, as the command is not supported by iframe targets.
|
||||
// Generic catch, as the error can vary between CdpClient implementations:
|
||||
// Tab vs Puppeteer.
|
||||
}));
|
||||
}
|
||||
if (config.geolocation !== undefined && config.geolocation !== null) {
|
||||
promises.push(this.setGeolocationOverride(config.geolocation));
|
||||
}
|
||||
if (config.locale !== undefined) {
|
||||
promises.push(this.setLocaleOverride(config.locale));
|
||||
}
|
||||
if (config.timezone !== undefined) {
|
||||
promises.push(this.setTimezoneOverride(config.timezone));
|
||||
}
|
||||
if (config.extraHeaders !== undefined) {
|
||||
promises.push(this.setExtraHeaders(config.extraHeaders));
|
||||
}
|
||||
if (config.scriptingEnabled !== undefined) {
|
||||
promises.push(this.setScriptingEnabled(config.scriptingEnabled));
|
||||
}
|
||||
if (config.acceptInsecureCerts !== undefined) {
|
||||
promises.push(this.cdpClient.sendCommand('Security.setIgnoreCertificateErrors', {
|
||||
ignore: config.acceptInsecureCerts,
|
||||
}));
|
||||
}
|
||||
await Promise.all(promises);
|
||||
}
|
||||
get topLevelId() {
|
||||
return (this.#browsingContextStorage.findTopLevelContextId(this.id) ?? this.id);
|
||||
}
|
||||
isSubscribedTo(moduleOrEvent) {
|
||||
return this.#eventManager.subscriptionManager.isSubscribedTo(moduleOrEvent, this.topLevelId);
|
||||
}
|
||||
#ignoreFileDialog() {
|
||||
const config = this.contextConfigStorage.getActiveConfig(this.topLevelId, this.#userContext);
|
||||
return ((config.userPromptHandler?.file ??
|
||||
config.userPromptHandler?.default ??
|
||||
"ignore" /* Session.UserPromptHandlerType.Ignore */) ===
|
||||
"ignore" /* Session.UserPromptHandlerType.Ignore */);
|
||||
}
|
||||
async setGeolocationOverride(geolocation) {
|
||||
if (geolocation === null) {
|
||||
await this.cdpClient.sendCommand('Emulation.clearGeolocationOverride');
|
||||
}
|
||||
else if ('type' in geolocation) {
|
||||
if (geolocation.type !== 'positionUnavailable') {
|
||||
// Unreachable. Handled by params parser.
|
||||
throw new protocol_js_1.UnknownErrorException(`Unknown geolocation error ${geolocation.type}`);
|
||||
}
|
||||
// Omitting latitude, longitude or accuracy emulates position unavailable.
|
||||
await this.cdpClient.sendCommand('Emulation.setGeolocationOverride', {});
|
||||
}
|
||||
else if ('latitude' in geolocation) {
|
||||
await this.cdpClient.sendCommand('Emulation.setGeolocationOverride', {
|
||||
latitude: geolocation.latitude,
|
||||
longitude: geolocation.longitude,
|
||||
accuracy: geolocation.accuracy ?? 1,
|
||||
// `null` value is treated as "missing".
|
||||
altitude: geolocation.altitude ?? undefined,
|
||||
altitudeAccuracy: geolocation.altitudeAccuracy ?? undefined,
|
||||
heading: geolocation.heading ?? undefined,
|
||||
speed: geolocation.speed ?? undefined,
|
||||
});
|
||||
}
|
||||
else {
|
||||
// Unreachable. Handled by params parser.
|
||||
throw new protocol_js_1.UnknownErrorException('Unexpected geolocation coordinates value');
|
||||
}
|
||||
}
|
||||
async setScreenOrientationOverride(screenOrientation) {
|
||||
const newViewport = { ...this.#previousDeviceMetricsOverride };
|
||||
if (screenOrientation === null) {
|
||||
delete newViewport.screenOrientation;
|
||||
}
|
||||
else {
|
||||
newViewport.screenOrientation =
|
||||
this.#toCdpScreenOrientationAngle(screenOrientation);
|
||||
}
|
||||
await this.cdpClient.sendCommand('Emulation.setDeviceMetricsOverride', newViewport);
|
||||
this.#previousDeviceMetricsOverride = newViewport;
|
||||
}
|
||||
#toCdpScreenOrientationAngle(orientation) {
|
||||
// https://w3c.github.io/screen-orientation/#the-current-screen-orientation-type-and-angle
|
||||
if (orientation.natural === "portrait" /* Emulation.ScreenOrientationNatural.Portrait */) {
|
||||
switch (orientation.type) {
|
||||
case 'portrait-primary':
|
||||
return {
|
||||
angle: 0,
|
||||
type: 'portraitPrimary',
|
||||
};
|
||||
case 'landscape-primary':
|
||||
return {
|
||||
angle: 90,
|
||||
type: 'landscapePrimary',
|
||||
};
|
||||
case 'portrait-secondary':
|
||||
return {
|
||||
angle: 180,
|
||||
type: 'portraitSecondary',
|
||||
};
|
||||
case 'landscape-secondary':
|
||||
return {
|
||||
angle: 270,
|
||||
type: 'landscapeSecondary',
|
||||
};
|
||||
default:
|
||||
// Unreachable.
|
||||
throw new protocol_js_1.UnknownErrorException(`Unexpected screen orientation type ${orientation.type}`);
|
||||
}
|
||||
}
|
||||
if (orientation.natural === "landscape" /* Emulation.ScreenOrientationNatural.Landscape */) {
|
||||
switch (orientation.type) {
|
||||
case 'landscape-primary':
|
||||
return {
|
||||
angle: 0,
|
||||
type: 'landscapePrimary',
|
||||
};
|
||||
case 'portrait-primary':
|
||||
return {
|
||||
angle: 90,
|
||||
type: 'portraitPrimary',
|
||||
};
|
||||
case 'landscape-secondary':
|
||||
return {
|
||||
angle: 180,
|
||||
type: 'landscapeSecondary',
|
||||
};
|
||||
case 'portrait-secondary':
|
||||
return {
|
||||
angle: 270,
|
||||
type: 'portraitSecondary',
|
||||
};
|
||||
default:
|
||||
// Unreachable.
|
||||
throw new protocol_js_1.UnknownErrorException(`Unexpected screen orientation type ${orientation.type}`);
|
||||
}
|
||||
}
|
||||
// Unreachable.
|
||||
throw new protocol_js_1.UnknownErrorException(`Unexpected orientation natural ${orientation.natural}`);
|
||||
}
|
||||
async setLocaleOverride(locale) {
|
||||
if (locale === null) {
|
||||
await this.cdpClient.sendCommand('Emulation.setLocaleOverride', {});
|
||||
}
|
||||
else {
|
||||
await this.cdpClient.sendCommand('Emulation.setLocaleOverride', {
|
||||
locale,
|
||||
});
|
||||
}
|
||||
}
|
||||
async setScriptingEnabled(scriptingEnabled) {
|
||||
await this.cdpClient.sendCommand('Emulation.setScriptExecutionDisabled', {
|
||||
value: scriptingEnabled === false,
|
||||
});
|
||||
}
|
||||
async setTimezoneOverride(timezone) {
|
||||
if (timezone === null) {
|
||||
await this.cdpClient.sendCommand('Emulation.setTimezoneOverride', {
|
||||
// If empty, disables the override and restores default host system timezone.
|
||||
timezoneId: '',
|
||||
});
|
||||
}
|
||||
else {
|
||||
await this.cdpClient.sendCommand('Emulation.setTimezoneOverride', {
|
||||
timezoneId: timezone,
|
||||
});
|
||||
}
|
||||
}
|
||||
async setExtraHeaders(headers) {
|
||||
await this.cdpClient.sendCommand('Network.setExtraHTTPHeaders', {
|
||||
headers,
|
||||
});
|
||||
}
|
||||
}
|
||||
exports.CdpTarget = CdpTarget;
|
||||
//# sourceMappingURL=CdpTarget.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTarget.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTarget.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
15
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTargetManager.d.ts
generated
vendored
Normal file
15
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTargetManager.d.ts
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
import type { CdpClient } from '../../../cdp/CdpClient.js';
|
||||
import type { CdpConnection } from '../../../cdp/CdpConnection.js';
|
||||
import type { Browser } from '../../../protocol/protocol.js';
|
||||
import { type LoggerFn } from '../../../utils/log.js';
|
||||
import type { BluetoothProcessor } from '../bluetooth/BluetoothProcessor.js';
|
||||
import type { ContextConfigStorage } from '../browser/ContextConfigStorage.js';
|
||||
import type { BrowsingContextStorage } from '../context/BrowsingContextStorage.js';
|
||||
import type { NetworkStorage } from '../network/NetworkStorage.js';
|
||||
import type { PreloadScriptStorage } from '../script/PreloadScriptStorage.js';
|
||||
import type { RealmStorage } from '../script/RealmStorage.js';
|
||||
import type { EventManager } from '../session/EventManager.js';
|
||||
export declare class CdpTargetManager {
|
||||
#private;
|
||||
constructor(cdpConnection: CdpConnection, browserCdpClient: CdpClient, selfTargetId: string, eventManager: EventManager, browsingContextStorage: BrowsingContextStorage, realmStorage: RealmStorage, networkStorage: NetworkStorage, configStorage: ContextConfigStorage, bluetoothProcessor: BluetoothProcessor, preloadScriptStorage: PreloadScriptStorage, defaultUserContextId: Browser.UserContext, logger?: LoggerFn);
|
||||
}
|
||||
244
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTargetManager.js
generated
vendored
Normal file
244
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTargetManager.js
generated
vendored
Normal file
@@ -0,0 +1,244 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.CdpTargetManager = void 0;
|
||||
const log_js_1 = require("../../../utils/log.js");
|
||||
const BrowsingContextImpl_js_1 = require("../context/BrowsingContextImpl.js");
|
||||
const WorkerRealm_js_1 = require("../script/WorkerRealm.js");
|
||||
const CdpTarget_js_1 = require("./CdpTarget.js");
|
||||
const cdpToBidiTargetTypes = {
|
||||
service_worker: 'service-worker',
|
||||
shared_worker: 'shared-worker',
|
||||
worker: 'dedicated-worker',
|
||||
};
|
||||
class CdpTargetManager {
|
||||
#browserCdpClient;
|
||||
#cdpConnection;
|
||||
#targetKeysToBeIgnoredByAutoAttach = new Set();
|
||||
#selfTargetId;
|
||||
#eventManager;
|
||||
#browsingContextStorage;
|
||||
#networkStorage;
|
||||
#bluetoothProcessor;
|
||||
#preloadScriptStorage;
|
||||
#realmStorage;
|
||||
#configStorage;
|
||||
#defaultUserContextId;
|
||||
#logger;
|
||||
constructor(cdpConnection, browserCdpClient, selfTargetId, eventManager, browsingContextStorage, realmStorage, networkStorage, configStorage, bluetoothProcessor, preloadScriptStorage, defaultUserContextId, logger) {
|
||||
this.#cdpConnection = cdpConnection;
|
||||
this.#browserCdpClient = browserCdpClient;
|
||||
this.#targetKeysToBeIgnoredByAutoAttach.add(selfTargetId);
|
||||
this.#selfTargetId = selfTargetId;
|
||||
this.#eventManager = eventManager;
|
||||
this.#browsingContextStorage = browsingContextStorage;
|
||||
this.#preloadScriptStorage = preloadScriptStorage;
|
||||
this.#networkStorage = networkStorage;
|
||||
this.#configStorage = configStorage;
|
||||
this.#bluetoothProcessor = bluetoothProcessor;
|
||||
this.#realmStorage = realmStorage;
|
||||
this.#defaultUserContextId = defaultUserContextId;
|
||||
this.#logger = logger;
|
||||
this.#setEventListeners(browserCdpClient);
|
||||
}
|
||||
/**
|
||||
* This method is called for each CDP session, since this class is responsible
|
||||
* for creating and destroying all targets and browsing contexts.
|
||||
*/
|
||||
#setEventListeners(cdpClient) {
|
||||
cdpClient.on('Target.attachedToTarget', (params) => {
|
||||
this.#handleAttachedToTargetEvent(params, cdpClient);
|
||||
});
|
||||
cdpClient.on('Target.detachedFromTarget', this.#handleDetachedFromTargetEvent.bind(this));
|
||||
cdpClient.on('Target.targetInfoChanged', this.#handleTargetInfoChangedEvent.bind(this));
|
||||
cdpClient.on('Inspector.targetCrashed', () => {
|
||||
this.#handleTargetCrashedEvent(cdpClient);
|
||||
});
|
||||
cdpClient.on('Page.frameAttached', this.#handleFrameAttachedEvent.bind(this));
|
||||
cdpClient.on('Page.frameSubtreeWillBeDetached', this.#handleFrameSubtreeWillBeDetached.bind(this));
|
||||
}
|
||||
#handleFrameAttachedEvent(params) {
|
||||
const parentBrowsingContext = this.#browsingContextStorage.findContext(params.parentFrameId);
|
||||
if (parentBrowsingContext !== undefined) {
|
||||
BrowsingContextImpl_js_1.BrowsingContextImpl.create(params.frameId, params.parentFrameId, parentBrowsingContext.userContext, parentBrowsingContext.cdpTarget, this.#eventManager, this.#browsingContextStorage, this.#realmStorage, this.#configStorage,
|
||||
// At this point, we don't know the URL of the frame yet, so it will be updated
|
||||
// later.
|
||||
'about:blank', undefined, this.#logger);
|
||||
}
|
||||
}
|
||||
#handleFrameSubtreeWillBeDetached(params) {
|
||||
this.#browsingContextStorage.findContext(params.frameId)?.dispose(true);
|
||||
}
|
||||
#handleAttachedToTargetEvent(params, parentSessionCdpClient) {
|
||||
const { sessionId, targetInfo } = params;
|
||||
const targetCdpClient = this.#cdpConnection.getCdpClient(sessionId);
|
||||
const detach = async () => {
|
||||
// Detaches and resumes the target suppressing errors.
|
||||
await targetCdpClient
|
||||
.sendCommand('Runtime.runIfWaitingForDebugger')
|
||||
.then(() => parentSessionCdpClient.sendCommand('Target.detachFromTarget', params))
|
||||
.catch((error) => this.#logger?.(log_js_1.LogType.debugError, error));
|
||||
};
|
||||
// Do not attach to the Mapper target.
|
||||
if (this.#selfTargetId === targetInfo.targetId) {
|
||||
void detach();
|
||||
return;
|
||||
}
|
||||
// Service workers are special case because they attach to the
|
||||
// browser target and the page target (so twice per worker) during
|
||||
// the regular auto-attach and might hang if the CDP session on
|
||||
// the browser level is not detached. The logic to detach the
|
||||
// right session is handled in the switch below.
|
||||
const targetKey = targetInfo.type === 'service_worker'
|
||||
? `${parentSessionCdpClient.sessionId}_${targetInfo.targetId}`
|
||||
: targetInfo.targetId;
|
||||
// Mapper generally only needs one session per target. If we
|
||||
// receive additional auto-attached sessions, that is very likely
|
||||
// coming from custom CDP sessions.
|
||||
if (this.#targetKeysToBeIgnoredByAutoAttach.has(targetKey)) {
|
||||
// Return to leave the session untouched.
|
||||
return;
|
||||
}
|
||||
this.#targetKeysToBeIgnoredByAutoAttach.add(targetKey);
|
||||
const userContext = targetInfo.browserContextId &&
|
||||
targetInfo.browserContextId !== this.#defaultUserContextId
|
||||
? targetInfo.browserContextId
|
||||
: 'default';
|
||||
switch (targetInfo.type) {
|
||||
case 'tab': {
|
||||
// Tab targets are required only to handle page targets beneath them.
|
||||
this.#setEventListeners(targetCdpClient);
|
||||
// Auto-attach to the page target. No need in resuming tab target debugger, as it
|
||||
// should preserve the page target debugger state, and will be resumed by the page
|
||||
// target.
|
||||
void (async () => {
|
||||
await targetCdpClient.sendCommand('Target.setAutoAttach', {
|
||||
autoAttach: true,
|
||||
waitForDebuggerOnStart: true,
|
||||
flatten: true,
|
||||
});
|
||||
})();
|
||||
return;
|
||||
}
|
||||
case 'page':
|
||||
case 'iframe': {
|
||||
const cdpTarget = this.#createCdpTarget(targetCdpClient, parentSessionCdpClient, targetInfo, userContext);
|
||||
const maybeContext = this.#browsingContextStorage.findContext(targetInfo.targetId);
|
||||
if (maybeContext && targetInfo.type === 'iframe') {
|
||||
// OOPiF.
|
||||
maybeContext.updateCdpTarget(cdpTarget);
|
||||
}
|
||||
else {
|
||||
// If attaching to existing browser instance, there could be OOPiF targets. This
|
||||
// case is handled by the `findFrameParentId` method.
|
||||
const parentId = this.#findFrameParentId(targetInfo, parentSessionCdpClient.sessionId);
|
||||
// New context.
|
||||
BrowsingContextImpl_js_1.BrowsingContextImpl.create(targetInfo.targetId, parentId, userContext, cdpTarget, this.#eventManager, this.#browsingContextStorage, this.#realmStorage, this.#configStorage,
|
||||
// Hack: when a new target created, CDP emits targetInfoChanged with an empty
|
||||
// url, and navigates it to about:blank later. When the event is emitted for
|
||||
// an existing target (reconnect), the url is already known, and navigation
|
||||
// events will not be emitted anymore. Replacing empty url with `about:blank`
|
||||
// allows to handle both cases in the same way.
|
||||
// "7.3.2.1 Creating browsing contexts".
|
||||
// https://html.spec.whatwg.org/multipage/document-sequences.html#creating-browsing-contexts
|
||||
// TODO: check who to deal with non-null creator and its `creatorOrigin`.
|
||||
targetInfo.url === '' ? 'about:blank' : targetInfo.url, targetInfo.openerFrameId ?? targetInfo.openerId, this.#logger);
|
||||
}
|
||||
return;
|
||||
}
|
||||
case 'service_worker':
|
||||
case 'worker': {
|
||||
const realm = this.#realmStorage.findRealm({
|
||||
cdpSessionId: parentSessionCdpClient.sessionId,
|
||||
});
|
||||
// If there is no browsing context, this worker is already terminated.
|
||||
if (!realm) {
|
||||
void detach();
|
||||
return;
|
||||
}
|
||||
const cdpTarget = this.#createCdpTarget(targetCdpClient, parentSessionCdpClient, targetInfo, userContext);
|
||||
this.#handleWorkerTarget(cdpToBidiTargetTypes[targetInfo.type], cdpTarget, realm);
|
||||
return;
|
||||
}
|
||||
// In CDP, we only emit shared workers on the browser and not the set of
|
||||
// frames that use the shared worker. If we change this in the future to
|
||||
// behave like service workers (emits on both browser and frame targets),
|
||||
// we can remove this block and merge service workers with the above one.
|
||||
case 'shared_worker': {
|
||||
const cdpTarget = this.#createCdpTarget(targetCdpClient, parentSessionCdpClient, targetInfo, userContext);
|
||||
this.#handleWorkerTarget(cdpToBidiTargetTypes[targetInfo.type], cdpTarget);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// DevTools or some other not supported by BiDi target. Just release
|
||||
// debugger and ignore them.
|
||||
void detach();
|
||||
}
|
||||
/** Try to find the parent browsing context ID for the given attached target. */
|
||||
#findFrameParentId(targetInfo, parentSessionId) {
|
||||
if (targetInfo.type !== 'iframe') {
|
||||
return null;
|
||||
}
|
||||
const parentId = targetInfo.openerFrameId ?? targetInfo.openerId;
|
||||
if (parentId !== undefined) {
|
||||
return parentId;
|
||||
}
|
||||
if (parentSessionId !== undefined) {
|
||||
return (this.#browsingContextStorage.findContextBySession(parentSessionId)
|
||||
?.id ?? null);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
#createCdpTarget(targetCdpClient, parentCdpClient, targetInfo, userContext) {
|
||||
this.#setEventListeners(targetCdpClient);
|
||||
this.#preloadScriptStorage.onCdpTargetCreated(targetInfo.targetId, userContext);
|
||||
const target = CdpTarget_js_1.CdpTarget.create(targetInfo.targetId, targetCdpClient, this.#browserCdpClient, parentCdpClient, this.#realmStorage, this.#eventManager, this.#preloadScriptStorage, this.#browsingContextStorage, this.#networkStorage, this.#configStorage, userContext, this.#logger);
|
||||
this.#networkStorage.onCdpTargetCreated(target);
|
||||
this.#bluetoothProcessor.onCdpTargetCreated(target);
|
||||
return target;
|
||||
}
|
||||
#workers = new Map();
|
||||
#handleWorkerTarget(realmType, cdpTarget, ownerRealm) {
|
||||
cdpTarget.cdpClient.on('Runtime.executionContextCreated', (params) => {
|
||||
const { uniqueId, id, origin } = params.context;
|
||||
const workerRealm = new WorkerRealm_js_1.WorkerRealm(cdpTarget.cdpClient, this.#eventManager, id, this.#logger, (0, BrowsingContextImpl_js_1.serializeOrigin)(origin), ownerRealm ? [ownerRealm] : [], uniqueId, this.#realmStorage, realmType);
|
||||
this.#workers.set(cdpTarget.cdpSessionId, workerRealm);
|
||||
});
|
||||
}
|
||||
#handleDetachedFromTargetEvent({ sessionId, targetId, }) {
|
||||
if (targetId) {
|
||||
this.#preloadScriptStorage.find({ targetId }).map((preloadScript) => {
|
||||
preloadScript.dispose(targetId);
|
||||
});
|
||||
}
|
||||
const context = this.#browsingContextStorage.findContextBySession(sessionId);
|
||||
if (context) {
|
||||
context.dispose(true);
|
||||
return;
|
||||
}
|
||||
const worker = this.#workers.get(sessionId);
|
||||
if (worker) {
|
||||
this.#realmStorage.deleteRealms({
|
||||
cdpSessionId: worker.cdpClient.sessionId,
|
||||
});
|
||||
}
|
||||
}
|
||||
#handleTargetInfoChangedEvent(params) {
|
||||
const context = this.#browsingContextStorage.findContext(params.targetInfo.targetId);
|
||||
if (context) {
|
||||
context.onTargetInfoChanged(params);
|
||||
}
|
||||
}
|
||||
#handleTargetCrashedEvent(cdpClient) {
|
||||
// This is primarily used for service and shared workers. CDP tends to not
|
||||
// signal they closed gracefully and instead says they crashed to signal
|
||||
// they are closed.
|
||||
const realms = this.#realmStorage.findRealms({
|
||||
cdpSessionId: cdpClient.sessionId,
|
||||
});
|
||||
for (const realm of realms) {
|
||||
realm.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.CdpTargetManager = CdpTargetManager;
|
||||
//# sourceMappingURL=CdpTargetManager.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTargetManager.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/cdp/CdpTargetManager.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
88
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextImpl.d.ts
generated
vendored
Normal file
88
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextImpl.d.ts
generated
vendored
Normal file
@@ -0,0 +1,88 @@
|
||||
/**
|
||||
* Copyright 2022 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { Protocol } from 'devtools-protocol';
|
||||
import { BrowsingContext, type Emulation } from '../../../protocol/protocol.js';
|
||||
import { type LoggerFn } from '../../../utils/log.js';
|
||||
import type { ContextConfigStorage } from '../browser/ContextConfigStorage.js';
|
||||
import type { CdpTarget } from '../cdp/CdpTarget.js';
|
||||
import type { Realm } from '../script/Realm.js';
|
||||
import type { RealmStorage } from '../script/RealmStorage.js';
|
||||
import type { EventManager } from '../session/EventManager.js';
|
||||
import type { BrowsingContextStorage } from './BrowsingContextStorage.js';
|
||||
export declare class BrowsingContextImpl {
|
||||
#private;
|
||||
static readonly LOGGER_PREFIX: "debug:browsingContext";
|
||||
readonly userContext: string;
|
||||
private constructor();
|
||||
static create(id: BrowsingContext.BrowsingContext, parentId: BrowsingContext.BrowsingContext | null, userContext: string, cdpTarget: CdpTarget, eventManager: EventManager, browsingContextStorage: BrowsingContextStorage, realmStorage: RealmStorage, configStorage: ContextConfigStorage, url: string, originalOpener?: string, logger?: LoggerFn): BrowsingContextImpl;
|
||||
/**
|
||||
* @see https://html.spec.whatwg.org/multipage/document-sequences.html#navigable
|
||||
*/
|
||||
get navigableId(): string | undefined;
|
||||
get navigationId(): string;
|
||||
dispose(emitContextDestroyed: boolean): void;
|
||||
/** Returns the ID of this context. */
|
||||
get id(): BrowsingContext.BrowsingContext;
|
||||
/** Returns the parent context ID. */
|
||||
get parentId(): BrowsingContext.BrowsingContext | null;
|
||||
/** Sets the parent context ID and updates parent's children. */
|
||||
set parentId(parentId: BrowsingContext.BrowsingContext | null);
|
||||
/** Returns the parent context. */
|
||||
get parent(): BrowsingContextImpl | null;
|
||||
/** Returns all direct children contexts. */
|
||||
get directChildren(): BrowsingContextImpl[];
|
||||
/** Returns all children contexts, flattened. */
|
||||
get allChildren(): BrowsingContextImpl[];
|
||||
/**
|
||||
* Returns true if this is a top-level context.
|
||||
* This is the case whenever the parent context ID is null.
|
||||
*/
|
||||
isTopLevelContext(): boolean;
|
||||
get top(): BrowsingContextImpl;
|
||||
addChild(childId: BrowsingContext.BrowsingContext): void;
|
||||
get cdpTarget(): CdpTarget;
|
||||
updateCdpTarget(cdpTarget: CdpTarget): void;
|
||||
get url(): string;
|
||||
lifecycleLoaded(): Promise<void>;
|
||||
targetUnblockedOrThrow(): Promise<void>;
|
||||
/** Returns a sandbox for internal helper scripts which is not exposed to the user.*/
|
||||
getOrCreateHiddenSandbox(): Promise<Realm>;
|
||||
/** Returns a sandbox which is exposed to user. */
|
||||
getOrCreateUserSandbox(sandbox: string | undefined): Promise<Realm>;
|
||||
/**
|
||||
* Implements https://w3c.github.io/webdriver-bidi/#get-the-navigable-info.
|
||||
*/
|
||||
serializeToBidiValue(maxDepth?: number | null, addParentField?: boolean): BrowsingContext.Info;
|
||||
onTargetInfoChanged(params: Protocol.Target.TargetInfoChangedEvent): void;
|
||||
navigate(url: string, wait: BrowsingContext.ReadinessState): Promise<BrowsingContext.NavigateResult>;
|
||||
reload(ignoreCache: boolean, wait: BrowsingContext.ReadinessState): Promise<BrowsingContext.NavigateResult>;
|
||||
setViewport(viewport?: BrowsingContext.Viewport | null, devicePixelRatio?: number | null): Promise<void>;
|
||||
handleUserPrompt(accept?: boolean, userText?: string): Promise<void>;
|
||||
activate(): Promise<void>;
|
||||
captureScreenshot(params: BrowsingContext.CaptureScreenshotParameters): Promise<BrowsingContext.CaptureScreenshotResult>;
|
||||
print(params: BrowsingContext.PrintParameters): Promise<BrowsingContext.PrintResult>;
|
||||
close(): Promise<void>;
|
||||
traverseHistory(delta: number): Promise<void>;
|
||||
toggleModulesIfNeeded(): Promise<void>;
|
||||
locateNodes(params: BrowsingContext.LocateNodesParameters): Promise<BrowsingContext.LocateNodesResult>;
|
||||
setTimezoneOverride(timezone: string | null): Promise<void>;
|
||||
setLocaleOverride(locale: string | null): Promise<void>;
|
||||
setGeolocationOverride(geolocation: Emulation.GeolocationCoordinates | Emulation.GeolocationPositionError | null): Promise<void>;
|
||||
setScreenOrientationOverride(screenOrientation: Emulation.ScreenOrientation | null): Promise<void>;
|
||||
setScriptingEnabled(scriptingEnabled: false | null): Promise<void>;
|
||||
}
|
||||
export declare function serializeOrigin(origin: string): string;
|
||||
1447
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextImpl.js
generated
vendored
Normal file
1447
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextImpl.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextImpl.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextImpl.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
22
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextProcessor.d.ts
generated
vendored
Normal file
22
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextProcessor.d.ts
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
import type { CdpClient } from '../../../cdp/CdpClient.js';
|
||||
import { BrowsingContext, type EmptyResult } from '../../../protocol/protocol.js';
|
||||
import type { ContextConfigStorage } from '../browser/ContextConfigStorage.js';
|
||||
import type { UserContextStorage } from '../browser/UserContextStorage.js';
|
||||
import type { EventManager } from '../session/EventManager.js';
|
||||
import type { BrowsingContextStorage } from './BrowsingContextStorage.js';
|
||||
export declare class BrowsingContextProcessor {
|
||||
#private;
|
||||
constructor(browserCdpClient: CdpClient, browsingContextStorage: BrowsingContextStorage, userContextStorage: UserContextStorage, contextConfigStorage: ContextConfigStorage, eventManager: EventManager);
|
||||
getTree(params: BrowsingContext.GetTreeParameters): BrowsingContext.GetTreeResult;
|
||||
create(params: BrowsingContext.CreateParameters): Promise<BrowsingContext.CreateResult>;
|
||||
navigate(params: BrowsingContext.NavigateParameters): Promise<BrowsingContext.NavigateResult>;
|
||||
reload(params: BrowsingContext.ReloadParameters): Promise<EmptyResult>;
|
||||
activate(params: BrowsingContext.ActivateParameters): Promise<EmptyResult>;
|
||||
captureScreenshot(params: BrowsingContext.CaptureScreenshotParameters): Promise<BrowsingContext.CaptureScreenshotResult>;
|
||||
print(params: BrowsingContext.PrintParameters): Promise<BrowsingContext.PrintResult>;
|
||||
setViewport(params: BrowsingContext.SetViewportParameters): Promise<EmptyResult>;
|
||||
traverseHistory(params: BrowsingContext.TraverseHistoryParameters): Promise<BrowsingContext.TraverseHistoryResult>;
|
||||
handleUserPrompt(params: BrowsingContext.HandleUserPromptParameters): Promise<EmptyResult>;
|
||||
close(params: BrowsingContext.CloseParameters): Promise<EmptyResult>;
|
||||
locateNodes(params: BrowsingContext.LocateNodesParameters): Promise<BrowsingContext.LocateNodesResult>;
|
||||
}
|
||||
256
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextProcessor.js
generated
vendored
Normal file
256
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextProcessor.js
generated
vendored
Normal file
@@ -0,0 +1,256 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.BrowsingContextProcessor = void 0;
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
class BrowsingContextProcessor {
|
||||
#browserCdpClient;
|
||||
#browsingContextStorage;
|
||||
#contextConfigStorage;
|
||||
#eventManager;
|
||||
#userContextStorage;
|
||||
constructor(browserCdpClient, browsingContextStorage, userContextStorage, contextConfigStorage, eventManager) {
|
||||
this.#contextConfigStorage = contextConfigStorage;
|
||||
this.#userContextStorage = userContextStorage;
|
||||
this.#browserCdpClient = browserCdpClient;
|
||||
this.#browsingContextStorage = browsingContextStorage;
|
||||
this.#eventManager = eventManager;
|
||||
this.#eventManager.addSubscribeHook(protocol_js_1.ChromiumBidi.BrowsingContext.EventNames.ContextCreated, this.#onContextCreatedSubscribeHook.bind(this));
|
||||
}
|
||||
getTree(params) {
|
||||
const resultContexts = params.root === undefined
|
||||
? this.#browsingContextStorage.getTopLevelContexts()
|
||||
: [this.#browsingContextStorage.getContext(params.root)];
|
||||
return {
|
||||
contexts: resultContexts.map((c) => c.serializeToBidiValue(params.maxDepth ?? Number.MAX_VALUE)),
|
||||
};
|
||||
}
|
||||
async create(params) {
|
||||
let referenceContext;
|
||||
let userContext = 'default';
|
||||
if (params.referenceContext !== undefined) {
|
||||
referenceContext = this.#browsingContextStorage.getContext(params.referenceContext);
|
||||
if (!referenceContext.isTopLevelContext()) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`referenceContext should be a top-level context`);
|
||||
}
|
||||
userContext = referenceContext.userContext;
|
||||
}
|
||||
if (params.userContext !== undefined) {
|
||||
userContext = params.userContext;
|
||||
}
|
||||
const existingContexts = this.#browsingContextStorage
|
||||
.getAllContexts()
|
||||
.filter((context) => context.userContext === userContext);
|
||||
let newWindow = false;
|
||||
switch (params.type) {
|
||||
case "tab" /* BrowsingContext.CreateType.Tab */:
|
||||
newWindow = false;
|
||||
break;
|
||||
case "window" /* BrowsingContext.CreateType.Window */:
|
||||
newWindow = true;
|
||||
break;
|
||||
}
|
||||
if (!existingContexts.length) {
|
||||
// If there are no contexts in the given user context, we need to set
|
||||
// newWindow to true as newWindow=false will be rejected.
|
||||
newWindow = true;
|
||||
}
|
||||
let result;
|
||||
try {
|
||||
result = await this.#browserCdpClient.sendCommand('Target.createTarget', {
|
||||
url: 'about:blank',
|
||||
newWindow,
|
||||
browserContextId: userContext === 'default' ? undefined : userContext,
|
||||
background: params.background === true,
|
||||
});
|
||||
}
|
||||
catch (err) {
|
||||
if (
|
||||
// See https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/devtools/protocol/target_handler.cc;l=90;drc=e80392ac11e48a691f4309964cab83a3a59e01c8
|
||||
err.message.startsWith('Failed to find browser context with id') ||
|
||||
// See https://source.chromium.org/chromium/chromium/src/+/main:headless/lib/browser/protocol/target_handler.cc;l=49;drc=e80392ac11e48a691f4309964cab83a3a59e01c8
|
||||
err.message === 'browserContextId') {
|
||||
throw new protocol_js_1.NoSuchUserContextException(`The context ${userContext} was not found`);
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
// Wait for the new target to be attached and to be added to the browsing context
|
||||
// storage.
|
||||
const context = await this.#browsingContextStorage.waitForContext(result.targetId);
|
||||
// Wait for the new tab to be loaded to avoid race conditions in the
|
||||
// `browsingContext` events, when the `browsingContext.domContentLoaded` and
|
||||
// `browsingContext.load` events from the initial `about:blank` navigation
|
||||
// are emitted after the next navigation is started.
|
||||
// Details: https://github.com/web-platform-tests/wpt/issues/35846
|
||||
await context.lifecycleLoaded();
|
||||
return { context: context.id };
|
||||
}
|
||||
navigate(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
return context.navigate(params.url, params.wait ?? "none" /* BrowsingContext.ReadinessState.None */);
|
||||
}
|
||||
reload(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
return context.reload(params.ignoreCache ?? false, params.wait ?? "none" /* BrowsingContext.ReadinessState.None */);
|
||||
}
|
||||
async activate(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
if (!context.isTopLevelContext()) {
|
||||
throw new protocol_js_1.InvalidArgumentException('Activation is only supported on the top-level context');
|
||||
}
|
||||
await context.activate();
|
||||
return {};
|
||||
}
|
||||
async captureScreenshot(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
return await context.captureScreenshot(params);
|
||||
}
|
||||
async print(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
return await context.print(params);
|
||||
}
|
||||
async setViewport(params) {
|
||||
const config = {};
|
||||
// `undefined` means no changes should be done to the config.
|
||||
if (params.devicePixelRatio !== undefined) {
|
||||
config.devicePixelRatio = params.devicePixelRatio;
|
||||
}
|
||||
if (params.viewport !== undefined) {
|
||||
config.viewport = params.viewport;
|
||||
}
|
||||
const impactedTopLevelContexts = await this.#getRelatedTopLevelBrowsingContexts(params.context, params.userContexts);
|
||||
for (const userContextId of params.userContexts ?? []) {
|
||||
this.#contextConfigStorage.updateUserContextConfig(userContextId, config);
|
||||
}
|
||||
if (params.context !== undefined) {
|
||||
this.#contextConfigStorage.updateBrowsingContextConfig(params.context, config);
|
||||
}
|
||||
await Promise.all(impactedTopLevelContexts.map((context) => context.setViewport(params.viewport, params.devicePixelRatio)));
|
||||
return {};
|
||||
}
|
||||
/**
|
||||
* Returns a list of top-level browsing context ids.
|
||||
*/
|
||||
async #getRelatedTopLevelBrowsingContexts(browsingContextId, userContextIds) {
|
||||
if (browsingContextId === undefined && userContextIds === undefined) {
|
||||
throw new protocol_js_1.InvalidArgumentException('Either userContexts or context must be provided');
|
||||
}
|
||||
if (browsingContextId !== undefined && userContextIds !== undefined) {
|
||||
throw new protocol_js_1.InvalidArgumentException('userContexts and context are mutually exclusive');
|
||||
}
|
||||
if (browsingContextId !== undefined) {
|
||||
const context = this.#browsingContextStorage.getContext(browsingContextId);
|
||||
if (!context.isTopLevelContext()) {
|
||||
throw new protocol_js_1.InvalidArgumentException('Emulating viewport is only supported on the top-level context');
|
||||
}
|
||||
return [context];
|
||||
}
|
||||
// Verify that all user contexts exist.
|
||||
await this.#userContextStorage.verifyUserContextIdList(userContextIds);
|
||||
const result = [];
|
||||
for (const userContextId of userContextIds) {
|
||||
const topLevelBrowsingContexts = this.#browsingContextStorage
|
||||
.getTopLevelContexts()
|
||||
.filter((browsingContext) => browsingContext.userContext === userContextId);
|
||||
result.push(...topLevelBrowsingContexts);
|
||||
}
|
||||
// Remove duplicates. Compare `BrowsingContextImpl` by reference is correct here, as
|
||||
// `browsingContextStorage` returns the same instance for the same id.
|
||||
return [...new Set(result).values()];
|
||||
}
|
||||
async traverseHistory(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
if (!context) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`No browsing context with id ${params.context}`);
|
||||
}
|
||||
if (!context.isTopLevelContext()) {
|
||||
throw new protocol_js_1.InvalidArgumentException('Traversing history is only supported on the top-level context');
|
||||
}
|
||||
await context.traverseHistory(params.delta);
|
||||
return {};
|
||||
}
|
||||
async handleUserPrompt(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
try {
|
||||
await context.handleUserPrompt(params.accept, params.userText);
|
||||
}
|
||||
catch (error) {
|
||||
// Heuristically determine the error
|
||||
// https://source.chromium.org/chromium/chromium/src/+/main:content/browser/devtools/protocol/page_handler.cc;l=1085?q=%22No%20dialog%20is%20showing%22&ss=chromium
|
||||
if (error.message?.includes('No dialog is showing')) {
|
||||
throw new protocol_js_1.NoSuchAlertException('No dialog is showing');
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
return {};
|
||||
}
|
||||
async close(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
if (!context.isTopLevelContext()) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Non top-level browsing context ${context.id} cannot be closed.`);
|
||||
}
|
||||
// Parent session of a page target session can be a `browser` or a `tab` session.
|
||||
const parentCdpClient = context.cdpTarget.parentCdpClient;
|
||||
try {
|
||||
const detachedFromTargetPromise = new Promise((resolve) => {
|
||||
const onContextDestroyed = (event) => {
|
||||
if (event.targetId === params.context) {
|
||||
parentCdpClient.off('Target.detachedFromTarget', onContextDestroyed);
|
||||
resolve();
|
||||
}
|
||||
};
|
||||
parentCdpClient.on('Target.detachedFromTarget', onContextDestroyed);
|
||||
});
|
||||
try {
|
||||
if (params.promptUnload) {
|
||||
await context.close();
|
||||
}
|
||||
else {
|
||||
await parentCdpClient.sendCommand('Target.closeTarget', {
|
||||
targetId: params.context,
|
||||
});
|
||||
}
|
||||
}
|
||||
catch (error) {
|
||||
// Swallow error that arise from the session being destroyed. Rely on the
|
||||
// `detachedFromTargetPromise` event to be resolved.
|
||||
if (!parentCdpClient.isCloseError(error)) {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
// Sometimes CDP command finishes before `detachedFromTarget` event,
|
||||
// sometimes after. Wait for the CDP command to be finished, and then wait
|
||||
// for `detachedFromTarget` if it hasn't emitted.
|
||||
await detachedFromTargetPromise;
|
||||
}
|
||||
catch (error) {
|
||||
// Swallow error that arise from the page being destroyed
|
||||
// Example is navigating to faulty SSL certificate
|
||||
if (!(error.code === -32000 /* CdpErrorConstants.GENERIC_ERROR */ &&
|
||||
error.message === 'Not attached to an active page')) {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
return {};
|
||||
}
|
||||
async locateNodes(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
return await context.locateNodes(params);
|
||||
}
|
||||
#onContextCreatedSubscribeHook(contextId) {
|
||||
const context = this.#browsingContextStorage.getContext(contextId);
|
||||
const contextsToReport = [
|
||||
context,
|
||||
...this.#browsingContextStorage.getContext(contextId).allChildren,
|
||||
];
|
||||
contextsToReport.forEach((context) => {
|
||||
this.#eventManager.registerEvent({
|
||||
type: 'event',
|
||||
method: protocol_js_1.ChromiumBidi.BrowsingContext.EventNames.ContextCreated,
|
||||
params: context.serializeToBidiValue(),
|
||||
}, context.id);
|
||||
});
|
||||
return Promise.resolve();
|
||||
}
|
||||
}
|
||||
exports.BrowsingContextProcessor = BrowsingContextProcessor;
|
||||
//# sourceMappingURL=BrowsingContextProcessor.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextProcessor.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextProcessor.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
47
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextStorage.d.ts
generated
vendored
Normal file
47
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextStorage.d.ts
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Copyright 2022 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import { type BrowsingContext } from '../../../protocol/protocol.js';
|
||||
import type { BrowsingContextImpl } from './BrowsingContextImpl.js';
|
||||
/** Container class for browsing contexts. */
|
||||
export declare class BrowsingContextStorage {
|
||||
#private;
|
||||
/** Gets all top-level contexts, i.e. those with no parent. */
|
||||
getTopLevelContexts(): BrowsingContextImpl[];
|
||||
/** Gets all contexts. */
|
||||
getAllContexts(): BrowsingContextImpl[];
|
||||
/** Deletes the context with the given ID. */
|
||||
deleteContextById(id: BrowsingContext.BrowsingContext): void;
|
||||
/** Deletes the given context. */
|
||||
deleteContext(context: BrowsingContextImpl): void;
|
||||
/** Tracks the given context. */
|
||||
addContext(context: BrowsingContextImpl): void;
|
||||
/**
|
||||
* Waits for a context with the given ID to be added and returns it.
|
||||
*/
|
||||
waitForContext(browsingContextId: BrowsingContext.BrowsingContext): Promise<BrowsingContextImpl>;
|
||||
/** Returns true whether there is an existing context with the given ID. */
|
||||
hasContext(id: BrowsingContext.BrowsingContext): boolean;
|
||||
/** Gets the context with the given ID, if any. */
|
||||
findContext(id: BrowsingContext.BrowsingContext): BrowsingContextImpl | undefined;
|
||||
/** Returns the top-level context ID of the given context, if any. */
|
||||
findTopLevelContextId(id: BrowsingContext.BrowsingContext | null): BrowsingContext.BrowsingContext | null;
|
||||
findContextBySession(sessionId: string): BrowsingContextImpl | undefined;
|
||||
/** Gets the context with the given ID, if any, otherwise throws. */
|
||||
getContext(id: BrowsingContext.BrowsingContext): BrowsingContextImpl;
|
||||
verifyTopLevelContextsList(contexts: BrowsingContext.BrowsingContext[] | undefined): Set<BrowsingContextImpl>;
|
||||
verifyContextsList(contexts: BrowsingContext.BrowsingContext[]): void;
|
||||
}
|
||||
134
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextStorage.js
generated
vendored
Normal file
134
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextStorage.js
generated
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2022 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.BrowsingContextStorage = void 0;
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
const EventEmitter_js_1 = require("../../../utils/EventEmitter.js");
|
||||
/** Container class for browsing contexts. */
|
||||
class BrowsingContextStorage {
|
||||
/** Map from context ID to context implementation. */
|
||||
#contexts = new Map();
|
||||
/** Event emitter for browsing context storage eventsis not expected to be exposed to
|
||||
* the outside world. */
|
||||
#eventEmitter = new EventEmitter_js_1.EventEmitter();
|
||||
/** Gets all top-level contexts, i.e. those with no parent. */
|
||||
getTopLevelContexts() {
|
||||
return this.getAllContexts().filter((context) => context.isTopLevelContext());
|
||||
}
|
||||
/** Gets all contexts. */
|
||||
getAllContexts() {
|
||||
return Array.from(this.#contexts.values());
|
||||
}
|
||||
/** Deletes the context with the given ID. */
|
||||
deleteContextById(id) {
|
||||
this.#contexts.delete(id);
|
||||
}
|
||||
/** Deletes the given context. */
|
||||
deleteContext(context) {
|
||||
this.#contexts.delete(context.id);
|
||||
}
|
||||
/** Tracks the given context. */
|
||||
addContext(context) {
|
||||
this.#contexts.set(context.id, context);
|
||||
this.#eventEmitter.emit("added" /* BrowsingContextStorageEvents.Added */, {
|
||||
browsingContext: context,
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Waits for a context with the given ID to be added and returns it.
|
||||
*/
|
||||
waitForContext(browsingContextId) {
|
||||
if (this.#contexts.has(browsingContextId)) {
|
||||
return Promise.resolve(this.getContext(browsingContextId));
|
||||
}
|
||||
return new Promise((resolve) => {
|
||||
const listener = (event) => {
|
||||
if (event.browsingContext.id === browsingContextId) {
|
||||
this.#eventEmitter.off("added" /* BrowsingContextStorageEvents.Added */, listener);
|
||||
resolve(event.browsingContext);
|
||||
}
|
||||
};
|
||||
this.#eventEmitter.on("added" /* BrowsingContextStorageEvents.Added */, listener);
|
||||
});
|
||||
}
|
||||
/** Returns true whether there is an existing context with the given ID. */
|
||||
hasContext(id) {
|
||||
return this.#contexts.has(id);
|
||||
}
|
||||
/** Gets the context with the given ID, if any. */
|
||||
findContext(id) {
|
||||
return this.#contexts.get(id);
|
||||
}
|
||||
/** Returns the top-level context ID of the given context, if any. */
|
||||
findTopLevelContextId(id) {
|
||||
if (id === null) {
|
||||
return null;
|
||||
}
|
||||
const maybeContext = this.findContext(id);
|
||||
if (!maybeContext) {
|
||||
return null;
|
||||
}
|
||||
const parentId = maybeContext.parentId ?? null;
|
||||
if (parentId === null) {
|
||||
return id;
|
||||
}
|
||||
return this.findTopLevelContextId(parentId);
|
||||
}
|
||||
findContextBySession(sessionId) {
|
||||
for (const context of this.#contexts.values()) {
|
||||
if (context.cdpTarget.cdpSessionId === sessionId) {
|
||||
return context;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
/** Gets the context with the given ID, if any, otherwise throws. */
|
||||
getContext(id) {
|
||||
const result = this.findContext(id);
|
||||
if (result === undefined) {
|
||||
throw new protocol_js_1.NoSuchFrameException(`Context ${id} not found`);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
verifyTopLevelContextsList(contexts) {
|
||||
const foundContexts = new Set();
|
||||
if (!contexts) {
|
||||
return foundContexts;
|
||||
}
|
||||
for (const contextId of contexts) {
|
||||
const context = this.getContext(contextId);
|
||||
if (context.isTopLevelContext()) {
|
||||
foundContexts.add(context);
|
||||
}
|
||||
else {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Non top-level context '${contextId}' given.`);
|
||||
}
|
||||
}
|
||||
return foundContexts;
|
||||
}
|
||||
verifyContextsList(contexts) {
|
||||
if (!contexts.length) {
|
||||
return;
|
||||
}
|
||||
for (const contextId of contexts) {
|
||||
this.getContext(contextId);
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.BrowsingContextStorage = BrowsingContextStorage;
|
||||
//# sourceMappingURL=BrowsingContextStorage.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextStorage.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/BrowsingContextStorage.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"BrowsingContextStorage.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/context/BrowsingContextStorage.ts"],"names":[],"mappings":"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"}
|
||||
87
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/NavigationTracker.d.ts
generated
vendored
Normal file
87
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/NavigationTracker.d.ts
generated
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
import type { Protocol } from 'devtools-protocol';
|
||||
import { type BrowsingContext } from '../../../protocol/protocol.js';
|
||||
import { Deferred } from '../../../utils/Deferred.js';
|
||||
import { type LoggerFn } from '../../../utils/log.js';
|
||||
import type { EventManager } from '../session/EventManager.js';
|
||||
export declare const enum NavigationEventName {
|
||||
FragmentNavigated = "browsingContext.fragmentNavigated",
|
||||
NavigationAborted = "browsingContext.navigationAborted",
|
||||
NavigationFailed = "browsingContext.navigationFailed",
|
||||
Load = "browsingContext.load"
|
||||
}
|
||||
export declare class NavigationResult {
|
||||
readonly eventName: NavigationEventName;
|
||||
readonly message?: string;
|
||||
constructor(eventName: NavigationEventName, message?: string);
|
||||
}
|
||||
export declare class NavigationState {
|
||||
#private;
|
||||
readonly navigationId: `${string}-${string}-${string}-${string}-${string}`;
|
||||
url: string;
|
||||
loaderId?: string;
|
||||
committed: Deferred<void>;
|
||||
isFragmentNavigation?: boolean;
|
||||
get finished(): Promise<NavigationResult>;
|
||||
constructor(url: string, browsingContextId: string, isInitial: boolean, eventManager: EventManager);
|
||||
navigationInfo(): BrowsingContext.NavigationInfo;
|
||||
start(): void;
|
||||
frameNavigated(): void;
|
||||
fragmentNavigated(): void;
|
||||
load(): void;
|
||||
fail(message: string): void;
|
||||
}
|
||||
/**
|
||||
* Keeps track of navigations. Details: http://go/webdriver:bidi-navigation
|
||||
*/
|
||||
export declare class NavigationTracker {
|
||||
#private;
|
||||
constructor(url: string, browsingContextId: string, eventManager: EventManager, logger?: LoggerFn);
|
||||
/**
|
||||
* Returns current started ongoing navigation. It can be either a started pending
|
||||
* navigation, or one is already navigated.
|
||||
*/
|
||||
get currentNavigationId(): `${string}-${string}-${string}-${string}-${string}`;
|
||||
/**
|
||||
* Flags if the current navigation relates to the initial to `about:blank` navigation.
|
||||
*/
|
||||
get isInitialNavigation(): boolean;
|
||||
/**
|
||||
* Url of the last navigated navigation.
|
||||
*/
|
||||
get url(): string;
|
||||
/**
|
||||
* Creates a pending navigation e.g. when navigation command is called. Required to
|
||||
* provide navigation id before the actual navigation is started. It will be used when
|
||||
* navigation started. Can be aborted, failed, fragment navigated, or became a current
|
||||
* navigation.
|
||||
*/
|
||||
createPendingNavigation(url: string, canBeInitialNavigation?: boolean): NavigationState;
|
||||
dispose(): void;
|
||||
onTargetInfoChanged(url: string): void;
|
||||
/**
|
||||
* @param {string} unreachableUrl indicated the navigation is actually failed.
|
||||
*/
|
||||
frameNavigated(url: string, loaderId: string, unreachableUrl?: string): void;
|
||||
navigatedWithinDocument(url: string, navigationType: Protocol.Page.NavigatedWithinDocumentEvent['navigationType']): void;
|
||||
/**
|
||||
* Required to mark navigation as fully complete.
|
||||
* TODO: navigation should be complete when it became the current one on
|
||||
* `Page.frameNavigated` or on navigating command finished with a new loader Id.
|
||||
*/
|
||||
loadPageEvent(loaderId: string): void;
|
||||
/**
|
||||
* Fail navigation due to navigation command failed.
|
||||
*/
|
||||
failNavigation(navigation: NavigationState, errorText: string): void;
|
||||
/**
|
||||
* Updates the navigation's `loaderId` and sets it as current one, if it is a
|
||||
* cross-document navigation.
|
||||
*/
|
||||
navigationCommandFinished(navigation: NavigationState, loaderId?: string): void;
|
||||
frameStartedNavigating(url: string, loaderId: string, navigationType: string): void;
|
||||
/**
|
||||
* If there is a navigation with the loaderId equals to the network request id, it means
|
||||
* that the navigation failed.
|
||||
*/
|
||||
networkLoadingFailed(loaderId: string, errorText: string): void;
|
||||
}
|
||||
331
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/NavigationTracker.js
generated
vendored
Normal file
331
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/NavigationTracker.js
generated
vendored
Normal file
@@ -0,0 +1,331 @@
|
||||
"use strict";
|
||||
/*
|
||||
* Copyright 2024 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.NavigationTracker = exports.NavigationState = exports.NavigationResult = void 0;
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
const Deferred_js_1 = require("../../../utils/Deferred.js");
|
||||
const log_js_1 = require("../../../utils/log.js");
|
||||
const time_js_1 = require("../../../utils/time.js");
|
||||
const urlHelpers_js_1 = require("../../../utils/urlHelpers.js");
|
||||
const uuid_js_1 = require("../../../utils/uuid.js");
|
||||
class NavigationResult {
|
||||
eventName;
|
||||
message;
|
||||
constructor(eventName, message) {
|
||||
this.eventName = eventName;
|
||||
this.message = message;
|
||||
}
|
||||
}
|
||||
exports.NavigationResult = NavigationResult;
|
||||
class NavigationState {
|
||||
navigationId = (0, uuid_js_1.uuidv4)();
|
||||
#browsingContextId;
|
||||
#started = false;
|
||||
#finished = new Deferred_js_1.Deferred();
|
||||
url;
|
||||
loaderId;
|
||||
#isInitial;
|
||||
#eventManager;
|
||||
committed = new Deferred_js_1.Deferred();
|
||||
isFragmentNavigation;
|
||||
get finished() {
|
||||
return this.#finished;
|
||||
}
|
||||
constructor(url, browsingContextId, isInitial, eventManager) {
|
||||
this.#browsingContextId = browsingContextId;
|
||||
this.url = url;
|
||||
this.#isInitial = isInitial;
|
||||
this.#eventManager = eventManager;
|
||||
}
|
||||
navigationInfo() {
|
||||
return {
|
||||
context: this.#browsingContextId,
|
||||
navigation: this.navigationId,
|
||||
timestamp: (0, time_js_1.getTimestamp)(),
|
||||
url: this.url,
|
||||
};
|
||||
}
|
||||
start() {
|
||||
if (
|
||||
// Initial navigation should not be reported.
|
||||
!this.#isInitial &&
|
||||
// No need in reporting started navigation twice.
|
||||
!this.#started &&
|
||||
// No need for reporting fragment navigations. Step 13 vs step 16 of the spec:
|
||||
// https://html.spec.whatwg.org/#beginning-navigation:webdriver-bidi-navigation-started
|
||||
!this.isFragmentNavigation) {
|
||||
this.#eventManager.registerEvent({
|
||||
type: 'event',
|
||||
method: protocol_js_1.ChromiumBidi.BrowsingContext.EventNames.NavigationStarted,
|
||||
params: this.navigationInfo(),
|
||||
}, this.#browsingContextId);
|
||||
}
|
||||
this.#started = true;
|
||||
}
|
||||
#finish(navigationResult) {
|
||||
this.#started = true;
|
||||
if (!this.#isInitial &&
|
||||
!this.#finished.isFinished &&
|
||||
navigationResult.eventName !== "browsingContext.load" /* NavigationEventName.Load */) {
|
||||
this.#eventManager.registerEvent({
|
||||
type: 'event',
|
||||
method: navigationResult.eventName,
|
||||
params: this.navigationInfo(),
|
||||
}, this.#browsingContextId);
|
||||
}
|
||||
this.#finished.resolve(navigationResult);
|
||||
}
|
||||
frameNavigated() {
|
||||
this.committed.resolve();
|
||||
if (!this.#isInitial) {
|
||||
this.#eventManager.registerEvent({
|
||||
type: 'event',
|
||||
method: protocol_js_1.ChromiumBidi.BrowsingContext.EventNames.NavigationCommitted,
|
||||
params: this.navigationInfo(),
|
||||
}, this.#browsingContextId);
|
||||
}
|
||||
}
|
||||
fragmentNavigated() {
|
||||
this.committed.resolve();
|
||||
this.#finish(new NavigationResult("browsingContext.fragmentNavigated" /* NavigationEventName.FragmentNavigated */));
|
||||
}
|
||||
load() {
|
||||
this.#finish(new NavigationResult("browsingContext.load" /* NavigationEventName.Load */));
|
||||
}
|
||||
fail(message) {
|
||||
this.#finish(new NavigationResult(this.committed.isFinished
|
||||
? "browsingContext.navigationAborted" /* NavigationEventName.NavigationAborted */
|
||||
: "browsingContext.navigationFailed" /* NavigationEventName.NavigationFailed */, message));
|
||||
}
|
||||
}
|
||||
exports.NavigationState = NavigationState;
|
||||
/**
|
||||
* Keeps track of navigations. Details: http://go/webdriver:bidi-navigation
|
||||
*/
|
||||
class NavigationTracker {
|
||||
#eventManager;
|
||||
#logger;
|
||||
#loaderIdToNavigationsMap = new Map();
|
||||
#browsingContextId;
|
||||
/**
|
||||
* Last committed navigation is committed, but is not guaranteed to be finished, as it
|
||||
* can still wait for `load` or `DOMContentLoaded` events.
|
||||
*/
|
||||
#lastCommittedNavigation;
|
||||
/**
|
||||
* Pending navigation is a navigation that is started but not yet committed.
|
||||
*/
|
||||
#pendingNavigation;
|
||||
// Flags if the initial navigation to `about:blank` is in progress.
|
||||
#isInitialNavigation = true;
|
||||
constructor(url, browsingContextId, eventManager, logger) {
|
||||
this.#browsingContextId = browsingContextId;
|
||||
this.#eventManager = eventManager;
|
||||
this.#logger = logger;
|
||||
this.#isInitialNavigation = true;
|
||||
// The initial navigation is always committed.
|
||||
this.#lastCommittedNavigation = new NavigationState(url, browsingContextId, (0, urlHelpers_js_1.urlMatchesAboutBlank)(url), this.#eventManager);
|
||||
}
|
||||
/**
|
||||
* Returns current started ongoing navigation. It can be either a started pending
|
||||
* navigation, or one is already navigated.
|
||||
*/
|
||||
get currentNavigationId() {
|
||||
if (this.#pendingNavigation?.isFragmentNavigation === false) {
|
||||
// Use pending navigation if it is started and it is not a fragment navigation.
|
||||
return this.#pendingNavigation.navigationId;
|
||||
}
|
||||
// If the pending navigation is a fragment one, or if it is not exists, the last
|
||||
// committed navigation should be used.
|
||||
return this.#lastCommittedNavigation.navigationId;
|
||||
}
|
||||
/**
|
||||
* Flags if the current navigation relates to the initial to `about:blank` navigation.
|
||||
*/
|
||||
get isInitialNavigation() {
|
||||
return this.#isInitialNavigation;
|
||||
}
|
||||
/**
|
||||
* Url of the last navigated navigation.
|
||||
*/
|
||||
get url() {
|
||||
return this.#lastCommittedNavigation.url;
|
||||
}
|
||||
/**
|
||||
* Creates a pending navigation e.g. when navigation command is called. Required to
|
||||
* provide navigation id before the actual navigation is started. It will be used when
|
||||
* navigation started. Can be aborted, failed, fragment navigated, or became a current
|
||||
* navigation.
|
||||
*/
|
||||
createPendingNavigation(url, canBeInitialNavigation = false) {
|
||||
this.#logger?.(log_js_1.LogType.debug, 'createCommandNavigation');
|
||||
this.#isInitialNavigation =
|
||||
canBeInitialNavigation &&
|
||||
this.#isInitialNavigation &&
|
||||
(0, urlHelpers_js_1.urlMatchesAboutBlank)(url);
|
||||
this.#pendingNavigation?.fail('navigation canceled by concurrent navigation');
|
||||
const navigation = new NavigationState(url, this.#browsingContextId, this.#isInitialNavigation, this.#eventManager);
|
||||
this.#pendingNavigation = navigation;
|
||||
return navigation;
|
||||
}
|
||||
dispose() {
|
||||
this.#pendingNavigation?.fail('navigation canceled by context disposal');
|
||||
this.#lastCommittedNavigation.fail('navigation canceled by context disposal');
|
||||
}
|
||||
// Update the current url.
|
||||
onTargetInfoChanged(url) {
|
||||
this.#logger?.(log_js_1.LogType.debug, `onTargetInfoChanged ${url}`);
|
||||
this.#lastCommittedNavigation.url = url;
|
||||
}
|
||||
#getNavigationForFrameNavigated(url, loaderId) {
|
||||
if (this.#loaderIdToNavigationsMap.has(loaderId)) {
|
||||
return this.#loaderIdToNavigationsMap.get(loaderId);
|
||||
}
|
||||
if (this.#pendingNavigation !== undefined &&
|
||||
this.#pendingNavigation.loaderId === undefined) {
|
||||
// This can be a pending navigation to `about:blank` created by a command. Use the
|
||||
// pending navigation in this case.
|
||||
return this.#pendingNavigation;
|
||||
}
|
||||
// Create a new pending navigation.
|
||||
return this.createPendingNavigation(url, true);
|
||||
}
|
||||
/**
|
||||
* @param {string} unreachableUrl indicated the navigation is actually failed.
|
||||
*/
|
||||
frameNavigated(url, loaderId, unreachableUrl) {
|
||||
this.#logger?.(log_js_1.LogType.debug, `frameNavigated ${url}`);
|
||||
if (unreachableUrl !== undefined) {
|
||||
// The navigation failed.
|
||||
const navigation = this.#loaderIdToNavigationsMap.get(loaderId) ??
|
||||
this.#pendingNavigation ??
|
||||
this.createPendingNavigation(unreachableUrl, true);
|
||||
navigation.url = unreachableUrl;
|
||||
navigation.start();
|
||||
navigation.fail('the requested url is unreachable');
|
||||
return;
|
||||
}
|
||||
const navigation = this.#getNavigationForFrameNavigated(url, loaderId);
|
||||
if (navigation !== this.#lastCommittedNavigation) {
|
||||
// Even though the `lastCommittedNavigation` is navigated, it still can be waiting
|
||||
// for `load` or `DOMContentLoaded` events.
|
||||
this.#lastCommittedNavigation.fail('navigation canceled by concurrent navigation');
|
||||
}
|
||||
navigation.url = url;
|
||||
navigation.loaderId = loaderId;
|
||||
this.#loaderIdToNavigationsMap.set(loaderId, navigation);
|
||||
navigation.start();
|
||||
navigation.frameNavigated();
|
||||
this.#lastCommittedNavigation = navigation;
|
||||
if (this.#pendingNavigation === navigation) {
|
||||
this.#pendingNavigation = undefined;
|
||||
}
|
||||
}
|
||||
navigatedWithinDocument(url, navigationType) {
|
||||
this.#logger?.(log_js_1.LogType.debug, `navigatedWithinDocument ${url}, ${navigationType}`);
|
||||
// Current navigation URL should be updated.
|
||||
this.#lastCommittedNavigation.url = url;
|
||||
if (navigationType !== 'fragment') {
|
||||
// TODO: check for other navigation types, like `javascript`.
|
||||
return;
|
||||
}
|
||||
// There is no way to map `navigatedWithinDocument` to a specific navigation. Consider
|
||||
// it is the pending navigation, if it is a fragment one.
|
||||
const fragmentNavigation = this.#pendingNavigation?.isFragmentNavigation === true
|
||||
? this.#pendingNavigation
|
||||
: new NavigationState(url, this.#browsingContextId, false, this.#eventManager);
|
||||
// Finish ongoing navigation.
|
||||
fragmentNavigation.fragmentNavigated();
|
||||
if (fragmentNavigation === this.#pendingNavigation) {
|
||||
this.#pendingNavigation = undefined;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Required to mark navigation as fully complete.
|
||||
* TODO: navigation should be complete when it became the current one on
|
||||
* `Page.frameNavigated` or on navigating command finished with a new loader Id.
|
||||
*/
|
||||
loadPageEvent(loaderId) {
|
||||
this.#logger?.(log_js_1.LogType.debug, 'loadPageEvent');
|
||||
// Even if it was an initial navigation, it is finished.
|
||||
this.#isInitialNavigation = false;
|
||||
this.#loaderIdToNavigationsMap.get(loaderId)?.load();
|
||||
}
|
||||
/**
|
||||
* Fail navigation due to navigation command failed.
|
||||
*/
|
||||
failNavigation(navigation, errorText) {
|
||||
this.#logger?.(log_js_1.LogType.debug, 'failCommandNavigation');
|
||||
navigation.fail(errorText);
|
||||
}
|
||||
/**
|
||||
* Updates the navigation's `loaderId` and sets it as current one, if it is a
|
||||
* cross-document navigation.
|
||||
*/
|
||||
navigationCommandFinished(navigation, loaderId) {
|
||||
this.#logger?.(log_js_1.LogType.debug, `finishCommandNavigation ${navigation.navigationId}, ${loaderId}`);
|
||||
if (loaderId !== undefined) {
|
||||
navigation.loaderId = loaderId;
|
||||
this.#loaderIdToNavigationsMap.set(loaderId, navigation);
|
||||
}
|
||||
navigation.isFragmentNavigation = loaderId === undefined;
|
||||
}
|
||||
frameStartedNavigating(url, loaderId, navigationType) {
|
||||
this.#logger?.(log_js_1.LogType.debug, `frameStartedNavigating ${url}, ${loaderId}`);
|
||||
if (this.#pendingNavigation &&
|
||||
this.#pendingNavigation?.loaderId !== undefined &&
|
||||
this.#pendingNavigation?.loaderId !== loaderId) {
|
||||
// If there is a pending navigation with loader id set, but not equal to the new
|
||||
// loader id, cancel pending navigation.
|
||||
this.#pendingNavigation?.fail('navigation canceled by concurrent navigation');
|
||||
this.#pendingNavigation = undefined;
|
||||
}
|
||||
if (this.#loaderIdToNavigationsMap.has(loaderId)) {
|
||||
const existingNavigation = this.#loaderIdToNavigationsMap.get(loaderId);
|
||||
// Navigation can be changed from `sameDocument` to `differentDocument`.
|
||||
existingNavigation.isFragmentNavigation =
|
||||
NavigationTracker.#isFragmentNavigation(navigationType);
|
||||
this.#pendingNavigation = existingNavigation;
|
||||
return;
|
||||
}
|
||||
const pendingNavigation = this.#pendingNavigation ?? this.createPendingNavigation(url, true);
|
||||
this.#loaderIdToNavigationsMap.set(loaderId, pendingNavigation);
|
||||
pendingNavigation.isFragmentNavigation =
|
||||
NavigationTracker.#isFragmentNavigation(navigationType);
|
||||
pendingNavigation.url = url;
|
||||
pendingNavigation.loaderId = loaderId;
|
||||
pendingNavigation.start();
|
||||
}
|
||||
static #isFragmentNavigation(navigationType) {
|
||||
// Page.frameStartedNavigating.navigationType can be one of the following values:
|
||||
// reload, reloadBypassingCache, restore, restoreWithPost, historySameDocument,
|
||||
// historyDifferentDocument, sameDocument, differentDocument.
|
||||
// https://chromedevtools.github.io/devtools-protocol/tot/Page/#event-frameStartedNavigating
|
||||
return ['historySameDocument', 'sameDocument'].includes(navigationType);
|
||||
}
|
||||
/**
|
||||
* If there is a navigation with the loaderId equals to the network request id, it means
|
||||
* that the navigation failed.
|
||||
*/
|
||||
networkLoadingFailed(loaderId, errorText) {
|
||||
this.#loaderIdToNavigationsMap.get(loaderId)?.fail(errorText);
|
||||
}
|
||||
}
|
||||
exports.NavigationTracker = NavigationTracker;
|
||||
//# sourceMappingURL=NavigationTracker.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/NavigationTracker.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/context/NavigationTracker.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
32
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/emulation/EmulationProcessor.d.ts
generated
vendored
Normal file
32
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/emulation/EmulationProcessor.d.ts
generated
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* Copyright 2025 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { EmptyResult, Emulation } from '../../../protocol/generated/webdriver-bidi.js';
|
||||
import type { ContextConfigStorage } from '../browser/ContextConfigStorage.js';
|
||||
import type { UserContextStorage } from '../browser/UserContextStorage.js';
|
||||
import type { BrowsingContextStorage } from '../context/BrowsingContextStorage.js';
|
||||
export declare class EmulationProcessor {
|
||||
#private;
|
||||
constructor(browsingContextStorage: BrowsingContextStorage, userContextStorage: UserContextStorage, contextConfigStorage: ContextConfigStorage);
|
||||
setGeolocationOverride(params: Emulation.SetGeolocationOverrideParameters): Promise<EmptyResult>;
|
||||
setLocaleOverride(params: Emulation.SetLocaleOverrideParameters): Promise<EmptyResult>;
|
||||
setScriptingEnabled(params: Emulation.SetScriptingEnabledParameters): Promise<EmptyResult>;
|
||||
setScreenOrientationOverride(params: Emulation.SetScreenOrientationOverrideParameters): Promise<EmptyResult>;
|
||||
setTimezoneOverride(params: Emulation.SetTimezoneOverrideParameters): Promise<EmptyResult>;
|
||||
}
|
||||
export declare function isValidLocale(locale: string): boolean;
|
||||
export declare function isValidTimezone(timezone: string): boolean;
|
||||
export declare function isTimeZoneOffsetString(timezone: string): boolean;
|
||||
219
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/emulation/EmulationProcessor.js
generated
vendored
Normal file
219
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/emulation/EmulationProcessor.js
generated
vendored
Normal file
@@ -0,0 +1,219 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2025 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.EmulationProcessor = void 0;
|
||||
exports.isValidLocale = isValidLocale;
|
||||
exports.isValidTimezone = isValidTimezone;
|
||||
exports.isTimeZoneOffsetString = isTimeZoneOffsetString;
|
||||
const ErrorResponse_js_1 = require("../../../protocol/ErrorResponse.js");
|
||||
class EmulationProcessor {
|
||||
#userContextStorage;
|
||||
#browsingContextStorage;
|
||||
#contextConfigStorage;
|
||||
constructor(browsingContextStorage, userContextStorage, contextConfigStorage) {
|
||||
this.#userContextStorage = userContextStorage;
|
||||
this.#browsingContextStorage = browsingContextStorage;
|
||||
this.#contextConfigStorage = contextConfigStorage;
|
||||
}
|
||||
async setGeolocationOverride(params) {
|
||||
if ('coordinates' in params && 'error' in params) {
|
||||
// Unreachable. Handled by params parser.
|
||||
throw new ErrorResponse_js_1.InvalidArgumentException('Coordinates and error cannot be set at the same time');
|
||||
}
|
||||
let geolocation = null;
|
||||
if ('coordinates' in params) {
|
||||
if ((params.coordinates?.altitude ?? null) === null &&
|
||||
(params.coordinates?.altitudeAccuracy ?? null) !== null) {
|
||||
throw new ErrorResponse_js_1.InvalidArgumentException('Geolocation altitudeAccuracy can be set only with altitude');
|
||||
}
|
||||
geolocation = params.coordinates;
|
||||
}
|
||||
else if ('error' in params) {
|
||||
if (params.error.type !== 'positionUnavailable') {
|
||||
// Unreachable. Handled by params parser.
|
||||
throw new ErrorResponse_js_1.InvalidArgumentException(`Unknown geolocation error ${params.error.type}`);
|
||||
}
|
||||
geolocation = params.error;
|
||||
}
|
||||
else {
|
||||
// Unreachable. Handled by params parser.
|
||||
throw new ErrorResponse_js_1.InvalidArgumentException(`Coordinates or error should be set`);
|
||||
}
|
||||
const browsingContexts = await this.#getRelatedTopLevelBrowsingContexts(params.contexts, params.userContexts);
|
||||
for (const browsingContextId of params.contexts ?? []) {
|
||||
this.#contextConfigStorage.updateBrowsingContextConfig(browsingContextId, {
|
||||
geolocation,
|
||||
});
|
||||
}
|
||||
for (const userContextId of params.userContexts ?? []) {
|
||||
this.#contextConfigStorage.updateUserContextConfig(userContextId, {
|
||||
geolocation,
|
||||
});
|
||||
}
|
||||
await Promise.all(browsingContexts.map(async (context) => await context.setGeolocationOverride(geolocation)));
|
||||
return {};
|
||||
}
|
||||
async setLocaleOverride(params) {
|
||||
const locale = params.locale ?? null;
|
||||
if (locale !== null && !isValidLocale(locale)) {
|
||||
throw new ErrorResponse_js_1.InvalidArgumentException(`Invalid locale "${locale}"`);
|
||||
}
|
||||
const browsingContexts = await this.#getRelatedTopLevelBrowsingContexts(params.contexts, params.userContexts);
|
||||
for (const browsingContextId of params.contexts ?? []) {
|
||||
this.#contextConfigStorage.updateBrowsingContextConfig(browsingContextId, {
|
||||
locale,
|
||||
});
|
||||
}
|
||||
for (const userContextId of params.userContexts ?? []) {
|
||||
this.#contextConfigStorage.updateUserContextConfig(userContextId, {
|
||||
locale,
|
||||
});
|
||||
}
|
||||
await Promise.all(browsingContexts.map(async (context) => await context.setLocaleOverride(locale)));
|
||||
return {};
|
||||
}
|
||||
async setScriptingEnabled(params) {
|
||||
const scriptingEnabled = params.enabled;
|
||||
const browsingContexts = await this.#getRelatedTopLevelBrowsingContexts(params.contexts, params.userContexts);
|
||||
for (const browsingContextId of params.contexts ?? []) {
|
||||
this.#contextConfigStorage.updateBrowsingContextConfig(browsingContextId, {
|
||||
scriptingEnabled,
|
||||
});
|
||||
}
|
||||
for (const userContextId of params.userContexts ?? []) {
|
||||
this.#contextConfigStorage.updateUserContextConfig(userContextId, {
|
||||
scriptingEnabled,
|
||||
});
|
||||
}
|
||||
await Promise.all(browsingContexts.map(async (context) => await context.setScriptingEnabled(scriptingEnabled)));
|
||||
return {};
|
||||
}
|
||||
async setScreenOrientationOverride(params) {
|
||||
const browsingContexts = await this.#getRelatedTopLevelBrowsingContexts(params.contexts, params.userContexts);
|
||||
for (const browsingContextId of params.contexts ?? []) {
|
||||
this.#contextConfigStorage.updateBrowsingContextConfig(browsingContextId, {
|
||||
screenOrientation: params.screenOrientation,
|
||||
});
|
||||
}
|
||||
for (const userContextId of params.userContexts ?? []) {
|
||||
this.#contextConfigStorage.updateUserContextConfig(userContextId, {
|
||||
screenOrientation: params.screenOrientation,
|
||||
});
|
||||
}
|
||||
await Promise.all(browsingContexts.map(async (context) => await context.setScreenOrientationOverride(params.screenOrientation)));
|
||||
return {};
|
||||
}
|
||||
/**
|
||||
* Returns a list of top-level browsing contexts.
|
||||
*/
|
||||
async #getRelatedTopLevelBrowsingContexts(browsingContextIds, userContextIds) {
|
||||
if (browsingContextIds === undefined && userContextIds === undefined) {
|
||||
throw new ErrorResponse_js_1.InvalidArgumentException('Either user contexts or browsing contexts must be provided');
|
||||
}
|
||||
if (browsingContextIds !== undefined && userContextIds !== undefined) {
|
||||
throw new ErrorResponse_js_1.InvalidArgumentException('User contexts and browsing contexts are mutually exclusive');
|
||||
}
|
||||
const result = [];
|
||||
if (browsingContextIds === undefined) {
|
||||
// userContextIds !== undefined
|
||||
if (userContextIds.length === 0) {
|
||||
throw new ErrorResponse_js_1.InvalidArgumentException('user context should be provided');
|
||||
}
|
||||
// Verify that all user contexts exist.
|
||||
await this.#userContextStorage.verifyUserContextIdList(userContextIds);
|
||||
for (const userContextId of userContextIds) {
|
||||
const topLevelBrowsingContexts = this.#browsingContextStorage
|
||||
.getTopLevelContexts()
|
||||
.filter((browsingContext) => browsingContext.userContext === userContextId);
|
||||
result.push(...topLevelBrowsingContexts);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (browsingContextIds.length === 0) {
|
||||
throw new ErrorResponse_js_1.InvalidArgumentException('browsing context should be provided');
|
||||
}
|
||||
for (const browsingContextId of browsingContextIds) {
|
||||
const browsingContext = this.#browsingContextStorage.getContext(browsingContextId);
|
||||
if (!browsingContext.isTopLevelContext()) {
|
||||
throw new ErrorResponse_js_1.InvalidArgumentException('The command is only supported on the top-level context');
|
||||
}
|
||||
result.push(browsingContext);
|
||||
}
|
||||
}
|
||||
// Remove duplicates. Compare `BrowsingContextImpl` by reference is correct here, as
|
||||
// `browsingContextStorage` returns the same instance for the same id.
|
||||
return [...new Set(result).values()];
|
||||
}
|
||||
async setTimezoneOverride(params) {
|
||||
let timezone = params.timezone ?? null;
|
||||
if (timezone !== null && !isValidTimezone(timezone)) {
|
||||
throw new ErrorResponse_js_1.InvalidArgumentException(`Invalid timezone "${timezone}"`);
|
||||
}
|
||||
if (timezone !== null && isTimeZoneOffsetString(timezone)) {
|
||||
// CDP supports offset timezone with `GMT` prefix.
|
||||
timezone = `GMT${timezone}`;
|
||||
}
|
||||
const browsingContexts = await this.#getRelatedTopLevelBrowsingContexts(params.contexts, params.userContexts);
|
||||
for (const browsingContextId of params.contexts ?? []) {
|
||||
this.#contextConfigStorage.updateBrowsingContextConfig(browsingContextId, {
|
||||
timezone,
|
||||
});
|
||||
}
|
||||
for (const userContextId of params.userContexts ?? []) {
|
||||
this.#contextConfigStorage.updateUserContextConfig(userContextId, {
|
||||
timezone,
|
||||
});
|
||||
}
|
||||
await Promise.all(browsingContexts.map(async (context) => await context.setTimezoneOverride(timezone)));
|
||||
return {};
|
||||
}
|
||||
}
|
||||
exports.EmulationProcessor = EmulationProcessor;
|
||||
// Export for testing.
|
||||
function isValidLocale(locale) {
|
||||
try {
|
||||
new Intl.Locale(locale);
|
||||
return true;
|
||||
}
|
||||
catch (e) {
|
||||
if (e instanceof RangeError) {
|
||||
return false;
|
||||
}
|
||||
// Re-throw other errors
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
// Export for testing.
|
||||
function isValidTimezone(timezone) {
|
||||
try {
|
||||
Intl.DateTimeFormat(undefined, { timeZone: timezone });
|
||||
return true;
|
||||
}
|
||||
catch (e) {
|
||||
if (e instanceof RangeError) {
|
||||
return false;
|
||||
}
|
||||
// Re-throw other errors
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
// Export for testing.
|
||||
function isTimeZoneOffsetString(timezone) {
|
||||
return /^[+-](?:2[0-3]|[01]\d)(?::[0-5]\d)?$/.test(timezone);
|
||||
}
|
||||
//# sourceMappingURL=EmulationProcessor.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/emulation/EmulationProcessor.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/emulation/EmulationProcessor.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
27
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionDispatcher.d.ts
generated
vendored
Normal file
27
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionDispatcher.d.ts
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { BrowsingContextImpl } from '../context/BrowsingContextImpl.js';
|
||||
import type { BrowsingContextStorage } from '../context/BrowsingContextStorage.js';
|
||||
import type { ActionOption } from './ActionOption.js';
|
||||
import type { InputState } from './InputState.js';
|
||||
export declare class ActionDispatcher {
|
||||
#private;
|
||||
static isMacOS: (context: BrowsingContextImpl) => Promise<boolean>;
|
||||
constructor(inputState: InputState, browsingContextStorage: BrowsingContextStorage, contextId: string, isMacOS: boolean);
|
||||
dispatchActions(optionsByTick: readonly (readonly Readonly<ActionOption>[])[]): Promise<void>;
|
||||
dispatchTickActions(options: readonly Readonly<ActionOption>[]): Promise<void>;
|
||||
}
|
||||
744
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionDispatcher.js
generated
vendored
Normal file
744
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionDispatcher.js
generated
vendored
Normal file
@@ -0,0 +1,744 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ActionDispatcher = void 0;
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
const assert_js_1 = require("../../../utils/assert.js");
|
||||
const graphemeTools_js_1 = require("../../../utils/graphemeTools.js");
|
||||
const InputSource_js_1 = require("./InputSource.js");
|
||||
const keyUtils_js_1 = require("./keyUtils.js");
|
||||
const USKeyboardLayout_js_1 = require("./USKeyboardLayout.js");
|
||||
/** https://w3c.github.io/webdriver/#dfn-center-point */
|
||||
const CALCULATE_IN_VIEW_CENTER_PT_DECL = ((i) => {
|
||||
const t = i.getClientRects()[0], e = Math.max(0, Math.min(t.x, t.x + t.width)), n = Math.min(window.innerWidth, Math.max(t.x, t.x + t.width)), h = Math.max(0, Math.min(t.y, t.y + t.height)), m = Math.min(window.innerHeight, Math.max(t.y, t.y + t.height));
|
||||
return [e + ((n - e) >> 1), h + ((m - h) >> 1)];
|
||||
}).toString();
|
||||
const IS_MAC_DECL = (() => {
|
||||
return navigator.platform.toLowerCase().includes('mac');
|
||||
}).toString();
|
||||
async function getElementCenter(context, element) {
|
||||
const hiddenSandboxRealm = await context.getOrCreateHiddenSandbox();
|
||||
const result = await hiddenSandboxRealm.callFunction(CALCULATE_IN_VIEW_CENTER_PT_DECL, false, { type: 'undefined' }, [element]);
|
||||
if (result.type === 'exception') {
|
||||
throw new protocol_js_1.NoSuchElementException(`Origin element ${element.sharedId} was not found`);
|
||||
}
|
||||
(0, assert_js_1.assert)(result.result.type === 'array');
|
||||
(0, assert_js_1.assert)(result.result.value?.[0]?.type === 'number');
|
||||
(0, assert_js_1.assert)(result.result.value?.[1]?.type === 'number');
|
||||
const { result: { value: [{ value: x }, { value: y }], }, } = result;
|
||||
return { x: x, y: y };
|
||||
}
|
||||
class ActionDispatcher {
|
||||
static isMacOS = async (context) => {
|
||||
const hiddenSandboxRealm = await context.getOrCreateHiddenSandbox();
|
||||
const result = await hiddenSandboxRealm.callFunction(IS_MAC_DECL, false);
|
||||
(0, assert_js_1.assert)(result.type !== 'exception');
|
||||
(0, assert_js_1.assert)(result.result.type === 'boolean');
|
||||
return result.result.value;
|
||||
};
|
||||
#browsingContextStorage;
|
||||
#tickStart = 0;
|
||||
#tickDuration = 0;
|
||||
#inputState;
|
||||
#contextId;
|
||||
#isMacOS;
|
||||
constructor(inputState, browsingContextStorage, contextId, isMacOS) {
|
||||
this.#browsingContextStorage = browsingContextStorage;
|
||||
this.#inputState = inputState;
|
||||
this.#contextId = contextId;
|
||||
this.#isMacOS = isMacOS;
|
||||
}
|
||||
/**
|
||||
* The context can be disposed between action ticks, so need to get it each time.
|
||||
*/
|
||||
get #context() {
|
||||
return this.#browsingContextStorage.getContext(this.#contextId);
|
||||
}
|
||||
async dispatchActions(optionsByTick) {
|
||||
await this.#inputState.queue.run(async () => {
|
||||
for (const options of optionsByTick) {
|
||||
await this.dispatchTickActions(options);
|
||||
}
|
||||
});
|
||||
}
|
||||
async dispatchTickActions(options) {
|
||||
this.#tickStart = performance.now();
|
||||
this.#tickDuration = 0;
|
||||
for (const { action } of options) {
|
||||
if ('duration' in action && action.duration !== undefined) {
|
||||
this.#tickDuration = Math.max(this.#tickDuration, action.duration);
|
||||
}
|
||||
}
|
||||
const promises = [
|
||||
new Promise((resolve) => setTimeout(resolve, this.#tickDuration)),
|
||||
];
|
||||
for (const option of options) {
|
||||
// In theory we have to wait for each action to happen, but CDP is serial,
|
||||
// so as an optimization, we queue all CDP commands at once and await all
|
||||
// of them.
|
||||
promises.push(this.#dispatchAction(option));
|
||||
}
|
||||
await Promise.all(promises);
|
||||
}
|
||||
async #dispatchAction({ id, action }) {
|
||||
const source = this.#inputState.get(id);
|
||||
const keyState = this.#inputState.getGlobalKeyState();
|
||||
switch (action.type) {
|
||||
case 'keyDown': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchKeyDownAction(source, action);
|
||||
this.#inputState.cancelList.push({
|
||||
id,
|
||||
action: {
|
||||
...action,
|
||||
type: 'keyUp',
|
||||
},
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'keyUp': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchKeyUpAction(source, action);
|
||||
break;
|
||||
}
|
||||
case 'pause': {
|
||||
// TODO: Implement waiting on the input source.
|
||||
break;
|
||||
}
|
||||
case 'pointerDown': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchPointerDownAction(source, keyState, action);
|
||||
this.#inputState.cancelList.push({
|
||||
id,
|
||||
action: {
|
||||
...action,
|
||||
type: 'pointerUp',
|
||||
},
|
||||
});
|
||||
break;
|
||||
}
|
||||
case 'pointerMove': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchPointerMoveAction(source, keyState, action);
|
||||
break;
|
||||
}
|
||||
case 'pointerUp': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchPointerUpAction(source, keyState, action);
|
||||
break;
|
||||
}
|
||||
case 'scroll': {
|
||||
// SAFETY: The source is validated before.
|
||||
await this.#dispatchScrollAction(source, keyState, action);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
async #dispatchPointerDownAction(source, keyState, action) {
|
||||
const { button } = action;
|
||||
if (source.pressed.has(button)) {
|
||||
return;
|
||||
}
|
||||
source.pressed.add(button);
|
||||
const { x, y, subtype: pointerType } = source;
|
||||
const { width, height, pressure, twist, tangentialPressure } = action;
|
||||
const { tiltX, tiltY } = getTilt(action);
|
||||
// --- Platform-specific code begins here ---
|
||||
const { modifiers } = keyState;
|
||||
const { radiusX, radiusY } = getRadii(width ?? 1, height ?? 1);
|
||||
switch (pointerType) {
|
||||
case "mouse" /* Input.PointerType.Mouse */:
|
||||
case "pen" /* Input.PointerType.Pen */:
|
||||
// TODO: Implement width and height when available.
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchMouseEvent', {
|
||||
type: 'mousePressed',
|
||||
x,
|
||||
y,
|
||||
modifiers,
|
||||
button: getCdpButton(button),
|
||||
buttons: source.buttons,
|
||||
clickCount: source.setClickCount(button, new InputSource_js_1.PointerSource.ClickContext(x, y, performance.now())),
|
||||
pointerType,
|
||||
tangentialPressure,
|
||||
tiltX,
|
||||
tiltY,
|
||||
twist,
|
||||
force: pressure,
|
||||
});
|
||||
break;
|
||||
case "touch" /* Input.PointerType.Touch */:
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchTouchEvent', {
|
||||
type: 'touchStart',
|
||||
touchPoints: [
|
||||
{
|
||||
x,
|
||||
y,
|
||||
radiusX,
|
||||
radiusY,
|
||||
tangentialPressure,
|
||||
tiltX,
|
||||
tiltY,
|
||||
twist,
|
||||
force: pressure,
|
||||
id: source.pointerId,
|
||||
},
|
||||
],
|
||||
modifiers,
|
||||
});
|
||||
break;
|
||||
}
|
||||
source.radiusX = radiusX;
|
||||
source.radiusY = radiusY;
|
||||
source.force = pressure;
|
||||
// --- Platform-specific code ends here ---
|
||||
}
|
||||
#dispatchPointerUpAction(source, keyState, action) {
|
||||
const { button } = action;
|
||||
if (!source.pressed.has(button)) {
|
||||
return;
|
||||
}
|
||||
source.pressed.delete(button);
|
||||
const { x, y, force, radiusX, radiusY, subtype: pointerType } = source;
|
||||
// --- Platform-specific code begins here ---
|
||||
const { modifiers } = keyState;
|
||||
switch (pointerType) {
|
||||
case "mouse" /* Input.PointerType.Mouse */:
|
||||
case "pen" /* Input.PointerType.Pen */:
|
||||
// TODO: Implement width and height when available.
|
||||
return this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchMouseEvent', {
|
||||
type: 'mouseReleased',
|
||||
x,
|
||||
y,
|
||||
modifiers,
|
||||
button: getCdpButton(button),
|
||||
buttons: source.buttons,
|
||||
clickCount: source.getClickCount(button),
|
||||
pointerType,
|
||||
});
|
||||
case "touch" /* Input.PointerType.Touch */:
|
||||
return this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchTouchEvent', {
|
||||
type: 'touchEnd',
|
||||
touchPoints: [
|
||||
{
|
||||
x,
|
||||
y,
|
||||
id: source.pointerId,
|
||||
force,
|
||||
radiusX,
|
||||
radiusY,
|
||||
},
|
||||
],
|
||||
modifiers,
|
||||
});
|
||||
}
|
||||
// --- Platform-specific code ends here ---
|
||||
}
|
||||
async #dispatchPointerMoveAction(source, keyState, action) {
|
||||
const { x: startX, y: startY, subtype: pointerType } = source;
|
||||
const { width, height, pressure, twist, tangentialPressure, x: offsetX, y: offsetY, origin = 'viewport', duration = this.#tickDuration, } = action;
|
||||
const { tiltX, tiltY } = getTilt(action);
|
||||
const { radiusX, radiusY } = getRadii(width ?? 1, height ?? 1);
|
||||
const { targetX, targetY } = await this.#getCoordinateFromOrigin(origin, offsetX, offsetY, startX, startY);
|
||||
if (targetX < 0 || targetY < 0) {
|
||||
throw new protocol_js_1.MoveTargetOutOfBoundsException(`Cannot move beyond viewport (x: ${targetX}, y: ${targetY})`);
|
||||
}
|
||||
let last;
|
||||
do {
|
||||
const ratio = duration > 0 ? (performance.now() - this.#tickStart) / duration : 1;
|
||||
last = ratio >= 1;
|
||||
let x;
|
||||
let y;
|
||||
if (last) {
|
||||
x = targetX;
|
||||
y = targetY;
|
||||
}
|
||||
else {
|
||||
x = Math.round(ratio * (targetX - startX) + startX);
|
||||
y = Math.round(ratio * (targetY - startY) + startY);
|
||||
}
|
||||
if (source.x !== x || source.y !== y) {
|
||||
// --- Platform-specific code begins here ---
|
||||
const { modifiers } = keyState;
|
||||
switch (pointerType) {
|
||||
case "mouse" /* Input.PointerType.Mouse */:
|
||||
// TODO: Implement width and height when available.
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchMouseEvent', {
|
||||
type: 'mouseMoved',
|
||||
x,
|
||||
y,
|
||||
modifiers,
|
||||
clickCount: 0,
|
||||
button: getCdpButton(source.pressed.values().next().value ?? 5),
|
||||
buttons: source.buttons,
|
||||
pointerType,
|
||||
tangentialPressure,
|
||||
tiltX,
|
||||
tiltY,
|
||||
twist,
|
||||
force: pressure,
|
||||
});
|
||||
break;
|
||||
case "pen" /* Input.PointerType.Pen */:
|
||||
if (source.pressed.size !== 0) {
|
||||
// Empty `source.pressed.size` means the pen is not detected by digitizer.
|
||||
// Dispatch a mouse event for the pen only if either:
|
||||
// 1. the pen is hovering over the digitizer (0);
|
||||
// 2. the pen is in contact with the digitizer (1);
|
||||
// 3. the pen has at least one button pressed (2, 4, etc).
|
||||
// https://www.w3.org/TR/pointerevents/#the-buttons-property
|
||||
// TODO: Implement width and height when available.
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchMouseEvent', {
|
||||
type: 'mouseMoved',
|
||||
x,
|
||||
y,
|
||||
modifiers,
|
||||
clickCount: 0,
|
||||
button: getCdpButton(source.pressed.values().next().value ?? 5),
|
||||
buttons: source.buttons,
|
||||
pointerType,
|
||||
tangentialPressure,
|
||||
tiltX,
|
||||
tiltY,
|
||||
twist,
|
||||
force: pressure ?? 0.5,
|
||||
});
|
||||
}
|
||||
break;
|
||||
case "touch" /* Input.PointerType.Touch */:
|
||||
if (source.pressed.size !== 0) {
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchTouchEvent', {
|
||||
type: 'touchMove',
|
||||
touchPoints: [
|
||||
{
|
||||
x,
|
||||
y,
|
||||
radiusX,
|
||||
radiusY,
|
||||
tangentialPressure,
|
||||
tiltX,
|
||||
tiltY,
|
||||
twist,
|
||||
force: pressure,
|
||||
id: source.pointerId,
|
||||
},
|
||||
],
|
||||
modifiers,
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
// --- Platform-specific code ends here ---
|
||||
source.x = x;
|
||||
source.y = y;
|
||||
source.radiusX = radiusX;
|
||||
source.radiusY = radiusY;
|
||||
source.force = pressure;
|
||||
}
|
||||
} while (!last);
|
||||
}
|
||||
async #getFrameOffset() {
|
||||
if (this.#context.id === this.#context.cdpTarget.id) {
|
||||
return { x: 0, y: 0 };
|
||||
}
|
||||
// https://github.com/w3c/webdriver/pull/1847 proposes dispatching events from
|
||||
// the top-level browsing context. This implementation dispatches it on the top-most
|
||||
// same-target frame, which is not top-level one in case of OOPiF.
|
||||
// TODO: switch to the top-level browsing context.
|
||||
const { backendNodeId } = await this.#context.cdpTarget.cdpClient.sendCommand('DOM.getFrameOwner', { frameId: this.#context.id });
|
||||
const { model: frameBoxModel } = await this.#context.cdpTarget.cdpClient.sendCommand('DOM.getBoxModel', {
|
||||
backendNodeId,
|
||||
});
|
||||
return { x: frameBoxModel.content[0], y: frameBoxModel.content[1] };
|
||||
}
|
||||
async #getCoordinateFromOrigin(origin, offsetX, offsetY, startX, startY) {
|
||||
let targetX;
|
||||
let targetY;
|
||||
const frameOffset = await this.#getFrameOffset();
|
||||
switch (origin) {
|
||||
case 'viewport':
|
||||
targetX = offsetX + frameOffset.x;
|
||||
targetY = offsetY + frameOffset.y;
|
||||
break;
|
||||
case 'pointer':
|
||||
targetX = startX + offsetX + frameOffset.x;
|
||||
targetY = startY + offsetY + frameOffset.y;
|
||||
break;
|
||||
default: {
|
||||
const { x: posX, y: posY } = await getElementCenter(this.#context, origin.element);
|
||||
// SAFETY: These can never be special numbers.
|
||||
targetX = posX + offsetX + frameOffset.x;
|
||||
targetY = posY + offsetY + frameOffset.y;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { targetX, targetY };
|
||||
}
|
||||
async #dispatchScrollAction(_source, keyState, action) {
|
||||
const { deltaX: targetDeltaX, deltaY: targetDeltaY, x: offsetX, y: offsetY, origin = 'viewport', duration = this.#tickDuration, } = action;
|
||||
if (origin === 'pointer') {
|
||||
throw new protocol_js_1.InvalidArgumentException('"pointer" origin is invalid for scrolling.');
|
||||
}
|
||||
const { targetX, targetY } = await this.#getCoordinateFromOrigin(origin, offsetX, offsetY, 0, 0);
|
||||
if (targetX < 0 || targetY < 0) {
|
||||
throw new protocol_js_1.MoveTargetOutOfBoundsException(`Cannot move beyond viewport (x: ${targetX}, y: ${targetY})`);
|
||||
}
|
||||
let currentDeltaX = 0;
|
||||
let currentDeltaY = 0;
|
||||
let last;
|
||||
do {
|
||||
const ratio = duration > 0 ? (performance.now() - this.#tickStart) / duration : 1;
|
||||
last = ratio >= 1;
|
||||
let deltaX;
|
||||
let deltaY;
|
||||
if (last) {
|
||||
deltaX = targetDeltaX - currentDeltaX;
|
||||
deltaY = targetDeltaY - currentDeltaY;
|
||||
}
|
||||
else {
|
||||
deltaX = Math.round(ratio * targetDeltaX - currentDeltaX);
|
||||
deltaY = Math.round(ratio * targetDeltaY - currentDeltaY);
|
||||
}
|
||||
if (deltaX !== 0 || deltaY !== 0) {
|
||||
// --- Platform-specific code begins here ---
|
||||
const { modifiers } = keyState;
|
||||
await this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchMouseEvent', {
|
||||
type: 'mouseWheel',
|
||||
deltaX,
|
||||
deltaY,
|
||||
x: targetX,
|
||||
y: targetY,
|
||||
modifiers,
|
||||
});
|
||||
// --- Platform-specific code ends here ---
|
||||
currentDeltaX += deltaX;
|
||||
currentDeltaY += deltaY;
|
||||
}
|
||||
} while (!last);
|
||||
}
|
||||
async #dispatchKeyDownAction(source, action) {
|
||||
const rawKey = action.value;
|
||||
if (!(0, graphemeTools_js_1.isSingleGrapheme)(rawKey)) {
|
||||
// https://w3c.github.io/webdriver/#dfn-process-a-key-action
|
||||
// WebDriver spec allows a grapheme to be used.
|
||||
throw new protocol_js_1.InvalidArgumentException(`Invalid key value: ${rawKey}`);
|
||||
}
|
||||
const isGrapheme = (0, graphemeTools_js_1.isSingleComplexGrapheme)(rawKey);
|
||||
const key = (0, keyUtils_js_1.getNormalizedKey)(rawKey);
|
||||
const repeat = source.pressed.has(key);
|
||||
const code = (0, keyUtils_js_1.getKeyCode)(rawKey);
|
||||
const location = (0, keyUtils_js_1.getKeyLocation)(rawKey);
|
||||
switch (key) {
|
||||
case 'Alt':
|
||||
source.alt = true;
|
||||
break;
|
||||
case 'Shift':
|
||||
source.shift = true;
|
||||
break;
|
||||
case 'Control':
|
||||
source.ctrl = true;
|
||||
break;
|
||||
case 'Meta':
|
||||
source.meta = true;
|
||||
break;
|
||||
}
|
||||
source.pressed.add(key);
|
||||
const { modifiers } = source;
|
||||
// --- Platform-specific code begins here ---
|
||||
// The spread is a little hack so JS gives us an array of unicode characters
|
||||
// to measure.
|
||||
const unmodifiedText = getKeyEventUnmodifiedText(key, source, isGrapheme);
|
||||
const text = getKeyEventText(code ?? '', source) ?? unmodifiedText;
|
||||
let command;
|
||||
// The following commands need to be declared because Chromium doesn't
|
||||
// handle them. See
|
||||
// https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:third_party/blink/renderer/core/editing/editing_behavior.cc;l=169;drc=b8143cf1dfd24842890fcd831c4f5d909bef4fc4;bpv=0;bpt=1.
|
||||
if (this.#isMacOS && source.meta) {
|
||||
switch (code) {
|
||||
case 'KeyA':
|
||||
command = 'SelectAll';
|
||||
break;
|
||||
case 'KeyC':
|
||||
command = 'Copy';
|
||||
break;
|
||||
case 'KeyV':
|
||||
command = source.shift ? 'PasteAndMatchStyle' : 'Paste';
|
||||
break;
|
||||
case 'KeyX':
|
||||
command = 'Cut';
|
||||
break;
|
||||
case 'KeyZ':
|
||||
command = source.shift ? 'Redo' : 'Undo';
|
||||
break;
|
||||
default:
|
||||
// Intentionally empty.
|
||||
}
|
||||
}
|
||||
const promises = [
|
||||
this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchKeyEvent', {
|
||||
type: text ? 'keyDown' : 'rawKeyDown',
|
||||
windowsVirtualKeyCode: USKeyboardLayout_js_1.KeyToKeyCode[key],
|
||||
key,
|
||||
code,
|
||||
text,
|
||||
unmodifiedText,
|
||||
autoRepeat: repeat,
|
||||
isSystemKey: source.alt || undefined,
|
||||
location: location < 3 ? location : undefined,
|
||||
isKeypad: location === 3,
|
||||
modifiers,
|
||||
commands: command ? [command] : undefined,
|
||||
}),
|
||||
];
|
||||
// Drag cancelling happens on escape.
|
||||
if (key === 'Escape') {
|
||||
if (!source.alt &&
|
||||
((this.#isMacOS && !source.ctrl && !source.meta) || !this.#isMacOS)) {
|
||||
promises.push(this.#context.cdpTarget.cdpClient.sendCommand('Input.cancelDragging'));
|
||||
}
|
||||
}
|
||||
await Promise.all(promises);
|
||||
// --- Platform-specific code ends here ---
|
||||
}
|
||||
#dispatchKeyUpAction(source, action) {
|
||||
const rawKey = action.value;
|
||||
if (!(0, graphemeTools_js_1.isSingleGrapheme)(rawKey)) {
|
||||
// https://w3c.github.io/webdriver/#dfn-process-a-key-action
|
||||
// WebDriver spec allows a grapheme to be used.
|
||||
throw new protocol_js_1.InvalidArgumentException(`Invalid key value: ${rawKey}`);
|
||||
}
|
||||
const isGrapheme = (0, graphemeTools_js_1.isSingleComplexGrapheme)(rawKey);
|
||||
const key = (0, keyUtils_js_1.getNormalizedKey)(rawKey);
|
||||
if (!source.pressed.has(key)) {
|
||||
return;
|
||||
}
|
||||
const code = (0, keyUtils_js_1.getKeyCode)(rawKey);
|
||||
const location = (0, keyUtils_js_1.getKeyLocation)(rawKey);
|
||||
switch (key) {
|
||||
case 'Alt':
|
||||
source.alt = false;
|
||||
break;
|
||||
case 'Shift':
|
||||
source.shift = false;
|
||||
break;
|
||||
case 'Control':
|
||||
source.ctrl = false;
|
||||
break;
|
||||
case 'Meta':
|
||||
source.meta = false;
|
||||
break;
|
||||
}
|
||||
source.pressed.delete(key);
|
||||
const { modifiers } = source;
|
||||
// --- Platform-specific code begins here ---
|
||||
// The spread is a little hack so JS gives us an array of unicode characters
|
||||
// to measure.
|
||||
const unmodifiedText = getKeyEventUnmodifiedText(key, source, isGrapheme);
|
||||
const text = getKeyEventText(code ?? '', source) ?? unmodifiedText;
|
||||
return this.#context.cdpTarget.cdpClient.sendCommand('Input.dispatchKeyEvent', {
|
||||
type: 'keyUp',
|
||||
windowsVirtualKeyCode: USKeyboardLayout_js_1.KeyToKeyCode[key],
|
||||
key,
|
||||
code,
|
||||
text,
|
||||
unmodifiedText,
|
||||
location: location < 3 ? location : undefined,
|
||||
isSystemKey: source.alt || undefined,
|
||||
isKeypad: location === 3,
|
||||
modifiers,
|
||||
});
|
||||
// --- Platform-specific code ends here ---
|
||||
}
|
||||
}
|
||||
exports.ActionDispatcher = ActionDispatcher;
|
||||
/**
|
||||
* Translates a non-grapheme key to either an `undefined` for a special keys, or a single
|
||||
* character modified by shift if needed.
|
||||
*/
|
||||
const getKeyEventUnmodifiedText = (key, source, isGrapheme) => {
|
||||
if (isGrapheme) {
|
||||
// Graphemes should be presented as text in the CDP command.
|
||||
return key;
|
||||
}
|
||||
if (key === 'Enter') {
|
||||
return '\r';
|
||||
}
|
||||
// If key is not a single character, it is a normalized key value, and should be
|
||||
// presented as key, not text in the CDP command.
|
||||
return [...key].length === 1
|
||||
? source.shift
|
||||
? key.toLocaleUpperCase('en-US')
|
||||
: key
|
||||
: undefined;
|
||||
};
|
||||
const getKeyEventText = (code, source) => {
|
||||
if (source.ctrl) {
|
||||
switch (code) {
|
||||
case 'Digit2':
|
||||
if (source.shift) {
|
||||
return '\x00';
|
||||
}
|
||||
break;
|
||||
case 'KeyA':
|
||||
return '\x01';
|
||||
case 'KeyB':
|
||||
return '\x02';
|
||||
case 'KeyC':
|
||||
return '\x03';
|
||||
case 'KeyD':
|
||||
return '\x04';
|
||||
case 'KeyE':
|
||||
return '\x05';
|
||||
case 'KeyF':
|
||||
return '\x06';
|
||||
case 'KeyG':
|
||||
return '\x07';
|
||||
case 'KeyH':
|
||||
return '\x08';
|
||||
case 'KeyI':
|
||||
return '\x09';
|
||||
case 'KeyJ':
|
||||
return '\x0A';
|
||||
case 'KeyK':
|
||||
return '\x0B';
|
||||
case 'KeyL':
|
||||
return '\x0C';
|
||||
case 'KeyM':
|
||||
return '\x0D';
|
||||
case 'KeyN':
|
||||
return '\x0E';
|
||||
case 'KeyO':
|
||||
return '\x0F';
|
||||
case 'KeyP':
|
||||
return '\x10';
|
||||
case 'KeyQ':
|
||||
return '\x11';
|
||||
case 'KeyR':
|
||||
return '\x12';
|
||||
case 'KeyS':
|
||||
return '\x13';
|
||||
case 'KeyT':
|
||||
return '\x14';
|
||||
case 'KeyU':
|
||||
return '\x15';
|
||||
case 'KeyV':
|
||||
return '\x16';
|
||||
case 'KeyW':
|
||||
return '\x17';
|
||||
case 'KeyX':
|
||||
return '\x18';
|
||||
case 'KeyY':
|
||||
return '\x19';
|
||||
case 'KeyZ':
|
||||
return '\x1A';
|
||||
case 'BracketLeft':
|
||||
return '\x1B';
|
||||
case 'Backslash':
|
||||
return '\x1C';
|
||||
case 'BracketRight':
|
||||
return '\x1D';
|
||||
case 'Digit6':
|
||||
if (source.shift) {
|
||||
return '\x1E';
|
||||
}
|
||||
break;
|
||||
case 'Minus':
|
||||
return '\x1F';
|
||||
}
|
||||
return '';
|
||||
}
|
||||
if (source.alt) {
|
||||
return '';
|
||||
}
|
||||
return;
|
||||
};
|
||||
function getCdpButton(button) {
|
||||
// https://www.w3.org/TR/pointerevents/#the-button-property
|
||||
switch (button) {
|
||||
case 0:
|
||||
return 'left';
|
||||
case 1:
|
||||
return 'middle';
|
||||
case 2:
|
||||
return 'right';
|
||||
case 3:
|
||||
return 'back';
|
||||
case 4:
|
||||
return 'forward';
|
||||
default:
|
||||
return 'none';
|
||||
}
|
||||
}
|
||||
function getTilt(action) {
|
||||
// https://w3c.github.io/pointerevents/#converting-between-tiltx-tilty-and-altitudeangle-azimuthangle
|
||||
const altitudeAngle = action.altitudeAngle ?? Math.PI / 2;
|
||||
const azimuthAngle = action.azimuthAngle ?? 0;
|
||||
let tiltXRadians = 0;
|
||||
let tiltYRadians = 0;
|
||||
if (altitudeAngle === 0) {
|
||||
// the pen is in the X-Y plane
|
||||
if (azimuthAngle === 0 || azimuthAngle === 2 * Math.PI) {
|
||||
// pen is on positive X axis
|
||||
tiltXRadians = Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle === Math.PI / 2) {
|
||||
// pen is on positive Y axis
|
||||
tiltYRadians = Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle === Math.PI) {
|
||||
// pen is on negative X axis
|
||||
tiltXRadians = -Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle === (3 * Math.PI) / 2) {
|
||||
// pen is on negative Y axis
|
||||
tiltYRadians = -Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle > 0 && azimuthAngle < Math.PI / 2) {
|
||||
tiltXRadians = Math.PI / 2;
|
||||
tiltYRadians = Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle > Math.PI / 2 && azimuthAngle < Math.PI) {
|
||||
tiltXRadians = -Math.PI / 2;
|
||||
tiltYRadians = Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle > Math.PI && azimuthAngle < (3 * Math.PI) / 2) {
|
||||
tiltXRadians = -Math.PI / 2;
|
||||
tiltYRadians = -Math.PI / 2;
|
||||
}
|
||||
if (azimuthAngle > (3 * Math.PI) / 2 && azimuthAngle < 2 * Math.PI) {
|
||||
tiltXRadians = Math.PI / 2;
|
||||
tiltYRadians = -Math.PI / 2;
|
||||
}
|
||||
}
|
||||
if (altitudeAngle !== 0) {
|
||||
const tanAlt = Math.tan(altitudeAngle);
|
||||
tiltXRadians = Math.atan(Math.cos(azimuthAngle) / tanAlt);
|
||||
tiltYRadians = Math.atan(Math.sin(azimuthAngle) / tanAlt);
|
||||
}
|
||||
const factor = 180 / Math.PI;
|
||||
return {
|
||||
tiltX: Math.round(tiltXRadians * factor),
|
||||
tiltY: Math.round(tiltYRadians * factor),
|
||||
};
|
||||
}
|
||||
function getRadii(width, height) {
|
||||
return {
|
||||
radiusX: width ? width / 2 : 0.5,
|
||||
radiusY: height ? height / 2 : 0.5,
|
||||
};
|
||||
}
|
||||
//# sourceMappingURL=ActionDispatcher.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionDispatcher.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionDispatcher.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
22
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionOption.d.ts
generated
vendored
Normal file
22
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionOption.d.ts
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { Input } from '../../../protocol/protocol.js';
|
||||
export type ActionOption = ActionOptionFor<Input.NoneSourceAction | Input.KeySourceAction | Input.PointerSourceAction | Input.WheelSourceAction>;
|
||||
export interface ActionOptionFor<A> {
|
||||
id: string;
|
||||
action: A;
|
||||
}
|
||||
19
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionOption.js
generated
vendored
Normal file
19
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionOption.js
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
//# sourceMappingURL=ActionOption.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionOption.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/ActionOption.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"ActionOption.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/input/ActionOption.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG"}
|
||||
9
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputProcessor.d.ts
generated
vendored
Normal file
9
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputProcessor.d.ts
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import { Input, type EmptyResult } from '../../../protocol/protocol.js';
|
||||
import type { BrowsingContextStorage } from '../context/BrowsingContextStorage.js';
|
||||
export declare class InputProcessor {
|
||||
#private;
|
||||
constructor(browsingContextStorage: BrowsingContextStorage);
|
||||
performActions(params: Input.PerformActionsParameters): Promise<EmptyResult>;
|
||||
releaseActions(params: Input.ReleaseActionsParameters): Promise<EmptyResult>;
|
||||
setFiles(params: Input.SetFilesParameters): Promise<EmptyResult>;
|
||||
}
|
||||
194
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputProcessor.js
generated
vendored
Normal file
194
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputProcessor.js
generated
vendored
Normal file
@@ -0,0 +1,194 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.InputProcessor = void 0;
|
||||
/*
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
const assert_js_1 = require("../../../utils/assert.js");
|
||||
const ActionDispatcher_js_1 = require("../input/ActionDispatcher.js");
|
||||
const InputStateManager_js_1 = require("../input/InputStateManager.js");
|
||||
class InputProcessor {
|
||||
#browsingContextStorage;
|
||||
#inputStateManager = new InputStateManager_js_1.InputStateManager();
|
||||
constructor(browsingContextStorage) {
|
||||
this.#browsingContextStorage = browsingContextStorage;
|
||||
}
|
||||
async performActions(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
const inputState = this.#inputStateManager.get(context.top);
|
||||
const actionsByTick = this.#getActionsByTick(params, inputState);
|
||||
const dispatcher = new ActionDispatcher_js_1.ActionDispatcher(inputState, this.#browsingContextStorage, params.context, await ActionDispatcher_js_1.ActionDispatcher.isMacOS(context).catch(() => false));
|
||||
await dispatcher.dispatchActions(actionsByTick);
|
||||
return {};
|
||||
}
|
||||
async releaseActions(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
const topContext = context.top;
|
||||
const inputState = this.#inputStateManager.get(topContext);
|
||||
const dispatcher = new ActionDispatcher_js_1.ActionDispatcher(inputState, this.#browsingContextStorage, params.context, await ActionDispatcher_js_1.ActionDispatcher.isMacOS(context).catch(() => false));
|
||||
await dispatcher.dispatchTickActions(inputState.cancelList.reverse());
|
||||
this.#inputStateManager.delete(topContext);
|
||||
return {};
|
||||
}
|
||||
async setFiles(params) {
|
||||
const context = this.#browsingContextStorage.getContext(params.context);
|
||||
const hiddenSandboxRealm = await context.getOrCreateHiddenSandbox();
|
||||
let result;
|
||||
try {
|
||||
result = await hiddenSandboxRealm.callFunction(String(function getFiles(fileListLength) {
|
||||
if (!(this instanceof HTMLInputElement)) {
|
||||
if (this instanceof Element) {
|
||||
return 1 /* ErrorCode.Element */;
|
||||
}
|
||||
return 0 /* ErrorCode.Node */;
|
||||
}
|
||||
if (this.type !== 'file') {
|
||||
return 2 /* ErrorCode.Type */;
|
||||
}
|
||||
if (this.disabled) {
|
||||
return 3 /* ErrorCode.Disabled */;
|
||||
}
|
||||
if (fileListLength > 1 && !this.multiple) {
|
||||
return 4 /* ErrorCode.Multiple */;
|
||||
}
|
||||
return;
|
||||
}), false, params.element, [{ type: 'number', value: params.files.length }]);
|
||||
}
|
||||
catch {
|
||||
throw new protocol_js_1.NoSuchNodeException(`Could not find element ${params.element.sharedId}`);
|
||||
}
|
||||
(0, assert_js_1.assert)(result.type === 'success');
|
||||
if (result.result.type === 'number') {
|
||||
switch (result.result.value) {
|
||||
case 0 /* ErrorCode.Node */: {
|
||||
throw new protocol_js_1.NoSuchElementException(`Could not find element ${params.element.sharedId}`);
|
||||
}
|
||||
case 1 /* ErrorCode.Element */: {
|
||||
throw new protocol_js_1.UnableToSetFileInputException(`Element ${params.element.sharedId} is not a input`);
|
||||
}
|
||||
case 2 /* ErrorCode.Type */: {
|
||||
throw new protocol_js_1.UnableToSetFileInputException(`Input element ${params.element.sharedId} is not a file type`);
|
||||
}
|
||||
case 3 /* ErrorCode.Disabled */: {
|
||||
throw new protocol_js_1.UnableToSetFileInputException(`Input element ${params.element.sharedId} is disabled`);
|
||||
}
|
||||
case 4 /* ErrorCode.Multiple */: {
|
||||
throw new protocol_js_1.UnableToSetFileInputException(`Cannot set multiple files on a non-multiple input element`);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* The zero-length array is a special case, it seems that
|
||||
* DOM.setFileInputFiles does not actually update the files in that case, so
|
||||
* the solution is to eval the element value to a new FileList directly.
|
||||
*/
|
||||
if (params.files.length === 0) {
|
||||
// XXX: These events should converted to trusted events. Perhaps do this
|
||||
// in `DOM.setFileInputFiles`?
|
||||
await hiddenSandboxRealm.callFunction(String(function dispatchEvent() {
|
||||
if (this.files?.length === 0) {
|
||||
this.dispatchEvent(new Event('cancel', {
|
||||
bubbles: true,
|
||||
}));
|
||||
return;
|
||||
}
|
||||
this.files = new DataTransfer().files;
|
||||
// Dispatch events for this case because it should behave akin to a user action.
|
||||
this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
|
||||
this.dispatchEvent(new Event('change', { bubbles: true }));
|
||||
}), false, params.element);
|
||||
return {};
|
||||
}
|
||||
// Our goal here is to iterate over the input element files and get their
|
||||
// file paths.
|
||||
const paths = [];
|
||||
for (let i = 0; i < params.files.length; ++i) {
|
||||
const result = await hiddenSandboxRealm.callFunction(String(function getFiles(index) {
|
||||
return this.files?.item(index);
|
||||
}), false, params.element, [{ type: 'number', value: 0 }], "root" /* Script.ResultOwnership.Root */);
|
||||
(0, assert_js_1.assert)(result.type === 'success');
|
||||
if (result.result.type !== 'object') {
|
||||
break;
|
||||
}
|
||||
const { handle } = result.result;
|
||||
(0, assert_js_1.assert)(handle !== undefined);
|
||||
const { path } = await hiddenSandboxRealm.cdpClient.sendCommand('DOM.getFileInfo', {
|
||||
objectId: handle,
|
||||
});
|
||||
paths.push(path);
|
||||
// Cleanup the handle.
|
||||
void hiddenSandboxRealm.disown(handle).catch(undefined);
|
||||
}
|
||||
paths.sort();
|
||||
// We create a new array so we preserve the order of the original files.
|
||||
const sortedFiles = [...params.files].sort();
|
||||
if (paths.length !== params.files.length ||
|
||||
sortedFiles.some((path, index) => {
|
||||
return paths[index] !== path;
|
||||
})) {
|
||||
const { objectId } = await hiddenSandboxRealm.deserializeForCdp(params.element);
|
||||
// This cannot throw since this was just used in `callFunction` above.
|
||||
(0, assert_js_1.assert)(objectId !== undefined);
|
||||
await hiddenSandboxRealm.cdpClient.sendCommand('DOM.setFileInputFiles', {
|
||||
files: params.files,
|
||||
objectId,
|
||||
});
|
||||
}
|
||||
else {
|
||||
// XXX: We should dispatch a trusted event.
|
||||
await hiddenSandboxRealm.callFunction(String(function dispatchEvent() {
|
||||
this.dispatchEvent(new Event('cancel', {
|
||||
bubbles: true,
|
||||
}));
|
||||
}), false, params.element);
|
||||
}
|
||||
return {};
|
||||
}
|
||||
#getActionsByTick(params, inputState) {
|
||||
const actionsByTick = [];
|
||||
for (const action of params.actions) {
|
||||
switch (action.type) {
|
||||
case "pointer" /* SourceType.Pointer */: {
|
||||
action.parameters ??= { pointerType: "mouse" /* Input.PointerType.Mouse */ };
|
||||
action.parameters.pointerType ??= "mouse" /* Input.PointerType.Mouse */;
|
||||
const source = inputState.getOrCreate(action.id, "pointer" /* SourceType.Pointer */, action.parameters.pointerType);
|
||||
if (source.subtype !== action.parameters.pointerType) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Expected input source ${action.id} to be ${source.subtype}; got ${action.parameters.pointerType}.`);
|
||||
}
|
||||
// https://github.com/GoogleChromeLabs/chromium-bidi/issues/3043
|
||||
source.resetClickCount();
|
||||
break;
|
||||
}
|
||||
default:
|
||||
inputState.getOrCreate(action.id, action.type);
|
||||
}
|
||||
const actions = action.actions.map((item) => ({
|
||||
id: action.id,
|
||||
action: item,
|
||||
}));
|
||||
for (let i = 0; i < actions.length; i++) {
|
||||
if (actionsByTick.length === i) {
|
||||
actionsByTick.push([]);
|
||||
}
|
||||
actionsByTick[i].push(actions[i]);
|
||||
}
|
||||
}
|
||||
return actionsByTick;
|
||||
}
|
||||
}
|
||||
exports.InputProcessor = InputProcessor;
|
||||
//# sourceMappingURL=InputProcessor.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputProcessor.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputProcessor.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
78
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputSource.d.ts
generated
vendored
Normal file
78
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputSource.d.ts
generated
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { Input } from '../../../protocol/protocol.js';
|
||||
export declare const enum SourceType {
|
||||
Key = "key",
|
||||
Pointer = "pointer",
|
||||
Wheel = "wheel",
|
||||
None = "none"
|
||||
}
|
||||
export declare class NoneSource {
|
||||
type: SourceType.None;
|
||||
}
|
||||
export declare class KeySource {
|
||||
#private;
|
||||
type: SourceType.Key;
|
||||
pressed: Set<string>;
|
||||
get modifiers(): number;
|
||||
get alt(): boolean;
|
||||
set alt(value: boolean);
|
||||
get ctrl(): boolean;
|
||||
set ctrl(value: boolean);
|
||||
get meta(): boolean;
|
||||
set meta(value: boolean);
|
||||
get shift(): boolean;
|
||||
set shift(value: boolean);
|
||||
}
|
||||
export declare class PointerSource {
|
||||
#private;
|
||||
type: SourceType.Pointer;
|
||||
subtype: Input.PointerType;
|
||||
pointerId: number;
|
||||
pressed: Set<number>;
|
||||
x: number;
|
||||
y: number;
|
||||
radiusX?: number;
|
||||
radiusY?: number;
|
||||
force?: number;
|
||||
constructor(id: number, subtype: Input.PointerType);
|
||||
get buttons(): number;
|
||||
static ClickContext: {
|
||||
new (x: number, y: number, time: number): {
|
||||
count: number;
|
||||
#x: number;
|
||||
#y: number;
|
||||
#time: number;
|
||||
compare(context: /*elided*/ any): boolean;
|
||||
};
|
||||
#DOUBLE_CLICK_TIME_MS: number;
|
||||
#MAX_DOUBLE_CLICK_RADIUS: number;
|
||||
};
|
||||
setClickCount(button: number, context: InstanceType<typeof PointerSource.ClickContext>): number;
|
||||
getClickCount(button: number): number;
|
||||
/**
|
||||
* Resets click count. Resets consequent click counter. Prevents grouping clicks in
|
||||
* different `performActions` calls, so that they are not grouped as double, triple etc
|
||||
* clicks. Required for https://github.com/GoogleChromeLabs/chromium-bidi/issues/3043.
|
||||
*/
|
||||
resetClickCount(): void;
|
||||
}
|
||||
export declare class WheelSource {
|
||||
type: SourceType.Wheel;
|
||||
}
|
||||
export type InputSource = NoneSource | KeySource | PointerSource | WheelSource;
|
||||
export type InputSourceFor<Type extends SourceType> = Type extends SourceType.Key ? KeySource : Type extends SourceType.Pointer ? PointerSource : Type extends SourceType.Wheel ? WheelSource : NoneSource;
|
||||
161
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputSource.js
generated
vendored
Normal file
161
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputSource.js
generated
vendored
Normal file
@@ -0,0 +1,161 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
var _a;
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.WheelSource = exports.PointerSource = exports.KeySource = exports.NoneSource = void 0;
|
||||
class NoneSource {
|
||||
type = "none" /* SourceType.None */;
|
||||
}
|
||||
exports.NoneSource = NoneSource;
|
||||
class KeySource {
|
||||
type = "key" /* SourceType.Key */;
|
||||
pressed = new Set();
|
||||
// This is a bitfield that matches the modifiers parameter of
|
||||
// https://chromedevtools.github.io/devtools-protocol/tot/Input/#method-dispatchKeyEvent
|
||||
#modifiers = 0;
|
||||
get modifiers() {
|
||||
return this.#modifiers;
|
||||
}
|
||||
get alt() {
|
||||
return (this.#modifiers & 1) === 1;
|
||||
}
|
||||
set alt(value) {
|
||||
this.#setModifier(value, 1);
|
||||
}
|
||||
get ctrl() {
|
||||
return (this.#modifiers & 2) === 2;
|
||||
}
|
||||
set ctrl(value) {
|
||||
this.#setModifier(value, 2);
|
||||
}
|
||||
get meta() {
|
||||
return (this.#modifiers & 4) === 4;
|
||||
}
|
||||
set meta(value) {
|
||||
this.#setModifier(value, 4);
|
||||
}
|
||||
get shift() {
|
||||
return (this.#modifiers & 8) === 8;
|
||||
}
|
||||
set shift(value) {
|
||||
this.#setModifier(value, 8);
|
||||
}
|
||||
#setModifier(value, bit) {
|
||||
if (value) {
|
||||
this.#modifiers |= bit;
|
||||
}
|
||||
else {
|
||||
this.#modifiers &= ~bit;
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.KeySource = KeySource;
|
||||
class PointerSource {
|
||||
type = "pointer" /* SourceType.Pointer */;
|
||||
subtype;
|
||||
pointerId;
|
||||
pressed = new Set();
|
||||
x = 0;
|
||||
y = 0;
|
||||
radiusX;
|
||||
radiusY;
|
||||
force;
|
||||
constructor(id, subtype) {
|
||||
this.pointerId = id;
|
||||
this.subtype = subtype;
|
||||
}
|
||||
// This is a bitfield that matches the buttons parameter of
|
||||
// https://chromedevtools.github.io/devtools-protocol/tot/Input/#method-dispatchMouseEvent
|
||||
get buttons() {
|
||||
let buttons = 0;
|
||||
for (const button of this.pressed) {
|
||||
switch (button) {
|
||||
case 0:
|
||||
buttons |= 1;
|
||||
break;
|
||||
case 1:
|
||||
buttons |= 4;
|
||||
break;
|
||||
case 2:
|
||||
buttons |= 2;
|
||||
break;
|
||||
case 3:
|
||||
buttons |= 8;
|
||||
break;
|
||||
case 4:
|
||||
buttons |= 16;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return buttons;
|
||||
}
|
||||
// --- Platform-specific code starts here ---
|
||||
// Input.dispatchMouseEvent doesn't know the concept of double click, so we
|
||||
// need to create the logic, similar to how it's done for OSes:
|
||||
// https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:ui/events/event.cc;l=479
|
||||
static ClickContext = class ClickContext {
|
||||
static #DOUBLE_CLICK_TIME_MS = 500;
|
||||
static #MAX_DOUBLE_CLICK_RADIUS = 2;
|
||||
count = 0;
|
||||
#x;
|
||||
#y;
|
||||
#time;
|
||||
constructor(x, y, time) {
|
||||
this.#x = x;
|
||||
this.#y = y;
|
||||
this.#time = time;
|
||||
}
|
||||
compare(context) {
|
||||
return (
|
||||
// The click needs to be within a certain amount of ms.
|
||||
context.#time - this.#time > ClickContext.#DOUBLE_CLICK_TIME_MS ||
|
||||
// The click needs to be within a certain square radius.
|
||||
Math.abs(context.#x - this.#x) >
|
||||
ClickContext.#MAX_DOUBLE_CLICK_RADIUS ||
|
||||
Math.abs(context.#y - this.#y) > ClickContext.#MAX_DOUBLE_CLICK_RADIUS);
|
||||
}
|
||||
};
|
||||
#clickContexts = new Map();
|
||||
setClickCount(button, context) {
|
||||
let storedContext = this.#clickContexts.get(button);
|
||||
if (!storedContext || storedContext.compare(context)) {
|
||||
storedContext = context;
|
||||
}
|
||||
++storedContext.count;
|
||||
this.#clickContexts.set(button, storedContext);
|
||||
return storedContext.count;
|
||||
}
|
||||
getClickCount(button) {
|
||||
return this.#clickContexts.get(button)?.count ?? 0;
|
||||
}
|
||||
/**
|
||||
* Resets click count. Resets consequent click counter. Prevents grouping clicks in
|
||||
* different `performActions` calls, so that they are not grouped as double, triple etc
|
||||
* clicks. Required for https://github.com/GoogleChromeLabs/chromium-bidi/issues/3043.
|
||||
*/
|
||||
resetClickCount() {
|
||||
this.#clickContexts = new Map();
|
||||
}
|
||||
}
|
||||
exports.PointerSource = PointerSource;
|
||||
_a = PointerSource;
|
||||
class WheelSource {
|
||||
type = "wheel" /* SourceType.Wheel */;
|
||||
}
|
||||
exports.WheelSource = WheelSource;
|
||||
//# sourceMappingURL=InputSource.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputSource.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputSource.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"InputSource.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/input/InputSource.ts"],"names":[],"mappings":"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"}
|
||||
29
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputState.d.ts
generated
vendored
Normal file
29
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputState.d.ts
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import { Input } from '../../../protocol/protocol.js';
|
||||
import { Mutex } from '../../../utils/Mutex.js';
|
||||
import type { ActionOption } from './ActionOption.js';
|
||||
import { KeySource, PointerSource, SourceType, type InputSource, type InputSourceFor } from './InputSource.js';
|
||||
export declare class InputState {
|
||||
#private;
|
||||
cancelList: ActionOption[];
|
||||
getOrCreate(id: string, type: SourceType.Pointer, subtype: Input.PointerType): PointerSource;
|
||||
getOrCreate<Type extends SourceType>(id: string, type: Type): InputSourceFor<Type>;
|
||||
get(id: string): InputSource;
|
||||
getGlobalKeyState(): KeySource;
|
||||
get queue(): Mutex;
|
||||
}
|
||||
93
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputState.js
generated
vendored
Normal file
93
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputState.js
generated
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.InputState = void 0;
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
const Mutex_js_1 = require("../../../utils/Mutex.js");
|
||||
const InputSource_js_1 = require("./InputSource.js");
|
||||
class InputState {
|
||||
cancelList = [];
|
||||
#sources = new Map();
|
||||
#mutex = new Mutex_js_1.Mutex();
|
||||
getOrCreate(id, type, subtype) {
|
||||
let source = this.#sources.get(id);
|
||||
if (!source) {
|
||||
switch (type) {
|
||||
case "none" /* SourceType.None */:
|
||||
source = new InputSource_js_1.NoneSource();
|
||||
break;
|
||||
case "key" /* SourceType.Key */:
|
||||
source = new InputSource_js_1.KeySource();
|
||||
break;
|
||||
case "pointer" /* SourceType.Pointer */: {
|
||||
let pointerId = subtype === "mouse" /* Input.PointerType.Mouse */ ? 0 : 2;
|
||||
const pointerIds = new Set();
|
||||
for (const [, source] of this.#sources) {
|
||||
if (source.type === "pointer" /* SourceType.Pointer */) {
|
||||
pointerIds.add(source.pointerId);
|
||||
}
|
||||
}
|
||||
while (pointerIds.has(pointerId)) {
|
||||
++pointerId;
|
||||
}
|
||||
source = new InputSource_js_1.PointerSource(pointerId, subtype);
|
||||
break;
|
||||
}
|
||||
case "wheel" /* SourceType.Wheel */:
|
||||
source = new InputSource_js_1.WheelSource();
|
||||
break;
|
||||
default:
|
||||
throw new protocol_js_1.InvalidArgumentException(`Expected "${"none" /* SourceType.None */}", "${"key" /* SourceType.Key */}", "${"pointer" /* SourceType.Pointer */}", or "${"wheel" /* SourceType.Wheel */}". Found unknown source type ${type}.`);
|
||||
}
|
||||
this.#sources.set(id, source);
|
||||
return source;
|
||||
}
|
||||
if (source.type !== type) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Input source type of ${id} is ${source.type}, but received ${type}.`);
|
||||
}
|
||||
return source;
|
||||
}
|
||||
get(id) {
|
||||
const source = this.#sources.get(id);
|
||||
if (!source) {
|
||||
throw new protocol_js_1.UnknownErrorException(`Internal error.`);
|
||||
}
|
||||
return source;
|
||||
}
|
||||
getGlobalKeyState() {
|
||||
const state = new InputSource_js_1.KeySource();
|
||||
for (const [, source] of this.#sources) {
|
||||
if (source.type !== "key" /* SourceType.Key */) {
|
||||
continue;
|
||||
}
|
||||
for (const pressed of source.pressed) {
|
||||
state.pressed.add(pressed);
|
||||
}
|
||||
state.alt ||= source.alt;
|
||||
state.ctrl ||= source.ctrl;
|
||||
state.meta ||= source.meta;
|
||||
state.shift ||= source.shift;
|
||||
}
|
||||
return state;
|
||||
}
|
||||
get queue() {
|
||||
return this.#mutex;
|
||||
}
|
||||
}
|
||||
exports.InputState = InputState;
|
||||
//# sourceMappingURL=InputState.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputState.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputState.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"InputState.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/input/InputState.ts"],"names":[],"mappings":"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"}
|
||||
21
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputStateManager.d.ts
generated
vendored
Normal file
21
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputStateManager.d.ts
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { BrowsingContextImpl } from '../context/BrowsingContextImpl.js';
|
||||
import { InputState } from './InputState.js';
|
||||
export declare class InputStateManager extends WeakMap<BrowsingContextImpl, InputState> {
|
||||
get(context: BrowsingContextImpl): InputState;
|
||||
}
|
||||
34
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputStateManager.js
generated
vendored
Normal file
34
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputStateManager.js
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.InputStateManager = void 0;
|
||||
const assert_js_1 = require("../../../utils/assert.js");
|
||||
const InputState_js_1 = require("./InputState.js");
|
||||
// We use a weak map here as specified here:
|
||||
// https://www.w3.org/TR/webdriver/#dfn-browsing-context-input-state-map
|
||||
class InputStateManager extends WeakMap {
|
||||
get(context) {
|
||||
(0, assert_js_1.assert)(context.isTopLevelContext());
|
||||
if (!this.has(context)) {
|
||||
this.set(context, new InputState_js_1.InputState());
|
||||
}
|
||||
return super.get(context);
|
||||
}
|
||||
}
|
||||
exports.InputStateManager = InputStateManager;
|
||||
//# sourceMappingURL=InputStateManager.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputStateManager.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/InputStateManager.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"InputStateManager.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/input/InputStateManager.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAEH,wDAAgD;AAGhD,mDAA2C;AAE3C,4CAA4C;AAC5C,wEAAwE;AACxE,MAAa,iBAAkB,SAAQ,OAGtC;IACU,GAAG,CAAC,OAA4B;QACvC,IAAA,kBAAM,EAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,0BAAU,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;IAC7B,CAAC;CACF;AAbD,8CAaC"}
|
||||
17
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/USKeyboardLayout.d.ts
generated
vendored
Normal file
17
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/USKeyboardLayout.d.ts
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
export declare const KeyToKeyCode: Record<string, number | undefined>;
|
||||
274
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/USKeyboardLayout.js
generated
vendored
Normal file
274
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/USKeyboardLayout.js
generated
vendored
Normal file
@@ -0,0 +1,274 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.KeyToKeyCode = void 0;
|
||||
// TODO: Remove this once https://crrev.com/c/4548290 is stably in Chromium.
|
||||
// `Input.dispatchKeyboardEvent` will automatically handle these conversions.
|
||||
exports.KeyToKeyCode = {
|
||||
'0': 48,
|
||||
'1': 49,
|
||||
'2': 50,
|
||||
'3': 51,
|
||||
'4': 52,
|
||||
'5': 53,
|
||||
'6': 54,
|
||||
'7': 55,
|
||||
'8': 56,
|
||||
'9': 57,
|
||||
Abort: 3,
|
||||
Help: 6,
|
||||
Backspace: 8,
|
||||
Tab: 9,
|
||||
Numpad5: 12,
|
||||
NumpadEnter: 13,
|
||||
Enter: 13,
|
||||
'\\r': 13,
|
||||
'\\n': 13,
|
||||
ShiftLeft: 16,
|
||||
ShiftRight: 16,
|
||||
ControlLeft: 17,
|
||||
ControlRight: 17,
|
||||
AltLeft: 18,
|
||||
AltRight: 18,
|
||||
Pause: 19,
|
||||
CapsLock: 20,
|
||||
Escape: 27,
|
||||
Convert: 28,
|
||||
NonConvert: 29,
|
||||
Space: 32,
|
||||
Numpad9: 33,
|
||||
PageUp: 33,
|
||||
Numpad3: 34,
|
||||
PageDown: 34,
|
||||
End: 35,
|
||||
Numpad1: 35,
|
||||
Home: 36,
|
||||
Numpad7: 36,
|
||||
ArrowLeft: 37,
|
||||
Numpad4: 37,
|
||||
Numpad8: 38,
|
||||
ArrowUp: 38,
|
||||
ArrowRight: 39,
|
||||
Numpad6: 39,
|
||||
Numpad2: 40,
|
||||
ArrowDown: 40,
|
||||
Select: 41,
|
||||
Open: 43,
|
||||
PrintScreen: 44,
|
||||
Insert: 45,
|
||||
Numpad0: 45,
|
||||
Delete: 46,
|
||||
NumpadDecimal: 46,
|
||||
Digit0: 48,
|
||||
Digit1: 49,
|
||||
Digit2: 50,
|
||||
Digit3: 51,
|
||||
Digit4: 52,
|
||||
Digit5: 53,
|
||||
Digit6: 54,
|
||||
Digit7: 55,
|
||||
Digit8: 56,
|
||||
Digit9: 57,
|
||||
KeyA: 65,
|
||||
KeyB: 66,
|
||||
KeyC: 67,
|
||||
KeyD: 68,
|
||||
KeyE: 69,
|
||||
KeyF: 70,
|
||||
KeyG: 71,
|
||||
KeyH: 72,
|
||||
KeyI: 73,
|
||||
KeyJ: 74,
|
||||
KeyK: 75,
|
||||
KeyL: 76,
|
||||
KeyM: 77,
|
||||
KeyN: 78,
|
||||
KeyO: 79,
|
||||
KeyP: 80,
|
||||
KeyQ: 81,
|
||||
KeyR: 82,
|
||||
KeyS: 83,
|
||||
KeyT: 84,
|
||||
KeyU: 85,
|
||||
KeyV: 86,
|
||||
KeyW: 87,
|
||||
KeyX: 88,
|
||||
KeyY: 89,
|
||||
KeyZ: 90,
|
||||
MetaLeft: 91,
|
||||
MetaRight: 92,
|
||||
ContextMenu: 93,
|
||||
NumpadMultiply: 106,
|
||||
NumpadAdd: 107,
|
||||
NumpadSubtract: 109,
|
||||
NumpadDivide: 111,
|
||||
F1: 112,
|
||||
F2: 113,
|
||||
F3: 114,
|
||||
F4: 115,
|
||||
F5: 116,
|
||||
F6: 117,
|
||||
F7: 118,
|
||||
F8: 119,
|
||||
F9: 120,
|
||||
F10: 121,
|
||||
F11: 122,
|
||||
F12: 123,
|
||||
F13: 124,
|
||||
F14: 125,
|
||||
F15: 126,
|
||||
F16: 127,
|
||||
F17: 128,
|
||||
F18: 129,
|
||||
F19: 130,
|
||||
F20: 131,
|
||||
F21: 132,
|
||||
F22: 133,
|
||||
F23: 134,
|
||||
F24: 135,
|
||||
NumLock: 144,
|
||||
ScrollLock: 145,
|
||||
AudioVolumeMute: 173,
|
||||
AudioVolumeDown: 174,
|
||||
AudioVolumeUp: 175,
|
||||
MediaTrackNext: 176,
|
||||
MediaTrackPrevious: 177,
|
||||
MediaStop: 178,
|
||||
MediaPlayPause: 179,
|
||||
Semicolon: 186,
|
||||
Equal: 187,
|
||||
NumpadEqual: 187,
|
||||
Comma: 188,
|
||||
Minus: 189,
|
||||
Period: 190,
|
||||
Slash: 191,
|
||||
Backquote: 192,
|
||||
BracketLeft: 219,
|
||||
Backslash: 220,
|
||||
BracketRight: 221,
|
||||
Quote: 222,
|
||||
AltGraph: 225,
|
||||
Props: 247,
|
||||
Cancel: 3,
|
||||
Clear: 12,
|
||||
Shift: 16,
|
||||
Control: 17,
|
||||
Alt: 18,
|
||||
Accept: 30,
|
||||
ModeChange: 31,
|
||||
' ': 32,
|
||||
Print: 42,
|
||||
Execute: 43,
|
||||
'\\u0000': 46,
|
||||
a: 65,
|
||||
b: 66,
|
||||
c: 67,
|
||||
d: 68,
|
||||
e: 69,
|
||||
f: 70,
|
||||
g: 71,
|
||||
h: 72,
|
||||
i: 73,
|
||||
j: 74,
|
||||
k: 75,
|
||||
l: 76,
|
||||
m: 77,
|
||||
n: 78,
|
||||
o: 79,
|
||||
p: 80,
|
||||
q: 81,
|
||||
r: 82,
|
||||
s: 83,
|
||||
t: 84,
|
||||
u: 85,
|
||||
v: 86,
|
||||
w: 87,
|
||||
x: 88,
|
||||
y: 89,
|
||||
z: 90,
|
||||
Meta: 91,
|
||||
'*': 106,
|
||||
'+': 107,
|
||||
'-': 109,
|
||||
'/': 111,
|
||||
';': 186,
|
||||
'=': 187,
|
||||
',': 188,
|
||||
'.': 190,
|
||||
'`': 192,
|
||||
'[': 219,
|
||||
'\\\\': 220,
|
||||
']': 221,
|
||||
"'": 222,
|
||||
Attn: 246,
|
||||
CrSel: 247,
|
||||
ExSel: 248,
|
||||
EraseEof: 249,
|
||||
Play: 250,
|
||||
ZoomOut: 251,
|
||||
')': 48,
|
||||
'!': 49,
|
||||
'@': 50,
|
||||
'#': 51,
|
||||
$: 52,
|
||||
'%': 53,
|
||||
'^': 54,
|
||||
'&': 55,
|
||||
'(': 57,
|
||||
A: 65,
|
||||
B: 66,
|
||||
C: 67,
|
||||
D: 68,
|
||||
E: 69,
|
||||
F: 70,
|
||||
G: 71,
|
||||
H: 72,
|
||||
I: 73,
|
||||
J: 74,
|
||||
K: 75,
|
||||
L: 76,
|
||||
M: 77,
|
||||
N: 78,
|
||||
O: 79,
|
||||
P: 80,
|
||||
Q: 81,
|
||||
R: 82,
|
||||
S: 83,
|
||||
T: 84,
|
||||
U: 85,
|
||||
V: 86,
|
||||
W: 87,
|
||||
X: 88,
|
||||
Y: 89,
|
||||
Z: 90,
|
||||
':': 186,
|
||||
'<': 188,
|
||||
_: 189,
|
||||
'>': 190,
|
||||
'?': 191,
|
||||
'~': 192,
|
||||
'{': 219,
|
||||
'|': 220,
|
||||
'}': 221,
|
||||
'"': 222,
|
||||
Camera: 44,
|
||||
EndCall: 95,
|
||||
VolumeDown: 182,
|
||||
VolumeUp: 183,
|
||||
};
|
||||
//# sourceMappingURL=USKeyboardLayout.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/USKeyboardLayout.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/USKeyboardLayout.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
31
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/keyUtils.d.ts
generated
vendored
Normal file
31
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/keyUtils.d.ts
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/**
|
||||
* Returns the normalized key value for a given key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-normalized-key-value
|
||||
*/
|
||||
export declare function getNormalizedKey(value: string): string;
|
||||
/**
|
||||
* Returns the key code for a given key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-shifted-character
|
||||
*/
|
||||
export declare function getKeyCode(key: string): string | undefined;
|
||||
/**
|
||||
* Returns the location of the key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-key-location
|
||||
*/
|
||||
export declare function getKeyLocation(key: string): 0 | 1 | 2 | 3;
|
||||
497
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/keyUtils.js
generated
vendored
Normal file
497
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/keyUtils.js
generated
vendored
Normal file
@@ -0,0 +1,497 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.getNormalizedKey = getNormalizedKey;
|
||||
exports.getKeyCode = getKeyCode;
|
||||
exports.getKeyLocation = getKeyLocation;
|
||||
/**
|
||||
* Returns the normalized key value for a given key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-normalized-key-value
|
||||
*/
|
||||
function getNormalizedKey(value) {
|
||||
switch (value) {
|
||||
case '\uE000':
|
||||
return 'Unidentified';
|
||||
case '\uE001':
|
||||
return 'Cancel';
|
||||
case '\uE002':
|
||||
return 'Help';
|
||||
case '\uE003':
|
||||
return 'Backspace';
|
||||
case '\uE004':
|
||||
return 'Tab';
|
||||
case '\uE005':
|
||||
return 'Clear';
|
||||
// Specification declares the '\uE006' to be `Return`, but it is not supported by
|
||||
// Chrome, so fall back to `Enter`, which aligns with WPT.
|
||||
case '\uE006':
|
||||
case '\uE007':
|
||||
return 'Enter';
|
||||
case '\uE008':
|
||||
return 'Shift';
|
||||
case '\uE009':
|
||||
return 'Control';
|
||||
case '\uE00A':
|
||||
return 'Alt';
|
||||
case '\uE00B':
|
||||
return 'Pause';
|
||||
case '\uE00C':
|
||||
return 'Escape';
|
||||
case '\uE00D':
|
||||
return ' ';
|
||||
case '\uE00E':
|
||||
return 'PageUp';
|
||||
case '\uE00F':
|
||||
return 'PageDown';
|
||||
case '\uE010':
|
||||
return 'End';
|
||||
case '\uE011':
|
||||
return 'Home';
|
||||
case '\uE012':
|
||||
return 'ArrowLeft';
|
||||
case '\uE013':
|
||||
return 'ArrowUp';
|
||||
case '\uE014':
|
||||
return 'ArrowRight';
|
||||
case '\uE015':
|
||||
return 'ArrowDown';
|
||||
case '\uE016':
|
||||
return 'Insert';
|
||||
case '\uE017':
|
||||
return 'Delete';
|
||||
case '\uE018':
|
||||
return ';';
|
||||
case '\uE019':
|
||||
return '=';
|
||||
case '\uE01A':
|
||||
return '0';
|
||||
case '\uE01B':
|
||||
return '1';
|
||||
case '\uE01C':
|
||||
return '2';
|
||||
case '\uE01D':
|
||||
return '3';
|
||||
case '\uE01E':
|
||||
return '4';
|
||||
case '\uE01F':
|
||||
return '5';
|
||||
case '\uE020':
|
||||
return '6';
|
||||
case '\uE021':
|
||||
return '7';
|
||||
case '\uE022':
|
||||
return '8';
|
||||
case '\uE023':
|
||||
return '9';
|
||||
case '\uE024':
|
||||
return '*';
|
||||
case '\uE025':
|
||||
return '+';
|
||||
case '\uE026':
|
||||
return ',';
|
||||
case '\uE027':
|
||||
return '-';
|
||||
case '\uE028':
|
||||
return '.';
|
||||
case '\uE029':
|
||||
return '/';
|
||||
case '\uE031':
|
||||
return 'F1';
|
||||
case '\uE032':
|
||||
return 'F2';
|
||||
case '\uE033':
|
||||
return 'F3';
|
||||
case '\uE034':
|
||||
return 'F4';
|
||||
case '\uE035':
|
||||
return 'F5';
|
||||
case '\uE036':
|
||||
return 'F6';
|
||||
case '\uE037':
|
||||
return 'F7';
|
||||
case '\uE038':
|
||||
return 'F8';
|
||||
case '\uE039':
|
||||
return 'F9';
|
||||
case '\uE03A':
|
||||
return 'F10';
|
||||
case '\uE03B':
|
||||
return 'F11';
|
||||
case '\uE03C':
|
||||
return 'F12';
|
||||
case '\uE03D':
|
||||
return 'Meta';
|
||||
case '\uE040':
|
||||
return 'ZenkakuHankaku';
|
||||
case '\uE050':
|
||||
return 'Shift';
|
||||
case '\uE051':
|
||||
return 'Control';
|
||||
case '\uE052':
|
||||
return 'Alt';
|
||||
case '\uE053':
|
||||
return 'Meta';
|
||||
case '\uE054':
|
||||
return 'PageUp';
|
||||
case '\uE055':
|
||||
return 'PageDown';
|
||||
case '\uE056':
|
||||
return 'End';
|
||||
case '\uE057':
|
||||
return 'Home';
|
||||
case '\uE058':
|
||||
return 'ArrowLeft';
|
||||
case '\uE059':
|
||||
return 'ArrowUp';
|
||||
case '\uE05A':
|
||||
return 'ArrowRight';
|
||||
case '\uE05B':
|
||||
return 'ArrowDown';
|
||||
case '\uE05C':
|
||||
return 'Insert';
|
||||
case '\uE05D':
|
||||
return 'Delete';
|
||||
default:
|
||||
return value;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns the key code for a given key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-shifted-character
|
||||
*/
|
||||
function getKeyCode(key) {
|
||||
switch (key) {
|
||||
case '`':
|
||||
case '~':
|
||||
return 'Backquote';
|
||||
case '\\':
|
||||
case '|':
|
||||
return 'Backslash';
|
||||
case '\uE003':
|
||||
return 'Backspace';
|
||||
case '[':
|
||||
case '{':
|
||||
return 'BracketLeft';
|
||||
case ']':
|
||||
case '}':
|
||||
return 'BracketRight';
|
||||
case ',':
|
||||
case '<':
|
||||
return 'Comma';
|
||||
case '0':
|
||||
case ')':
|
||||
return 'Digit0';
|
||||
case '1':
|
||||
case '!':
|
||||
return 'Digit1';
|
||||
case '2':
|
||||
case '@':
|
||||
return 'Digit2';
|
||||
case '3':
|
||||
case '#':
|
||||
return 'Digit3';
|
||||
case '4':
|
||||
case '$':
|
||||
return 'Digit4';
|
||||
case '5':
|
||||
case '%':
|
||||
return 'Digit5';
|
||||
case '6':
|
||||
case '^':
|
||||
return 'Digit6';
|
||||
case '7':
|
||||
case '&':
|
||||
return 'Digit7';
|
||||
case '8':
|
||||
case '*':
|
||||
return 'Digit8';
|
||||
case '9':
|
||||
case '(':
|
||||
return 'Digit9';
|
||||
case '=':
|
||||
case '+':
|
||||
return 'Equal';
|
||||
// The spec declares the '<' to be `IntlBackslash` as well, but it is already covered
|
||||
// in the `Comma` above.
|
||||
case '>':
|
||||
return 'IntlBackslash';
|
||||
case 'a':
|
||||
case 'A':
|
||||
return 'KeyA';
|
||||
case 'b':
|
||||
case 'B':
|
||||
return 'KeyB';
|
||||
case 'c':
|
||||
case 'C':
|
||||
return 'KeyC';
|
||||
case 'd':
|
||||
case 'D':
|
||||
return 'KeyD';
|
||||
case 'e':
|
||||
case 'E':
|
||||
return 'KeyE';
|
||||
case 'f':
|
||||
case 'F':
|
||||
return 'KeyF';
|
||||
case 'g':
|
||||
case 'G':
|
||||
return 'KeyG';
|
||||
case 'h':
|
||||
case 'H':
|
||||
return 'KeyH';
|
||||
case 'i':
|
||||
case 'I':
|
||||
return 'KeyI';
|
||||
case 'j':
|
||||
case 'J':
|
||||
return 'KeyJ';
|
||||
case 'k':
|
||||
case 'K':
|
||||
return 'KeyK';
|
||||
case 'l':
|
||||
case 'L':
|
||||
return 'KeyL';
|
||||
case 'm':
|
||||
case 'M':
|
||||
return 'KeyM';
|
||||
case 'n':
|
||||
case 'N':
|
||||
return 'KeyN';
|
||||
case 'o':
|
||||
case 'O':
|
||||
return 'KeyO';
|
||||
case 'p':
|
||||
case 'P':
|
||||
return 'KeyP';
|
||||
case 'q':
|
||||
case 'Q':
|
||||
return 'KeyQ';
|
||||
case 'r':
|
||||
case 'R':
|
||||
return 'KeyR';
|
||||
case 's':
|
||||
case 'S':
|
||||
return 'KeyS';
|
||||
case 't':
|
||||
case 'T':
|
||||
return 'KeyT';
|
||||
case 'u':
|
||||
case 'U':
|
||||
return 'KeyU';
|
||||
case 'v':
|
||||
case 'V':
|
||||
return 'KeyV';
|
||||
case 'w':
|
||||
case 'W':
|
||||
return 'KeyW';
|
||||
case 'x':
|
||||
case 'X':
|
||||
return 'KeyX';
|
||||
case 'y':
|
||||
case 'Y':
|
||||
return 'KeyY';
|
||||
case 'z':
|
||||
case 'Z':
|
||||
return 'KeyZ';
|
||||
case '-':
|
||||
case '_':
|
||||
return 'Minus';
|
||||
case '.':
|
||||
return 'Period';
|
||||
case "'":
|
||||
case '"':
|
||||
return 'Quote';
|
||||
case ';':
|
||||
case ':':
|
||||
return 'Semicolon';
|
||||
case '/':
|
||||
case '?':
|
||||
return 'Slash';
|
||||
case '\uE00A':
|
||||
return 'AltLeft';
|
||||
case '\uE052':
|
||||
return 'AltRight';
|
||||
case '\uE009':
|
||||
return 'ControlLeft';
|
||||
case '\uE051':
|
||||
return 'ControlRight';
|
||||
case '\uE006':
|
||||
return 'Enter';
|
||||
case '\uE00B':
|
||||
return 'Pause';
|
||||
case '\uE03D':
|
||||
return 'MetaLeft';
|
||||
case '\uE053':
|
||||
return 'MetaRight';
|
||||
case '\uE008':
|
||||
return 'ShiftLeft';
|
||||
case '\uE050':
|
||||
return 'ShiftRight';
|
||||
case ' ':
|
||||
case '\uE00D':
|
||||
return 'Space';
|
||||
case '\uE004':
|
||||
return 'Tab';
|
||||
case '\uE017':
|
||||
return 'Delete';
|
||||
case '\uE010':
|
||||
return 'End';
|
||||
case '\uE002':
|
||||
return 'Help';
|
||||
case '\uE011':
|
||||
return 'Home';
|
||||
case '\uE016':
|
||||
return 'Insert';
|
||||
case '\uE00F':
|
||||
return 'PageDown';
|
||||
case '\uE00E':
|
||||
return 'PageUp';
|
||||
case '\uE015':
|
||||
return 'ArrowDown';
|
||||
case '\uE012':
|
||||
return 'ArrowLeft';
|
||||
case '\uE014':
|
||||
return 'ArrowRight';
|
||||
case '\uE013':
|
||||
return 'ArrowUp';
|
||||
case '\uE00C':
|
||||
return 'Escape';
|
||||
case '\uE031':
|
||||
return 'F1';
|
||||
case '\uE032':
|
||||
return 'F2';
|
||||
case '\uE033':
|
||||
return 'F3';
|
||||
case '\uE034':
|
||||
return 'F4';
|
||||
case '\uE035':
|
||||
return 'F5';
|
||||
case '\uE036':
|
||||
return 'F6';
|
||||
case '\uE037':
|
||||
return 'F7';
|
||||
case '\uE038':
|
||||
return 'F8';
|
||||
case '\uE039':
|
||||
return 'F9';
|
||||
case '\uE03A':
|
||||
return 'F10';
|
||||
case '\uE03B':
|
||||
return 'F11';
|
||||
case '\uE03C':
|
||||
return 'F12';
|
||||
case '\uE019':
|
||||
return 'NumpadEqual';
|
||||
case '\uE01A':
|
||||
case '\uE05C':
|
||||
return 'Numpad0';
|
||||
case '\uE01B':
|
||||
case '\uE056':
|
||||
return 'Numpad1';
|
||||
case '\uE01C':
|
||||
case '\uE05B':
|
||||
return 'Numpad2';
|
||||
case '\uE01D':
|
||||
case '\uE055':
|
||||
return 'Numpad3';
|
||||
case '\uE01E':
|
||||
case '\uE058':
|
||||
return 'Numpad4';
|
||||
case '\uE01F':
|
||||
return 'Numpad5';
|
||||
case '\uE020':
|
||||
case '\uE05A':
|
||||
return 'Numpad6';
|
||||
case '\uE021':
|
||||
case '\uE057':
|
||||
return 'Numpad7';
|
||||
case '\uE022':
|
||||
case '\uE059':
|
||||
return 'Numpad8';
|
||||
case '\uE023':
|
||||
case '\uE054':
|
||||
return 'Numpad9';
|
||||
case '\uE025':
|
||||
return 'NumpadAdd';
|
||||
case '\uE026':
|
||||
return 'NumpadComma';
|
||||
case '\uE028':
|
||||
case '\uE05D':
|
||||
return 'NumpadDecimal';
|
||||
case '\uE029':
|
||||
return 'NumpadDivide';
|
||||
case '\uE007':
|
||||
return 'NumpadEnter';
|
||||
case '\uE024':
|
||||
return 'NumpadMultiply';
|
||||
case '\uE027':
|
||||
return 'NumpadSubtract';
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns the location of the key according to the table:
|
||||
* https://w3c.github.io/webdriver/#dfn-key-location
|
||||
*/
|
||||
function getKeyLocation(key) {
|
||||
switch (key) {
|
||||
case '\uE007':
|
||||
case '\uE008':
|
||||
case '\uE009':
|
||||
case '\uE00A':
|
||||
case '\uE03D':
|
||||
return 1;
|
||||
case '\uE019':
|
||||
case '\uE01A':
|
||||
case '\uE01B':
|
||||
case '\uE01C':
|
||||
case '\uE01D':
|
||||
case '\uE01E':
|
||||
case '\uE01F':
|
||||
case '\uE020':
|
||||
case '\uE021':
|
||||
case '\uE022':
|
||||
case '\uE023':
|
||||
case '\uE024':
|
||||
case '\uE025':
|
||||
case '\uE026':
|
||||
case '\uE027':
|
||||
case '\uE028':
|
||||
case '\uE029':
|
||||
case '\uE054':
|
||||
case '\uE055':
|
||||
case '\uE056':
|
||||
case '\uE057':
|
||||
case '\uE058':
|
||||
case '\uE059':
|
||||
case '\uE05A':
|
||||
case '\uE05B':
|
||||
case '\uE05C':
|
||||
case '\uE05D':
|
||||
return 3;
|
||||
case '\uE050':
|
||||
case '\uE051':
|
||||
case '\uE052':
|
||||
case '\uE053':
|
||||
return 2;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=keyUtils.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/keyUtils.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/input/keyUtils.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
9
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/LogManager.d.ts
generated
vendored
Normal file
9
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/LogManager.d.ts
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import { type LoggerFn } from '../../../utils/log.js';
|
||||
import type { CdpTarget } from '../cdp/CdpTarget.js';
|
||||
import type { RealmStorage } from '../script/RealmStorage.js';
|
||||
import type { EventManager } from '../session/EventManager.js';
|
||||
export declare class LogManager {
|
||||
#private;
|
||||
private constructor();
|
||||
static create(cdpTarget: CdpTarget, realmStorage: RealmStorage, eventManager: EventManager, logger?: LoggerFn): LogManager;
|
||||
}
|
||||
187
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/LogManager.js
generated
vendored
Normal file
187
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/LogManager.js
generated
vendored
Normal file
@@ -0,0 +1,187 @@
|
||||
"use strict";
|
||||
var _a;
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.LogManager = void 0;
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
const log_js_1 = require("../../../utils/log.js");
|
||||
const logHelper_js_1 = require("./logHelper.js");
|
||||
/** Converts CDP StackTrace object to BiDi StackTrace object. */
|
||||
function getBidiStackTrace(cdpStackTrace) {
|
||||
const stackFrames = cdpStackTrace?.callFrames.map((callFrame) => {
|
||||
return {
|
||||
columnNumber: callFrame.columnNumber,
|
||||
functionName: callFrame.functionName,
|
||||
lineNumber: callFrame.lineNumber,
|
||||
url: callFrame.url,
|
||||
};
|
||||
});
|
||||
return stackFrames ? { callFrames: stackFrames } : undefined;
|
||||
}
|
||||
function getLogLevel(consoleApiType) {
|
||||
if (["error" /* Log.Level.Error */, 'assert'].includes(consoleApiType)) {
|
||||
return "error" /* Log.Level.Error */;
|
||||
}
|
||||
if (["debug" /* Log.Level.Debug */, 'trace'].includes(consoleApiType)) {
|
||||
return "debug" /* Log.Level.Debug */;
|
||||
}
|
||||
if (["warn" /* Log.Level.Warn */, 'warning'].includes(consoleApiType)) {
|
||||
return "warn" /* Log.Level.Warn */;
|
||||
}
|
||||
return "info" /* Log.Level.Info */;
|
||||
}
|
||||
function getLogMethod(consoleApiType) {
|
||||
switch (consoleApiType) {
|
||||
case 'warning':
|
||||
return 'warn';
|
||||
case 'startGroup':
|
||||
return 'group';
|
||||
case 'startGroupCollapsed':
|
||||
return 'groupCollapsed';
|
||||
case 'endGroup':
|
||||
return 'groupEnd';
|
||||
}
|
||||
return consoleApiType;
|
||||
}
|
||||
class LogManager {
|
||||
#eventManager;
|
||||
#realmStorage;
|
||||
#cdpTarget;
|
||||
#logger;
|
||||
constructor(cdpTarget, realmStorage, eventManager, logger) {
|
||||
this.#cdpTarget = cdpTarget;
|
||||
this.#realmStorage = realmStorage;
|
||||
this.#eventManager = eventManager;
|
||||
this.#logger = logger;
|
||||
}
|
||||
static create(cdpTarget, realmStorage, eventManager, logger) {
|
||||
const logManager = new _a(cdpTarget, realmStorage, eventManager, logger);
|
||||
logManager.#initializeEntryAddedEventListener();
|
||||
return logManager;
|
||||
}
|
||||
/**
|
||||
* Heuristic serialization of CDP remote object. If possible, return the BiDi value
|
||||
* without deep serialization.
|
||||
*/
|
||||
async #heuristicSerializeArg(arg, realm) {
|
||||
switch (arg.type) {
|
||||
// TODO: Implement regexp, array, object, map and set heuristics base on
|
||||
// preview.
|
||||
case 'undefined':
|
||||
return { type: 'undefined' };
|
||||
case 'boolean':
|
||||
return { type: 'boolean', value: arg.value };
|
||||
case 'string':
|
||||
return { type: 'string', value: arg.value };
|
||||
case 'number':
|
||||
// The value can be either a number or a string like `Infinity` or `-0`.
|
||||
return { type: 'number', value: arg.unserializableValue ?? arg.value };
|
||||
case 'bigint':
|
||||
if (arg.unserializableValue !== undefined &&
|
||||
arg.unserializableValue[arg.unserializableValue.length - 1] === 'n') {
|
||||
return {
|
||||
type: arg.type,
|
||||
value: arg.unserializableValue.slice(0, -1),
|
||||
};
|
||||
}
|
||||
// Unexpected bigint value, fall back to CDP deep serialization.
|
||||
break;
|
||||
case 'object':
|
||||
if (arg.subtype === 'null') {
|
||||
return { type: 'null' };
|
||||
}
|
||||
// Fall back to CDP deep serialization.
|
||||
break;
|
||||
default:
|
||||
// Fall back to CDP deep serialization.
|
||||
break;
|
||||
}
|
||||
// Fall back to CDP deep serialization.
|
||||
return await realm.serializeCdpObject(arg, "none" /* Script.ResultOwnership.None */);
|
||||
}
|
||||
#initializeEntryAddedEventListener() {
|
||||
this.#cdpTarget.cdpClient.on('Runtime.consoleAPICalled', (params) => {
|
||||
// Try to find realm by `cdpSessionId` and `executionContextId`,
|
||||
// if provided.
|
||||
const realm = this.#realmStorage.findRealm({
|
||||
cdpSessionId: this.#cdpTarget.cdpSessionId,
|
||||
executionContextId: params.executionContextId,
|
||||
});
|
||||
if (realm === undefined) {
|
||||
// Ignore exceptions not attached to any realm.
|
||||
this.#logger?.(log_js_1.LogType.cdp, params);
|
||||
return;
|
||||
}
|
||||
const argsPromise = Promise.all(params.args.map((arg) => this.#heuristicSerializeArg(arg, realm)));
|
||||
for (const browsingContext of realm.associatedBrowsingContexts) {
|
||||
this.#eventManager.registerPromiseEvent(argsPromise.then((args) => ({
|
||||
kind: 'success',
|
||||
value: {
|
||||
type: 'event',
|
||||
method: protocol_js_1.ChromiumBidi.Log.EventNames.LogEntryAdded,
|
||||
params: {
|
||||
level: getLogLevel(params.type),
|
||||
source: realm.source,
|
||||
text: (0, logHelper_js_1.getRemoteValuesText)(args, true),
|
||||
timestamp: Math.round(params.timestamp),
|
||||
stackTrace: getBidiStackTrace(params.stackTrace),
|
||||
type: 'console',
|
||||
method: getLogMethod(params.type),
|
||||
args,
|
||||
},
|
||||
},
|
||||
}), (error) => ({
|
||||
kind: 'error',
|
||||
error,
|
||||
})), browsingContext.id, protocol_js_1.ChromiumBidi.Log.EventNames.LogEntryAdded);
|
||||
}
|
||||
});
|
||||
this.#cdpTarget.cdpClient.on('Runtime.exceptionThrown', (params) => {
|
||||
// Try to find realm by `cdpSessionId` and `executionContextId`,
|
||||
// if provided.
|
||||
const realm = this.#realmStorage.findRealm({
|
||||
cdpSessionId: this.#cdpTarget.cdpSessionId,
|
||||
executionContextId: params.exceptionDetails.executionContextId,
|
||||
});
|
||||
if (realm === undefined) {
|
||||
// Ignore exceptions not attached to any realm.
|
||||
this.#logger?.(log_js_1.LogType.cdp, params);
|
||||
return;
|
||||
}
|
||||
for (const browsingContext of realm.associatedBrowsingContexts) {
|
||||
this.#eventManager.registerPromiseEvent(_a.#getExceptionText(params, realm).then((text) => ({
|
||||
kind: 'success',
|
||||
value: {
|
||||
type: 'event',
|
||||
method: protocol_js_1.ChromiumBidi.Log.EventNames.LogEntryAdded,
|
||||
params: {
|
||||
level: "error" /* Log.Level.Error */,
|
||||
source: realm.source,
|
||||
text,
|
||||
timestamp: Math.round(params.timestamp),
|
||||
stackTrace: getBidiStackTrace(params.exceptionDetails.stackTrace),
|
||||
type: 'javascript',
|
||||
},
|
||||
},
|
||||
}), (error) => ({
|
||||
kind: 'error',
|
||||
error,
|
||||
})), browsingContext.id, protocol_js_1.ChromiumBidi.Log.EventNames.LogEntryAdded);
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Try the best to get the exception text.
|
||||
*/
|
||||
static async #getExceptionText(params, realm) {
|
||||
if (!params.exceptionDetails.exception) {
|
||||
return params.exceptionDetails.text;
|
||||
}
|
||||
if (realm === undefined) {
|
||||
return JSON.stringify(params.exceptionDetails.exception);
|
||||
}
|
||||
return await realm.stringifyObject(params.exceptionDetails.exception);
|
||||
}
|
||||
}
|
||||
exports.LogManager = LogManager;
|
||||
_a = LogManager;
|
||||
//# sourceMappingURL=LogManager.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/LogManager.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/LogManager.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
23
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/logHelper.d.ts
generated
vendored
Normal file
23
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/logHelper.d.ts
generated
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* Copyright 2022 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { Script } from '../../../protocol/protocol.js';
|
||||
/**
|
||||
* @param args input remote values to be format printed
|
||||
* @return parsed text of the remote values in specific format
|
||||
*/
|
||||
export declare function logMessageFormatter(args: Script.RemoteValue[]): string;
|
||||
export declare function getRemoteValuesText(args: Script.RemoteValue[], formatText: boolean): string;
|
||||
172
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/logHelper.js
generated
vendored
Normal file
172
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/logHelper.js
generated
vendored
Normal file
@@ -0,0 +1,172 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2022 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.logMessageFormatter = logMessageFormatter;
|
||||
exports.getRemoteValuesText = getRemoteValuesText;
|
||||
const assert_js_1 = require("../../../utils/assert.js");
|
||||
const specifiers = ['%s', '%d', '%i', '%f', '%o', '%O', '%c'];
|
||||
function isFormatSpecifier(str) {
|
||||
return specifiers.some((spec) => str.includes(spec));
|
||||
}
|
||||
/**
|
||||
* @param args input remote values to be format printed
|
||||
* @return parsed text of the remote values in specific format
|
||||
*/
|
||||
function logMessageFormatter(args) {
|
||||
let output = '';
|
||||
const argFormat = args[0].value.toString();
|
||||
const argValues = args.slice(1, undefined);
|
||||
const tokens = argFormat.split(new RegExp(specifiers.map((spec) => `(${spec})`).join('|'), 'g'));
|
||||
for (const token of tokens) {
|
||||
if (token === undefined || token === '') {
|
||||
continue;
|
||||
}
|
||||
if (isFormatSpecifier(token)) {
|
||||
const arg = argValues.shift();
|
||||
// raise an exception when less value is provided
|
||||
(0, assert_js_1.assert)(arg, `Less value is provided: "${getRemoteValuesText(args, false)}"`);
|
||||
if (token === '%s') {
|
||||
output += stringFromArg(arg);
|
||||
}
|
||||
else if (token === '%d' || token === '%i') {
|
||||
if (arg.type === 'bigint' ||
|
||||
arg.type === 'number' ||
|
||||
arg.type === 'string') {
|
||||
output += parseInt(arg.value.toString(), 10);
|
||||
}
|
||||
else {
|
||||
output += 'NaN';
|
||||
}
|
||||
}
|
||||
else if (token === '%f') {
|
||||
if (arg.type === 'bigint' ||
|
||||
arg.type === 'number' ||
|
||||
arg.type === 'string') {
|
||||
output += parseFloat(arg.value.toString());
|
||||
}
|
||||
else {
|
||||
output += 'NaN';
|
||||
}
|
||||
}
|
||||
else {
|
||||
// %o, %O, %c
|
||||
output += toJson(arg);
|
||||
}
|
||||
}
|
||||
else {
|
||||
output += token;
|
||||
}
|
||||
}
|
||||
// raise an exception when more value is provided
|
||||
if (argValues.length > 0) {
|
||||
throw new Error(`More value is provided: "${getRemoteValuesText(args, false)}"`);
|
||||
}
|
||||
return output;
|
||||
}
|
||||
/**
|
||||
* @param arg input remote value to be parsed
|
||||
* @return parsed text of the remote value
|
||||
*
|
||||
* input: {"type": "number", "value": 1}
|
||||
* output: 1
|
||||
*
|
||||
* input: {"type": "string", "value": "abc"}
|
||||
* output: "abc"
|
||||
*
|
||||
* input: {"type": "object", "value": [["id", {"type": "number", "value": 1}]]}
|
||||
* output: '{"id": 1}'
|
||||
*
|
||||
* input: {"type": "object", "value": [["font-size", {"type": "string", "value": "20px"}]]}
|
||||
* output: '{"font-size": "20px"}'
|
||||
*/
|
||||
function toJson(arg) {
|
||||
// arg type validation
|
||||
if (arg.type !== 'array' &&
|
||||
arg.type !== 'bigint' &&
|
||||
arg.type !== 'date' &&
|
||||
arg.type !== 'number' &&
|
||||
arg.type !== 'object' &&
|
||||
arg.type !== 'string') {
|
||||
return stringFromArg(arg);
|
||||
}
|
||||
if (arg.type === 'bigint') {
|
||||
return `${arg.value.toString()}n`;
|
||||
}
|
||||
if (arg.type === 'number') {
|
||||
return arg.value.toString();
|
||||
}
|
||||
if (['date', 'string'].includes(arg.type)) {
|
||||
return JSON.stringify(arg.value);
|
||||
}
|
||||
if (arg.type === 'object') {
|
||||
return `{${arg.value
|
||||
.map((pair) => {
|
||||
return `${JSON.stringify(pair[0])}:${toJson(pair[1])}`;
|
||||
})
|
||||
.join(',')}}`;
|
||||
}
|
||||
if (arg.type === 'array') {
|
||||
return `[${arg.value?.map((val) => toJson(val)).join(',') ?? ''}]`;
|
||||
}
|
||||
throw Error(`Invalid value type: ${arg}`);
|
||||
}
|
||||
function stringFromArg(arg) {
|
||||
if (!Object.hasOwn(arg, 'value')) {
|
||||
return arg.type;
|
||||
}
|
||||
switch (arg.type) {
|
||||
case 'string':
|
||||
case 'number':
|
||||
case 'boolean':
|
||||
case 'bigint':
|
||||
return String(arg.value);
|
||||
case 'regexp':
|
||||
return `/${arg.value.pattern}/${arg.value.flags ?? ''}`;
|
||||
case 'date':
|
||||
return new Date(arg.value).toString();
|
||||
case 'object':
|
||||
return `Object(${arg.value?.length ?? ''})`;
|
||||
case 'array':
|
||||
return `Array(${arg.value?.length ?? ''})`;
|
||||
case 'map':
|
||||
return `Map(${arg.value?.length})`;
|
||||
case 'set':
|
||||
return `Set(${arg.value?.length})`;
|
||||
default:
|
||||
return arg.type;
|
||||
}
|
||||
}
|
||||
function getRemoteValuesText(args, formatText) {
|
||||
const arg = args[0];
|
||||
if (!arg) {
|
||||
return '';
|
||||
}
|
||||
// if args[0] is a format specifier, format the args as output
|
||||
if (arg.type === 'string' &&
|
||||
isFormatSpecifier(arg.value.toString()) &&
|
||||
formatText) {
|
||||
return logMessageFormatter(args);
|
||||
}
|
||||
// if args[0] is not a format specifier, just join the args with \u0020 (unicode 'SPACE')
|
||||
return args
|
||||
.map((arg) => {
|
||||
return stringFromArg(arg);
|
||||
})
|
||||
.join('\u0020');
|
||||
}
|
||||
//# sourceMappingURL=logHelper.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/logHelper.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/log/logHelper.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"logHelper.js","sourceRoot":"","sources":["../../../../../src/bidiMapper/modules/log/logHelper.ts"],"names":[],"mappings":"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"}
|
||||
54
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/network/NetworkProcessor.d.ts
generated
vendored
Normal file
54
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/network/NetworkProcessor.d.ts
generated
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import type { Protocol } from 'devtools-protocol';
|
||||
import { Network, type EmptyResult } from '../../../protocol/protocol.js';
|
||||
import type { ContextConfigStorage } from '../browser/ContextConfigStorage.js';
|
||||
import type { UserContextStorage } from '../browser/UserContextStorage.js';
|
||||
import type { BrowsingContextStorage } from '../context/BrowsingContextStorage.js';
|
||||
import type { NetworkStorage } from './NetworkStorage.js';
|
||||
import { type ParsedUrlPattern } from './NetworkUtils.js';
|
||||
/** Dispatches Network module commands. */
|
||||
export declare class NetworkProcessor {
|
||||
#private;
|
||||
constructor(browsingContextStorage: BrowsingContextStorage, networkStorage: NetworkStorage, userContextStorage: UserContextStorage, contextConfigStorage: ContextConfigStorage);
|
||||
addIntercept(params: Network.AddInterceptParameters): Promise<Network.AddInterceptResult>;
|
||||
continueRequest(params: Network.ContinueRequestParameters): Promise<EmptyResult>;
|
||||
continueResponse(params: Network.ContinueResponseParameters): Promise<EmptyResult>;
|
||||
continueWithAuth(params: Network.ContinueWithAuthParameters): Promise<EmptyResult>;
|
||||
failRequest({ request: networkId, }: Network.FailRequestParameters): Promise<EmptyResult>;
|
||||
provideResponse(params: Network.ProvideResponseParameters): Promise<EmptyResult>;
|
||||
removeIntercept(params: Network.RemoveInterceptParameters): Promise<EmptyResult>;
|
||||
setCacheBehavior(params: Network.SetCacheBehaviorParameters): Promise<EmptyResult>;
|
||||
/**
|
||||
* Validate https://fetch.spec.whatwg.org/#header-value
|
||||
*/
|
||||
static validateHeaders(headers: Network.Header[]): void;
|
||||
static isMethodValid(method: string): boolean;
|
||||
/**
|
||||
* Attempts to parse the given url.
|
||||
* Throws an InvalidArgumentException if the url is invalid.
|
||||
*/
|
||||
static parseUrlString(url: string): URL;
|
||||
static parseUrlPatterns(urlPatterns: Network.UrlPattern[]): ParsedUrlPattern[];
|
||||
static wrapInterceptionError(error: any): any;
|
||||
addDataCollector(params: Network.AddDataCollectorParameters): Promise<Network.AddDataCollectorResult>;
|
||||
getData(params: Network.GetDataParameters): Promise<Network.GetDataResult>;
|
||||
removeDataCollector(params: Network.RemoveDataCollectorParameters): Promise<EmptyResult>;
|
||||
disownData(params: Network.DisownDataParameters): EmptyResult;
|
||||
setExtraHeaders(params: Network.SetExtraHeadersParameters): Promise<EmptyResult>;
|
||||
}
|
||||
export declare function parseBiDiHeaders(headers: Network.Header[]): Protocol.Network.Headers;
|
||||
479
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/network/NetworkProcessor.js
generated
vendored
Normal file
479
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/network/NetworkProcessor.js
generated
vendored
Normal file
@@ -0,0 +1,479 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Copyright 2023 Google LLC.
|
||||
* Copyright (c) Microsoft Corporation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.NetworkProcessor = void 0;
|
||||
exports.parseBiDiHeaders = parseBiDiHeaders;
|
||||
const protocol_js_1 = require("../../../protocol/protocol.js");
|
||||
const NetworkUtils_js_1 = require("./NetworkUtils.js");
|
||||
/** Dispatches Network module commands. */
|
||||
class NetworkProcessor {
|
||||
#browsingContextStorage;
|
||||
#networkStorage;
|
||||
#userContextStorage;
|
||||
#contextConfigStorage;
|
||||
constructor(browsingContextStorage, networkStorage, userContextStorage, contextConfigStorage) {
|
||||
this.#userContextStorage = userContextStorage;
|
||||
this.#browsingContextStorage = browsingContextStorage;
|
||||
this.#networkStorage = networkStorage;
|
||||
this.#contextConfigStorage = contextConfigStorage;
|
||||
}
|
||||
async addIntercept(params) {
|
||||
this.#browsingContextStorage.verifyTopLevelContextsList(params.contexts);
|
||||
const urlPatterns = params.urlPatterns ?? [];
|
||||
const parsedUrlPatterns = NetworkProcessor.parseUrlPatterns(urlPatterns);
|
||||
const intercept = this.#networkStorage.addIntercept({
|
||||
urlPatterns: parsedUrlPatterns,
|
||||
phases: params.phases,
|
||||
contexts: params.contexts,
|
||||
});
|
||||
// Adding interception may require enabling CDP Network domains.
|
||||
await this.#toggleNetwork();
|
||||
return {
|
||||
intercept,
|
||||
};
|
||||
}
|
||||
async continueRequest(params) {
|
||||
if (params.url !== undefined) {
|
||||
NetworkProcessor.parseUrlString(params.url);
|
||||
}
|
||||
if (params.method !== undefined) {
|
||||
if (!NetworkProcessor.isMethodValid(params.method)) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Method '${params.method}' is invalid.`);
|
||||
}
|
||||
}
|
||||
if (params.headers) {
|
||||
NetworkProcessor.validateHeaders(params.headers);
|
||||
}
|
||||
const request = this.#getBlockedRequestOrFail(params.request, [
|
||||
"beforeRequestSent" /* Network.InterceptPhase.BeforeRequestSent */,
|
||||
]);
|
||||
try {
|
||||
await request.continueRequest(params);
|
||||
}
|
||||
catch (error) {
|
||||
throw NetworkProcessor.wrapInterceptionError(error);
|
||||
}
|
||||
return {};
|
||||
}
|
||||
async continueResponse(params) {
|
||||
if (params.headers) {
|
||||
NetworkProcessor.validateHeaders(params.headers);
|
||||
}
|
||||
const request = this.#getBlockedRequestOrFail(params.request, [
|
||||
"authRequired" /* Network.InterceptPhase.AuthRequired */,
|
||||
"responseStarted" /* Network.InterceptPhase.ResponseStarted */,
|
||||
]);
|
||||
try {
|
||||
await request.continueResponse(params);
|
||||
}
|
||||
catch (error) {
|
||||
throw NetworkProcessor.wrapInterceptionError(error);
|
||||
}
|
||||
return {};
|
||||
}
|
||||
async continueWithAuth(params) {
|
||||
const networkId = params.request;
|
||||
const request = this.#getBlockedRequestOrFail(networkId, [
|
||||
"authRequired" /* Network.InterceptPhase.AuthRequired */,
|
||||
]);
|
||||
await request.continueWithAuth(params);
|
||||
return {};
|
||||
}
|
||||
async failRequest({ request: networkId, }) {
|
||||
const request = this.#getRequestOrFail(networkId);
|
||||
if (request.interceptPhase === "authRequired" /* Network.InterceptPhase.AuthRequired */) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Request '${networkId}' in 'authRequired' phase cannot be failed`);
|
||||
}
|
||||
if (!request.interceptPhase) {
|
||||
throw new protocol_js_1.NoSuchRequestException(`No blocked request found for network id '${networkId}'`);
|
||||
}
|
||||
await request.failRequest('Failed');
|
||||
return {};
|
||||
}
|
||||
async provideResponse(params) {
|
||||
if (params.headers) {
|
||||
NetworkProcessor.validateHeaders(params.headers);
|
||||
}
|
||||
const request = this.#getBlockedRequestOrFail(params.request, [
|
||||
"beforeRequestSent" /* Network.InterceptPhase.BeforeRequestSent */,
|
||||
"responseStarted" /* Network.InterceptPhase.ResponseStarted */,
|
||||
"authRequired" /* Network.InterceptPhase.AuthRequired */,
|
||||
]);
|
||||
try {
|
||||
await request.provideResponse(params);
|
||||
}
|
||||
catch (error) {
|
||||
throw NetworkProcessor.wrapInterceptionError(error);
|
||||
}
|
||||
return {};
|
||||
}
|
||||
/**
|
||||
* In some states CDP Network and Fetch domains are not required, but in some they have
|
||||
* to be updated. Whenever potential change in these kinds of states is introduced,
|
||||
* update the states of all the CDP targets.
|
||||
*/
|
||||
async #toggleNetwork() {
|
||||
await Promise.all(this.#browsingContextStorage.getAllContexts().map((context) => {
|
||||
return context.cdpTarget.toggleNetwork();
|
||||
}));
|
||||
}
|
||||
async removeIntercept(params) {
|
||||
this.#networkStorage.removeIntercept(params.intercept);
|
||||
// Removing interception may allow for disabling CDP Network domains.
|
||||
await this.#toggleNetwork();
|
||||
return {};
|
||||
}
|
||||
async setCacheBehavior(params) {
|
||||
const contexts = this.#browsingContextStorage.verifyTopLevelContextsList(params.contexts);
|
||||
// Change all targets
|
||||
if (contexts.size === 0) {
|
||||
this.#networkStorage.defaultCacheBehavior = params.cacheBehavior;
|
||||
await Promise.all(this.#browsingContextStorage.getAllContexts().map((context) => {
|
||||
return context.cdpTarget.toggleSetCacheDisabled();
|
||||
}));
|
||||
return {};
|
||||
}
|
||||
const cacheDisabled = params.cacheBehavior === 'bypass';
|
||||
await Promise.all([...contexts.values()].map((context) => {
|
||||
return context.cdpTarget.toggleSetCacheDisabled(cacheDisabled);
|
||||
}));
|
||||
return {};
|
||||
}
|
||||
#getRequestOrFail(id) {
|
||||
const request = this.#networkStorage.getRequestById(id);
|
||||
if (!request) {
|
||||
throw new protocol_js_1.NoSuchRequestException(`Network request with ID '${id}' doesn't exist`);
|
||||
}
|
||||
return request;
|
||||
}
|
||||
#getBlockedRequestOrFail(id, phases) {
|
||||
const request = this.#getRequestOrFail(id);
|
||||
if (!request.interceptPhase) {
|
||||
throw new protocol_js_1.NoSuchRequestException(`No blocked request found for network id '${id}'`);
|
||||
}
|
||||
if (request.interceptPhase && !phases.includes(request.interceptPhase)) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Blocked request for network id '${id}' is in '${request.interceptPhase}' phase`);
|
||||
}
|
||||
return request;
|
||||
}
|
||||
/**
|
||||
* Validate https://fetch.spec.whatwg.org/#header-value
|
||||
*/
|
||||
static validateHeaders(headers) {
|
||||
for (const header of headers) {
|
||||
let headerValue;
|
||||
if (header.value.type === 'string') {
|
||||
headerValue = header.value.value;
|
||||
}
|
||||
else {
|
||||
headerValue = atob(header.value.value);
|
||||
}
|
||||
if (headerValue !== headerValue.trim() ||
|
||||
headerValue.includes('\n') ||
|
||||
headerValue.includes('\0')) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Header value '${headerValue}' is not acceptable value`);
|
||||
}
|
||||
}
|
||||
}
|
||||
static isMethodValid(method) {
|
||||
// https://httpwg.org/specs/rfc9110.html#method.overview
|
||||
return /^[!#$%&'*+\-.^_`|~a-zA-Z\d]+$/.test(method);
|
||||
}
|
||||
/**
|
||||
* Attempts to parse the given url.
|
||||
* Throws an InvalidArgumentException if the url is invalid.
|
||||
*/
|
||||
static parseUrlString(url) {
|
||||
try {
|
||||
return new URL(url);
|
||||
}
|
||||
catch (error) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Invalid URL '${url}': ${error}`);
|
||||
}
|
||||
}
|
||||
static parseUrlPatterns(urlPatterns) {
|
||||
return urlPatterns.map((urlPattern) => {
|
||||
let patternUrl = '';
|
||||
let hasProtocol = true;
|
||||
let hasHostname = true;
|
||||
let hasPort = true;
|
||||
let hasPathname = true;
|
||||
let hasSearch = true;
|
||||
switch (urlPattern.type) {
|
||||
case 'string': {
|
||||
patternUrl = unescapeURLPattern(urlPattern.pattern);
|
||||
break;
|
||||
}
|
||||
case 'pattern': {
|
||||
if (urlPattern.protocol === undefined) {
|
||||
hasProtocol = false;
|
||||
patternUrl += 'http';
|
||||
}
|
||||
else {
|
||||
if (urlPattern.protocol === '') {
|
||||
throw new protocol_js_1.InvalidArgumentException('URL pattern must specify a protocol');
|
||||
}
|
||||
urlPattern.protocol = unescapeURLPattern(urlPattern.protocol);
|
||||
if (!urlPattern.protocol.match(/^[a-zA-Z+-.]+$/)) {
|
||||
throw new protocol_js_1.InvalidArgumentException('Forbidden characters');
|
||||
}
|
||||
patternUrl += urlPattern.protocol;
|
||||
}
|
||||
const scheme = patternUrl.toLocaleLowerCase();
|
||||
patternUrl += ':';
|
||||
if ((0, NetworkUtils_js_1.isSpecialScheme)(scheme)) {
|
||||
patternUrl += '//';
|
||||
}
|
||||
if (urlPattern.hostname === undefined) {
|
||||
if (scheme !== 'file') {
|
||||
patternUrl += 'placeholder';
|
||||
}
|
||||
hasHostname = false;
|
||||
}
|
||||
else {
|
||||
if (urlPattern.hostname === '') {
|
||||
throw new protocol_js_1.InvalidArgumentException('URL pattern must specify a hostname');
|
||||
}
|
||||
if (urlPattern.protocol === 'file') {
|
||||
throw new protocol_js_1.InvalidArgumentException(`URL pattern protocol cannot be 'file'`);
|
||||
}
|
||||
urlPattern.hostname = unescapeURLPattern(urlPattern.hostname);
|
||||
let insideBrackets = false;
|
||||
for (const c of urlPattern.hostname) {
|
||||
if (c === '/' || c === '?' || c === '#') {
|
||||
throw new protocol_js_1.InvalidArgumentException(`'/', '?', '#' are forbidden in hostname`);
|
||||
}
|
||||
if (!insideBrackets && c === ':') {
|
||||
throw new protocol_js_1.InvalidArgumentException(`':' is only allowed inside brackets in hostname`);
|
||||
}
|
||||
if (c === '[') {
|
||||
insideBrackets = true;
|
||||
}
|
||||
if (c === ']') {
|
||||
insideBrackets = false;
|
||||
}
|
||||
}
|
||||
patternUrl += urlPattern.hostname;
|
||||
}
|
||||
if (urlPattern.port === undefined) {
|
||||
hasPort = false;
|
||||
}
|
||||
else {
|
||||
if (urlPattern.port === '') {
|
||||
throw new protocol_js_1.InvalidArgumentException(`URL pattern must specify a port`);
|
||||
}
|
||||
urlPattern.port = unescapeURLPattern(urlPattern.port);
|
||||
patternUrl += ':';
|
||||
if (!urlPattern.port.match(/^\d+$/)) {
|
||||
throw new protocol_js_1.InvalidArgumentException('Forbidden characters');
|
||||
}
|
||||
patternUrl += urlPattern.port;
|
||||
}
|
||||
if (urlPattern.pathname === undefined) {
|
||||
hasPathname = false;
|
||||
}
|
||||
else {
|
||||
urlPattern.pathname = unescapeURLPattern(urlPattern.pathname);
|
||||
if (urlPattern.pathname[0] !== '/') {
|
||||
patternUrl += '/';
|
||||
}
|
||||
if (urlPattern.pathname.includes('#') ||
|
||||
urlPattern.pathname.includes('?')) {
|
||||
throw new protocol_js_1.InvalidArgumentException('Forbidden characters');
|
||||
}
|
||||
patternUrl += urlPattern.pathname;
|
||||
}
|
||||
if (urlPattern.search === undefined) {
|
||||
hasSearch = false;
|
||||
}
|
||||
else {
|
||||
urlPattern.search = unescapeURLPattern(urlPattern.search);
|
||||
if (urlPattern.search[0] !== '?') {
|
||||
patternUrl += '?';
|
||||
}
|
||||
if (urlPattern.search.includes('#')) {
|
||||
throw new protocol_js_1.InvalidArgumentException('Forbidden characters');
|
||||
}
|
||||
patternUrl += urlPattern.search;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
const serializePort = (url) => {
|
||||
const defaultPorts = {
|
||||
'ftp:': 21,
|
||||
'file:': null,
|
||||
'http:': 80,
|
||||
'https:': 443,
|
||||
'ws:': 80,
|
||||
'wss:': 443,
|
||||
};
|
||||
if ((0, NetworkUtils_js_1.isSpecialScheme)(url.protocol) &&
|
||||
defaultPorts[url.protocol] !== null &&
|
||||
(!url.port || String(defaultPorts[url.protocol]) === url.port)) {
|
||||
return '';
|
||||
}
|
||||
else if (url.port) {
|
||||
return url.port;
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
try {
|
||||
const url = new URL(patternUrl);
|
||||
return {
|
||||
protocol: hasProtocol ? url.protocol.replace(/:$/, '') : undefined,
|
||||
hostname: hasHostname ? url.hostname : undefined,
|
||||
port: hasPort ? serializePort(url) : undefined,
|
||||
pathname: hasPathname && url.pathname ? url.pathname : undefined,
|
||||
search: hasSearch ? url.search : undefined,
|
||||
};
|
||||
}
|
||||
catch (err) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`${err.message} '${patternUrl}'`);
|
||||
}
|
||||
});
|
||||
}
|
||||
static wrapInterceptionError(error) {
|
||||
// https://source.chromium.org/chromium/chromium/src/+/main:content/browser/devtools/protocol/fetch_handler.cc;l=169
|
||||
if (error?.message.includes('Invalid header') ||
|
||||
error?.message.includes('Unsafe header')) {
|
||||
return new protocol_js_1.InvalidArgumentException(error.message);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
async addDataCollector(params) {
|
||||
if (params.userContexts !== undefined && params.contexts !== undefined) {
|
||||
throw new protocol_js_1.InvalidArgumentException("'contexts' and 'userContexts' are mutually exclusive");
|
||||
}
|
||||
if (params.userContexts !== undefined) {
|
||||
// Assert the user contexts exist.
|
||||
await this.#userContextStorage.verifyUserContextIdList(params.userContexts);
|
||||
}
|
||||
if (params.contexts !== undefined) {
|
||||
for (const browsingContextId of params.contexts) {
|
||||
// Assert the browsing context exists and are top-level.
|
||||
const browsingContext = this.#browsingContextStorage.getContext(browsingContextId);
|
||||
if (!browsingContext.isTopLevelContext()) {
|
||||
throw new protocol_js_1.InvalidArgumentException(`Data collectors are available only on top-level browsing contexts`);
|
||||
}
|
||||
}
|
||||
}
|
||||
const collectorId = this.#networkStorage.addDataCollector(params);
|
||||
// Adding data collectors may require enabling CDP Network domains.
|
||||
await this.#toggleNetwork();
|
||||
return { collector: collectorId };
|
||||
}
|
||||
async getData(params) {
|
||||
return await this.#networkStorage.getCollectedData(params);
|
||||
}
|
||||
async removeDataCollector(params) {
|
||||
this.#networkStorage.removeDataCollector(params);
|
||||
// Removing data collectors may allow disabling CDP Network domains.
|
||||
await this.#toggleNetwork();
|
||||
return {};
|
||||
}
|
||||
disownData(params) {
|
||||
this.#networkStorage.disownData(params);
|
||||
return {};
|
||||
}
|
||||
async setExtraHeaders(params) {
|
||||
if (params.userContexts !== undefined && params.contexts !== undefined) {
|
||||
throw new protocol_js_1.InvalidArgumentException('contexts and userContexts are mutually exclusive');
|
||||
}
|
||||
const cdpExtraHeaders = parseBiDiHeaders(params.headers);
|
||||
const affectedCdpTargets = new Set();
|
||||
if (params.userContexts === undefined && params.contexts === undefined) {
|
||||
this.#contextConfigStorage.updateGlobalConfig({
|
||||
extraHeaders: cdpExtraHeaders,
|
||||
});
|
||||
this.#browsingContextStorage
|
||||
.getAllContexts()
|
||||
.forEach((c) => affectedCdpTargets.add(c.cdpTarget));
|
||||
}
|
||||
if (params.userContexts !== undefined) {
|
||||
// Assert the user contexts exist.
|
||||
await this.#userContextStorage.verifyUserContextIdList(params.userContexts);
|
||||
params.userContexts.forEach((userContext) => {
|
||||
this.#contextConfigStorage.updateUserContextConfig(userContext, {
|
||||
extraHeaders: cdpExtraHeaders,
|
||||
});
|
||||
this.#browsingContextStorage
|
||||
.getAllContexts()
|
||||
.filter((c) => c.userContext === userContext)
|
||||
.forEach((c) => affectedCdpTargets.add(c.cdpTarget));
|
||||
});
|
||||
}
|
||||
if (params.contexts !== undefined) {
|
||||
this.#browsingContextStorage.verifyTopLevelContextsList(params.contexts);
|
||||
params.contexts.forEach((browsingContextId) => {
|
||||
this.#contextConfigStorage.updateBrowsingContextConfig(browsingContextId, { extraHeaders: cdpExtraHeaders });
|
||||
affectedCdpTargets.add(this.#browsingContextStorage.getContext(browsingContextId).cdpTarget);
|
||||
this.#browsingContextStorage
|
||||
.getContext(browsingContextId)
|
||||
.allChildren.forEach((c) => affectedCdpTargets.add(c.cdpTarget));
|
||||
});
|
||||
}
|
||||
await Promise.all(Array.from(affectedCdpTargets).map((cdpTarget) => cdpTarget.setExtraHeaders(cdpExtraHeaders)));
|
||||
return {};
|
||||
}
|
||||
}
|
||||
exports.NetworkProcessor = NetworkProcessor;
|
||||
/**
|
||||
* See https://w3c.github.io/webdriver-bidi/#unescape-url-pattern
|
||||
*/
|
||||
function unescapeURLPattern(pattern) {
|
||||
const forbidden = new Set(['(', ')', '*', '{', '}']);
|
||||
let result = '';
|
||||
let isEscaped = false;
|
||||
for (const c of pattern) {
|
||||
if (!isEscaped) {
|
||||
if (forbidden.has(c)) {
|
||||
throw new protocol_js_1.InvalidArgumentException('Forbidden characters');
|
||||
}
|
||||
if (c === '\\') {
|
||||
isEscaped = true;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
result += c;
|
||||
isEscaped = false;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
// Export for testing.
|
||||
function parseBiDiHeaders(headers) {
|
||||
const parsedHeaders = {};
|
||||
for (const bidiHeader of headers) {
|
||||
if (bidiHeader.value.type === 'string') {
|
||||
if (parsedHeaders[bidiHeader.name] === undefined) {
|
||||
parsedHeaders[bidiHeader.name] = bidiHeader.value.value;
|
||||
}
|
||||
else {
|
||||
// Combine headers with the same name, meaning concatenate them with 0x2C 0x20
|
||||
// separator: https://fetch.spec.whatwg.org/#concept-header-list-combine.
|
||||
parsedHeaders[bidiHeader.name] =
|
||||
`${parsedHeaders[bidiHeader.name]}, ${bidiHeader.value.value}`;
|
||||
}
|
||||
}
|
||||
else {
|
||||
throw new protocol_js_1.UnsupportedOperationException('Only string headers values are supported');
|
||||
}
|
||||
}
|
||||
return parsedHeaders;
|
||||
}
|
||||
//# sourceMappingURL=NetworkProcessor.js.map
|
||||
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/network/NetworkProcessor.js.map
generated
vendored
Normal file
1
node_modules/chromium-bidi/lib/cjs/bidiMapper/modules/network/NetworkProcessor.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user