smparkes-envjs 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|