<!DOCTYPE HTML>
<html>
<head>
  <title>Test for HTMLInputElement attributes reflection</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="application/javascript" src="../reflect.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<p id="display"></p>
<div id="content">
</div>
<pre id="test">
<script type="application/javascript">

/** Test for HTMLInputElement attributes reflection **/

// TODO: maybe make those reflections be tested against all input types.

function testWidthHeight(attr) {
  var element = document.createElement('input');
  is(element[attr], 0, attr + ' always returns 0 if not type=image');
  element.setAttribute(attr, '42');
  is(element[attr], 0, attr + ' always returns 0 if not type=image');
  is(element.getAttribute(attr), '42');
  element[attr] = 0;
  is(element.getAttribute(attr), '0', 'setting ' + attr + ' changes the content attribute');
  element[attr] = 12;
  is(element.getAttribute(attr), '12', 'setting ' + attr + ' changes the content attribute');

  element.removeAttribute(attr);
  is(element.getAttribute(attr), null);

  element = document.createElement('input');
  element.type = 'image';
  document.getElementById('content').appendChild(element);
  isnot(element[attr], 0, attr + ' represents the dimension of the element if type=image');

  element.setAttribute(attr, '42');
  isnot(element[attr], 0, attr + ' represents the dimension of the element if type=image');
  isnot(element[attr], 42, attr + ' represents the dimension of the element if type=image');
  is(element.getAttribute(attr), '42');
  element[attr] = 0;
  is(element.getAttribute(attr), '0', 'setting ' + attr + ' changes the content attribute');
  element[attr] = 12;
  is(element.getAttribute(attr), '12', 'setting ' + attr + ' changes the content attribute');

  element.removeAttribute(attr);
  is(element.getAttribute(attr), null);
}

// .accept
reflectString({
  element: document.createElement("input"),
  attribute: "accept",
  otherValues: [ "audio/*", "video/*", "image/*", "image/png",
                 "application/msword", "appplication/pdf" ],
});

// .alt
reflectString({
  element: document.createElement("input"),
  attribute: "alt",
});

// .autocomplete
reflectLimitedEnumerated({
  element: document.createElement("input"),
  attribute: "autocomplete",
  validValues: [ "on", "off" ],
  invalidValues: [ "", "default", "foo", "tulip" ],
});

// .autofocus
reflectBoolean({
  element: document.createElement("input"),
  attribute: "autofocus",
});

// .defaultChecked
reflectBoolean({
  element: document.createElement("input"),
  attribute: { idl: "defaultChecked", content: "checked" },
});

// .checked doesn't reflect a content attribute.

// .dirName
todo("dirName" in document.createElement("input"),
     "dirName isn't implemented yet");

// .disabled
reflectBoolean({
  element: document.createElement("input"),
  attribute: "disabled",
});

// TODO: form (HTMLFormElement)
// TODO: files (FileList)
// TODO: formAction (URL).  But note that we currently reflect it weirdly; see
// dom/html/test/test_bug607145.html

// .formEnctype
reflectLimitedEnumerated({
  element: document.createElement("input"),
  attribute: "formEnctype",
  validValues: [ "application/x-www-form-urlencoded", "multipart/form-data",
                 "text/plain" ],
  invalidValues: [ "", "foo", "tulip", "multipart/foo" ],
  defaultValue: { invalid: "application/x-www-form-urlencoded", missing: "" }
});

// .formMethod
reflectLimitedEnumerated({
  element: document.createElement("input"),
  attribute: "formMethod",
  validValues: [ "get", "post" ],
  invalidValues: [ "", "foo", "tulip" ],
  defaultValue: { invalid: "get", missing: "" }
});

// .formNoValidate
reflectBoolean({
  element: document.createElement("input"),
  attribute: "formNoValidate",
});

// .formTarget
reflectString({
  element: document.createElement("input"),
  attribute: "formTarget",
  otherValues: [ "_blank", "_self", "_parent", "_top" ],
});

// .height
testWidthHeight('height');

// .indeterminate doesn't reflect a content attribute.

// .inputmode
if (SpecialPowers.getBoolPref("dom.forms.inputmode")) {
reflectLimitedEnumerated({
  element: document.createElement("input"),
  attribute: "inputMode",
  validValues: [ "numeric", "digit", "uppercase", "lowercase", "titlecase", "autocapitalized", "auto" ],
  invalidValues: [ "", "foo", "tulip" ],
  defaultValue: "auto"
});
}

// TODO: list (HTMLElement)

// .max
reflectString({
  element: document.createElement('input'),
  attribute: 'max',
});

// .maxLength
reflectInt({
  element: document.createElement("input"),
  attribute: "maxLength",
  nonNegative: true,
});

// .min
reflectString({
  element: document.createElement('input'),
  attribute: 'min',
});

// .multiple
reflectBoolean({
  element: document.createElement("input"),
  attribute: "multiple",
});

// .name
reflectString({
  element: document.createElement("input"),
  attribute: "name",
  otherValues: [ "isindex", "_charset_" ],
});

// .pattern
reflectString({
  element: document.createElement("input"),
  attribute: "pattern",
  otherValues: [ "[0-9][A-Z]{3}" ],
});

// .placeholder
reflectString({
  element: document.createElement("input"),
  attribute: "placeholder",
  otherValues: [ "foo\nbar", "foo\rbar", "foo\r\nbar" ],
});

// .readOnly
reflectBoolean({
  element: document.createElement("input"),
  attribute: "readOnly",
});

// .required
reflectBoolean({
  element: document.createElement("input"),
  attribute: "required",
});

// .size
reflectUnsignedInt({
  element: document.createElement("input"),
  attribute: "size",
  nonZero: true,
  defaultValue: 20,
});

// .src (URL)
reflectURL({
  element: document.createElement('input'),
  attribute: 'src',
});

// .step
reflectString({
  element: document.createElement('input'),
  attribute: 'step',
});

// .type
reflectLimitedEnumerated({
  element: document.createElement("input"),
  attribute: "type",
  validValues: [ "hidden", "text", "search", "tel", "url", "email", "password",
                 "checkbox", "radio", "file", "submit", "image", "reset",
                 "button", "date", "time", "number", "range", "color", "month",
                 "week", "datetime-local" ],
  invalidValues: [ "this-is-probably-a-wrong-type", "", "tulip" ],
  defaultValue: "text"
});

// .defaultValue
reflectString({
  element: document.createElement("input"),
  attribute: { idl: "defaultValue", content: "value" },
  otherValues: [ "foo\nbar", "foo\rbar", "foo\r\nbar" ],
});

// .value doesn't reflect a content attribute.

// .valueAsDate
is("valueAsDate" in document.createElement("input"), true,
   "valueAsDate should be available");

// Deeper check will be done with bug 763305.
is('valueAsNumber' in document.createElement("input"), true,
   "valueAsNumber should be available");

// .selectedOption
todo("selectedOption" in document.createElement("input"),
     "selectedOption isn't implemented yet");

// .width
testWidthHeight('width');

// .willValidate doesn't reflect a content attribute.
// .validity doesn't reflect a content attribute.
// .validationMessage doesn't reflect a content attribute.
// .labels doesn't reflect a content attribute.

</script>
</pre>
</body>
</html>