Skip to content

Commit

Permalink
fix: add <base> to fix relative error in iframe
Browse files Browse the repository at this point in the history
  • Loading branch information
FrankCheungDev committed Sep 25, 2022
1 parent 6020386 commit 41fb73e
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 14 additions & 1 deletion src/dom/document-cloner.ts
Expand Up @@ -129,11 +129,17 @@ export class DocumentCloner {
return iframe;
});

const adoptedNode = documentClone.adoptNode(this.documentElement);
/**
* The baseURI of the document will be lost after documentClone.open().
* We can avoid it by adding <base> element.
* */
addBase(adoptedNode, documentClone);
documentClone.open();
documentClone.write(`${serializeDoctype(document.doctype)}<html></html>`);
// Chrome scrolls the parent document for some reason after the write to the cloned window???
restoreOwnerScroll(this.referenceElement.ownerDocument, scrollX, scrollY);
documentClone.replaceChild(documentClone.adoptNode(this.documentElement), documentClone.documentElement);
documentClone.replaceChild(adoptedNode, documentClone.documentElement);
documentClone.close();

return iframeLoad;
Expand Down Expand Up @@ -635,3 +641,10 @@ const createStyles = (body: HTMLElement, styles: string) => {
body.appendChild(style);
}
};

const addBase = (targetELement: HTMLElement, referenceDocument: Document) => {
const baseNode = referenceDocument.createElement('base');
baseNode.href = referenceDocument.baseURI;
const headEle = targetELement.getElementsByTagName('head').item(0);
headEle?.insertBefore(baseNode, headEle?.firstChild ?? null);
};

0 comments on commit 41fb73e

Please sign in to comment.