]>
Commit | Line | Data |
---|---|---|
2f01fe57 | 1 | /* |
81bea17a | 2 | Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. |
2f01fe57 AD |
3 | Available via Academic Free License >= 2.1 OR the modified BSD license. |
4 | see: http://dojotoolkit.org/license for details | |
5 | */ | |
6 | ||
7 | ||
a089699c AD |
8 | /* |
9 | * Rhino host environment | |
10 | */ | |
11 | ||
2f01fe57 | 12 | if(dojo.config["baseUrl"]){ |
a089699c | 13 | dojo.baseUrl = dojo.config["baseUrl"]; |
2f01fe57 | 14 | }else{ |
a089699c | 15 | dojo.baseUrl = "./"; |
2f01fe57 | 16 | } |
a089699c AD |
17 | |
18 | dojo.locale = dojo.locale || String(java.util.Locale.getDefault().toString().replace('_','-').toLowerCase()); | |
19 | dojo._name = 'rhino'; | |
20 | dojo.isRhino = true; | |
21 | ||
22 | if(typeof print == "function"){ | |
23 | console.debug = print; | |
2f01fe57 | 24 | } |
a089699c | 25 | |
2f01fe57 | 26 | if(!("byId" in dojo)){ |
a089699c AD |
27 | dojo.byId = function(id, doc){ |
28 | if(id && (typeof id == "string" || id instanceof String)){ | |
29 | if(!doc){ doc = document; } | |
30 | return doc.getElementById(id); | |
31 | } | |
32 | return id; // assume it's a node | |
33 | } | |
2f01fe57 | 34 | } |
a089699c AD |
35 | |
36 | dojo._isLocalUrl = function(/*String*/ uri) { | |
37 | // summary: | |
38 | // determines if URI is local or not. | |
39 | ||
40 | var local = (new java.io.File(uri)).exists(); | |
41 | if(!local){ | |
42 | var stream; | |
43 | //Try remote URL. Allow this method to throw, | |
44 | //but still do cleanup. | |
45 | try{ | |
46 | // try it as a file first, URL second | |
47 | stream = (new java.net.URL(uri)).openStream(); | |
48 | // close the stream so we don't leak resources | |
49 | stream.close(); | |
50 | }finally{ | |
51 | if(stream && stream.close){ | |
52 | stream.close(); | |
53 | } | |
54 | } | |
55 | } | |
56 | return local; | |
2f01fe57 | 57 | } |
a089699c AD |
58 | |
59 | // see comments in spidermonkey loadUri | |
60 | dojo._loadUri = function(uri, cb){ | |
81bea17a AD |
61 | if(dojo._loadedUrls[uri]){ |
62 | return true; // Boolean | |
63 | } | |
a089699c AD |
64 | try{ |
65 | var local; | |
66 | try{ | |
67 | local = dojo._isLocalUrl(uri); | |
68 | }catch(e){ | |
69 | // no debug output; this failure just means the uri was not found. | |
70 | return false; | |
71 | } | |
72 | ||
81bea17a | 73 | dojo._loadedUrls[uri] = true; |
a089699c AD |
74 | //FIXME: Use Rhino 1.6 native readFile/readUrl if available? |
75 | if(cb){ | |
76 | var contents = (local ? readText : readUri)(uri, "UTF-8"); | |
77 | ||
78 | // patch up the input to eval until https://bugzilla.mozilla.org/show_bug.cgi?id=471005 is fixed. | |
79 | if(!eval("'\u200f'").length){ | |
81bea17a AD |
80 | contents = String(contents).replace(/[\u200E\u200F\u202A-\u202E]/g, function(match){ |
81 | return "\\u" + match.charCodeAt(0).toString(16); | |
a089699c AD |
82 | }) |
83 | } | |
81bea17a AD |
84 | contents = /^define\(/.test(contents) ? contents : '('+contents+')'; |
85 | cb(eval(contents)); | |
a089699c AD |
86 | }else{ |
87 | load(uri); | |
88 | } | |
81bea17a | 89 | dojo._loadedUrls.push(uri); |
a089699c AD |
90 | return true; |
91 | }catch(e){ | |
81bea17a | 92 | dojo._loadedUrls[uri] = false; |
a089699c AD |
93 | console.debug("rhino load('" + uri + "') failed. Exception: " + e); |
94 | return false; | |
95 | } | |
2f01fe57 | 96 | } |
a089699c | 97 | |
81bea17a | 98 | dojo.exit = function(exitcode){ |
a089699c | 99 | quit(exitcode); |
2f01fe57 | 100 | } |
a089699c AD |
101 | |
102 | // reading a file from disk in Java is a humiliating experience by any measure. | |
103 | // Lets avoid that and just get the freaking text | |
104 | function readText(path, encoding){ | |
105 | encoding = encoding || "utf-8"; | |
106 | // NOTE: we intentionally avoid handling exceptions, since the caller will | |
107 | // want to know | |
108 | var jf = new java.io.File(path); | |
109 | var is = new java.io.FileInputStream(jf); | |
110 | return dj_readInputStream(is, encoding); | |
2f01fe57 | 111 | } |
a089699c AD |
112 | |
113 | function readUri(uri, encoding){ | |
114 | var conn = (new java.net.URL(uri)).openConnection(); | |
115 | encoding = encoding || conn.getContentEncoding() || "utf-8"; | |
116 | var is = conn.getInputStream(); | |
117 | return dj_readInputStream(is, encoding); | |
2f01fe57 | 118 | } |
a089699c AD |
119 | |
120 | function dj_readInputStream(is, encoding){ | |
121 | var input = new java.io.BufferedReader(new java.io.InputStreamReader(is, encoding)); | |
122 | try { | |
123 | var sb = new java.lang.StringBuffer(); | |
124 | var line = ""; | |
125 | while((line = input.readLine()) !== null){ | |
126 | sb.append(line); | |
127 | sb.append(java.lang.System.getProperty("line.separator")); | |
128 | } | |
129 | return sb.toString(); | |
130 | } finally { | |
131 | input.close(); | |
132 | } | |
2f01fe57 | 133 | } |
a089699c AD |
134 | |
135 | dojo._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){ | |
136 | // summary: Read the contents of the specified uri and return those contents. | |
137 | // uri: | |
138 | // A relative or absolute uri. | |
139 | // fail_ok: | |
140 | // Default false. If fail_ok and loading fails, return null | |
141 | // instead of throwing. | |
142 | // returns: The response text. null is returned when there is a | |
143 | // failure and failure is okay (an exception otherwise) | |
144 | try{ | |
145 | var local = dojo._isLocalUrl(uri); | |
146 | var text = (local ? readText : readUri)(uri, "UTF-8"); | |
147 | if(text !== null){ | |
148 | //Force JavaScript string. | |
149 | text += ""; | |
150 | } | |
151 | return text; | |
152 | }catch(e){ | |
153 | if(fail_ok){ | |
154 | return null; | |
155 | }else{ | |
156 | throw e; | |
157 | } | |
158 | } | |
2f01fe57 | 159 | } |
a089699c AD |
160 | |
161 | // summary: | |
162 | // return the document object associated with the dojo.global | |
163 | dojo.doc = typeof document != "undefined" ? document : null; | |
164 | ||
165 | dojo.body = function(){ | |
81bea17a | 166 | return document.body; |
2f01fe57 | 167 | } |
a089699c AD |
168 | |
169 | // Supply setTimeout/clearTimeout implementations if they aren't already there | |
170 | // Note: this assumes that we define both if one is not provided... there might | |
171 | // be a better way to do this if there is a use case where one is defined but | |
172 | // not the other | |
173 | if(typeof setTimeout == "undefined" || typeof clearTimeout == "undefined"){ | |
174 | dojo._timeouts = []; | |
175 | clearTimeout = function(idx){ | |
176 | if(!dojo._timeouts[idx]){ return; } | |
177 | dojo._timeouts[idx].stop(); | |
178 | } | |
179 | ||
180 | setTimeout = function(func, delay){ | |
181 | // summary: provides timed callbacks using Java threads | |
182 | ||
183 | var def={ | |
184 | sleepTime:delay, | |
185 | hasSlept:false, | |
186 | ||
187 | run:function(){ | |
188 | if(!this.hasSlept){ | |
189 | this.hasSlept=true; | |
190 | java.lang.Thread.currentThread().sleep(this.sleepTime); | |
191 | } | |
192 | try{ | |
193 | func(); | |
194 | }catch(e){ | |
195 | console.debug("Error running setTimeout thread:" + e); | |
196 | } | |
197 | } | |
198 | }; | |
199 | ||
200 | var runnable = new java.lang.Runnable(def); | |
201 | var thread = new java.lang.Thread(runnable); | |
202 | thread.start(); | |
203 | return dojo._timeouts.push(thread)-1; | |
204 | } | |
2f01fe57 | 205 | } |
a089699c AD |
206 | |
207 | //Register any module paths set up in djConfig. Need to do this | |
208 | //in the hostenvs since hostenv_browser can read djConfig from a | |
209 | //script tag's attribute. | |
2f01fe57 | 210 | if(dojo.config["modulePaths"]){ |
a089699c AD |
211 | for(var param in dojo.config["modulePaths"]){ |
212 | dojo.registerModulePath(param, dojo.config["modulePaths"][param]); | |
213 | } | |
2f01fe57 | 214 | } |