envjs 0.1.0

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.
Files changed (101) hide show
  1. data/README +113 -0
  2. data/bin/envjsrb +239 -0
  3. data/bin/jquery-1.2.6-test.js +33 -0
  4. data/bin/jquery-1.3.1-test.js +33 -0
  5. data/bin/jquery-1.3.2-test.js +106 -0
  6. data/bin/prototype-1.6.0.3-test.js +82 -0
  7. data/bin/prototype_1.6.0.3_tmpl.txt +27 -0
  8. data/bin/test-jquery.sh +58 -0
  9. data/bin/test-prototype.sh +54 -0
  10. data/bin/tidy +0 -0
  11. data/lib/envjs/env.js +21549 -0
  12. data/lib/envjs/net/cgi.rb +94 -0
  13. data/lib/envjs/net/file.rb +75 -0
  14. data/lib/envjs/net.rb +3 -0
  15. data/lib/envjs/options.rb +11 -0
  16. data/lib/envjs/runtime.rb +280 -0
  17. data/lib/envjs/tempfile.rb +24 -0
  18. data/lib/envjs.rb +23 -0
  19. data/test/call-load-test.js +15 -0
  20. data/test/debug.js +53 -0
  21. data/test/firebug/errorIcon.png +0 -0
  22. data/test/firebug/firebug.css +209 -0
  23. data/test/firebug/firebug.html +23 -0
  24. data/test/firebug/firebug.js +672 -0
  25. data/test/firebug/firebugx.js +10 -0
  26. data/test/firebug/infoIcon.png +0 -0
  27. data/test/firebug/warningIcon.png +0 -0
  28. data/test/fixtures/html/events.html +171 -0
  29. data/test/fixtures/html/iframe1.html +46 -0
  30. data/test/fixtures/html/iframe1a.html +46 -0
  31. data/test/fixtures/html/iframe2.html +45 -0
  32. data/test/fixtures/html/iframe3.html +28 -0
  33. data/test/fixtures/html/iframeN.html +57 -0
  34. data/test/fixtures/html/malformed.html +181 -0
  35. data/test/fixtures/html/scope.html +81 -0
  36. data/test/fixtures/html/trivial.html +19 -0
  37. data/test/fixtures/html/with_js.html +26 -0
  38. data/test/fixtures/images/icon-blue.png +0 -0
  39. data/test/fixtures/js/external_script.js +1 -0
  40. data/test/fixtures/js/script.js +1 -0
  41. data/test/fixtures/js/script_error.js +2 -0
  42. data/test/html/events.html +171 -0
  43. data/test/html/iframe1.html +46 -0
  44. data/test/html/iframe1a.html +46 -0
  45. data/test/html/iframe2.html +45 -0
  46. data/test/html/iframe3.html +30 -0
  47. data/test/html/iframeN.html +57 -0
  48. data/test/html/malformed.html +181 -0
  49. data/test/html/scope.html +87 -0
  50. data/test/html/script.js +1 -0
  51. data/test/html/trivial.html +19 -0
  52. data/test/html/with_js.html +26 -0
  53. data/test/index.html +328 -0
  54. data/test/java-prototype.js +9 -0
  55. data/test/primary-tests.js +24 -0
  56. data/test/prototype-test.js +13 -0
  57. data/test/qunit/qunit/qunit.css +17 -0
  58. data/test/qunit/qunit/qunit.js +997 -0
  59. data/test/qunit.js +61 -0
  60. data/test/specs/dist/env.spec.js +1534 -0
  61. data/test/specs/envjs.spec.css +46 -0
  62. data/test/specs/parser/html.js +31 -0
  63. data/test/specs/parser/spec.html +40 -0
  64. data/test/specs/parser/xml.js +31 -0
  65. data/test/specs/qunit.bdd.js +210 -0
  66. data/test/specs/qunit.css +17 -0
  67. data/test/specs/qunit.js +997 -0
  68. data/test/specs/template/spec-0.js +31 -0
  69. data/test/specs/template/spec-1.js +31 -0
  70. data/test/specs/template/spec.html +40 -0
  71. data/test/specs/window/css.js +23 -0
  72. data/test/specs/window/dialog.js +25 -0
  73. data/test/specs/window/document.js +23 -0
  74. data/test/specs/window/event.js +25 -0
  75. data/test/specs/window/history.js +34 -0
  76. data/test/specs/window/location.js +34 -0
  77. data/test/specs/window/navigator.js +71 -0
  78. data/test/specs/window/screen.js +42 -0
  79. data/test/specs/window/spec.html +48 -0
  80. data/test/specs/window/timer.js +26 -0
  81. data/test/specs/window/window.js +53 -0
  82. data/test/specs/xhr/spec.html +47 -0
  83. data/test/specs/xhr/xhr.js +31 -0
  84. data/test/test.js +10 -0
  85. data/test/unit/dom.js +44 -0
  86. data/test/unit/elementmembers.js +60 -0
  87. data/test/unit/events.js +195 -0
  88. data/test/unit/fixtures/external_script.js +1 -0
  89. data/test/unit/iframe.js +234 -0
  90. data/test/unit/multi-window.js +212 -0
  91. data/test/unit/nu.validator.js +34 -0
  92. data/test/unit/onload.js +90 -0
  93. data/test/unit/parser.js +121 -0
  94. data/test/unit/prototypecompat.js +22 -0
  95. data/test/unit/proxy.js +6 -0
  96. data/test/unit/scope.js +209 -0
  97. data/test/unit/timer.js +115 -0
  98. data/test/unit/window.js +41 -0
  99. data/test/vendor/jQuery/README +2 -0
  100. data/test/vendor/prototype-1.6.0.3.js +4320 -0
  101. metadata +164 -0
