summaryrefslogtreecommitdiffstats
path: root/editor/libeditor/tests/test_password_unmask_API.html
diff options
context:
space:
mode:
Diffstat (limited to 'editor/libeditor/tests/test_password_unmask_API.html')
-rw-r--r--editor/libeditor/tests/test_password_unmask_API.html318
1 files changed, 318 insertions, 0 deletions
diff --git a/editor/libeditor/tests/test_password_unmask_API.html b/editor/libeditor/tests/test_password_unmask_API.html
new file mode 100644
index 0000000000..0fc7ef8194
--- /dev/null
+++ b/editor/libeditor/tests/test_password_unmask_API.html
@@ -0,0 +1,318 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Test for unmasking password API</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<input type="text">
+<input type="password">
+<script class="testbody" type="application/javascript">
+SimpleTest.waitForExplicitFinish();
+SimpleTest.waitForFocus(() => {
+ let input = document.getElementsByTagName("input")[0];
+ let password = document.getElementsByTagName("input")[1];
+
+ let editor, passwordEditor;
+ function updateEditors() {
+ editor = SpecialPowers.wrap(input).editor;
+ passwordEditor = SpecialPowers.wrap(password).editor;
+ }
+
+ try {
+ updateEditors();
+ editor.mask();
+ ok(false,
+ `nsIEditor.mask() should throw exception when called for <input type="text"> before nsIEditor.unmask()`);
+ } catch (e) {
+ ok(true,
+ `nsIEditor.mask() should throw exception when called for <input type="text"> before nsIEditor.unmask() ${e}`);
+ }
+
+ try {
+ updateEditors();
+ editor.unmask();
+ ok(false,
+ `nsIEditor.unmask() should throw exception when called for <input type="text">`);
+ } catch (e) {
+ ok(true,
+ `nsIEditor.unmask() should throw exception when called for <input type="text"> ${e}`);
+ }
+
+ try {
+ updateEditors();
+ editor.unmask(0);
+ ok(false,
+ `nsIEditor.unmask(0) should throw exception when called for <input type="text">`);
+ } catch (e) {
+ ok(true,
+ `nsIEditor.unmask(0) should throw exception when called for <input type="text"> ${e}`);
+ }
+
+ input.value = "abcdef";
+ try {
+ updateEditors();
+ editor.unmask();
+ ok(false,
+ `nsIEditor.unmask() should throw exception when called for <input type="text" value="abcdef">`);
+ } catch (e) {
+ ok(true,
+ `nsIEditor.unmask() should throw exception when called for <input type="text" value="abcdef"> ${e}`);
+ }
+
+ try {
+ updateEditors();
+ editor.mask();
+ ok(false,
+ `nsIEditor.mask() should throw exception when called for <input type="text" value="abcdef"> after nsIEditor.unmask()`);
+ } catch (e) {
+ ok(true,
+ `nsIEditor.mask() should throw exception when called for <input type="text" value="abcdef"> after nsIEditor.unmask() ${e}`);
+ }
+
+ try {
+ updateEditors();
+ passwordEditor.mask();
+ ok(true,
+ `nsIEditor.mask() shouldn't throw exception when called for <input type="password"> before nsIEditor.unmask()`);
+ ok(passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be true after nsIEditor.mask() for <input type="password"> before nsIEditor.unmask()`);
+ } catch (e) {
+ ok(false,
+ `nsIEditor.mask() shouldn't throw exception when called for <input type="password"> before nsIEditor.unmask() ${e}`);
+ }
+
+ try {
+ updateEditors();
+ editor.unmask(5);
+ ok(false,
+ `nsIEditor.unmask(5) should throw exception when called for <input type="password" value="">`);
+ } catch (e) {
+ ok(true,
+ `nsIEditor.unmask(5) should throw exception when called for <input type="password" value=""> ${e}`);
+ ok(passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should keep true (<input type="password">)`);
+ }
+
+ try {
+ updateEditors();
+ passwordEditor.unmask();
+ ok(true,
+ `nsIEditor.unmask() shouldn't throw exception when called for <input type="password">`);
+ ok(!passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be false after nsIEditor.unmask() for <input type="password">)`);
+ is(passwordEditor.unmaskedStart, 0,
+ `nsIEditor.unmaskedStart should be 0 after nsIEditor.unmask() for <input type="password">`);
+ is(passwordEditor.unmaskedEnd, 0,
+ `nsIEditor.unmaskedEnd should be 0 after nsIEditor.unmask() for <input type="password">`);
+ } catch (e) {
+ ok(false,
+ `nsIEditor.unmask() shouldn't throw exception when called for <input type="password"> ${e}`);
+ }
+
+ password.value = "abcdef";
+ try {
+ updateEditors();
+ passwordEditor.unmask();
+ ok(true,
+ `nsIEditor.unmask() shouldn't throw exception when called for <input type="password" value="abcdef">)`);
+ ok(!passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be false after nsIEditor.unmask() for <input type="password" value="abcdef">`);
+ is(passwordEditor.unmaskedStart, 0,
+ `nsIEditor.unmaskedStart should be 0 after nsIEditor.unmask() for <input type="password" value="abcdef">`);
+ is(passwordEditor.unmaskedEnd, 6,
+ `nsIEditor.unmaskedEnd should be 0 after nsIEditor.unmask() for <input type="password" value="abcdef">`);
+ } catch (e) {
+ ok(false,
+ `nsIEditor.unmask() shouldn't throw exception when called for <input type="password" value="abcdef"> ${e}`);
+ }
+
+ try {
+ updateEditors();
+ passwordEditor.mask();
+ ok(true,
+ `nsIEditor.mask() shouldn't throw exception when called for <input type="password" value="abcdef">`);
+ ok(passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be true after nsIEditor.mask() for <input type="password" value="abcdef">`);
+ } catch (e) {
+ ok(false,
+ `nsIEditor.mask() shouldn't throw exception when called for <input type="password" value="abcdef"> ${e}`);
+ }
+
+ try {
+ updateEditors();
+ passwordEditor.unmask(0, 100, 1000);
+ ok(true,
+ `nsIEditor.unmask(0, 100, 1000) shouldn't throw exception when called for <input type="password" value="abcdef">`);
+ ok(passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be true after nsIEditor.unmask(0, 100, 1000) for <input type="password" value="abcdef">`);
+ is(passwordEditor.unmaskedStart, 0,
+ `nsIEditor.unmaskedStart should be 0 after nsIEditor.unmask(0, 100, 1000) for <input type="password" value="abcdef">`);
+ is(passwordEditor.unmaskedEnd, 6,
+ `nsIEditor.unmaskedEnd should be 6 after nsIEditor.unmask(0, 100, 1000) for <input type="password" value="abcdef">`);
+ } catch (e) {
+ ok(false,
+ `nsIEditor.unmask(0, 100, 1000) shouldn't throw exception when called for <input type="password" value="abcdef"> ${e}`);
+ }
+
+ try {
+ updateEditors();
+ passwordEditor.unmask(3);
+ ok(true,
+ `nsIEditor.unmask(3) shouldn't throw exception when called for <input type="password" value="abcdef">`);
+ ok(!passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be false after nsIEditor.unmask(3) for <input type="password" value="abcdef">`);
+ is(passwordEditor.unmaskedStart, 3,
+ `nsIEditor.unmaskedStart should be 3 after nsIEditor.unmask(3) for <input type="password" value="abcdef">`);
+ is(passwordEditor.unmaskedEnd, 6,
+ `nsIEditor.unmaskedEnd should be 6 after nsIEditor.unmask(3) for <input type="password" value="abcdef">`);
+ } catch (e) {
+ ok(false,
+ `nsIEditor.unmask(3) shouldn't throw exception when called for <input type="password" value="abcdef"> ${e}`);
+ }
+
+ try {
+ updateEditors();
+ passwordEditor.unmask(0);
+ password.style.fontSize = "32px"; // reframe the `<input>` element
+ password.getBoundingClientRect(); // flush pending reflow if there is
+ // Then, new `TextEditor` should keep unmasked range.
+ passwordEditor = SpecialPowers.wrap(password).editor;
+ ok(!passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be false after the password field reframed`);
+ is(passwordEditor.unmaskedStart, 0,
+ `nsIEditor.unmaskedStart should be 0 after the password field reframed`);
+ is(passwordEditor.unmaskedEnd, 6,
+ `nsIEditor.unmaskedEnd should be 6 after the password field reframed`);
+ } catch (e) {
+ ok(false, `Shouldn't throw exception while testing unmasked range after reframing ${e}`);
+ } finally {
+ password.style.fontSize = "";
+ password.getBoundingClientRect();
+ }
+
+ try {
+ updateEditors();
+ passwordEditor.unmask(0);
+ password.style.display = "none"; // Hide the password field temporarily
+ password.getBoundingClientRect();
+ password.style.display = "block"; // And show it again
+ password.getBoundingClientRect();
+ updateEditors();
+ // Then, new `TextEditor` should keep unmasked range.
+ ok(!passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be false after the password field was temporarily hidden`);
+ is(passwordEditor.unmaskedStart, 0,
+ `nsIEditor.unmaskedStart should be 0 after the password field was temporarily hidden`);
+ is(passwordEditor.unmaskedEnd, 6,
+ `nsIEditor.unmaskedEnd should be 6 after the password field was temporarily hidden`);
+ } catch (e) {
+ ok(false, `Shouldn't throw exception while testing unmasked range after temporarily hiding the password field ${e}`);
+ } finally {
+ password.style.display = "";
+ password.getBoundingClientRect();
+ passwordEditor = SpecialPowers.wrap(password).editor;
+ }
+
+ try {
+ updateEditors();
+ passwordEditor.unmask(0);
+ password.style.display = "none"; // Hide the password field temporarily
+ password.getBoundingClientRect();
+ password.value = "ghijkl"; // And modify the value
+ password.style.display = "block"; // And show it again
+ password.getBoundingClientRect();
+ // Then, new `TextEditor` shouldn't keep unmasked range due to the value change.
+ updateEditors();
+ ok(passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be true after the password field was temporarily hidden and changed its value`);
+ is(passwordEditor.unmaskedStart, 0,
+ `nsIEditor.unmaskedStart should be 0 after the password field was temporarily hidden and changed its value`);
+ is(passwordEditor.unmaskedEnd, 0,
+ `nsIEditor.unmaskedEnd should be 0 after the password field was temporarily hidden and changed its value`);
+ } catch (e) {
+ ok(false, `Shouldn't throw exception while testing unmasked range after temporarily hiding the password field and changing the value ${e}`);
+ } finally {
+ password.style.display = "";
+ password.getBoundingClientRect();
+ password.value = "abcdef";
+ passwordEditor = SpecialPowers.wrap(password).editor;
+ }
+
+ try {
+ updateEditors();
+ passwordEditor.unmask(0);
+ password.style.display = "none"; // Hide the password field temporarily
+ password.getBoundingClientRect();
+ password.value = "abcdef"; // And overwrite the value with same value
+ password.style.display = "block"; // And show it again
+ password.getBoundingClientRect();
+ // Then, new `TextEditor` shouldn't keep unmasked range due to setting the value.
+ updateEditors();
+ ok(passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be true after the password field was temporarily hidden and changed its value`);
+ is(passwordEditor.unmaskedStart, 0,
+ `nsIEditor.unmaskedStart should be 0 after the password field was temporarily hidden and changed its value`);
+ is(passwordEditor.unmaskedEnd, 0,
+ `nsIEditor.unmaskedEnd should be 0 after the password field was temporarily hidden and changed its value`);
+ } catch (e) {
+ ok(false, `Shouldn't throw exception while testing unmasked range after temporarily hiding the password field and changing the value ${e}`);
+ } finally {
+ password.style.display = "";
+ password.getBoundingClientRect();
+ password.value = "abcdef";
+ passwordEditor = SpecialPowers.wrap(password).editor;
+ }
+
+ try {
+ updateEditors();
+ passwordEditor.unmask(0, 6, 10000);
+ password.style.display = "none"; // Hide the password field temporarily
+ password.getBoundingClientRect();
+ password.style.display = "block"; // And show it again
+ password.getBoundingClientRect();
+ updateEditors();
+ // Then, new `TextEditor` should mask all characters since nobody can mask it with the timer.
+ ok(passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be true after the password field was temporarily hidden (if auto-masking timer was set)`);
+ is(passwordEditor.unmaskedStart, 0,
+ `nsIEditor.unmaskedStart should be 0 after the password field was temporarily hidden (if auto-masking timer was set)`);
+ is(passwordEditor.unmaskedEnd, 0,
+ `nsIEditor.unmaskedEnd should be 0 after the password field was temporarily hidden (if auto-masking timer was set)`);
+ } catch (e) {
+ ok(false, `Shouldn't throw exception while testing unmasked range after temporarily hiding the password field whose auto-masking timer was set ${e}`);
+ } finally {
+ password.style.display = "";
+ password.getBoundingClientRect();
+ passwordEditor = SpecialPowers.wrap(password).editor;
+ }
+
+ try {
+ updateEditors();
+ passwordEditor.unmask(0);
+ password.type = "text";
+ password.getBoundingClientRect();
+ password.type = "password";
+ password.getBoundingClientRect();
+ updateEditors();
+ // Then, new `TextEditor` should mask all characters after `type` attribute was changed.
+ ok(passwordEditor.autoMaskingEnabled,
+ `nsIEditor.autoMaskingEnabled should be true after "type" attribute of the password field was changed`);
+ is(passwordEditor.unmaskedStart, 0,
+ `nsIEditor.unmaskedStart should be 0 after "type" attribute of the password field was changed`);
+ is(passwordEditor.unmaskedEnd, 0,
+ `nsIEditor.unmaskedEnd should be 0 after "type" attribute of the password field was changed`);
+ } catch (e) {
+ ok(false, `Shouldn't throw exception while testing unmasked range after "type" attribute of the password field was changed ${e}`);
+ } finally {
+ password.type = "password";
+ password.getBoundingClientRect();
+ passwordEditor = SpecialPowers.wrap(password).editor;
+ }
+
+ SimpleTest.finish();
+});
+</script>
+</body>
+</html>