diff --git a/Makefile.dryice.js b/Makefile.dryice.js index c60702a3..74694852 100755 --- a/Makefile.dryice.js +++ b/Makefile.dryice.js @@ -91,11 +91,12 @@ copy({ { root: aceHome + '/lib', include: /.*\.js$/, - exclude: /tests?\/|theme\/|mode\// + exclude: /tests?\/|theme\/|mode\/|ace\/worker\/host\.js/ }, { base: aceHome + '/lib/', path: 'ace/theme/textmate.js' }, { base: aceHome + '/lib/', path: 'ace/mode/text.js' }, { base: aceHome + '/lib/', path: 'ace/mode/javascript.js' }, + { base: aceHome + '/lib/', path: 'ace/mode/javascript_worker.js' }, { base: aceHome + '/lib/', path: 'ace/mode/text_highlight_rules.js' }, { base: aceHome + '/lib/', path: 'ace/mode/javascript_highlight_rules.js' }, { base: aceHome + '/lib/', path: 'ace/mode/doc_comment_highlight_rules.js' }, @@ -121,7 +122,6 @@ copy({ source: [ 'build_support/mini_require.js', pilot, - // cockpit, ace, 'build_support/boot.js' ], @@ -146,7 +146,14 @@ copy({ dest: 'build/ace-uncompressed.js' }); - +// Create worker bootstrap code +copy({ + source: "lib/ace/worker/host.js", + filter: [function(data) { + return data + "\nimportScripts('ace-uncompressed.js')"; + }], + dest: 'build/host.js' +}); @@ -263,7 +270,7 @@ function runFilters(value, filter, reading, name) { return value; } - if (filter.onRead == reading) { + if ((!!filter.onRead) == reading) { return filter(value, name); } else { diff --git a/build_support/boot.js b/build_support/boot.js index f61e91d6..df2ab0ff 100644 --- a/build_support/boot.js +++ b/build_support/boot.js @@ -35,41 +35,45 @@ * * ***** END LICENSE BLOCK ***** */ -var deps = [ "pilot/fixoldbrowsers", "pilot/plugin_manager", "pilot/settings", - "pilot/environment" ]; - -require(deps, function() { - var catalog = require("pilot/plugin_manager").catalog; - catalog.registerPlugins([ "pilot/index" ]); -}); - -var ace = { - edit: function(el) { - if (typeof(el) == "string") { - el = document.getElementById(el); - } - var env = require("pilot/environment").create(); +// don't define it in a worker. +if (window.document) { + + var deps = [ "pilot/fixoldbrowsers", "pilot/plugin_manager", "pilot/settings", + "pilot/environment" ]; + + require(deps, function() { var catalog = require("pilot/plugin_manager").catalog; - catalog.startupPlugins({ env: env }).then(function() { - var EditSession = require("ace/edit_session").EditSession; - var JavaScriptMode = require("ace/mode/javascript").Mode; - var UndoManager = require("ace/undomanager").UndoManager; - var Editor = require("ace/editor").Editor; - var Renderer = require("ace/virtual_renderer").VirtualRenderer; - var theme = require("ace/theme/textmate"); - - var doc = new EditSession(el.innerHTML); - el.innerHTML = ''; - doc.setMode(new JavaScriptMode()); - doc.setUndoManager(new UndoManager()); - env.document = doc; - env.editor = new Editor(new Renderer(el, theme)); - env.editor.setSession(doc); - env.editor.resize(); - window.addEventListener("resize", function() { + catalog.registerPlugins([ "pilot/index" ]); + }); + + var ace = { + edit: function(el) { + if (typeof(el) == "string") { + el = document.getElementById(el); + } + var env = require("pilot/environment").create(); + var catalog = require("pilot/plugin_manager").catalog; + catalog.startupPlugins({ env: env }).then(function() { + var EditSession = require("ace/edit_session").EditSession; + var JavaScriptMode = require("ace/mode/javascript").Mode; + var UndoManager = require("ace/undomanager").UndoManager; + var Editor = require("ace/editor").Editor; + var Renderer = require("ace/virtual_renderer").VirtualRenderer; + var theme = require("ace/theme/textmate"); + + var doc = new EditSession(el.innerHTML); + el.innerHTML = ''; + doc.setMode(new JavaScriptMode()); + doc.setUndoManager(new UndoManager()); + env.document = doc; + env.editor = new Editor(new Renderer(el, theme)); + env.editor.setSession(doc); env.editor.resize(); - }, false); - el.env = env; - }); - } -}; + window.addEventListener("resize", function() { + env.editor.resize(); + }, false); + el.env = env; + }); + } + }; +} \ No newline at end of file diff --git a/build_support/mini_require.js b/build_support/mini_require.js index 9500fbc2..25069325 100644 --- a/build_support/mini_require.js +++ b/build_support/mini_require.js @@ -35,59 +35,64 @@ * * ***** END LICENSE BLOCK ***** */ -function require(module, callback) { +// don't define it in a worker. There we have a different implementation +if (window.document) { - if (Array.isArray(module)) { - var params = []; - module.forEach(function(m) { - params.push(require._lookup(m)); - }, this); - - if (callback) { - callback.apply(null, params); + window.require = function(module, callback) { + + if (Array.isArray(module)) { + var params = []; + module.forEach(function(m) { + params.push(require._lookup(m)); + }, this); + + if (callback) { + callback.apply(null, params); + } + } + + if (typeof module === 'string') { + payload = require._lookup(module); + if (callback) { + callback(); + } + return payload; } } - - if (typeof module === 'string') { - payload = require._lookup(module); - if (callback) { - callback(); + require.modules = {}; + require.packaged = true; + + require._lookup = function(moduleName) { + var payload = require.modules[moduleName]; + var module_name = moduleName; + if (payload == null) { + console.error('Missing module: ' + moduleName); + console.trace(); } + + if (typeof payload === 'function') { + var exports = {}; + var module = { + id: moduleName, + uri: '' + }; + payload(require, exports, module); + payload = exports; + // cache the resulting module object for next time + require.modules[module_name] = payload; + } + return payload; + }; + + window.define = function(module, payload) { + if (typeof module !== 'string') { + console.error('dropping module because define wasn\'t munged.'); + console.trace(); + return; + } + + // console.log('defining module: ' + module + ' as a ' + typeof payload); + require.modules[module] = payload; } -} -require.modules = {}; - -require._lookup = function(moduleName) { - var payload = require.modules[moduleName]; - var module_name = moduleName; - if (payload == null) { - console.error('Missing module: ' + moduleName); - console.trace(); - } - - if (typeof payload === 'function') { - var exports = {}; - var module = { - id: moduleName, - uri: '' - }; - payload(require, exports, module); - payload = exports; - // cache the resulting module object for next time - require.modules[module_name] = payload; - } - - return payload; -}; - -function define(module, payload) { - if (typeof module !== 'string') { - console.error('dropping module because define wasn\'t munged.'); - console.trace(); - return; - } - - // console.log('defining module: ' + module + ' as a ' + typeof payload); - require.modules[module] = payload; -} +} \ No newline at end of file diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 62b53138..39e5ca4e 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -231,6 +231,13 @@ var Editor =function(renderer, session) { }; this.focus = function() { + // Safari need the timeout + // iOS and Firefox need it called immediately + // to be on the save side we do both + var _self = this; + setTimeout(function() { + _self.textInput.focus(); + }); this.textInput.focus(); }; diff --git a/lib/ace/worker/host.js b/lib/ace/worker/host.js index 7e182a38..cb449ffd 100644 --- a/lib/ace/worker/host.js +++ b/lib/ace/worker/host.js @@ -7,33 +7,48 @@ var window = { console: console }; -var require = function(name) { - if (require.modules[name]) - return require.modules[name].exports; +var require = function(id) { + var module = require.modules[id]; + if (module) { + if (!module.initialized) { + module.exports = module.factory().exports; + module.initialized = true; + } + return module.exports; + } - var chunks = name.split("/"); + var chunks = id.split("/"); chunks[0] = require.tlns[chunks[0]] || chunks[0]; path = require.baseUrl + "/" + chunks.join("/") + ".js" - require.id = name; - importScripts(path); - return require.modules[name].exports; + require.id = id; + importScripts(path); + return require(id); }; + require.modules = {}; require.tlns = {}; require.baseUrl; -var define = function(factory) { - var module = { - exports: {} +var define = function(id, factory) { + if (!factory) { + factory = id; + id = require.id; + } + if (id.indexOf("text!") == 0) + return; + + require.modules[id] = { + factory: function() { + var module = { + exports: {} + }; + var returnExports = factory(require, module.exports, module); + if (returnExports) + module.exports = exports; + return module; + } }; - - var name = require.id; - var returnExports = factory(require, module.exports, module); - if (returnExports) - module.exports = exports; - - require.modules[name] = module; }; function initBaseUrls(baseUrl, topLevelNamespaces) { @@ -81,6 +96,7 @@ onmessage = function(e) { main[msg.command].apply(main, msg.args); else if (msg.init) { initBaseUrls(msg.base, msg.tlns); + require("pilot/fixoldbrowsers"); sender = initSender(); var clazz = require(msg.module)[msg.classname]; main = new clazz(sender); diff --git a/lib/ace/worker/worker_client.js b/lib/ace/worker/worker_client.js index 71d6505e..5e8e3c28 100644 --- a/lib/ace/worker/worker_client.js +++ b/lib/ace/worker/worker_client.js @@ -14,13 +14,19 @@ var EventEmitter = require("pilot/event_emitter").EventEmitter; var WorkerClient = function(baseUrl, topLevelNamespaces, module, classname) { this.callbacks = []; - var workerUrl = require.nameToUrl("ace/worker/host", null, "_"); - var worker = this.$worker = new Worker(workerUrl); - var tlns = {}; - for (var i=0; i