feat: when rolling, also copy the wwwroot over (#1756)

This commit is contained in:
Anže Vodovnik 2021-09-23 14:34:31 +02:00 коммит произвёл GitHub
Родитель 167080c6e0
Коммит cc820a28bb
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
144 изменённых файлов: 32 добавлений и 2065 удалений

4
.github/workflows/nuget-package-tests.yml поставляемый
Просмотреть файл

@ -27,7 +27,9 @@ jobs:
dotnet-version: 5.0.x
- name: Install prerequisites and download drivers
shell: pwsh
run: .\build.ps1 driver -prereqs
run: |
.\build.ps1 driver -prereqs
.\build.ps1 wwwroot
- name: Install Playwright CLI
run: dotnet tool install --global Microsoft.Playwright.CLI
- name: Build NUnit Package

4
.github/workflows/smoke-tests.yml поставляемый
Просмотреть файл

@ -26,7 +26,9 @@ jobs:
dotnet-version: 5.0.x
- name: Install prerequisites and download drivers
shell: pwsh
run: ./build.ps1 driver
run: |
./build.ps1 driver
./build.ps1 wwwroot
- name: Building...
run: dotnet build ./src
- name: Installing Browsers and dependencies...

8
.github/workflows/tests.yml поставляемый
Просмотреть файл

@ -31,7 +31,9 @@ jobs:
dotnet-version: 5.0.x
- name: Install prerequisites and download drivers
shell: pwsh
run: ./build.ps1 driver
run: |
./build.ps1 driver
./build.ps1 wwwroot
- name: Building...
run: dotnet build ./src
- name: Installing Browsers and dependencies...
@ -69,7 +71,9 @@ jobs:
dotnet-version: 5.0.x
- name: Install prerequisites and download drivers
shell: pwsh
run: ./build.ps1 driver
run: |
./build.ps1 driver
./build.ps1 wwwroot
- name: Building...
run: |
dotnet build -f netstandard2.0 ./src/Playwright/Playwright.csproj

4
.gitignore поставляемый
Просмотреть файл

@ -359,4 +359,6 @@ src/Playwright/Microsoft.Playwright.xml
dotnet-format/
.runsettings
testCert.cer
testCert.cer
src/Playwright.Tests.TestServer/wwwroot/

Просмотреть файл

@ -18,12 +18,14 @@ function Get-Help() {
Write-Host " downloads the new driver."
Write-Host " driver Downloads the driver."
Write-Host " help Prints this message."
Write-Host " wwwroot Copies over the wwwroot."
}
function Invoke-Init() {
Invoke-InitializeSubmodule
if ($prereqs) { Invoke-InstallRequirements }
Invoke-DownloadDriver
Invoke-WWWRoot
}
function Get-SubmoduleStatus() {
@ -56,6 +58,12 @@ function Invoke-DownloadDriver() {
dotnet run --project ./src/tools/Playwright.Tooling/Playwright.Tooling.csproj -- download-drivers --basepath .
}
function Invoke-WWWRoot() {
Write-Host "🌐 Synchronizing wwwroot folder..."
Remove-Item -Path .\src\Playwright.Tests.TestServer\wwwroot\ -Recurse -ErrorAction Ignore
Copy-Item -Path .\playwright\tests\assets -Destination .\src\Playwright.Tests.TestServer\wwwroot\ -Recurse
}
function Invoke-Roll() {
if ($verbs.Length -eq 2) {
if ((Get-SubmoduleStatus).StartsWith("+")) {
@ -94,6 +102,7 @@ function Invoke-Roll() {
Write-Host "🚀 Generating API..."
node "playwright/utils/doclint/generateDotnetApi.js" "src/Playwright"
Invoke-DownloadDriver
Invoke-WWWRoot
}
if ($verbs.Length -eq 0) {
@ -106,4 +115,5 @@ switch ($verbs[0]) {
"help" { Get-Help }
"roll" { Invoke-Roll }
"driver" { Invoke-DownloadDriver }
"wwwroot" { Invoke-WWWRoot }
}

Просмотреть файл

@ -18,4 +18,10 @@
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>
<Target Name="CheckWwwRootExists" BeforeTargets="Build">
<Error Text="wwwroot prerequisites are missing. Ensure you've ran `.\build.ps1 wwwroot` from the root of the solution." Condition="!Exists('$(MSBuildProjectDirectory)\wwwroot\background-color.html')" />
</Target>
</Project>

Просмотреть файл

@ -1,10 +0,0 @@
<html>
<script>
function changeBackground() {
const color = location.hash.substr(1);
document.body.style.backgroundColor = color;
}
</script>
<body onload='changeBackground()'>
</body>
</html>

Просмотреть файл

@ -1,10 +0,0 @@
<div>beforeunload demo.</div>
<script>
window.addEventListener('beforeunload', event => {
// Chromium & WebKit way.
event.returnValue = 'Leave?';
// Firefox way.
event.preventDefault();
});
</script>

Просмотреть файл

@ -1,39 +0,0 @@
<style>
* {
padding: 0;
margin: 0;
}
iframe {
position: absolute;
top: 0;
left: 0;
width: 500px;
height: 500px;
}
button {
position: absolute;
top: 150px;
left: 150px;
width: 200px;
height: 200px;
}
</style>
<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 = '/grid.html';
iframe.src = url.toString();
document.body.append(iframe);
const button = document.createElement('button');
button.textContent = 'CLICK ME';
button.addEventListener('click', () => {
window.BUTTON_CLICKED = true;
}, false);
document.body.append(button);
}, false);
</script>

Просмотреть файл

@ -1,3 +0,0 @@
body {
background-color: pink;
}

Просмотреть файл

@ -1,2 +0,0 @@
<link rel='stylesheet' href='./one-style.css'>
<div>hello, world!</div>

Просмотреть файл

@ -1,43 +0,0 @@
<html>
<script>
function changeBackground() {
const color = location.hash.substr(1);
document.body.style.backgroundColor = color;
}
</script>
<style>
body {
margin: 0;
}
.container {
display: grid;
background-color: rgb(0, 0, 0);
grid-template-columns: auto auto;
width: 100%;
height: 100%;
}
.cell {
border: none;
font-size: 30px;
text-align: center;
}
.cell.grey {
background-color: rgb(100, 100, 100);
}
.cell.red {
background-color: rgb(255, 0, 0);
}
</style>
<body>
<div class="container">
<div class="cell red"></div>
<div class="cell grey"></div>
<div class="cell grey"></div>
<div class="cell red"></div>
</div>
</body>
</html>

Двоичный файл не отображается.

Просмотреть файл

@ -1,11 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>console.log test</title>
</head>
<body>
<script>
console.log('yellow')
</script>
</body>
</html>

Просмотреть файл

@ -1 +0,0 @@
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">

Двоичный файл не отображается.

Просмотреть файл

@ -1,95 +0,0 @@
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.

Просмотреть файл

@ -1,26 +0,0 @@
<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>

Просмотреть файл

@ -1,4 +0,0 @@
<style>
@media screen { div { color: green; } } </style>
<div>hello, world</div>

Просмотреть файл

@ -1,8 +0,0 @@
<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>

Просмотреть файл

@ -1,6 +0,0 @@
<style>
div { color: green; }
a { color: blue; }
</style>
<div>hello, world</div>

Просмотреть файл

@ -1,7 +0,0 @@
<style>
body {
padding: 10px;
}
/*# sourceURL=nicename.css */
</style>

Просмотреть файл

@ -1,3 +0,0 @@
body {
color: red;
}

Просмотреть файл

@ -1,4 +0,0 @@
html {
margin: 0;
padding: 0;
}

Просмотреть файл

@ -1,7 +0,0 @@
<style>
@media screen {
a { color: green; }
}
/*# sourceURL=unused.css */
</style>

Просмотреть файл

@ -1,36 +0,0 @@
<script>
window.addEventListener('DOMContentLoaded', () => {
const outer = document.createElement('section');
document.body.appendChild(outer);
const root1 = document.createElement('div');
root1.setAttribute('id', 'root1');
outer.appendChild(root1);
const shadowRoot1 = root1.attachShadow({mode: 'open'});
const span1 = document.createElement('span');
span1.setAttribute('data-testid', 'foo');
span1.textContent = 'Hello from root1';
shadowRoot1.appendChild(span1);
const root2 = document.createElement('div');
shadowRoot1.appendChild(root2);
const shadowRoot2 = root2.attachShadow({mode: 'open'});
const span2 = document.createElement('span');
span2.setAttribute('data-testid', 'foo');
span2.setAttribute('id', 'target');
span2.textContent = 'Hello from root2';
shadowRoot2.appendChild(span2);
const root3 = document.createElement('div');
shadowRoot1.appendChild(root3);
const shadowRoot3 = root3.attachShadow({mode: 'open'});
const span3 = document.createElement('span');
span3.setAttribute('data-testid', 'foo');
span3.textContent = 'Hello from root3';
shadowRoot3.appendChild(span3);
const span4 = document.createElement('span');
span4.textContent = 'Hello from root3 #2';
span4.setAttribute('attr', 'value space');
shadowRoot3.appendChild(span4);
});
</script>

Просмотреть файл

@ -1,12 +0,0 @@
<!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>

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 434 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 346 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 413 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 434 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 403 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 422 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 445 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 387 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 447 B

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 437 B

Просмотреть файл

@ -1,5 +0,0 @@
<div id="outer" name="value"><div id="inner">Text,
more text</div></div><input id="check" type=checkbox checked foo="bar&quot;">
<input id="input"></input>
<textarea id="textarea"></textarea>
<select id="select"><option></option><option value="foo"></option></select>

Просмотреть файл

@ -1,29 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Blob Download Example</title>
</head>
<body>
<script>
const download = (data, filename) => {
const a = document.createElement("a");
a.style = "display: none";
document.body.appendChild(a);
a.style = "display: none";
const blob = new Blob([data], { type: "octet/stream" });
const url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
document.body.removeChild(a);
};
const downloadIt = () => {
download("Hello world", "example.txt");
}
</script>
<a onclick="javascipt:downloadIt();">Download</a>
</body>
</html>

Просмотреть файл

@ -1,40 +0,0 @@
<style>
div:not(.mouse-helper) {
margin: 0em;
padding: 2em;
}
#source {
color: blue;
border: 1px solid black;
}
#target {
border: 1px solid black;
}
</style>
<script>
function dragstart_handler(ev) {
ev.currentTarget.style.border = "dashed";
ev.dataTransfer.setData("text/plain", ev.target.id);
}
function dragover_handler(ev) {
ev.preventDefault();
}
function drop_handler(ev) {
console.log("Drop");
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
ev.target.appendChild(document.getElementById(data));
}
</script>
<body>
<div>
<p id="source" ondragstart="dragstart_handler(event);" draggable="true">
Select this element, drag it to the Drop Zone and then release the selection to move the element.</p>
</div>
<div id="target" ondrop="drop_handler(event);" ondragover="dragover_handler(event);">Drop Zone</div>
</body>

Просмотреть файл

@ -1,3 +0,0 @@
#!/usr/bin/env node
process.exit(1);

Просмотреть файл

@ -1,31 +0,0 @@
<style>
body, html {
margin: 0;
}
iframe {
width: 300px;
height: 300px;
margin: 0;
padding: 0;
border: 0;
}
</style>
<script>
function goLocal() {
document.querySelector('iframe').src = location.href.replace('dynamic-oopif.html', 'grid.html');
}
function goRemote(iframe) {
iframe = iframe || document.querySelector('iframe');
const url = new URL(location.href);
url.hostname = url.hostname === 'localhost' ? '127.0.0.1' : 'localhost';
url.pathname = '/grid.html';
iframe.src = url.toString();
}
window.addEventListener('DOMContentLoaded', () => {
const iframe = document.createElement('iframe');
goRemote(iframe);
document.body.appendChild(iframe);
}, false);
</script>

Просмотреть файл

Просмотреть файл

@ -1,17 +0,0 @@
<script>
console.error('Not a JS error');
a();
function a() {
b();
}
function b() {
c();
}
function c() {
throw new Error('Fancy error!');
}
//# sourceURL=myscript.js
</script>

Просмотреть файл

@ -1,5 +0,0 @@
{
"parserOptions": {
"sourceType": "module"
}
}

Просмотреть файл

@ -1,2 +0,0 @@
import num from './es6module.js';
window.__es6injected = num;

Просмотреть файл

@ -1 +0,0 @@
export default 42;

Просмотреть файл

@ -1,2 +0,0 @@
import num from './es6/es6module.js';
window.__es6injected = num;

Просмотреть файл

@ -1 +0,0 @@
contents of the file

Просмотреть файл

@ -1,4 +0,0 @@
<script>
window.result = (1000000.50).toLocaleString().replace(/\s/g, ' ');
window.initialNavigatorLanguage = navigator.language;
</script>

Просмотреть файл

@ -1 +0,0 @@
<iframe src='./redirect-my-parent.html'></iframe>

Просмотреть файл

@ -1,15 +0,0 @@
<link rel='stylesheet' href='./style.css'>
<script src='./script.js' type='text/javascript'></script>
<style>
body {
height: 100px;
margin: 8px;
border: 0;
background-color: #555;
}
div {
line-height: 18px;
}
</style>
<div>Hi, I'm frame</div>

Просмотреть файл

@ -1,8 +0,0 @@
<frameset>
<frameset>
<frame src='./frame.html'></frame>
<frame src='about:blank'></frame>
</frameset>
<frame src='/empty.html'></frame>
<frame></frame>
</frameset>

Просмотреть файл

@ -1,6 +0,0 @@
<div style="height: 1000px; width: 1000px; background: red">One</div>
<div style="height: 1000px; width: 1000px; background: blue">Two</div>
<div style="height: 1000px; width: 1000px; background: red">Three</div>
<div style="height: 1000px; width: 1000px; background: blue">Four</div>
<div style="height: 1000px; width: 1000px; background: red">Five</div>
<iframe loading="lazy" src='./frame.html'></iframe>

Просмотреть файл

@ -1,30 +0,0 @@
<style>
body {
display: flex;
height: 500px;
margin: 8px;
}
body iframe {
flex-grow: 1;
flex-shrink: 1;
border: 0;
background-color: green;
}
::-webkit-scrollbar{
display: none;
}
</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>

Просмотреть файл

@ -1 +0,0 @@
<iframe src='./frame.html'></iframe>

Просмотреть файл

@ -1,3 +0,0 @@
<script>
window.parent.location = './one-frame.html';
</script>

Просмотреть файл

@ -1 +0,0 @@
console.log('Cheers!');

Просмотреть файл

@ -1,3 +0,0 @@
div {
color: blue;
}

Просмотреть файл

@ -1,16 +0,0 @@
<style>
body {
display: flex;
flex-direction: column;
height: 400px;
margin: 8px;
}
body iframe {
flex-grow: 1;
flex-shrink: 1;
border: 0;
}
</style>
<iframe src='./frame.html' name='uno'></iframe>
<iframe src='./frame.html' name='dos'></iframe>

Просмотреть файл

@ -1,7 +0,0 @@
<script>
window.geolocationPromise = new Promise(resolve => {
navigator.geolocation.getCurrentPosition(position => {
resolve({latitude: position.coords.latitude, longitude: position.coords.longitude});
});
});
</script>

Просмотреть файл

@ -1,3 +0,0 @@
<script>
var globalVar = 123;
</script>

Просмотреть файл

@ -1,16 +0,0 @@
<style>
body, html {
margin: 0;
}
</style>
<script>
window.addEventListener('DOMContentLoaded', () => {
const container = document.createElement('div');
document.body.appendChild(container);
const shadow = container.attachShadow({mode: 'open'});
const iframe = document.createElement('iframe');
iframe.src = './grid.html';
iframe.style.cssText = 'width: 300px; height: 300px; margin: 0; padding: 0; border: 0;';
shadow.appendChild(iframe);
});
</script>

Просмотреть файл

@ -1,62 +0,0 @@
<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>
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;
}
::-webkit-scrollbar {
display: none;
}
@keyframes move {
from { left: -500px; background-color: cyan; }
to { left: 0; background-color: rgb(255, 210, 204); }
}
.box.animation {
position: relative;
animation: 2s linear 0s move forwards;
}
</style>

Просмотреть файл

@ -1,3 +0,0 @@
<title>HAR Page</title>
<link rel='stylesheet' href='./one-style.css'>
<div>hello, world!</div>

Просмотреть файл

@ -1,7 +0,0 @@
<style>
html { background-image: url(image1x.jpg); }
@media(-webkit-min-device-pixel-ratio: 1.5) {
html { background-image: url(image2x.jpg); }
}
</style>

Просмотреть файл

@ -1,5 +0,0 @@
<script>
window.addEventListener('DOMContentLoaded', () => {
history.pushState({}, '', '#1');
});
</script>

Просмотреть файл

@ -1,3 +0,0 @@
window.__injected = 42;
window.injected = 123;
window.__injectedError = new Error('hi');

Просмотреть файл

@ -1,3 +0,0 @@
body {
background-color: red;
}

Просмотреть файл

@ -1,42 +0,0 @@
<style>
body, html { margin: 0; padding: 0; }
@keyframes move {
from { marign-left: 0; }
to { margin-left: 100px; }
}
</style>
<script>
function addButton() {
const button = document.createElement('button');
button.textContent = 'Click me';
button.style.animation = '3s linear move';
button.style.animationIterationCount = 'infinite';
button.addEventListener('click', () => window.clicked = true);
document.body.appendChild(button);
}
function stopButton(remove) {
const button = document.querySelector('button');
button.style.marginLeft = button.getBoundingClientRect().left + 'px';
button.style.animation = '';
if (remove)
button.remove();
}
let x = 0;
function jump() {
x += 300;
const button = document.querySelector('button');
button.style.marginLeft = x + 'px';
}
function startJumping() {
x = 0;
const moveIt = () => {
jump();
requestAnimationFrame(moveIt);
};
setInterval(jump, 0);
moveIt();
}
</script>

Просмотреть файл

@ -1,32 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Button test</title>
</head>
<body>
<script src="mouse-helper.js"></script>
<button>Click target</button>
<script>
window.result = 'Was not clicked';
window.offsetX = undefined;
window.offsetY = undefined;
window.pageX = undefined;
window.pageY = undefined;
window.shiftKey = undefined;
window.pageX = undefined;
window.pageY = undefined;
window.bubbles = undefined;
document.querySelector('button').addEventListener('click', e => {
result = 'Clicked';
offsetX = e.offsetX;
offsetY = e.offsetY;
pageX = e.pageX;
pageY = e.pageY;
shiftKey = e.shiftKey;
bubbles = e.bubbles;
cancelable = e.cancelable;
composed = e.composed;
}, false);
</script>
</body>
</html>

Просмотреть файл

@ -1,42 +0,0 @@
<!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>

Просмотреть файл

@ -1,12 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>File upload test</title>
</head>
<body>
<form action="/input/fileupload.html">
<input type="file">
<input type="submit">
</form>
</body>
</html>

Просмотреть файл

@ -1,42 +0,0 @@
<!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, event.which, modifiers(event));
});
textarea.addEventListener('keypress', event => {
log('Keypress:', event.key, event.code, event.which, event.charCode, modifiers(event));
});
textarea.addEventListener('keyup', event => {
log('Keyup:', event.key, event.code, event.which, 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>

Просмотреть файл

@ -1,62 +0,0 @@
// 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));
}
})();

