summaryrefslogtreecommitdiffstats
path: root/remote/test/puppeteer/test/assets
diff options
context:
space:
mode:
Diffstat (limited to 'remote/test/puppeteer/test/assets')
-rw-r--r--remote/test/puppeteer/test/assets/abort-request.html13
-rw-r--r--remote/test/puppeteer/test/assets/beforeunload.html10
-rw-r--r--remote/test/puppeteer/test/assets/cached/bfcache/index.html2
-rw-r--r--remote/test/puppeteer/test/assets/cached/bfcache/target.html2
-rw-r--r--remote/test/puppeteer/test/assets/cached/bfcache/worker-iframe-container.html11
-rw-r--r--remote/test/puppeteer/test/assets/cached/bfcache/worker-iframe.html3
-rw-r--r--remote/test/puppeteer/test/assets/cached/bfcache/worker.mjs1
-rw-r--r--remote/test/puppeteer/test/assets/cached/one-style-font.css9
-rw-r--r--remote/test/puppeteer/test/assets/cached/one-style-font.html2
-rw-r--r--remote/test/puppeteer/test/assets/cached/one-style.css3
-rw-r--r--remote/test/puppeteer/test/assets/cached/one-style.html2
-rw-r--r--remote/test/puppeteer/test/assets/consolelog.html17
-rw-r--r--remote/test/puppeteer/test/assets/credit-card.html42
-rw-r--r--remote/test/puppeteer/test/assets/csp.html1
-rw-r--r--remote/test/puppeteer/test/assets/csscoverage/Dosis-Regular.ttfbin0 -> 136940 bytes
-rw-r--r--remote/test/puppeteer/test/assets/csscoverage/OFL.txt95
-rw-r--r--remote/test/puppeteer/test/assets/csscoverage/empty.html3
-rw-r--r--remote/test/puppeteer/test/assets/csscoverage/involved.html26
-rw-r--r--remote/test/puppeteer/test/assets/csscoverage/media.html4
-rw-r--r--remote/test/puppeteer/test/assets/csscoverage/multiple.html8
-rw-r--r--remote/test/puppeteer/test/assets/csscoverage/simple.html6
-rw-r--r--remote/test/puppeteer/test/assets/csscoverage/sourceurl.html7
-rw-r--r--remote/test/puppeteer/test/assets/csscoverage/stylesheet1.css3
-rw-r--r--remote/test/puppeteer/test/assets/csscoverage/stylesheet2.css4
-rw-r--r--remote/test/puppeteer/test/assets/csscoverage/unused.html7
-rw-r--r--remote/test/puppeteer/test/assets/detect-touch.html12
-rw-r--r--remote/test/puppeteer/test/assets/digits/0.pngbin0 -> 434 bytes
-rw-r--r--remote/test/puppeteer/test/assets/digits/1.pngbin0 -> 346 bytes
-rw-r--r--remote/test/puppeteer/test/assets/digits/2.pngbin0 -> 413 bytes
-rw-r--r--remote/test/puppeteer/test/assets/digits/3.pngbin0 -> 434 bytes
-rw-r--r--remote/test/puppeteer/test/assets/digits/4.pngbin0 -> 403 bytes
-rw-r--r--remote/test/puppeteer/test/assets/digits/5.pngbin0 -> 422 bytes
-rw-r--r--remote/test/puppeteer/test/assets/digits/6.pngbin0 -> 445 bytes
-rw-r--r--remote/test/puppeteer/test/assets/digits/7.pngbin0 -> 387 bytes
-rw-r--r--remote/test/puppeteer/test/assets/digits/8.pngbin0 -> 447 bytes
-rw-r--r--remote/test/puppeteer/test/assets/digits/9.pngbin0 -> 437 bytes
-rw-r--r--remote/test/puppeteer/test/assets/dynamic-oopif.html10
-rw-r--r--remote/test/puppeteer/test/assets/empty.html0
-rw-r--r--remote/test/puppeteer/test/assets/error.html15
-rw-r--r--remote/test/puppeteer/test/assets/es6/.eslintrc5
-rw-r--r--remote/test/puppeteer/test/assets/es6/es6import.js2
-rw-r--r--remote/test/puppeteer/test/assets/es6/es6module.js1
-rw-r--r--remote/test/puppeteer/test/assets/es6/es6pathimport.js2
-rw-r--r--remote/test/puppeteer/test/assets/favicon.icobin0 -> 70 bytes
-rw-r--r--remote/test/puppeteer/test/assets/file-to-upload.txt1
-rw-r--r--remote/test/puppeteer/test/assets/frames/frame.html8
-rw-r--r--remote/test/puppeteer/test/assets/frames/frameset.html8
-rw-r--r--remote/test/puppeteer/test/assets/frames/lazy-frame.html3
-rw-r--r--remote/test/puppeteer/test/assets/frames/nested-frames.html26
-rw-r--r--remote/test/puppeteer/test/assets/frames/one-frame-url-fragment.html1
-rw-r--r--remote/test/puppeteer/test/assets/frames/one-frame.html1
-rw-r--r--remote/test/puppeteer/test/assets/frames/script.js1
-rw-r--r--remote/test/puppeteer/test/assets/frames/style.css3
-rw-r--r--remote/test/puppeteer/test/assets/frames/two-frames.html13
-rw-r--r--remote/test/puppeteer/test/assets/global-var.html3
-rw-r--r--remote/test/puppeteer/test/assets/grid.html51
-rw-r--r--remote/test/puppeteer/test/assets/historyapi.html5
-rw-r--r--remote/test/puppeteer/test/assets/idle-detector.html23
-rw-r--r--remote/test/puppeteer/test/assets/initiator.html2
-rw-r--r--remote/test/puppeteer/test/assets/initiator.js8
-rw-r--r--remote/test/puppeteer/test/assets/injectedfile.js2
-rw-r--r--remote/test/puppeteer/test/assets/injectedstyle.css3
-rw-r--r--remote/test/puppeteer/test/assets/inline-svg.html14
-rw-r--r--remote/test/puppeteer/test/assets/inner-frame1.html10
-rw-r--r--remote/test/puppeteer/test/assets/inner-frame2.html1
-rw-r--r--remote/test/puppeteer/test/assets/input/button.html16
-rw-r--r--remote/test/puppeteer/test/assets/input/checkbox.html42
-rw-r--r--remote/test/puppeteer/test/assets/input/drag-and-drop.html43
-rw-r--r--remote/test/puppeteer/test/assets/input/fileupload.html9
-rw-r--r--remote/test/puppeteer/test/assets/input/keyboard.html42
-rw-r--r--remote/test/puppeteer/test/assets/input/mouse-helper.js74
-rw-r--r--remote/test/puppeteer/test/assets/input/rotatedButton.html21
-rw-r--r--remote/test/puppeteer/test/assets/input/scrollable.html37
-rw-r--r--remote/test/puppeteer/test/assets/input/select.html70
-rw-r--r--remote/test/puppeteer/test/assets/input/textarea.html15
-rw-r--r--remote/test/puppeteer/test/assets/input/touchscreen.html122
-rw-r--r--remote/test/puppeteer/test/assets/input/wheel.html43
-rw-r--r--remote/test/puppeteer/test/assets/jscoverage/eval.html1
-rw-r--r--remote/test/puppeteer/test/assets/jscoverage/involved.html16
-rw-r--r--remote/test/puppeteer/test/assets/jscoverage/multiple.html2
-rw-r--r--remote/test/puppeteer/test/assets/jscoverage/ranges.html2
-rw-r--r--remote/test/puppeteer/test/assets/jscoverage/script1.js1
-rw-r--r--remote/test/puppeteer/test/assets/jscoverage/script2.js1
-rw-r--r--remote/test/puppeteer/test/assets/jscoverage/simple.html2
-rw-r--r--remote/test/puppeteer/test/assets/jscoverage/sourceurl.html4
-rw-r--r--remote/test/puppeteer/test/assets/jscoverage/unused.html1
-rw-r--r--remote/test/puppeteer/test/assets/lazy-oopif-frame.html3
-rw-r--r--remote/test/puppeteer/test/assets/main-frame.html10
-rw-r--r--remote/test/puppeteer/test/assets/mobile.html1
-rw-r--r--remote/test/puppeteer/test/assets/modernizr.js3
-rw-r--r--remote/test/puppeteer/test/assets/networkidle.html19
-rw-r--r--remote/test/puppeteer/test/assets/offscreenbuttons.html40
-rw-r--r--remote/test/puppeteer/test/assets/one-style.css3
-rw-r--r--remote/test/puppeteer/test/assets/one-style.html2
-rw-r--r--remote/test/puppeteer/test/assets/oopif.html5
-rw-r--r--remote/test/puppeteer/test/assets/p-selectors.html15
-rw-r--r--remote/test/puppeteer/test/assets/pdf.html11
-rw-r--r--remote/test/puppeteer/test/assets/picture.html6
-rw-r--r--remote/test/puppeteer/test/assets/playground.html15
-rw-r--r--remote/test/puppeteer/test/assets/popup/popup.html9
-rw-r--r--remote/test/puppeteer/test/assets/popup/window-open.html11
-rw-r--r--remote/test/puppeteer/test/assets/pptr.pngbin0 -> 6138 bytes
-rw-r--r--remote/test/puppeteer/test/assets/prerender/index.html21
-rw-r--r--remote/test/puppeteer/test/assets/prerender/target.html5
-rw-r--r--remote/test/puppeteer/test/assets/resetcss.html50
-rw-r--r--remote/test/puppeteer/test/assets/resolution.html23
-rw-r--r--remote/test/puppeteer/test/assets/self-request.html5
-rw-r--r--remote/test/puppeteer/test/assets/serviceworkers/empty/sw.html3
-rw-r--r--remote/test/puppeteer/test/assets/serviceworkers/empty/sw.js0
-rw-r--r--remote/test/puppeteer/test/assets/serviceworkers/extension/background.js1
-rw-r--r--remote/test/puppeteer/test/assets/serviceworkers/extension/manifest.json9
-rw-r--r--remote/test/puppeteer/test/assets/serviceworkers/fetch/style.css3
-rw-r--r--remote/test/puppeteer/test/assets/serviceworkers/fetch/sw.html5
-rw-r--r--remote/test/puppeteer/test/assets/serviceworkers/fetch/sw.js7
-rw-r--r--remote/test/puppeteer/test/assets/shadow.html17
-rw-r--r--remote/test/puppeteer/test/assets/simple-extension/content-script.js2
-rw-r--r--remote/test/puppeteer/test/assets/simple-extension/index.js2
-rw-r--r--remote/test/puppeteer/test/assets/simple-extension/manifest.json14
-rw-r--r--remote/test/puppeteer/test/assets/simple.json1
-rw-r--r--remote/test/puppeteer/test/assets/tamperable.html3
-rw-r--r--remote/test/puppeteer/test/assets/title.html1
-rw-r--r--remote/test/puppeteer/test/assets/worker/worker.html14
-rw-r--r--remote/test/puppeteer/test/assets/worker/worker.js16
-rw-r--r--remote/test/puppeteer/test/assets/wrappedlink.html32
124 files changed, 1466 insertions, 0 deletions
diff --git a/remote/test/puppeteer/test/assets/abort-request.html b/remote/test/puppeteer/test/assets/abort-request.html
new file mode 100644
index 0000000000..77c056a422
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/abort-request.html
@@ -0,0 +1,13 @@
+<button id="abort"></button>
+
+<script>
+ const button = document.getElementById('abort');
+ button.addEventListener('click', getJson)
+ async function getJson() {
+ const abort = new AbortController();
+ const result = fetch("/simple.json", {
+ signal: abort.signal
+ });
+ abort.abort();
+ }
+</script> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/beforeunload.html b/remote/test/puppeteer/test/assets/beforeunload.html
new file mode 100644
index 0000000000..3cef6763f3
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/beforeunload.html
@@ -0,0 +1,10 @@
+<div>beforeunload demo.</div>
+<script>
+window.addEventListener('beforeunload', event => {
+ // Chrome way.
+ event.returnValue = 'Leave?';
+ // Firefox way.
+ event.preventDefault();
+});
+</script>
+
diff --git a/remote/test/puppeteer/test/assets/cached/bfcache/index.html b/remote/test/puppeteer/test/assets/cached/bfcache/index.html
new file mode 100644
index 0000000000..3d79312828
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/cached/bfcache/index.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<body>BFCached<a href="target.html">next</a></body>
diff --git a/remote/test/puppeteer/test/assets/cached/bfcache/target.html b/remote/test/puppeteer/test/assets/cached/bfcache/target.html
new file mode 100644
index 0000000000..eafc537b64
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/cached/bfcache/target.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<body>target</body>
diff --git a/remote/test/puppeteer/test/assets/cached/bfcache/worker-iframe-container.html b/remote/test/puppeteer/test/assets/cached/bfcache/worker-iframe-container.html
new file mode 100644
index 0000000000..857914bb6d
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/cached/bfcache/worker-iframe-container.html
@@ -0,0 +1,11 @@
+<body>BFCached<a href="target.html">next</a></body>
+<script>
+ window.addEventListener('DOMContentLoaded', () => {
+ const iframe = document.createElement('iframe');
+ const url = new URL(location.href);
+ url.hostname = url.hostname === 'localhost' ? '127.0.0.1' : 'localhost';
+ url.pathname = '/cached/bfcache/worker-iframe.html';
+ iframe.src = url.toString();
+ document.body.appendChild(iframe);
+ }, false);
+</script>
diff --git a/remote/test/puppeteer/test/assets/cached/bfcache/worker-iframe.html b/remote/test/puppeteer/test/assets/cached/bfcache/worker-iframe.html
new file mode 100644
index 0000000000..9233f557c5
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/cached/bfcache/worker-iframe.html
@@ -0,0 +1,3 @@
+<script>
+ const worker = new Worker('worker.mjs', {type: 'module'})
+</script>
diff --git a/remote/test/puppeteer/test/assets/cached/bfcache/worker.mjs b/remote/test/puppeteer/test/assets/cached/bfcache/worker.mjs
new file mode 100644
index 0000000000..72a8036e68
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/cached/bfcache/worker.mjs
@@ -0,0 +1 @@
+console.log('HELLO');
diff --git a/remote/test/puppeteer/test/assets/cached/one-style-font.css b/remote/test/puppeteer/test/assets/cached/one-style-font.css
new file mode 100644
index 0000000000..6178de0350
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/cached/one-style-font.css
@@ -0,0 +1,9 @@
+@font-face {
+ font-family: 'one-style';
+ src: url('./one-style.woff') format('woff');
+}
+
+body {
+ background-color: pink;
+ font-family: 'one-style', sans-serif;
+}
diff --git a/remote/test/puppeteer/test/assets/cached/one-style-font.html b/remote/test/puppeteer/test/assets/cached/one-style-font.html
new file mode 100644
index 0000000000..8e7236dfb3
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/cached/one-style-font.html
@@ -0,0 +1,2 @@
+<link rel='stylesheet' href='./one-style-font.css'>
+<div>hello, world!</div>
diff --git a/remote/test/puppeteer/test/assets/cached/one-style.css b/remote/test/puppeteer/test/assets/cached/one-style.css
new file mode 100644
index 0000000000..04e7110b41
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/cached/one-style.css
@@ -0,0 +1,3 @@
+body {
+ background-color: pink;
+}
diff --git a/remote/test/puppeteer/test/assets/cached/one-style.html b/remote/test/puppeteer/test/assets/cached/one-style.html
new file mode 100644
index 0000000000..4760f2b9f7
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/cached/one-style.html
@@ -0,0 +1,2 @@
+<link rel='stylesheet' href='./one-style.css'>
+<div>hello, world!</div>
diff --git a/remote/test/puppeteer/test/assets/consolelog.html b/remote/test/puppeteer/test/assets/consolelog.html
new file mode 100644
index 0000000000..4a27803aa9
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/consolelog.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>console.log test</title>
+ </head>
+ <body>
+ <script>
+ function foo() {
+ console.log('yellow')
+ }
+ function bar() {
+ foo();
+ }
+ bar();
+ </script>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/credit-card.html b/remote/test/puppeteer/test/assets/credit-card.html
new file mode 100644
index 0000000000..101013a0ca
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/credit-card.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+
+<body>
+ <form id="testform" method="post">
+ <table>
+ <tbody>
+ <tr>
+ <td>
+ <label for="name">Name on Card</label>
+ </td>
+ <td>
+ <input size="40" id="name" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <label for="number">Card Number</label>
+ </td>
+ <td>
+ <input size="40" id="number" name="card_number" />
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <label>Expiration Date</label>
+ </td>
+ <td>
+ <input size="2" id="expiration_month" name="ccmonth"> <input size="4" id="expiration_year"
+ name="ccyear" />
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <input type="submit" value="Submit">
+ </form>
+</body>
+</html> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/csp.html b/remote/test/puppeteer/test/assets/csp.html
new file mode 100644
index 0000000000..34fc1fc1a5
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csp.html
@@ -0,0 +1 @@
+<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
diff --git a/remote/test/puppeteer/test/assets/csscoverage/Dosis-Regular.ttf b/remote/test/puppeteer/test/assets/csscoverage/Dosis-Regular.ttf
new file mode 100644
index 0000000000..4b208624e8
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csscoverage/Dosis-Regular.ttf
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/csscoverage/OFL.txt b/remote/test/puppeteer/test/assets/csscoverage/OFL.txt
new file mode 100644
index 0000000000..a9b3c8b34e
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csscoverage/OFL.txt
@@ -0,0 +1,95 @@
+Copyright (c) 2011, Edgar Tolentino and Pablo Impallari (www.impallari.com|impallari@gmail.com),
+Copyright (c) 2011, Igino Marini. (www.ikern.com|mail@iginomarini.com),
+with Reserved Font Names "Dosis".
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/remote/test/puppeteer/test/assets/csscoverage/empty.html b/remote/test/puppeteer/test/assets/csscoverage/empty.html
new file mode 100644
index 0000000000..b3845c366d
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csscoverage/empty.html
@@ -0,0 +1,3 @@
+<style></style>
+<div>empty style tag</div>
+
diff --git a/remote/test/puppeteer/test/assets/csscoverage/involved.html b/remote/test/puppeteer/test/assets/csscoverage/involved.html
new file mode 100644
index 0000000000..bcd9845b93
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csscoverage/involved.html
@@ -0,0 +1,26 @@
+<style>
+@charset "utf-8";
+@namespace svg url(http://www.w3.org/2000/svg);
+@font-face {
+ font-family: "Example Font";
+ src: url("./Dosis-Regular.ttf");
+}
+
+#fluffy {
+ border: 1px solid black;
+ z-index: 1;
+ /* -webkit-disabled-property: rgb(1, 2, 3) */
+ -lol-cats: "dogs" /* non-existing property */
+}
+
+@media (min-width: 1px) {
+ span {
+ -webkit-border-radius: 10px;
+ font-family: "Example Font";
+ animation: 1s identifier;
+ }
+}
+</style>
+<div id="fluffy">woof!</div>
+<span>fancy text</span>
+
diff --git a/remote/test/puppeteer/test/assets/csscoverage/media.html b/remote/test/puppeteer/test/assets/csscoverage/media.html
new file mode 100644
index 0000000000..bfb89f8f75
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csscoverage/media.html
@@ -0,0 +1,4 @@
+<style>
+@media screen { div { color: green; } } </style>
+<div>hello, world</div>
+
diff --git a/remote/test/puppeteer/test/assets/csscoverage/multiple.html b/remote/test/puppeteer/test/assets/csscoverage/multiple.html
new file mode 100644
index 0000000000..0fd97e962a
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csscoverage/multiple.html
@@ -0,0 +1,8 @@
+<link rel="stylesheet" href="stylesheet1.css">
+<link rel="stylesheet" href="stylesheet2.css">
+<script>
+window.addEventListener('DOMContentLoaded', () => {
+ // Force stylesheets to load.
+ console.log(window.getComputedStyle(document.body).color);
+}, false);
+</script>
diff --git a/remote/test/puppeteer/test/assets/csscoverage/simple.html b/remote/test/puppeteer/test/assets/csscoverage/simple.html
new file mode 100644
index 0000000000..3beae21829
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csscoverage/simple.html
@@ -0,0 +1,6 @@
+<style>
+div { color: green; }
+a { color: blue; }
+</style>
+<div>hello, world</div>
+
diff --git a/remote/test/puppeteer/test/assets/csscoverage/sourceurl.html b/remote/test/puppeteer/test/assets/csscoverage/sourceurl.html
new file mode 100644
index 0000000000..df4e9c276c
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csscoverage/sourceurl.html
@@ -0,0 +1,7 @@
+<style>
+body {
+ padding: 10px;
+}
+/*# sourceURL=nicename.css */
+</style>
+
diff --git a/remote/test/puppeteer/test/assets/csscoverage/stylesheet1.css b/remote/test/puppeteer/test/assets/csscoverage/stylesheet1.css
new file mode 100644
index 0000000000..60f1eab971
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csscoverage/stylesheet1.css
@@ -0,0 +1,3 @@
+body {
+ color: red;
+}
diff --git a/remote/test/puppeteer/test/assets/csscoverage/stylesheet2.css b/remote/test/puppeteer/test/assets/csscoverage/stylesheet2.css
new file mode 100644
index 0000000000..a87defb098
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csscoverage/stylesheet2.css
@@ -0,0 +1,4 @@
+html {
+ margin: 0;
+ padding: 0;
+}
diff --git a/remote/test/puppeteer/test/assets/csscoverage/unused.html b/remote/test/puppeteer/test/assets/csscoverage/unused.html
new file mode 100644
index 0000000000..5b8186a3bf
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/csscoverage/unused.html
@@ -0,0 +1,7 @@
+<style>
+@media screen {
+ a { color: green; }
+}
+/*# sourceURL=unused.css */
+</style>
+
diff --git a/remote/test/puppeteer/test/assets/detect-touch.html b/remote/test/puppeteer/test/assets/detect-touch.html
new file mode 100644
index 0000000000..80a4123fbd
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/detect-touch.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Detect Touch Test</title>
+ <script src='modernizr.js'></script>
+ </head>
+ <body style="font-size:30vmin">
+ <script>
+ document.body.textContent = Modernizr.touchevents ? 'YES' : 'NO';
+ </script>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/digits/0.png b/remote/test/puppeteer/test/assets/digits/0.png
new file mode 100644
index 0000000000..ac3c4768ed
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/digits/0.png
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/digits/1.png b/remote/test/puppeteer/test/assets/digits/1.png
new file mode 100644
index 0000000000..6768222729
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/digits/1.png
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/digits/2.png b/remote/test/puppeteer/test/assets/digits/2.png
new file mode 100644
index 0000000000..b1daa4735d
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/digits/2.png
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/digits/3.png b/remote/test/puppeteer/test/assets/digits/3.png
new file mode 100644
index 0000000000..6eca99b21b
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/digits/3.png
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/digits/4.png b/remote/test/puppeteer/test/assets/digits/4.png
new file mode 100644
index 0000000000..a721071e2c
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/digits/4.png
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/digits/5.png b/remote/test/puppeteer/test/assets/digits/5.png
new file mode 100644
index 0000000000..15cb19932a
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/digits/5.png
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/digits/6.png b/remote/test/puppeteer/test/assets/digits/6.png
new file mode 100644
index 0000000000..639f38439d
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/digits/6.png
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/digits/7.png b/remote/test/puppeteer/test/assets/digits/7.png
new file mode 100644
index 0000000000..5c1150b005
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/digits/7.png
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/digits/8.png b/remote/test/puppeteer/test/assets/digits/8.png
new file mode 100644
index 0000000000..abb8b48b0b
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/digits/8.png
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/digits/9.png b/remote/test/puppeteer/test/assets/digits/9.png
new file mode 100644
index 0000000000..6a40a21c6f
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/digits/9.png
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/dynamic-oopif.html b/remote/test/puppeteer/test/assets/dynamic-oopif.html
new file mode 100644
index 0000000000..38614d0289
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/dynamic-oopif.html
@@ -0,0 +1,10 @@
+<script>
+window.addEventListener('DOMContentLoaded', () => {
+ const iframe = document.createElement('iframe');
+ const url = new URL(location.href);
+ url.hostname = url.hostname === 'localhost' ? '127.0.0.1' : 'localhost';
+ url.pathname = '/oopif.html';
+ iframe.src = url.toString();
+ document.body.appendChild(iframe);
+}, false);
+</script>
diff --git a/remote/test/puppeteer/test/assets/empty.html b/remote/test/puppeteer/test/assets/empty.html
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/empty.html
diff --git a/remote/test/puppeteer/test/assets/error.html b/remote/test/puppeteer/test/assets/error.html
new file mode 100644
index 0000000000..130400c006
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/error.html
@@ -0,0 +1,15 @@
+<script>
+a();
+
+function a() {
+ b();
+}
+
+function b() {
+ c();
+}
+
+function c() {
+ throw new Error('Fancy error!');
+}
+</script>
diff --git a/remote/test/puppeteer/test/assets/es6/.eslintrc b/remote/test/puppeteer/test/assets/es6/.eslintrc
new file mode 100644
index 0000000000..1903e176f5
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/es6/.eslintrc
@@ -0,0 +1,5 @@
+{
+ "parserOptions": {
+ "sourceType": "module"
+ }
+} \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/es6/es6import.js b/remote/test/puppeteer/test/assets/es6/es6import.js
new file mode 100644
index 0000000000..9aac2d4d64
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/es6/es6import.js
@@ -0,0 +1,2 @@
+import num from './es6module.js';
+window.__es6injected = num;
diff --git a/remote/test/puppeteer/test/assets/es6/es6module.js b/remote/test/puppeteer/test/assets/es6/es6module.js
new file mode 100644
index 0000000000..7a4e8a723a
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/es6/es6module.js
@@ -0,0 +1 @@
+export default 42;
diff --git a/remote/test/puppeteer/test/assets/es6/es6pathimport.js b/remote/test/puppeteer/test/assets/es6/es6pathimport.js
new file mode 100644
index 0000000000..eb17a9a3d1
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/es6/es6pathimport.js
@@ -0,0 +1,2 @@
+import num from './es6/es6module.js';
+window.__es6injected = num;
diff --git a/remote/test/puppeteer/test/assets/favicon.ico b/remote/test/puppeteer/test/assets/favicon.ico
new file mode 100644
index 0000000000..d4edd50799
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/favicon.ico
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/file-to-upload.txt b/remote/test/puppeteer/test/assets/file-to-upload.txt
new file mode 100644
index 0000000000..b4ad118489
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/file-to-upload.txt
@@ -0,0 +1 @@
+contents of the file \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/frames/frame.html b/remote/test/puppeteer/test/assets/frames/frame.html
new file mode 100644
index 0000000000..8f20d2da9f
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/frames/frame.html
@@ -0,0 +1,8 @@
+<link rel='stylesheet' href='./style.css'>
+<script src='./script.js' type='text/javascript'></script>
+<style>
+div {
+ line-height: 18px;
+}
+</style>
+<div>Hi, I'm frame</div>
diff --git a/remote/test/puppeteer/test/assets/frames/frameset.html b/remote/test/puppeteer/test/assets/frames/frameset.html
new file mode 100644
index 0000000000..4d56f88839
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/frames/frameset.html
@@ -0,0 +1,8 @@
+<frameset>
+ <frameset>
+ <frame src='./frame.html'></frame>
+ <frame src='about:blank'></frame>
+ </frameset>
+ <frame src='/empty.html'></frame>
+ <frame></frame>
+</frameset>
diff --git a/remote/test/puppeteer/test/assets/frames/lazy-frame.html b/remote/test/puppeteer/test/assets/frames/lazy-frame.html
new file mode 100644
index 0000000000..4821cd76cd
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/frames/lazy-frame.html
@@ -0,0 +1,3 @@
+<iframe width="100%" height="300" src="about:blank"></iframe>
+<div style="height: 800vh"></div>
+<iframe width="100%" height="300" src='./frame.html' loading="lazy"></iframe> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/frames/nested-frames.html b/remote/test/puppeteer/test/assets/frames/nested-frames.html
new file mode 100644
index 0000000000..e9c5d83c03
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/frames/nested-frames.html
@@ -0,0 +1,26 @@
+<style>
+:root {
+ scrollbar-width: none;
+}
+
+body {
+ display: flex;
+}
+
+body iframe {
+ flex-grow: 1;
+ flex-shrink: 1;
+}
+</style>
+<script>
+async function attachFrame(frameId, url) {
+ var frame = document.createElement('iframe');
+ frame.src = url;
+ frame.id = frameId;
+ document.body.appendChild(frame);
+ await new Promise(x => frame.onload = x);
+ return 'kazakh';
+}
+</script>
+<iframe src='./two-frames.html' name='2frames'></iframe>
+<iframe src='./frame.html' name='aframe'></iframe>
diff --git a/remote/test/puppeteer/test/assets/frames/one-frame-url-fragment.html b/remote/test/puppeteer/test/assets/frames/one-frame-url-fragment.html
new file mode 100644
index 0000000000..d1462641ff
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/frames/one-frame-url-fragment.html
@@ -0,0 +1 @@
+<iframe src='./frame.html?param=value#fragment'></iframe>
diff --git a/remote/test/puppeteer/test/assets/frames/one-frame.html b/remote/test/puppeteer/test/assets/frames/one-frame.html
new file mode 100644
index 0000000000..e941d795a2
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/frames/one-frame.html
@@ -0,0 +1 @@
+<iframe src='./frame.html'></iframe>
diff --git a/remote/test/puppeteer/test/assets/frames/script.js b/remote/test/puppeteer/test/assets/frames/script.js
new file mode 100644
index 0000000000..be22256d16
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/frames/script.js
@@ -0,0 +1 @@
+console.log('Cheers!');
diff --git a/remote/test/puppeteer/test/assets/frames/style.css b/remote/test/puppeteer/test/assets/frames/style.css
new file mode 100644
index 0000000000..5b5436e874
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/frames/style.css
@@ -0,0 +1,3 @@
+div {
+ color: blue;
+}
diff --git a/remote/test/puppeteer/test/assets/frames/two-frames.html b/remote/test/puppeteer/test/assets/frames/two-frames.html
new file mode 100644
index 0000000000..b2ee853eda
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/frames/two-frames.html
@@ -0,0 +1,13 @@
+<style>
+body {
+ display: flex;
+ flex-direction: column;
+}
+
+body iframe {
+ flex-grow: 1;
+ flex-shrink: 1;
+}
+</style>
+<iframe src='./frame.html' name='uno'></iframe>
+<iframe src='./frame.html' name='dos'></iframe>
diff --git a/remote/test/puppeteer/test/assets/global-var.html b/remote/test/puppeteer/test/assets/global-var.html
new file mode 100644
index 0000000000..b6be975038
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/global-var.html
@@ -0,0 +1,3 @@
+<script>
+var globalVar = 123;
+</script> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/grid.html b/remote/test/puppeteer/test/assets/grid.html
new file mode 100644
index 0000000000..437193573d
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/grid.html
@@ -0,0 +1,51 @@
+<script>
+document.addEventListener('DOMContentLoaded', function() {
+ function generatePalette(amount) {
+ var result = [];
+ var hueStep = 360 / amount;
+ for (var i = 0; i < amount; ++i)
+ result.push('hsl(' + (hueStep * i) + ', 100%, 90%)');
+ return result;
+ }
+
+ var palette = generatePalette(100);
+ for (var i = 0; i < 200; ++i) {
+ var box = document.createElement('div');
+ box.classList.add('box');
+ box.style.setProperty('background-color', palette[i % palette.length]);
+ var x = i;
+ do {
+ var digit = x % 10;
+ x = (x / 10)|0;
+ var img = document.createElement('img');
+ img.src = `./digits/${digit}.png`;
+ box.insertBefore(img, box.firstChild);
+ } while (x);
+ document.body.appendChild(box);
+ }
+});
+</script>
+
+<style>
+
+:root {
+ scrollbar-width: none;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+}
+
+.box {
+ font-family: arial;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ margin: 0;
+ padding: 0;
+ width: 50px;
+ height: 50px;
+ box-sizing: border-box;
+ border: 1px solid darkgray;
+}
diff --git a/remote/test/puppeteer/test/assets/historyapi.html b/remote/test/puppeteer/test/assets/historyapi.html
new file mode 100644
index 0000000000..bacaf9e9a0
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/historyapi.html
@@ -0,0 +1,5 @@
+<script>
+window.addEventListener('DOMContentLoaded', () => {
+ history.pushState({}, '', '#1');
+});
+</script>
diff --git a/remote/test/puppeteer/test/assets/idle-detector.html b/remote/test/puppeteer/test/assets/idle-detector.html
new file mode 100644
index 0000000000..83b496c03d
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/idle-detector.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<div id="state"></div>
+<script>
+ const elState = document.querySelector('#state');
+ function setState(msg) {
+ elState.textContent = msg;
+ }
+ async function main() {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ const idleDetector = new IdleDetector({
+ threshold: 60000,
+ signal,
+ });
+ idleDetector.addEventListener('change', () => {
+ const userState = idleDetector.userState;
+ const screenState = idleDetector.screenState;
+ setState(`Idle state: ${userState}, ${screenState}.`);
+ });
+ idleDetector.start();
+ }
+ main();
+</script>
diff --git a/remote/test/puppeteer/test/assets/initiator.html b/remote/test/puppeteer/test/assets/initiator.html
new file mode 100644
index 0000000000..12889d3242
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/initiator.html
@@ -0,0 +1,2 @@
+<iframe src="./frames/frame.html"></iframe>
+<script src="./initiator.js"></script>
diff --git a/remote/test/puppeteer/test/assets/initiator.js b/remote/test/puppeteer/test/assets/initiator.js
new file mode 100644
index 0000000000..642e775f31
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/initiator.js
@@ -0,0 +1,8 @@
+const script = document.createElement('script');
+script.src = './injectedfile.js';
+document.body.appendChild(script);
+
+const style = document.createElement('link');
+style.rel = 'stylesheet';
+style.href = './injectedstyle.css';
+document.head.appendChild(style);
diff --git a/remote/test/puppeteer/test/assets/injectedfile.js b/remote/test/puppeteer/test/assets/injectedfile.js
new file mode 100644
index 0000000000..c211b62c16
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/injectedfile.js
@@ -0,0 +1,2 @@
+window.__injected = 42;
+window.__injectedError = new Error('hi');
diff --git a/remote/test/puppeteer/test/assets/injectedstyle.css b/remote/test/puppeteer/test/assets/injectedstyle.css
new file mode 100644
index 0000000000..aa1634c255
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/injectedstyle.css
@@ -0,0 +1,3 @@
+body {
+ background-color: red;
+}
diff --git a/remote/test/puppeteer/test/assets/inline-svg.html b/remote/test/puppeteer/test/assets/inline-svg.html
new file mode 100644
index 0000000000..20023ecc79
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/inline-svg.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en">
+ <body>
+ <svg>
+ <circle cx="10" cy="10" r="10" />
+ </svg>
+
+ <div style="margin-top: 5000px;">
+ <svg>
+ <circle cx="10" cy="10" r="10" />
+ </svg>
+ </div>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/inner-frame1.html b/remote/test/puppeteer/test/assets/inner-frame1.html
new file mode 100644
index 0000000000..00f19ec166
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/inner-frame1.html
@@ -0,0 +1,10 @@
+<script>
+ window.addEventListener('DOMContentLoaded', () => {
+ const iframe = document.createElement('iframe');
+ const url = new URL(location.href);
+ url.hostname = 'inner-frame2.test';
+ url.pathname = '/inner-frame2.html';
+ iframe.src = url.toString();
+ document.body.appendChild(iframe);
+ }, false);
+</script>
diff --git a/remote/test/puppeteer/test/assets/inner-frame2.html b/remote/test/puppeteer/test/assets/inner-frame2.html
new file mode 100644
index 0000000000..9a236cc48f
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/inner-frame2.html
@@ -0,0 +1 @@
+<button>click</button>
diff --git a/remote/test/puppeteer/test/assets/input/button.html b/remote/test/puppeteer/test/assets/input/button.html
new file mode 100644
index 0000000000..d4c6e13fd2
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/button.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Button test</title>
+ </head>
+ <body>
+ <script src="mouse-helper.js"></script>
+ <button onclick="clicked();">Click target</button>
+ <script>
+ window.result = 'Was not clicked';
+ function clicked() {
+ result = 'Clicked';
+ }
+ </script>
+ </body>
+</html> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/input/checkbox.html b/remote/test/puppeteer/test/assets/input/checkbox.html
new file mode 100644
index 0000000000..ca56762e2b
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/checkbox.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Selection Test</title>
+ </head>
+ <body>
+ <label for="agree">Remember Me</label>
+ <input id="agree" type="checkbox">
+ <script>
+ window.result = {
+ check: null,
+ events: [],
+ };
+
+ let checkbox = document.querySelector('input');
+
+ const events = [
+ 'change',
+ 'click',
+ 'dblclick',
+ 'input',
+ 'mousedown',
+ 'mouseenter',
+ 'mouseleave',
+ 'mousemove',
+ 'mouseout',
+ 'mouseover',
+ 'mouseup',
+ ];
+
+ for (let event of events) {
+ checkbox.addEventListener(event, () => {
+ if (['change', 'click', 'dblclick', 'input'].includes(event) === true) {
+ result.check = checkbox.checked;
+ }
+
+ result.events.push(event);
+ }, false);
+ }
+ </script>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/input/drag-and-drop.html b/remote/test/puppeteer/test/assets/input/drag-and-drop.html
new file mode 100644
index 0000000000..b77870c4ad
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/drag-and-drop.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Drag-and-drop test</title>
+ <style>
+ #drop {
+ width: 5em;
+ height: 5em;
+ border: 1px solid black;
+ }
+ </style>
+ </head>
+ <body>
+ <div id="drag" draggable="true">drag me</div>
+ <div id="drop"></div>
+ <div id="drag-state">0</div>
+ <script>
+ const drag = document.getElementById('drag');
+ const drop = document.getElementById('drop');
+ drag.addEventListener('dragstart', function(event) {
+ event.dataTransfer.setData('id', event.target.id);
+ document.getElementById('drag-state').textContent += '1';
+ });
+ drop.addEventListener('dragenter', function(event) {
+ event.preventDefault();
+ document.getElementById('drag-state').textContent += '2';
+ });
+ drop.addEventListener('dragover', function(event) {
+ event.preventDefault();
+ document.getElementById('drag-state').textContent += '3';
+ });
+ drop.addEventListener('drop', function(event) {
+ event.preventDefault();
+ const id = event.dataTransfer.getData('id');
+ const el = document.getElementById(id);
+ if (el) {
+ event.target.appendChild(el);
+ document.getElementById('drag-state').textContent += '4';
+ }
+ });
+ </script>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/input/fileupload.html b/remote/test/puppeteer/test/assets/input/fileupload.html
new file mode 100644
index 0000000000..55fd7c5006
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/fileupload.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>File upload test</title>
+ </head>
+ <body>
+ <input type="file">
+ </body>
+</html> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/input/keyboard.html b/remote/test/puppeteer/test/assets/input/keyboard.html
new file mode 100644
index 0000000000..2f4b7d33c2
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/keyboard.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Keyboard test</title>
+ </head>
+ <body>
+ <textarea></textarea>
+ <script>
+ window.result = "";
+ let textarea = document.querySelector('textarea');
+ textarea.focus();
+ textarea.addEventListener('keydown', event => {
+ log('Keydown:', event.key, event.code, modifiers(event));
+ });
+ textarea.addEventListener('input', event => {
+ log('input:', event.data, event.inputType, event.isComposing);
+ });
+ textarea.addEventListener('keyup', event => {
+ log('Keyup:', event.key, event.code, modifiers(event));
+ });
+ function modifiers(event) {
+ let m = [];
+ if (event.altKey)
+ m.push('Alt')
+ if (event.ctrlKey)
+ m.push('Control');
+ if (event.shiftKey)
+ m.push('Shift')
+ return '[' + m.join(' ') + ']';
+ }
+ function log(...args) {
+ console.log.apply(console, args);
+ result += args.join(' ') + '\n';
+ }
+ function getResult() {
+ let temp = result.trim();
+ result = "";
+ return temp;
+ }
+ </script>
+ </body>
+</html> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/input/mouse-helper.js b/remote/test/puppeteer/test/assets/input/mouse-helper.js
new file mode 100644
index 0000000000..97a764aa80
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/mouse-helper.js
@@ -0,0 +1,74 @@
+// This injects a box into the page that moves with the mouse;
+// Useful for debugging
+(function () {
+ const box = document.createElement('div');
+ box.classList.add('mouse-helper');
+ const styleElement = document.createElement('style');
+ styleElement.innerHTML = `
+ .mouse-helper {
+ pointer-events: none;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 20px;
+ height: 20px;
+ background: rgba(0,0,0,.4);
+ border: 1px solid white;
+ border-radius: 10px;
+ margin-left: -10px;
+ margin-top: -10px;
+ transition: background .2s, border-radius .2s, border-color .2s;
+ }
+ .mouse-helper.button-1 {
+ transition: none;
+ background: rgba(0,0,0,0.9);
+ }
+ .mouse-helper.button-2 {
+ transition: none;
+ border-color: rgba(0,0,255,0.9);
+ }
+ .mouse-helper.button-3 {
+ transition: none;
+ border-radius: 4px;
+ }
+ .mouse-helper.button-4 {
+ transition: none;
+ border-color: rgba(255,0,0,0.9);
+ }
+ .mouse-helper.button-5 {
+ transition: none;
+ border-color: rgba(0,255,0,0.9);
+ }
+ `;
+ document.head.appendChild(styleElement);
+ document.body.appendChild(box);
+ document.addEventListener(
+ 'mousemove',
+ (event) => {
+ box.style.left = event.pageX + 'px';
+ box.style.top = event.pageY + 'px';
+ updateButtons(event.buttons);
+ },
+ true
+ );
+ document.addEventListener(
+ 'mousedown',
+ (event) => {
+ updateButtons(event.buttons);
+ box.classList.add('button-' + event.which);
+ },
+ true
+ );
+ document.addEventListener(
+ 'mouseup',
+ (event) => {
+ updateButtons(event.buttons);
+ box.classList.remove('button-' + event.which);
+ },
+ true
+ );
+ function updateButtons(buttons) {
+ for (let i = 0; i < 5; i++)
+ {box.classList.toggle('button-' + i, buttons & (1 << i));}
+ }
+})();
diff --git a/remote/test/puppeteer/test/assets/input/rotatedButton.html b/remote/test/puppeteer/test/assets/input/rotatedButton.html
new file mode 100644
index 0000000000..1bce66cf5e
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/rotatedButton.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Rotated button test</title>
+ </head>
+ <body>
+ <script src="mouse-helper.js"></script>
+ <button onclick="clicked();">Click target</button>
+ <style>
+ button {
+ transform: rotateY(180deg);
+ }
+ </style>
+ <script>
+ window.result = 'Was not clicked';
+ function clicked() {
+ result = 'Clicked';
+ }
+ </script>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/input/scrollable.html b/remote/test/puppeteer/test/assets/input/scrollable.html
new file mode 100644
index 0000000000..75757824a4
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/scrollable.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Scrollable test</title>
+ </head>
+ <body>
+ <script src='mouse-helper.js'></script>
+ <script>
+ for (let i = 0; i < 100; i++) {
+ let button = document.createElement('button');
+ button.textContent = i + ': not clicked';
+ button.id = 'button-' + i;
+ button.onclick = () => button.textContent = 'clicked';
+ button.oncontextmenu = event => {
+ if (![2].includes(event.button)) {
+ return;
+ }
+ event.preventDefault();
+ button.textContent = 'context menu';
+ }
+ button.onmouseup = event => {
+ if (![1,3,4].includes(event.button)) {
+ return;
+ }
+ event.preventDefault();
+ button.textContent = {
+ 3: 'back click',
+ 4: 'forward click',
+ 1: 'aux click',
+ }[event.button];
+ }
+ document.body.appendChild(button);
+ document.body.appendChild(document.createElement('br'));
+ }
+ </script>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/input/select.html b/remote/test/puppeteer/test/assets/input/select.html
new file mode 100644
index 0000000000..026d48e328
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/select.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Selection Test</title>
+ </head>
+ <body>
+ <select>
+ <option value="">Empty</option>
+ <option value="black">Black</option>
+ <option value="blue">Blue</option>
+ <option value="brown">Brown</option>
+ <option value="cyan">Cyan</option>
+ <option value="gray">Gray</option>
+ <option value="green">Green</option>
+ <option value="indigo">Indigo</option>
+ <option value="magenta">Magenta</option>
+ <option value="orange">Orange</option>
+ <option value="pink">Pink</option>
+ <option value="purple">Purple</option>
+ <option value="red">Red</option>
+ <option value="violet">Violet</option>
+ <option value="white">White</option>
+ <option value="yellow">Yellow</option>
+ </select>
+ <script>
+ window.result = {
+ onInput: null,
+ onChange: null,
+ onBubblingChange: null,
+ onBubblingInput: null,
+ };
+
+ let select = document.querySelector('select');
+
+ function makeEmpty() {
+ for (let i = select.options.length - 1; i >= 0; --i) {
+ select.remove(i);
+ }
+ }
+
+ function makeMultiple() {
+ select.setAttribute('multiple', true);
+ }
+
+ select.addEventListener('input', () => {
+ result.onInput = Array.from(select.querySelectorAll('option:checked')).map((option) => {
+ return option.value;
+ });
+ }, false);
+
+ select.addEventListener('change', () => {
+ result.onChange = Array.from(select.querySelectorAll('option:checked')).map((option) => {
+ return option.value;
+ });
+ }, false);
+
+ document.body.addEventListener('input', () => {
+ result.onBubblingInput = Array.from(select.querySelectorAll('option:checked')).map((option) => {
+ return option.value;
+ });
+ }, false);
+
+ document.body.addEventListener('change', () => {
+ result.onBubblingChange = Array.from(select.querySelectorAll('option:checked')).map((option) => {
+ return option.value;
+ });
+ }, false);
+ </script>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/input/textarea.html b/remote/test/puppeteer/test/assets/input/textarea.html
new file mode 100644
index 0000000000..66fdc40304
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/textarea.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Textarea test</title>
+ </head>
+ <body>
+ <textarea rows="5" cols="20"></textarea>
+ <script src='mouse-helper.js'></script>
+ <script>
+ globalThis.result = '';
+ globalThis.textarea = document.querySelector('textarea');
+ textarea.addEventListener('input', () => result = textarea.value, false);
+ </script>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/input/touchscreen.html b/remote/test/puppeteer/test/assets/input/touchscreen.html
new file mode 100644
index 0000000000..76e31c97f9
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/touchscreen.html
@@ -0,0 +1,122 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Touch test</title>
+ </head>
+
+ <body>
+ <style>
+ button {
+ box-sizing: border-box;
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 10px;
+ height: 10px;
+ padding: 0;
+ margin: 0;
+ }
+ </style>
+ <button>Click target</button>
+ <script>
+ var allEvents = [];
+ globalThis.addEventListener(
+ "touchstart",
+ (event) => {
+ allEvents.push({
+ type: "touchstart",
+ touches: [...event.changedTouches].map((touch) => [
+ touch.clientX,
+ touch.clientY,
+ touch.radiusX,
+ touch.radiusY,
+ ]),
+ });
+ },
+ true,
+ );
+ globalThis.addEventListener(
+ "touchmove",
+ (event) => {
+ allEvents.push({
+ type: "touchmove",
+ touches: [...event.changedTouches].map((touch) => [
+ touch.clientX,
+ touch.clientY,
+ touch.radiusX,
+ touch.radiusY,
+ ]),
+ });
+ },
+ true,
+ );
+ globalThis.addEventListener(
+ "touchend",
+ (event) => {
+ allEvents.push({
+ type: "touchend",
+ touches: [...event.changedTouches].map((touch) => [
+ touch.clientX,
+ touch.clientY,
+ touch.radiusX,
+ touch.radiusY,
+ ])
+ });
+ },
+ true,
+ );
+ globalThis.addEventListener(
+ "pointerdown",
+ (event) => {
+ allEvents.push({
+ type: "pointerdown",
+ x: event.x,
+ y: event.y,
+ width: event.width,
+ height: event.height,
+ });
+ },
+ true,
+ );
+ globalThis.addEventListener(
+ "pointermove",
+ (event) => {
+ allEvents.push({
+ type: "pointermove",
+ x: event.x,
+ y: event.y,
+ width: event.width,
+ height: event.height,
+ });
+ },
+ true,
+ );
+ globalThis.addEventListener(
+ "pointerup",
+ (event) => {
+ allEvents.push({
+ type: "pointerup",
+ x: event.x,
+ y: event.y,
+ width: event.width,
+ height: event.height,
+ });
+ },
+ true,
+ );
+ globalThis.addEventListener(
+ "click",
+ (event) => {
+ allEvents.push({
+ type: "click",
+ x: event.x,
+ y: event.y,
+ width: event.width,
+ height: event.height,
+ });
+ },
+ true,
+ );
+ </script>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/input/wheel.html b/remote/test/puppeteer/test/assets/input/wheel.html
new file mode 100644
index 0000000000..3d093a993e
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/input/wheel.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <style>
+ body {
+ min-height: 100vh;
+ margin: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ div {
+ width: 105px;
+ height: 105px;
+ background: #cdf;
+ padding: 5px;
+ }
+ </style>
+ <title>Element: wheel event - Scaling_an_element_via_the_wheel - code sample</title>
+ </head>
+ <body>
+ <div>Scale me with your mouse wheel.</div>
+ <script>
+ function zoom(event) {
+ event.preventDefault();
+
+ scale += event.deltaY * -0.01;
+
+ // Restrict scale
+ scale = Math.min(Math.max(.125, scale), 4);
+
+ // Apply scale transform
+ el.style.transform = `scale(${scale})`;
+ }
+
+ let scale = 1;
+ const el = document.querySelector('div');
+ el.onwheel = zoom;
+ </script>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/jscoverage/eval.html b/remote/test/puppeteer/test/assets/jscoverage/eval.html
new file mode 100644
index 0000000000..838ae28763
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/jscoverage/eval.html
@@ -0,0 +1 @@
+<script>eval('console.log("foo")')</script>
diff --git a/remote/test/puppeteer/test/assets/jscoverage/involved.html b/remote/test/puppeteer/test/assets/jscoverage/involved.html
new file mode 100644
index 0000000000..fcc32ba2ca
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/jscoverage/involved.html
@@ -0,0 +1,16 @@
+<script>
+function foo() {
+ if (1 > 2)
+ console.log(1);
+ if (1 < 2)
+ console.log(2);
+ let x = 1 > 2 ? 'foo' : 'bar';
+ let y = 1 < 2 ? 'foo' : 'bar';
+ let p = {a:1 > 2?function(){console.log('unused');}:function(){console.log('unused');}};
+ let z = () => {};
+ let q = () => {};
+ q();
+}
+
+foo();
+</script>
diff --git a/remote/test/puppeteer/test/assets/jscoverage/multiple.html b/remote/test/puppeteer/test/assets/jscoverage/multiple.html
new file mode 100644
index 0000000000..bdef59885b
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/jscoverage/multiple.html
@@ -0,0 +1,2 @@
+<script src='script1.js'></script>
+<script src='script2.js'></script>
diff --git a/remote/test/puppeteer/test/assets/jscoverage/ranges.html b/remote/test/puppeteer/test/assets/jscoverage/ranges.html
new file mode 100644
index 0000000000..3d02670aea
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/jscoverage/ranges.html
@@ -0,0 +1,2 @@
+<script>
+function unused(){}console.log('used!');if(true===false)console.log('unused!');</script>
diff --git a/remote/test/puppeteer/test/assets/jscoverage/script1.js b/remote/test/puppeteer/test/assets/jscoverage/script1.js
new file mode 100644
index 0000000000..3bd241b50e
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/jscoverage/script1.js
@@ -0,0 +1 @@
+console.log(3);
diff --git a/remote/test/puppeteer/test/assets/jscoverage/script2.js b/remote/test/puppeteer/test/assets/jscoverage/script2.js
new file mode 100644
index 0000000000..3bd241b50e
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/jscoverage/script2.js
@@ -0,0 +1 @@
+console.log(3);
diff --git a/remote/test/puppeteer/test/assets/jscoverage/simple.html b/remote/test/puppeteer/test/assets/jscoverage/simple.html
new file mode 100644
index 0000000000..49eeeea6ae
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/jscoverage/simple.html
@@ -0,0 +1,2 @@
+<script>
+function foo() {function bar() { } console.log(1); } foo(); </script>
diff --git a/remote/test/puppeteer/test/assets/jscoverage/sourceurl.html b/remote/test/puppeteer/test/assets/jscoverage/sourceurl.html
new file mode 100644
index 0000000000..e477750320
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/jscoverage/sourceurl.html
@@ -0,0 +1,4 @@
+<script>
+console.log(1);
+//# sourceURL=nicename.js
+</script>
diff --git a/remote/test/puppeteer/test/assets/jscoverage/unused.html b/remote/test/puppeteer/test/assets/jscoverage/unused.html
new file mode 100644
index 0000000000..59c4a5a70b
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/jscoverage/unused.html
@@ -0,0 +1 @@
+<script>function foo() { }</script>
diff --git a/remote/test/puppeteer/test/assets/lazy-oopif-frame.html b/remote/test/puppeteer/test/assets/lazy-oopif-frame.html
new file mode 100644
index 0000000000..83a420d029
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/lazy-oopif-frame.html
@@ -0,0 +1,3 @@
+<iframe width="100%" height="300" src="about:blank"></iframe>
+<div style="height: 800vh"></div>
+<iframe width="100%" height="300" src="https://www.example.com" loading="lazy"></iframe>
diff --git a/remote/test/puppeteer/test/assets/main-frame.html b/remote/test/puppeteer/test/assets/main-frame.html
new file mode 100644
index 0000000000..0c50feff85
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/main-frame.html
@@ -0,0 +1,10 @@
+<script>
+ window.addEventListener('DOMContentLoaded', () => {
+ const iframe = document.createElement('iframe');
+ const url = new URL(location.href);
+ url.hostname = 'inner-frame1.test';
+ url.pathname = '/inner-frame1.html';
+ iframe.src = url.toString();
+ document.body.appendChild(iframe);
+ }, false);
+</script>
diff --git a/remote/test/puppeteer/test/assets/mobile.html b/remote/test/puppeteer/test/assets/mobile.html
new file mode 100644
index 0000000000..8e94b2fe29
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/mobile.html
@@ -0,0 +1 @@
+<meta name = "viewport" content = "initial-scale = 1, user-scalable = no">
diff --git a/remote/test/puppeteer/test/assets/modernizr.js b/remote/test/puppeteer/test/assets/modernizr.js
new file mode 100644
index 0000000000..7991a4ec40
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/modernizr.js
@@ -0,0 +1,3 @@
+/*! modernizr 3.5.0 (Custom Build) | MIT *
+* https://modernizr.com/download/?-touchevents-setclasses !*/
+!function(e,n,t){function o(e,n){return typeof e===n}function s(){var e,n,t,s,a,i,r;for(var l in c)if(c.hasOwnProperty(l)){if(e=[],n=c[l],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(t=0;t<n.options.aliases.length;t++)e.push(n.options.aliases[t].toLowerCase());for(s=o(n.fn,"function")?n.fn():n.fn,a=0;a<e.length;a++)i=e[a],r=i.split("."),1===r.length?Modernizr[r[0]]=s:(!Modernizr[r[0]]||Modernizr[r[0]]instanceof Boolean||(Modernizr[r[0]]=new Boolean(Modernizr[r[0]])),Modernizr[r[0]][r[1]]=s),f.push((s?"":"no-")+r.join("-"))}}function a(e){var n=u.className,t=Modernizr._config.classPrefix||"";if(p&&(n=n.baseVal),Modernizr._config.enableJSClass){var o=new RegExp("(^|\\s)"+t+"no-js(\\s|$)");n=n.replace(o,"$1"+t+"js$2")}Modernizr._config.enableClasses&&(n+=" "+t+e.join(" "+t),p?u.className.baseVal=n:u.className=n)}function i(){return"function"!=typeof n.createElement?n.createElement(arguments[0]):p?n.createElementNS.call(n,"http://www.w3.org/2000/svg",arguments[0]):n.createElement.apply(n,arguments)}function r(){var e=n.body;return e||(e=i(p?"svg":"body"),e.fake=!0),e}function l(e,t,o,s){var a,l,f,c,d="modernizr",p=i("div"),h=r();if(parseInt(o,10))for(;o--;)f=i("div"),f.id=s?s[o]:d+(o+1),p.appendChild(f);return a=i("style"),a.type="text/css",a.id="s"+d,(h.fake?h:p).appendChild(a),h.appendChild(p),a.styleSheet?a.styleSheet.cssText=e:a.appendChild(n.createTextNode(e)),p.id=d,h.fake&&(h.style.background="",h.style.overflow="hidden",c=u.style.overflow,u.style.overflow="hidden",u.appendChild(h)),l=t(p,e),h.fake?(h.parentNode.removeChild(h),u.style.overflow=c,u.offsetHeight):p.parentNode.removeChild(p),!!l}var f=[],c=[],d={_version:"3.5.0",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,n){var t=this;setTimeout(function(){n(t[e])},0)},addTest:function(e,n,t){c.push({name:e,fn:n,options:t})},addAsyncTest:function(e){c.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=d,Modernizr=new Modernizr;var u=n.documentElement,p="svg"===u.nodeName.toLowerCase(),h=d._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];d._prefixes=h;var m=d.testStyles=l;Modernizr.addTest("touchevents",function(){var t;if("ontouchstart"in e||e.DocumentTouch&&n instanceof DocumentTouch)t=!0;else{var o=["@media (",h.join("touch-enabled),("),"heartz",")","{#modernizr{top:9px;position:absolute}}"].join("");m(o,function(e){t=9===e.offsetTop})}return t}),s(),a(f),delete d.addTest,delete d.addAsyncTest;for(var v=0;v<Modernizr._q.length;v++)Modernizr._q[v]();e.Modernizr=Modernizr}(window,document);
diff --git a/remote/test/puppeteer/test/assets/networkidle.html b/remote/test/puppeteer/test/assets/networkidle.html
new file mode 100644
index 0000000000..910ae1736d
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/networkidle.html
@@ -0,0 +1,19 @@
+<script>
+ async function sleep(delay) {
+ return new Promise(resolve => setTimeout(resolve, delay));
+ }
+
+ async function main() {
+ const roundOne = Promise.all([
+ fetch('fetch-request-a.js'),
+ fetch('fetch-request-b.js'),
+ fetch('fetch-request-c.js'),
+ ]);
+
+ await roundOne;
+ await sleep(50);
+ await fetch('fetch-request-d.js');
+ }
+
+ main();
+</script>
diff --git a/remote/test/puppeteer/test/assets/offscreenbuttons.html b/remote/test/puppeteer/test/assets/offscreenbuttons.html
new file mode 100644
index 0000000000..e487caf4d3
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/offscreenbuttons.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<style>
+ button {
+ position: absolute;
+ width: 100px;
+ height: 20px;
+ }
+
+ #btn0 { right: 0px; top: 0; }
+ #btn1 { right: -10px; top: 25px; }
+ #btn2 { right: -20px; top: 50px; }
+ #btn3 { right: -30px; top: 75px; }
+ #btn4 { right: -40px; top: 100px; }
+ #btn5 { right: -50px; top: 125px; }
+ #btn6 { right: -60px; top: 150px; }
+ #btn7 { right: -70px; top: 175px; }
+ #btn8 { right: -80px; top: 200px; }
+ #btn9 { right: -90px; top: 225px; }
+ #btn10 { right: -100px; top: 250px; }
+ #btn11 { right: -99.999px; top: 275px; }
+</style>
+<button id=btn0>0</button>
+<button id=btn1>1</button>
+<button id=btn2>2</button>
+<button id=btn3>3</button>
+<button id=btn4>4</button>
+<button id=btn5>5</button>
+<button id=btn6>6</button>
+<button id=btn7>7</button>
+<button id=btn8>8</button>
+<button id=btn9>9</button>
+<button id=btn10>10</button>
+<button id=btn11>11</button>
+<script>
+ for (const button of document.querySelectorAll('button')) {
+ button.addEventListener('click', () => {
+ console.log(`button #${button.textContent} clicked`);
+ });
+ }
+</script>
diff --git a/remote/test/puppeteer/test/assets/one-style.css b/remote/test/puppeteer/test/assets/one-style.css
new file mode 100644
index 0000000000..7b26410d8a
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/one-style.css
@@ -0,0 +1,3 @@
+body {
+ background-color: pink;
+}
diff --git a/remote/test/puppeteer/test/assets/one-style.html b/remote/test/puppeteer/test/assets/one-style.html
new file mode 100644
index 0000000000..4760f2b9f7
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/one-style.html
@@ -0,0 +1,2 @@
+<link rel='stylesheet' href='./one-style.css'>
+<div>hello, world!</div>
diff --git a/remote/test/puppeteer/test/assets/oopif.html b/remote/test/puppeteer/test/assets/oopif.html
new file mode 100644
index 0000000000..f04b9127af
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/oopif.html
@@ -0,0 +1,5 @@
+<a id="navigate-within-document" href="#nav">Navigate within document</a>
+<a name="nav"></a>
+<script>
+ fetch('oopif.html?requestFromOOPIF')
+</script>
diff --git a/remote/test/puppeteer/test/assets/p-selectors.html b/remote/test/puppeteer/test/assets/p-selectors.html
new file mode 100644
index 0000000000..24900623d8
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/p-selectors.html
@@ -0,0 +1,15 @@
+<div id="a">hello <button id="b">world</button>
+ <span id="f"></span>
+ <div id="c"></div>
+</div>
+<a>My name is Jun (pronounced like "June")</a>
+
+<script>
+ const topShadow = document.querySelector('#c');
+ topShadow.attachShadow({ mode: "open" });
+ topShadow.shadowRoot.innerHTML = `shadow dom<div id="d"></div>`;
+
+ const innerShadow = topShadow.shadowRoot.querySelector('#d');
+ innerShadow.attachShadow({ mode: "open" });
+ innerShadow.shadowRoot.innerHTML = `<a id="e">deep text</a>`;
+</script> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/pdf.html b/remote/test/puppeteer/test/assets/pdf.html
new file mode 100644
index 0000000000..987df27ebe
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/pdf.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>PDF</title>
+ </head>
+ <body>
+ <div>PDF Content</div>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/picture.html b/remote/test/puppeteer/test/assets/picture.html
new file mode 100644
index 0000000000..18e3d70f5e
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/picture.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<img
+ srcset="logo-1x.png, logo-2x.png 2x, logo-3x.png 3x"
+ src="logo-1x.png"
+ height="320"
+ width="320" /> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/playground.html b/remote/test/puppeteer/test/assets/playground.html
new file mode 100644
index 0000000000..828cfb1c70
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/playground.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Playground</title>
+ </head>
+ <body>
+ <button>A button</button>
+ <textarea>A text area</textarea>
+ <div id="first">First div</div>
+ <div id="second">
+ Second div
+ <span class="inner">Inner span</span>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/popup/popup.html b/remote/test/puppeteer/test/assets/popup/popup.html
new file mode 100644
index 0000000000..b855162c25
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/popup/popup.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Popup</title>
+ </head>
+ <body>
+ I am a popup
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/popup/window-open.html b/remote/test/puppeteer/test/assets/popup/window-open.html
new file mode 100644
index 0000000000..d138be1d22
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/popup/window-open.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Popup test</title>
+ </head>
+ <body>
+ <script>
+ window.open('./popup.html');
+ </script>
+ </body>
+</html>
diff --git a/remote/test/puppeteer/test/assets/pptr.png b/remote/test/puppeteer/test/assets/pptr.png
new file mode 100644
index 0000000000..65d87c68e6
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/pptr.png
Binary files differ
diff --git a/remote/test/puppeteer/test/assets/prerender/index.html b/remote/test/puppeteer/test/assets/prerender/index.html
new file mode 100644
index 0000000000..e0eecb717d
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/prerender/index.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<head>
+<script>
+ function addRules() {
+ const script = document.createElement('script');
+ script.type = 'speculationrules';
+ script.innerText = `
+ {
+ "prerender": [
+ {"source": "list", "urls": ["target.html"]}
+ ]
+ }
+ `;
+ document.head.append(script);
+ }
+</script>
+</head>
+<body>
+ <button onclick="addRules()">add rules</button>
+ <a href="target.html">test</a>
+</body>
diff --git a/remote/test/puppeteer/test/assets/prerender/target.html b/remote/test/puppeteer/test/assets/prerender/target.html
new file mode 100644
index 0000000000..f384b3cbb0
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/prerender/target.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<head>
+ <script>fetch('target.html?fromPrerendered')</script>
+</head>
+<body>target<input></input></body>
diff --git a/remote/test/puppeteer/test/assets/resetcss.html b/remote/test/puppeteer/test/assets/resetcss.html
new file mode 100644
index 0000000000..e4e04b1f8a
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/resetcss.html
@@ -0,0 +1,50 @@
+<style>
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+body {
+ line-height: 1;
+}
+ol, ul {
+ list-style: none;
+}
+blockquote, q {
+ quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+</style>
diff --git a/remote/test/puppeteer/test/assets/resolution.html b/remote/test/puppeteer/test/assets/resolution.html
new file mode 100644
index 0000000000..6d9f59ef9f
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/resolution.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<style>
+ p {
+ color: transparent;
+ }
+ @media (resolution: 1dppx) {
+ p {
+ font-size: 1px;
+ }
+ }
+ @media (resolution: 2dppx) {
+ p {
+ font-size: 2px;
+ }
+ }
+ @media (resolution: 3dppx) {
+ p {
+ font-size: 3px;
+ }
+ }
+ </style>
+ <p>Test</p>
+ \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/self-request.html b/remote/test/puppeteer/test/assets/self-request.html
new file mode 100644
index 0000000000..88aff620ff
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/self-request.html
@@ -0,0 +1,5 @@
+<script>
+var req = new XMLHttpRequest();
+req.open('GET', '/self-request.html');
+req.send(null);
+</script>
diff --git a/remote/test/puppeteer/test/assets/serviceworkers/empty/sw.html b/remote/test/puppeteer/test/assets/serviceworkers/empty/sw.html
new file mode 100644
index 0000000000..bef85d985b
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/serviceworkers/empty/sw.html
@@ -0,0 +1,3 @@
+<script>
+ window.registrationPromise = navigator.serviceWorker.register('sw.js');
+</script>
diff --git a/remote/test/puppeteer/test/assets/serviceworkers/empty/sw.js b/remote/test/puppeteer/test/assets/serviceworkers/empty/sw.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/serviceworkers/empty/sw.js
diff --git a/remote/test/puppeteer/test/assets/serviceworkers/extension/background.js b/remote/test/puppeteer/test/assets/serviceworkers/extension/background.js
new file mode 100644
index 0000000000..8b1a393741
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/serviceworkers/extension/background.js
@@ -0,0 +1 @@
+// empty
diff --git a/remote/test/puppeteer/test/assets/serviceworkers/extension/manifest.json b/remote/test/puppeteer/test/assets/serviceworkers/extension/manifest.json
new file mode 100644
index 0000000000..25828b6d2b
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/serviceworkers/extension/manifest.json
@@ -0,0 +1,9 @@
+{
+ "name": "Simple extension",
+ "version": "0.1",
+ "background": {
+ "service_worker": "background.js"
+ },
+ "permissions": ["background", "activeTab"],
+ "manifest_version": 3
+}
diff --git a/remote/test/puppeteer/test/assets/serviceworkers/fetch/style.css b/remote/test/puppeteer/test/assets/serviceworkers/fetch/style.css
new file mode 100644
index 0000000000..7b26410d8a
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/serviceworkers/fetch/style.css
@@ -0,0 +1,3 @@
+body {
+ background-color: pink;
+}
diff --git a/remote/test/puppeteer/test/assets/serviceworkers/fetch/sw.html b/remote/test/puppeteer/test/assets/serviceworkers/fetch/sw.html
new file mode 100644
index 0000000000..a9d28acb09
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/serviceworkers/fetch/sw.html
@@ -0,0 +1,5 @@
+<link rel="stylesheet" href="./style.css">
+<script>
+ window.registrationPromise = navigator.serviceWorker.register('sw.js');
+ window.activationPromise = new Promise(resolve => navigator.serviceWorker.oncontrollerchange = resolve);
+</script>
diff --git a/remote/test/puppeteer/test/assets/serviceworkers/fetch/sw.js b/remote/test/puppeteer/test/assets/serviceworkers/fetch/sw.js
new file mode 100644
index 0000000000..21381484b6
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/serviceworkers/fetch/sw.js
@@ -0,0 +1,7 @@
+self.addEventListener('fetch', (event) => {
+ event.respondWith(fetch(event.request));
+});
+
+self.addEventListener('activate', (event) => {
+ event.waitUntil(clients.claim());
+});
diff --git a/remote/test/puppeteer/test/assets/shadow.html b/remote/test/puppeteer/test/assets/shadow.html
new file mode 100644
index 0000000000..3796ca768c
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/shadow.html
@@ -0,0 +1,17 @@
+<script>
+
+let h1 = null;
+window.button = null;
+window.clicked = false;
+
+window.addEventListener('DOMContentLoaded', () => {
+ const shadowRoot = document.body.attachShadow({mode: 'open'});
+ h1 = document.createElement('h1');
+ h1.textContent = 'Hellow Shadow DOM v1';
+ button = document.createElement('button');
+ button.textContent = 'Click';
+ button.addEventListener('click', () => clicked = true);
+ shadowRoot.appendChild(h1);
+ shadowRoot.appendChild(button);
+});
+</script>
diff --git a/remote/test/puppeteer/test/assets/simple-extension/content-script.js b/remote/test/puppeteer/test/assets/simple-extension/content-script.js
new file mode 100644
index 0000000000..0fd83b90f1
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/simple-extension/content-script.js
@@ -0,0 +1,2 @@
+console.log('hey from the content-script');
+self.thisIsTheContentScript = true;
diff --git a/remote/test/puppeteer/test/assets/simple-extension/index.js b/remote/test/puppeteer/test/assets/simple-extension/index.js
new file mode 100644
index 0000000000..a0bb3f4eae
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/simple-extension/index.js
@@ -0,0 +1,2 @@
+// Mock script for background extension
+window.MAGIC = 42;
diff --git a/remote/test/puppeteer/test/assets/simple-extension/manifest.json b/remote/test/puppeteer/test/assets/simple-extension/manifest.json
new file mode 100644
index 0000000000..da2cd082ed
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/simple-extension/manifest.json
@@ -0,0 +1,14 @@
+{
+ "name": "Simple extension",
+ "version": "0.1",
+ "background": {
+ "scripts": ["index.js"]
+ },
+ "content_scripts": [{
+ "matches": ["<all_urls>"],
+ "css": [],
+ "js": ["content-script.js"]
+ }],
+ "permissions": ["background", "activeTab"],
+ "manifest_version": 2
+}
diff --git a/remote/test/puppeteer/test/assets/simple.json b/remote/test/puppeteer/test/assets/simple.json
new file mode 100644
index 0000000000..6d95903051
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/simple.json
@@ -0,0 +1 @@
+{"foo": "bar"}
diff --git a/remote/test/puppeteer/test/assets/tamperable.html b/remote/test/puppeteer/test/assets/tamperable.html
new file mode 100644
index 0000000000..d027e97038
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/tamperable.html
@@ -0,0 +1,3 @@
+<script>
+ window.result = window.injected;
+</script> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/title.html b/remote/test/puppeteer/test/assets/title.html
new file mode 100644
index 0000000000..88a86ce412
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/title.html
@@ -0,0 +1 @@
+<title>Woof-Woof</title>
diff --git a/remote/test/puppeteer/test/assets/worker/worker.html b/remote/test/puppeteer/test/assets/worker/worker.html
new file mode 100644
index 0000000000..7de2d9fd9e
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/worker/worker.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Worker test</title>
+ </head>
+ <body>
+ <script>
+ var worker = new Worker('worker.js');
+ worker.onmessage = function(message) {
+ console.log(message.data);
+ };
+ </script>
+ </body>
+</html> \ No newline at end of file
diff --git a/remote/test/puppeteer/test/assets/worker/worker.js b/remote/test/puppeteer/test/assets/worker/worker.js
new file mode 100644
index 0000000000..0626f13e58
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/worker/worker.js
@@ -0,0 +1,16 @@
+console.log('hello from the worker');
+
+function workerFunction() {
+ return 'worker function result';
+}
+
+self.addEventListener('message', (event) => {
+ console.log('got this data: ' + event.data);
+});
+
+(async function () {
+ while (true) {
+ self.postMessage(workerFunction.toString());
+ await new Promise((x) => setTimeout(x, 100));
+ }
+})();
diff --git a/remote/test/puppeteer/test/assets/wrappedlink.html b/remote/test/puppeteer/test/assets/wrappedlink.html
new file mode 100644
index 0000000000..429b6e9156
--- /dev/null
+++ b/remote/test/puppeteer/test/assets/wrappedlink.html
@@ -0,0 +1,32 @@
+<style>
+:root {
+ font-family: monospace;
+}
+
+body {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+div {
+ width: 10ch;
+ word-wrap: break-word;
+ border: 1px solid blue;
+ transform: rotate(33deg);
+ line-height: 8ch;
+ padding: 2ch;
+}
+
+a {
+ margin-left: 7ch;
+}
+</style>
+<div>
+ <a href='#clicked'>123321</a>
+</div>
+<script>
+ document.querySelector('a').addEventListener('click', () => {
+ window.__clicked = true;
+ });
+</script>