Skip to content
This repository has been archived by the owner on Dec 27, 2022. It is now read-only.

Commit

Permalink
Use a custom executeJavaScript using worlds to get around sandboxing …
Browse files Browse the repository at this point in the history
…directives specified by sites (see raw github)
  • Loading branch information
pfrazee committed Oct 15, 2018
1 parent 52afd98 commit 06514ee
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 5 deletions.
27 changes: 22 additions & 5 deletions app/shell-window/pages.js
Expand Up @@ -166,6 +166,10 @@ export function create (opts) {
isTabDragging: false, // being dragged?
tabDragOffset: 0, // if being dragged, this is the current offset

// webview-preload execute-javascript state
executeJavascriptCalls: {},
executeJavascriptCallCounter: 0,

// get the current URL
getURL () {
return this.url
Expand Down Expand Up @@ -216,7 +220,7 @@ export function create (opts) {
// grab the current scroll-y
page.retainedScrollY = 0
try {
page.retainedScrollY = await page.webviewEl.getWebContents().executeJavaScript('window.scrollY')
page.retainedScrollY = await page.executeJavaScript('window.scrollY')
} catch (e) {
console.debug('Error while trying to fetch the page scrollY', e)
}
Expand Down Expand Up @@ -315,6 +319,14 @@ export function create (opts) {
})
}
}
},

executeJavaScript (code) {
return new Promise((resolve, reject) => {
var reqId = page.executeJavascriptCallCounter++
page.executeJavascriptCalls[reqId] = resolve
page.webviewEl.send('execute-javascript:call', reqId, code)
})
}
}
page.siteInfoNavbarBtn = new SiteInfoNavbarBtn(page)
Expand Down Expand Up @@ -788,7 +800,7 @@ function onDidStopLoading (e) {
cachedMarkdownRendererScript = fs.readFileSync(path.join(APP_PATH, 'markdown-renderer.build.js'), 'utf8')
}

page.webviewEl.executeJavaScript(cachedMarkdownRendererScript)
page.executeJavaScript(cachedMarkdownRendererScript)
}

// json rendering
Expand Down Expand Up @@ -825,7 +837,7 @@ function onDidStopLoading (e) {
cachedJSONRendererScript = fs.readFileSync(path.join(APP_PATH, 'json-renderer.build.js'), 'utf8')
}

page.webviewEl.executeJavaScript(cachedJSONRendererScript)
page.executeJavaScript(cachedJSONRendererScript)
}

// HACK
Expand Down Expand Up @@ -859,7 +871,7 @@ function onDidStopLoading (e) {

// if there is a retained scroll position, move the page
if (page.retainedScrollY) {
page.webviewEl.executeJavaScript(`
page.executeJavaScript(`
window.scroll(0, ${page.retainedScrollY})
`)
page.retainedScrollY = 0
Expand Down Expand Up @@ -916,7 +928,7 @@ function onDidFailLoad (e) {

// render failure page
var errorPageHTML = errorPage(e)
page.webviewEl.executeJavaScript('document.documentElement.innerHTML = \'' + errorPageHTML + '\'')
page.executeJavaScript('document.documentElement.innerHTML = \'' + errorPageHTML + '\'')
}
}

Expand Down Expand Up @@ -1008,6 +1020,11 @@ export function onIPCMessage (e) {
activePage.toggleLiveReloading()
}
break
case 'execute-javascript:result':
let resolve = page.executeJavascriptCalls[e.args[0]]
delete page.executeJavascriptCalls[e.args[0]]
resolve(e.args[1])
break
}
}

Expand Down
2 changes: 2 additions & 0 deletions app/webview-preload.js
Expand Up @@ -3,6 +3,7 @@ import * as rpcAPI from 'pauls-electron-rpc'
import * as beakerCoreWebview from '@beaker/core/webview'
import { setup as setupLocationbar } from './webview-preload/locationbar'
import { setup as setupPrompt } from './webview-preload/prompt'
import { setup as setupExecuteJavascript } from './webview-preload/execute-javascript'
import setupExitFullScreenHackfix from './webview-preload/exit-full-screen-hackfix'
import readableStreamAsyncIteratorPolyfill from './webview-preload/readable-stream-async-iterator-polyfill'

Expand All @@ -23,3 +24,4 @@ readableStreamAsyncIteratorPolyfill()
beakerCoreWebview.setup({ rpcAPI })
setupLocationbar()
setupPrompt()
setupExecuteJavascript()
9 changes: 9 additions & 0 deletions app/webview-preload/execute-javascript.js
@@ -0,0 +1,9 @@
import {webFrame, ipcRenderer} from 'electron'

export function setup (code) {
ipcRenderer.on('execute-javascript:call', (e, reqId, code) => {
webFrame.executeJavaScriptInIsolatedWorld(1, [{code}], true, res => {
ipcRenderer.sendToHost('execute-javascript:result', reqId, res)
})
})
}

0 comments on commit 06514ee

Please sign in to comment.