From cc1bb92f9d842f4d8a757358bf31c5de6c32592d Mon Sep 17 00:00:00 2001 From: kumavis Date: Sat, 1 Aug 2015 16:33:31 -0700 Subject: build overhaul + basic structure --- Gruntfile.js | 105 ++++++++++++++++-------------- app/.DS_Store | Bin 6148 -> 6148 bytes app/manifest.json | 8 ++- app/popup.html | 25 ------- app/scripts/background.js | 44 +++++++++++-- app/scripts/contentscript.js | 15 ++++- app/scripts/inpage.js | 15 +++++ app/scripts/lib/metamask-provider.js | 122 +++++++++++++++++++++++++++++++++++ app/scripts/metamask-provider.js | 122 ----------------------------------- app/scripts/popup.js | 3 - app/scripts/web3.js | 14 ---- 11 files changed, 249 insertions(+), 224 deletions(-) delete mode 100644 app/popup.html create mode 100644 app/scripts/inpage.js create mode 100644 app/scripts/lib/metamask-provider.js delete mode 100644 app/scripts/metamask-provider.js delete mode 100644 app/scripts/popup.js delete mode 100644 app/scripts/web3.js diff --git a/Gruntfile.js b/Gruntfile.js index d0c3b8f26..49e175366 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -15,8 +15,6 @@ module.exports = function (grunt) { // Time how long tasks take. Can help when optimizing build times require('time-grunt')(grunt); - grunt.loadNpmTasks('grunt-browserify'); - // Configurable paths var config = { app: 'app', @@ -72,11 +70,11 @@ module.exports = function (grunt) { // change this to '0.0.0.0' to access the server from outside hostname: 'localhost' }, - chrome: { + dev: { options: { open: false, base: [ - '<%= config.app %>' + '<%= config.dist %>' ] } }, @@ -93,9 +91,7 @@ module.exports = function (grunt) { // Empties folders to start fresh clean: { - chrome: { - }, - dist: { + basic: { files: [{ dot: true, src: [ @@ -215,15 +211,21 @@ module.exports = function (grunt) { // } // } // }, - // uglify: { - // dist: { - // files: { - // '<%= config.dist %>/scripts/scripts.js': [ - // '<%= config.dist %>/scripts/scripts.js' - // ] - // } - // } - // }, + uglify: { + dist: { + files: { + '<%= config.dist %>/scripts/background.js': [ + '<%= config.dist %>/scripts/background.js' + ], + '<%= config.dist %>/scripts/contentscript.js': [ + '<%= config.dist %>/scripts/contentscript.js' + ], + '<%= config.dist %>/scripts/inpage.js': [ + '<%= config.dist %>/scripts/inpage.js' + ], + } + } + }, // concat: { // dist: {} // }, @@ -231,7 +233,9 @@ module.exports = function (grunt) { browserify: { basic: { files: { - '<%= config.dist %>/scripts/web3.js': ['<%= config.app %>/scripts/web3.js'], + '<%= config.dist %>/scripts/background.js': ['<%= config.app %>/scripts/background.js'], + '<%= config.dist %>/scripts/contentscript.js': ['<%= config.app %>/scripts/contentscript.js'], + '<%= config.dist %>/scripts/inpage.js': ['<%= config.app %>/scripts/inpage.js'], }, }, }, @@ -251,26 +255,12 @@ module.exports = function (grunt) { 'styles/{,*/}*.css', 'styles/fonts/{,*/}*.*', '_locales/{,*/}*.json', + 'manifest.json', ] }] } }, - // Run some tasks in parallel to speed up build process - concurrent: { - chrome: [ - 'browserify', - ], - dist: [ - 'imagemin', - 'svgmin', - 'browserify', - ], - test: [ - 'browserify', - ] - }, - // Auto buildnumber, exclude dev files. smart builds that event pages chromeManifest: { dist: { @@ -284,9 +274,9 @@ module.exports = function (grunt) { ] } }, - src: '<%= config.app %>', + src: '<%= config.dist %>', dest: '<%= config.dist %>' - } + }, }, // Compres dist files to package @@ -305,40 +295,57 @@ module.exports = function (grunt) { dest: '' }] } - } + }, + + // Run some tasks in parallel to speed up build process + concurrent: { + dev: [ + 'browserify', + ], + dist: [ + 'imagemin', + 'svgmin', + 'browserify', + ], + test: [ + 'browserify', + ] + }, + + }); grunt.registerTask('dev', function () { grunt.task.run([ - 'concurrent:chrome', - 'connect:chrome', - 'build', + 'clean', + 'concurrent:dev', + 'connect:dev', + 'copy', + 'watch', ]); }); grunt.registerTask('test', [ - 'jshint', + // 'jshint', + 'concurrent:test', 'connect:test', - 'mocha' + 'copy', + + 'mocha', ]); grunt.registerTask('build', [ - 'clean:dist', - 'chromeManifest:dist', - 'useminPrepare', + 'clean', 'concurrent:dist', - 'cssmin', - 'concat', 'uglify', 'copy', - 'usemin', - 'compress' + 'chromeManifest:dist', + 'compress', ]); grunt.registerTask('default', [ - 'jshint', 'test', - 'build' + 'build', ]); }; diff --git a/app/.DS_Store b/app/.DS_Store index 9f45b9329..817a0eb72 100644 Binary files a/app/.DS_Store and b/app/.DS_Store differ diff --git a/app/manifest.json b/app/manifest.json index bc7518691..3a5456cce 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -1,6 +1,6 @@ { "name": "__MSG_appName__", - "version": "0.0.17", + "version": "0.0.49", "manifest_version": 2, "description": "__MSG_appDescription__", "icons": { @@ -19,8 +19,7 @@ "19": "images/icon-19.png", "38": "images/icon-38.png" }, - "default_title": "metamask", - "default_popup": "popup.html" + "default_title": "metamask" }, "content_scripts": [ { @@ -35,6 +34,9 @@ "all_frames": false } ], + "permissions": [ + "storage" + ], "web_accessible_resources": [ "scripts/web3.js" ] diff --git a/app/popup.html b/app/popup.html deleted file mode 100644 index bc8b6411b..000000000 --- a/app/popup.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - -

'Allo, 'Allo!

- - - - - - - - - - - diff --git a/app/scripts/background.js b/app/scripts/background.js index 87a27d0db..1557814b4 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -1,9 +1,41 @@ -'use strict'; +const web3 = require('web3') -chrome.runtime.onInstalled.addListener(function (details) { - console.log('previousVersion', details.previousVersion); -}); +const identitiesUrl = 'https://alpha.metamask.io/identities/' +const messagingChannelName = 'metamask' -chrome.browserAction.setBadgeText({text: '2'}); -console.log('\'Allo \'Allo! Event Page for Browser Action'); +// setup badge click handler +chrome.browserAction.onClicked.addListener(function(activeTab) { + chrome.tabs.create({ url: identitiesUrl }) +}) + +// setup page<->plugin messaging +chrome.runtime.onConnect.addListener(function(port) { + console.assert(port.name == messagingChannelName) + port.onMessage.addListener(function(msg) { + console.log(msg) + port.postMessage({answer: 'Madame'}) + }) +}) + +// update badge text +chrome.browserAction.setBadgeText({text: '2'}) + +// listen to storage changes +chrome.storage.onChanged.addListener(function(changes, namespace) { + for (key in changes) { + var storageChange = changes[key] + console.log('Storage key "%s" in namespace "%s" changed. ' + + 'Old value was "%s", new value is "%s".', + key, + namespace, + storageChange.oldValue, + storageChange.newValue) + } +}) + +// Save it using the Chrome extension storage API. +chrome.storage.sync.set({'zzz': 22}, function() { + // Notify that we saved. + console.log('Settings saved') +}) \ No newline at end of file diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 23df227b4..2e50ae3a5 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -1,5 +1,16 @@ +const web3 = require('web3') + +// inject script tag var scriptTag = document.createElement('script') scriptTag.src = chrome.extension.getURL('scripts/web3.js') - scriptTag.onload = function() { debugger; this.parentNode.removeChild(this) } -;(document.head||document.documentElement).appendChild(scriptTag) +var container = document.head || document.documentElement +container.appendChild(scriptTag) + +// listen for messages +var port = chrome.runtime.connect({name: 'metamask'}) +port.postMessage({joke: 'Knock knock'}) +port.onMessage.addListener(function(msg) { + console.log(msg) + // port.postMessage({answer: 'Madame'}) +}) \ No newline at end of file diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js new file mode 100644 index 000000000..02bf226cb --- /dev/null +++ b/app/scripts/inpage.js @@ -0,0 +1,15 @@ +const web3 = require('web3') +const MetamaskProvider = require('./lib/metamask-provider.js') + +const rpcUrl = 'https://rpc.metamask.io' + + +var provider = new MetamaskProvider(forwardPayload, rpcUrl) +web3.setProvider(provider) + +// injecting web3 +window.web3 = web3 + +function forwardPayload(){ + debugger +} \ No newline at end of file diff --git a/app/scripts/lib/metamask-provider.js b/app/scripts/lib/metamask-provider.js new file mode 100644 index 000000000..c52de82b4 --- /dev/null +++ b/app/scripts/lib/metamask-provider.js @@ -0,0 +1,122 @@ +var HttpProvider = require('web3/lib/web3/httpprovider.js') +var ethUtils = require('ethereumjs-util') +var async = require('async') + +module.exports = MetamaskProvider + + +function MetamaskProvider(forwardPayload, host) { + this.handlers = [] + this.forwardPayload = forwardPayload + this.http = new HttpProvider(host) +} + +MetamaskProvider.prototype.send = function (payload) { + if (Array.isArray(payload)) { + return payload.map( this.handlePayload.bind(this) ) + } else { + return this.handlePayload( payload ) + } +} + +MetamaskProvider.prototype.sendAsync = function (payload, cb) { + if (Array.isArray(payload)) { + async.map( payload, this.handlePayload.bind(this), cb ) + } else { + this.handlePayload( payload, cb ) + } +} + +MetamaskProvider.prototype.handlePayload = function (payload, cb) { + var _this = this + var isSync = !cb + var resolvedSync = true + var result = undefined + + // TODO - this should be injected from Vapor dapp starts + var exposedAccounts = ['0xa06ef3ed1ce41ade87f764de6ce8095c569d6d57'] + + switch (payload.method) { + + case 'web3_sha3': + var inputHex = stripHexStringPrefix(payload.params[0]) + var hash = '0x'+ethUtils.sha3(new Buffer(inputHex, 'hex')).toString('hex') + return handleResult(null, wrapResponse(payload, hash)) + + case 'eth_sendTransaction': + this.forwardPayload(payload) + return handleResult(null, wrapResponse(payload, '')) + + case 'eth_coinbase': + var currentAddress = exposedAccounts[0] + return handleResult(null, wrapResponse(payload, currentAddress)) + + case 'eth_accounts': + return handleResult(null, wrapResponse(payload, exposedAccounts)) + + case 'eth_gasPrice': + // TODO - this should be dynamically set somehow + var gasPrice = '0x01' + return handleResult(null, wrapResponse(payload, [gasPrice])) + + case 'eth_call': + var params = payload.params + // default 'from' to default account + var args = params[0] + if (!args.from) { + var currentAddress = exposedAccounts[0] + args.from = currentAddress + } + // default block to latest + params[1] = params[1] || 'latest' + // turn on debug trace + params[2] = global.DEBUG_RPC + return handleNormally() + + default: + return handleNormally() + } + + resolvedSync = false + + function handleNormally(){ + if (isSync) { + return handleResult(null, _this.http.send(payload)) + } else { + _this.http.sendAsync(payload, handleResult) + } + } + + // helper for normalizing handling of sync+async responses + function handleResult(err, resp) { + if (isSync) { + return resp + } else { + if (resolvedSync) { + process.nextTick(cb.bind(null, err, resp)) + } else { + cb(err, resp) + } + } + } +} + +function wrapResponse(payload, result){ + return { + jsonrpc: payload.jsonrpc, + id: payload.id, + result: result, + } +} + +function stripHexStringPrefix(hex) { + if (!hex) { + return hex + } + + if (hex.slice(0, 2) === '0x') { + return hex.slice(2); + } else { + return hex; + } +} \ No newline at end of file diff --git a/app/scripts/metamask-provider.js b/app/scripts/metamask-provider.js deleted file mode 100644 index c52de82b4..000000000 --- a/app/scripts/metamask-provider.js +++ /dev/null @@ -1,122 +0,0 @@ -var HttpProvider = require('web3/lib/web3/httpprovider.js') -var ethUtils = require('ethereumjs-util') -var async = require('async') - -module.exports = MetamaskProvider - - -function MetamaskProvider(forwardPayload, host) { - this.handlers = [] - this.forwardPayload = forwardPayload - this.http = new HttpProvider(host) -} - -MetamaskProvider.prototype.send = function (payload) { - if (Array.isArray(payload)) { - return payload.map( this.handlePayload.bind(this) ) - } else { - return this.handlePayload( payload ) - } -} - -MetamaskProvider.prototype.sendAsync = function (payload, cb) { - if (Array.isArray(payload)) { - async.map( payload, this.handlePayload.bind(this), cb ) - } else { - this.handlePayload( payload, cb ) - } -} - -MetamaskProvider.prototype.handlePayload = function (payload, cb) { - var _this = this - var isSync = !cb - var resolvedSync = true - var result = undefined - - // TODO - this should be injected from Vapor dapp starts - var exposedAccounts = ['0xa06ef3ed1ce41ade87f764de6ce8095c569d6d57'] - - switch (payload.method) { - - case 'web3_sha3': - var inputHex = stripHexStringPrefix(payload.params[0]) - var hash = '0x'+ethUtils.sha3(new Buffer(inputHex, 'hex')).toString('hex') - return handleResult(null, wrapResponse(payload, hash)) - - case 'eth_sendTransaction': - this.forwardPayload(payload) - return handleResult(null, wrapResponse(payload, '')) - - case 'eth_coinbase': - var currentAddress = exposedAccounts[0] - return handleResult(null, wrapResponse(payload, currentAddress)) - - case 'eth_accounts': - return handleResult(null, wrapResponse(payload, exposedAccounts)) - - case 'eth_gasPrice': - // TODO - this should be dynamically set somehow - var gasPrice = '0x01' - return handleResult(null, wrapResponse(payload, [gasPrice])) - - case 'eth_call': - var params = payload.params - // default 'from' to default account - var args = params[0] - if (!args.from) { - var currentAddress = exposedAccounts[0] - args.from = currentAddress - } - // default block to latest - params[1] = params[1] || 'latest' - // turn on debug trace - params[2] = global.DEBUG_RPC - return handleNormally() - - default: - return handleNormally() - } - - resolvedSync = false - - function handleNormally(){ - if (isSync) { - return handleResult(null, _this.http.send(payload)) - } else { - _this.http.sendAsync(payload, handleResult) - } - } - - // helper for normalizing handling of sync+async responses - function handleResult(err, resp) { - if (isSync) { - return resp - } else { - if (resolvedSync) { - process.nextTick(cb.bind(null, err, resp)) - } else { - cb(err, resp) - } - } - } -} - -function wrapResponse(payload, result){ - return { - jsonrpc: payload.jsonrpc, - id: payload.id, - result: result, - } -} - -function stripHexStringPrefix(hex) { - if (!hex) { - return hex - } - - if (hex.slice(0, 2) === '0x') { - return hex.slice(2); - } else { - return hex; - } -} \ No newline at end of file diff --git a/app/scripts/popup.js b/app/scripts/popup.js deleted file mode 100644 index 815abcb42..000000000 --- a/app/scripts/popup.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -console.log('\'Allo \'Allo! Popup'); diff --git a/app/scripts/web3.js b/app/scripts/web3.js deleted file mode 100644 index f0fec7b06..000000000 --- a/app/scripts/web3.js +++ /dev/null @@ -1,14 +0,0 @@ -const web3 = require('web3') -const MetamaskProvider = require('./metamask-provider.js') - - -var provider = new MetamaskProvider(forwardPayload, 'https://rpc.metamask.io') -web3.setProvider(provider) - -console.log('injecting web3....') -window.web3 = web3 - - -function forwardPayload(){ - debugger -} \ No newline at end of file -- cgit v1.2.3