Skip to content

Commit

Permalink
fix: crash on invalid zoomFactor
Browse files Browse the repository at this point in the history
  • Loading branch information
codebytere committed Mar 12, 2020
1 parent 4b9f2bc commit b5f7ae2
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 5 deletions.
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
8 changes: 7 additions & 1 deletion shell/browser/api/electron_api_web_contents.cc
Expand Up @@ -2489,7 +2489,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 == 0.0) {
thrower.ThrowError("'zoomFactor' must be a value 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 @@ -297,7 +297,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
9 changes: 8 additions & 1 deletion shell/renderer/api/electron_api_web_frame.cc
Expand Up @@ -275,7 +275,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 == 0.0) {
thrower.ThrowError("'zoomFactor' must be a value greater than 0.0");
return;
}

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

Expand Down
9 changes: 9 additions & 0 deletions spec-main/api-web-contents-spec.ts
Expand Up @@ -800,6 +800,15 @@ describe('webContents module', () => {

afterEach(closeAllWindows)

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 value greater than 0.0/)
})

// TODO(codebytere): remove in Electron v8.0.0
it('can set the correct zoom level (functions)', async () => {
const w = new BrowserWindow({ show: false })
Expand Down

0 comments on commit b5f7ae2

Please sign in to comment.