Skip to content

Commit

Permalink
Merge pull request #15019 from Anrock/child-window-location
Browse files Browse the repository at this point in the history
fix: Introduce LocationProxy for BrowserWindowProxy
  • Loading branch information
Cheng Zhao committed Dec 4, 2018
2 parents 1f55f16 + ca7dec2 commit 5bc86ea
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 9 deletions.
53 changes: 51 additions & 2 deletions lib/renderer/window-setup.js
Expand Up @@ -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')
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion spec/api-browser-window-spec.js
Expand Up @@ -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}, '*')
`)
Expand Down
10 changes: 5 additions & 5 deletions spec/chromium-spec.js
Expand Up @@ -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()
})
Expand Down Expand Up @@ -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()
})
})
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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')
Expand Down
2 changes: 1 addition & 1 deletion spec/fixtures/pages/window-opener-location.html
@@ -1,7 +1,7 @@
<html>
<body>
<script type="text/javascript" charset="utf-8">
window.opener.postMessage(window.opener.location, '*')
window.opener.postMessage(window.opener.location.href, '*')
</script>
</body>
</html>

0 comments on commit 5bc86ea

Please sign in to comment.