Просмотреть файл

@ -1,21 +0,0 @@
<!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>

Просмотреть файл

@ -1,23 +0,0 @@
<!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 => {
event.preventDefault();
button.textContent = 'context menu';
}
document.body.appendChild(button);
document.body.appendChild(document.createElement('br'));
}
</script>
</body>
</html>

Просмотреть файл

@ -1,69 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Selection Test</title>
</head>
<body>
<select>
<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" id="whiteOption">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>

Просмотреть файл

@ -1,20 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Textarea test</title>
</head>
<body>
<textarea spellcheck="false"></textarea>
<input></input>
<div contenteditable="true"></div>
<div class="plain">Plain div</div>
<script src='mouse-helper.js'></script>
<script>
window.result = '';
let textarea = document.querySelector('textarea');
textarea.addEventListener('input', () => result = textarea.value, false);
let input = document.querySelector('input');
input.addEventListener('input', () => result = input.value, false);
</script>
</body>
</html>

Просмотреть файл

@ -1,35 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Touch test</title>
</head>
<body>
<script src="mouse-helper.js"></script>
<button onclick="clicked();">Click target</button>
<script>
window.result = [];
const button = document.querySelector('button');
button.style.height = '200px';
button.style.width = '200px';
button.focus();
button.addEventListener('touchstart', event => {
log('Touchstart:', ...Array.from(event.changedTouches).map(touch => touch.identifier));
});
button.addEventListener('touchend', event => {
log('Touchend:', ...Array.from(event.changedTouches).map(touch => touch.identifier));
});
button.addEventListener('touchmove', event => {
log('Touchmove:', ...Array.from(event.changedTouches).map(touch => touch.identifier));
});
function log(...args) {
console.log.apply(console, args);
result.push(args.join(' '));
}
function getResult() {
let temp = result;
result = [];
return temp;
}
</script>
</body>
</html>

