Skip to content

Commit 7603d23

Browse files
authored
COMPASS-470 Add zoom in & out (#741)
* Add View > Zoom Menu items, ipc and renderer implementations See the Venn Diagram here for whew straddle the two processes: https://medium.com/@ccnokes/deep-dive-into-electrons-main-and-renderer-processes-7a9599d5c9e2#.uh3qa3j8o * Add electron-mocha main and renderer tests 1. test/main-process/menu.zoom.test.js: Called by `npm run test-main`. This unit tests the menu items exist and have keyboard shortcut accelerators 2. test/renderer-process/zoom.test.js: Called by `npm run test-renderer` This unit tests that calling the zoom functions call the native electron.webFrame.get/setZoomLevel functions. Architecture based on: http://stackoverflow.com/questions/34485182/how-to-access-remote-module-from-unit-tests Also electron-mocha was already a devDependency, we just were not using it, so let’s bump the version and use it: https://github.com/jprichardson/electron-mocha * Hack: Move main/renderer process tests from `test` dir into `tests` dir So “Zoom renderer tests” do not fail: Zoom renderer tests 3) should zoom reset 4) "after each" hook for "should zoom reset" … 3) Zoom renderer tests should zoom reset: TypeError: Cannot read property 'setZoomLevel' of undefined at zoomReset (src/app/menu-renderer.js:10:10) at Context.it (test/renderer-process/zoom.test.js:9:12) 4) Zoom renderer tests "after each" hook for "should zoom reset": TypeError: Cannot read property 'setZoomLevel' of undefined at zoomReset (src/app/menu-renderer.js:10:10) at Context.afterEach (test/renderer-process/zoom.test.js:6:5) Also hadron-build does not support the notion of separate testing processes, just a combined one, so we’ll want to revisit this later when we can agree what should go where.
1 parent cf395f1 commit 7603d23

File tree

6 files changed

+123
-2
lines changed

6 files changed

+123
-2
lines changed

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
"scripts": {
6262
"start": "hadron-build develop",
6363
"pretest": "mongodb-runner install && mongodb-runner start --port 27018",
64-
"test": "hadron-build test",
64+
"test": "npm run test-main && npm run test-renderer && hadron-build test",
6565
"posttest": "mongodb-runner stop --port 27018",
6666
"check": "mongodb-js-precommit ./src/app/*.js ./src/app/**/**/*.js ./src/{app/**/*.js,main/**/*.js} ./test/*.js ./src/internal-packages/**/*.js ./src/internal-packages/**/**/*{.js,.jsx} ./src/internal-packages/**/**/**/*{.js,.jsx} ./src/internal-packages/**/**/**/**/*{.js,.jsx}",
6767
"ci": "npm run check && npm run test",
@@ -70,7 +70,9 @@
7070
"fmt": "mongodb-js-fmt ./*.js src/{**/*.js,*.js} test/{**/*.js,*.js}",
7171
"release": "hadron-build release",
7272
"test-functional": "npm test -- --functional",
73+
"test-main": "electron-mocha ./tests/main-process/*.test.js",
7374
"test-packages": "npm test -- --packages",
75+
"test-renderer": "electron-mocha --renderer ./tests/renderer-process/*.test.js",
7476
"test-unit": "npm test -- --unit",
7577
"test-release": "npm test -- --release",
7678
"upload": "hadron-build upload",
@@ -175,7 +177,7 @@
175177
"chai-enzyme": "^0.5.2",
176178
"devtron": "^1.4.0",
177179
"electron-devtools-installer": "^2.0.1",
178-
"electron-mocha": "^3.1.1",
180+
"electron-mocha": "^3.3.0",
179181
"electron-prebuilt": "1.2.8",
180182
"enzyme": "^2.5.1",
181183
"eslint-config-mongodb-js": "^2.2.0",

src/app/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ var Preferences = require('./models/preferences');
5959
var User = require('./models/user');
6060

6161
var ApplicationStore = require('hadron-reflux-store').ApplicationStore;
62+
require('./menu-renderer');
6263
var Router = require('./router');
6364
var migrateApp = require('./migrations');
6465
var metricsSetup = require('./metrics');

src/app/menu-renderer.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
const electron = require('electron');
2+
const ipc = require('hadron-ipc');
3+
4+
const ZOOM_DEFAULT = 0;
5+
const ZOOM_INCREMENT = 0.5;
6+
const ZOOM_MAX = 5;
7+
const ZOOM_MIN = -3;
8+
9+
const zoomReset = () => {
10+
return electron.webFrame.setZoomLevel(ZOOM_DEFAULT);
11+
};
12+
const zoomIn = () => {
13+
const currentZoomLevel = electron.webFrame.getZoomLevel();
14+
const newZoomLevel = Math.min(currentZoomLevel + ZOOM_INCREMENT, ZOOM_MAX);
15+
return electron.webFrame.setZoomLevel(newZoomLevel);
16+
};
17+
const zoomOut = () => {
18+
const currentZoomLevel = electron.webFrame.getZoomLevel();
19+
const newZoomLevel = Math.max(currentZoomLevel - ZOOM_INCREMENT, ZOOM_MIN);
20+
return electron.webFrame.setZoomLevel(newZoomLevel);
21+
};
22+
23+
ipc.on('window:zoom-reset', zoomReset);
24+
ipc.on('window:zoom-in', zoomIn);
25+
ipc.on('window:zoom-out', zoomOut);
26+
27+
module.exports = {
28+
zoomReset,
29+
zoomIn,
30+
zoomOut
31+
};

src/main/menu.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,29 @@ function viewSubMenu() {
220220
BrowserWindow.getFocusedWindow().reload();
221221
}
222222
},
223+
separator(),
224+
{
225+
label: 'Actual Size',
226+
accelerator: 'CmdOrCtrl+0',
227+
click: function() {
228+
ipc.broadcast('window:zoom-reset');
229+
}
230+
},
231+
{
232+
label: 'Zoom In',
233+
accelerator: 'CmdOrCtrl+Plus',
234+
click: function() {
235+
ipc.broadcast('window:zoom-in');
236+
}
237+
},
238+
{
239+
label: 'Zoom Out',
240+
accelerator: 'CmdOrCtrl+-',
241+
click: function() {
242+
ipc.broadcast('window:zoom-out');
243+
}
244+
},
245+
separator(),
223246
{
224247
label: '&Toggle DevTools',
225248
accelerator: 'Alt+CmdOrCtrl+I',
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const expect = require('chai').expect;
2+
const { BrowserWindow, Menu } = require('electron');
3+
const AppMenu = require('../../src/main/menu');
4+
const _ = require('lodash');
5+
6+
describe('App Menu', () => {
7+
before(function() {
8+
const _window = new BrowserWindow({show: false});
9+
AppMenu.init();
10+
AppMenu.load(_window);
11+
const menuTemplate = AppMenu.getTemplate(_window.id);
12+
this.fullMenu = Menu.buildFromTemplate(menuTemplate);
13+
});
14+
context('View sub-menu', () => {
15+
before(function() {
16+
this.viewSubMenu = _.find(this.fullMenu.items, (menuItem) => {
17+
return menuItem.label === '&View';
18+
}).submenu;
19+
});
20+
it('contains a zoom reset item', function() {
21+
const zoomResetItem = _.find(this.viewSubMenu.items, (item) => {
22+
return item.label === 'Actual Size';
23+
});
24+
expect(zoomResetItem.accelerator).to.be.equal('CmdOrCtrl+0');
25+
});
26+
it('contains a zoom in item', function() {
27+
const zoomInItem = _.find(this.viewSubMenu.items, (menuItem) => {
28+
return menuItem.label === 'Zoom In';
29+
});
30+
expect(zoomInItem.accelerator).to.be.equal('CmdOrCtrl+Plus');
31+
});
32+
it('contains a zoom out item', function() {
33+
const zoomOutItem = _.find(this.viewSubMenu.items, (menuItem) => {
34+
return menuItem.label === 'Zoom Out';
35+
});
36+
expect(zoomOutItem.accelerator).to.be.equal('CmdOrCtrl+-');
37+
});
38+
});
39+
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const expect = require('chai').expect;
2+
const {zoomReset, zoomIn, zoomOut} = require('../../src/app/menu-renderer');
3+
4+
describe('Zoom renderer tests', () => {
5+
afterEach(() => {
6+
zoomReset();
7+
});
8+
it('should zoom reset', () => {
9+
expect(zoomReset()).to.be.equal(0);
10+
});
11+
it('should zoom in', () => {
12+
expect(zoomIn()).to.be.equal(0.5);
13+
});
14+
it('should zoom in at least 5x', () => {
15+
[1,2,3,4,5].forEach(() => {zoomIn()});
16+
expect(zoomIn()).to.be.equal(3);
17+
});
18+
it('should zoom out', () => {
19+
expect(zoomOut()).to.be.equal(-0.5);
20+
});
21+
it('should zoom out at least 5x', () => {
22+
[1,2,3,4,5].forEach(() => {zoomOut()});
23+
expect(zoomOut()).to.be.equal(-3);
24+
});
25+
});

0 commit comments

Comments
 (0)