mirror of
https://github.com/gosticks/DefinitelyTyped.git
synced 2025-10-16 12:05:41 +00:00
192 lines
5.5 KiB
TypeScript
192 lines
5.5 KiB
TypeScript
import { JSDOM, VirtualConsole, CookieJar, FromUrlOptions, FromFileOptions, DOMWindow, ResourceLoader, FetchOptions, ConstructorOptions } from 'jsdom';
|
|
import { CookieJar as ToughCookieJar, MemoryCookieStore } from 'tough-cookie';
|
|
import { Script } from 'vm';
|
|
|
|
function test_basic_usage() {
|
|
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
|
|
console.log(dom.window.document.querySelector('p')!.textContent); // "Hello world"
|
|
|
|
const { window } = new JSDOM(`...`);
|
|
// or even
|
|
const { document } = (new JSDOM(`...`)).window;
|
|
}
|
|
|
|
function test_executing_scripts1() {
|
|
const dom = new JSDOM(`<body>
|
|
<script>document.body.appendChild(document.createElement("hr"));</script>
|
|
</body>`);
|
|
|
|
// The script will not be executed, by default:
|
|
dom.window.document.body.children.length === 1;
|
|
}
|
|
|
|
function test_executing_scripts2() {
|
|
const dom = new JSDOM(`<body>
|
|
<script>document.body.appendChild(document.createElement("hr"));</script>
|
|
</body>`, { runScripts: 'dangerously' });
|
|
|
|
// The script will be executed and modify the DOM:
|
|
dom.window.document.body.children.length === 2;
|
|
}
|
|
|
|
function test_executing_scripts3() {
|
|
const window = (new JSDOM(``, { runScripts: 'outside-only' })).window;
|
|
|
|
window.eval(`document.body.innerHTML = "<p>Hello, world!</p>";`);
|
|
window.document.body.children.length === 1;
|
|
}
|
|
|
|
function test_virtualConsole() {
|
|
const virtualConsole = new VirtualConsole();
|
|
const dom = new JSDOM(``, { virtualConsole });
|
|
|
|
virtualConsole.on('error', () => { });
|
|
virtualConsole.on('warn', () => { });
|
|
virtualConsole.on('info', () => { });
|
|
virtualConsole.on('dir', () => { });
|
|
// ... etc. See https://console.spec.whatwg.org/#logging
|
|
|
|
virtualConsole.sendTo(console);
|
|
|
|
const c = console;
|
|
virtualConsole.sendTo(c, { omitJSDOMErrors: true });
|
|
}
|
|
|
|
function test_cookieJar() {
|
|
const store = {} as MemoryCookieStore;
|
|
const options = {} as ToughCookieJar.Options;
|
|
|
|
const cookieJar: CookieJar = new CookieJar(store, options);
|
|
const constructorOptions: ConstructorOptions = { cookieJar };
|
|
const dom = new JSDOM(``, constructorOptions);
|
|
}
|
|
|
|
function test_beforeParse() {
|
|
const dom = new JSDOM(`<p>Hello</p>`, {
|
|
beforeParse(window) {
|
|
window.document.childNodes.length === 0;
|
|
}
|
|
});
|
|
}
|
|
|
|
function test_storageQuota() {
|
|
new JSDOM('', { storageQuota: 1337 });
|
|
}
|
|
|
|
function test_pretendToBeVisual() {
|
|
new JSDOM('', { pretendToBeVisual: true });
|
|
}
|
|
|
|
function test_serialize() {
|
|
const dom = new JSDOM(`<!DOCTYPE html>hello`);
|
|
|
|
dom.serialize() === '<!DOCTYPE html><html><head></head><body>hello</body></html>';
|
|
|
|
// Contrast with:
|
|
// tslint:disable-next-line no-unnecessary-type-assertion
|
|
dom.window.document.documentElement!.outerHTML === '<html><head></head><body>hello</body></html>';
|
|
}
|
|
|
|
function test_nodeLocation() {
|
|
const dom = new JSDOM(
|
|
`<p>Hello
|
|
<img src="foo.jpg">
|
|
</p>`,
|
|
{ includeNodeLocations: true }
|
|
);
|
|
|
|
const document = dom.window.document;
|
|
const bodyEl = document.body; // implicitly created
|
|
const pEl = document.querySelector('p')!;
|
|
const textNode = pEl.firstChild!;
|
|
const imgEl = document.querySelector('img')!;
|
|
|
|
console.log(dom.nodeLocation(bodyEl)); // null; it's not in the source
|
|
console.log(dom.nodeLocation(pEl)); // { startOffset: 0, endOffset: 39, startTag: ..., endTag: ... }
|
|
console.log(dom.nodeLocation(textNode)); // { startOffset: 3, endOffset: 13 }
|
|
console.log(dom.nodeLocation(imgEl)); // { startOffset: 13, endOffset: 32 }
|
|
}
|
|
|
|
function test_runVMScript() {
|
|
const dom = new JSDOM(``, { runScripts: 'outside-only' });
|
|
const s = new Script(`
|
|
if (!this.ran) {
|
|
this.ran = 0;
|
|
}
|
|
|
|
++this.ran;
|
|
`);
|
|
|
|
dom.runVMScript(s);
|
|
dom.runVMScript(s);
|
|
dom.runVMScript(s);
|
|
|
|
(dom.window as any).ran === 3;
|
|
}
|
|
|
|
function test_reconfigure() {
|
|
const myFakeTopForTesting = {} as DOMWindow;
|
|
|
|
const dom = new JSDOM();
|
|
|
|
dom.window.top === dom.window;
|
|
dom.window.location.href === 'about:blank';
|
|
|
|
dom.reconfigure({ windowTop: myFakeTopForTesting, url: 'https://example.com/' });
|
|
|
|
dom.window.top === myFakeTopForTesting;
|
|
dom.window.location.href === 'https://example.com/';
|
|
}
|
|
|
|
function test_fromURL() {
|
|
const options = {} as FromUrlOptions;
|
|
|
|
JSDOM.fromURL('https://example.com/', options).then(dom => {
|
|
console.log(dom.serialize());
|
|
});
|
|
|
|
function pretendToBeVisual() {
|
|
JSDOM.fromURL("https://github.com", {
|
|
pretendToBeVisual: true
|
|
});
|
|
}
|
|
}
|
|
|
|
function test_fromFile() {
|
|
const options = {} as FromFileOptions;
|
|
|
|
JSDOM.fromFile('stuff.html', options).then(dom => {
|
|
console.log(dom.serialize());
|
|
});
|
|
}
|
|
|
|
function test_fragment() {
|
|
const frag = JSDOM.fragment(`<p>Hello</p><p><strong>Hi!</strong>`);
|
|
|
|
frag.childNodes.length === 2;
|
|
frag.querySelector('strong')!.textContent = 'Why hello there!';
|
|
// etc.
|
|
}
|
|
|
|
function test_fragment_serialization() {
|
|
const frag = JSDOM.fragment(`<p>Hello</p>`);
|
|
if (frag instanceof Element) {
|
|
if (frag.firstChild instanceof Element) {
|
|
console.log(frag.firstChild.outerHTML); // logs "<p>Hello</p>"
|
|
}
|
|
}
|
|
}
|
|
|
|
function test_custom_resource_loader() {
|
|
class CustomResourceLoader extends ResourceLoader {
|
|
fetch(url: string, options: FetchOptions) {
|
|
if (options.element) {
|
|
console.log(`Element ${options.element.localName} is requesting the url ${url}`);
|
|
}
|
|
|
|
return super.fetch(url, options);
|
|
}
|
|
}
|
|
new JSDOM('', { resources: new CustomResourceLoader() });
|
|
}
|