Skip to content

Commit 1bfa38c

Browse files
committed
use node.baseURI for stringifying stylesheet hrefs
1 parent fd9d274 commit 1bfa38c

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

.changeset/lucky-trainers-joke.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"rrweb-snapshot": patch
3+
---
4+
5+
use ownerNode.baseURI for stringifying sheet hrefs

packages/rrweb-snapshot/src/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ export function stringifyStylesheet(s: CSSStyleSheet): string | null {
118118
return null;
119119
}
120120
let sheetHref = s.href;
121-
if (!sheetHref && s.ownerNode && s.ownerNode.ownerDocument) {
121+
if (!sheetHref && s.ownerNode) {
122122
// an inline <style> element
123-
sheetHref = s.ownerNode.ownerDocument.location.href;
123+
sheetHref = s.ownerNode.baseURI;
124124
}
125125
const stringifiedRules = Array.from(rules, (rule: CSSRule) =>
126126
stringifyRule(rule, sheetHref),

packages/rrweb-snapshot/test/utils.test.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,4 +280,49 @@ describe('utils', () => {
280280
expect(out3).toEqual('[data-aa\\:other] { color: red; }');
281281
});
282282
});
283+
284+
describe('stringifyStylesheet', () => {
285+
it('returns null if rules are missing', () => {
286+
const mockSheet = {
287+
rules: null,
288+
cssRules: null,
289+
} as unknown as CSSStyleSheet;
290+
expect(stringifyStylesheet(mockSheet)).toBeNull();
291+
});
292+
293+
it('stringifies rules using .cssRules if .rules is missing', () => {
294+
const mockRule1 = { cssText: 'div { margin: 0; }' } as CSSRule;
295+
const mockSheet = {
296+
cssRules: [mockRule1],
297+
href: 'https://example.com/main.css',
298+
} as unknown as CSSStyleSheet;
299+
expect(stringifyStylesheet(mockSheet)).toBe('div { margin: 0; }');
300+
});
301+
302+
it('uses ownerNode.baseURI for inline styles', () => {
303+
const mockFontFaceRule = {
304+
cssText: `
305+
@font-face {
306+
font-family: 'MockFont';
307+
src: url('../fonts/mockfont.woff2') format('woff2');
308+
font-weight: normal;
309+
font-style: normal;
310+
}
311+
`,
312+
} as CSSRule;
313+
const mockOwnerNode = {
314+
baseURI: 'https://example.com/fonts/',
315+
} as unknown as Node;
316+
const mockSheet = {
317+
cssRules: [mockFontFaceRule],
318+
href: null,
319+
ownerNode: mockOwnerNode,
320+
} as unknown as CSSStyleSheet;
321+
expect(
322+
stringifyStylesheet(mockSheet)?.replace(/\s+/g, ' ').trim(),
323+
).toEqual(
324+
"@font-face { font-family: 'MockFont'; src: url('https://example.com/fonts/mockfont.woff2') format('woff2'); font-weight: normal; font-style: normal; }",
325+
);
326+
});
327+
});
283328
});

0 commit comments

Comments
 (0)