diff --git a/dom/public/idl/html/HTMLInputElement.idl b/dom/public/idl/html/HTMLInputElement.idl
index 5582068a7b8..e69de29bb2d 100644
--- a/dom/public/idl/html/HTMLInputElement.idl
+++ b/dom/public/idl/html/HTMLInputElement.idl
@@ -1,35 +0,0 @@
- interface HTMLInputElement : HTMLElement {
- /* IID: { 0xa6cf9093, 0x15b3, 0x11d2, \
- { 0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32 } } */
-
- attribute DOMString defaultValue;
- attribute boolean defaultChecked;
- readonly attribute HTMLFormElement form;
- attribute DOMString accept;
- attribute DOMString accessKey;
- attribute DOMString align;
- attribute DOMString alt;
- attribute boolean checked;
- attribute boolean disabled;
- attribute long maxLength;
- attribute DOMString name;
- attribute boolean readOnly;
- attribute DOMString size;
- attribute DOMString src;
- attribute long tabIndex;
- attribute DOMString type;
- attribute DOMString useMap;
- attribute DOMString value;
- void blur();
- void focus();
- void select();
- void click();
- };
-
-
- interface NSHTMLInputElement {
- /* IID: { 0x993d2efc, 0xa768, 0x11d3, \
- { 0xbc, 0xcd, 0x00, 0x60, 0xb0, 0xfc, 0x76, 0xbd } } */
-
- readonly attribute xpidl nsIControllers controllers;
- };
diff --git a/dom/public/nsDOMPropEnums.h b/dom/public/nsDOMPropEnums.h
index dbe5eefe9d3..dc641880a49 100644
--- a/dom/public/nsDOMPropEnums.h
+++ b/dom/public/nsDOMPropEnums.h
@@ -743,6 +743,10 @@ enum nsDOMProp {
NS_DOM_PROP_NSHTMLFORMELEMENT_ITEM,
NS_DOM_PROP_NSHTMLFORMELEMENT_NAMEDITEM,
NS_DOM_PROP_NSHTMLINPUTELEMENT_CONTROLLERS,
+ NS_DOM_PROP_NSHTMLINPUTELEMENT_SELECTIONEND,
+ NS_DOM_PROP_NSHTMLINPUTELEMENT_SELECTIONSTART,
+ NS_DOM_PROP_NSHTMLINPUTELEMENT_SETSELECTIONRANGE,
+ NS_DOM_PROP_NSHTMLINPUTELEMENT_TEXTLENGTH,
NS_DOM_PROP_NSHTMLOPTIONCOLLECTION_ITEM,
NS_DOM_PROP_NSHTMLOPTIONCOLLECTION_LENGTH,
NS_DOM_PROP_NSHTMLOPTIONCOLLECTION_NAMEDITEM,
diff --git a/dom/public/nsDOMPropNames.h b/dom/public/nsDOMPropNames.h
index c5d8c3b6fe2..032d34f74d5 100644
--- a/dom/public/nsDOMPropNames.h
+++ b/dom/public/nsDOMPropNames.h
@@ -742,6 +742,10 @@
"nshtmlformelement.item", \
"nshtmlformelement.nameditem", \
"nshtmlinputelement.controllers", \
+ "nshtmlinputelement.selectionend", \
+ "nshtmlinputelement.selectionstart", \
+ "nshtmlinputelement.setselectionrange", \
+ "nshtmlinputelement.textlength", \
"nshtmloptioncollection.item", \
"nshtmloptioncollection.length", \
"nshtmloptioncollection.nameditem", \
diff --git a/dom/src/html/nsJSHTMLInputElement.cpp b/dom/src/html/nsJSHTMLInputElement.cpp
index 8553d189769..e9c1f0a2885 100644
--- a/dom/src/html/nsJSHTMLInputElement.cpp
+++ b/dom/src/html/nsJSHTMLInputElement.cpp
@@ -70,7 +70,10 @@ enum HTMLInputElement_slots {
HTMLINPUTELEMENT_TYPE = -16,
HTMLINPUTELEMENT_USEMAP = -17,
HTMLINPUTELEMENT_VALUE = -18,
- NSHTMLINPUTELEMENT_CONTROLLERS = -19
+ NSHTMLINPUTELEMENT_CONTROLLERS = -19,
+ NSHTMLINPUTELEMENT_TEXTLENGTH = -20,
+ NSHTMLINPUTELEMENT_SELECTIONSTART = -21,
+ NSHTMLINPUTELEMENT_SELECTIONEND = -22
};
/***********************************************************************/
@@ -330,6 +333,63 @@ GetHTMLInputElementProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
}
break;
}
+ case NSHTMLINPUTELEMENT_TEXTLENGTH:
+ {
+ rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_NSHTMLINPUTELEMENT_TEXTLENGTH, PR_FALSE);
+ if (NS_SUCCEEDED(rv)) {
+ PRInt32 prop;
+ nsIDOMNSHTMLInputElement* b;
+ if (NS_OK == a->QueryInterface(kINSHTMLInputElementIID, (void **)&b)) {
+ rv = b->GetTextLength(&prop);
+ if(NS_SUCCEEDED(rv)) {
+ *vp = INT_TO_JSVAL(prop);
+ }
+ NS_RELEASE(b);
+ }
+ else {
+ rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
+ }
+ }
+ break;
+ }
+ case NSHTMLINPUTELEMENT_SELECTIONSTART:
+ {
+ rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_NSHTMLINPUTELEMENT_SELECTIONSTART, PR_FALSE);
+ if (NS_SUCCEEDED(rv)) {
+ PRInt32 prop;
+ nsIDOMNSHTMLInputElement* b;
+ if (NS_OK == a->QueryInterface(kINSHTMLInputElementIID, (void **)&b)) {
+ rv = b->GetSelectionStart(&prop);
+ if(NS_SUCCEEDED(rv)) {
+ *vp = INT_TO_JSVAL(prop);
+ }
+ NS_RELEASE(b);
+ }
+ else {
+ rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
+ }
+ }
+ break;
+ }
+ case NSHTMLINPUTELEMENT_SELECTIONEND:
+ {
+ rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_NSHTMLINPUTELEMENT_SELECTIONEND, PR_FALSE);
+ if (NS_SUCCEEDED(rv)) {
+ PRInt32 prop;
+ nsIDOMNSHTMLInputElement* b;
+ if (NS_OK == a->QueryInterface(kINSHTMLInputElementIID, (void **)&b)) {
+ rv = b->GetSelectionEnd(&prop);
+ if(NS_SUCCEEDED(rv)) {
+ *vp = INT_TO_JSVAL(prop);
+ }
+ NS_RELEASE(b);
+ }
+ else {
+ rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
+ }
+ }
+ break;
+ }
default:
return nsJSUtils::nsCallJSScriptObjectGetProperty(a, cx, obj, id, vp);
}
@@ -587,6 +647,58 @@ SetHTMLInputElementProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
}
break;
}
+ case NSHTMLINPUTELEMENT_SELECTIONSTART:
+ {
+ rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_NSHTMLINPUTELEMENT_SELECTIONSTART, PR_TRUE);
+ if (NS_SUCCEEDED(rv)) {
+ PRInt32 prop;
+ int32 temp;
+ if (JSVAL_IS_NUMBER(*vp) && JS_ValueToInt32(cx, *vp, &temp)) {
+ prop = (PRInt32)temp;
+ }
+ else {
+ rv = NS_ERROR_DOM_NOT_NUMBER_ERR;
+ }
+
+ nsIDOMNSHTMLInputElement *b;
+ if (NS_OK == a->QueryInterface(kINSHTMLInputElementIID, (void **)&b)) {
+ b->SetSelectionStart(prop);
+ NS_RELEASE(b);
+ }
+ else {
+
+ rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
+ }
+
+ }
+ break;
+ }
+ case NSHTMLINPUTELEMENT_SELECTIONEND:
+ {
+ rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_NSHTMLINPUTELEMENT_SELECTIONEND, PR_TRUE);
+ if (NS_SUCCEEDED(rv)) {
+ PRInt32 prop;
+ int32 temp;
+ if (JSVAL_IS_NUMBER(*vp) && JS_ValueToInt32(cx, *vp, &temp)) {
+ prop = (PRInt32)temp;
+ }
+ else {
+ rv = NS_ERROR_DOM_NOT_NUMBER_ERR;
+ }
+
+ nsIDOMNSHTMLInputElement *b;
+ if (NS_OK == a->QueryInterface(kINSHTMLInputElementIID, (void **)&b)) {
+ b->SetSelectionEnd(prop);
+ NS_RELEASE(b);
+ }
+ else {
+
+ rv = NS_ERROR_DOM_WRONG_TYPE_ERR;
+ }
+
+ }
+ break;
+ }
default:
return nsJSUtils::nsCallJSScriptObjectSetProperty(a, cx, obj, id, vp);
}
@@ -771,6 +883,58 @@ HTMLInputElementClick(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsv
}
+//
+// Native method SetSelectionRange
+//
+PR_STATIC_CALLBACK(JSBool)
+NSHTMLInputElementSetSelectionRange(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+ nsIDOMHTMLInputElement *privateThis = (nsIDOMHTMLInputElement*)nsJSUtils::nsGetNativeThis(cx, obj);
+ nsCOMPtr nativeThis;
+ nsresult result = NS_OK;
+ if (NS_OK != privateThis->QueryInterface(kINSHTMLInputElementIID, getter_AddRefs(nativeThis))) {
+ return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_WRONG_TYPE_ERR);
+ }
+
+ PRInt32 b0;
+ PRInt32 b1;
+ // If there's no private data, this must be the prototype, so ignore
+ if (!nativeThis) {
+ return JS_TRUE;
+ }
+
+ {
+ *rval = JSVAL_NULL;
+ nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj);
+ if (!secMan)
+ return PR_FALSE;
+ result = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_NSHTMLINPUTELEMENT_SETSELECTIONRANGE, PR_FALSE);
+ if (NS_FAILED(result)) {
+ return nsJSUtils::nsReportError(cx, obj, result);
+ }
+ if (argc < 2) {
+ return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR);
+ }
+
+ if (!JS_ValueToInt32(cx, argv[0], (int32 *)&b0)) {
+ return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_NOT_NUMBER_ERR);
+ }
+ if (!JS_ValueToInt32(cx, argv[1], (int32 *)&b1)) {
+ return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_NOT_NUMBER_ERR);
+ }
+
+ result = nativeThis->SetSelectionRange(b0, b1);
+ if (NS_FAILED(result)) {
+ return nsJSUtils::nsReportError(cx, obj, result);
+ }
+
+ *rval = JSVAL_VOID;
+ }
+
+ return JS_TRUE;
+}
+
+
/***********************************************************************/
//
// class for HTMLInputElement
@@ -815,6 +979,9 @@ static JSPropertySpec HTMLInputElementProperties[] =
{"useMap", HTMLINPUTELEMENT_USEMAP, JSPROP_ENUMERATE},
{"value", HTMLINPUTELEMENT_VALUE, JSPROP_ENUMERATE},
{"controllers", NSHTMLINPUTELEMENT_CONTROLLERS, JSPROP_ENUMERATE | JSPROP_READONLY},
+ {"textLength", NSHTMLINPUTELEMENT_TEXTLENGTH, JSPROP_ENUMERATE | JSPROP_READONLY},
+ {"selectionStart", NSHTMLINPUTELEMENT_SELECTIONSTART, JSPROP_ENUMERATE},
+ {"selectionEnd", NSHTMLINPUTELEMENT_SELECTIONEND, JSPROP_ENUMERATE},
{0}
};
@@ -828,6 +995,7 @@ static JSFunctionSpec HTMLInputElementMethods[] =
{"focus", HTMLInputElementFocus, 0},
{"select", HTMLInputElementSelect, 0},
{"click", HTMLInputElementClick, 0},
+ {"setSelectionRange", NSHTMLInputElementSetSelectionRange, 2},
{0}
};