reverted my "fixes", seems like they work only with the latest (dev) rhino version...
[jquery.git] / build / runtest / env.js
index bf53efa..e15a226 100644 (file)
@@ -17,16 +17,32 @@ var window = this;
                }
        };
        
+       var curLocation = (new java.io.File("./")).toURL();
+       
        window.__defineSetter__("location", function(url){
-               window.document = new DOMDocument(
-                       new Packages.org.xml.sax.InputSource(\r                  new java.io.InputStreamReader(
-                               new java.io.FileInputStream(url))));
+               var xhr = new XMLHttpRequest();
+               xhr.open("GET", url);
+               xhr.onreadystatechange = function(){
+                       curLocation = new java.net.URL( curLocation, url );
+                       window.document = xhr.responseXML;
+
+                       var event = document.createEvent();
+                       event.initEvent("load");
+                       window.dispatchEvent( event );
+               };
+               xhr.send();
        });
        
        window.__defineGetter__("location", function(url){
                return {
                        get protocol(){
-                               return "file:";
+                               return curLocation.getProtocol() + ":";
+                       },
+                       get href(){
+                               return curLocation.toString();
+                       },
+                       toString: function(){
+                               return this.href;
                        }
                };
        });
@@ -68,9 +84,51 @@ var window = this;
        };
        
        // Window Events
+       
+       var events = [{}];
 
-       window.addEventListener = function(){};
-       window.removeEventListener = function(){};
+       window.addEventListener = function(type, fn){
+               if ( !this.uuid || this == window ) {
+                       this.uuid = events.length;
+                       events[this.uuid] = {};
+               }
+          
+               if ( !events[this.uuid][type] )
+                       events[this.uuid][type] = [];
+               
+               if ( events[this.uuid][type].indexOf( fn ) < 0 )
+                       events[this.uuid][type].push( fn );
+       };
+       
+       window.removeEventListener = function(type, fn){
+          if ( !this.uuid || this == window ) {
+              this.uuid = events.length;
+              events[this.uuid] = {};
+          }
+          
+          if ( !events[this.uuid][type] )
+                       events[this.uuid][type] = [];
+                       
+               events[this.uuid][type] =
+                       events[this.uuid][type].filter(function(f){
+                               return f != fn;
+                       });
+       };
+       
+       window.dispatchEvent = function(event){
+               if ( event.type ) {
+                       if ( this.uuid && events[this.uuid][event.type] ) {
+                               var self = this;
+                       
+                               events[this.uuid][event.type].forEach(function(fn){
+                                       fn.call( self, event );
+                               });
+                       }
+                       
+                       if ( this["on" + event.type] )
+                               this["on" + event.type].call( self, event );
+               }
+       };
        
        // DOM Document
        
@@ -116,8 +174,9 @@ var window = this;
                get ownerDocument(){
                        return null;
                },
-               addEventListener: function(){},
-               removeEventListener: function(){},
+               addEventListener: window.addEventListener,
+               removeEventListener: window.removeEventListener,
+               dispatchEvent: window.dispatchEvent,
                get nodeName() {
                        return "#document";
                },
@@ -128,6 +187,9 @@ var window = this;
                        return "Document" + (typeof this._file == "string" ?
                                ": " + this._file : "");
                },
+               get innerHTML(){
+                       return this.documentElement.outerHTML;
+               },
                
                get defaultView(){
                        return {
@@ -147,6 +209,15 @@ var window = this;
                                        };
                                }
                        };
+               },
+               
+               createEvent: function(){
+                       return {
+                               type: "",
+                               initEvent: function(type){
+                                       this.type = type;
+                               }
+                       };
                }
        };
        
@@ -171,9 +242,9 @@ var window = this;
                        return "[ " +
                                Array.prototype.join.call( this, ", " ) + " ]";
                },
-               valueOf: function(){
+               get outerHTML(){
                        return Array.prototype.map.call(
-                               this, function(node){return node.valueOf();}).join('');
+                               this, function(node){return node.outerHTML;}).join('');
                }
        };
        
@@ -214,7 +285,7 @@ var window = this;
                toString: function(){
                        return '"' + this.nodeValue + '"';
                },
-               valueOf: function(){
+               get outerHTML(){
                        return this.nodeValue;
                }
        };
@@ -248,14 +319,14 @@ var window = this;
                toString: function(){
                        return "<" + this.tagName + (this.id ? "#" + this.id : "" ) + ">";
                },
-               valueOf: function(){
+               get outerHTML(){
                        var ret = "<" + this.tagName, attr = this.attributes;
                        
                        for ( var i in attr )
                                ret += " " + i + "='" + attr[i] + "'";
                                
                        if ( this.childNodes.length || this.nodeName == "SCRIPT" )
-                               ret += ">" + this.childNodes.valueOf() + 
+                               ret += ">" + this.childNodes.outerHTML + 
                                        "</" + this.tagName + ">";
                        else
                                ret += "/>";
@@ -273,7 +344,7 @@ var window = this;
                },
                
                get innerHTML(){
-                       return this.childNodes.valueOf();       
+                       return this.childNodes.outerHTML;       
                },
                set innerHTML(html){
                        html = html.replace(/<\/?([A-Z]+)/g, function(m){
@@ -406,12 +477,31 @@ var window = this;
                },
 
                getElementsByTagName: DOMDocument.prototype.getElementsByTagName,
-               addEventListener: function(){},
-               removeEventListener: function(){},
-               click: function(){},
-               submit: function(){},
-               focus: function(){},
-               blur: function(){},
+               
+               addEventListener: window.addEventListener,
+               removeEventListener: window.removeEventListener,
+               dispatchEvent: window.dispatchEvent,
+               
+               click: function(){
+                       var event = document.createEvent();
+                       event.initEvent("click");
+                       this.dispatchEvent(event);
+               },
+               submit: function(){
+                       var event = document.createEvent();
+                       event.initEvent("submit");
+                       this.dispatchEvent(event);
+               },
+               focus: function(){
+                       var event = document.createEvent();
+                       event.initEvent("focus");
+                       this.dispatchEvent(event);
+               },
+               blur: function(){
+                       var event = document.createEvent();
+                       event.initEvent("blur");
+                       this.dispatchEvent(event);
+               },
                get elements(){
                        return this.getElementsByTagName("*");
                },
@@ -468,16 +558,138 @@ var window = this;
        }
        
        // XMLHttpRequest
+       // Originally implemented by Yehuda Katz
 
-       window.XMLHttpRequest = function(){ };
+       window.XMLHttpRequest = function(){
+               this.headers = {};
+               this.responseHeaders = {};
+       };
        
        XMLHttpRequest.prototype = {
-               open: function(){ },
-               setRequestHeader: function(){ },
-               getResponseHeader: function(){ },
+               open: function(method, url, async, user, password){ 
+                       this.readyState = 1;
+                       if (async)
+                               this.async = true;
+                       this.method = method || "GET";
+                       this.url = url;
+                       this.onreadystatechange();
+               },
+               setRequestHeader: function(header, value){
+                       this.headers[header] = value;
+               },
+               getResponseHeader: function(header){ },
+               send: function(data){
+                       var self = this;
+                       
+                       function makeRequest(){
+                               var url = new java.net.URL(curLocation, self.url);
+                               
+                               if ( url.getProtocol() == "file" ) {
+                                       if ( self.method == "PUT" ) {
+                                               var out = new java.io.FileWriter( 
+                                                               new java.io.File( new java.net.URI( url.toString() ) ) ),
+                                                       text = new java.lang.String( data || "" );
+                                               
+                                               out.write( text, 0, text.length() );
+                                               out.flush();
+                                               out.close();
+                                       } else if ( self.method == "DELETE" ) {
+                                               var file = new java.io.File( new java.net.URI( url.toString() ) );
+                                               file["delete"]();
+                                       } else {
+                                               var connection = url.openConnection();
+                                               connection.connect();
+                                               handleResponse();
+                                       }
+                               } else { 
+                                       var connection = url.openConnection();
+                                       
+                                       connection.setRequestMethod( self.method );
+                                       
+                                       // Add headers to Java connection
+                                       for (var header in self.headers)
+                                               connection.addRequestProperty(header, self.headers[header]);
+                               
+                                       connection.connect();
+                                       
+                                       // Stick the response headers into responseHeaders
+                                       for (var i = 0; ; i++) { 
+                                               var headerName = connection.getHeaderFieldKey(i); 
+                                               var headerValue = connection.getHeaderField(i); 
+                                               if (!headerName && !headerValue) break; 
+                                               if (headerName)
+                                                       self.responseHeaders[headerName] = headerValue;
+                                       }
+                                       
+                                       handleResponse();
+                               }
+                               
+                               function handleResponse(){
+                                       self.readyState = 4;
+                                       self.status = parseInt(connection.responseCode) || undefined;
+                                       self.statusText = connection.responseMessage || "";
+                                       
+                                       var stream = new java.io.InputStreamReader(connection.getInputStream()),
+                                               buffer = new java.io.BufferedReader(stream), line;
+                                       
+                                       while ((line = buffer.readLine()) != null)
+                                               self.responseText += line;
+                                               
+                                       self.responseXML = null;
+                                       
+                                       if ( self.responseText.match(/^\s*</) ) {
+                                               try {
+                                                       self.responseXML = new DOMDocument(
+                                                               new java.io.ByteArrayInputStream(
+                                                                       (new java.lang.String(
+                                                                               self.responseText)).getBytes("UTF8")));
+                                               } catch(e) {}
+                                       }
+                               }
+                               
+                               self.onreadystatechange();
+                       }
+
+                       if (this.async)
+                               (new java.lang.Thread(new java.lang.Runnable({
+                                       run: makeRequest
+                               }))).start();
+                       else
+                               makeRequest();
+               },
+               abort: function(){},
+               onreadystatechange: function(){},
+               getResponseHeader: function(header){
+                       if (this.readyState < 3)
+                               throw new Error("INVALID_STATE_ERR");
+                       else {
+                               var returnedHeaders = [];
+                               for (var rHeader in this.responseHeaders) {
+                                       if (rHeader.match(new Regexp(header, "i")))
+                                               returnedHeaders.push(this.responseHeaders[rHeader]);
+                               }
+                       
+                               if (returnedHeaders.length)
+                                       return returnedHeaders.join(", ");
+                       }
+                       
+                       return null;
+               },
+               getAllResponseHeaders: function(header){
+                       if (this.readyState < 3)
+                               throw new Error("INVALID_STATE_ERR");
+                       else {
+                               var returnedHeaders = [];
+                               
+                               for (var header in this.responseHeaders)
+                                       returnedHeaders.push( header + ": " + this.responseHeaders[header] );
+                               
+                               return returnedHeaders.join("\r\n");
+                       }
+               },
+               async: true,
                readyState: 0,
                responseText: "",
-               responseXML: {},
                status: 0
        };
 })();