refactor: use WeakMap instead of hidden V8 properties to store WebViewImpl (#29049)

This commit is contained in:
Milan Burda 2021-05-08 02:56:22 +02:00 committed by GitHub
parent de55bf8459
commit 49ef1fe342
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 21 deletions

View file

@ -12,10 +12,10 @@ import { WEB_VIEW_CONSTANTS } from '@electron/internal/renderer/web-view/web-vie
import type * as webViewImplModule from '@electron/internal/renderer/web-view/web-view-impl';
import type { SrcAttribute } from '@electron/internal/renderer/web-view/web-view-attributes';
type IWebViewImpl = webViewImplModule.WebViewImpl;
const internals = new WeakMap<HTMLElement, webViewImplModule.WebViewImpl>();
// Return a WebViewElement class that is defined in this context.
const defineWebViewElement = (v8Util: NodeJS.V8UtilBinding, webViewImpl: typeof webViewImplModule) => {
const defineWebViewElement = (webViewImpl: typeof webViewImplModule) => {
const { guestViewInternal, WebViewImpl } = webViewImpl;
return class WebViewElement extends HTMLElement {
static get observedAttributes () {
@ -44,11 +44,19 @@ const defineWebViewElement = (v8Util: NodeJS.V8UtilBinding, webViewImpl: typeof
Object.assign(event, props);
return internal.webviewNode.dispatchEvent(event);
};
v8Util.setHiddenValue(this, 'internal', internal);
internals.set(this, internal);
}
getWebContentsId () {
const internal = internals.get(this);
if (!internal || !internal.guestInstanceId) {
throw new Error(WEB_VIEW_CONSTANTS.ERROR_MSG_NOT_ATTACHED);
}
return internal.guestInstanceId;
}
connectedCallback () {
const internal = v8Util.getHiddenValue<IWebViewImpl>(this, 'internal');
const internal = internals.get(this);
if (!internal) {
return;
}
@ -60,14 +68,14 @@ const defineWebViewElement = (v8Util: NodeJS.V8UtilBinding, webViewImpl: typeof
}
attributeChangedCallback (name: string, oldValue: any, newValue: any) {
const internal = v8Util.getHiddenValue<IWebViewImpl>(this, 'internal');
const internal = internals.get(this);
if (internal) {
internal.handleWebviewAttributeMutation(name, oldValue, newValue);
}
}
disconnectedCallback () {
const internal = v8Util.getHiddenValue<IWebViewImpl>(this, 'internal');
const internal = internals.get(this);
if (!internal) {
return;
}
@ -82,10 +90,10 @@ const defineWebViewElement = (v8Util: NodeJS.V8UtilBinding, webViewImpl: typeof
};
// Register <webview> custom element.
const registerWebViewElement = (v8Util: NodeJS.V8UtilBinding, webViewImpl: typeof webViewImplModule) => {
const registerWebViewElement = (webViewImpl: typeof webViewImplModule) => {
// I wish eslint wasn't so stupid, but it is
// eslint-disable-next-line
const WebViewElement = defineWebViewElement(v8Util, webViewImpl) as unknown as typeof ElectronInternal.WebViewElement
const WebViewElement = defineWebViewElement(webViewImpl) as unknown as typeof ElectronInternal.WebViewElement
webViewImpl.setupMethods(WebViewElement);
@ -108,14 +116,14 @@ const registerWebViewElement = (v8Util: NodeJS.V8UtilBinding, webViewImpl: typeo
};
// Prepare to register the <webview> element.
export const setupWebView = (v8Util: NodeJS.V8UtilBinding, webViewImpl: typeof webViewImplModule) => {
export const setupWebView = (webViewImpl: typeof webViewImplModule) => {
const useCapture = true;
const listener = (event: Event) => {
if (document.readyState === 'loading') {
return;
}
registerWebViewElement(v8Util, webViewImpl);
registerWebViewElement(webViewImpl);
window.removeEventListener(event.type, listener, useCapture);
};