sbot/ui/webview-preload.js

68 lines
1.7 KiB
JavaScript

var ipc = require('ipc')
var muxrpc = require('muxrpc')
var pull = require('pull-stream')
var pushable = require('pull-pushable')
// setup rpc connection with parent
var manifest = {
'get' : 'async',
'whoami' : 'async',
'relatedMessages' : 'async',
'createFeedStream' : 'source',
'createUserStream' : 'source',
'createLogStream' : 'source',
'messagesByType' : 'source',
'links' : 'source'
}
var ssb = muxrpc(manifest, null, serialize)()
function serialize (stream) { return stream }
var rpcStream = ssb.createStream()
var ipcPush = pushable()
ipc.on('muxrpc-ssb', function (msg) {
try {
if (typeof msg == 'string')
msg = JSON.parse(msg)
} catch (e) {
return
}
ipcPush.push(msg)
})
pull(ipcPush, rpcStream, pull.drain(
function (msg) { ipc.sendToHost('muxrpc-ssb', JSON.stringify(msg)) },
function (err) { if (err) { console.error(err) } }
))
// sandbox
// prevent navigations through default behavior
var location = window.document.location
var preventNavigation = function (e) {
var originalHashValue = location.hash
window.setTimeout(function () {
location.hash = 'preventNavigation' + ~~ (9999 * Math.random())
location.hash = originalHashValue
}, 0)
}
window.addEventListener('beforeunload', preventNavigation, false)
window.addEventListener('unload', preventNavigation, false)
// send navigations to the parent frame
window.addEventListener('click', function (e) {
var el = e.target
while (el) {
if (el.tagName == 'A') {
console.log('navigate', el.getAttribute('href'))
ipc.sendToHost('navigate', el.getAttribute('href'))
return
}
el = el.parentNode
}
}, false)
// exports
window.pull = pull
window.ssb = ssb