/* global alert, confirm, prompt, Option, Worker, chrome */ 'use strict' var $ = require('jquery') var base64 = require('js-base64').Base64 var utils = require('./app/utils') var QueryParams = require('./app/query-params') var queryParams = new QueryParams() var GistHandler = require('./app/gist-handler') var gistHandler = new GistHandler() var Storage = require('./app/storage') var Editor = require('./app/editor') var Renderer = require('./app/renderer') var Compiler = require('./app/compiler') var ExecutionContext = require('./app/execution-context') var UniversalDApp = require('./universal-dapp.js') var Debugger = require('./app/debugger') var FormalVerification = require('./app/formalVerification') var EventManager = require('./lib/eventManager') var StaticAnalysis = require('./app/staticanalysis/staticAnalysisView') var OffsetToLineColumnConverter = require('./lib/offsetToLineColumnConverter') // The event listener needs to be registered as early as possible, because the // parent will send the message upon the "load" event. var filesToLoad = null var loadFilesCallback = function (files) { filesToLoad = files } // will be replaced later window.addEventListener('message', function (ev) { if (typeof ev.data === typeof [] && ev.data[0] === 'loadFiles') { loadFilesCallback(ev.data[1]) } }, false) /* trigger tabChanged */ var run = function () { var self = this this.event = new EventManager() var storage = new Storage() function loadFiles (files) { for (var f in files) { var key = utils.fileKey(f) var content = files[f].content storage.loadFile(key, content) } editor.setCacheFile(utils.fileKey(Object.keys(files)[0])) updateFiles() } loadFilesCallback = function (files) { loadFiles(files) } if (filesToLoad !== null) { loadFiles(filesToLoad) } // -------- check file upload capabilities ------- if (!(window.File || window.FileReader || window.FileList || window.Blob)) { $('.uploadFile').remove() } // ------------------ gist load ---------------- var loadingFromGist = gistHandler.handleLoad(queryParams.get(), function (gistId) { $.ajax({ url: 'https://api.github.com/gists/' + gistId, jsonp: 'callback', dataType: 'jsonp', success: function (response) { if (response.data) { if (!response.data.files) { alert('Gist load error: ' + response.data.message) return } loadFiles(response.data.files) } } }) }) // ----------------- Chrome cloud storage sync -------------------- function chromeCloudSync () { if (typeof chrome === 'undefined' || !chrome || !chrome.storage || !chrome.storage.sync) { return } var obj = {} var done = false var count = 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 "' + utils.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) storage.set(key, resp[key]) updateFiles() } else { console.log('add to obj', obj, key) obj[key] = storage.get(key) } done++ if (done >= count) { chrome.storage.sync.set(obj, function () { console.log('updated cloud files with: ', obj, this, arguments) }) } }) } for (var y in storage.keys()) { console.log('checking', y) obj[y] = storage.get(y) if (!utils.isCachedFile(y)) { continue } count++ check(y) } } window.syncStorage = chromeCloudSync chromeCloudSync() // ----------------- editor ---------------------- var editor = new Editor(loadingFromGist, storage) // ----------------- tabbed menu ------------------- $('#options li').click(function (ev) { var $el = $(this) selectTab($el) }) var selectTab = function (el) { 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) el.addClass('active') } self.event.trigger('tabChanged', [cls]) } // ------------------ gist publish -------------- $('#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 = editor.packageFiles() 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://ethereum.github.io/browser-solidity/#version=' + queryParams.get().version + '&optimize=' + queryParams.get().optimize + '&gist=' $.ajax({ url: 'https://api.github.com/gists', type: 'POST', data: JSON.stringify({ description: description, public: true, files: files }) }).done(function (response) { if (response.html_url && confirm('Created a gist at ' + response.html_url + ' Would you like to open it in a new window?')) { window.open(response.html_url, '_blank') } }) } }) $('#copyOver').click(function () { var target = prompt( 'To which other browser-solidity instance do you want to copy over all files?', 'https://ethereum.github.io/browser-solidity/' ) if (target === null) { return } var files = editor.packageFiles() $('