Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: crash on invalid zoomFactor #22708

Merged
merged 1 commit into from Mar 17, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 3 additions & 1 deletion docs/api/web-contents.md
Expand Up @@ -1068,11 +1068,13 @@ Returns `Boolean` - Whether audio is currently playing.

#### `contents.setZoomFactor(factor)`

* `factor` Number - Zoom factor.
* `factor` Double - Zoom factor; default is 1.0.

Changes the zoom factor to the specified factor. Zoom factor is
zoom percent divided by 100, so 300% = 3.0.

The factor must be greater than 0.0.

**[Deprecated](modernization/property-updates.md)**

#### `contents.getZoomFactor()`
Expand Down
4 changes: 3 additions & 1 deletion docs/api/web-frame.md
Expand Up @@ -22,11 +22,13 @@ The `WebFrame` class has the following instance methods:

### `webFrame.setZoomFactor(factor)`

* `factor` Number - Zoom factor.
* `factor` Double - Zoom factor; default is 1.0.

Changes the zoom factor to the specified factor. Zoom factor is
zoom percent divided by 100, so 300% = 3.0.

The factor must be greater than 0.0.

### `webFrame.getZoomFactor()`

Returns `Number` - The current zoom factor.
Expand Down
9 changes: 8 additions & 1 deletion shell/browser/api/electron_api_web_contents.cc
Expand Up @@ -4,6 +4,7 @@

#include "shell/browser/api/electron_api_web_contents.h"

#include <limits>
#include <memory>
#include <set>
#include <string>
Expand Down Expand Up @@ -2422,7 +2423,13 @@ double WebContents::GetZoomLevel() const {
return zoom_controller_->GetZoomLevel();
}

void WebContents::SetZoomFactor(double factor) {
void WebContents::SetZoomFactor(gin_helper::ErrorThrower thrower,
double factor) {
if (factor < std::numeric_limits<double>::epsilon()) {
thrower.ThrowError("'zoomFactor' must be a double greater than 0.0");
return;
}

auto level = blink::PageZoomFactorToZoomLevel(factor);
SetZoomLevel(level);
}
Expand Down
2 changes: 1 addition & 1 deletion shell/browser/api/electron_api_web_contents.h
Expand Up @@ -290,7 +290,7 @@ class WebContents : public gin_helper::TrackableObject<WebContents>,
// Methods for zoom handling.
void SetZoomLevel(double level);
double GetZoomLevel() const;
void SetZoomFactor(double factor);
void SetZoomFactor(gin_helper::ErrorThrower thrower, double factor);
double GetZoomFactor() const;

// Callback triggered on permission response.
Expand Down
10 changes: 9 additions & 1 deletion shell/renderer/api/electron_api_web_frame.cc
Expand Up @@ -2,6 +2,7 @@
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.

#include <limits>
#include <memory>
#include <string>
#include <utility>
Expand Down Expand Up @@ -275,7 +276,14 @@ double GetZoomLevel(v8::Local<v8::Value> window) {
return result;
}

void SetZoomFactor(v8::Local<v8::Value> window, double factor) {
void SetZoomFactor(gin_helper::ErrorThrower thrower,
v8::Local<v8::Value> window,
double factor) {
if (factor < std::numeric_limits<double>::epsilon()) {
thrower.ThrowError("'zoomFactor' must be a double greater than 0.0");
return;
}

SetZoomLevel(window, blink::PageZoomFactorToZoomLevel(factor));
}

Expand Down
14 changes: 13 additions & 1 deletion spec-main/api-web-contents-spec.ts
Expand Up @@ -800,7 +800,19 @@ describe('webContents module', () => {

afterEach(closeAllWindows)

// TODO(codebytere): remove in Electron v8.0.0
it('throws on an invalid zoomFactor', async () => {
const w = new BrowserWindow({ show: false })
await w.loadURL('about:blank')

expect(() => {
w.webContents.setZoomFactor(0.0)
}).to.throw(/'zoomFactor' must be a double greater than 0.0/)

expect(() => {
w.webContents.setZoomFactor(-2.0)
}).to.throw(/'zoomFactor' must be a double greater than 0.0/)
})

it('can set the correct zoom level (functions)', async () => {
const w = new BrowserWindow({ show: false })
try {
Expand Down