I'm writing a Chrome Extension and I'm attempting to use the WebComponents
API to load a singleton
customized built-in elements which represent a modal inhertited from <div>
loaded in the content script.
My modal custom element looks like this:
// sactModal.ts
export class SactModal extends HTMLDivElement {
private static instance: SactModal;
// more private properties
constructor() {
super();
}
// more public methods
}
In my contentScript.ts
I register/define the element and then attempt to add it to the document:
// contentScript.ts
import { SactModal } from "../components/modal/sactModal";
window.customElements.define(
"sact-modal",
SactModal,
{ extends: "div" }
);
const modal = document.createElement("sact-modal");
document.body.appendChild(modal);
However, I get an error in Chrome dev tools about customElements
being undefined
:
Uncaught TypeError: Cannot read properties of null (reading 'define')
So I read up about it and I believe that I'm missing some depenedencies and need to use a polyfill. I believe that the right one that would port the new API into my extension is webcomponents
So I attempted to use it as instructed:
npm install @webcomponents/webcomponentsjs
And imported it into the contentScript
:
import "@webcomponents/webcomponentsjs/webcomponents-bundle.js";
In this case, the contentScript
doesn't load at all.
I also attempted following the instructions in this answer but the contentScript
doesn't load in this case either...
I'm pretty much at a dead end and will probably need to revert to plain-old JavaScript and use Document::createElement
to create my custom elements but wanted to know if anyone got this working!