lib/gollum/frontend/public/gollum/livepreview/js/ace/lib/ace/worker/worker_client.js in gollum-2.4.4 vs lib/gollum/frontend/public/gollum/livepreview/js/ace/lib/ace/worker/worker_client.js in gollum-2.4.5

- old
+ new

@@ -1,121 +1,117 @@ /* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * Distributed under the BSD license: * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. * - * The Original Code is Ajax.org Code Editor (ACE). + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * The Initial Developer of the Original Code is - * Ajax.org B.V. - * Portions created by the Initial Developer are Copyright (C) 2010 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Fabian Jakobs <fabian AT ajax DOT org> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or - * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * * ***** END LICENSE BLOCK ***** */ define(function(require, exports, module) { "use strict"; var oop = require("../lib/oop"); var EventEmitter = require("../lib/event_emitter").EventEmitter; var config = require("../config"); -var WorkerClient = function(topLevelNamespaces, packagedJs, mod, classname) { - +var WorkerClient = function(topLevelNamespaces, mod, classname) { this.changeListener = this.changeListener.bind(this); + this.onMessage = this.onMessage.bind(this); + this.onError = this.onError.bind(this); + var workerUrl; if (config.get("packaged")) { - this.$worker = new Worker(config.get("workerPath") + "/" + packagedJs); - } - else { - var workerUrl; + workerUrl = config.moduleUrl(mod, "worker"); + } else { + var normalizePath = this.$normalizePath; if (typeof require.supports !== "undefined" && require.supports.indexOf("ucjs2-pinf-0") >= 0) { // We are running in the sourcemint loader. workerUrl = require.nameToUrl("ace/worker/worker_sourcemint"); } else { // We are running in RequireJS. // nameToUrl is renamed to toUrl in requirejs 2 if (require.nameToUrl && !require.toUrl) require.toUrl = require.nameToUrl; - workerUrl = this.$normalizePath(require.toUrl("ace/worker/worker", null, "_")); + workerUrl = normalizePath(require.toUrl("ace/worker/worker", null, "_")); } - this.$worker = new Worker(workerUrl); var tlns = {}; - for (var i=0; i<topLevelNamespaces.length; i++) { - var ns = topLevelNamespaces[i]; - var path = this.$normalizePath(require.toUrl(ns, null, "_").replace(/.js$/, "")); - - tlns[ns] = path; - } + topLevelNamespaces.forEach(function(ns) { + tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/.js(\?.*)?$/, "")); + }); } + this.$worker = new Worker(workerUrl); this.$worker.postMessage({ init : true, tlns: tlns, module: mod, classname: classname }); this.callbackId = 1; this.callbacks = {}; - var _self = this; - this.$worker.onerror = function(e) { + this.$worker.onerror = this.onError; + this.$worker.onmessage = this.onMessage; +}; + +(function(){ + + oop.implement(this, EventEmitter); + + this.onError = function(e) { window.console && console.log && console.log(e); throw e; }; - this.$worker.onmessage = function(e) { + + this.onMessage = function(e) { var msg = e.data; switch(msg.type) { case "log": - window.console && console.log && console.log(msg.data); + window.console && console.log && console.log.apply(console, msg.data); break; case "event": - _self._emit(msg.name, {data: msg.data}); + this._emit(msg.name, {data: msg.data}); break; case "call": - var callback = _self.callbacks[msg.id]; + var callback = this.callbacks[msg.id]; if (callback) { callback(msg.data); - delete _self.callbacks[msg.id]; + delete this.callbacks[msg.id]; } break; } }; -}; -(function(){ - - oop.implement(this, EventEmitter); - this.$normalizePath = function(path) { + if (!location.host) // needed for file:// protocol + return path; path = path.replace(/^[a-z]+:\/\/[^\/]+/, ""); // Remove domain name and rebuild it path = location.protocol + "//" + location.host // paths starting with a slash are relative to the root (host) + (path.charAt(0) == "/" ? "" : location.pathname.replace(/\/[^\/]*$/, "")) + "/" + path.replace(/^[\/]+/, ""); @@ -169,8 +165,53 @@ this.emit("change", e); }; }).call(WorkerClient.prototype); + +var UIWorkerClient = function(topLevelNamespaces, mod, classname) { + this.changeListener = this.changeListener.bind(this); + this.callbackId = 1; + this.callbacks = {}; + this.messageBuffer = []; + + var main = null; + var sender = Object.create(EventEmitter); + var _self = this; + + this.$worker = {} + this.$worker.postMessage = function(e) { + _self.messageBuffer.push(e); + main && setTimeout(processNext); + }; + + var processNext = function() { + var msg = _self.messageBuffer.shift(); + if (msg.command) + main[msg.command].apply(main, msg.args); + else if (msg.event) + sender._emit(msg.event, msg.data); + }; + + sender.postMessage = function(msg) { + _self.onMessage({data: msg}); + }; + sender.callback = function(data, callbackId) { + this.postMessage({type: "call", id: callbackId, data: data}); + }; + sender.emit = function(name, data) { + this.postMessage({type: "event", name: name, data: data}); + }; + + require([mod], function(Main) { + main = new Main[classname](sender); + while (_self.messageBuffer.length) + processNext(); + }); +}; + +UIWorkerClient.prototype = WorkerClient.prototype; + +exports.UIWorkerClient = UIWorkerClient; exports.WorkerClient = WorkerClient; });