Merge pull request #133 from d11e9/storage.sync

Extension storage sync and updated query params and files
pull/1/head
chriseth 9 years ago
commit fb1bfc636a
  1. 149
      assets/css/browser-solidity.css
  2. 2
      assets/css/universal-dapp.css
  3. 310
      assets/js/app.js
  4. 11
      background.js
  5. 37
      index.html
  6. 14
      manifest.json

@ -5,52 +5,100 @@ body {
font-weight: normal;
}
#editor {
position: absolute;
top: 0;
left: 0px;
left: 0;
width: auto;
bottom: 0px;
bottom: 0;
right: 37em;
}
.scroller {
position: absolute;
z-index: 999;
text-align: center;
cursor: pointer;
display: none;
padding: 0 0.9em;
vertical-align: middle;
background-color: rgba(255,255,255,0.8);
height: 100%;
font-size: 1.3em;
}
.scroller i {
line-height: 3em;
}
.scroller-right {
right: 0;
}
.scroller-left {
left: 0;
}
.files-wrapper {
position: absolute;
overflow: hidden;
top: 0;
left: 3em;
right: 3em;
}
#files {
list-style: none;
margin: 0;
font-size: 15px;
height: 2.5em;
box-sizing: border-box;
line-height: 2em;
padding: 0.5em 0 0;
position: relative;
left: 0;
top:0;
min-width:3000px;
border-bottom: 0 none;
}
#files .file,
#files .newFile {
#files .file {
display: inline-block;
padding: 0 0.6em;
box-sizing: border-box;
background-color: #f0f0f0;
background-color: #F4F6FF;
cursor: pointer;
margin-right: 0.5em;
border-right: 0.5em solid white;
position: relative;
display:table-cell;
text-align: center;
vertical-align: middle;
color: #999;
}
#files .newFile,
#files .toggleRHP {
background-color: #B1EAC5;
.newFile,
.toggleRHP {
display: block;
float: left;
margin-top: 0.5em;
padding: 0.6em;
font-weight: bold;
cursor: pointer;
color: black;
}
#files .toggleRHP {
.toggleRHP {
float: right;
width: 2em;
box-sizing: border-box;
position: absolute;
right: 0;
}
#files .file.active {
color: black;
font-weight: bold;
border-bottom: 0 none;
padding-right: 2.5em;
padding-right: 2em;
}
#files .file .remove {
position: absolute;
@ -76,6 +124,8 @@ body {
#files .file.active .remove { display: inline-block; }
#input {
border-top: 3px solid #F4F6FF;
padding-top: 0.5em;
font-size: 15px;
position: absolute;
top: 2.5em;
@ -93,42 +143,30 @@ body {
right: 0;
bottom: 0px;
overflow: auto;
border-left: 3px solid #efefef;
box-sizing: border-box;
}
#output {
border-top: 3px solid #efefef;
display: block;
}
#header {
font-size: 14px;
font-size: 12px;
}
#header #helpButton {
float: left;
padding: 1.2em;
padding-left: 2.2em;
font-size: 1.5em;
cursor: pointer;
margin: auto;
color: #000;
outline: none;
}
#header #solIcon {
float: right;
height: 5.1em;
height: 100%;
background-color: white;
}
#header #menu {
border-bottom: 3px solid #F4F6FF;
overflow: hidden;
background-color: #efefef;
height: 5.1em;
height: 2em;
font-size: 1.25em;
padding-top: 0.5em;
box-sizing: content-box;
}
@ -139,20 +177,26 @@ body {
}
#header #options li {
color: #aaa;
float: left;
padding: 1.2em;
font-size: 1.5em;
padding: 0.5em 0.6em;
font-size: 1em;
cursor: pointer;
background-color: transparent;
margin-right: 0.5em;
}
#header #options li.active {
color: black;
background-color: #F4F6FF;
}
#header #options li a {
color: inherit;
}
#header #optionViews {
clear: both;
overflow: auto;
background-color: #F4F6FF;
}
#header #optionViews > div {
display: none;
@ -174,7 +218,7 @@ body {
#header #optionViews .pre {
word-wrap: break-word;
background-color: #efefef;
background-color: #C6CFF7;
font-family: monospace;
border-radius: 3px;
display: inline-block;
@ -193,7 +237,7 @@ body {
}
#header #gist {
background-color: #efefef;
background-color: #C6CFF7;
font-size: 12px;
padding: 0.25em;
color: black;
@ -259,11 +303,11 @@ body {
#output .udapp {
border: 0 none;
box-shadow: none;
border-bottom: 3px solid #efefef;
border-bottom: 3px solid #F4F6FF;
}
.row {
.crow {
overflow: auto;
display: block;
clear: both;
@ -297,7 +341,9 @@ body {
word-wrap: break-word;
cursor: pointer;
position: relative;
margin: 0.25em;
margin: 0.5em;
border-radius: 0.6em;
padding: 1em 1.5em;
}
.sol.error pre,
@ -306,25 +352,26 @@ body {
margin: 0;
font-size: 10px;
border: 0 none;
padding: 0;
border-radius: 0;
}
.sol.error .close,
.sol.warning .close {
font-weight: bold;
position: absolute;
color: rgba(0,0,0,0.5);
top: 0;
right: 0;
padding: 0.5em;
}
.sol.error {
background-color: rgba(255, 0, 0, 0.5);
border: 1px solid #D00909;
background-color: rgba(255, 0, 0, 0.4);
}
.sol.warning {
background-color: rgba(210, 202, 36, 0.5);
border: 1px solid #BBB427;
background-color: rgba(210, 202, 36, 0.4);
}
#ghostbar {
@ -338,17 +385,23 @@ body {
bottom: 0;
}
#dragbar{
#dragbar {
background-color: transparent;
position: absolute;
width: 10px;
right: -10px;
top: 0;
width: 1em;
right: -3px;
top: 3em;
bottom: 0;
cursor: col-resize;
z-index: 999;
border-right: 3px solid #F4F6FF;
}
#editor .ace-tm .ace_gutter,
#editor .ace-tm .ace_gutter-active-line,
#editor .ace-tm .ace_marker-layer .ace_active-line {
background-color: rgba(225, 229, 251, 0.5);
}
input[readonly] {
padding: .4em;

@ -121,7 +121,7 @@
.udapp .instance {
padding: 0.4em;
background-color: rgba(236, 215, 215, 0.43);
background-color: rgb(244, 246, 255);
margin-bottom: 1em;
position: relative;
}

@ -2,34 +2,78 @@
$(document).ready(function() {
// ------------------ query params (hash) ----------------
function getQueryParams() {
var qs = window.location.hash.substr(1);
if (window.location.search.length > 0) {
// use legacy query params instead of hash
window.location.hash = window.location.search.substr(1);
window.location.search = "";
}
var params = {};
var parts = qs.split("&");
for (var x in parts) {
var keyValue = parts[x].split("=");
if (keyValue[0] !== "") params[keyValue[0]] = keyValue[1];
}
return params;
}
function updateQueryParams(params) {
var currentParams = getQueryParams();
var keys = Object.keys(params);
for (var x in keys) {
currentParams[keys[x]] = params[keys[x]];
}
var queryString = "#";
var updatedKeys = Object.keys(currentParams);
for( var y in updatedKeys) {
queryString += updatedKeys[y] + "=" + currentParams[updatedKeys[y]] + "&";
}
window.location.hash = queryString.slice(0, -1);
}
function syncQueryParams() {
$('#optimize').attr( 'checked', (getQueryParams().optimize == "true") );
}
window.onhashchange = syncQueryParams;
syncQueryParams();
// ------------------ gist load ----------------
function getGistId(str) {
var idr = /[0-9A-Fa-f]{8,}/;
var match = idr.exec(str)[0];
return match;
}
var location_query_params = window.location.search.substr(1).split("=");
var loadingFromGist = false;
if (location_query_params.indexOf('gist') !== -1 && location_query_params.length >= 2) {
var index = location_query_params.indexOf('gist');
var gistId;
var key = location_query_params[index+1];
if (key === '') {
var str = prompt("Enter the URL or ID of the Gist you would like to load.");
function getGistId(str) {
var idr = /[0-9A-Fa-f]{8,}/;
var match = idr.exec(str);
return match ? match[0] : null;
}
var queryParams = getQueryParams();
var loadingFromGist = false;
if (typeof queryParams['gist'] != undefined) {
var gistId;
if (queryParams['gist'] === '') {
var str = prompt("Enter the URL or ID of the Gist you would like to load.");
if (str !== '') {
gistId = getGistId( str );
loadingFromGist = !!gistId;
}
} else {
gistId = getGistId( key );
loadingFromGist = !!gistId;
}
$.ajax({
url: 'https://api.github.com/gists/'+gistId,
jsonp: 'callback',
dataType: 'jsonp',
gistId = queryParams['gist'];
loadingFromGist = !!gistId;
}
if (loadingFromGist) $.ajax({
url: 'https://api.github.com/gists/'+gistId,
jsonp: 'callback',
dataType: 'jsonp',
success: function(response){
if (response.data) {
for (var f in response.data.files) {
@ -43,14 +87,62 @@
}
window.localStorage[key] = content;
}
SOL_CACHE_FILE = fileKey(Object.keys(response.data.files)[0]);
updateFiles();
if (!response.data.files) {
alert( "Gist load error: " + response.data.message )
} else {
SOL_CACHE_FILE = fileKey(Object.keys(response.data.files)[0]);
updateFiles();
}
}
}
});
}
// ----------------- storage --------------------
function syncStorage() {
if (typeof chrome === 'undefined' || !chrome || !chrome.storage || !chrome.storage.sync) return;
var obj = {}
var done = false;
var count = 0
var dont = 0;
function check(key){
chrome.storage.sync.get( key, function(resp){
console.log("comparing to cloud", key, resp)
if (typeof resp[key] != 'undefined' && obj[key] !== resp[key] && confirm("Overwrite '" + fileNameFromKey(key) + "'? Click Ok to overwrite local file with file from cloud. Cancel will push your local file to the cloud.")) {
console.log("Overwriting", key )
localStorage.setItem( key, resp[key] );
updateFiles();
} else {
console.log( "add to obj", obj, key)
obj[key] = localStorage[key];
}
done++
if (done >= count) chrome.storage.sync.set( obj, function(){
console.log( "updated cloud files with: ", obj, this, arguments)
})
})
}
for (var y in window.localStorage) {
console.log("checking", y)
obj[y] = window.localStorage.getItem(y);
if (y.indexOf(SOL_CACHE_FILE_PREFIX) !== 0) continue;
count++;
check(y)
}
}
window.syncStorage = syncStorage;
syncStorage()
// ----------------- editor ----------------------
@ -59,7 +151,8 @@
var SOL_CACHE_FILE = null;
var editor = ace.edit("input");
var session = editor.getSession();
var sessions = {};
var Range = ace.require('ace/range').Range;
var errMarkerId = null;
@ -76,11 +169,22 @@
SOL_CACHE_FILE = getFiles()[0];
editor.setValue( window.localStorage[SOL_CACHE_FILE], -1);
var files = getFiles();
for (var x in files) {
sessions[files[x]] = newEditorSession(files[x])
}
editor.setSession( sessions[SOL_CACHE_FILE] );
editor.resize(true);
session.setMode("ace/mode/javascript");
session.setTabSize(4);
session.setUseSoftTabs(true);
function newEditorSession(filekey) {
var s = new ace.EditSession(window.localStorage[filekey], "ace/mode/javascript")
s.setTabSize(4);
s.setUseSoftTabs(true);
sessions[filekey] = s;
return s;
}
@ -88,7 +192,9 @@
$('#options li').click(function(ev){
var $el = $(this);
var cls = /[a-z]+View/.exec( $el.get(0).className )[0];
var match = /[a-z]+View/.exec( $el.get(0).className );
if (!match) return;
var cls = match[0];
if (!$el.hasClass('active')) {
$el.parent().find('li').removeClass('active');
$('#optionViews').attr('class', '').addClass(cls);
@ -141,13 +247,13 @@
$('#gist').click(function(){
if (confirm("Are you sure you want to publish all your files anonymously as a public gist on github.com?")) {
var files = {};
var filesArr = getFiles();
var description = "Created using soleditor: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://chriseth.github.io/browser-solidity/?gist=";
for(var f in filesArr) {
files[fileNameFromKey(filesArr[f])] = {
var files = {};
var filesArr = getFiles();
var description = "Created using browser-solidity: Realtime Ethereum Contract Compiler and Runtime. \n Load this file by pasting this gists URL or ID at https://chriseth.github.io/browser-solidity/#version=" + getQueryParams().version + "&optimize="+ getQueryParams().optimize +"&gist=";
for(var f in filesArr) {
files[fileNameFromKey(filesArr[f])] = {
content: localStorage[filesArr[f]]
};
}
@ -170,13 +276,20 @@
// ----------------- file selector-------------
var $filesEl = $('#files');
$filesEl.on('click','.newFile', function() {
var FILE_SCROLL_DELTA = 300;
$('.newFile').on('click', function() {
while (window.localStorage[SOL_CACHE_UNTITLED + untitledCount])
untitledCount = (untitledCount - 0) + 1;
SOL_CACHE_FILE = SOL_CACHE_UNTITLED + untitledCount;
window.localStorage[SOL_CACHE_FILE] = '';
updateFiles();
$filesEl.animate({left: Math.max( (0 - activeFilePos() + (FILE_SCROLL_DELTA/2)), 0)+ "px"}, "slow", function(){
reAdjust();
})
});
$filesEl.on('click', '.file:not(.active)', showFileHandler);
@ -253,16 +366,17 @@
if (SOL_CACHE_FILE) {
var active = fileTabFromKey(SOL_CACHE_FILE);
active.addClass('active');
editor.setValue( window.localStorage[SOL_CACHE_FILE] || '', -1);
editor.setSession( sessions[SOL_CACHE_FILE] );
editor.focus();
}
$('#input').toggle( !!SOL_CACHE_FILE );
$('#output').toggle( !!SOL_CACHE_FILE );
reAdjust();
}
function fileTabTemplate(key) {
var name = fileNameFromKey(key);
return $('<span class="file"><span class="name">'+name+'</span><span class="remove"><i class="fa fa-close"></i></span></span>');
return $('<li class="file"><span class="name">'+name+'</span><span class="remove"><i class="fa fa-close"></i></span></li>');
}
function fileKey( name ) {
@ -278,16 +392,79 @@
for (var f in localStorage ) {
if (f.indexOf( SOL_CACHE_FILE_PREFIX, 0 ) === 0) {
files.push(f);
if (!sessions[f]) sessions[f] = newEditorSession(f);
}
}
return files;
}
$filesWrapper = $('.files-wrapper');
$scrollerRight = $('.scroller-right');
$scrollerLeft = $('.scroller-left');
function widthOfList (){
var itemsWidth = 0;
$('.file').each(function(){
var itemWidth = $(this).outerWidth();
itemsWidth += itemWidth;
});
return itemsWidth;
};
function widthOfHidden(){
return (($filesWrapper.outerWidth()) - widthOfList() - getLeftPosi());
};
function widthOfVisible(){
return $filesWrapper.outerWidth();
};
function getLeftPosi(){
return $filesEl.position().left;
};
function activeFilePos() {
var el = $filesEl.find('.active');
var l = el.position().left;
return l;
}
function reAdjust (){
if (widthOfList() + getLeftPosi() > + widthOfVisible()) {
$scrollerRight.fadeIn('fast');
} else {
$scrollerRight.fadeOut('fast');
}
if (getLeftPosi()<0) {
$scrollerLeft.fadeIn('fast');
} else {
$scrollerLeft.fadeOut('fast');
$filesEl.animate({left: getLeftPosi() + "px"},'slow');
}
}
$scrollerRight.click(function() {
var delta = (getLeftPosi() - FILE_SCROLL_DELTA)
$filesEl.animate({left: delta + "px"},'slow',function(){
reAdjust();
});
});
$scrollerLeft.click(function() {
var delta = Math.min( (getLeftPosi() + FILE_SCROLL_DELTA), 0 )
$filesEl.animate({left: delta + "px"},'slow',function(){
reAdjust();
});
});
updateFiles();
// ----------------- version selector-------------
// var soljsonSources is provided by bin/list.js
$('option', '#versionSelector').remove();
$.each(soljsonSources, function(i, file) {
if (file) {
@ -296,6 +473,7 @@
}
});
$('#versionSelector').change(function() {
updateQueryParams({version: $('#versionSelector').val() });
loadVersion($('#versionSelector').val());
});
@ -339,6 +517,7 @@
dragging = false;
setEditorSize(delta);
window.localStorage.setItem(EDITOR_SIZE_CACHE_KEY, delta);
reAdjust();
}
});
@ -352,10 +531,11 @@
var hidingRHP = false;
$('.toggleRHP').click(function(){
hidingRHP = !hidingRHP;
setEditorSize( hidingRHP ? 0 : window.localStorage[EDITOR_SIZE_CACHE_KEY] );
$('.toggleRHP').toggleClass('hiding', hidingRHP);
if (!hidingRHP) compile();
hidingRHP = !hidingRHP;
setEditorSize( hidingRHP ? 0 : window.localStorage[EDITOR_SIZE_CACHE_KEY] );
$('.toggleRHP i').toggleClass('fa-angle-double-right', !hidingRHP);
$('.toggleRHP i').toggleClass('fa-angle-double-left', hidingRHP);
if (!hidingRHP) compile();
});
@ -363,6 +543,7 @@
function onResize() {
editor.resize();
var session = editor.getSession();
session.setUseWrapMode(document.querySelector('#editorWrap').checked);
if(session.getUseWrapMode()) {
var characterWidth = editor.renderer.characterWidth;
@ -372,6 +553,7 @@
session.setWrapLimit(parseInt(contentWidth / characterWidth, 10));
}
}
reAdjust();
}
window.onresize = onResize;
onResize();
@ -401,7 +583,7 @@
if (input === null) {
renderError(error);
} else {
var optimize = document.querySelector('#optimize').checked;
var optimize = getQueryParams().optimize;
compileJSON(input, optimize ? 1 : 0);
}
});
@ -553,6 +735,7 @@
var worker = null;
var loadVersion = function(version) {
$('#version').text("(loading)");
updateQueryParams({version: version});
var isFirefox = typeof InstallTrigger !== 'undefined';
if (document.location.protocol != 'file:' && Worker !== undefined && isFirefox) {
// Workers cannot load js on "file:"-URLs and we get a
@ -571,17 +754,24 @@
if (!Module) return;
window.clearInterval(check);
onCompilerLoaded();
}, 200);
}
};
loadVersion('soljson-latest.js');
editor.getSession().on('change', onChange);
document.querySelector('#optimize').addEventListener('change', compile);
// ----------------- compiler output renderer ----------------------
var detailsOpen = {};
}, 200);
}
};
loadVersion( getQueryParams().version || 'soljson-latest.js');
editor.getSession().on('change', onChange);
editor.on('changeSession', function(){
editor.getSession().on('change', onChange);
})
document.querySelector('#optimize').addEventListener('change', function(){
updateQueryParams({optimize: document.querySelector('#optimize').checked });
compile();
});
// ----------------- compiler output renderer ----------------------
var detailsOpen = {};
function errortype(message) {
return message.match(/^.*:[0-9]*:[0-9]* Warning: /) ? 'warning' : 'error';
@ -696,9 +886,9 @@
$txOrigin.empty();
for( var a in accounts) { $txOrigin.append($('<option />').val(accounts[a]).text(accounts[a])); }
$txOrigin.val(accounts[0]);
} else $txOrigin.val('unknown');
} else $txOrigin.val('unknown');
}
if (executionContext === 'vm') {
dapp.getAccounts(renderAccounts);
} else {
@ -710,7 +900,7 @@
$('.col2 input,textarea').click(function() { this.select(); });
};
var tableRowItems = function(first, second, cls) {
return $('<div class="row"/>')
return $('<div class="crow"/>')
.addClass(cls)
.append($('<div class="col1">').append(first))
.append($('<div class="col2">').append(second));
@ -801,4 +991,6 @@
return funABI;
};
syncStorage()
});

