fix: avoid IPC for renderer webFrame.getZoom... APIs (#45557)

* fix: avoid IPC for renderer `webFrame.getZoom...` APIs

Co-authored-by: clavin <clavin@electronjs.org>

* Remove `DoGetZoomLevel` IPC

Co-authored-by: clavin <clavin@electronjs.org>

* Fix synchronous behavior & nullptr deref

Co-authored-by: clavin <clavin@electronjs.org>

* Use local root

Co-authored-by: clavin <clavin@electronjs.org>

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: clavin <clavin@electronjs.org>
This commit is contained in:
trop[bot] 2025-02-13 12:53:59 +01:00 committed by GitHub
parent 5b90ce2290
commit aacbdaf4ec
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 22 additions and 34 deletions

View file

@ -441,25 +441,34 @@ class WebFrameRenderer final : public gin::Wrappable<WebFrameRenderer>,
if (!MaybeGetRenderFrame(isolate, "setZoomLevel", &render_frame))
return;
// Update the zoom controller.
mojo::AssociatedRemote<mojom::ElectronWebContentsUtility>
web_contents_utility_remote;
render_frame->GetRemoteAssociatedInterfaces()->GetInterface(
&web_contents_utility_remote);
web_contents_utility_remote->SetTemporaryZoomLevel(level);
// Update the local web frame for coherence with synchronous calls to
// |GetZoomLevel|.
if (blink::WebFrameWidget* web_frame =
render_frame->GetWebFrame()->LocalRoot()->FrameWidget()) {
web_frame->SetZoomLevel(level);
}
}
double GetZoomLevel(v8::Isolate* isolate) {
double result = 0.0;
content::RenderFrame* render_frame;
if (!MaybeGetRenderFrame(isolate, "getZoomLevel", &render_frame))
return result;
if (!MaybeGetRenderFrame(isolate, "getZoomLevel", &render_frame)) {
return 0.0f;
}
mojo::AssociatedRemote<mojom::ElectronWebContentsUtility>
web_contents_utility_remote;
render_frame->GetRemoteAssociatedInterfaces()->GetInterface(
&web_contents_utility_remote);
web_contents_utility_remote->DoGetZoomLevel(&result);
return result;
blink::WebFrameWidget* web_frame =
render_frame->GetWebFrame()->LocalRoot()->FrameWidget();
if (!web_frame) {
return 0.0f;
}
return web_frame->GetZoomLevel();
}
void SetZoomFactor(gin_helper::ErrorThrower thrower, double factor) {