r9606 - in helma-ng/trunk: modules/helma modules/helma/webapp src/org/helma/javascript

[email protected]
Newsgroups gmane.comp.java.helma.cvs
Message-ID <20090411235118.3B2FD3D0D6@mia>
Author: hannes
Date: 2009-04-12 01:51:18 +0200 (Sun, 12 Apr 2009)
New Revision: 9606

Modified:
   helma-ng/trunk/modules/helma/util.js
   helma-ng/trunk/modules/helma/webapp/request.js
   helma-ng/trunk/modules/helma/webapp/response.js
   helma-ng/trunk/src/org/helma/javascript/StaticMethods.java
Log:
Make Object.defineProperty more conform to ES 3.1 and fix a bug with setter not working

- Throw TypeErrors for invalid property descriptors as required by ES 3.1
- Don't allow/set writable=false when either getter or setter is defined
- Rename descriptop properties for getter and setter to get and set, respectively

Details at http://dev.helma.org/trac/helma/changeset/9606

Modified: helma-ng/trunk/modules/helma/util.js
===================================================================
--- helma-ng/trunk/modules/helma/util.js	2009-04-11 15:03:18 UTC (rev 9605)
+++ helma-ng/trunk/modules/helma/util.js	2009-04-11 23:51:18 UTC (rev 9606)
@@ -16,7 +16,7 @@
  */
 function readOnlyPropertyDesc(obj, name, desc) {
     desc = desc || {};
-    desc.getter = function() { return obj[name]; }
+    desc.get = function() { return obj[name]; }
     return desc;
 }
 
@@ -35,7 +35,7 @@
  */
 function writeOnlyPropertyDesc(obj, name, desc) {
     desc = desc || {};
-    desc.setter = function(value) { obj[name] = value; }
+    desc.set = function(value) { obj[name] = value; }
     return desc;
 }
 
@@ -54,7 +54,7 @@
  */
 function readWritePropertyDesc(obj, name, desc) {
     desc = desc || {};
-    desc.getter = function() { return obj[name]; }
-    desc.setter = function(value) { obj[name] = value; }
+    desc.get = function() { return obj[name]; }
+    desc.set = function(value) { obj[name] = value; }
     return desc;
 }
\ No newline at end of file

Modified: helma-ng/trunk/modules/helma/webapp/request.js
===================================================================
--- helma-ng/trunk/modules/helma/webapp/request.js	2009-04-11 15:03:18 UTC (rev 9605)
+++ helma-ng/trunk/modules/helma/webapp/request.js	2009-04-11 23:51:18 UTC (rev 9606)
@@ -11,13 +11,13 @@
     var params, cookies, session, headers;
     var define = bindArguments(Object.defineProperty, this);
 
