diff options
builds smoothly + forwards txs to extension
-rw-r--r-- | Gruntfile.js | 216 | ||||
-rw-r--r-- | app/manifest.json | 2 | ||||
-rw-r--r-- | app/scripts/background.js | 56 | ||||
-rw-r--r-- | app/scripts/contentscript.js | 29 | ||||
-rw-r--r-- | app/scripts/inpage.js | 10 | ||||
-rw-r--r-- | bower.json | 6 | ||||
-rw-r--r-- | package.json | 6 |
7 files changed, 136 insertions, 189 deletions
diff --git a/Gruntfile.js b/Gruntfile.js index 49e175366..8e3b23318 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -28,27 +28,16 @@ module.exports = function (grunt) { // Watches files for changes and runs tasks based on the changed files watch: { - bower: { - files: ['bower.json'], - tasks: ['bowerInstall'] - }, js: { files: ['<%= config.app %>/scripts/{,*/}*.js'], options: { livereload: '<%= connect.options.livereload %>' }, - tasks: ['useminPrepare', 'usemin', 'browserify'], + tasks: ['browserify:dev'], }, gruntfile: { files: ['Gruntfile.js'] }, - styles: { - files: ['<%= config.app %>/styles/{,*/}*.css'], - tasks: [], - options: { - livereload: '<%= connect.options.livereload %>' - } - }, livereload: { options: { livereload: '<%= connect.options.livereload %>' @@ -102,115 +91,28 @@ module.exports = function (grunt) { } }, - // Make sure code styles are up to par and there are no obvious mistakes - jshint: { - options: { - jshintrc: '.jshintrc', - reporter: require('jshint-stylish') - }, - all: [ - 'Gruntfile.js', - '<%= config.app %>/scripts/{,*/}*.js', - '!<%= config.app %>/scripts/vendor/*', - 'test/spec/{,*/}*.js' - ] - }, - mocha: { - all: { - options: { - run: true, - urls: ['http://localhost:<%= connect.options.port %>/index.html'] - } - } - }, - - // Automatically inject Bower components into the HTML file - bowerInstall: { - app: { - src: [ - '<%= config.app %>/*.html' - ] - } - }, - - // Reads HTML for usemin blocks to enable smart builds that automatically - // concat, minify and revision files. Creates configurations in memory so - // additional tasks can operate on them - useminPrepare: { - options: { - dest: '<%= config.dist %>' - }, - html: [ - '<%= config.app %>/popup.html', - '<%= config.app %>/options.html' - ] - }, - - // Performs rewrites based on rev and the useminPrepare configuration - usemin: { - options: { - assetsDirs: ['<%= config.dist %>', '<%= config.dist %>/images'] - }, - html: ['<%= config.dist %>/{,*/}*.html'], - css: ['<%= config.dist %>/styles/{,*/}*.css'] - }, - - // The following *-min tasks produce minifies files in the dist folder - imagemin: { - dist: { - files: [{ - expand: true, - cwd: '<%= config.app %>/images', - src: '{,*/}*.{gif,jpeg,jpg,png}', - dest: '<%= config.dist %>/images' - }] - } - }, - - svgmin: { - dist: { - files: [{ - expand: true, - cwd: '<%= config.app %>/images', - src: '{,*/}*.svg', - dest: '<%= config.dist %>/images' - }] - } - }, - - htmlmin: { + // Build js files + browserify: { dist: { + files: { + '<%= 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'], + }, + }, + dev: { options: { - // removeCommentsFromCDATA: true, - // collapseWhitespace: true, - // collapseBooleanAttributes: true, - // removeAttributeQuotes: true, - // removeRedundantAttributes: true, - // useShortDoctype: true, - // removeEmptyAttributes: true, - // removeOptionalTags: true + watch: true, }, - files: [{ - expand: true, - cwd: '<%= config.app %>', - src: '*.html', - dest: '<%= config.dist %>' - }] - } + files: { + '<%= 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'], + }, + }, }, - // By default, your `index.html`'s <!-- Usemin block --> will take care of - // minification. These next options are pre-configured if you do not wish - // to use the Usemin blocks. - // cssmin: { - // dist: { - // files: { - // '<%= config.dist %>/styles/main.css': [ - // '<%= config.app %>/styles/{,*/}*.css' - // ] - // } - // } - // }, + // minify js uglify: { dist: { files: { @@ -226,23 +128,10 @@ module.exports = function (grunt) { } } }, - // concat: { - // dist: {} - // }, - - browserify: { - basic: { - files: { - '<%= 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'], - }, - }, - }, // Copies remaining files to places other tasks can use copy: { - dist: { + basic: { files: [{ expand: true, dot: true, @@ -258,7 +147,19 @@ module.exports = function (grunt) { 'manifest.json', ] }] - } + }, + dev: { + files: [{ + expand: true, + dot: true, + cwd: '<%= config.app %>', + dest: '<%= config.dist %>', + src: [ + 'images/{,*/}*.*', + 'scripts/chromereload.js', + ] + }] + }, }, // Auto buildnumber, exclude dev files. smart builds that event pages @@ -279,6 +180,42 @@ module.exports = function (grunt) { }, }, + // Make sure code styles are up to par and there are no obvious mistakes + jshint: { + options: { + jshintrc: '.jshintrc', + reporter: require('jshint-stylish') + }, + all: [ + 'Gruntfile.js', + '<%= config.app %>/scripts/{,*/}*.js', + '!<%= config.app %>/scripts/vendor/*', + 'test/spec/{,*/}*.js' + ] + }, + + // Testing + mocha: { + all: { + options: { + run: true, + urls: ['http://localhost:<%= connect.options.port %>/index.html'] + } + } + }, + + // The following *-min tasks produce minifies files in the dist folder + imagemin: { + dist: { + files: [{ + expand: true, + cwd: '<%= config.app %>/images', + src: '{,*/}*.{gif,jpeg,jpg,png}', + dest: '<%= config.dist %>/images' + }] + } + }, + // Compres dist files to package compress: { dist: { @@ -299,17 +236,10 @@ module.exports = function (grunt) { // Run some tasks in parallel to speed up build process concurrent: { - dev: [ - 'browserify', - ], dist: [ 'imagemin', - 'svgmin', - 'browserify', + 'browserify:dist', ], - test: [ - 'browserify', - ] }, @@ -318,9 +248,9 @@ module.exports = function (grunt) { grunt.registerTask('dev', function () { grunt.task.run([ 'clean', - 'concurrent:dev', - 'connect:dev', + 'browserify:dev', 'copy', + 'connect:dev', 'watch', ]); @@ -328,7 +258,7 @@ module.exports = function (grunt) { grunt.registerTask('test', [ // 'jshint', - 'concurrent:test', + 'browserify:dist', 'connect:test', 'copy', @@ -339,7 +269,7 @@ module.exports = function (grunt) { 'clean', 'concurrent:dist', 'uglify', - 'copy', + 'copy:dist', 'chromeManifest:dist', 'compress', ]); diff --git a/app/manifest.json b/app/manifest.json index 3a5456cce..cd23eee87 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -38,6 +38,6 @@ "storage" ], "web_accessible_resources": [ - "scripts/web3.js" + "scripts/inpage.js" ] }
\ No newline at end of file diff --git a/app/scripts/background.js b/app/scripts/background.js index 1557814b4..2dd5c88c7 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -1,8 +1,7 @@ -const web3 = require('web3') - const identitiesUrl = 'https://alpha.metamask.io/identities/' const messagingChannelName = 'metamask' +var pendingTxs = [] // setup badge click handler chrome.browserAction.onClicked.addListener(function(activeTab) { @@ -13,29 +12,42 @@ chrome.browserAction.onClicked.addListener(function(activeTab) { chrome.runtime.onConnect.addListener(function(port) { console.assert(port.name == messagingChannelName) port.onMessage.addListener(function(msg) { - console.log(msg) - port.postMessage({answer: 'Madame'}) + addTransaction(msg.payload) }) }) +// 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') +// }) + // update badge text -chrome.browserAction.setBadgeText({text: '2'}) +updateBadge() -// 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 +function addTransaction(tx){ + pendingTxs.push(tx) + updateBadge() +} + +function updateBadge(){ + var label = '' + if (pendingTxs.length) { + label = String(pendingTxs.length) + } + chrome.browserAction.setBadgeText({text: label}) +}
\ No newline at end of file diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 2e50ae3a5..53ec9eef5 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -1,16 +1,25 @@ -const web3 = require('web3') +const messageType = 'metamaskMessage' -// inject script tag + +// inject in-page script var scriptTag = document.createElement('script') -scriptTag.src = chrome.extension.getURL('scripts/web3.js') -scriptTag.onload = function() { debugger; this.parentNode.removeChild(this) } +scriptTag.src = chrome.extension.getURL('scripts/inpage.js') +scriptTag.onload = function() { this.parentNode.removeChild(this) } 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 +var metamaskPlugin = chrome.runtime.connect({name: 'metamask'}) +// metamaskPlugin.onMessage.addListener(function(msg) { +// console.log(msg) +// }) + +window.addEventListener('message', receiveMessage, false); +function receiveMessage(event){ + var msg = event.data + // validate message type + if (typeof msg !== 'object') return + if (msg.type !== messageType) return + // forward message + metamaskPlugin.postMessage(msg) +}
\ No newline at end of file diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js index 02bf226cb..006a8e0bb 100644 --- a/app/scripts/inpage.js +++ b/app/scripts/inpage.js @@ -2,14 +2,20 @@ const web3 = require('web3') const MetamaskProvider = require('./lib/metamask-provider.js') const rpcUrl = 'https://rpc.metamask.io' +const messageType = 'metamaskMessage' +const documentOrigin = window.location.origin var provider = new MetamaskProvider(forwardPayload, rpcUrl) web3.setProvider(provider) // injecting web3 +console.log('Metamask injected web3') window.web3 = web3 -function forwardPayload(){ - debugger +function forwardPayload(payload){ + window.postMessage({ + type: messageType, + payload: payload, + }, documentOrigin) }
\ No newline at end of file diff --git a/bower.json b/bower.json deleted file mode 100644 index 450275da3..000000000 --- a/bower.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "metamask", - "version": "0.0.0", - "dependencies": {}, - "devDependencies": {} -} diff --git a/package.json b/package.json index 424dd8d3a..183ccf6c9 100644 --- a/package.json +++ b/package.json @@ -8,23 +8,19 @@ }, "devDependencies": { "grunt": "~0.4.1", - "grunt-bower-install": "~1.0.0", "grunt-browserify": "^4.0.0", "grunt-chrome-manifest": "~0.2.0", "grunt-concurrent": "~0.5.0", "grunt-contrib-clean": "~0.5.0", "grunt-contrib-compress": "~0.9.1", - "grunt-contrib-concat": "~0.3.0", "grunt-contrib-connect": "~0.7.1", "grunt-contrib-copy": "~0.5.0", - "grunt-contrib-cssmin": "~0.9.0", - "grunt-contrib-htmlmin": "~0.2.0", "grunt-contrib-imagemin": "~0.7.1", + "grunt-svgmin": "~0.4.0", "grunt-contrib-jshint": "~0.9.2", "grunt-contrib-uglify": "~0.4.0", "grunt-contrib-watch": "~0.6.1", "grunt-mocha": "~0.4.10", - "grunt-svgmin": "~0.4.0", "grunt-usemin": "~2.1.0", "jshint-stylish": "~0.1.5", "load-grunt-tasks": "~0.4.0", |