@percy/dom 1.19.0-alpha.0 → 1.19.2-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -0
- package/dist/bundle.js +117 -71
- package/dist/bundle.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -37,6 +37,7 @@ const domSnapshot = await page.evaluate(() => PercyDOM.serialize(options))
|
|
|
37
37
|
|
|
38
38
|
- `enableJavaScript` — When true, does not serialize some DOM elements
|
|
39
39
|
- `domTransformation` — Function to transform the DOM after serialization
|
|
40
|
+
- `disableShadowDOM` — disable shadow DOM capturing, this option can be passed to `percySnapshot` its part of per-snapshot config.
|
|
40
41
|
|
|
41
42
|
## Serialized Content
|
|
42
43
|
|
|
@@ -71,7 +72,44 @@ Videos without a `poster` attribute will have the current frame of the video
|
|
|
71
72
|
serialized into an image and set as the `poster` attribute automatically. This is
|
|
72
73
|
to ensure videos have a stable image to display when screenshots are captured.
|
|
73
74
|
|
|
75
|
+
### Shadow DOM
|
|
76
|
+
|
|
77
|
+
Shadow dom `#shadow-root (open)` is serialized into declarative shadow DOM (`<template shadowroot="open">`) form
|
|
78
|
+
Shadow host element is annotated with special identifier attribute named `data-percy-shadow-host`. This identifier
|
|
79
|
+
attribute may be used when passing `domTransformation`.
|
|
80
|
+
|
|
74
81
|
### Other elements
|
|
75
82
|
|
|
76
83
|
_All other elements are not serialized._ The resulting cloned document is passed to any provided
|
|
77
84
|
`domTransformation` option before the serialize function returns a DOM string.
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
## Examples
|
|
89
|
+
|
|
90
|
+
1. perform DOM transformations on serialized DOM
|
|
91
|
+
|
|
92
|
+
this example contains scenario of nested shadow DOMs
|
|
93
|
+
|
|
94
|
+
```js
|
|
95
|
+
import serializeDOM from '@percy/dom';
|
|
96
|
+
|
|
97
|
+
const domSnapshot = serializeDOM({
|
|
98
|
+
domTransformation: (documentElement) => {
|
|
99
|
+
function insertHelloHeader(root) {
|
|
100
|
+
h1 = document.createElement('h1');
|
|
101
|
+
h1.innerText = 'Inserted using dom transformations';
|
|
102
|
+
root.append(h1);
|
|
103
|
+
|
|
104
|
+
root.querySelectorAll('[data-percy-shadow-host]')
|
|
105
|
+
.forEach(
|
|
106
|
+
shadowHost => {
|
|
107
|
+
if (shadowHost?.shadowRoot)
|
|
108
|
+
insertHelloHeader(shadowHost.shadowRoot)
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
insertHelloHeader(documentElement);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
```
|
package/dist/bundle.js
CHANGED
|
@@ -69,7 +69,8 @@
|
|
|
69
69
|
clone,
|
|
70
70
|
warnings,
|
|
71
71
|
resources,
|
|
72
|
-
enableJavaScript
|
|
72
|
+
enableJavaScript,
|
|
73
|
+
disableShadowDOM
|
|
73
74
|
} = _ref;
|
|
74
75
|
for (let frame of dom.querySelectorAll('iframe')) {
|
|
75
76
|
var _clone$head;
|
|
@@ -94,7 +95,8 @@
|
|
|
94
95
|
let serialized = serializeDOM({
|
|
95
96
|
domTransformation: setBaseURI,
|
|
96
97
|
dom: frame.contentDocument,
|
|
97
|
-
enableJavaScript
|
|
98
|
+
enableJavaScript,
|
|
99
|
+
disableShadowDOM
|
|
98
100
|
});
|
|
99
101
|
|
|
100
102
|
// append serialized warnings and resources
|
|
@@ -129,6 +131,65 @@
|
|
|
129
131
|
}
|
|
130
132
|
}
|
|
131
133
|
|
|
134
|
+
// Creates a resource object from an element's unique ID and data URL
|
|
135
|
+
function resourceFromDataURL(uid, dataURL) {
|
|
136
|
+
// split dataURL into desired parts
|
|
137
|
+
let [data, content] = dataURL.split(',');
|
|
138
|
+
let [, mimetype] = data.split(':');
|
|
139
|
+
[mimetype] = mimetype.split(';');
|
|
140
|
+
|
|
141
|
+
// build a URL for the serialized asset
|
|
142
|
+
let [, ext] = mimetype.split('/');
|
|
143
|
+
let path = `/__serialized__/${uid}.${ext}`;
|
|
144
|
+
let url = new URL(path, document.URL).toString();
|
|
145
|
+
|
|
146
|
+
// return the url, base64 content, and mimetype
|
|
147
|
+
return {
|
|
148
|
+
url,
|
|
149
|
+
content,
|
|
150
|
+
mimetype
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function resourceFromText(uid, mimetype, data) {
|
|
154
|
+
// build a URL for the serialized asset
|
|
155
|
+
let [, ext] = mimetype.split('/');
|
|
156
|
+
let path = `/__serialized__/${uid}.${ext}`;
|
|
157
|
+
let url = new URL(path, document.URL).toString();
|
|
158
|
+
// converts text to base64
|
|
159
|
+
let content = window.btoa(data);
|
|
160
|
+
|
|
161
|
+
// return the url, base64 content, and mimetype
|
|
162
|
+
return {
|
|
163
|
+
url,
|
|
164
|
+
content,
|
|
165
|
+
mimetype
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Returns a mostly random uid.
|
|
170
|
+
function uid() {
|
|
171
|
+
return `_${Math.random().toString(36).substr(2, 9)}`;
|
|
172
|
+
}
|
|
173
|
+
function markElement(domElement, disableShadowDOM) {
|
|
174
|
+
var _domElement$tagName;
|
|
175
|
+
// Mark elements that are to be serialized later with a data attribute.
|
|
176
|
+
if (['input', 'textarea', 'select', 'iframe', 'canvas', 'video', 'style'].includes((_domElement$tagName = domElement.tagName) === null || _domElement$tagName === void 0 ? void 0 : _domElement$tagName.toLowerCase())) {
|
|
177
|
+
if (!domElement.getAttribute('data-percy-element-id')) {
|
|
178
|
+
domElement.setAttribute('data-percy-element-id', uid());
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// add special marker for shadow host
|
|
183
|
+
if (!disableShadowDOM && domElement.shadowRoot) {
|
|
184
|
+
if (!domElement.getAttribute('data-percy-shadow-host')) {
|
|
185
|
+
domElement.setAttribute('data-percy-shadow-host', '');
|
|
186
|
+
}
|
|
187
|
+
if (!domElement.getAttribute('data-percy-element-id')) {
|
|
188
|
+
domElement.setAttribute('data-percy-element-id', uid());
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
132
193
|
// Returns true if a stylesheet is a CSSOM-based stylesheet.
|
|
133
194
|
function isCSSOM(styleSheet) {
|
|
134
195
|
// no href, has a rulesheet, and has an owner node
|
|
@@ -150,11 +211,19 @@
|
|
|
150
211
|
function serializeCSSOM(_ref) {
|
|
151
212
|
let {
|
|
152
213
|
dom,
|
|
153
|
-
clone
|
|
214
|
+
clone,
|
|
215
|
+
warnings,
|
|
216
|
+
resources
|
|
154
217
|
} = _ref;
|
|
218
|
+
let adoptedStylesMap = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
155
219
|
for (let styleSheet of dom.styleSheets) {
|
|
156
220
|
if (isCSSOM(styleSheet)) {
|
|
157
221
|
let styleId = styleSheet.ownerNode.getAttribute('data-percy-element-id');
|
|
222
|
+
if (!styleId) {
|
|
223
|
+
let attributes = Array.from(styleSheet.ownerNode.attributes).map(attr => `${attr.name}: ${attr.value}`);
|
|
224
|
+
warnings.add(`stylesheet with attributes - [ ${attributes} ] - was not serialized`);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
158
227
|
let cloneOwnerNode = clone.querySelector(`[data-percy-element-id="${styleId}"]`);
|
|
159
228
|
if (styleSheetsMatch(styleSheet, cloneOwnerNode.sheet)) continue;
|
|
160
229
|
let style = document.createElement('style');
|
|
@@ -167,6 +236,29 @@
|
|
|
167
236
|
}
|
|
168
237
|
}
|
|
169
238
|
|
|
239
|
+
// clone stylesheets in shadowRoot
|
|
240
|
+
// https://github.com/WICG/construct-stylesheets/issues/93
|
|
241
|
+
if (!adoptedStylesMap) {
|
|
242
|
+
adoptedStylesMap = new Map();
|
|
243
|
+
}
|
|
244
|
+
for (let sheet of dom.adoptedStyleSheets) {
|
|
245
|
+
const styleLink = document.createElement('link');
|
|
246
|
+
styleLink.setAttribute('rel', 'stylesheet');
|
|
247
|
+
if (!adoptedStylesMap.has(sheet)) {
|
|
248
|
+
const styles = Array.from(sheet.cssRules).map(cssRule => cssRule.cssText).join('\n');
|
|
249
|
+
let resource = resourceFromText(uid(), 'text/css', styles);
|
|
250
|
+
resources.add(resource);
|
|
251
|
+
adoptedStylesMap.set(sheet, resource.url);
|
|
252
|
+
}
|
|
253
|
+
styleLink.setAttribute('data-percy-serialized-attribute-href', adoptedStylesMap.get(sheet));
|
|
254
|
+
if (clone.constructor.name === 'HTMLDocument') {
|
|
255
|
+
// handle document and iframe
|
|
256
|
+
clone.body.prepend(styleLink);
|
|
257
|
+
} else if (clone.constructor.name === 'ShadowRoot') {
|
|
258
|
+
clone.prepend(styleLink);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
170
262
|
// find stylesheets inside shadow host and recursively serialize them.
|
|
171
263
|
for (let shadowHost of dom.querySelectorAll('[data-percy-shadow-host]')) {
|
|
172
264
|
let percyElementId = shadowHost.getAttribute('data-percy-element-id');
|
|
@@ -174,32 +266,13 @@
|
|
|
174
266
|
if (shadowHost.shadowRoot && cloneShadowHost.shadowRoot) {
|
|
175
267
|
serializeCSSOM({
|
|
176
268
|
dom: shadowHost.shadowRoot,
|
|
177
|
-
clone: cloneShadowHost.shadowRoot
|
|
178
|
-
|
|
269
|
+
clone: cloneShadowHost.shadowRoot,
|
|
270
|
+
resources
|
|
271
|
+
}, adoptedStylesMap);
|
|
179
272
|
}
|
|
180
273
|
}
|
|
181
274
|
}
|
|
182
275
|
|
|
183
|
-
// Creates a resource object from an element's unique ID and data URL
|
|
184
|
-
function resourceFromDataURL(uid, dataURL) {
|
|
185
|
-
// split dataURL into desired parts
|
|
186
|
-
let [data, content] = dataURL.split(',');
|
|
187
|
-
let [, mimetype] = data.split(':');
|
|
188
|
-
[mimetype] = mimetype.split(';');
|
|
189
|
-
|
|
190
|
-
// build a URL for the serialized asset
|
|
191
|
-
let [, ext] = mimetype.split('/');
|
|
192
|
-
let path = `/__serialized__/${uid}.${ext}`;
|
|
193
|
-
let url = new URL(path, document.URL).toString();
|
|
194
|
-
|
|
195
|
-
// return the url, base64 content, and mimetype
|
|
196
|
-
return {
|
|
197
|
-
url,
|
|
198
|
-
content,
|
|
199
|
-
mimetype
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
|
|
203
276
|
// Serialize in-memory canvas elements into images.
|
|
204
277
|
function serializeCanvas(_ref) {
|
|
205
278
|
let {
|
|
@@ -222,7 +295,6 @@
|
|
|
222
295
|
resources.add(resource);
|
|
223
296
|
|
|
224
297
|
// create an image element in the cloned dom
|
|
225
|
-
// TODO: this works, verify if this is fine?
|
|
226
298
|
let img = document.createElement('img');
|
|
227
299
|
// use a data attribute to avoid making a real request
|
|
228
300
|
img.setAttribute('data-percy-serialized-attribute-src', resource.url);
|
|
@@ -316,30 +388,6 @@
|
|
|
316
388
|
}
|
|
317
389
|
}
|
|
318
390
|
|
|
319
|
-
// Returns a mostly random uid.
|
|
320
|
-
function uid() {
|
|
321
|
-
return `_${Math.random().toString(36).substr(2, 9)}`;
|
|
322
|
-
}
|
|
323
|
-
function markElement(domElement) {
|
|
324
|
-
var _domElement$tagName;
|
|
325
|
-
// Mark elements that are to be serialized later with a data attribute.
|
|
326
|
-
if (['input', 'textarea', 'select', 'iframe', 'canvas', 'video', 'style'].includes((_domElement$tagName = domElement.tagName) === null || _domElement$tagName === void 0 ? void 0 : _domElement$tagName.toLowerCase())) {
|
|
327
|
-
if (!domElement.getAttribute('data-percy-element-id')) {
|
|
328
|
-
domElement.setAttribute('data-percy-element-id', uid());
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
// add special marker for shadow host
|
|
333
|
-
if (domElement.shadowRoot) {
|
|
334
|
-
if (!domElement.getAttribute('data-percy-shadow-host')) {
|
|
335
|
-
domElement.setAttribute('data-percy-shadow-host', '');
|
|
336
|
-
}
|
|
337
|
-
if (!domElement.getAttribute('data-percy-element-id')) {
|
|
338
|
-
domElement.setAttribute('data-percy-element-id', uid());
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
391
|
/**
|
|
344
392
|
* Custom deep clone function that replaces Percy's current clone behavior.
|
|
345
393
|
* This enables us to capture shadow DOM in snapshots. It takes advantage of `attachShadow`'s mode option set to open
|
|
@@ -347,7 +395,7 @@
|
|
|
347
395
|
*/
|
|
348
396
|
|
|
349
397
|
// returns document fragment
|
|
350
|
-
const deepClone = host => {
|
|
398
|
+
const deepClone = (host, disableShadowDOM) => {
|
|
351
399
|
// clones shadow DOM and light DOM for a given node
|
|
352
400
|
let cloneNode = (node, parent) => {
|
|
353
401
|
let walkTree = (nextn, nextp) => {
|
|
@@ -358,12 +406,12 @@
|
|
|
358
406
|
};
|
|
359
407
|
|
|
360
408
|
// mark the node before cloning
|
|
361
|
-
markElement(node);
|
|
409
|
+
markElement(node, disableShadowDOM);
|
|
362
410
|
let clone = node.cloneNode();
|
|
363
411
|
parent.appendChild(clone);
|
|
364
412
|
|
|
365
413
|
// clone shadow DOM
|
|
366
|
-
if (node.shadowRoot) {
|
|
414
|
+
if (node.shadowRoot && !disableShadowDOM) {
|
|
367
415
|
// create shadowRoot
|
|
368
416
|
if (clone.shadowRoot) {
|
|
369
417
|
// it may be set up in a custom element's constructor
|
|
@@ -373,15 +421,6 @@
|
|
|
373
421
|
mode: 'open'
|
|
374
422
|
});
|
|
375
423
|
}
|
|
376
|
-
|
|
377
|
-
// clone stylesheets in shadowRoot
|
|
378
|
-
for (let sheet of node.shadowRoot.adoptedStyleSheets) {
|
|
379
|
-
let cssText = Array.from(sheet.rules).map(rule => rule.cssText).join('\n');
|
|
380
|
-
let style = document.createElement('style');
|
|
381
|
-
style.appendChild(document.createTextNode(cssText));
|
|
382
|
-
clone.shadowRoot.prepend(style);
|
|
383
|
-
}
|
|
384
|
-
|
|
385
424
|
// clone dom elements
|
|
386
425
|
walkTree(node.shadowRoot.firstChild, clone.shadowRoot);
|
|
387
426
|
}
|
|
@@ -397,12 +436,13 @@
|
|
|
397
436
|
/**
|
|
398
437
|
* Deep clone a document while also preserving shadow roots and converting adoptedStylesheets to <style> tags.
|
|
399
438
|
*/
|
|
400
|
-
const cloneNodeAndShadow =
|
|
401
|
-
let
|
|
439
|
+
const cloneNodeAndShadow = ctx => {
|
|
440
|
+
let cloneDocumentElement = deepClone(ctx.dom.documentElement, ctx.disableShadowDOM);
|
|
441
|
+
// TODO: we're not properly appending documentElement (html node) in the clone document, this can cause side effects in original document.
|
|
402
442
|
// convert document fragment to document object
|
|
403
|
-
let cloneDocument =
|
|
443
|
+
let cloneDocument = ctx.dom.cloneNode();
|
|
404
444
|
// dissolve document fragment in clone document
|
|
405
|
-
cloneDocument.appendChild(
|
|
445
|
+
cloneDocument.appendChild(cloneDocumentElement);
|
|
406
446
|
return cloneDocument;
|
|
407
447
|
};
|
|
408
448
|
|
|
@@ -447,7 +487,9 @@
|
|
|
447
487
|
document.addEventListener("DOMContentLoaded", () => reversePolyFill());
|
|
448
488
|
}
|
|
449
489
|
`.replace(/(\n|\s{2}|\t)/g, '');
|
|
450
|
-
|
|
490
|
+
|
|
491
|
+
// run polyfill as first thing post dom content is loaded
|
|
492
|
+
clone.head.prepend(scriptEl);
|
|
451
493
|
}
|
|
452
494
|
|
|
453
495
|
// Returns a copy or new doctype for a document.
|
|
@@ -484,17 +526,19 @@
|
|
|
484
526
|
// allow snake_case or camelCase
|
|
485
527
|
enableJavaScript = options === null || options === void 0 ? void 0 : options.enable_javascript,
|
|
486
528
|
domTransformation = options === null || options === void 0 ? void 0 : options.dom_transformation,
|
|
487
|
-
stringifyResponse = options === null || options === void 0 ? void 0 : options.stringify_response
|
|
529
|
+
stringifyResponse = options === null || options === void 0 ? void 0 : options.stringify_response,
|
|
530
|
+
disableShadowDOM = options === null || options === void 0 ? void 0 : options.disable_shadow_dom
|
|
488
531
|
} = options || {};
|
|
489
532
|
|
|
490
533
|
// keep certain records throughout serialization
|
|
491
534
|
let ctx = {
|
|
492
535
|
resources: new Set(),
|
|
493
536
|
warnings: new Set(),
|
|
494
|
-
enableJavaScript
|
|
537
|
+
enableJavaScript,
|
|
538
|
+
disableShadowDOM
|
|
495
539
|
};
|
|
496
540
|
ctx.dom = dom;
|
|
497
|
-
ctx.clone = cloneNodeAndShadow(ctx
|
|
541
|
+
ctx.clone = cloneNodeAndShadow(ctx);
|
|
498
542
|
serializeInputElements(ctx);
|
|
499
543
|
serializeFrames(ctx);
|
|
500
544
|
serializeVideos(ctx);
|
|
@@ -509,7 +553,9 @@
|
|
|
509
553
|
console.error('Could not transform the dom:', err.message);
|
|
510
554
|
}
|
|
511
555
|
}
|
|
512
|
-
|
|
556
|
+
if (!disableShadowDOM) {
|
|
557
|
+
injectDeclarativeShadowDOMPolyfill(ctx);
|
|
558
|
+
}
|
|
513
559
|
let result = {
|
|
514
560
|
html: serializeHTML(ctx),
|
|
515
561
|
warnings: Array.from(ctx.warnings),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.js","sources":["../src/prepare-dom.js","../src/serialize-inputs.js","../src/serialize-frames.js","../src/serialize-cssom.js","../src/utils.js","../src/serialize-canvas.js","../src/serialize-video.js","../src/serialize-dom.js"],"sourcesContent":["// Returns a mostly random uid.\nfunction uid() {\n return `_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n// Marks elements that are to be serialized later with a data attribute.\nexport function prepareDOM(dom) {\n for (let elem of dom.querySelectorAll('input, textarea, select, iframe, canvas, video, style')) {\n if (!elem.getAttribute('data-percy-element-id')) {\n elem.setAttribute('data-percy-element-id', uid());\n }\n }\n\n return dom;\n}\n\nexport default prepareDOM;\n","// Translates JavaScript properties of inputs into DOM attributes.\nexport function serializeInputElements({ dom, clone }) {\n for (let elem of dom.querySelectorAll('input, textarea, select')) {\n let inputId = elem.getAttribute('data-percy-element-id');\n let cloneEl = clone.querySelector(`[data-percy-element-id=\"${inputId}\"]`);\n\n switch (elem.type) {\n case 'checkbox':\n case 'radio':\n if (elem.checked) {\n cloneEl.setAttribute('checked', '');\n }\n break;\n case 'select-one':\n if (elem.selectedIndex !== -1) {\n cloneEl.options[elem.selectedIndex].setAttribute('selected', 'true');\n }\n break;\n case 'select-multiple':\n for (let option of elem.selectedOptions) {\n cloneEl.options[option.index].setAttribute('selected', 'true');\n }\n break;\n case 'textarea':\n cloneEl.innerHTML = elem.value;\n break;\n default:\n cloneEl.setAttribute('value', elem.value);\n }\n }\n}\n\nexport default serializeInputElements;\n","import serializeDOM from './serialize-dom';\n\n// Adds a `<base>` element to the serialized iframe's `<head>`. This is necessary when\n// embedded documents are serialized and their contents become root-relative.\nfunction setBaseURI(dom) {\n if (!new URL(dom.baseURI).hostname) return;\n\n let $base = document.createElement('base');\n $base.href = dom.baseURI;\n\n dom.querySelector('head').prepend($base);\n}\n\n// Recursively serializes iframe documents into srcdoc attributes.\nexport function serializeFrames({ dom, clone, warnings, resources, enableJavaScript }) {\n for (let frame of dom.querySelectorAll('iframe')) {\n let percyElementId = frame.getAttribute('data-percy-element-id');\n let cloneEl = clone.querySelector(`[data-percy-element-id=\"${percyElementId}\"]`);\n let builtWithJs = !frame.srcdoc && (!frame.src || frame.src.split(':')[0] === 'javascript');\n\n // delete frames within the head since they usually break pages when\n // rerendered and do not effect the visuals of a page\n if (clone.head.contains(cloneEl)) {\n cloneEl.remove();\n\n // if the frame document is accessible and not empty, we can serialize it\n } else if (frame.contentDocument && frame.contentDocument.documentElement) {\n // js is enabled and this frame was built with js, don't serialize it\n if (enableJavaScript && builtWithJs) continue;\n\n // the frame has yet to load and wasn't built with js, it is unsafe to serialize\n if (!builtWithJs && !frame.contentWindow.performance.timing.loadEventEnd) continue;\n\n // recersively serialize contents\n let serialized = serializeDOM({\n domTransformation: setBaseURI,\n dom: frame.contentDocument,\n enableJavaScript\n });\n\n // append serialized warnings and resources\n /* istanbul ignore next: warnings not implemented yet */\n for (let w of serialized.warnings) warnings.add(w);\n for (let r of serialized.resources) resources.add(r);\n\n // assign serialized html to srcdoc and remove src\n cloneEl.setAttribute('srcdoc', serialized.html);\n cloneEl.removeAttribute('src');\n\n // delete inaccessible frames built with js when js is disabled because they\n // break asset discovery by creating non-captured requests that hang\n } else if (!enableJavaScript && builtWithJs) {\n cloneEl.remove();\n }\n }\n}\n\nexport default serializeFrames;\n","// Returns true if a stylesheet is a CSSOM-based stylesheet.\nfunction isCSSOM(styleSheet) {\n // no href, has a rulesheet, and has an owner node\n return !styleSheet.href && styleSheet.cssRules && styleSheet.ownerNode;\n}\n\n// Returns false if any stylesheet rules do not match between two stylesheets\nfunction styleSheetsMatch(sheetA, sheetB) {\n for (let i = 0; i < sheetA.cssRules.length; i++) {\n let ruleA = sheetA.cssRules[i].cssText;\n let ruleB = sheetB.cssRules[i]?.cssText;\n if (ruleA !== ruleB) return false;\n }\n\n return true;\n}\n\n// Outputs in-memory CSSOM into their respective DOM nodes.\nexport function serializeCSSOM({ dom, clone }) {\n for (let styleSheet of dom.styleSheets) {\n if (isCSSOM(styleSheet)) {\n let styleId = styleSheet.ownerNode.getAttribute('data-percy-element-id');\n let cloneOwnerNode = clone.querySelector(`[data-percy-element-id=\"${styleId}\"]`);\n if (styleSheetsMatch(styleSheet, cloneOwnerNode.sheet)) continue;\n let style = clone.createElement('style');\n\n style.type = 'text/css';\n style.setAttribute('data-percy-element-id', styleId);\n style.setAttribute('data-percy-cssom-serialized', 'true');\n style.innerHTML = Array.from(styleSheet.cssRules)\n .map(cssRule => cssRule.cssText).join('\\n');\n\n cloneOwnerNode.parentNode.insertBefore(style, cloneOwnerNode.nextSibling);\n cloneOwnerNode.remove();\n }\n }\n}\n\nexport default serializeCSSOM;\n","// Creates a resource object from an element's unique ID and data URL\nexport function resourceFromDataURL(uid, dataURL) {\n // split dataURL into desired parts\n let [data, content] = dataURL.split(',');\n let [, mimetype] = data.split(':');\n [mimetype] = mimetype.split(';');\n\n // build a URL for the serialized asset\n let [, ext] = mimetype.split('/');\n let path = `/__serialized__/${uid}.${ext}`;\n let url = new URL(path, document.URL).toString();\n\n // return the url, base64 content, and mimetype\n return { url, content, mimetype };\n}\n","import { resourceFromDataURL } from './utils.js';\n\n// Serialize in-memory canvas elements into images.\nexport function serializeCanvas({ dom, clone, resources }) {\n for (let canvas of dom.querySelectorAll('canvas')) {\n // Note: the `.toDataURL` API requires WebGL canvas elements to use\n // `preserveDrawingBuffer: true`. This is because `.toDataURL` uses the\n // drawing buffer, which is cleared after each render for WebGL by default.\n let dataUrl = canvas.toDataURL();\n\n // skip empty canvases\n if (!dataUrl || dataUrl === 'data:,') continue;\n\n // get the element's percy id and create a resource for it\n let percyElementId = canvas.getAttribute('data-percy-element-id');\n let resource = resourceFromDataURL(percyElementId, dataUrl);\n resources.add(resource);\n\n // create an image element in the cloned dom\n let img = clone.createElement('img');\n // use a data attribute to avoid making a real request\n img.setAttribute('data-percy-serialized-attribute-src', resource.url);\n\n // copy canvas element attributes to the image element such as style, class,\n // or data attributes that may be targeted by CSS\n for (let { name, value } of canvas.attributes) {\n img.setAttribute(name, value);\n }\n\n // mark the image as serialized (can be targeted by CSS)\n img.setAttribute('data-percy-canvas-serialized', '');\n // set a default max width to account for canvases that might resize with JS\n img.style.maxWidth = img.style.maxWidth || '100%';\n\n // insert the image into the cloned DOM and remove the cloned canvas element\n let cloneEl = clone.querySelector(`[data-percy-element-id=${percyElementId}]`);\n cloneEl.parentElement.insertBefore(img, cloneEl);\n cloneEl.remove();\n }\n}\n\nexport default serializeCanvas;\n","import { resourceFromDataURL } from './utils.js';\n\n// Captures the current frame of videos and sets the poster image\nexport function serializeVideos({ dom, clone, resources }) {\n for (let video of dom.querySelectorAll('video')) {\n // if the video already has a poster image, no work for us to do\n if (video.getAttribute('poster')) continue;\n\n let videoId = video.getAttribute('data-percy-element-id');\n let cloneEl = clone.querySelector(`[data-percy-element-id=\"${videoId}\"]`);\n let canvas = document.createElement('canvas');\n let width = canvas.width = video.videoWidth;\n let height = canvas.height = video.videoHeight;\n let dataUrl;\n\n canvas.getContext('2d').drawImage(video, 0, 0, width, height);\n try { dataUrl = canvas.toDataURL(); } catch {}\n\n // if the canvas produces a blank image, skip\n if (!dataUrl || dataUrl === 'data:,') continue;\n\n // create a resource from the serialized data url\n let resource = resourceFromDataURL(videoId, dataUrl);\n resources.add(resource);\n\n // use a data attribute to avoid making a real request\n cloneEl.setAttribute('data-percy-serialized-attribute-poster', resource.url);\n }\n}\n\nexport default serializeVideos;\n","import prepareDOM from './prepare-dom';\nimport serializeInputs from './serialize-inputs';\nimport serializeFrames from './serialize-frames';\nimport serializeCSSOM from './serialize-cssom';\nimport serializeCanvas from './serialize-canvas';\nimport serializeVideos from './serialize-video';\n\n// Returns a copy or new doctype for a document.\nfunction doctype(dom) {\n let { name = 'html', publicId = '', systemId = '' } = dom?.doctype ?? {};\n let deprecated = '';\n\n if (publicId && systemId) {\n deprecated = ` PUBLIC \"${publicId}\" \"${systemId}\"`;\n } else if (publicId) {\n deprecated = ` PUBLIC \"${publicId}\"`;\n } else if (systemId) {\n deprecated = ` SYSTEM \"${systemId}\"`;\n }\n\n return `<!DOCTYPE ${name}${deprecated}>`;\n}\n\n// Serializes and returns the cloned DOM as an HTML string\nfunction serializeHTML(ctx) {\n let html = ctx.clone.documentElement.outerHTML;\n // replace serialized data attributes with real attributes\n html = html.replace(/ data-percy-serialized-attribute-(\\w+?)=/ig, ' $1=');\n // include the doctype with the html string\n return doctype(ctx.dom) + html;\n}\n\n// Serializes a document and returns the resulting DOM string.\nexport function serializeDOM(options) {\n let {\n dom = document,\n // allow snake_case or camelCase\n enableJavaScript = options?.enable_javascript,\n domTransformation = options?.dom_transformation,\n stringifyResponse = options?.stringify_response\n } = options || {};\n\n // keep certain records throughout serialization\n let ctx = {\n resources: new Set(),\n warnings: new Set(),\n enableJavaScript\n };\n\n ctx.dom = prepareDOM(dom);\n ctx.clone = ctx.dom.cloneNode(true);\n\n serializeInputs(ctx);\n serializeFrames(ctx);\n serializeVideos(ctx);\n\n if (!enableJavaScript) {\n serializeCSSOM(ctx);\n serializeCanvas(ctx);\n }\n\n if (domTransformation) {\n try {\n domTransformation(ctx.clone.documentElement);\n } catch (err) {\n console.error('Could not transform the dom:', err.message);\n }\n }\n\n let result = {\n html: serializeHTML(ctx),\n warnings: Array.from(ctx.warnings),\n resources: Array.from(ctx.resources)\n };\n\n return stringifyResponse\n ? JSON.stringify(result)\n : result;\n}\n\nexport default serializeDOM;\n"],"names":["uid","Math","random","toString","substr","prepareDOM","dom","elem","querySelectorAll","getAttribute","setAttribute","serializeInputElements","clone","inputId","cloneEl","querySelector","type","checked","selectedIndex","options","option","selectedOptions","index","innerHTML","value","setBaseURI","URL","baseURI","hostname","$base","document","createElement","href","prepend","serializeFrames","warnings","resources","enableJavaScript","frame","percyElementId","builtWithJs","srcdoc","src","split","head","contains","remove","contentDocument","documentElement","contentWindow","performance","timing","loadEventEnd","serialized","serializeDOM","domTransformation","w","add","r","html","removeAttribute","isCSSOM","styleSheet","cssRules","ownerNode","styleSheetsMatch","sheetA","sheetB","i","length","ruleA","cssText","ruleB","serializeCSSOM","styleSheets","styleId","cloneOwnerNode","sheet","style","Array","from","map","cssRule","join","parentNode","insertBefore","nextSibling","resourceFromDataURL","dataURL","data","content","mimetype","ext","path","url","serializeCanvas","canvas","dataUrl","toDataURL","resource","img","name","attributes","maxWidth","parentElement","serializeVideos","video","videoId","width","videoWidth","height","videoHeight","getContext","drawImage","doctype","publicId","systemId","deprecated","serializeHTML","ctx","outerHTML","replace","enable_javascript","dom_transformation","stringifyResponse","stringify_response","Set","cloneNode","serializeInputs","err","console","error","message","result","JSON","stringify"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@percy/dom",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.2-alpha.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -34,5 +34,5 @@
|
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"interactor.js": "^2.0.0-beta.10"
|
|
36
36
|
},
|
|
37
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "d9bf82889731f5cdc3f7fa4fe836cc5232ee8fb6"
|
|
38
38
|
}
|