@percy/dom 1.19.2-alpha.0 → 1.19.2
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/dist/bundle.js +63 -106
- package/package.json +2 -2
- package/dist/bundle.js.map +0 -1
package/dist/bundle.js
CHANGED
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
function serializeInputElements(_ref) {
|
|
11
11
|
let {
|
|
12
12
|
dom,
|
|
13
|
-
clone
|
|
13
|
+
clone,
|
|
14
|
+
warnings
|
|
14
15
|
} = _ref;
|
|
15
16
|
for (let elem of dom.querySelectorAll('input, textarea, select')) {
|
|
16
17
|
let inputId = elem.getAttribute('data-percy-element-id');
|
|
@@ -39,23 +40,12 @@
|
|
|
39
40
|
cloneEl.setAttribute('value', elem.value);
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
|
-
|
|
43
|
-
// find inputs inside shadow host and recursively serialize them.
|
|
44
|
-
for (let shadowHost of dom.querySelectorAll('[data-percy-shadow-host]')) {
|
|
45
|
-
let percyElementId = shadowHost.getAttribute('data-percy-element-id');
|
|
46
|
-
let cloneShadowHost = clone.querySelector(`[data-percy-element-id="${percyElementId}"]`);
|
|
47
|
-
if (shadowHost.shadowRoot && cloneShadowHost.shadowRoot) {
|
|
48
|
-
serializeInputElements({
|
|
49
|
-
dom: shadowHost.shadowRoot,
|
|
50
|
-
clone: cloneShadowHost.shadowRoot
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
43
|
}
|
|
55
44
|
|
|
56
45
|
// Adds a `<base>` element to the serialized iframe's `<head>`. This is necessary when
|
|
57
46
|
// embedded documents are serialized and their contents become root-relative.
|
|
58
47
|
function setBaseURI(dom) {
|
|
48
|
+
/* istanbul ignore if: sanity check */
|
|
59
49
|
if (!new URL(dom.baseURI).hostname) return;
|
|
60
50
|
let $base = document.createElement('base');
|
|
61
51
|
$base.href = dom.baseURI;
|
|
@@ -114,21 +104,6 @@
|
|
|
114
104
|
cloneEl.remove();
|
|
115
105
|
}
|
|
116
106
|
}
|
|
117
|
-
|
|
118
|
-
// find iframes inside shadow host and recursively serialize them.
|
|
119
|
-
for (let shadowHost of dom.querySelectorAll('[data-percy-shadow-host]')) {
|
|
120
|
-
let percyElementId = shadowHost.getAttribute('data-percy-element-id');
|
|
121
|
-
let cloneShadowHost = clone.querySelector(`[data-percy-element-id="${percyElementId}"]`);
|
|
122
|
-
if (shadowHost.shadowRoot && cloneShadowHost.shadowRoot) {
|
|
123
|
-
serializeFrames({
|
|
124
|
-
dom: shadowHost.shadowRoot,
|
|
125
|
-
clone: cloneShadowHost.shadowRoot,
|
|
126
|
-
warnings,
|
|
127
|
-
resources,
|
|
128
|
-
enableJavaScript
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
107
|
}
|
|
133
108
|
|
|
134
109
|
// Creates a resource object from an element's unique ID and data URL
|
|
@@ -181,9 +156,7 @@
|
|
|
181
156
|
|
|
182
157
|
// add special marker for shadow host
|
|
183
158
|
if (!disableShadowDOM && domElement.shadowRoot) {
|
|
184
|
-
|
|
185
|
-
domElement.setAttribute('data-percy-shadow-host', '');
|
|
186
|
-
}
|
|
159
|
+
domElement.setAttribute('data-percy-shadow-host', '');
|
|
187
160
|
if (!domElement.getAttribute('data-percy-element-id')) {
|
|
188
161
|
domElement.setAttribute('data-percy-element-id', uid());
|
|
189
162
|
}
|
|
@@ -206,26 +179,35 @@
|
|
|
206
179
|
}
|
|
207
180
|
return true;
|
|
208
181
|
}
|
|
209
|
-
|
|
210
|
-
|
|
182
|
+
function styleSheetFromNode(node) {
|
|
183
|
+
/* istanbul ignore if: sanity check */
|
|
184
|
+
if (node.sheet) return node.sheet;
|
|
185
|
+
|
|
186
|
+
// Cloned style nodes don't have a sheet instance unless they are within
|
|
187
|
+
// a document; we get it by temporarily adding the rules to DOM
|
|
188
|
+
const tempStyle = document.createElement('style');
|
|
189
|
+
tempStyle.setAttribute('data-percy-style-helper', '');
|
|
190
|
+
tempStyle.innerHTML = node.innerHTML;
|
|
191
|
+
const clone = document.cloneNode();
|
|
192
|
+
clone.appendChild(tempStyle);
|
|
193
|
+
const sheet = tempStyle.sheet;
|
|
194
|
+
// Cleanup node
|
|
195
|
+
tempStyle.remove();
|
|
196
|
+
return sheet;
|
|
197
|
+
}
|
|
211
198
|
function serializeCSSOM(_ref) {
|
|
212
199
|
let {
|
|
213
200
|
dom,
|
|
214
201
|
clone,
|
|
215
|
-
|
|
216
|
-
|
|
202
|
+
resources,
|
|
203
|
+
cache
|
|
217
204
|
} = _ref;
|
|
218
|
-
|
|
205
|
+
// in-memory CSSOM into their respective DOM nodes.
|
|
219
206
|
for (let styleSheet of dom.styleSheets) {
|
|
220
207
|
if (isCSSOM(styleSheet)) {
|
|
221
208
|
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
|
-
}
|
|
227
209
|
let cloneOwnerNode = clone.querySelector(`[data-percy-element-id="${styleId}"]`);
|
|
228
|
-
if (styleSheetsMatch(styleSheet, cloneOwnerNode
|
|
210
|
+
if (styleSheetsMatch(styleSheet, styleSheetFromNode(cloneOwnerNode))) continue;
|
|
229
211
|
let style = document.createElement('style');
|
|
230
212
|
style.type = 'text/css';
|
|
231
213
|
style.setAttribute('data-percy-element-id', styleId);
|
|
@@ -236,41 +218,28 @@
|
|
|
236
218
|
}
|
|
237
219
|
}
|
|
238
220
|
|
|
239
|
-
// clone
|
|
240
|
-
// https://github.com/WICG/construct-stylesheets/issues/93
|
|
241
|
-
if (!adoptedStylesMap) {
|
|
242
|
-
adoptedStylesMap = new Map();
|
|
243
|
-
}
|
|
221
|
+
// clone Adopted Stylesheets
|
|
222
|
+
// Regarding ordering of the adopted stylesheets - https://github.com/WICG/construct-stylesheets/issues/93
|
|
244
223
|
for (let sheet of dom.adoptedStyleSheets) {
|
|
245
224
|
const styleLink = document.createElement('link');
|
|
246
225
|
styleLink.setAttribute('rel', 'stylesheet');
|
|
247
|
-
if (!
|
|
226
|
+
if (!cache.has(sheet)) {
|
|
248
227
|
const styles = Array.from(sheet.cssRules).map(cssRule => cssRule.cssText).join('\n');
|
|
249
228
|
let resource = resourceFromText(uid(), 'text/css', styles);
|
|
250
229
|
resources.add(resource);
|
|
251
|
-
|
|
230
|
+
cache.set(sheet, resource.url);
|
|
252
231
|
}
|
|
253
|
-
styleLink.setAttribute('data-percy-
|
|
254
|
-
|
|
232
|
+
styleLink.setAttribute('data-percy-adopted-stylesheets-serialized', 'true');
|
|
233
|
+
styleLink.setAttribute('data-percy-serialized-attribute-href', cache.get(sheet));
|
|
234
|
+
|
|
235
|
+
/* istanbul ignore next: tested, but coverage is stripped */
|
|
236
|
+
if (clone.constructor.name === 'HTMLDocument' || clone.constructor.name === 'DocumentFragment') {
|
|
255
237
|
// handle document and iframe
|
|
256
238
|
clone.body.prepend(styleLink);
|
|
257
239
|
} else if (clone.constructor.name === 'ShadowRoot') {
|
|
258
240
|
clone.prepend(styleLink);
|
|
259
241
|
}
|
|
260
242
|
}
|
|
261
|
-
|
|
262
|
-
// find stylesheets inside shadow host and recursively serialize them.
|
|
263
|
-
for (let shadowHost of dom.querySelectorAll('[data-percy-shadow-host]')) {
|
|
264
|
-
let percyElementId = shadowHost.getAttribute('data-percy-element-id');
|
|
265
|
-
let cloneShadowHost = clone.querySelector(`[data-percy-element-id="${percyElementId}"]`);
|
|
266
|
-
if (shadowHost.shadowRoot && cloneShadowHost.shadowRoot) {
|
|
267
|
-
serializeCSSOM({
|
|
268
|
-
dom: shadowHost.shadowRoot,
|
|
269
|
-
clone: cloneShadowHost.shadowRoot,
|
|
270
|
-
resources
|
|
271
|
-
}, adoptedStylesMap);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
243
|
}
|
|
275
244
|
|
|
276
245
|
// Serialize in-memory canvas elements into images.
|
|
@@ -323,19 +292,6 @@
|
|
|
323
292
|
}
|
|
324
293
|
cloneEl.remove();
|
|
325
294
|
}
|
|
326
|
-
|
|
327
|
-
// find canvas inside shadow host and recursively serialize them.
|
|
328
|
-
for (let shadowHost of dom.querySelectorAll('[data-percy-shadow-host]')) {
|
|
329
|
-
let percyElementId = shadowHost.getAttribute('data-percy-element-id');
|
|
330
|
-
let cloneShadowHost = clone.querySelector(`[data-percy-element-id="${percyElementId}"]`);
|
|
331
|
-
if (shadowHost.shadowRoot && cloneShadowHost.shadowRoot) {
|
|
332
|
-
serializeCanvas({
|
|
333
|
-
dom: shadowHost.shadowRoot,
|
|
334
|
-
clone: cloneShadowHost.shadowRoot,
|
|
335
|
-
resources
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
295
|
}
|
|
340
296
|
|
|
341
297
|
// Captures the current frame of videos and sets the poster image
|
|
@@ -372,20 +328,6 @@
|
|
|
372
328
|
// use a data attribute to avoid making a real request
|
|
373
329
|
cloneEl.setAttribute('data-percy-serialized-attribute-poster', resource.url);
|
|
374
330
|
}
|
|
375
|
-
|
|
376
|
-
// find video inside shadow host and recursively serialize them.
|
|
377
|
-
for (let shadowHost of dom.querySelectorAll('[data-percy-shadow-host]')) {
|
|
378
|
-
let percyElementId = shadowHost.getAttribute('data-percy-element-id');
|
|
379
|
-
let cloneShadowHost = clone.querySelector(`[data-percy-element-id="${percyElementId}"]`);
|
|
380
|
-
if (shadowHost.shadowRoot && cloneShadowHost.shadowRoot) {
|
|
381
|
-
serializeVideos({
|
|
382
|
-
dom: shadowHost.shadowRoot,
|
|
383
|
-
clone: cloneShadowHost.shadowRoot,
|
|
384
|
-
resources,
|
|
385
|
-
warnings
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
331
|
}
|
|
390
332
|
|
|
391
333
|
/**
|
|
@@ -437,13 +379,11 @@
|
|
|
437
379
|
* Deep clone a document while also preserving shadow roots and converting adoptedStylesheets to <style> tags.
|
|
438
380
|
*/
|
|
439
381
|
const cloneNodeAndShadow = ctx => {
|
|
440
|
-
let
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
cloneDocument.appendChild(cloneDocumentElement);
|
|
446
|
-
return cloneDocument;
|
|
382
|
+
let cloneDocumentFragment = deepClone(ctx.dom.documentElement, ctx.disableShadowDOM);
|
|
383
|
+
cloneDocumentFragment.documentElement = cloneDocumentFragment.firstChild;
|
|
384
|
+
cloneDocumentFragment.head = cloneDocumentFragment.querySelector('head');
|
|
385
|
+
cloneDocumentFragment.body = cloneDocumentFragment.querySelector('body');
|
|
386
|
+
return cloneDocumentFragment;
|
|
447
387
|
};
|
|
448
388
|
|
|
449
389
|
/**
|
|
@@ -466,7 +406,7 @@
|
|
|
466
406
|
// Since only chromium currently supports declarative shadow DOM - https://caniuse.com/declarative-shadow-dom
|
|
467
407
|
function injectDeclarativeShadowDOMPolyfill(ctx) {
|
|
468
408
|
let clone = ctx.clone;
|
|
469
|
-
let scriptEl =
|
|
409
|
+
let scriptEl = document.createElement('script');
|
|
470
410
|
scriptEl.setAttribute('id', '__percy_shadowdom_helper');
|
|
471
411
|
scriptEl.setAttribute('data-percy-injected', true);
|
|
472
412
|
scriptEl.innerHTML = `
|
|
@@ -518,6 +458,28 @@
|
|
|
518
458
|
// include the doctype with the html string
|
|
519
459
|
return doctype(ctx.dom) + html;
|
|
520
460
|
}
|
|
461
|
+
function serializeElements(ctx) {
|
|
462
|
+
serializeInputElements(ctx);
|
|
463
|
+
serializeFrames(ctx);
|
|
464
|
+
serializeVideos(ctx);
|
|
465
|
+
if (!ctx.enableJavaScript) {
|
|
466
|
+
serializeCSSOM(ctx);
|
|
467
|
+
serializeCanvas(ctx);
|
|
468
|
+
}
|
|
469
|
+
for (const shadowHost of ctx.dom.querySelectorAll('[data-percy-shadow-host]')) {
|
|
470
|
+
let percyElementId = shadowHost.getAttribute('data-percy-element-id');
|
|
471
|
+
let cloneShadowHost = ctx.clone.querySelector(`[data-percy-element-id="${percyElementId}"]`);
|
|
472
|
+
if (shadowHost.shadowRoot && cloneShadowHost.shadowRoot) {
|
|
473
|
+
serializeElements({
|
|
474
|
+
...ctx,
|
|
475
|
+
dom: shadowHost.shadowRoot,
|
|
476
|
+
clone: cloneShadowHost.shadowRoot
|
|
477
|
+
});
|
|
478
|
+
} else {
|
|
479
|
+
ctx.warnings.add('data-percy-shadow-host does not have shadowRoot');
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
521
483
|
|
|
522
484
|
// Serializes a document and returns the resulting DOM string.
|
|
523
485
|
function serializeDOM(options) {
|
|
@@ -534,18 +496,13 @@
|
|
|
534
496
|
let ctx = {
|
|
535
497
|
resources: new Set(),
|
|
536
498
|
warnings: new Set(),
|
|
499
|
+
cache: new Map(),
|
|
537
500
|
enableJavaScript,
|
|
538
501
|
disableShadowDOM
|
|
539
502
|
};
|
|
540
503
|
ctx.dom = dom;
|
|
541
504
|
ctx.clone = cloneNodeAndShadow(ctx);
|
|
542
|
-
|
|
543
|
-
serializeFrames(ctx);
|
|
544
|
-
serializeVideos(ctx);
|
|
545
|
-
if (!enableJavaScript) {
|
|
546
|
-
serializeCSSOM(ctx);
|
|
547
|
-
serializeCanvas(ctx);
|
|
548
|
-
}
|
|
505
|
+
serializeElements(ctx);
|
|
549
506
|
if (domTransformation) {
|
|
550
507
|
try {
|
|
551
508
|
domTransformation(ctx.clone.documentElement);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@percy/dom",
|
|
3
|
-
"version": "1.19.2
|
|
3
|
+
"version": "1.19.2",
|
|
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": "609ae53aa84ab2f7054a21214b36dccd71025780"
|
|
38
38
|
}
|
package/dist/bundle.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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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"}
|