From 203a920c6458595f7ad70ccc37193cb617533958 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Thu, 16 Feb 2017 03:44:24 +0530 Subject: [PATCH 1/8] fix signature of zoom getter apis --- atom/browser/api/atom_api_web_contents.cc | 4 ++-- lib/browser/api/web-contents.js | 20 ++++++++++++++++++++ lib/browser/guest-view-manager.js | 18 ++++++++++-------- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 3fc22438ab..89e7a7d65b 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -1672,9 +1672,9 @@ void WebContents::BuildPrototype(v8::Isolate* isolate, .SetMethod("getFrameRate", &WebContents::GetFrameRate) .SetMethod("invalidate", &WebContents::Invalidate) .SetMethod("setZoomLevel", &WebContents::SetZoomLevel) - .SetMethod("getZoomLevel", &WebContents::GetZoomLevel) + .SetMethod("_getZoomLevel", &WebContents::GetZoomLevel) .SetMethod("setZoomFactor", &WebContents::SetZoomFactor) - .SetMethod("getZoomFactor", &WebContents::GetZoomFactor) + .SetMethod("_getZoomFactor", &WebContents::GetZoomFactor) .SetMethod("getType", &WebContents::GetType) .SetMethod("getWebPreferences", &WebContents::GetWebPreferences) .SetMethod("getOwnerBrowserWindow", &WebContents::GetOwnerBrowserWindow) diff --git a/lib/browser/api/web-contents.js b/lib/browser/api/web-contents.js index c94bd768c0..c43a288239 100644 --- a/lib/browser/api/web-contents.js +++ b/lib/browser/api/web-contents.js @@ -206,6 +206,26 @@ WebContents.prototype.printToPDF = function (options, callback) { this._printToPDF(printingSetting, callback) } +WebContents.prototype.getZoomLevel = function (callback) { + if (typeof callback !== 'function') { + throw new Error('Must pass function as an argument') + } + process.nextTick(() => { + const zoomLevel = this._getZoomLevel() + callback(zoomLevel) + }) +} + +WebContents.prototype.getZoomFactor = function (callback) { + if (typeof callback !== 'function') { + throw new Error('Must pass function as an argument') + } + process.nextTick(() => { + const zoomFactor = this._getZoomFactor() + callback(zoomFactor) + }) +} + // Add JavaScript wrappers for WebContents class. WebContents.prototype._init = function () { // The navigation controller. diff --git a/lib/browser/guest-view-manager.js b/lib/browser/guest-view-manager.js index e61b2574ad..83a56827b2 100644 --- a/lib/browser/guest-view-manager.js +++ b/lib/browser/guest-view-manager.js @@ -184,7 +184,6 @@ const attachGuest = function (event, elementInstanceId, guestInstanceId, params) guestInstanceId: guestInstanceId, nodeIntegration: params.nodeintegration != null ? params.nodeintegration : false, plugins: params.plugins, - zoomFactor: embedder.getZoomFactor(), webSecurity: !params.disablewebsecurity, blinkFeatures: params.blinkfeatures, disableBlinkFeatures: params.disableblinkfeatures @@ -213,15 +212,18 @@ const attachGuest = function (event, elementInstanceId, guestInstanceId, params) return } - webViewManager.addGuest(guestInstanceId, elementInstanceId, embedder, guest, webPreferences) - guest.attachParams = params - embedderElementsMap[key] = guestInstanceId + embedder.getZoomFactor(function (zoomFactor) { + webPreferences.zoomFactor = zoomFactor + webViewManager.addGuest(guestInstanceId, elementInstanceId, embedder, guest, webPreferences) + guest.attachParams = params + embedderElementsMap[key] = guestInstanceId - guest.setEmbedder(embedder) - guestInstance.embedder = embedder - guestInstance.elementInstanceId = elementInstanceId + guest.setEmbedder(embedder) + guestInstance.embedder = embedder + guestInstance.elementInstanceId = elementInstanceId - watchEmbedder(embedder) + watchEmbedder(embedder) + }) } // Destroy an existing guest instance. From 763b9ab8d8aaa93087048db8a282edc5b2f4f102 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Thu, 16 Feb 2017 03:44:40 +0530 Subject: [PATCH 2/8] add zoom spec --- spec/api-web-contents-spec.js | 123 +++++++++++++++++++++++++++++++++- spec/static/main.js | 3 +- 2 files changed, 124 insertions(+), 2 deletions(-) diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index 0faaafbcda..c9538e8480 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -1,11 +1,12 @@ 'use strict' const assert = require('assert') +const http = require('http') const path = require('path') const {closeWindow} = require('./window-helpers') const {ipcRenderer, remote} = require('electron') -const {BrowserWindow, webContents, ipcMain} = remote +const {BrowserWindow, webContents, ipcMain, session} = remote const isCi = remote.getGlobal('isCi') @@ -322,4 +323,124 @@ describe('webContents module', function () { }) }) }) + + describe('zoom api', () => { + const zoomScheme = remote.getGlobal('zoomScheme') + const hostZoomMap = { + 'host1': 0.3, + 'host2': 0.7, + 'host3': 0.2 + } + + before((done) => { + let protocol = session.defaultSession.protocol + protocol.registerStringProtocol(zoomScheme, (request, callback) => { + let response = `` + callback({data: response, mimeType: 'text/html'}) + }, (error) => done(error)) + }) + + after((done) => { + let protocol = session.defaultSession.protocol + protocol.unregisterProtocol(zoomScheme, (error) => done(error)) + }) + + it('can set the correct zoom level', (done) => { + w.loadURL('about:blank') + w.webContents.on('did-finish-load', () => { + w.webContents.getZoomLevel((zoomLevel) => { + assert.equal(zoomLevel, 0.0) + w.webContents.setZoomLevel(0.5) + w.webContents.getZoomLevel((zoomLevel) => { + assert.equal(zoomLevel, 0.5) + w.webContents.setZoomLevel(0) + done() + }) + }) + }) + }) + + it('can persist zoom level across navigation', (done) => { + let finalNavigation = false + ipcMain.on('set-zoom', (e, host) => { + let zoomLevel = hostZoomMap[host] + if (!finalNavigation) { + w.webContents.setZoomLevel(zoomLevel) + } + e.sender.send(`${host}-zoom-set`) + }) + ipcMain.on('host1-zoom-level', (e, zoomLevel) => { + let expectedZoomLevel = hostZoomMap['host1'] + assert.equal(zoomLevel, expectedZoomLevel) + if (finalNavigation) { + done() + } else { + w.loadURL(`${zoomScheme}://host2`) + } + }) + ipcMain.once('host2-zoom-level', (e, zoomLevel) => { + let expectedZoomLevel = hostZoomMap['host2'] + assert.equal(zoomLevel, expectedZoomLevel) + finalNavigation = true + w.webContents.goBack() + }) + w.loadURL(`${zoomScheme}://host1`) + }) + + it('can propagate zoom level across same session', (done) => { + const w2 = new BrowserWindow({ + show: false + }) + w2.webContents.on('did-finish-load', () => { + w.webContents.getZoomLevel((zoomLevel1) => { + assert.equal(zoomLevel1, hostZoomMap['host3']) + w2.webContents.getZoomLevel((zoomLevel2) => { + assert.equal(zoomLevel1, zoomLevel2) + w2.setClosable(true) + w2.close() + done() + }) + }) + }) + w.webContents.on('did-finish-load', () => { + w.webContents.setZoomLevel(hostZoomMap['host3']) + w2.loadURL(`${zoomScheme}://host3`) + }) + w.loadURL(`${zoomScheme}://host3`) + }) + + it('can persist when it contains iframe', (done) => { + const server = http.createServer(function (req, res) { + setTimeout(() => { + res.end() + }, 2000) + }) + server.listen(0, '127.0.0.1', function () { + const url = 'http://127.0.0.1:' + server.address().port + const content = `` + w.webContents.on('did-frame-finish-load', (e, isMainFrame) => { + if (!isMainFrame) { + w.webContents.getZoomLevel((zoomLevel) => { + assert.equal(zoomLevel, 2.0) + w.webContents.setZoomLevel(0) + server.close() + done() + }) + } + }) + w.webContents.on('dom-ready', () => { + w.webContents.setZoomLevel(2.0) + }) + w.loadURL(`data:text/html,${content}`) + }) + }) + }) }) diff --git a/spec/static/main.js b/spec/static/main.js index 1eafd78503..c36e86aeae 100644 --- a/spec/static/main.js +++ b/spec/static/main.js @@ -93,7 +93,8 @@ if (global.isCi) { // Register app as standard scheme. global.standardScheme = 'app' -protocol.registerStandardSchemes([global.standardScheme], { secure: true }) +global.zoomScheme = 'zoom' +protocol.registerStandardSchemes([global.standardScheme, global.zoomScheme], { secure: true }) app.on('window-all-closed', function () { app.quit() From 71fd3e807caa40a43b9d453518f37f182021966c Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Thu, 16 Feb 2017 04:03:47 +0530 Subject: [PATCH 3/8] use sync zoom api with guest view manager webpreferences --- lib/browser/guest-view-manager.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/browser/guest-view-manager.js b/lib/browser/guest-view-manager.js index 83a56827b2..721da5acc4 100644 --- a/lib/browser/guest-view-manager.js +++ b/lib/browser/guest-view-manager.js @@ -184,6 +184,7 @@ const attachGuest = function (event, elementInstanceId, guestInstanceId, params) guestInstanceId: guestInstanceId, nodeIntegration: params.nodeintegration != null ? params.nodeintegration : false, plugins: params.plugins, + zoomFactor: embedder._getZoomFactor(), webSecurity: !params.disablewebsecurity, blinkFeatures: params.blinkfeatures, disableBlinkFeatures: params.disableblinkfeatures @@ -212,18 +213,15 @@ const attachGuest = function (event, elementInstanceId, guestInstanceId, params) return } - embedder.getZoomFactor(function (zoomFactor) { - webPreferences.zoomFactor = zoomFactor - webViewManager.addGuest(guestInstanceId, elementInstanceId, embedder, guest, webPreferences) - guest.attachParams = params - embedderElementsMap[key] = guestInstanceId + webViewManager.addGuest(guestInstanceId, elementInstanceId, embedder, guest, webPreferences) + guest.attachParams = params + embedderElementsMap[key] = guestInstanceId - guest.setEmbedder(embedder) - guestInstance.embedder = embedder - guestInstance.elementInstanceId = elementInstanceId + guest.setEmbedder(embedder) + guestInstance.embedder = embedder + guestInstance.elementInstanceId = elementInstanceId - watchEmbedder(embedder) - }) + watchEmbedder(embedder) } // Destroy an existing guest instance. From dfc2e6c4a8d42643aae09a0710fe52ca5d6ccd32 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Thu, 16 Feb 2017 15:26:33 +0530 Subject: [PATCH 4/8] add temporary zoom api spec --- spec/api-web-contents-spec.js | 84 ++++++++++++++++++++++++++ spec/fixtures/pages/webframe-zoom.html | 9 +++ 2 files changed, 93 insertions(+) create mode 100644 spec/fixtures/pages/webframe-zoom.html diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index c9538e8480..ea5f88d14e 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -417,6 +417,41 @@ describe('webContents module', function () { w.loadURL(`${zoomScheme}://host3`) }) + it('cannot propagate zoom level across different session', (done) => { + const w2 = new BrowserWindow({ + show: false, + webPreferences: { + partition: 'temp' + } + }) + let protocol = w2.webContents.session.protocol + protocol.registerStringProtocol(zoomScheme, (request, callback) => { + callback('hello') + }, (error) => { + if (error) return done(error) + w2.webContents.on('did-finish-load', () => { + w.webContents.getZoomLevel((zoomLevel1) => { + assert.equal(zoomLevel1, hostZoomMap['host3']) + w2.webContents.getZoomLevel((zoomLevel2) => { + assert.equal(zoomLevel2, 0) + assert.notEqual(zoomLevel1, zoomLevel2) + protocol.unregisterProtocol(zoomScheme, (error) => { + if (error) return done(error) + w2.setClosable(true) + w2.close() + done() + }) + }) + }) + }) + w.webContents.on('did-finish-load', () => { + w.webContents.setZoomLevel(hostZoomMap['host3']) + w2.loadURL(`${zoomScheme}://host3`) + }) + w.loadURL(`${zoomScheme}://host3`) + }) + }) + it('can persist when it contains iframe', (done) => { const server = http.createServer(function (req, res) { setTimeout(() => { @@ -442,5 +477,54 @@ describe('webContents module', function () { w.loadURL(`data:text/html,${content}`) }) }) + + it('cannot propagate when used with webframe', (done) => { + let finalZoomLevel = 0 + const w2 = new BrowserWindow({ + show: false + }) + w2.webContents.on('did-finish-load', () => { + w.webContents.getZoomLevel((zoomLevel1) => { + assert.equal(zoomLevel1, finalZoomLevel) + w2.webContents.getZoomLevel((zoomLevel2) => { + assert.equal(zoomLevel2, 0) + assert.notEqual(zoomLevel1, zoomLevel2) + w2.setClosable(true) + w2.close() + done() + }) + }) + }) + ipcMain.once('temporary-zoom-set', (e, zoomLevel) => { + w2.loadURL(`file://${fixtures}/pages/a.html`) + finalZoomLevel = zoomLevel + }) + w.loadURL(`file://${fixtures}/pages/webframe-zoom.html`) + }) + + it('cannot persist zoom level after navigation with webFrame', (done) => { + let initialNavigation = true + const source = ` + const {ipcRenderer, webFrame} = require('electron') + webFrame.setZoomLevel(0.6) + ipcRenderer.send('zoom-level-set', webFrame.getZoomLevel()) + ` + w.webContents.on('did-finish-load', () => { + if (initialNavigation) { + w.webContents.executeJavaScript(source, () => {}) + } else { + w.webContents.getZoomLevel((zoomLevel) => { + assert.equal(zoomLevel, 0) + done() + }) + } + }) + ipcMain.once('zoom-level-set', (e, zoomLevel) => { + assert.equal(zoomLevel, 0.6) + w.loadURL(`file://${fixtures}/pages/b.html`) + initialNavigation = false + }) + w.loadURL(`file://${fixtures}/pages/a.html`) + }) }) }) diff --git a/spec/fixtures/pages/webframe-zoom.html b/spec/fixtures/pages/webframe-zoom.html new file mode 100644 index 0000000000..81006aad64 --- /dev/null +++ b/spec/fixtures/pages/webframe-zoom.html @@ -0,0 +1,9 @@ + + + + + From c71b44048cd4859b4244b219d19b039c79d9f720 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Fri, 17 Feb 2017 10:29:52 +0530 Subject: [PATCH 5/8] address review comments --- spec/api-web-contents-spec.js | 44 +++++++++++++++++------------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index ea5f88d14e..d7a894cce4 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -327,29 +327,29 @@ describe('webContents module', function () { describe('zoom api', () => { const zoomScheme = remote.getGlobal('zoomScheme') const hostZoomMap = { - 'host1': 0.3, - 'host2': 0.7, - 'host3': 0.2 + host1: 0.3, + host2: 0.7, + host3: 0.2 } before((done) => { - let protocol = session.defaultSession.protocol + const protocol = session.defaultSession.protocol protocol.registerStringProtocol(zoomScheme, (request, callback) => { - let response = `` + ` callback({data: response, mimeType: 'text/html'}) }, (error) => done(error)) }) after((done) => { - let protocol = session.defaultSession.protocol + const protocol = session.defaultSession.protocol protocol.unregisterProtocol(zoomScheme, (error) => done(error)) }) @@ -371,14 +371,14 @@ describe('webContents module', function () { it('can persist zoom level across navigation', (done) => { let finalNavigation = false ipcMain.on('set-zoom', (e, host) => { - let zoomLevel = hostZoomMap[host] + const zoomLevel = hostZoomMap[host] if (!finalNavigation) { w.webContents.setZoomLevel(zoomLevel) } e.sender.send(`${host}-zoom-set`) }) ipcMain.on('host1-zoom-level', (e, zoomLevel) => { - let expectedZoomLevel = hostZoomMap['host1'] + const expectedZoomLevel = hostZoomMap.host1 assert.equal(zoomLevel, expectedZoomLevel) if (finalNavigation) { done() @@ -387,7 +387,7 @@ describe('webContents module', function () { } }) ipcMain.once('host2-zoom-level', (e, zoomLevel) => { - let expectedZoomLevel = hostZoomMap['host2'] + const expectedZoomLevel = hostZoomMap.host2 assert.equal(zoomLevel, expectedZoomLevel) finalNavigation = true w.webContents.goBack() @@ -401,7 +401,7 @@ describe('webContents module', function () { }) w2.webContents.on('did-finish-load', () => { w.webContents.getZoomLevel((zoomLevel1) => { - assert.equal(zoomLevel1, hostZoomMap['host3']) + assert.equal(zoomLevel1, hostZoomMap.host3) w2.webContents.getZoomLevel((zoomLevel2) => { assert.equal(zoomLevel1, zoomLevel2) w2.setClosable(true) @@ -411,7 +411,7 @@ describe('webContents module', function () { }) }) w.webContents.on('did-finish-load', () => { - w.webContents.setZoomLevel(hostZoomMap['host3']) + w.webContents.setZoomLevel(hostZoomMap.host3) w2.loadURL(`${zoomScheme}://host3`) }) w.loadURL(`${zoomScheme}://host3`) @@ -424,14 +424,14 @@ describe('webContents module', function () { partition: 'temp' } }) - let protocol = w2.webContents.session.protocol + const protocol = w2.webContents.session.protocol protocol.registerStringProtocol(zoomScheme, (request, callback) => { callback('hello') }, (error) => { if (error) return done(error) w2.webContents.on('did-finish-load', () => { w.webContents.getZoomLevel((zoomLevel1) => { - assert.equal(zoomLevel1, hostZoomMap['host3']) + assert.equal(zoomLevel1, hostZoomMap.host3) w2.webContents.getZoomLevel((zoomLevel2) => { assert.equal(zoomLevel2, 0) assert.notEqual(zoomLevel1, zoomLevel2) @@ -445,7 +445,7 @@ describe('webContents module', function () { }) }) w.webContents.on('did-finish-load', () => { - w.webContents.setZoomLevel(hostZoomMap['host3']) + w.webContents.setZoomLevel(hostZoomMap.host3) w2.loadURL(`${zoomScheme}://host3`) }) w.loadURL(`${zoomScheme}://host3`) @@ -456,7 +456,7 @@ describe('webContents module', function () { const server = http.createServer(function (req, res) { setTimeout(() => { res.end() - }, 2000) + }, 200) }) server.listen(0, '127.0.0.1', function () { const url = 'http://127.0.0.1:' + server.address().port From 403e7681c1a4eed4e3aaa7fc1753275761a919bd Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Fri, 17 Feb 2017 21:18:30 +0530 Subject: [PATCH 6/8] add basic webview zoom specs --- lib/renderer/web-view/web-view.js | 8 +-- .../pages/webview-custom-zoom-level.html | 23 ++++++++ spec/fixtures/pages/zoom-factor.html | 2 +- spec/webview-spec.js | 52 +++++++++++++------ 4 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 spec/fixtures/pages/webview-custom-zoom-level.html diff --git a/lib/renderer/web-view/web-view.js b/lib/renderer/web-view/web-view.js index c98b02d274..5e5a10cb00 100644 --- a/lib/renderer/web-view/web-view.js +++ b/lib/renderer/web-view/web-view.js @@ -374,7 +374,11 @@ var registerWebViewElement = function () { 'print', 'printToPDF', 'showDefinitionForSelection', - 'capturePage' + 'capturePage', + 'setZoomFactor', + 'setZoomLevel', + 'getZoomLevel', + 'getZoomFactor' ] const nonblockMethods = [ 'insertCSS', @@ -383,8 +387,6 @@ var registerWebViewElement = function () { 'sendInputEvent', 'setLayoutZoomLevelLimits', 'setVisualZoomLevelLimits', - 'setZoomFactor', - 'setZoomLevel', // TODO(kevinsawicki): Remove in 2.0, deprecate before then with warnings 'setZoomLevelLimits' ] diff --git a/spec/fixtures/pages/webview-custom-zoom-level.html b/spec/fixtures/pages/webview-custom-zoom-level.html new file mode 100644 index 0000000000..0598623a66 --- /dev/null +++ b/spec/fixtures/pages/webview-custom-zoom-level.html @@ -0,0 +1,23 @@ + + + + + + diff --git a/spec/fixtures/pages/zoom-factor.html b/spec/fixtures/pages/zoom-factor.html index b9f8f988ca..4c04e38f3a 100644 --- a/spec/fixtures/pages/zoom-factor.html +++ b/spec/fixtures/pages/zoom-factor.html @@ -2,7 +2,7 @@ diff --git a/spec/webview-spec.js b/spec/webview-spec.js index c6b69310a8..40e6a8bffd 100644 --- a/spec/webview-spec.js +++ b/spec/webview-spec.js @@ -1067,21 +1067,6 @@ describe(' tag', function () { }) }) - it('inherits the zoomFactor of the parent window', function (done) { - w = new BrowserWindow({ - show: false, - webPreferences: { - zoomFactor: 1.2 - } - }) - ipcMain.once('pong', function (event, zoomFactor, zoomLevel) { - assert.equal(zoomFactor, 1.2) - assert.equal(zoomLevel, 1) - done() - }) - w.loadURL('file://' + fixtures + '/pages/webview-zoom-factor.html') - }) - it('inherits the parent window visibility state and receives visibilitychange events', function (done) { w = new BrowserWindow({ show: false @@ -1540,4 +1525,41 @@ describe(' tag', function () { }) }) }) + + describe('zoom behavior', () => { + it('inherits the zoomFactor of the parent window', (done) => { + w = new BrowserWindow({ + show: false, + webPreferences: { + zoomFactor: 1.2 + } + }) + ipcMain.once('webview-zoom-level', (event, zoomFactor, zoomLevel) => { + assert.equal(zoomFactor, 1.2) + assert.equal(zoomLevel, 1) + done() + }) + w.loadURL(`file://${fixtures}/pages/webview-zoom-factor.html`) + }) + + it('inherits the zoomLevel of parent window on navigation', (done) => { + w = new BrowserWindow({ + show: false, + webPreferences: { + zoomFactor: 1.2 + } + }) + ipcMain.on('webview-zoom-level', (event, zoomLevel, zoomFactor, final) => { + if (!final) { + assert.equal(zoomFactor, 1.44) + assert.equal(zoomLevel, 2.0) + } else { + assert.equal(zoomFactor, 1.2) + assert.equal(zoomLevel, 1) + done() + } + }) + w.loadURL(`file://${fixtures}/pages/webview-custom-zoom-level.html`) + }) + }) }) From 0c022fdc3692fe563d3b79cb8759dab51b845d52 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Fri, 17 Feb 2017 23:24:24 +0530 Subject: [PATCH 7/8] set zoom changes for in page navigaitons --- atom/browser/web_contents_zoom_controller.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/atom/browser/web_contents_zoom_controller.cc b/atom/browser/web_contents_zoom_controller.cc index cb293705c9..1bd4f5a9e4 100644 --- a/atom/browser/web_contents_zoom_controller.cc +++ b/atom/browser/web_contents_zoom_controller.cc @@ -112,8 +112,7 @@ void WebContentsZoomController::DidFinishNavigation( return; } - if (!navigation_handle->IsSamePage()) - SetZoomFactorOnNavigationIfNeeded(navigation_handle->GetURL()); + SetZoomFactorOnNavigationIfNeeded(navigation_handle->GetURL()); } void WebContentsZoomController::WebContentsDestroyed() { From a57af31b99f6412b5441b6cd2dbd5e5855d8f165 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Fri, 17 Feb 2017 23:28:29 +0530 Subject: [PATCH 8/8] add zoom specs based on standard protocols --- spec/api-web-contents-spec.js | 6 +-- .../pages/webview-custom-zoom-level.html | 13 +++--- .../pages/webview-in-page-navigate.html | 32 +++++++++++++++ spec/fixtures/pages/zoom-factor.html | 2 +- spec/webview-spec.js | 40 ++++++++++++++++--- 5 files changed, 79 insertions(+), 14 deletions(-) create mode 100644 spec/fixtures/pages/webview-in-page-navigate.html diff --git a/spec/api-web-contents-spec.js b/spec/api-web-contents-spec.js index d7a894cce4..448d2556a1 100644 --- a/spec/api-web-contents-spec.js +++ b/spec/api-web-contents-spec.js @@ -496,7 +496,7 @@ describe('webContents module', function () { }) }) ipcMain.once('temporary-zoom-set', (e, zoomLevel) => { - w2.loadURL(`file://${fixtures}/pages/a.html`) + w2.loadURL(`file://${fixtures}/pages/c.html`) finalZoomLevel = zoomLevel }) w.loadURL(`file://${fixtures}/pages/webframe-zoom.html`) @@ -521,10 +521,10 @@ describe('webContents module', function () { }) ipcMain.once('zoom-level-set', (e, zoomLevel) => { assert.equal(zoomLevel, 0.6) - w.loadURL(`file://${fixtures}/pages/b.html`) + w.loadURL(`file://${fixtures}/pages/d.html`) initialNavigation = false }) - w.loadURL(`file://${fixtures}/pages/a.html`) + w.loadURL(`file://${fixtures}/pages/c.html`) }) }) }) diff --git a/spec/fixtures/pages/webview-custom-zoom-level.html b/spec/fixtures/pages/webview-custom-zoom-level.html index 0598623a66..24f246fdd2 100644 --- a/spec/fixtures/pages/webview-custom-zoom-level.html +++ b/spec/fixtures/pages/webview-custom-zoom-level.html @@ -1,20 +1,23 @@ - + + diff --git a/spec/fixtures/pages/zoom-factor.html b/spec/fixtures/pages/zoom-factor.html index 4c04e38f3a..c27b5ea495 100644 --- a/spec/fixtures/pages/zoom-factor.html +++ b/spec/fixtures/pages/zoom-factor.html @@ -2,7 +2,7 @@ diff --git a/spec/webview-spec.js b/spec/webview-spec.js index 40e6a8bffd..027a3a9520 100644 --- a/spec/webview-spec.js +++ b/spec/webview-spec.js @@ -1527,6 +1527,21 @@ describe(' tag', function () { }) describe('zoom behavior', () => { + const zoomScheme = remote.getGlobal('zoomScheme') + const webviewSession = session.fromPartition('webview-temp') + + before((done) => { + const protocol = webviewSession.protocol + protocol.registerStringProtocol(zoomScheme, (request, callback) => { + callback('hello') + }, (error) => done(error)) + }) + + after((done) => { + const protocol = webviewSession.protocol + protocol.unregisterProtocol(zoomScheme, (error) => done(error)) + }) + it('inherits the zoomFactor of the parent window', (done) => { w = new BrowserWindow({ show: false, @@ -1534,7 +1549,7 @@ describe(' tag', function () { zoomFactor: 1.2 } }) - ipcMain.once('webview-zoom-level', (event, zoomFactor, zoomLevel) => { + ipcMain.once('webview-parent-zoom-level', (event, zoomFactor, zoomLevel) => { assert.equal(zoomFactor, 1.2) assert.equal(zoomLevel, 1) done() @@ -1542,24 +1557,39 @@ describe(' tag', function () { w.loadURL(`file://${fixtures}/pages/webview-zoom-factor.html`) }) - it('inherits the zoomLevel of parent window on navigation', (done) => { + it('maintains zoom level on navigation', (done) => { w = new BrowserWindow({ show: false, webPreferences: { zoomFactor: 1.2 } }) - ipcMain.on('webview-zoom-level', (event, zoomLevel, zoomFactor, final) => { - if (!final) { + ipcMain.on('webview-zoom-level', (event, zoomLevel, zoomFactor, newHost, final) => { + if (!newHost) { assert.equal(zoomFactor, 1.44) assert.equal(zoomLevel, 2.0) } else { assert.equal(zoomFactor, 1.2) assert.equal(zoomLevel, 1) - done() } + if (final) done() }) w.loadURL(`file://${fixtures}/pages/webview-custom-zoom-level.html`) }) + + it('maintains zoom level when navigating within same page', (done) => { + w = new BrowserWindow({ + show: false, + webPreferences: { + zoomFactor: 1.2 + } + }) + ipcMain.on('webview-zoom-in-page', (event, zoomLevel, zoomFactor, final) => { + assert.equal(zoomFactor, 1.44) + assert.equal(zoomLevel, 2.0) + if (final) done() + }) + w.loadURL(`file://${fixtures}/pages/webview-in-page-navigate.html`) + }) }) })