@ -1,5 +1,10 @@
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.create({'url': chrome.extension.getURL('index.html')}, function(tab) {
// tab opened
});
chrome.storage.sync.set({"chrome-app-sync": true});
chrome.tabs.create({'url': chrome.extension.getURL('index.html')}, function(tab) {
// tab opened
});
});

@ -33,10 +33,12 @@
<link rel="stylesheet" href="assets/css/universal-dapp.css">
<link rel="stylesheet" href="assets/css/browser-solidity.css">
<link rel="stylesheet" href="assets/css/font-awesome.min.css">
<link rel="icon" type="x-icon" href="icon.png">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<script src="https://ethereum.github.io/solc-bin/bin/list.js"></script>
<script src="assets/js/jquery-2.1.3.min.js"></script>
<script src="bin/list.js"></script>
<script src="assets/js/ace.js"></script>
<script src="assets/js/mode-solidity.js"></script>
<script src="assets/js/ethereumjs-vm.js"></script>
@ -49,10 +51,13 @@
<div id="editor">
<div id="files">
<span class="newFile" title="New File"><i class="fa fa-file-text-o"></i></span>
<span class="toggleRHP" title="Toggle right hand panel"><i class="fa fa-columns"></i></span>
<span class="newFile" title="New File"><i class="fa fa-file-code-o"></i></span>
<div class="files-wrapper">
<div class="scroller scroller-left"><i class="fa fa-chevron-left "></i></div>
<div class="scroller scroller-right"><i class="fa fa-chevron-right "></i></div>
<ul id="files" class="nav nav-tabs"></ul>
</div>
<span class="toggleRHP" title="Toggle right hand panel"><i class="fa fa-angle-double-right"></i></span>
<div id="input"></div>
<div id="dragbar"></div>
</div>
@ -61,40 +66,40 @@
<div id="header">
<div id="menu">
<ul id="options">
<li class="settingsView active"><i class="fa fa-gear"></i></li>
<li class="txView"><i class="fa fa-send"></i></li>
<li class="envView"><i class="fa fa-cube"></i></li>
<li class="publishView"><i class="fa fa-cloud-upload"></i></li>
<li class="settingsView active" title="Settings"><i class="fa fa-gear"></i></li>
<li class="txView" title="Transaction"><i class="fa fa-send"></i></li>
<li class="envView" title="Environment"><i class="fa fa-cube"></i></li>
<li class="publishView" title="Publish" ><i class="fa fa-cloud-upload"></i></li>
<li id="helpButton"><a href="https://solidity.readthedocs.org" target="_blank" title="Open Documentation" class="fa fa-question"></a></li>
</ul>
<a href="https://solidity.readthedocs.org" target="_blank" id="helpButton" class="fa fa-question" title="Documentation" class="fa fa-question"></a>
<img id="solIcon" title="Solidity realtime compiler and runtime" src="assets/img/sol.svg" alt="Solidity realtime compiler and runtime">
</div>
<div id="optionViews" class="settingsView">
<div id="txView">
<div class="row">
<div class="crow">
<label for="txorigin"><select name="txorigin" id="txorigin"></select> Transaction origin</label>
</div>
<div class="row hide">
<div class="crow hide">
<label for="gas"><input type="number" id="gas" value="0"> Gas</label>
</div>
<div class="row hide">
<div class="crow hide">
<label for="gasPrice"><input type="number" id="gasPrice" value="0"> Gas Price</label>
</div>
<div class="row">
<div class="crow">
<label for="value"><input type="text" id="value" value="0"> Value (e.g. .7 ether or 5 wei, defaults to ether)</label>
</div>
</div>
<div id="settingsView">
<div class="version row"><strong>Solidity version:</strong> <span id="version">(loading)</span></div>
<div class="row">Change to: <select id="versionSelector"></select></div>
<div class="row">
<div class="version crow"><strong>Solidity version:</strong> <span id="version">(loading)</span></div>
<div class="crow">Change to: <select id="versionSelector"></select></div>
<div class="crow">
<label for="editorWrap"><input id="editorWrap" type="checkbox">Text Wrap</label>
<label for="optimize"><input id="optimize" type="checkbox">Enable Optimization</label>
</div>
</div>
<div id="publishView">
<p><button id="gist" title="Publish all files as public gist on github.com"><i class="fa fa-github"></i> Publish Gist</button> Publish all open files to an anonymous github gist.</p>
<p>You can also load a gist by adding the following <span class="pre">?gist=GIST_ID</span> to your url, where GIST_ID is the id of the gist to load.</p>
<p>You can also load a gist by adding the following <span class="pre">#gist=GIST_ID</span> to your url, where GIST_ID is the id of the gist to load.</p>
</div>
<div id="envView">
<span id="executionContext">

@ -5,24 +5,28 @@
"description": "Realtime compiler and runtime",
"devtools_page": "devtools.html",
"update_url": "https://chriseth.github.io/browser-solidity/",
"version": "1.0",
"version": "1.1",
"manifest_version": 2,
"background": {
"scripts": ["background.js"],
"persistent": true
},
"icons": {
"32": "icon.png"
},
"browser_action": {
"default_icon": "icon.png"
},
"permissions": [
"storage",
"tabs",
"activeTab",
"https://ajax.googleapis.com/",
"webRequest",
"webRequestBlocking",
"\u003Call_urls>",
"storage"
"webRequest",
"webRequestBlocking",
"\u003Call_urls>"
]
}

Loading…
Cancel
Save