X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=build%2Fruntest%2Fenv.js;h=23ffaedddbedbd06e4406623b7f5c09dad545ac8;hb=de71a046e619884292b122ddcf1401ad9932a5c7;hp=6483324627ba37c4282bd4b2d6eb35ee3df4e1d2;hpb=feb475d9b1f7fc0a1b6efa746e952893014ff771;p=jquery.git
diff --git a/build/runtest/env.js b/build/runtest/env.js
index 6483324..23ffaed 100644
--- a/build/runtest/env.js
+++ b/build/runtest/env.js
@@ -1,3 +1,9 @@
+/*
+ * Simulated browser environment for Rhino
+ * By John Resig
+ * Copyright 2007 John Resig, under the MIT License
+ */
+
// The window Object
var window = this;
@@ -12,7 +18,10 @@ var window = this;
};
window.__defineSetter__("location", function(url){
- window.document = new DOMDocument(url);
+ window.document = new DOMDocument(
+ new Packages.org.xml.sax.InputSource(
+ new java.io.InputStreamReader(
+ new java.io.FileInputStream(url))));
});
window.__defineGetter__("location", function(url){
@@ -71,17 +80,22 @@ var window = this;
this._dom = Packages.javax.xml.parsers.
DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse(file);
+
+ if ( !obj_nodes.containsKey( this._dom ) )
+ obj_nodes.put( this._dom, 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("*");
@@ -97,11 +111,6 @@ var window = this;
get body(){
return this.getElementsByTagName("body")[0];
},
- defaultView: {
- getComputedStyle: {
- getPropertyValue: function(){ }
- }
- },
get documentElement(){
return makeNode( this._dom.getDocumentElement() );
},
@@ -123,17 +132,29 @@ var window = this;
get defaultView(){
return {
- getComputedStyle: function(){
+ getComputedStyle: function(elem){
return {
- getPropertyValue: function(){
- return "";
+ getPropertyValue: function(prop){
+ prop = prop.replace(/\-(\w)/g,function(m,c){
+ return c.toUpperCase();
+ });
+ var val = elem.style[prop];
+
+ if ( prop == "opacity" && val == "" )
+ val = "1";
+
+ return val;
}
- }
+ };
}
};
}
};
+ function getDocument(node){
+ return obj_nodes.get(node);
+ }
+
// DOM NodeList
window.DOMNodeList = function(list){
@@ -177,10 +198,10 @@ var window = this;
return makeNode( this._dom.cloneNode(deep) );
},
get ownerDocument(){
- return document;
+ return getDocument( this._dom.ownerDocument );
},
get documentElement(){
- return document.documentElement;
+ return makeNode( this._dom.documentElement );
},
get parentNode() {
return makeNode( this._dom.getParentNode() );
@@ -203,7 +224,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*/);
@@ -253,10 +277,14 @@ var window = this;
return this.childNodes.valueOf();
},
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 + ""))
- .getBytes())).documentElement, true).childNodes;
+ .getBytes("UTF8"))).documentElement, true).childNodes;
while (this.firstChild)
this.removeChild( this.firstChild );
@@ -281,8 +309,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: {},
@@ -331,7 +358,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); },
@@ -385,6 +415,22 @@ var window = this;
blur: function(){},
get elements(){
return this.getElementsByTagName("*");
+ },
+ get contentWindow(){
+ return this.nodeName == "IFRAME" ? {
+ document: this.contentDocument
+ } : null;
+ },
+ get contentDocument(){
+ if ( this.nodeName == "IFRAME" ) {
+ if ( !this._doc )
+ this._doc = new DOMDocument(
+ new java.io.ByteArrayInputStream((new java.lang.String(
+ "
"))
+ .getBytes("UTF8")));
+ return this._doc;
+ } else
+ return null;
}
});
@@ -423,16 +469,107 @@ 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){
+ function makeRequest(){
+ var url = new java.net.URL(this.url),
+ connection = url.openConnection();
+
+ // Add headers to Java connection
+ for (var header in this.headers)
+ connection.addRequestProperty(header, this.headers[header]);
+
+ connection.connect();
+
+ // Stick the response headers into responseHeaders
+ for (i=0; ; i++) {
+ var headerName = connection.getHeaderFieldKey(i);
+ var headerValue = connection.getHeaderField(i);
+ if (!headerName && !headerValue) break;
+ if (headerName)
+ this.responseHeaders[headerName] = headerValue;
+ }
+
+ this.readyState = 4;
+ this.status = parseInt(connection.responseCode);
+ this.statusText = connection.responseMessage;
+
+ var stream = new java.io.InputStreamReader(
+ connection.getInputStream()),
+ buffer = new java.io.BufferedReader(stream),
+ line;
+
+ while ((line = buffer.readLine()) != null)
+ this.responseText += line;
+
+ try {
+ this.responseXML = new DOMDocument(this.responseText);
+ } catch(e) {
+ this.responseXML = null;
+ }
+
+ this.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
};
})();