@@ -593,277 +593,6 @@ pub const Element = struct {
593593// -----
594594
595595const testing = @import ("../../testing.zig" );
596- test "Browser.DOM.Element" {
597- var runner = try testing .jsRunner (testing .tracking_allocator , .{});
598- defer runner .deinit ();
599-
600- try runner .testCases (&.{
601- .{ "let g = document.getElementById('content')" , "undefined" },
602- .{ "g.namespaceURI" , "http://www.w3.org/1999/xhtml" },
603- .{ "g.prefix" , "null" },
604- .{ "g.localName" , "div" },
605- .{ "g.tagName" , "DIV" },
606- }, .{});
607-
608- try runner .testCases (&.{
609- .{ "let gs = document.getElementById('content')" , "undefined" },
610- .{ "gs.id" , "content" },
611- .{ "gs.id = 'foo'" , "foo" },
612- .{ "gs.id" , "foo" },
613- .{ "gs.id = 'content'" , "content" },
614- .{ "gs.className" , "" },
615- .{ "let gs2 = document.getElementById('para-empty')" , "undefined" },
616- .{ "gs2.className" , "ok empty" },
617- .{ "gs2.className = 'foo bar baz'" , "foo bar baz" },
618- .{ "gs2.className" , "foo bar baz" },
619- .{ "gs2.className = 'ok empty'" , "ok empty" },
620- .{ "let cl = gs2.classList" , "undefined" },
621- .{ "cl.length" , "2" },
622- }, .{});
623-
624- try runner .testCases (&.{
625- .{ "const el2 = document.createElement('div');" , "undefined" },
626- .{ "el2.id = 'closest'; el2.className = 'ok';" , "ok" },
627- .{ "el2.closest('#closest')" , "[object HTMLDivElement]" },
628- .{ "el2.closest('.ok')" , "[object HTMLDivElement]" },
629- .{ "el2.closest('#9000')" , "null" },
630- .{ "el2.closest('.notok')" , "null" },
631-
632- .{ "const sp = document.createElement('span');" , "undefined" },
633- .{ "el2.appendChild(sp);" , "[object HTMLSpanElement]" },
634- .{ "sp.closest('#closest')" , "[object HTMLDivElement]" },
635- .{ "sp.closest('#9000')" , "null" },
636- }, .{});
637-
638- try runner .testCases (&.{
639- .{ "let a = document.getElementById('content')" , "undefined" },
640- .{ "a.hasAttributes()" , "true" },
641- .{ "a.attributes.length" , "1" },
642- .{ "a.getAttributeNames()" , "id" },
643- .{ "a.getAttribute('id')" , "content" },
644- .{ "a.attributes['id'].value" , "content" },
645- .{
646- \\ let x = '';
647- \\ for (const attr of a.attributes) {
648- \\ x += attr.name + '=' + attr.value;
649- \\ }
650- \\ x;
651- ,
652- "id=content" ,
653- },
654-
655- .{ "a.hasAttribute('foo')" , "false" },
656- .{ "a.getAttribute('foo')" , "null" },
657-
658- .{ "a.setAttribute('foo', 'bar')" , "undefined" },
659- .{ "a.hasAttribute('foo')" , "true" },
660- .{ "a.getAttribute('foo')" , "bar" },
661- .{ "a.getAttributeNames()" , "id,foo" },
662- .{ " try { a.setAttribute('.foo', 'invalid') } catch (e) { e }" , "Error: InvalidCharacterError" },
663-
664- .{ "a.setAttribute('foo', 'baz')" , "undefined" },
665- .{ "a.hasAttribute('foo')" , "true" },
666- .{ "a.getAttribute('foo')" , "baz" },
667-
668- .{ "a.removeAttribute('foo')" , "undefined" },
669- .{ "a.hasAttribute('foo')" , "false" },
670- .{ "a.getAttribute('foo')" , "null" },
671- }, .{});
672-
673- try runner .testCases (&.{
674- .{ "let b = document.getElementById('content')" , "undefined" },
675- .{ "b.toggleAttribute('foo')" , "true" },
676- .{ "b.hasAttribute('foo')" , "true" },
677- .{ "b.getAttribute('foo')" , "" },
678-
679- .{ "b.toggleAttribute('foo')" , "false" },
680- .{ "b.hasAttribute('foo')" , "false" },
681- }, .{});
682-
683- try runner .testCases (&.{
684- .{ "let c = document.getElementById('content')" , "undefined" },
685- .{ "c.children.length" , "3" },
686- .{ "c.firstElementChild.nodeName" , "A" },
687- .{ "c.lastElementChild.nodeName" , "P" },
688- .{ "c.childElementCount" , "3" },
689-
690- .{ "c.prepend(document.createTextNode('foo'))" , "undefined" },
691- .{ "c.append(document.createTextNode('bar'))" , "undefined" },
692- }, .{});
693-
694- try runner .testCases (&.{
695- .{ "let d = document.getElementById('para')" , "undefined" },
696- .{ "d.previousElementSibling.nodeName" , "P" },
697- .{ "d.nextElementSibling" , "null" },
698- }, .{});
699-
700- try runner .testCases (&.{
701- .{ "let e = document.getElementById('content')" , "undefined" },
702- .{ "e.querySelector('foo')" , "null" },
703- .{ "e.querySelector('#foo')" , "null" },
704- .{ "e.querySelector('#link').id" , "link" },
705- .{ "e.querySelector('#para').id" , "para" },
706- .{ "e.querySelector('*').id" , "link" },
707- .{ "e.querySelector('')" , "null" },
708- .{ "e.querySelector('*').id" , "link" },
709- .{ "e.querySelector('#content')" , "null" },
710- .{ "e.querySelector('#para').id" , "para" },
711- .{ "e.querySelector('.ok').id" , "link" },
712- .{ "e.querySelector('a ~ p').id" , "para-empty" },
713-
714- .{ "e.querySelectorAll('foo').length" , "0" },
715- .{ "e.querySelectorAll('#foo').length" , "0" },
716- .{ "e.querySelectorAll('#link').length" , "1" },
717- .{ "e.querySelectorAll('#link').item(0).id" , "link" },
718- .{ "e.querySelectorAll('#para').length" , "1" },
719- .{ "e.querySelectorAll('#para').item(0).id" , "para" },
720- .{ "e.querySelectorAll('*').length" , "4" },
721- .{ "e.querySelectorAll('p').length" , "2" },
722- .{ "e.querySelectorAll('.ok').item(0).id" , "link" },
723- }, .{});
724-
725- try runner .testCases (&.{
726- .{ "let f = document.getElementById('content')" , "undefined" },
727- .{ "let ff = document.createAttribute('foo')" , "undefined" },
728- .{ "f.setAttributeNode(ff)" , "null" },
729- .{ "f.getAttributeNode('foo').name" , "foo" },
730- .{ "f.removeAttributeNode(ff).name" , "foo" },
731- .{ "f.getAttributeNode('bar')" , "null" },
732- }, .{});
733-
734- try runner .testCases (&.{
735- .{ "document.getElementById('para').innerHTML" , " And" },
736- .{ "document.getElementById('para-empty').innerHTML.trim()" , "<span id=\" para-empty-child\" ></span>" },
737-
738- .{ "let h = document.getElementById('para-empty')" , "undefined" },
739- .{ "const prev = h.innerHTML" , "undefined" },
740- .{ "h.innerHTML = '<p id=\" hello\" >hello world</p>'" , "<p id=\" hello\" >hello world</p>" },
741- .{ "h.innerHTML" , "<p id=\" hello\" >hello world</p>" },
742- .{ "h.firstChild.nodeName" , "P" },
743- .{ "h.firstChild.id" , "hello" },
744- .{ "h.firstChild.textContent" , "hello world" },
745- .{ "h.innerHTML = prev; true" , "true" },
746- .{ "document.getElementById('para-empty').innerHTML.trim()" , "<span id=\" para-empty-child\" ></span>" },
747- }, .{});
748-
749- try runner .testCases (&.{
750- .{ "document.getElementById('para').outerHTML" , "<p id=\" para\" > And</p>" },
751- }, .{});
752-
753- try runner .testCases (&.{
754- .{ "document.getElementById('para').clientWidth" , "1" },
755- .{ "document.getElementById('para').clientHeight" , "1" },
756-
757- .{ "let r1 = document.getElementById('para').getBoundingClientRect()" , "undefined" },
758- .{ "r1.x" , "0" },
759- .{ "r1.y" , "0" },
760- .{ "r1.width" , "1" },
761- .{ "r1.height" , "1" },
762-
763- .{ "let r2 = document.getElementById('content').getBoundingClientRect()" , "undefined" },
764- .{ "r2.x" , "1" },
765- .{ "r2.y" , "0" },
766- .{ "r2.width" , "1" },
767- .{ "r2.height" , "1" },
768-
769- .{ "let r3 = document.getElementById('para').getBoundingClientRect()" , "undefined" },
770- .{ "r3.x" , "0" },
771- .{ "r3.y" , "0" },
772- .{ "r3.width" , "1" },
773- .{ "r3.height" , "1" },
774-
775- .{ "document.getElementById('para').clientWidth" , "2" },
776- .{ "document.getElementById('para').clientHeight" , "1" },
777-
778- .{ "let r4 = document.createElement('div').getBoundingClientRect()" , null },
779- .{ "r4.x" , "0" },
780- .{ "r4.y" , "0" },
781- .{ "r4.width" , "0" },
782- .{ "r4.height" , "0" },
783-
784- // Test setup causes WrongDocument or HierarchyRequest error unlike in chrome/firefox
785- // .{ // An element of another document, even if created from the main document, is not rendered.
786- // \\ let div5 = document.createElement('div');
787- // \\ const newDoc = document.implementation.createHTMLDocument("New Document");
788- // \\ newDoc.body.appendChild(div5);
789- // \\ let r5 = div5.getBoundingClientRect();
790- // ,
791- // null,
792- // },
793- // .{ "r5.x", "0" },
794- // .{ "r5.y", "0" },
795- // .{ "r5.width", "0" },
796- // .{ "r5.height", "0" },
797- }, .{});
798-
799- try runner .testCases (&.{
800- .{ "const el = document.createElement('div');" , "undefined" },
801- .{ "el.id = 'matches'; el.className = 'ok';" , "ok" },
802- .{ "el.matches('#matches')" , "true" },
803- .{ "el.matches('.ok')" , "true" },
804- .{ "el.matches('#9000')" , "false" },
805- .{ "el.matches('.notok')" , "false" },
806- }, .{});
807-
808- try runner .testCases (&.{
809- .{ "const el3 = document.createElement('div');" , "undefined" },
810- .{ "el3.scrollIntoViewIfNeeded();" , "undefined" },
811- .{ "el3.scrollIntoViewIfNeeded(false);" , "undefined" },
812- }, .{});
813-
814- // before
815- try runner .testCases (&.{
816- .{ "const before_container = document.createElement('div');" , "undefined" },
817- .{ "document.append(before_container);" , "undefined" },
818- .{ "const b1 = document.createElement('div');" , "undefined" },
819- .{ "before_container.append(b1);" , "undefined" },
820-
821- .{ "const b1_a = document.createElement('p');" , "undefined" },
822- .{ "b1.before(b1_a, 'over 9000');" , "undefined" },
823- .{ "before_container.innerHTML" , "<p></p>over 9000<div></div>" },
824- }, .{});
825-
826- // after
827- try runner .testCases (&.{
828- .{ "const after_container = document.createElement('div');" , "undefined" },
829- .{ "document.append(after_container);" , "undefined" },
830- .{ "const a1 = document.createElement('div');" , "undefined" },
831- .{ "after_container.append(a1);" , "undefined" },
832-
833- .{ "const a1_a = document.createElement('p');" , "undefined" },
834- .{ "a1.after('over 9000', a1_a);" , "undefined" },
835- .{ "after_container.innerHTML" , "<div></div>over 9000<p></p>" },
836- }, .{});
837-
838- try runner .testCases (&.{
839- .{ "var div1 = document.createElement('div');" , null },
840- .{ "div1.innerHTML = \" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\" " , null },
841- .{ "div1.getElementsByTagName('a').length" , "1" },
842- }, .{});
843-
844- try runner .testCases (&.{
845- .{ "document.createElement('a').hasAttributes()" , "false" },
846- .{ "var fc; (fc = document.createElement('div')).innerHTML = '<script><\\ /script>'" , null },
847- .{ "fc.outerHTML" , "<div><script></script></div>" },
848-
849- .{ "fc; (fc = document.createElement('div')).innerHTML = '<script><\\ /script><p>hello</p>'" , null },
850- .{ "fc.outerHTML" , "<div><script></script><p>hello</p></div>" },
851- }, .{});
852-
853- try runner .testCases (&.{
854- .{ "const rm = document.createElement('div')" , null },
855- .{ "rm.getAttributeNames()" , "" },
856- .{ "rm.id = 'to-remove'" , null },
857- .{ "document.getElementsByTagName('body')[0].appendChild(rm)" , null },
858- .{ "document.getElementById('to-remove') != null" , "true" },
859- .{ "rm.remove()" , "undefined" },
860- .{ "document.getElementById('to-remove') != null" , "false" },
861- }, .{});
862-
863- try runner .testCases (&.{
864- .{ "const div2 = document.createElement('div');" , null },
865- .{ "div2.innerHTML = '<p id=1 .lit$id=9>a</p>';" , null },
866- .{ "div2.innerHTML" , "<p id=\" 1\" .lit$id=\" 9\" >a</p>" },
867- .{ "div2.childNodes[0].getAttributeNames()" , "id,.lit$id" },
868- }, .{});
596+ test "Browser: DOM.Element" {
597+ try testing .htmlRunner ("dom/element.html" );
869598}
0 commit comments