A barebones implementation of getComputedStyle.
[jquery.git] / build / runtest / env.js
index 30cd8f1..564b022 100644 (file)
@@ -1,3 +1,9 @@
+/*
+ * Simulated browser environment for Rhino
+ *   By John Resig <http://ejohn.org/>
+ * Copyright 2007 John Resig, under the MIT License
+ */
+
 // The window Object
 var window = this;
 
@@ -12,7 +18,9 @@ var window = this;
        };
        
        window.__defineSetter__("location", function(url){
-               window.document = new DOMDocument(url);
+               window.document = new DOMDocument(
+                       new Packages.org.xml.sax.InputSource(\r                  new java.io.InputStreamReader(
+                               new java.io.FileInputStream(url))));
        });
        
        window.__defineGetter__("location", function(url){
@@ -97,16 +105,11 @@ var window = this;
                get body(){
                        return this.getElementsByTagName("body")[0];
                },
-               defaultView: {
-                       getComputedStyle: {
-                               getPropertyValue: function(){ }
-                       }
-               },
                get documentElement(){
                        return makeNode( this._dom.getDocumentElement() );
                },
                get ownerDocument(){
-                       return this;
+                       return null;
                },
                addEventListener: function(){},
                removeEventListener: function(){},
@@ -123,12 +126,20 @@ 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;
                                                }
-                                       }
+                                       };
                                }
                        };
                }
@@ -203,6 +214,16 @@ var window = this;
 
        window.DOMElement = function(elem){
                this._dom = elem;
+               this.style = {};
+               
+               // Load CSS info
+               var styles = (this.getAttribute("style") || "").split(/\s*;\s*/);
+               
+               for ( var i = 0; i < styles.length; i++ ) {
+                       var style = styles[i].split(/\s*:\s*/);
+                       if ( style.length == 2 )
+                               this.style[ style[0] ] = style[1];
+               }
        };
        
        DOMElement.prototype = extend( new DOMNode(), {
@@ -246,7 +267,7 @@ var window = this;
                        var nodes = this.ownerDocument.importNode(
                                new DOMDocument( new java.io.ByteArrayInputStream(
                                        (new java.lang.String("<wrap>" + html + "</wrap>"))
-                                               .getBytes())).documentElement, true).childNodes;
+                                               .getBytes("UTF8"))).documentElement, true).childNodes;
                                
                        while (this.firstChild)
                                this.removeChild( this.firstChild );
@@ -281,13 +302,43 @@ var window = this;
                offsetHeight: 0,
                offsetWidth: 0,
                
-               get disabled() { return !!this.getAttribute("disabled"); },
+               get disabled() {
+                       var val = this.getAttribute("disabled");
+                       return val != "false" && !!val;
+               },
                set disabled(val) { return this.setAttribute("disabled",val); },
                
-               get checked() { return !!this.getAttribute("checked"); },
+               get checked() {
+                       var val = this.getAttribute("checked");
+                       return val != "false" && !!val;
+               },
                set checked(val) { return this.setAttribute("checked",val); },
                
-               get selected() { return !!this.getAttribute("selected"); },
+               get selected() {
+                       if ( !this._selectDone ) {
+                               this._selectDone = true;
+                               
+                               if ( this.nodeName == "OPTION" && !this.parentNode.getAttribute("multiple") ) {
+                                       var opt = this.parentNode.getElementsByTagName("option");
+                                       
+                                       if ( this == opt[0] ) {
+                                               var select = true;
+                                               
+                                               for ( var i = 1; i < opt.length; i++ )
+                                                       if ( opt[i].selected ) {
+                                                               select = false;
+                                                               break;
+                                                       }
+                                                       
+                                               if ( select )
+                                                       this.selected = true;
+                                       }
+                               }
+                       }
+                       
+                       var val = this.getAttribute("selected");
+                       return val != "false" && !!val;
+               },
                set selected(val) { return this.setAttribute("selected",val); },
 
                get className() { return this.getAttribute("class") || ""; },
@@ -307,7 +358,7 @@ var window = this;
                
                getAttribute: function(name){
                        return this._dom.hasAttribute(name) ?
-                               this._dom.getAttribute(name) :
+                               new String( this._dom.getAttribute(name) ) :
                                null;
                },
                setAttribute: function(name,value){
@@ -343,7 +394,9 @@ var window = this;
                submit: function(){},
                focus: function(){},
                blur: function(){},
-               elements: []
+               get elements(){
+                       return this.getElementsByTagName("*");
+               }
        });
        
        // Helper method for extending one object with another