summaryrefslogtreecommitdiff
path: root/Base/res/html
diff options
context:
space:
mode:
authorTimothy Flynn <trflynn89@pm.me>2021-10-18 13:23:15 -0400
committerAndreas Kling <kling@serenityos.org>2021-10-18 23:33:56 +0200
commit72b409a2f7e63fe4f283788df8aba489278fcc2c (patch)
tree69268ca1737d4cc1746faa85e32dc6e06b8e4488 /Base/res/html
parent14349f058a8a8f3ca47e271aeb3bc53eb0047718 (diff)
downloadserenity-72b409a2f7e63fe4f283788df8aba489278fcc2c.zip
Base: Add a test page for the various element classList APIs
Diffstat (limited to 'Base/res/html')
-rw-r--r--Base/res/html/misc/class-list.html243
-rw-r--r--Base/res/html/misc/welcome.html1
2 files changed, 244 insertions, 0 deletions
diff --git a/Base/res/html/misc/class-list.html b/Base/res/html/misc/class-list.html
new file mode 100644
index 0000000000..be03164bd9
--- /dev/null
+++ b/Base/res/html/misc/class-list.html
@@ -0,0 +1,243 @@
+<head>
+ <style>
+ .pass, .fail {
+ height: 30px;
+ line-height: 30px;
+ color: white;
+ display: block;
+ border: 1px solid black;
+ margin: 3px;
+ padding: 3px;
+ }
+
+ .pass { background-color: green; }
+ .fail { background-color: red; }
+ </style>
+</head>
+<body>
+ <div id=test0></div>
+ <div id=test1></div>
+ <div id=test2></div>
+
+ <script>
+ let test0 = document.getElementById('test0');
+ let test1 = document.getElementById('test1');
+ let test2 = document.getElementById('test2');
+
+ const bindMethodsForTest = (method) => {
+ let failures = 0;
+
+ const pass = (message) => {
+ if (failures > 0)
+ return;
+
+ const span = document.createElement('span');
+ span.innerHTML = `Pass! ${method}`;
+ span.setAttribute('class', 'pass');
+ document.body.appendChild(span);
+
+ test0.className = '';
+ test1.className = '';
+ test2.className = '';
+ };
+
+ const fail = (message) => {
+ const span = document.createElement('span');
+ span.innerHTML = `Fail! ${method}: ${message}`;
+ span.setAttribute('class', 'fail');
+ document.body.appendChild(span);
+ ++failures;
+ };
+
+ const invalidTokenTest = () => {
+ const test = (args1, args2) => {
+ try {
+ test0.classList[method](...args1);
+ fail(`Expected classList.${method}(${args1}) to throw due to empty token`);
+ } catch (error) {
+ if (error.name !== 'SyntaxError')
+ fail(`Expected exception to be a DOMException of type SyntaxError but is "${error.name}"`);
+ }
+
+ try {
+ test0.classList[method](...args2);
+ fail(`Expected classList.${method}(${args2}) to throw due to token containing a space`);
+ } catch (error) {
+ if (error.name !== 'InvalidCharacterError')
+ fail(`Expected exception to be a DOMException of type InvalidCharacterError but is "${error.name}"`);
+ }
+ };
+
+ if (test0.classList[method].length === 2) {
+ test(['', 'foo'], ['foo bar', 'foobar']);
+ test(['foo', ''], ['foobar', 'foo bar']);
+ } else {
+ test([''], ['foo bar']);
+ }
+ };
+
+ return [pass, fail, invalidTokenTest];
+ };
+
+ (() => {
+ const [pass, fail] = bindMethodsForTest('contains');
+
+ test0.className = 'foo';
+ test1.className = 'foo bar';
+
+ if (!test0.classList.contains('foo'))
+ fail('test0 should contain class "foo"');
+ if (test0.classList.contains('bar'))
+ fail('test0 should not contain class "bar"');
+
+ if (!test1.classList.contains('foo'))
+ fail('test1 should contain class "foo"');
+ if (!test1.classList.contains('bar'))
+ fail('test1 should contain class "bar"');
+
+ pass();
+ })();
+
+ (() => {
+ const [pass, fail, invalidTokenTest] = bindMethodsForTest('add');
+ invalidTokenTest();
+
+ test0.classList.add('foo');
+ test1.classList.add('foo', 'bar');
+ test2.classList.add('foo', 'bar', 'foo');
+
+ if (test0.className !== 'foo')
+ fail(`test0 should have a class name of "foo" but has "${test0.className}"`)
+ if (test1.className !== 'foo bar')
+ fail(`test1 should have a class name of "foo bar" but has "${test1.className}"`)
+ if (test2.className !== 'foo bar')
+ fail(`test2 should have a class name of "foo bar" but has "${test2.className}"`)
+
+ pass();
+ })();
+
+ (() => {
+ const [pass, fail, invalidTokenTest] = bindMethodsForTest('remove');
+ invalidTokenTest();
+
+ test0.className = 'foo';
+ test1.className = 'foo bar';
+ test2.className = 'foo bar';
+
+ test0.classList.remove('foo');
+ test1.classList.remove('foo', 'bar');
+ test2.classList.remove('bar');
+
+ if (test0.className !== '')
+ fail(`test0 should have a class name of "" but has "${test0.className}"`)
+ if (test1.className !== '')
+ fail(`test1 should have a class name of "" but has "${test1.className}"`)
+ if (test2.className !== 'foo')
+ fail(`test2 should have a class name of "foo" but has "${test2.className}"`)
+
+ pass();
+ })();
+
+ (() => {
+ const [pass, fail, invalidTokenTest] = bindMethodsForTest('toggle');
+ invalidTokenTest();
+
+ if (!test0.classList.toggle('foo'))
+ fail('test0 should contain class "foo"');
+ if (!test0.classList.toggle('bar', true))
+ fail('test0 should contain class "bar"');
+ if (test0.classList.toggle('baz', false))
+ fail('test0 should not contain class "baz"');
+
+ if (test0.classList.toggle('foo'))
+ fail('test0 should not contain class "foo"');
+ if (!test0.classList.toggle('bar', true))
+ fail('test0 should contain class "bar"');
+ if (test0.classList.toggle('bar', false))
+ fail('test0 should not contain class "bar"');
+
+ pass();
+ })();
+
+ (() => {
+ const [pass, fail, invalidTokenTest] = bindMethodsForTest('replace');
+ invalidTokenTest();
+
+ if (test0.classList.replace('foo', 'bar'))
+ fail('test0 should not have contained class "bar"');
+ if (test0.className !== '')
+ fail(`test0 should have a class name of "" but has "${test0.className}"`)
+
+ test0.className = 'foo';
+
+ if (!test0.classList.replace('foo', 'bar'))
+ fail('test0 should have contained class "bar"');
+ if (test0.className !== 'bar')
+ fail(`test0 should have a class name of "bar" but has "${test0.className}"`)
+
+ test0.className = 'foo bar';
+
+ if (!test0.classList.replace('bar', 'baz'))
+ fail('test0 should have contained class "bar"');
+ if (test0.className !== 'foo baz')
+ fail(`test0 should have a class name of "foo baz" but has "${test0.className}"`)
+
+ test0.className = 'foo bar baz';
+
+ if (!test0.classList.replace('foo', 'baz'))
+ fail('test0 should have contained class "bar"');
+ if (test0.className !== 'baz bar')
+ fail(`test0 should have a class name of "baz bar" but has "${test0.className}"`)
+
+ test0.className = 'baz bar foo';
+
+ if (!test0.classList.replace('foo', 'baz'))
+ fail('test0 should have contained class "bar"');
+ if (test0.className !== 'baz bar')
+ fail(`test0 should have a class name of "baz bar" but has "${test0.className}"`)
+
+ test0.className = 'foo bar baz';
+
+ if (!test0.classList.replace('baz', 'baz'))
+ fail('test0 should have contained class "bar"');
+ if (test0.className !== 'foo bar baz')
+ fail(`test0 should have a class name of "foo bar baz" but has "${test0.className}"`)
+
+ pass();
+ })();
+
+ (() => {
+ const [pass, fail] = bindMethodsForTest('supports');
+
+ try {
+ test0.classList.supports('foo');
+ fail('Expected supports to throw due to no defined supported tokens');
+ } catch (error) {
+ if (error.name !== 'TypeError')
+ fail(`Expected exception to be a DOMException of type TypeError but is "${error.name}"`);
+ }
+
+ pass();
+ })();
+
+ (() => {
+ const [pass, fail] = bindMethodsForTest('value');
+
+ test0.classList.value = 'foo';
+
+ if (test0.className !== 'foo')
+ fail(`test0 should have a class name of "foo" but has "${test0.className}"`)
+ if (test0.classList.value !== 'foo')
+ fail(`test0 should have a class name of "foo" but has "${test0.className}"`)
+
+ test0.classList.value = 'foo bar';
+
+ if (test0.className !== 'foo bar')
+ fail(`test0 should have a class name of "foo bar" but has "${test0.className}"`)
+ if (test0.classList.value !== 'foo bar')
+ fail(`test0 should have a class name of "foo bar" but has "${test0.className}"`)
+
+ pass();
+ })();
+ </script>
+</body>
diff --git a/Base/res/html/misc/welcome.html b/Base/res/html/misc/welcome.html
index 135b63df75..51aa68eb68 100644
--- a/Base/res/html/misc/welcome.html
+++ b/Base/res/html/misc/welcome.html
@@ -111,6 +111,7 @@
<li><a href="clear-1.html">Float clearing</a></li>
<li><a href="overflow.html">Overflow</a></li>
<li><a href="attributes.html">Attributes</a></li>
+ <li><a href="class-list.html">Class List</a></li>
<li><h3>Features</h3></li>
<li><a href="css.html">Basic functionality</a></li>
<li><a href="colors.html">css colors</a></li>