diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index 0310fa2f52230..f6738334d8652 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -1352,6 +1352,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 3ce930206d91f..de562780d0e4d 100644 --- a/shell/browser/web_view_guest_delegate.cc +++ b/shell/browser/web_view_guest_delegate.cc @@ -58,6 +58,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 d45db60b9c667..13aad952918bb 100644 --- a/spec-main/webview-spec.ts +++ b/spec-main/webview-spec.ts @@ -273,6 +273,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 @@ + + + + + +