@@ -0,0 +1,94 @@
1
+ require 'net/protocol'
2
+
3
+ require 'envjs/net'
4
+
5
+ class Envjs::Net::CGI
6
+
7
+ def save_and_set k, v
8
+ @saved[k] = ENV[k]
9
+ ENV[k] = v
10
+ end
11
+
12
+ def restore
13
+ @saved.keys.each do |k|
14
+ ENV[k] = @saved[k]
15
+ end
16
+ @saved = {}
17
+ end
18
+
19
+ def initialize xhr, data
20
+ if (match = %r((.*\.php)(\?(.*))?).match xhr.url).nil?
21
+ raise "Not CGI"
22
+ end
23
+
24
+ @saved = {}
25
+
26
+ begin
27
+
28
+ # p match[0]
29
+
30
+ path = match[1]
31
+ path.sub! %r(^file://), ""
32
+
33
+ save_and_set( "GATEWAY_INTERFACE", "CGI/1.1" )
34
+
35
+ save_and_set( "REQUEST_METHOD", xhr["method"] )
36
+ if ( match[3] )
37
+ save_and_set( "QUERY_STRING", match[3] )
38
+ end
39
+
40
+ if ct = xhr["headers"]["Content-Type"]
41
+ save_and_set( "CONTENT_TYPE", ct )
42
+ end
43
+
44
+ if data
45
+ save_and_set( "CONTENT_LENGTH", data.length.to_s )
46
+ end
47
+
48
+ xhr["headers"].each do |k,v|
49
+ k.gsub!("-","_")
50
+ k = "HTTP_" + k
51
+ save_and_set( k, v )
52
+ end
53
+
54
+ result = nil
55
+
56
+ save_and_set( "PATH_INFO", path )
57
+ save_and_set( "PATH_TRANSLATED", path )
58
+ save_and_set( "REDIRECT_STATUS", "200" )
59
+
60
+ open("|php-cgi", "r+") do |php|
61
+ if data
62
+ php.write data
63
+ php.flush
64
+ end
65
+ result = php.read
66
+ end
67
+
68
+ result && result = result.split("\r\n")
69
+ @headers = {}
70
+ while line = result.shift
71
+ break if line == ""
72
+ match = /([^:]*):\s*(.*)/.match line
73
+ @headers[match[1]]=match[2]
74
+ end
75
+ # p "q", result.join("\r\n")
76
+ @body = result.join("\r\n")
77
+ ensure
78
+ restore
79
+ end
80
+
81
+ end
82
+
83
+ def each
84
+ @headers.each do |k,v|
85
+ yield k, v
86
+ end
87
+ end
88
+
89
+ def finish
90
+ end
91
+
92
+ attr_reader :body
93
+
94
+ end
@@ -0,0 +1,75 @@
1
+ require 'net/protocol'
2
+
3
+ require 'envjs/net'
4
+
5
+ class Envjs::Net::File < Net::Protocol
6
+
7
+ class << self
8
+ attr_accessor :on_open
9
+ end
10
+
11
+ class Get
12
+ attr_accessor :path
13
+ def initialize path
14
+ @path = path
15
+ end
16
+ end
17
+
18
+ def initialize host, port
19
+ end
20
+
21
+ def self.start host, port
22
+ new( host, port ).start
23
+ end
24
+
25
+ def start
26
+ self
27
+ end
28
+
29
+ def finish
30
+ end
31
+
32
+ def request request
33
+ Response.new request.path
34
+ end
35
+
36
+ class Response
37
+ def initialize path
38
+ @path = path
39
+ on_open = Envjs::Net::File.on_open
40
+ on_open and on_open.call( path )
41
+ @file = File.new @path
42
+ @body = @file.read
43
+ @code = @file.nil? ? "404" : "200";
44
+ @file.close
45
+ end
46
+
47
+ def [] *args
48
+ nil
49
+ end
50
+
51
+ def each &block
52
+ end
53
+
54
+ def getHeaderFields
55
+ []
56
+ end
57
+
58
+ def getContentEncoding
59
+ nil
60
+ end
61
+
62
+ def getResponseCode
63
+ @file.nil? ? 404 : 200;
64
+ end
65
+
66
+
67
+ def getInputStream
68
+ self
69
+ end
70
+
71
+ attr_reader :body, :code
72
+
73
+ end
74
+
75
+ end
data/lib/envjs/net.rb ADDED
@@ -0,0 +1,3 @@
1
+ require 'envjs'
2
+
3
+ module Envjs::Net; end
@@ -0,0 +1,11 @@
1
+ require 'optparse'
2
+
3
+ $envjsrb_deps = nil
4
+
5
+ OptionParser.new do |o|
6
+
7
+ o.on("--deps path") do |path|
8
+ $envjsrb_deps = path
9
+ end
10
+
11
+ end.parse!
@@ -0,0 +1,280 @@
1
+ require 'envjs'
2
+ require "open-uri"
3
+ require 'rubygems'
4
+ begin
5
+ require 'fsdb'
6
+ rescue LoadError; end
7
+ require 'envjs/net/file'
8
+
9
+ module Envjs::Runtime
10
+
11
+ def self.extended object
12
+ object.instance_eval do
13
+
14
+ evaluate <<'EOJS'
15
+ print = function() {
16
+ var l = arguments.length
17
+ for( var i = 0; i < l; i++ ) {
18
+ var s;
19
+ if ( arguments[i] === null ) {
20
+ s = "null";
21
+ } else if ( arguments[i] === undefined ) {
22
+ s = "undefined"
23
+ } else {
24
+ s = arguments[i].toString();
25
+ }
26
+ Ruby.print(s);
27
+ if( i < l-1 ) {
28
+ Ruby.print(" ");
29
+ }
30
+ }
31
+ Ruby.print("\n");
32
+ Ruby['$stdout'].flush();
33
+ };
34
+ EOJS
35
+
36
+ evaluate <<'EOJS'
37
+ debug = function() {
38
+ var l = arguments.length
39
+ for( var i = 0; i < l; i++ ) {
40
+ var s;
41
+ if ( arguments[i] === null ) {
42
+ s = "null";
43
+ } else if ( arguments[i] === undefined ) {
44
+ s = "undefined"
45
+ } else {
46
+ s = arguments[i].toString();
47
+ }
48
+ Ruby['$stderr'].print(s);
49
+ if( i < l-1 ) {
50
+ Ruby['$stderr'].print(" ");
51
+ }
52
+ }
53
+ Ruby['$stderr'].print("\n");
54
+ };
55
+ EOJS
56
+
57
+ evaluate <<'EOJS'
58
+ puts = function() {
59
+ var l = arguments.length
60
+ for( var i = 0; i < l; i++ ) {
61
+ var s;
62
+ if ( arguments[i] === null ) {
63
+ s = "null";
64
+ } else if ( arguments[i] === undefined ) {
65
+ s = "undefined"
66
+ } else {
67
+ s = arguments[i].toString();
68
+ }
69
+ Ruby.print(s);
70
+ Ruby.eval("$stdout.flush")
71
+ }
72
+ };
73
+ EOJS
74
+
75
+ master = global["$master"] = evaluate("new Object")
76
+ master.symbols = [ "Johnson", "Ruby", "print", "debug", "puts", "load", "reload", "whichInterpreter", "multiwindow" ]
77
+ master.symbols.each { |symbol| master[symbol] = global[symbol] }
78
+
79
+ master.whichInterpreter = "Johnson"
80
+
81
+ master.multiwindow = true
82
+
83
+ # calling this from JS is hosed; the ruby side is confused, maybe because HTTPHeaders is mixed in?
84
+ master.add_req_field = lambda { |r,k,v| r.add_field(k,v) }
85
+
86
+ db = lambda do
87
+ $envjsrb_deps && ( @db ||= FSDB::Database.new $envjsrb_deps )
88
+ end
89
+
90
+ top_level_js = nil
91
+
92
+ add_dep = nil
93
+
94
+ clear_deps = lambda do |w|
95
+ begin
96
+ if db.call
97
+ loc = w
98
+ begin loc = w.location; rescue; end
99
+ loc && ( loc = loc.to_s )
100
+ if ( loc !~ %r((http?s|file|about):) )
101
+ begin
102
+ loc = "file://" + Pathname(loc).realpath.to_s
103
+ rescue Errno::ENOENT; end
104
+ end
105
+ # $stderr.puts "clear", loc
106
+ if loc and loc != "about:blank"
107
+ paths = db.call[loc+".on.yml"] || []
108
+ paths.each do |path|
109
+ # $stderr.print "#{path} not by #{loc}\n";
110
+ db.call[path+".by.yml"].delete loc
111
+ end
112
+ # $stderr.print "#{loc} not on anything\n";
113
+ db.call.delete loc+".on.yml"
114
+ end
115
+ end
116
+ add_dep.call( nil, loc )
117
+ rescue Exception => e; $stderr.puts e, e.class; $stderr.puts e.backtrace; end
118
+ end
119
+
120
+ if $envjsrb_deps
121
+ Envjs::Net::File.on_open = clear_deps
122
+ end
123
+
124
+ add_dep = lambda do |w, f|
125
+ if db.call
126
+ loc = nil
127
+ begin loc = w.location; rescue Exception; end
128
+ loc && ( loc = loc.to_s )
129
+ if ( loc && loc !~ %r((http?s|file|about):) )
130
+ loc = "file://" + Pathname(loc).realpath.to_s
131
+ end
132
+ path = f
133
+ if ( path !~ %r((http?s|file|about):) )
134
+ begin
135
+ path = "file://" + Pathname(path).realpath.to_s
136
+ rescue Errno::ENOENT
137
+ return
138
+ end
139
+ end
140
+ if !loc || loc == "about:blank"
141
+ tll = "file://" + Pathname(top_level_js).realpath.to_s
142
+ if ( tll != path )
143
+ loc = tll
144
+ end
145
+ end
146
+ if loc and loc != "about:blank"
147
+ on = db.call[loc+".on.yml"] || []
148
+ on << path
149
+ on.uniq!
150
+ db.call[loc+".on.yml"] = on
151
+ by = db.call[path+".by.yml"] || []
152
+ by << loc
153
+ by.uniq!
154
+ db.call[path+".by.yml"] = by
155
+ # $stderr.print "#{loc} on #{path}: #{db.call[loc+'.on.yml'].join(' ')}\n"
156
+ # $stderr.print "#{path} by #{loc}: #{db.call[path+'.by.yml'].join(' ')}\n"
157
+ end
158
+ end
159
+ end
160
+
161
+ (class << self; self; end).send :define_method, :top_level_load do |path|
162
+ # $stderr.print "tll #{path}\n"
163
+ top_level_js = path
164
+ clear_deps.call( path )
165
+ end
166
+
167
+ master.load = lambda { |*files|
168
+ if files.length == 2 && !(String === files[1])
169
+ f = files[0]
170
+ w = files[1]
171
+ v = open(f).read.gsub(/\A#!.*$/, '')
172
+ loc = nil
173
+ add_dep.call w, f
174
+ evaluate(v, f, 1, w, w, f)
175
+ else
176
+ load *files
177
+ end
178
+ }
179
+
180
+ master.reload = lambda { |*files|
181
+ if files.length == 2 && !(String === files[1])
182
+ f = files[0]
183
+ w = files[1]
184
+ v = open(f).read.gsub(/\A#!.*$/, '')
185
+ loc = nil
186
+ add_dep.call w, f
187
+ reevaluate(v, f, 1, w, w, f)
188
+ else
189
+ reload *files
190
+ end
191
+ }
192
+
193
+ master.evaluate = lambda { |v,w|
194
+ evaluate(v,"inline",1,w,w);
195
+ }
196
+
197
+ master.new_split_global_outer = lambda { new_split_global_outer }
198
+ master.new_split_global_inner = lambda { |outer,_| new_split_global_inner outer }
199
+
200
+ # create an proto window object and proxy
201
+
202
+ outer = new_split_global_outer
203
+ window = inner = new_split_global_inner( outer )
204
+
205
+ master.symbols.each do |symbol|
206
+ window[symbol] = master[symbol]
207
+ end
208
+
209
+ master.first_script_window = window
210
+
211
+ window["$master"] = master
212
+ window["$options"] = evaluate("new Object");
213
+ window["$options"].proxy = outer
214
+
215
+ window.load = lambda { |*files|
216
+ files.each do |f|
217
+ master.load.call f, window
218
+ end
219
+ }
220
+
221
+ window.reload = lambda { |*files|
222
+ files.each do |f|
223
+ master.reload.call f, window
224
+ end
225
+ }
226
+
227
+ ( class << self; self; end ).send :define_method, :wait do
228
+ master["finalize"] && master.finalize.call
229
+ master.timers && master.timers.wait
230
+ end
231
+
232
+ scripts = {}
233
+
234
+ ( class << self; self; end ).send :define_method, :become_first_script_window do
235
+ # p "heh", inner, master.first_script_window
236
+ inner = master.first_script_window
237
+ end
238
+
239
+ ( class << self; self; end ).send :define_method, :evaluate do |*args|
240
+ ( script, file, line, global, scope, fn ) = *args
241
+ # print "eval in " + script[0,50].inspect + (scope ? scope.toString() : "nil") + "\n"
242
+ global = nil
243
+ scope ||= inner
244
+ if fn
245
+ compiled_script = scripts[fn]
246
+ end
247
+ # compiled_script = compile(script, file, line, global)
248
+ compiled_script ||= compile(script, file, line, global)
249
+ if fn && !scripts[fn]
250
+ scripts[fn] = compiled_script
251
+ end
252
+ evaluate_compiled_script(compiled_script,scope)
253
+ end
254
+
255
+ ( class << self; self; end ).send :define_method, :reevaluate do |*args|
256
+ ( script, file, line, global, scope, fn ) = *args
257
+ # print "eval in " + script[0,50].inspect + (scope ? scope.toString() : "nil") + "\n"
258
+ global = nil
259
+ scope ||= inner
260
+ compiled_script = compile(script, file, line, global)
261
+ if fn
262
+ scripts[fn] = compiled_script
263
+ end
264
+ evaluate_compiled_script(compiled_script,scope)
265
+ end
266
+
267
+ @envjs = inner
268
+
269
+ ( class << self; self; end ).send :define_method, :"[]" do |key|
270
+ key == "this" && evaluate("this") || @envjs[key]
271
+ end
272
+
273
+ ( class << self; self; end ).send :define_method, :"[]=" do |k,v|
274
+ @envjs[k] = v
275
+ end
276
+
277
+ end
278
+ end
279
+
280
+ end
@@ -0,0 +1,24 @@
1
+ require 'tempfile'
2
+
3
+ require 'envjs'
4
+
5
+ class Envjs::TempFile < Tempfile
6
+
7
+ def initialize pattern, suffix = nil
8
+ super(pattern)
9
+
10
+
11
+ if suffix
12
+ new_path = path + "." + suffix
13
+ File.link path, new_path
14
+ File.unlink path
15
+ # blah ... implementation specific ...
16
+ @data[0] = @tmpname = new_path
17
+ end
18
+ end
19
+
20
+ def getAbsolutePath
21
+ path
22
+ end
23
+
24
+ end
data/lib/envjs.rb ADDED
@@ -0,0 +1,23 @@
1
+ module Envjs
2
+
3
+ def self.js_exception_stack e
4
+ result = %(Exception: )+e.to_s
5
+ e.stack.to_s.split(%(\n)).each do |line|
6
+ next if line == "@:0"
7
+ m = line.match(/(.*)@([^@]*)$/)
8
+ s = m[1]
9
+ limit = 50
10
+ if ( s.length > limit )
11
+ s = s[0,limit] + %(...)
12
+ end
13
+ result += "\n" + m[2]+%( )+s
14
+ end
15
+ result
16
+ end
17
+
18
+ ENVJS =
19
+ File.expand_path( File.join( File.dirname(__FILE__),
20
+ "envjs",
21
+ "env.js" ) )
22
+
23
+ end
@@ -0,0 +1,15 @@
1
+ load("test/qunit.js");
2
+
3
+ Envjs("test/index.html", {});
4
+
5
+ test("'index.html' loaded correctly via 'Envjs()' call", function(){
6
+ expect(1);
7
+ try{ ok(document.getElementById('body').id == "body",
8
+ "'index.html' page content available");
9
+ }catch(e){print(e);}
10
+ });
11
+
12
+ test("window.location= following Envjs() initialization flagged as error",
13
+ function(){
14
+ expect(0);
15
+ });
data/test/debug.js ADDED
@@ -0,0 +1,53 @@
1
+ // Init
2
+ load("src/env.js");
3
+ load("src/htmlparser.js");
4
+
5
+ window.location = "test/index.html";
6
+
7
+ window.onload = function(){
8
+ load("test/testrunner.js");
9
+ load("test/jquery.js");
10
+
11
+ var depth = 0;
12
+
13
+ function indent(){
14
+ var str = "";
15
+ for ( var i = 0; i < depth; i++ ) {
16
+ str += " ";
17
+ }
18
+ return str;
19
+ }
20
+
21
+ function dump(name, args, ret){
22
+ print(name + ": " + Array.prototype.slice.call(args) + " - Return: " + ret);
23
+ }
24
+
25
+ for ( var method in jQuery.fn ) (function(method){ if ( method != "init" ) {
26
+ var old = jQuery.fn[method];
27
+ jQuery.fn[method] = function(){
28
+ print(indent() + method + ": " + Array.prototype.slice.call(arguments));
29
+ depth++;
30
+ var ret = old.apply(this, arguments);
31
+ depth--;
32
+ print(indent() + method + ": Return " + ret);
33
+ return ret;
34
+ };
35
+ } })(method);
36
+
37
+ for ( var method in jQuery ) (function(method){ if ( method != "prototype" && method != "fn" ) {
38
+ var old = jQuery[method];
39
+ jQuery[method] = function(){
40
+ print(indent() + "$." + method + ": " + Array.prototype.slice.call(arguments));
41
+ depth++;
42
+ var ret = old.apply(this, arguments);
43
+ depth--;
44
+ print(indent() + "$." + method + ": Return " + ret);
45
+ return ret;
46
+ };
47
+ } })(method);
48
+
49
+ jQuery.prototype.toString = DOMNodeList.prototype.toString;
50
+ Function.prototype.toString = function(){ return "function()"; };
51
+
52
+ print("Ready.");
53
+ };
Binary file