From e44a7e37b6c7b5961adaffc62b9042b8d442938e Mon Sep 17 00:00:00 2001 From: mensonge Date: Thu, 13 Nov 2008 09:49:11 +0000 Subject: New feature: basic Ajax suggestion for tags and implementation of Dojo toolkit git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@151 b3834d28-1941-0410-a4f8-b48e95affb8f --- includes/js/dojo/_base/_loader/hostenv_rhino.js | 238 ++++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 includes/js/dojo/_base/_loader/hostenv_rhino.js (limited to 'includes/js/dojo/_base/_loader/hostenv_rhino.js') diff --git a/includes/js/dojo/_base/_loader/hostenv_rhino.js b/includes/js/dojo/_base/_loader/hostenv_rhino.js new file mode 100644 index 0000000..d363861 --- /dev/null +++ b/includes/js/dojo/_base/_loader/hostenv_rhino.js @@ -0,0 +1,238 @@ +/* +* Rhino host environment +*/ + +if(dojo.config["baseUrl"]){ + dojo.baseUrl = dojo.config["baseUrl"]; +}else{ + dojo.baseUrl = "./"; +} + +dojo.locale = dojo.locale || String(java.util.Locale.getDefault().toString().replace('_','-').toLowerCase()); +dojo._name = 'rhino'; +dojo.isRhino = true; + +if(typeof print == "function"){ + console.debug = print; +} + +if(typeof dojo["byId"] == "undefined"){ + dojo.byId = function(id, doc){ + if(id && (typeof id == "string" || id instanceof String)){ + if(!doc){ doc = document; } + return doc.getElementById(id); + } + return id; // assume it's a node + } +} + +// see comments in spidermonkey loadUri +dojo._loadUri = function(uri, cb){ + try{ + var local = (new java.io.File(uri)).exists(); + if(!local){ + try{ + // try it as a file first, URL second + var stream = (new java.net.URL(uri)).openStream(); + // close the stream so we don't leak resources + stream.close(); + }catch(e){ + // no debug output; this failure just means the uri was not found. + return false; + } + } + //FIXME: Use Rhino 1.6 native readFile/readUrl if available? + if(cb){ + var contents = (local ? readText : readUri)(uri, "UTF-8"); + cb(eval('('+contents+')')); + }else{ + load(uri); + } + return true; + }catch(e){ + console.debug("rhino load('" + uri + "') failed. Exception: " + e); + return false; + } +} + +dojo.exit = function(exitcode){ + quit(exitcode); +} + +// Hack to determine current script... +// +// These initial attempts failed: +// 1. get an EcmaError and look at e.getSourceName(): try {eval ("static in return")} catch(e) { ... +// Won't work because NativeGlobal.java only does a put of "name" and "message", not a wrapped reflecting object. +// Even if the EcmaError object had the sourceName set. +// +// 2. var e = Packages.org.mozilla.javascript.Context.getCurrentContext().reportError(''); +// Won't work because it goes directly to the errorReporter, not the return value. +// We want context.interpreterSourceFile and context.interpreterLine, which are used in static Context.getSourcePositionFromStack +// (set by Interpreter.java at interpretation time, if in interpreter mode). +// +// 3. var e = Packages.org.mozilla.javascript.Context.getCurrentContext().reportRuntimeError(''); +// This returns an object, but e.message still does not have source info. +// In compiler mode, perhaps not set; in interpreter mode, perhaps not used by errorReporter? +// +// What we found works is to do basically the same hack as is done in getSourcePositionFromStack, +// making a new java.lang.Exception() and then calling printStackTrace on a string stream. +// We have to parse the string for the .js files (different from the java files). +// This only works however in compiled mode (-opt 0 or higher). +// In interpreter mode, entire stack is java. +// When compiled, printStackTrace is like: +// java.lang.Exception +// at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) +// at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) +// at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) +// at java.lang.reflect.Constructor.newInstance(Constructor.java:274) +// at org.mozilla.javascript.NativeJavaClass.constructSpecific(NativeJavaClass.java:228) +// at org.mozilla.javascript.NativeJavaClass.construct(NativeJavaClass.java:185) +// at org.mozilla.javascript.ScriptRuntime.newObject(ScriptRuntime.java:1269) +// at org.mozilla.javascript.gen.c2.call(/Users/mda/Sites/burstproject/testrhino.js:27) +// ... +// at org.mozilla.javascript.tools.shell.Main.main(Main.java:76) +// +// Note may get different answers based on: +// Context.setOptimizationLevel(-1) +// Context.setGeneratingDebug(true) +// Context.setGeneratingSource(true) +// +// Some somewhat helpful posts: +// http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&selm=9v9n0g%246gr1%40ripley.netscape.com +// http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&selm=3BAA2DC4.6010702%40atg.com +// +// Note that Rhino1.5R5 added source name information in some exceptions. +// But this seems not to help in command-line Rhino, because Context.java has an error reporter +// so no EvaluationException is thrown. + +// do it by using java java.lang.Exception +dojo._rhinoCurrentScriptViaJava = function(depth){ + var optLevel = Packages.org.mozilla.javascript.Context.getCurrentContext().getOptimizationLevel(); + var caw = new java.io.CharArrayWriter(); + var pw = new java.io.PrintWriter(caw); + var exc = new java.lang.Exception(); + var s = caw.toString(); + // we have to exclude the ones with or without line numbers because they put double entries in: + // at org.mozilla.javascript.gen.c3._c4(/Users/mda/Sites/burstproject/burst/Runtime.js:56) + // at org.mozilla.javascript.gen.c3.call(/Users/mda/Sites/burstproject/burst/Runtime.js) + var matches = s.match(/[^\(]*\.js\)/gi); + if(!matches){ + throw Error("cannot parse printStackTrace output: " + s); + } + + // matches[0] is entire string, matches[1] is this function, matches[2] is caller, ... + var fname = ((typeof depth != 'undefined')&&(depth)) ? matches[depth + 1] : matches[matches.length - 1]; + var fname = matches[3]; + if(!fname){ fname = matches[1]; } + // print("got fname '" + fname + "' from stack string '" + s + "'"); + if (!fname){ throw Error("could not find js file in printStackTrace output: " + s); } + //print("Rhino getCurrentScriptURI returning '" + fname + "' from: " + s); + return fname; +} + +// reading a file from disk in Java is a humiliating experience by any measure. +// Lets avoid that and just get the freaking text +function readText(path, encoding){ + encoding = encoding || "utf-8"; + // NOTE: we intentionally avoid handling exceptions, since the caller will + // want to know + var jf = new java.io.File(path); + var is = new java.io.FileInputStream(jf); + return dj_readInputStream(is, encoding); +} + +function readUri(uri, encoding){ + var conn = (new java.net.URL(uri)).openConnection(); + encoding = encoding || conn.getContentEncoding() || "utf-8"; + var is = conn.getInputStream(); + return dj_readInputStream(is, encoding); +} + +function dj_readInputStream(is, encoding){ + var input = new java.io.BufferedReader(new java.io.InputStreamReader(is, encoding)); + try { + var sb = new java.lang.StringBuffer(); + var line = ""; + while((line = input.readLine()) !== null){ + sb.append(line); + sb.append(java.lang.System.getProperty("line.separator")); + } + return sb.toString(); + } finally { + input.close(); + } +} + +// call this now because later we may not be on the top of the stack +if( + (!dojo.config.libraryScriptUri)|| + (!dojo.config.libraryScriptUri.length) +){ + try{ + dojo.config.libraryScriptUri = dojo._rhinoCurrentScriptViaJava(1); + }catch(e){ + // otherwise just fake it + if(dojo.config["isDebug"]){ + print("\n"); + print("we have no idea where Dojo is located."); + print("Please try loading rhino in a non-interpreted mode or set a"); + print("\n\tdjConfig.libraryScriptUri\n"); + print("Setting the dojo path to './'"); + print("This is probably wrong!"); + print("\n"); + print("Dojo will try to load anyway"); + } + dojo.config.libraryScriptUri = "./"; + } +} + +// summary: +// return the document object associated with the dojo.global +dojo.doc = typeof(document) != "undefined" ? document : null; + +dojo.body = function(){ + return document.body; +} + +dojo._timeouts = []; + +function clearTimeout(idx){ + if(!dojo._timeouts[idx]){ return; } + dojo._timeouts[idx].stop(); +} + +function setTimeout(func, delay){ + // summary: provides timed callbacks using Java threads + + var def={ + sleepTime:delay, + hasSlept:false, + + run:function(){ + if(!this.hasSlept){ + this.hasSlept=true; + java.lang.Thread.currentThread().sleep(this.sleepTime); + } + try{ + func(); + }catch(e){ + console.debug("Error running setTimeout thread:" + e); + } + } + }; + + var runnable = new java.lang.Runnable(def); + var thread = new java.lang.Thread(runnable); + thread.start(); + return dojo._timeouts.push(thread)-1; +} + +//Register any module paths set up in djConfig. Need to do this +//in the hostenvs since hostenv_browser can read djConfig from a +//script tag's attribute. +if(dojo.config["modulePaths"]){ + for(var param in dojo.config["modulePaths"]){ + dojo.registerModulePath(param, dojo.config["modulePaths"][param]); + } +} -- cgit v1.2.3