smparkes-envjs 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/envjsrb +9 -3
- data/lib/envjs/env.js +167 -62
- data/lib/envjs/net/file.rb +2 -4
- data/lib/envjs/runtime.rb +2 -0
- data/test/unit/events.js +1 -1
- metadata +2 -2
data/bin/envjsrb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
|
+
require 'pathname'
|
4
5
|
|
5
6
|
begin
|
6
7
|
require 'johnson/tracemonkey'
|
@@ -23,9 +24,14 @@ RUNTIME.load Envjs::ENVJS
|
|
23
24
|
if ARGV.length > 0
|
24
25
|
|
25
26
|
begin
|
26
|
-
ARGV.
|
27
|
-
if file =~ /\.x?html?$/
|
28
|
-
|
27
|
+
ARGV.each_with_index do |file,i|
|
28
|
+
if file =~ /\.x?html?$/ || file =~ %r(^https?://)
|
29
|
+
if i > 0
|
30
|
+
RUNTIME.wait
|
31
|
+
RUNTIME.evaluate("window.location = 'about:blank'", "(comand line)", 1)
|
32
|
+
end
|
33
|
+
RUNTIME.wait
|
34
|
+
RUNTIME.evaluate("window.location = 'file://#{Pathname.new(file).realpath}'", file, 1)
|
29
35
|
else
|
30
36
|
RUNTIME.load file
|
31
37
|
end
|
data/lib/envjs/env.js
CHANGED
@@ -48,11 +48,16 @@
|
|
48
48
|
};
|
49
49
|
|
50
50
|
$env.new_window = function(proxy){
|
51
|
+
var swap_script_window = ( $master.first_script_window.window === proxy );
|
51
52
|
if(!proxy){
|
52
53
|
proxy = $platform.new_split_global_outer();
|
54
|
+
// $master.print("np",proxy);
|
53
55
|
}
|
54
56
|
$master.proxy = proxy;
|
55
57
|
new_window = $platform.new_split_global_inner(proxy,undefined);
|
58
|
+
if(swap_script_window) {
|
59
|
+
$master.first_script_window = new_window;
|
60
|
+
}
|
56
61
|
new_window.$master = $master;
|
57
62
|
for(var index in $master.symbols) {
|
58
63
|
var symbol = $master.symbols[index];
|
@@ -78,26 +83,34 @@
|
|
78
83
|
};
|
79
84
|
|
80
85
|
$env.init_window = function(options){
|
86
|
+
options = options || {};
|
87
|
+
|
81
88
|
$platform.init_window(this);
|
82
89
|
|
83
90
|
var print = $master.print;
|
84
91
|
|
85
92
|
// print("set",this);
|
86
93
|
// print("set",this.window);
|
94
|
+
// print("set",options.proxy);
|
95
|
+
// print("set",this === options.proxy);
|
87
96
|
if ( !this.window) {
|
88
97
|
this.window = this;
|
89
98
|
}
|
90
99
|
// print("setx",this);
|
91
100
|
// print("setx",this.window);
|
92
101
|
|
93
|
-
|
94
|
-
|
95
|
-
|
102
|
+
var $w = this;
|
103
|
+
// print("$$w",$w);
|
104
|
+
// print("$$w",$w === this);
|
105
|
+
$env.log = function(msg, level){
|
96
106
|
print(' '+ (level?level:'LOG') + ':\t['+ new Date()+"] {ENVJS} "+msg);
|
97
107
|
};
|
98
108
|
|
99
109
|
$env.location = function(path, base){
|
100
110
|
// print("loc",path,base);
|
111
|
+
if ( path == "about:blank" ) {
|
112
|
+
return path;
|
113
|
+
}
|
101
114
|
var protocol = new RegExp('(^file\:|^http\:|^https\:)');
|
102
115
|
var m = protocol.exec(path);
|
103
116
|
if(m&&m.length>1){
|
@@ -123,14 +136,16 @@ $env.location = function(path, base){
|
|
123
136
|
if ( result.substring(0,6) == "file:/" && result[6] != "/" ) {
|
124
137
|
result = "file://" + result.substring(5,result.length);
|
125
138
|
}
|
126
|
-
if (
|
139
|
+
if ( result.substring(0,7) == "file://" ) {
|
127
140
|
result = result.substring(7,result.length);
|
128
141
|
}
|
129
142
|
// print("ZZ",result);
|
130
143
|
return result;
|
131
144
|
}else{
|
132
145
|
//return an absolute url from a url relative to the window location
|
133
|
-
|
146
|
+
// print("hi", $master.first_script_window, $master.first_script_window && $master.first_script_window.location );
|
147
|
+
if( ( base = ( ( $master.first_script_window && $master.first_script_window.location ) || window.location ) ) &&
|
148
|
+
( base != "about:blank" ) &&
|
134
149
|
base.href &&
|
135
150
|
(base.href.length > 0) ) {
|
136
151
|
base = base.href.substring(0, base.href.lastIndexOf('/'));
|
@@ -141,6 +156,7 @@ $env.location = function(path, base){
|
|
141
156
|
// print("****",result);
|
142
157
|
return result;
|
143
158
|
} else {
|
159
|
+
// print("RRR",result);
|
144
160
|
return "file://"+Ruby.File.expand_path(path);
|
145
161
|
}
|
146
162
|
}
|
@@ -186,23 +202,35 @@ $env.connection = function(xhr, responseHandler, data){
|
|
186
202
|
}
|
187
203
|
|
188
204
|
}
|
189
|
-
}catch(e){
|
190
|
-
$env.error('failed to open file '+ url, e);
|
205
|
+
} catch (e) {
|
191
206
|
connection = null;
|
192
207
|
xhr.readyState = 4;
|
193
|
-
|
194
|
-
|
208
|
+
if(e.toString().match(/Errno::ENOENT/)) {
|
209
|
+
xhr.status = "404";
|
210
|
+
xhr.statusText = "Not Found";
|
211
|
+
xhr.responseText = undefined;
|
212
|
+
} else {
|
213
|
+
xhr.status = "500";
|
214
|
+
xhr.statusText = "Local File Protocol Error";
|
215
|
+
xhr.responseText = "<html><head/><body><p>"+ e+ "</p></body></html>";
|
216
|
+
}
|
195
217
|
}
|
196
218
|
} else {
|
197
219
|
Ruby.require('net/http');
|
198
220
|
|
199
221
|
var req;
|
222
|
+
var path;
|
223
|
+
try {
|
224
|
+
path = url.request_uri();
|
225
|
+
} catch(e) {
|
226
|
+
path = url.path;
|
227
|
+
}
|
200
228
|
if ( xhr.method == "GET" ) {
|
201
|
-
req = new Ruby.Net.HTTP.Get(
|
229
|
+
req = new Ruby.Net.HTTP.Get( path );
|
202
230
|
} else if ( xhr.method == "POST" ) {
|
203
|
-
req = new Ruby.Net.HTTP.Post(
|
231
|
+
req = new Ruby.Net.HTTP.Post( path );
|
204
232
|
} else if ( xhr.method == "PUT" ) {
|
205
|
-
req = new Ruby.Net.HTTP.Put(
|
233
|
+
req = new Ruby.Net.HTTP.Put( path );
|
206
234
|
}
|
207
235
|
|
208
236
|
for (var header in xhr.headers){
|
@@ -240,7 +268,7 @@ $env.connection = function(xhr, responseHandler, data){
|
|
240
268
|
}
|
241
269
|
|
242
270
|
xhr.readyState = 4;
|
243
|
-
xhr.status = parseInt(
|
271
|
+
xhr.status = parseInt(resp.code,10) || 0;
|
244
272
|
xhr.statusText = connection.responseMessage || "";
|
245
273
|
|
246
274
|
var contentEncoding = resp["Content-Encoding"] || "utf-8",
|
@@ -279,22 +307,51 @@ $env.connection = function(xhr, responseHandler, data){
|
|
279
307
|
var extract_line =
|
280
308
|
Ruby.eval(
|
281
309
|
"lambda { |e| \
|
282
|
-
|
310
|
+
begin; \
|
311
|
+
e.stack.to_s.split(%(\n))[1].match(/:([^:]*)$/)[1]; \
|
312
|
+
rescue; %(unknown); end; \
|
283
313
|
}");
|
284
314
|
|
285
|
-
var print_exception =
|
315
|
+
var print_exception = window.print_exception =
|
316
|
+
Ruby.eval(" \
|
317
|
+
lambda { |e| \
|
318
|
+
estr = e.to_s; \
|
319
|
+
estr.gsub!(/(<br \\/>)+/, %( )); \
|
320
|
+
print(%(Exception: ),estr,%(\n)); \
|
321
|
+
begin; \
|
322
|
+
e.stack.to_s.split(%(\n)).each do |line| \
|
323
|
+
m = line.match(/(.*)@([^@]*)$/); \
|
324
|
+
m[2] == %(:0) && next; \
|
325
|
+
s = m[1]; \
|
326
|
+
s.gsub!(/(<br \\/>)+/, %( )); \
|
327
|
+
limit = 100; \
|
328
|
+
if ( s.length > limit ); \
|
329
|
+
s = s[0,limit] + %(...); \
|
330
|
+
end; \
|
331
|
+
print(m[2],%( ),s,%(\n)); \
|
332
|
+
end; \
|
333
|
+
rescue; end; \
|
334
|
+
} \
|
335
|
+
");
|
336
|
+
|
337
|
+
var print_exception_trace = window.print_exception_trace =
|
286
338
|
Ruby.eval(" \
|
287
339
|
lambda { |e| \
|
288
|
-
|
340
|
+
estr = e.to_s; \
|
341
|
+
estr.gsub!(/(<br \\/>)+/, %( )); \
|
342
|
+
begin; \
|
289
343
|
e.stack.to_s.split(%(\n)).each do |line| \
|
290
344
|
m = line.match(/(.*)@([^@]*)$/); \
|
345
|
+
m[2] == %(:0) && next; \
|
291
346
|
s = m[1]; \
|
292
|
-
|
347
|
+
s.gsub!(/(<br \\/>)+/, %( )); \
|
348
|
+
limit = 100; \
|
293
349
|
if ( s.length > limit ); \
|
294
350
|
s = s[0,limit] + %(...); \
|
295
351
|
end; \
|
296
352
|
print(m[2],%( ),s,%(\n)); \
|
297
|
-
end \
|
353
|
+
end; \
|
354
|
+
rescue; end; \
|
298
355
|
} \
|
299
356
|
");
|
300
357
|
|
@@ -387,12 +444,16 @@ $env.makeNewWindowMaybeLoad = function(openingWindow, parentArg, url, outer){
|
|
387
444
|
url: $env.location(url)
|
388
445
|
};
|
389
446
|
|
447
|
+
// print("$w",$w);
|
448
|
+
// print("$ww",$w.window);
|
449
|
+
// print("$ww",$w === $w.window);
|
390
450
|
var pair = $env.new_window(outer);
|
391
451
|
var proxy = pair[0];
|
392
452
|
var new_window = pair[1];
|
393
453
|
options.proxy = proxy;
|
394
454
|
new_window.$options = options;
|
395
|
-
$
|
455
|
+
// print("$w",$w);
|
456
|
+
$master.load($master.Ruby.Envjs.ENVJS, new_window);
|
396
457
|
return proxy;
|
397
458
|
};
|
398
459
|
|
@@ -407,7 +468,6 @@ $env.reloadAWindowProxy = function(oldWindowProxy, url){
|
|
407
468
|
$env.sleep = function(n){Ruby.sleep(n/1000.);};
|
408
469
|
|
409
470
|
$env.loadIntoFnsScope = function(file) {
|
410
|
-
// print("lifs",load);
|
411
471
|
return load(file);
|
412
472
|
}
|
413
473
|
|
@@ -470,8 +530,9 @@ var Envjs = function(){
|
|
470
530
|
$env.NONE = 0;
|
471
531
|
|
472
532
|
//set this if you want to get some internal log statements
|
473
|
-
$env.logLevel = $env.DEBUG;
|
474
533
|
$env.logLevel = $env.INFO;
|
534
|
+
$env.logLevel = $env.DEBUG;
|
535
|
+
$env.logLevel = $env.WARN;
|
475
536
|
|
476
537
|
$env.debug = function(msg){
|
477
538
|
if($env.logLevel >= $env.DEBUG)
|
@@ -487,12 +548,16 @@ var Envjs = function(){
|
|
487
548
|
};
|
488
549
|
$env.error = function(msg, e){
|
489
550
|
if ($env.logLevel >= $env.ERROR) {
|
490
|
-
|
491
|
-
|
551
|
+
var line = $env.lineSource(e);
|
552
|
+
line != "" && ( line = " Line: "+ line );
|
553
|
+
$env.log(msg + line, 'ERROR');
|
554
|
+
if(e) {
|
555
|
+
$env.log(e || "", 'ERROR');
|
556
|
+
}
|
492
557
|
}
|
493
558
|
};
|
494
559
|
|
495
|
-
$env.
|
560
|
+
$env.debug("Initializing Core Platform Env");
|
496
561
|
|
497
562
|
|
498
563
|
// if we're running in an environment without env.js' custom extensions
|
@@ -564,7 +629,7 @@ var Envjs = function(){
|
|
564
629
|
$env.platform = "";
|
565
630
|
|
566
631
|
$env.scriptTypes = {
|
567
|
-
"text/javascript" :
|
632
|
+
"text/javascript" :true,
|
568
633
|
"text/envjs" :true
|
569
634
|
};
|
570
635
|
|
@@ -597,7 +662,13 @@ var Envjs = function(){
|
|
597
662
|
}
|
598
663
|
}
|
599
664
|
base = "" + window.location;
|
600
|
-
|
665
|
+
try {
|
666
|
+
load($env.location(script.src.match(/([^\?#]*)/)[1], base ));
|
667
|
+
} catch(e) {
|
668
|
+
$env.error("could not load script: " +
|
669
|
+
$env.location(script.src.match(/([^\?#]*)/)[1], base ) +
|
670
|
+
": " + e + " thrown" );
|
671
|
+
}
|
601
672
|
//lets you register a function to execute
|
602
673
|
//after the script is loaded
|
603
674
|
if($env.afterScriptLoad){
|
@@ -5024,22 +5095,45 @@ __extend__(DOMDocument.prototype, {
|
|
5024
5095
|
load: function(url){
|
5025
5096
|
$debug("Loading url into DOM Document: "+ url + " - (Asynch? "+$w.document.async+")");
|
5026
5097
|
var scripts, _this = this;
|
5027
|
-
var xhr
|
5098
|
+
var xhr;
|
5099
|
+
// print("KK",url,url =="about:blank");
|
5100
|
+
if (url == "about:blank"){
|
5101
|
+
xhr = ({
|
5102
|
+
open: function(){},
|
5103
|
+
send: function(){
|
5104
|
+
this.responseText = "<html><head><title></title></head><body></body></html>";
|
5105
|
+
this.onreadystatechange();
|
5106
|
+
},
|
5107
|
+
status: 200
|
5108
|
+
});
|
5109
|
+
} else {
|
5110
|
+
xhr = new XMLHttpRequest();
|
5111
|
+
}
|
5028
5112
|
xhr.open("GET", url, $w.document.async);
|
5029
5113
|
xhr.onreadystatechange = function(){
|
5030
|
-
|
5031
|
-
|
5032
|
-
}catch(e){
|
5033
|
-
$error("Error Parsing XML - ",e);
|
5114
|
+
if (xhr.status != 200) {
|
5115
|
+
$error("Could not retrieve XHR content from " + url + ": status code " + xhr.status);
|
5034
5116
|
_this.loadXML(
|
5035
|
-
|
5036
|
-
|
5037
|
-
|
5038
|
-
|
5117
|
+
"<html><head></head><body>"+
|
5118
|
+
"<h1>No File</h1>"+
|
5119
|
+
"</body></html>");
|
5120
|
+
} else {
|
5121
|
+
try{
|
5122
|
+
_this.loadXML(xhr.responseText);
|
5123
|
+
}catch(e){
|
5124
|
+
$error("Error Parsing XML - ",e);
|
5125
|
+
_this.loadXML(
|
5126
|
+
"<html><head></head><body>"+
|
5127
|
+
"<h1>Parse Error</h1>"+
|
5128
|
+
"<p>"+e.toString()+"</p>"+
|
5129
|
+
"</body></html>");
|
5130
|
+
}
|
5039
5131
|
}
|
5040
5132
|
_this._url = url;
|
5041
5133
|
|
5134
|
+
if ( url != "about:blank" ) {
|
5042
5135
|
$info("Sucessfully loaded document at "+url);
|
5136
|
+
}
|
5043
5137
|
|
5044
5138
|
// first fire body-onload event
|
5045
5139
|
var event = document.createEvent();
|
@@ -5343,6 +5437,11 @@ var __isValidNamespace__ = function(doc, namespaceURI, qualifiedName, isAttribut
|
|
5343
5437
|
};
|
5344
5438
|
|
5345
5439
|
$w.Document = DOMDocument;
|
5440
|
+
|
5441
|
+
// Local Variables:
|
5442
|
+
// espresso-indent-level:4
|
5443
|
+
// c-basic-offset:4
|
5444
|
+
// End:
|
5346
5445
|
/*
|
5347
5446
|
* parser.js
|
5348
5447
|
*/
|
@@ -9055,14 +9154,22 @@ $w.__defineGetter__("location", function(url){
|
|
9055
9154
|
// to modify the correct portion of the location object
|
9056
9155
|
// when we navigate the history
|
9057
9156
|
var setHistory = function( value, locationPart){
|
9058
|
-
|
9157
|
+
if ( value == "about:blank" ) {
|
9158
|
+
return;
|
9159
|
+
}
|
9160
|
+
$debug("adding value to history: " +value);
|
9059
9161
|
$currentHistoryIndex++;
|
9060
9162
|
$history.push({
|
9061
9163
|
location: locationPart||"href",
|
9062
9164
|
value: value
|
9063
9165
|
});
|
9064
9166
|
};
|
9065
|
-
|
9167
|
+
|
9168
|
+
// Local Variables:
|
9169
|
+
// espresso-indent-level:4
|
9170
|
+
// c-basic-offset:4
|
9171
|
+
// End:
|
9172
|
+
/*
|
9066
9173
|
* navigator.js
|
9067
9174
|
* - requires env
|
9068
9175
|
*/
|
@@ -9214,7 +9321,7 @@ window.clearInterval = window.clearTimeout = function(num){
|
|
9214
9321
|
|
9215
9322
|
// FIX: make a priority queue ...
|
9216
9323
|
|
9217
|
-
window.$wait = $env.wait = $env.wait || function(wait) {
|
9324
|
+
window.$wait = $timers.wait = $env.wait = $env.wait || function(wait) {
|
9218
9325
|
var start = Date.now();
|
9219
9326
|
var old_loop_running = $event_loop_running;
|
9220
9327
|
$event_loop_running = true;
|
@@ -10383,9 +10490,28 @@ try{
|
|
10383
10490
|
// (function(){
|
10384
10491
|
// function(){
|
10385
10492
|
|
10386
|
-
|
10387
|
-
|
10388
|
-
|
10493
|
+
// User accesible interface ...
|
10494
|
+
var Envjs = $w.Envjs = $env.Envjs = function(){
|
10495
|
+
if(arguments.length === 2){
|
10496
|
+
for ( var i in arguments[1] ) {
|
10497
|
+
var g = arguments[1].__lookupGetter__(i),
|
10498
|
+
s = arguments[1].__lookupSetter__(i);
|
10499
|
+
if ( g || s ) {
|
10500
|
+
if ( g ) $env.__defineGetter__(i, g);
|
10501
|
+
if ( s ) $env.__defineSetter__(i, s);
|
10502
|
+
} else
|
10503
|
+
$env[i] = arguments[1][i];
|
10504
|
+
}
|
10505
|
+
}
|
10506
|
+
if (arguments[0] != null && arguments[0] != "")
|
10507
|
+
window.location = arguments[0];
|
10508
|
+
};
|
10509
|
+
Envjs.$env = $env;
|
10510
|
+
Envjs.wait = $env.wait;
|
10511
|
+
Envjs.interpreter = window.whichInterpreter;
|
10512
|
+
Envjs.evaluate = $env.$master.evaluate;
|
10513
|
+
|
10514
|
+
$w.__loadAWindowsDocument__(options.url || "about:blank");
|
10389
10515
|
};
|
10390
10516
|
|
10391
10517
|
return $env;
|
@@ -10395,27 +10521,6 @@ try{
|
|
10395
10521
|
// Initial window setup
|
10396
10522
|
$env.init.call(this);
|
10397
10523
|
|
10398
|
-
// User accesible interface ...
|
10399
|
-
Envjs = $env.Envjs = function(){
|
10400
|
-
if(arguments.length === 2){
|
10401
|
-
for ( var i in arguments[1] ) {
|
10402
|
-
var g = arguments[1].__lookupGetter__(i),
|
10403
|
-
s = arguments[1].__lookupSetter__(i);
|
10404
|
-
if ( g || s ) {
|
10405
|
-
if ( g ) $env.__defineGetter__(i, g);
|
10406
|
-
if ( s ) $env.__defineSetter__(i, s);
|
10407
|
-
} else
|
10408
|
-
$env[i] = arguments[1][i];
|
10409
|
-
}
|
10410
|
-
}
|
10411
|
-
if (arguments[0] != null && arguments[0] != "")
|
10412
|
-
window.location = arguments[0];
|
10413
|
-
};
|
10414
|
-
Envjs.$env = $env;
|
10415
|
-
Envjs.wait = $env.wait;
|
10416
|
-
Envjs.interpreter = window.whichInterpreter;
|
10417
|
-
Envjs.evaluate = $env.$master.evaluate;
|
10418
|
-
|
10419
10524
|
})();
|
10420
10525
|
|
10421
10526
|
// Local Variables:
|
data/lib/envjs/net/file.rb
CHANGED
@@ -30,6 +30,7 @@ class Envjs::Net::File < Net::Protocol
|
|
30
30
|
@path = path
|
31
31
|
@file = File.new @path
|
32
32
|
@body = @file.read
|
33
|
+
@code = @file.nil? ? "404" : "200";
|
33
34
|
@file.close
|
34
35
|
end
|
35
36
|
|
@@ -52,15 +53,12 @@ class Envjs::Net::File < Net::Protocol
|
|
52
53
|
@file.nil? ? 404 : 200;
|
53
54
|
end
|
54
55
|
|
55
|
-
def code
|
56
|
-
@file.nil? ? "404" : "200";
|
57
|
-
end
|
58
56
|
|
59
57
|
def getInputStream
|
60
58
|
self
|
61
59
|
end
|
62
60
|
|
63
|
-
attr_reader :body
|
61
|
+
attr_reader :body, :code
|
64
62
|
|
65
63
|
end
|
66
64
|
|
data/lib/envjs/runtime.rb
CHANGED
data/test/unit/events.js
CHANGED
@@ -177,7 +177,7 @@ test("Check that events can be set with addEventListener(), and bubble",
|
|
177
177
|
var elem = document.getElementById('eventsFrame').contentDocument.
|
178
178
|
getElementById(id).addEventListener('click', function(event){
|
179
179
|
try{
|
180
|
-
ok( event.target === img && this === window,
|
180
|
+
ok( event.target === img && ( ( this === window ) || ( this.window === window ) ),
|
181
181
|
"Scope: 'this' refers to the window '" + window + "'");
|
182
182
|
}catch(e){print(e);}
|
183
183
|
});
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smparkes-envjs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Resig
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-11-
|
13
|
+
date: 2009-11-04 00:00:00 -08:00
|
14
14
|
default_executable: envjsrb
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|