diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index 7aa92a65853ac..07c20b932fcd6 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -1413,6 +1413,11 @@ bool WebContents::OnMessageReceived(const IPC::Message& message) { // we need to make sure the api::WebContents is also deleted. // For #4, the WebContents will be destroyed by embedder. void WebContents::WebContentsDestroyed() { + // Give chance for guest delegate to cleanup its observers + // since the native class is only destroyed in the next tick. + if (guest_delegate_) + guest_delegate_->WillDestroy(); + // Cleanup relationships with other parts. RemoveFromWeakMap(); diff --git a/shell/browser/web_view_guest_delegate.cc b/shell/browser/web_view_guest_delegate.cc index aa39563657c15..dadb04d84f263 100644 --- a/shell/browser/web_view_guest_delegate.cc +++ b/shell/browser/web_view_guest_delegate.cc @@ -57,6 +57,10 @@ void WebViewGuestDelegate::AttachToIframe( api_web_contents_->Emit("did-attach"); } +void WebViewGuestDelegate::WillDestroy() { + ResetZoomController(); +} + void WebViewGuestDelegate::DidDetach() { ResetZoomController(); } diff --git a/shell/browser/web_view_guest_delegate.h b/shell/browser/web_view_guest_delegate.h index ccf4b53c06365..421f78722fab8 100644 --- a/shell/browser/web_view_guest_delegate.h +++ b/shell/browser/web_view_guest_delegate.h @@ -24,6 +24,7 @@ class WebViewGuestDelegate : public content::BrowserPluginGuestDelegate, // Attach to the iframe. void AttachToIframe(content::WebContents* embedder_web_contents, int embedder_frame_id); + void WillDestroy(); protected: // content::BrowserPluginGuestDelegate: diff --git a/spec-main/webview-spec.ts b/spec-main/webview-spec.ts index 26e7849f87ee4..6521841d3e3c7 100644 --- a/spec-main/webview-spec.ts +++ b/spec-main/webview-spec.ts @@ -301,6 +301,25 @@ describe(' tag', function () { const [, zoomLevel] = await emittedOnce(ipcMain, 'webview-origin-zoom-level'); expect(zoomLevel).to.equal(2.0); }); + + it('does not crash when navigating with zoom level inherited from parent', async () => { + const w = new BrowserWindow({ + show: false, + webPreferences: { + webviewTag: true, + nodeIntegration: true, + zoomFactor: 1.2, + session: webviewSession + } + }); + const attachPromise = emittedOnce(w.webContents, 'did-attach-webview'); + const readyPromise = emittedOnce(ipcMain, 'dom-ready'); + w.loadFile(path.join(fixtures, 'pages', 'webview-zoom-inherited.html')); + const [, webview] = await attachPromise; + await readyPromise; + expect(webview.getZoomFactor()).to.equal(1.2); + await w.loadURL(`${zoomScheme}://host1`); + }); }); describe('nativeWindowOpen option', () => { diff --git a/spec/fixtures/pages/webview-zoom-inherited.html b/spec/fixtures/pages/webview-zoom-inherited.html new file mode 100644 index 0000000000000..0bff665231d05 --- /dev/null +++ b/spec/fixtures/pages/webview-zoom-inherited.html @@ -0,0 +1,12 @@ + + + + + +