1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00
metamask-extension/app/scripts/contentscript.js

71 lines
2.2 KiB
JavaScript
Raw Normal View History

const LocalMessageDuplexStream = require('post-message-stream')
2015-12-19 07:05:16 +01:00
const PortStream = require('./lib/port-stream.js')
2016-05-06 01:04:43 +02:00
const ObjectMultiplex = require('./lib/obj-multiplex')
const extension = require('./lib/extension')
2016-05-06 01:04:43 +02:00
const fs = require('fs')
const path = require('path')
2016-07-26 02:33:22 +02:00
const inpageText = fs.readFileSync(path.join(__dirname + '/inpage.js')).toString()
// Eventually this streaming injection could be replaced with:
// https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Language_Bindings/Components.utils.exportFunction
//
// But for now that is only Firefox
// If we create a FireFox-only code path using that API,
// MetaMask will be much faster loading and performant on Firefox.
if (shouldInjectWeb3()) {
setupInjection()
setupStreams()
}
function setupInjection(){
try {
// inject in-page script
var scriptTag = document.createElement('script')
scriptTag.src = extension.extension.getURL('scripts/inpage.js')
scriptTag.textContent = inpageText
scriptTag.onload = function () { this.parentNode.removeChild(this) }
var container = document.head || document.documentElement
// append as first child
container.insertBefore(scriptTag, container.children[0])
} catch (e) {
console.error('Metamask injection failed.', e)
}
}
function setupStreams(){
// setup communication to page and plugin
var pageStream = new LocalMessageDuplexStream({
name: 'contentscript',
target: 'inpage',
})
2016-08-30 01:49:58 +02:00
pageStream.on('error', console.error)
var pluginPort = extension.runtime.connect({name: 'contentscript'})
var pluginStream = new PortStream(pluginPort)
2016-08-30 01:49:58 +02:00
pluginStream.on('error', console.error)
// forward communication plugin->inpage
pageStream.pipe(pluginStream).pipe(pageStream)
// connect contentscript->inpage reload stream
var mx = ObjectMultiplex()
2016-08-30 01:49:58 +02:00
mx.on('error', console.error)
mx.pipe(pageStream)
var reloadStream = mx.createStream('reload')
2016-08-30 01:49:58 +02:00
reloadStream.on('error', console.error)
// if we lose connection with the plugin, trigger tab refresh
pluginStream.on('close', function () {
reloadStream.write({ method: 'reset' })
})
}
function shouldInjectWeb3(){
2016-06-25 02:22:27 +02:00
var shouldInject = (window.location.href.indexOf('.pdf') === -1)
return shouldInject
}