aboutsummaryrefslogblamecommitdiffstats
path: root/app/scripts/background.js
blob: ddb867219d8f5e6969ffa7b02f5b226021d9f02b (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                                                             
 
                    
 




                                                                
















                                                           

  
                            


                                                                   










                                                                   
             
 



                                       
                         


                                 
                            




                                    
 
                            

                                   
                        








                                       
                          



                               


               








                                            

                       
                                             

                         

                                                  



















                                                                  







                         
 
const identitiesUrl = 'https://alpha.metamask.io/identities/'
const messagingChannelName = 'metamask'

var unsignedTxs = {}

// setup badge click handler
chrome.browserAction.onClicked.addListener(function(activeTab) {
  chrome.tabs.create({ url: identitiesUrl })
})

// setup messaging
chrome.runtime.onConnect.addListener(connectRemote)
chrome.runtime.onConnectExternal.addListener(connectRemote)
function connectRemote(remote){
  remote.onMessage.addListener(handleMessage)
  exportUnsignedTxs(remote)
}

// load from storage
chrome.storage.sync.get(function(data){
  for (var key in data) {
    var serialized = data[key]
    var tx = deserializeTx(serialized)
    var hash = simpleHash(serialized)
    unsignedTxs[hash] = tx
  }
  updateBadge()
})

// listen to storage changes
chrome.storage.onChanged.addListener(function(changes, namespace) {
  for (key in changes) {
    var storageChange = changes[key]
    if (storageChange.oldValue && !storageChange.newValue) {
      // was removed
      removeTransaction(storageChange.oldValue)
    } else if (!storageChange.oldValue && storageChange.newValue) {
      // was added
      addTransaction(deserializeTx(storageChange.newValue))
    }
  }
})

// setup badge text
updateBadge()

function handleMessage(msg){
  console.log('got message!', msg.type)
  switch(msg.type){
    
    case 'addUnsignedTx':
      addTransaction(msg.payload)
      return

    case 'removeUnsignedTx':
      removeTransaction(msg.payload)
      return

  }
}

function addTransaction(tx){
  var serialized = serializeTx(tx)
  var hash = simpleHash(serialized)
  unsignedTxs[hash] = tx
  var data = {}
  data[hash] = serialized
  chrome.storage.sync.set(data)
  // trigger ui changes
  updateBadge()
}

function removeTransaction(serialized){
  var hash = simpleHash(serialized)
  delete unsignedTxs[hash]
  var data = {}
  data[hash] = undefined
  chrome.storage.sync.set(data)
  // trigger ui changes
  updateBadge()
}

function exportUnsignedTxs(remote){
  console.log('exporting txs!', unsignedTxs)
  var data = {
    type: 'importUnsignedTxs',
    payload: getValues(unsignedTxs),
  }
  remote.postMessage(data)
}

function updateBadge(){
  var label = ''
  var count = Object.keys(unsignedTxs).length
  if (count) {
    label = String(count)
  }
  chrome.browserAction.setBadgeText({text: label})
  chrome.browserAction.setBadgeBackgroundColor({color: '#506F8B'})
}

function simpleHash(input) {
  var hash = 0, i, chr, len
  if (input.length == 0) return hash
  for (i = 0, len = input.length; i < len; i++) {
    chr   = input.charCodeAt(i)
    hash  = ((hash << 5) - hash) + chr
    hash |= 0 // Convert to 32bit integer
  }
  return hash
}

function serializeTx(tx){
  return JSON.stringify(tx)
}

function deserializeTx(tx){
  return JSON.parse(tx)
}

function getValues(obj){
  var output = []
  for (var key in obj) {
    output.push(obj[key])
  }
  return output
}