diff --git a/lib/renderer/window-setup.js b/lib/renderer/window-setup.js index f4ab44adb5bce..3da16bad7d407 100644 --- a/lib/renderer/window-setup.js +++ b/lib/renderer/window-setup.js @@ -23,7 +23,7 @@ // - document.hidden // - document.visibilityState -const { defineProperty } = Object +const { defineProperty, defineProperties } = Object // Helper function to resolve relative url. const a = window.top.document.createElement('a') @@ -54,12 +54,61 @@ const removeProxy = (guestId) => { delete windowProxies[guestId] } +function LocationProxy (ipcRenderer, guestId) { + const getGuestURL = function () { + const urlString = ipcRenderer.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD_SYNC', guestId, 'getURL') + try { + return new URL(urlString) + } catch (e) { + console.error('LocationProxy: failed to parse string', urlString, e) + } + + return null + } + + const propertyProxyFor = function (property) { + return { + get: function () { + const guestURL = getGuestURL() + const value = guestURL ? guestURL[property] : '' + return value === undefined ? '' : value + }, + set: function (newVal) { + const guestURL = getGuestURL() + if (guestURL) { + guestURL[property] = newVal + return ipcRenderer.sendSync( + 'ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD_SYNC', + guestId, 'loadURL', guestURL.toString()) + } + } + } + } + + defineProperties(this, { + hash: propertyProxyFor('hash'), + href: propertyProxyFor('href'), + host: propertyProxyFor('host'), + hostname: propertyProxyFor('hostname'), + origin: propertyProxyFor('origin'), + pathname: propertyProxyFor('pathname'), + port: propertyProxyFor('port'), + protocol: propertyProxyFor('protocol'), + search: propertyProxyFor('search') + }) + + this.toString = function () { + return this.href + } +} + function BrowserWindowProxy (ipcRenderer, guestId) { this.closed = false + const location = new LocationProxy(ipcRenderer, guestId) defineProperty(this, 'location', { get: function () { - return ipcRenderer.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD_SYNC', guestId, 'getURL') + return location }, set: function (url) { url = resolveURL(url) diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index 84d4abc85825c..e816a0c9e70a6 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -3480,7 +3480,7 @@ describe('BrowserWindow module', () => { iw.loadURL('about:blank') iw.webContents.executeJavaScript(` const opened = window.open() - openedLocation = opened.location + openedLocation = opened.location.href opened.close() window.postMessage({openedLocation}, '*') `) diff --git a/spec/chromium-spec.js b/spec/chromium-spec.js index 439475506a3a8..939b9c0fa8f40 100644 --- a/spec/chromium-spec.js +++ b/spec/chromium-spec.js @@ -515,7 +515,7 @@ describe('chromium feature', () => { } app.once('browser-window-created', (event, window) => { window.webContents.once('did-finish-load', () => { - assert.strictEqual(b.location, targetURL) + assert.strictEqual(b.location.href, targetURL) b.close() done() }) @@ -545,14 +545,14 @@ describe('chromium feature', () => { webContents.once('did-finish-load', () => { const { location } = b b.close() - assert.strictEqual(location, 'about:blank') + assert.strictEqual(location.href, 'about:blank') let c = null app.once('browser-window-created', (event, { webContents }) => { webContents.once('did-finish-load', () => { const { location } = c c.close() - assert.strictEqual(location, 'about:blank') + assert.strictEqual(location.href, 'about:blank') done() }) }) @@ -645,7 +645,7 @@ describe('chromium feature', () => { it('does nothing when origin of current window does not match opener', (done) => { listener = (event) => { - assert.strictEqual(event.data, null) + assert.strictEqual(event.data, '') done() } window.addEventListener('message', listener) @@ -694,7 +694,7 @@ describe('chromium feature', () => { it('does nothing when origin of webview src URL does not match opener', (done) => { webview = new WebView() webview.addEventListener('console-message', (e) => { - assert.strictEqual(e.message, 'null') + assert.strictEqual(e.message, '') done() }) webview.setAttribute('allowpopups', 'on') diff --git a/spec/fixtures/pages/window-opener-location.html b/spec/fixtures/pages/window-opener-location.html index c1594e667de30..d386f5cc5d9eb 100644 --- a/spec/fixtures/pages/window-opener-location.html +++ b/spec/fixtures/pages/window-opener-location.html @@ -1,7 +1,7 @@