Просмотреть файл

@ -1 +0,0 @@
<script>eval('console.log("foo")')</script>

Просмотреть файл

@ -1,15 +0,0 @@
<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 z = () => {};
let q = () => {};
q();
}
foo();
</script>

Просмотреть файл

@ -1,2 +0,0 @@
<script src='script1.js'></script>
<script src='script2.js'></script>

Просмотреть файл

@ -1,2 +0,0 @@
<script>
function unused(){}console.log('used!');</script>

Просмотреть файл

@ -1 +0,0 @@
console.log(3);

Просмотреть файл

@ -1 +0,0 @@
console.log(3);

Просмотреть файл

@ -1,2 +0,0 @@
<script>
function foo() {function bar() { } console.log(1); } foo(); </script>

Просмотреть файл

@ -1,4 +0,0 @@
<script>
console.log(1);
//# sourceURL=nicename.js
</script>

Просмотреть файл

@ -1 +0,0 @@
<script>function foo() { }</script>

Просмотреть файл

@ -1 +0,0 @@
<meta name = "viewport" content = "initial-scale = 1, user-scalable = no">

Просмотреть файл

@ -1,3 +0,0 @@
/*! 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);

Двоичный файл не отображается.

Двоичный файл не отображается.

Просмотреть файл

@ -1 +0,0 @@
<iframe src='networkidle.html'></iframe>

Просмотреть файл

@ -1 +0,0 @@
<script src='networkidle.js'></script>

Просмотреть файл

@ -1,12 +0,0 @@
async function main() {
window.ws = new WebSocket('ws://localhost:' + window.location.port + '/ws');
window.ws.addEventListener('message', message => {});
fetch('fetch-request-a.js');
window.top.fetchSecond = () => {
// Do not return the promise here.
fetch('fetch-request-b.js');
};
}
main();

Просмотреть файл

@ -1,55 +0,0 @@
<style>
button {
position: absolute;
width: 100px;
height: 20px;
margin: 0;
}
body, html {
margin: 0;
padding: 0;
height: 100%;
width: 100%;
position: relative;
}
div {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
}
#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; }
</style>
<div>
<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>
</div>
<script>
window.addEventListener('DOMContentLoaded', () => {
for (const button of Array.from(document.querySelectorAll('button')))
button.addEventListener('click', () => console.log('button #' + button.textContent + ' clicked'), false);
}, false);
</script>

Просмотреть файл

@ -1,3 +0,0 @@
body {
background-color: pink;
}

Просмотреть файл

@ -1,2 +0,0 @@
<link rel='stylesheet' href='./one-style.css'>
<div>hello, world!</div>

Просмотреть файл

@ -1,22 +0,0 @@
<style>
body { margin: 0; padding: 0; }
div {
display: inline-flex;
width: 50px;
height: 50px;
border-right: 1px solid black;
border-bottom: 1px solid black;
}
</style>
<body></body>
<script>
const colors = ['#222', '#444', '#666', '#888', '#aaa'];
for (let i = 0; i < 1000; ++i) {
const div = document.createElement('div');
div.style.setProperty('background-color', colors[i % 5]);
document.body.appendChild(div);
}
</script>

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше