X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=build%2Fruntest%2Fenv.js;h=e15a2263184475b42f0f6d3b3d4ee23807a6d938;hb=d38ee78db9b8a8a89b985928c1d23543cb2ff1cd;hp=e1528429336df4b569977fba49838fc03f87e6a8;hpb=69ef5fac9e84623c1260cf4d548c1034ac7e45a8;p=jquery.git diff --git a/build/runtest/env.js b/build/runtest/env.js index e152842..e15a226 100644 --- a/build/runtest/env.js +++ b/build/runtest/env.js @@ -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( 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 @@ -86,13 +144,15 @@ var window = this; DOMDocument.prototype = { createTextNode: function(text){ - return makeNode( this._dom.createTextNode(text) ); + return makeNode( this._dom.createTextNode( + text.replace(/&/g, "&").replace(//g, ">")) ); }, createElement: function(name){ - return makeNode( this._dom.createElement(name) ); + return makeNode( this._dom.createElement(name.toLowerCase()) ); }, getElementsByTagName: function(name){ - return new DOMNodeList( this._dom.getElementsByTagName(name) ); + return new DOMNodeList( this._dom.getElementsByTagName( + name.toLowerCase()) ); }, getElementById: function(id){ var elems = this._dom.getElementsByTagName("*"); @@ -114,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"; }, @@ -126,6 +187,9 @@ var window = this; return "Document" + (typeof this._file == "string" ? ": " + this._file : ""); }, + get innerHTML(){ + return this.documentElement.outerHTML; + }, get defaultView(){ return { @@ -145,6 +209,15 @@ var window = this; }; } }; + }, + + createEvent: function(){ + return { + type: "", + initEvent: function(type){ + this.type = type; + } + }; } }; @@ -169,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(''); } }; @@ -212,7 +285,7 @@ var window = this; toString: function(){ return '"' + this.nodeValue + '"'; }, - valueOf: function(){ + get outerHTML(){ return this.nodeValue; } }; @@ -221,7 +294,10 @@ var window = this; window.DOMElement = function(elem){ this._dom = elem; - this.style = {}; + this.style = { + get opacity(){ return this._opacity; }, + set opacity(val){ this._opacity = val + ""; } + }; // Load CSS info var styles = (this.getAttribute("style") || "").split(/\s*;\s*/); @@ -243,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 + ""; else ret += "/>"; @@ -268,9 +344,13 @@ var window = this; }, get innerHTML(){ - return this.childNodes.valueOf(); + return this.childNodes.outerHTML; }, set innerHTML(html){ + html = html.replace(/<\/?([A-Z]+)/g, function(m){ + return m.toLowerCase(); + }); + var nodes = this.ownerDocument.importNode( new DOMDocument( new java.io.ByteArrayInputStream( (new java.lang.String("" + html + "")) @@ -299,8 +379,7 @@ var window = this; set textContent(text){ while (this.firstChild) this.removeChild( this.firstChild ); - this.appendChild( document.createTextNode(text) ); - this.innerHTML = document.createTextNode(text).nodeValue; + this.appendChild( this.ownerDocument.createTextNode(text)); }, style: {}, @@ -349,7 +428,10 @@ var window = this; set selected(val) { return this.setAttribute("selected",val); }, get className() { return this.getAttribute("class") || ""; }, - set className(val) { return this.setAttribute("class",val); }, + set className(val) { + return this.setAttribute("class", + val.replace(/(^\s*|\s*$)/g,"")); + }, get type() { return this.getAttribute("type") || ""; }, set type(val) { return this.setAttribute("type",val); }, @@ -395,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("*"); }, @@ -457,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*