r9606 - in helma-ng/trunk: modules/helma modules/helma/webapp src/org/helma/javascript
[email protected] Sun, 12 Apr 2009 01:51:18 +0200 (CEST)
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());
}