fix style content url normalizer and add some tests
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "rrweb-snapshot",
|
"name": "rrweb-snapshot",
|
||||||
"version": "0.4.3",
|
"version": "0.4.4",
|
||||||
"description": "rrweb's component to take a snapshot of DOM, aka DOM serializer",
|
"description": "rrweb's component to take a snapshot of DOM, aka DOM serializer",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"module": "dist/module.js",
|
"module": "dist/module.js",
|
||||||
|
|||||||
@@ -28,9 +28,29 @@ function getCssRulesString(s: CSSStyleSheet): string | null {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function extractOrigin(url: string): string {
|
||||||
|
let origin;
|
||||||
|
if (url.indexOf('//') > -1) {
|
||||||
|
origin = url
|
||||||
|
.split('/')
|
||||||
|
.slice(0, 3)
|
||||||
|
.join('/');
|
||||||
|
} else {
|
||||||
|
origin = url.split('/')[0];
|
||||||
|
}
|
||||||
|
origin = origin.split('?')[0];
|
||||||
|
return origin;
|
||||||
|
}
|
||||||
|
|
||||||
const URL_IN_CSS_REF = /url\((['"])([^'"]*)\1\)/gm;
|
const URL_IN_CSS_REF = /url\((['"])([^'"]*)\1\)/gm;
|
||||||
function absoluteToStylesheet(cssText: string, href: string): string {
|
export function absoluteToStylesheet(cssText: string, href: string): string {
|
||||||
return cssText.replace(URL_IN_CSS_REF, (_1, _2, filePath) => {
|
return cssText.replace(URL_IN_CSS_REF, (_1, _2, filePath) => {
|
||||||
|
if (!/^[./]/.test(filePath)) {
|
||||||
|
return `url('${filePath}')`;
|
||||||
|
}
|
||||||
|
if (filePath[0] === '/') {
|
||||||
|
return `url('${extractOrigin(href) + filePath}')`;
|
||||||
|
}
|
||||||
const stack = href.split('/');
|
const stack = href.split('/');
|
||||||
const parts = filePath.split('/');
|
const parts = filePath.split('/');
|
||||||
stack.pop();
|
stack.pop();
|
||||||
|
|||||||
31
test/snapshot.test.ts
Normal file
31
test/snapshot.test.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import 'mocha';
|
||||||
|
import { expect } from 'chai';
|
||||||
|
import { absoluteToStylesheet } from '../src/snapshot';
|
||||||
|
|
||||||
|
describe('absolute url to stylesheet', () => {
|
||||||
|
const href = 'http://localhost/css/style.css';
|
||||||
|
|
||||||
|
it('can handle same level path', () => {
|
||||||
|
expect(absoluteToStylesheet('url("./a.jpg")', href)).to.equal(
|
||||||
|
`url('http://localhost/css/a.jpg')`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can handle parent level path', () => {
|
||||||
|
expect(absoluteToStylesheet('url("../a.jpg")', href)).to.equal(
|
||||||
|
`url('http://localhost/a.jpg')`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can handle absolute path', () => {
|
||||||
|
expect(absoluteToStylesheet('url("/a.jpg")', href)).to.equal(
|
||||||
|
`url('http://localhost/a.jpg')`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('can handle external path', () => {
|
||||||
|
expect(
|
||||||
|
absoluteToStylesheet('url("http://localhost/a.jpg")', href),
|
||||||
|
).to.equal(`url('http://localhost/a.jpg')`);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user