-    define("charset", readOnlyPropertyDesc(servletRequest, "characterEncoding"));
+    define("charset", readWritePropertyDesc(servletRequest, "characterEncoding"));
     define("port", readOnlyPropertyDesc(servletRequest, "port"));
     define("path", readOnlyPropertyDesc(servletRequest, "requestURI"));
     define("method", readOnlyPropertyDesc(servletRequest, "method"));
 
     define("params", {
-        getter: function() {
+        get: function() {
             if (!params)
                 params = new ScriptableMap(
                         new org.helma.util.ParameterMap(
@@ -27,7 +27,7 @@
     });
 
     define("cookies", {
-        getter: function() {
+        get: function() {
             if (!cookies) {
                 cookies = new ScriptableMap();
                 (servletRequest.getCookies() || []).map(function mapCookie(servletCookie) {
@@ -41,7 +41,7 @@
     });
 
     define("session", {
-        getter: function() {
+        get: function() {
             if (!session)
                 session = new Session(servletRequest);
             return session;
@@ -49,7 +49,7 @@
     });
 
     define("headers", {
-        getter: function() {
+        get: function() {
             if (!headers) {
                 headers = new ScriptableMap();
                 var names = servletRequest.getHeaderNames();
@@ -89,7 +89,7 @@
     }
 
     define("data", {
-        getter: function() {
+        get: function() {
             if (!data) {
                 data = new ScriptableMap();
                 getSession().setAttribute("helma", data);
@@ -99,7 +99,7 @@
     });
 
     define("isNew", {
-        getter: function() {
+        get: function() {
             getSession().isNew();
         }
     })
@@ -116,13 +116,13 @@
     }
 
     define("name", {
-        getter: function() {
+        get: function() {
             if (!name)
                 name = getCookie().getName();
             return name;
         },
 
-        setter: function(value) {
+        set: function(value) {
             if (value) {
                 name = value;
                 getCookie().setName(name);
@@ -132,13 +132,13 @@
     });
 
     define("value", {
-        getter: function() {
+        get: function() {
             if (!value)
                 value = getCookie().getValue();
             return value;
         },
 
-        setter: function(val) {
+        set: function(val) {
             if (val) {
                 value = val;
                 getCookie().setValue(value);
@@ -148,13 +148,13 @@
     });
 
     define("domain", {
-        getter: function() {
+        get: function() {
             if (!domain)
                 domain = getCookie().getDomain();
             return domain;
         },
 
-        setter: function(value) {
+        set: function(value) {
             if (value) {
                 domain = value;
                 getCookie().setDomain(domain);
@@ -164,13 +164,13 @@
     });
 
     define("path", {
-        getter: function() {
+        get: function() {
             if (!path)
                 path = getCookie().getPath();
             return path;
         },
 
-        setter: function(value) {
+        set: function(value) {
             if (value) {
                 path = value;
                 getCookie().setPath(path);
@@ -180,13 +180,13 @@
     });
 
     define("maxAge", {
-        getter: function() {
+        get: function() {
             if (!maxAge)
                 maxAge = getCookie().getMaxAge();
             return maxAge;
         },
 
-        setter: function(value) {
+        set: function(value) {
             if (value) {
                 maxAge = value;
                 getCookie().setMaxAge(maxAge);
@@ -196,13 +196,13 @@
     });
 
     define("comment", {
-        getter: function() {
+        get: function() {
             if (!comment)
                 comment = getCookie().getComment();
             return comment;
         },
 
-        setter: function(value) {
+        set: function(value) {
             if (value) {
                 comment = value;
                 getCookie().setComment(comment);
@@ -212,13 +212,13 @@
     });
 
     define("isSecure", {
-        getter: function() {
+        get: function() {
             if (!isSecure)
                 isSecure = getCookie().getSecure();
             return isSecure;
         },
 
-        setter: function(value) {
+        set: function(value) {
             if (value) {
                 isSecure = value;
                 getCookie().setSecure(isSecure);
@@ -228,13 +228,13 @@
     });
 
     define("version", {
-        getter: function() {
+        get: function() {
             if (!version)
                 version = getCookie().getVersion();
             return version;
         },
 
-        setter: function(value) {
+        set: function(value) {
             if (value) {
                 version = value;
                 getCookie().setVersion(version);
@@ -247,21 +247,21 @@
 var defineRequestProperty = bindArguments(Object.defineProperty, Request.prototype);
 
 defineRequestProperty("isGet", {
-    getter: function() { return this.method == "GET"; }
+    get: function() { return this.method == "GET"; }
 })
 
 defineRequestProperty("isPost", {
-    getter: function() { return this.method == "POST"; }
+    get: function() { return this.method == "POST"; }
 })
 
 defineRequestProperty("isPut", {
-    getter: function() { return this.method == "PUT"; }
+    get: function() { return this.method == "PUT"; }
 })
 
 defineRequestProperty("isDelete", {
-    getter: function() { return this.method == "DELETE"; }
+    get: function() { return this.method == "DELETE"; }
 })
 
 defineRequestProperty("isHead", {
-    getter: function() { return this.method == "HEAD"; }
+    get: function() { return this.method == "HEAD"; }
 })

Modified: helma-ng/trunk/modules/helma/webapp/response.js
===================================================================
--- helma-ng/trunk/modules/helma/webapp/response.js	2009-04-11 15:03:18 UTC (rev 9605)
+++ helma-ng/trunk/modules/helma/webapp/response.js	2009-04-11 23:51:18 UTC (rev 9606)
@@ -7,8 +7,8 @@
 function Response(servletResponse) {
 
     var writer;
+    var status = 200;
 
-
     Object.defineProperty(this, 'write', {
         value: function write() {
             writer = writer || servletResponse.getWriter();
@@ -87,12 +87,31 @@
     });
 
     Object.defineProperty(this, 'charset', {
-        getter: function() {
+        get: function() {
             return servletResponse.getCharacterEncoding();
         },
-        setter: function(charset) {
+        set: function(charset) {
             servletResponse.setCharacterEncoding(charset);
         }
     });
 
+    Object.defineProperty(this, 'contentType', {
+        get: function() {
+            return servletResponse.getContentType();
+        },
+        set: function(contentType) {
+            servletResponse.setContentType(contentType);
+        }
+    });
+
+    Object.defineProperty(this, 'status', {
+        get: function() {
+            return status;
+        },
+        set: function(s) {
+            status = s;
+            servletResponse.setStatus(s);
+        }
+    });
+
 }

Modified: helma-ng/trunk/src/org/helma/javascript/StaticMethods.java
===================================================================
--- helma-ng/trunk/src/org/helma/javascript/StaticMethods.java	2009-04-11 15:03:18 UTC (rev 9605)
+++ helma-ng/trunk/src/org/helma/javascript/StaticMethods.java	2009-04-11 23:51:18 UTC (rev 9606)
@@ -48,13 +48,16 @@
      */
     public static void defineProperty(Context cx, Scriptable thisObj, Object[] args, Function funObj)
             throws JavaScriptException {
-        ScriptUtils.checkArguments(args, 3, 3);
-        ScriptableObject obj = ScriptUtils.getScriptableArgument(args, 0, false);
-        String propname = ScriptUtils.getStringArgument(args, 1, false);
-        Scriptable desc = ScriptUtils.getScriptableArgument(args, 2, false);
-
-        PropertyDescriptor propDesc = new PropertyDescriptor(desc);
-        propDesc.defineProperty(obj, propname);
+        try {
+            ScriptUtils.checkArguments(args, 3, 3);
+            ScriptableObject obj = ScriptUtils.getScriptableArgument(args, 0, false);
+            String propname = ScriptUtils.getStringArgument(args, 1, false);
+            Scriptable desc = ScriptUtils.getScriptableArgument(args, 2, false);
+            PropertyDescriptor propDesc = new PropertyDescriptor(desc);
+            propDesc.defineProperty(obj, propname);
+        } catch (IllegalArgumentException illarg) {
+            throw ScriptRuntime.typeError(illarg.getMessage());
+        }
     }
 
 
@@ -64,14 +67,15 @@
         public final boolean enumerable, configurable, writable;
 
         public PropertyDescriptor(Scriptable desc) {
-            value = getDescriptorValue("value", desc);
-            getter = (Callable) getDescriptorValue("getter", desc);
-            setter = (Callable) getDescriptorValue("setter", desc);
             enumerable = ScriptRuntime.toBoolean(getDescriptorValue("enumerable", desc));
             configurable = ScriptRuntime.toBoolean(getDescriptorValue("configurable", desc));
-            writable = ScriptRuntime.toBoolean(getDescriptorValue("writable", desc));
-            if (value != null && (getter != null || setter != null)) {
-                throw new IllegalArgumentException("Only one of value or getter/setter must be defined");
+            value = getDescriptorValue("value", desc);
+            Object writeableObj = getDescriptorValue("writable", desc);
+            writable = ScriptRuntime.toBoolean(writeableObj);
+            getter = (Callable) getDescriptorValue("get", desc);
+            setter = (Callable) getDescriptorValue("set", desc);
+            if ((value != null || writeableObj != null) && (getter != null || setter != null)) {
+                throw ScriptRuntime.typeError("Mixed value/writable with get/set in PropertyDescriptor");
             }
         }
 
@@ -86,8 +90,10 @@
         public int getAttributes() {
             int attr = 0;
             if (!enumerable) attr |= ScriptableObject.DONTENUM;
-            if (!writable) attr |= ScriptableObject.READONLY;
             if (!configurable) attr |= ScriptableObject.PERMANENT;
+            if (getter == null && setter == null) {
+                if (!writable) attr |= ScriptableObject.READONLY;
+            }
             return attr;
         }
 
@@ -100,7 +106,7 @@
                     obj.setGetterOrSetter(propname, 0, setter, true);
                 }
                 obj.setAttributes(propname, getAttributes());
-            } else {
+            } else if (value != null) {
                 obj.defineProperty(propname, value, getAttributes());
             }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.