From 7ab88e9a711a36f7d0a19827f61e808d30d55634 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Fri, 14 Nov 2025 15:55:02 +0800 Subject: [PATCH] add legacy tests, optimize empty types --- build.zig | 27 ++ src/browser/js/Context.zig | 44 ++- src/browser/js/Env.zig | 4 +- src/browser/tests/domparser.html | 7 +- src/browser/tests/legacy/browser.html | 10 + src/browser/tests/legacy/crypto.html | 26 ++ src/browser/tests/legacy/css.html | 6 + .../tests/legacy/cssom/css_rule_list.html | 8 + .../legacy/cssom/css_style_declaration.html | 102 ++++++ .../tests/legacy/cssom/css_stylesheet.html | 16 + src/browser/tests/legacy/dom/animation.html | 15 + src/browser/tests/legacy/dom/attribute.html | 33 ++ .../tests/legacy/dom/character_data.html | 48 +++ src/browser/tests/legacy/dom/comment.html | 9 + src/browser/tests/legacy/dom/document.html | 190 ++++++++++ .../tests/legacy/dom/document_fragment.html | 34 ++ .../tests/legacy/dom/document_type.html | 13 + src/browser/tests/legacy/dom/dom_parser.html | 7 + src/browser/tests/legacy/dom/element.html | 341 ++++++++++++++++++ .../tests/legacy/dom/event_target.html | 116 ++++++ src/browser/tests/legacy/dom/exceptions.html | 40 ++ .../tests/legacy/dom/html_collection.html | 67 ++++ .../tests/legacy/dom/implementation.html | 14 + .../legacy/dom/intersection_observer.html | 163 +++++++++ .../tests/legacy/dom/message_channel.html | 60 +++ .../tests/legacy/dom/mutation_observer.html | 76 ++++ .../tests/legacy/dom/named_node_map.html | 19 + src/browser/tests/legacy/dom/node.html | 266 ++++++++++++++ src/browser/tests/legacy/dom/node_filter.html | 219 +++++++++++ .../tests/legacy/dom/node_iterator.html | 62 ++++ src/browser/tests/legacy/dom/node_list.html | 19 + src/browser/tests/legacy/dom/node_owner.html | 34 ++ src/browser/tests/legacy/dom/performance.html | 16 + .../legacy/dom/performance_observer.html | 5 + .../legacy/dom/processing_instruction.html | 22 ++ src/browser/tests/legacy/dom/range.html | 41 +++ src/browser/tests/legacy/dom/shadow_root.html | 49 +++ src/browser/tests/legacy/dom/text.html | 19 + src/browser/tests/legacy/dom/token_list.html | 64 ++++ .../tests/legacy/encoding/decoder.html | 60 +++ .../tests/legacy/encoding/encoder.html | 14 + .../tests/legacy/events/composition.html | 36 ++ src/browser/tests/legacy/events/custom.html | 25 ++ src/browser/tests/legacy/events/event.html | 139 +++++++ src/browser/tests/legacy/events/keyboard.html | 88 +++++ src/browser/tests/legacy/events/mouse.html | 34 ++ src/browser/tests/legacy/fetch/fetch.html | 34 ++ src/browser/tests/legacy/fetch/headers.html | 102 ++++++ src/browser/tests/legacy/fetch/request.html | 22 ++ src/browser/tests/legacy/fetch/response.html | 50 +++ src/browser/tests/legacy/file/blob.html | 125 +++++++ src/browser/tests/legacy/file/file.html | 7 + .../tests/legacy/html/abort_controller.html | 41 +++ src/browser/tests/legacy/html/canvas.html | 29 ++ src/browser/tests/legacy/html/dataset.html | 30 ++ src/browser/tests/legacy/html/document.html | 85 +++++ src/browser/tests/legacy/html/element.html | 53 +++ .../tests/legacy/html/error_event.html | 25 ++ .../tests/legacy/html/history/history.html | 37 ++ .../tests/legacy/html/history/history2.html | 26 ++ .../html/history/history_after_nav.html | 6 + src/browser/tests/legacy/html/image.html | 32 ++ src/browser/tests/legacy/html/input.html | 111 ++++++ src/browser/tests/legacy/html/link.html | 60 +++ src/browser/tests/legacy/html/location.html | 33 ++ .../legacy/html/navigation/navigation.html | 18 + .../legacy/html/navigation/navigation2.html | 8 + .../navigation_currententrychange.html | 15 + src/browser/tests/legacy/html/navigator.html | 8 + src/browser/tests/legacy/html/screen.html | 21 ++ .../legacy/html/script/dynamic_import.html | 32 ++ .../tests/legacy/html/script/import.html | 15 + .../tests/legacy/html/script/import.js | 2 + .../tests/legacy/html/script/import2.js | 2 + .../tests/legacy/html/script/importmap.html | 24 ++ .../legacy/html/script/inline_defer.html | 28 ++ .../tests/legacy/html/script/inline_defer.js | 1 + .../tests/legacy/html/script/order.html | 35 ++ src/browser/tests/legacy/html/script/order.js | 2 + .../tests/legacy/html/script/order_async.js | 3 + .../tests/legacy/html/script/order_defer.js | 2 + .../tests/legacy/html/script/script.html | 21 ++ src/browser/tests/legacy/html/select.html | 80 ++++ src/browser/tests/legacy/html/slot.html | 179 +++++++++ src/browser/tests/legacy/html/style.html | 8 + src/browser/tests/legacy/html/svg.html | 38 ++ src/browser/tests/legacy/html/template.html | 38 ++ .../tests/legacy/polyfill/webcomponents.html | 23 ++ .../tests/legacy/storage/local_storage.html | 29 ++ .../tests/legacy/streams/readable_stream.html | 134 +++++++ src/browser/tests/legacy/testing.js | 206 +++++++++++ src/browser/tests/legacy/url/url.html | 109 ++++++ .../tests/legacy/url/url_search_params.html | 94 +++++ src/browser/tests/legacy/window/frames.html | 13 + src/browser/tests/legacy/window/window.html | 167 +++++++++ src/browser/tests/legacy/xhr/form_data.html | 130 +++++++ .../tests/legacy/xhr/progress_event.html | 17 + src/browser/tests/legacy/xhr/xhr.html | 110 ++++++ src/browser/tests/legacy/xmlserializer.html | 8 + src/browser/webapi/DOMParser.zig | 3 +- src/browser/webapi/NodeFilter.zig | 1 + src/lightpanda.zig | 5 +- src/main_legacy_test.zig | 238 ++++++++++++ tests/html/bug-html-parsing-4.html | 6 - 104 files changed, 5461 insertions(+), 27 deletions(-) create mode 100644 src/browser/tests/legacy/browser.html create mode 100644 src/browser/tests/legacy/crypto.html create mode 100644 src/browser/tests/legacy/css.html create mode 100644 src/browser/tests/legacy/cssom/css_rule_list.html create mode 100644 src/browser/tests/legacy/cssom/css_style_declaration.html create mode 100644 src/browser/tests/legacy/cssom/css_stylesheet.html create mode 100644 src/browser/tests/legacy/dom/animation.html create mode 100644 src/browser/tests/legacy/dom/attribute.html create mode 100644 src/browser/tests/legacy/dom/character_data.html create mode 100644 src/browser/tests/legacy/dom/comment.html create mode 100644 src/browser/tests/legacy/dom/document.html create mode 100644 src/browser/tests/legacy/dom/document_fragment.html create mode 100644 src/browser/tests/legacy/dom/document_type.html create mode 100644 src/browser/tests/legacy/dom/dom_parser.html create mode 100644 src/browser/tests/legacy/dom/element.html create mode 100644 src/browser/tests/legacy/dom/event_target.html create mode 100644 src/browser/tests/legacy/dom/exceptions.html create mode 100644 src/browser/tests/legacy/dom/html_collection.html create mode 100644 src/browser/tests/legacy/dom/implementation.html create mode 100644 src/browser/tests/legacy/dom/intersection_observer.html create mode 100644 src/browser/tests/legacy/dom/message_channel.html create mode 100644 src/browser/tests/legacy/dom/mutation_observer.html create mode 100644 src/browser/tests/legacy/dom/named_node_map.html create mode 100644 src/browser/tests/legacy/dom/node.html create mode 100644 src/browser/tests/legacy/dom/node_filter.html create mode 100644 src/browser/tests/legacy/dom/node_iterator.html create mode 100644 src/browser/tests/legacy/dom/node_list.html create mode 100644 src/browser/tests/legacy/dom/node_owner.html create mode 100644 src/browser/tests/legacy/dom/performance.html create mode 100644 src/browser/tests/legacy/dom/performance_observer.html create mode 100644 src/browser/tests/legacy/dom/processing_instruction.html create mode 100644 src/browser/tests/legacy/dom/range.html create mode 100644 src/browser/tests/legacy/dom/shadow_root.html create mode 100644 src/browser/tests/legacy/dom/text.html create mode 100644 src/browser/tests/legacy/dom/token_list.html create mode 100644 src/browser/tests/legacy/encoding/decoder.html create mode 100644 src/browser/tests/legacy/encoding/encoder.html create mode 100644 src/browser/tests/legacy/events/composition.html create mode 100644 src/browser/tests/legacy/events/custom.html create mode 100644 src/browser/tests/legacy/events/event.html create mode 100644 src/browser/tests/legacy/events/keyboard.html create mode 100644 src/browser/tests/legacy/events/mouse.html create mode 100644 src/browser/tests/legacy/fetch/fetch.html create mode 100644 src/browser/tests/legacy/fetch/headers.html create mode 100644 src/browser/tests/legacy/fetch/request.html create mode 100644 src/browser/tests/legacy/fetch/response.html create mode 100644 src/browser/tests/legacy/file/blob.html create mode 100644 src/browser/tests/legacy/file/file.html create mode 100644 src/browser/tests/legacy/html/abort_controller.html create mode 100644 src/browser/tests/legacy/html/canvas.html create mode 100644 src/browser/tests/legacy/html/dataset.html create mode 100644 src/browser/tests/legacy/html/document.html create mode 100644 src/browser/tests/legacy/html/element.html create mode 100644 src/browser/tests/legacy/html/error_event.html create mode 100644 src/browser/tests/legacy/html/history/history.html create mode 100644 src/browser/tests/legacy/html/history/history2.html create mode 100644 src/browser/tests/legacy/html/history/history_after_nav.html create mode 100644 src/browser/tests/legacy/html/image.html create mode 100644 src/browser/tests/legacy/html/input.html create mode 100644 src/browser/tests/legacy/html/link.html create mode 100644 src/browser/tests/legacy/html/location.html create mode 100644 src/browser/tests/legacy/html/navigation/navigation.html create mode 100644 src/browser/tests/legacy/html/navigation/navigation2.html create mode 100644 src/browser/tests/legacy/html/navigation/navigation_currententrychange.html create mode 100644 src/browser/tests/legacy/html/navigator.html create mode 100644 src/browser/tests/legacy/html/screen.html create mode 100644 src/browser/tests/legacy/html/script/dynamic_import.html create mode 100644 src/browser/tests/legacy/html/script/import.html create mode 100644 src/browser/tests/legacy/html/script/import.js create mode 100644 src/browser/tests/legacy/html/script/import2.js create mode 100644 src/browser/tests/legacy/html/script/importmap.html create mode 100644 src/browser/tests/legacy/html/script/inline_defer.html create mode 100644 src/browser/tests/legacy/html/script/inline_defer.js create mode 100644 src/browser/tests/legacy/html/script/order.html create mode 100644 src/browser/tests/legacy/html/script/order.js create mode 100644 src/browser/tests/legacy/html/script/order_async.js create mode 100644 src/browser/tests/legacy/html/script/order_defer.js create mode 100644 src/browser/tests/legacy/html/script/script.html create mode 100644 src/browser/tests/legacy/html/select.html create mode 100644 src/browser/tests/legacy/html/slot.html create mode 100644 src/browser/tests/legacy/html/style.html create mode 100644 src/browser/tests/legacy/html/svg.html create mode 100644 src/browser/tests/legacy/html/template.html create mode 100644 src/browser/tests/legacy/polyfill/webcomponents.html create mode 100644 src/browser/tests/legacy/storage/local_storage.html create mode 100644 src/browser/tests/legacy/streams/readable_stream.html create mode 100644 src/browser/tests/legacy/testing.js create mode 100644 src/browser/tests/legacy/url/url.html create mode 100644 src/browser/tests/legacy/url/url_search_params.html create mode 100644 src/browser/tests/legacy/window/frames.html create mode 100644 src/browser/tests/legacy/window/window.html create mode 100644 src/browser/tests/legacy/xhr/form_data.html create mode 100644 src/browser/tests/legacy/xhr/progress_event.html create mode 100644 src/browser/tests/legacy/xhr/xhr.html create mode 100644 src/browser/tests/legacy/xmlserializer.html create mode 100644 src/main_legacy_test.zig delete mode 100644 tests/html/bug-html-parsing-4.html diff --git a/build.zig b/build.zig index d7effb26..9f627169 100644 --- a/build.zig +++ b/build.zig @@ -112,6 +112,33 @@ pub fn build(b: *Build) !void { test_step.dependOn(&run_tests.step); } + { + // ZIGDOM + // browser + const exe = b.addExecutable(.{ + .name = "legacy_test", + .use_llvm = true, + .root_module = b.createModule(.{ + .root_source_file = b.path("src/main_legacy_test.zig"), + .target = target, + .optimize = optimize, + .sanitize_c = enable_csan, + .sanitize_thread = enable_tsan, + .imports = &.{ + .{.name = "lightpanda", .module = lightpanda_module}, + }, + }), + }); + b.installArtifact(exe); + + const run_cmd = b.addRunArtifact(exe); + if (b.args) |args| { + run_cmd.addArgs(args); + } + const run_step = b.step("legacy_test", "Run the app"); + run_step.dependOn(&run_cmd.step); + } + { // wpt const exe = b.addExecutable(.{ diff --git a/src/browser/js/Context.zig b/src/browser/js/Context.zig index 5b6b510b..72ce1bef 100644 --- a/src/browser/js/Context.zig +++ b/src/browser/js/Context.zig @@ -615,6 +615,8 @@ pub fn mapZigInstanceToJs(self: *Context, js_obj_: ?v8.Object, value: anytype) ! } const isolate = self.isolate; + const JsApi = bridge.Struct(ptr.child).JsApi; + // Sometimes we're creating a new v8.Object, like when // we're returning a value from a function. In those cases // we have to get the object template, and we can get an object @@ -626,19 +628,26 @@ pub fn mapZigInstanceToJs(self: *Context, js_obj_: ?v8.Object, value: anytype) ! const template = self.templates[resolved.class_id]; break :blk template.getInstanceTemplate().initInstance(v8_context); }; - const JsApi = bridge.Struct(ptr.child).JsApi; - // The TAO contains the pointer to our Zig instance as - // well as any meta data we'll need to use it later. - // See the TaggedAnyOpaque struct for more details. - const tao = try arena.create(TaggedAnyOpaque); - tao.* = .{ - .value = resolved.ptr, - .prototype_chain = resolved.prototype_chain.ptr, - .prototype_len = @intCast(resolved.prototype_chain.len), - .subtype = if (@hasDecl(JsApi.Meta, "subtype")) JsApi.Meta.subype else .node, - }; - js_obj.setInternalField(0, v8.External.init(isolate, tao)); + if (!@hasDecl(JsApi.Meta, "empty_with_no_proto")) { + // The TAO contains the pointer to our Zig instance as + // well as any meta data we'll need to use it later. + // See the TaggedAnyOpaque struct for more details. + const tao = try arena.create(TaggedAnyOpaque); + tao.* = .{ + .value = resolved.ptr, + .prototype_chain = resolved.prototype_chain.ptr, + .prototype_len = @intCast(resolved.prototype_chain.len), + .subtype = if (@hasDecl(JsApi.Meta, "subtype")) JsApi.Meta.subype else .node, + }; + js_obj.setInternalField(0, v8.External.init(isolate, tao)); + } else { + // If the struct is empty, we don't need to do all + // the TOA stuff and setting the internal data. + // When we try to map this from JS->Zig, in + // typeTaggedAnyOpaque, we'll also know there that + // the type is empty and can create an empty instance. + } const js_persistent = PersistentObject.init(isolate, js_obj); gop.value_ptr.* = js_persistent; @@ -1504,6 +1513,15 @@ pub fn typeTaggedAnyOpaque(comptime R: type, js_obj: v8.Object) !R { } const T = ti.pointer.child; + const JsApi = bridge.Struct(T).JsApi; + + if (@hasDecl(JsApi.Meta, "empty_with_no_proto")) { + // Empty structs aren't stored as TOAs and there's no data + // stored in the JSObject's IntenrnalField. Why bother when + // we can just return an empty struct here? + return @constCast(@as(*const T, &.{})); + } + // if it isn't an empty struct, then the v8.Object should have an // InternalFieldCount > 0, since our toa pointer should be embedded // at index 0 of the internal field count. @@ -1511,7 +1529,7 @@ pub fn typeTaggedAnyOpaque(comptime R: type, js_obj: v8.Object) !R { return error.InvalidArgument; } - const type_name = @typeName(bridge.Struct(T).JsApi); + const type_name = @typeName(JsApi); if (@hasField(bridge.JsApiLookup, type_name) == false) { @compileError("unknown Zig type: " ++ @typeName(R)); } diff --git a/src/browser/js/Env.zig b/src/browser/js/Env.zig index 71bed313..d75afd4b 100644 --- a/src/browser/js/Env.zig +++ b/src/browser/js/Env.zig @@ -314,7 +314,9 @@ fn generateConstructor(comptime JsApi: type, isolate: v8.Isolate) v8.FunctionTem }; const template = v8.FunctionTemplate.initCallback(isolate, callback); - template.getInstanceTemplate().setInternalFieldCount(1); + if (!@hasDecl(JsApi.Meta, "empty_with_no_proto")) { + template.getInstanceTemplate().setInternalFieldCount(1); + } const class_name = v8.String.initUtf8(isolate, if (@hasDecl(JsApi.Meta, "name")) JsApi.Meta.name else @typeName(JsApi)); template.setClassName(class_name); return template; diff --git a/src/browser/tests/domparser.html b/src/browser/tests/domparser.html index 390f7bfe..66014388 100644 --- a/src/browser/tests/domparser.html +++ b/src/browser/tests/domparser.html @@ -1,13 +1,13 @@ - + - diff --git a/src/browser/tests/legacy/browser.html b/src/browser/tests/legacy/browser.html new file mode 100644 index 00000000..1f60488b --- /dev/null +++ b/src/browser/tests/legacy/browser.html @@ -0,0 +1,10 @@ + + + diff --git a/src/browser/tests/legacy/crypto.html b/src/browser/tests/legacy/crypto.html new file mode 100644 index 00000000..f1dc291a --- /dev/null +++ b/src/browser/tests/legacy/crypto.html @@ -0,0 +1,26 @@ + + + diff --git a/src/browser/tests/legacy/css.html b/src/browser/tests/legacy/css.html new file mode 100644 index 00000000..3f83e934 --- /dev/null +++ b/src/browser/tests/legacy/css.html @@ -0,0 +1,6 @@ + + + diff --git a/src/browser/tests/legacy/cssom/css_rule_list.html b/src/browser/tests/legacy/cssom/css_rule_list.html new file mode 100644 index 00000000..577781e4 --- /dev/null +++ b/src/browser/tests/legacy/cssom/css_rule_list.html @@ -0,0 +1,8 @@ + + + diff --git a/src/browser/tests/legacy/cssom/css_style_declaration.html b/src/browser/tests/legacy/cssom/css_style_declaration.html new file mode 100644 index 00000000..ee4d3cd9 --- /dev/null +++ b/src/browser/tests/legacy/cssom/css_style_declaration.html @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + diff --git a/src/browser/tests/legacy/cssom/css_stylesheet.html b/src/browser/tests/legacy/cssom/css_stylesheet.html new file mode 100644 index 00000000..223ee2cd --- /dev/null +++ b/src/browser/tests/legacy/cssom/css_stylesheet.html @@ -0,0 +1,16 @@ + + + diff --git a/src/browser/tests/legacy/dom/animation.html b/src/browser/tests/legacy/dom/animation.html new file mode 100644 index 00000000..27e562a0 --- /dev/null +++ b/src/browser/tests/legacy/dom/animation.html @@ -0,0 +1,15 @@ + + + + diff --git a/src/browser/tests/legacy/dom/attribute.html b/src/browser/tests/legacy/dom/attribute.html new file mode 100644 index 00000000..2e208861 --- /dev/null +++ b/src/browser/tests/legacy/dom/attribute.html @@ -0,0 +1,33 @@ + + + +OK + + diff --git a/src/browser/tests/legacy/dom/character_data.html b/src/browser/tests/legacy/dom/character_data.html new file mode 100644 index 00000000..ff74da90 --- /dev/null +++ b/src/browser/tests/legacy/dom/character_data.html @@ -0,0 +1,48 @@ + + + +OK + + diff --git a/src/browser/tests/legacy/dom/comment.html b/src/browser/tests/legacy/dom/comment.html new file mode 100644 index 00000000..2f87846c --- /dev/null +++ b/src/browser/tests/legacy/dom/comment.html @@ -0,0 +1,9 @@ + + + diff --git a/src/browser/tests/legacy/dom/document.html b/src/browser/tests/legacy/dom/document.html new file mode 100644 index 00000000..950daaab --- /dev/null +++ b/src/browser/tests/legacy/dom/document.html @@ -0,0 +1,190 @@ + + + +
+ OK +

+ +

+

And

+
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/browser/tests/legacy/dom/document_fragment.html b/src/browser/tests/legacy/dom/document_fragment.html new file mode 100644 index 00000000..ff02b3a4 --- /dev/null +++ b/src/browser/tests/legacy/dom/document_fragment.html @@ -0,0 +1,34 @@ + + + + + diff --git a/src/browser/tests/legacy/dom/document_type.html b/src/browser/tests/legacy/dom/document_type.html new file mode 100644 index 00000000..ff7cdbc8 --- /dev/null +++ b/src/browser/tests/legacy/dom/document_type.html @@ -0,0 +1,13 @@ + + + diff --git a/src/browser/tests/legacy/dom/dom_parser.html b/src/browser/tests/legacy/dom/dom_parser.html new file mode 100644 index 00000000..bf9bec8a --- /dev/null +++ b/src/browser/tests/legacy/dom/dom_parser.html @@ -0,0 +1,7 @@ + + + diff --git a/src/browser/tests/legacy/dom/element.html b/src/browser/tests/legacy/dom/element.html new file mode 100644 index 00000000..3255b7d2 --- /dev/null +++ b/src/browser/tests/legacy/dom/element.html @@ -0,0 +1,341 @@ + + + +
+ OK +

+ +

+

And

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

content

+
+
+ + + + diff --git a/src/browser/tests/legacy/dom/event_target.html b/src/browser/tests/legacy/dom/event_target.html new file mode 100644 index 00000000..68fb8c6b --- /dev/null +++ b/src/browser/tests/legacy/dom/event_target.html @@ -0,0 +1,116 @@ + + + +

+ + diff --git a/src/browser/tests/legacy/dom/exceptions.html b/src/browser/tests/legacy/dom/exceptions.html new file mode 100644 index 00000000..c6bb91f1 --- /dev/null +++ b/src/browser/tests/legacy/dom/exceptions.html @@ -0,0 +1,40 @@ + + + +
+ OK +
+ + + + diff --git a/src/browser/tests/legacy/dom/html_collection.html b/src/browser/tests/legacy/dom/html_collection.html new file mode 100644 index 00000000..22590e58 --- /dev/null +++ b/src/browser/tests/legacy/dom/html_collection.html @@ -0,0 +1,67 @@ + + +
+ OK +

+ +

+

And

+ +
+ + + + + + + + + + diff --git a/src/browser/tests/legacy/dom/implementation.html b/src/browser/tests/legacy/dom/implementation.html new file mode 100644 index 00000000..81cce804 --- /dev/null +++ b/src/browser/tests/legacy/dom/implementation.html @@ -0,0 +1,14 @@ + + + diff --git a/src/browser/tests/legacy/dom/intersection_observer.html b/src/browser/tests/legacy/dom/intersection_observer.html new file mode 100644 index 00000000..4067edba --- /dev/null +++ b/src/browser/tests/legacy/dom/intersection_observer.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + diff --git a/src/browser/tests/legacy/dom/message_channel.html b/src/browser/tests/legacy/dom/message_channel.html new file mode 100644 index 00000000..2ab075e5 --- /dev/null +++ b/src/browser/tests/legacy/dom/message_channel.html @@ -0,0 +1,60 @@ + + + diff --git a/src/browser/tests/legacy/dom/mutation_observer.html b/src/browser/tests/legacy/dom/mutation_observer.html new file mode 100644 index 00000000..f67cb924 --- /dev/null +++ b/src/browser/tests/legacy/dom/mutation_observer.html @@ -0,0 +1,76 @@ + +
+

And

+

And

+

And

+ + + + + diff --git a/src/browser/tests/legacy/dom/named_node_map.html b/src/browser/tests/legacy/dom/named_node_map.html new file mode 100644 index 00000000..7cdcf4b7 --- /dev/null +++ b/src/browser/tests/legacy/dom/named_node_map.html @@ -0,0 +1,19 @@ + +
+ + + diff --git a/src/browser/tests/legacy/dom/node.html b/src/browser/tests/legacy/dom/node.html new file mode 100644 index 00000000..ae9b8a3e --- /dev/null +++ b/src/browser/tests/legacy/dom/node.html @@ -0,0 +1,266 @@ + +
+ OK +

+ +

+

And

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +"puppeteer " +

Leto + + + Atreides

+ diff --git a/src/browser/tests/legacy/dom/node_filter.html b/src/browser/tests/legacy/dom/node_filter.html new file mode 100644 index 00000000..d5ac95f4 --- /dev/null +++ b/src/browser/tests/legacy/dom/node_filter.html @@ -0,0 +1,219 @@ + + + + +
+ +
+ + + + Text content + + + +
+ +
+ + + + + + + + + + + + + + + + diff --git a/src/browser/tests/legacy/dom/node_iterator.html b/src/browser/tests/legacy/dom/node_iterator.html new file mode 100644 index 00000000..6225dea4 --- /dev/null +++ b/src/browser/tests/legacy/dom/node_iterator.html @@ -0,0 +1,62 @@ + + + + + +
+ OK +

+ +

+

And

+ +
+ diff --git a/src/browser/tests/legacy/dom/node_list.html b/src/browser/tests/legacy/dom/node_list.html new file mode 100644 index 00000000..911b8aa8 --- /dev/null +++ b/src/browser/tests/legacy/dom/node_list.html @@ -0,0 +1,19 @@ + +
+ OK +

+ +

+

And

+ +
+ + + diff --git a/src/browser/tests/legacy/dom/node_owner.html b/src/browser/tests/legacy/dom/node_owner.html new file mode 100644 index 00000000..0aec74c5 --- /dev/null +++ b/src/browser/tests/legacy/dom/node_owner.html @@ -0,0 +1,34 @@ + +
+

+ I am the original reference node. +

+
+ + + diff --git a/src/browser/tests/legacy/dom/performance.html b/src/browser/tests/legacy/dom/performance.html new file mode 100644 index 00000000..0fbfe6fd --- /dev/null +++ b/src/browser/tests/legacy/dom/performance.html @@ -0,0 +1,16 @@ + + + diff --git a/src/browser/tests/legacy/dom/performance_observer.html b/src/browser/tests/legacy/dom/performance_observer.html new file mode 100644 index 00000000..303fc15f --- /dev/null +++ b/src/browser/tests/legacy/dom/performance_observer.html @@ -0,0 +1,5 @@ + + + diff --git a/src/browser/tests/legacy/dom/processing_instruction.html b/src/browser/tests/legacy/dom/processing_instruction.html new file mode 100644 index 00000000..67bc8fc4 --- /dev/null +++ b/src/browser/tests/legacy/dom/processing_instruction.html @@ -0,0 +1,22 @@ + + + diff --git a/src/browser/tests/legacy/dom/range.html b/src/browser/tests/legacy/dom/range.html new file mode 100644 index 00000000..a60862ca --- /dev/null +++ b/src/browser/tests/legacy/dom/range.html @@ -0,0 +1,41 @@ + + + +

over 9000

+ + + + + + + + diff --git a/src/browser/tests/legacy/dom/shadow_root.html b/src/browser/tests/legacy/dom/shadow_root.html new file mode 100644 index 00000000..88a302db --- /dev/null +++ b/src/browser/tests/legacy/dom/shadow_root.html @@ -0,0 +1,49 @@ + +
node
+ + + diff --git a/src/browser/tests/legacy/dom/text.html b/src/browser/tests/legacy/dom/text.html new file mode 100644 index 00000000..d7ceba08 --- /dev/null +++ b/src/browser/tests/legacy/dom/text.html @@ -0,0 +1,19 @@ + +OK + + + diff --git a/src/browser/tests/legacy/dom/token_list.html b/src/browser/tests/legacy/dom/token_list.html new file mode 100644 index 00000000..b04d5658 --- /dev/null +++ b/src/browser/tests/legacy/dom/token_list.html @@ -0,0 +1,64 @@ + +

+ + + diff --git a/src/browser/tests/legacy/encoding/decoder.html b/src/browser/tests/legacy/encoding/decoder.html new file mode 100644 index 00000000..8a93dc46 --- /dev/null +++ b/src/browser/tests/legacy/encoding/decoder.html @@ -0,0 +1,60 @@ + + + + + + + + + diff --git a/src/browser/tests/legacy/encoding/encoder.html b/src/browser/tests/legacy/encoding/encoder.html new file mode 100644 index 00000000..affcd575 --- /dev/null +++ b/src/browser/tests/legacy/encoding/encoder.html @@ -0,0 +1,14 @@ + + + diff --git a/src/browser/tests/legacy/events/composition.html b/src/browser/tests/legacy/events/composition.html new file mode 100644 index 00000000..b5a6a710 --- /dev/null +++ b/src/browser/tests/legacy/events/composition.html @@ -0,0 +1,36 @@ + + + + + + + + + diff --git a/src/browser/tests/legacy/events/custom.html b/src/browser/tests/legacy/events/custom.html new file mode 100644 index 00000000..cb6ddd2b --- /dev/null +++ b/src/browser/tests/legacy/events/custom.html @@ -0,0 +1,25 @@ + + + diff --git a/src/browser/tests/legacy/events/event.html b/src/browser/tests/legacy/events/event.html new file mode 100644 index 00000000..752d64ba --- /dev/null +++ b/src/browser/tests/legacy/events/event.html @@ -0,0 +1,139 @@ + + + +

+

+
+ + + + + + + + + + + + + + + + diff --git a/src/browser/tests/legacy/events/keyboard.html b/src/browser/tests/legacy/events/keyboard.html new file mode 100644 index 00000000..2b3dbefb --- /dev/null +++ b/src/browser/tests/legacy/events/keyboard.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + diff --git a/src/browser/tests/legacy/events/mouse.html b/src/browser/tests/legacy/events/mouse.html new file mode 100644 index 00000000..4c9b3f63 --- /dev/null +++ b/src/browser/tests/legacy/events/mouse.html @@ -0,0 +1,34 @@ + + + + + + + diff --git a/src/browser/tests/legacy/fetch/fetch.html b/src/browser/tests/legacy/fetch/fetch.html new file mode 100644 index 00000000..877f887b --- /dev/null +++ b/src/browser/tests/legacy/fetch/fetch.html @@ -0,0 +1,34 @@ + + + + diff --git a/src/browser/tests/legacy/fetch/headers.html b/src/browser/tests/legacy/fetch/headers.html new file mode 100644 index 00000000..57d6ce2e --- /dev/null +++ b/src/browser/tests/legacy/fetch/headers.html @@ -0,0 +1,102 @@ + + + + + + + + + diff --git a/src/browser/tests/legacy/fetch/request.html b/src/browser/tests/legacy/fetch/request.html new file mode 100644 index 00000000..7bfdfe56 --- /dev/null +++ b/src/browser/tests/legacy/fetch/request.html @@ -0,0 +1,22 @@ + + + diff --git a/src/browser/tests/legacy/fetch/response.html b/src/browser/tests/legacy/fetch/response.html new file mode 100644 index 00000000..f65a2fea --- /dev/null +++ b/src/browser/tests/legacy/fetch/response.html @@ -0,0 +1,50 @@ + + + + + diff --git a/src/browser/tests/legacy/file/blob.html b/src/browser/tests/legacy/file/blob.html new file mode 100644 index 00000000..343fd32b --- /dev/null +++ b/src/browser/tests/legacy/file/blob.html @@ -0,0 +1,125 @@ + + + + + + + + + + + diff --git a/src/browser/tests/legacy/file/file.html b/src/browser/tests/legacy/file/file.html new file mode 100644 index 00000000..05f23ad7 --- /dev/null +++ b/src/browser/tests/legacy/file/file.html @@ -0,0 +1,7 @@ + + + + diff --git a/src/browser/tests/legacy/html/abort_controller.html b/src/browser/tests/legacy/html/abort_controller.html new file mode 100644 index 00000000..fc5a1cdf --- /dev/null +++ b/src/browser/tests/legacy/html/abort_controller.html @@ -0,0 +1,41 @@ + + + + + + + + diff --git a/src/browser/tests/legacy/html/canvas.html b/src/browser/tests/legacy/html/canvas.html new file mode 100644 index 00000000..ab076487 --- /dev/null +++ b/src/browser/tests/legacy/html/canvas.html @@ -0,0 +1,29 @@ + + + + + + diff --git a/src/browser/tests/legacy/html/dataset.html b/src/browser/tests/legacy/html/dataset.html new file mode 100644 index 00000000..8eff6927 --- /dev/null +++ b/src/browser/tests/legacy/html/dataset.html @@ -0,0 +1,30 @@ + + +
+ + + + diff --git a/src/browser/tests/legacy/html/document.html b/src/browser/tests/legacy/html/document.html new file mode 100644 index 00000000..cc02f7c6 --- /dev/null +++ b/src/browser/tests/legacy/html/document.html @@ -0,0 +1,85 @@ + + + +
+ + + + + + diff --git a/src/browser/tests/legacy/html/element.html b/src/browser/tests/legacy/html/element.html new file mode 100644 index 00000000..4de1f058 --- /dev/null +++ b/src/browser/tests/legacy/html/element.html @@ -0,0 +1,53 @@ + + +
abcc
+ + + + + + + + + + + diff --git a/src/browser/tests/legacy/html/error_event.html b/src/browser/tests/legacy/html/error_event.html new file mode 100644 index 00000000..be2c56a4 --- /dev/null +++ b/src/browser/tests/legacy/html/error_event.html @@ -0,0 +1,25 @@ + + + + diff --git a/src/browser/tests/legacy/html/history/history.html b/src/browser/tests/legacy/html/history/history.html new file mode 100644 index 00000000..fbb7dd95 --- /dev/null +++ b/src/browser/tests/legacy/html/history/history.html @@ -0,0 +1,37 @@ + + + + diff --git a/src/browser/tests/legacy/html/history/history2.html b/src/browser/tests/legacy/html/history/history2.html new file mode 100644 index 00000000..83dd809a --- /dev/null +++ b/src/browser/tests/legacy/html/history/history2.html @@ -0,0 +1,26 @@ + + + + diff --git a/src/browser/tests/legacy/html/history/history_after_nav.html b/src/browser/tests/legacy/html/history/history_after_nav.html new file mode 100644 index 00000000..d9e4e66d --- /dev/null +++ b/src/browser/tests/legacy/html/history/history_after_nav.html @@ -0,0 +1,6 @@ + + + + diff --git a/src/browser/tests/legacy/html/image.html b/src/browser/tests/legacy/html/image.html new file mode 100644 index 00000000..1e3f6aff --- /dev/null +++ b/src/browser/tests/legacy/html/image.html @@ -0,0 +1,32 @@ + + + + diff --git a/src/browser/tests/legacy/html/input.html b/src/browser/tests/legacy/html/input.html new file mode 100644 index 00000000..4a7e991a --- /dev/null +++ b/src/browser/tests/legacy/html/input.html @@ -0,0 +1,111 @@ + + + +
+

+ +

+
+ + + + + + + + diff --git a/src/browser/tests/legacy/html/link.html b/src/browser/tests/legacy/html/link.html new file mode 100644 index 00000000..15da6461 --- /dev/null +++ b/src/browser/tests/legacy/html/link.html @@ -0,0 +1,60 @@ + + +OK + + diff --git a/src/browser/tests/legacy/html/location.html b/src/browser/tests/legacy/html/location.html new file mode 100644 index 00000000..a5de3ba8 --- /dev/null +++ b/src/browser/tests/legacy/html/location.html @@ -0,0 +1,33 @@ + + + + + + diff --git a/src/browser/tests/legacy/html/navigation/navigation.html b/src/browser/tests/legacy/html/navigation/navigation.html new file mode 100644 index 00000000..24efe6c7 --- /dev/null +++ b/src/browser/tests/legacy/html/navigation/navigation.html @@ -0,0 +1,18 @@ + + + + diff --git a/src/browser/tests/legacy/html/navigation/navigation2.html b/src/browser/tests/legacy/html/navigation/navigation2.html new file mode 100644 index 00000000..b16fa917 --- /dev/null +++ b/src/browser/tests/legacy/html/navigation/navigation2.html @@ -0,0 +1,8 @@ + + + + diff --git a/src/browser/tests/legacy/html/navigation/navigation_currententrychange.html b/src/browser/tests/legacy/html/navigation/navigation_currententrychange.html new file mode 100644 index 00000000..c84bcbad --- /dev/null +++ b/src/browser/tests/legacy/html/navigation/navigation_currententrychange.html @@ -0,0 +1,15 @@ + + + + diff --git a/src/browser/tests/legacy/html/navigator.html b/src/browser/tests/legacy/html/navigator.html new file mode 100644 index 00000000..fb2b3ffe --- /dev/null +++ b/src/browser/tests/legacy/html/navigator.html @@ -0,0 +1,8 @@ + + + + diff --git a/src/browser/tests/legacy/html/screen.html b/src/browser/tests/legacy/html/screen.html new file mode 100644 index 00000000..82f4b71c --- /dev/null +++ b/src/browser/tests/legacy/html/screen.html @@ -0,0 +1,21 @@ + + + + + + diff --git a/src/browser/tests/legacy/html/script/dynamic_import.html b/src/browser/tests/legacy/html/script/dynamic_import.html new file mode 100644 index 00000000..ddaa19a2 --- /dev/null +++ b/src/browser/tests/legacy/html/script/dynamic_import.html @@ -0,0 +1,32 @@ + + + + + diff --git a/src/browser/tests/legacy/html/script/import.html b/src/browser/tests/legacy/html/script/import.html new file mode 100644 index 00000000..7a4037af --- /dev/null +++ b/src/browser/tests/legacy/html/script/import.html @@ -0,0 +1,15 @@ + + + + + + + diff --git a/src/browser/tests/legacy/html/script/import.js b/src/browser/tests/legacy/html/script/import.js new file mode 100644 index 00000000..fb140c03 --- /dev/null +++ b/src/browser/tests/legacy/html/script/import.js @@ -0,0 +1,2 @@ +let greeting = 'hello'; +export {greeting as 'greeting'}; diff --git a/src/browser/tests/legacy/html/script/import2.js b/src/browser/tests/legacy/html/script/import2.js new file mode 100644 index 00000000..328b8943 --- /dev/null +++ b/src/browser/tests/legacy/html/script/import2.js @@ -0,0 +1,2 @@ +let greeting = 'world'; +export {greeting as 'greeting'}; diff --git a/src/browser/tests/legacy/html/script/importmap.html b/src/browser/tests/legacy/html/script/importmap.html new file mode 100644 index 00000000..973d5080 --- /dev/null +++ b/src/browser/tests/legacy/html/script/importmap.html @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/src/browser/tests/legacy/html/script/inline_defer.html b/src/browser/tests/legacy/html/script/inline_defer.html new file mode 100644 index 00000000..ec5b44c6 --- /dev/null +++ b/src/browser/tests/legacy/html/script/inline_defer.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/src/browser/tests/legacy/html/script/inline_defer.js b/src/browser/tests/legacy/html/script/inline_defer.js new file mode 100644 index 00000000..1e0ee1a4 --- /dev/null +++ b/src/browser/tests/legacy/html/script/inline_defer.js @@ -0,0 +1 @@ +dyn1_loaded += 1; diff --git a/src/browser/tests/legacy/html/script/order.html b/src/browser/tests/legacy/html/script/order.html new file mode 100644 index 00000000..7efbbef3 --- /dev/null +++ b/src/browser/tests/legacy/html/script/order.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + diff --git a/src/browser/tests/legacy/html/script/order.js b/src/browser/tests/legacy/html/script/order.js new file mode 100644 index 00000000..31e602fc --- /dev/null +++ b/src/browser/tests/legacy/html/script/order.js @@ -0,0 +1,2 @@ +list += 'a'; +testing.expectEqual('a', list); diff --git a/src/browser/tests/legacy/html/script/order_async.js b/src/browser/tests/legacy/html/script/order_async.js new file mode 100644 index 00000000..97c9adac --- /dev/null +++ b/src/browser/tests/legacy/html/script/order_async.js @@ -0,0 +1,3 @@ +list += 'f'; +testing.expectEqual('abcdef', list); + diff --git a/src/browser/tests/legacy/html/script/order_defer.js b/src/browser/tests/legacy/html/script/order_defer.js new file mode 100644 index 00000000..3911b644 --- /dev/null +++ b/src/browser/tests/legacy/html/script/order_defer.js @@ -0,0 +1,2 @@ +list += 'e'; +testing.expectEqual('abcde', list); diff --git a/src/browser/tests/legacy/html/script/script.html b/src/browser/tests/legacy/html/script/script.html new file mode 100644 index 00000000..5049e4bb --- /dev/null +++ b/src/browser/tests/legacy/html/script/script.html @@ -0,0 +1,21 @@ + + + + + + diff --git a/src/browser/tests/legacy/html/select.html b/src/browser/tests/legacy/html/select.html new file mode 100644 index 00000000..f18dfdab --- /dev/null +++ b/src/browser/tests/legacy/html/select.html @@ -0,0 +1,80 @@ + + + +
+ +
+ + + diff --git a/src/browser/tests/legacy/html/slot.html b/src/browser/tests/legacy/html/slot.html new file mode 100644 index 00000000..026e13e0 --- /dev/null +++ b/src/browser/tests/legacy/html/slot.html @@ -0,0 +1,179 @@ + + + + + + +default +

default

+

default

xx other
+More

default2

!!
+ + + + + + + +
hello
+ + +
hello
+ + + + + +
hello
+ diff --git a/src/browser/tests/legacy/html/style.html b/src/browser/tests/legacy/html/style.html new file mode 100644 index 00000000..6463cd81 --- /dev/null +++ b/src/browser/tests/legacy/html/style.html @@ -0,0 +1,8 @@ + + + + diff --git a/src/browser/tests/legacy/html/svg.html b/src/browser/tests/legacy/html/svg.html new file mode 100644 index 00000000..36854649 --- /dev/null +++ b/src/browser/tests/legacy/html/svg.html @@ -0,0 +1,38 @@ + + + + + + OVER 9000!! + + + + + OVER 9000!!! + + + diff --git a/src/browser/tests/legacy/html/template.html b/src/browser/tests/legacy/html/template.html new file mode 100644 index 00000000..058c1dd3 --- /dev/null +++ b/src/browser/tests/legacy/html/template.html @@ -0,0 +1,38 @@ + + + +
+ + + + + + diff --git a/src/browser/tests/legacy/polyfill/webcomponents.html b/src/browser/tests/legacy/polyfill/webcomponents.html new file mode 100644 index 00000000..5854bc82 --- /dev/null +++ b/src/browser/tests/legacy/polyfill/webcomponents.html @@ -0,0 +1,23 @@ + + + +
+ + diff --git a/src/browser/tests/legacy/storage/local_storage.html b/src/browser/tests/legacy/storage/local_storage.html new file mode 100644 index 00000000..4ad0b14f --- /dev/null +++ b/src/browser/tests/legacy/storage/local_storage.html @@ -0,0 +1,29 @@ + + + + diff --git a/src/browser/tests/legacy/streams/readable_stream.html b/src/browser/tests/legacy/streams/readable_stream.html new file mode 100644 index 00000000..a8339cc5 --- /dev/null +++ b/src/browser/tests/legacy/streams/readable_stream.html @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + diff --git a/src/browser/tests/legacy/testing.js b/src/browser/tests/legacy/testing.js new file mode 100644 index 00000000..891d9cc2 --- /dev/null +++ b/src/browser/tests/legacy/testing.js @@ -0,0 +1,206 @@ +// Note: this code tries to make sure that we don't fail to execute a tags we have have had at least + // 1 assertion. This helps ensure that if a script tag fails to execute, + // we'll report an error, even if no assertions failed. + const scripts = document.getElementsByTagName('script'); + for (script of scripts) { + const id = script.id; + if (!id) { + continue; + } + + if (!testing._executed_scripts.has(id)) { + console.warn(`Failed to execute any expectations for `); + throw new Error('Failed'); + } + } + + if (testing._status != 'ok') { + throw new Error(testing._status); + } + } + + // Set expectations to happen at some point in the future. Necessary for + // testing callbacks which will only be executed after page.wait is called. + function eventually(fn) { + // capture the current state (script id, stack) so that, when we do run this + // we can display more meaningful details on failure. + testing._eventually.push([fn, { + script_id: document.currentScript.id, + stack: new Error().stack, + }]); + + _registerErrorCallback(); + } + + async function async(promise, cb) { + const script_id = document.currentScript ? document.currentScript.id : '.\n There should be a eval error printed above this.`, + ); + } + } + + function _equal(a, b) { + if (a === b) { + return true; + } + if (a === null || b === null) { + return false; + } + if (typeof a !== 'object' || typeof b !== 'object') { + return false; + } + + if (Object.keys(a).length != Object.keys(b).length) { + return false; + } + + for (property in a) { + if (b.hasOwnProperty(property) === false) { + return false; + } + if (_equal(a[property], b[property]) === false) { + return false; + } + } + + return true; + } + + window.testing = { + _status: 'empty', + _eventually: [], + _executed_scripts: new Set(), + _captured: null, + skip: skip, + async: async, + assertOk: assertOk, + eventually: eventually, + expectEqual: expectEqual, + expectError: expectError, + withError: withError, + }; + + // Helper, so you can do $(sel) in a test + window.$ = function(sel) { + return document.querySelector(sel); + } + + // Helper, so you can do $$(sel) in a test + window.$$ = function(sel) { + return document.querySelectorAll(sel); + } + + if (!console.lp) { + // make this work in the browser + console.lp = console.log; + } +})(); diff --git a/src/browser/tests/legacy/url/url.html b/src/browser/tests/legacy/url/url.html new file mode 100644 index 00000000..ef770e46 --- /dev/null +++ b/src/browser/tests/legacy/url/url.html @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + diff --git a/src/browser/tests/legacy/url/url_search_params.html b/src/browser/tests/legacy/url/url_search_params.html new file mode 100644 index 00000000..03f22bcd --- /dev/null +++ b/src/browser/tests/legacy/url/url_search_params.html @@ -0,0 +1,94 @@ + + + + + diff --git a/src/browser/tests/legacy/window/frames.html b/src/browser/tests/legacy/window/frames.html new file mode 100644 index 00000000..fc4b7abc --- /dev/null +++ b/src/browser/tests/legacy/window/frames.html @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/src/browser/tests/legacy/window/window.html b/src/browser/tests/legacy/window/window.html new file mode 100644 index 00000000..aac91171 --- /dev/null +++ b/src/browser/tests/legacy/window/window.html @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/browser/tests/legacy/xhr/form_data.html b/src/browser/tests/legacy/xhr/form_data.html new file mode 100644 index 00000000..94bf8a27 --- /dev/null +++ b/src/browser/tests/legacy/xhr/form_data.html @@ -0,0 +1,130 @@ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ diff --git a/src/browser/tests/legacy/xhr/progress_event.html b/src/browser/tests/legacy/xhr/progress_event.html new file mode 100644 index 00000000..4b7f5df4 --- /dev/null +++ b/src/browser/tests/legacy/xhr/progress_event.html @@ -0,0 +1,17 @@ + + + diff --git a/src/browser/tests/legacy/xhr/xhr.html b/src/browser/tests/legacy/xhr/xhr.html new file mode 100644 index 00000000..13ab6216 --- /dev/null +++ b/src/browser/tests/legacy/xhr/xhr.html @@ -0,0 +1,110 @@ + + + + + + + + + + + diff --git a/src/browser/tests/legacy/xmlserializer.html b/src/browser/tests/legacy/xmlserializer.html new file mode 100644 index 00000000..0d3d4628 --- /dev/null +++ b/src/browser/tests/legacy/xmlserializer.html @@ -0,0 +1,8 @@ + + +

And

+ diff --git a/src/browser/webapi/DOMParser.zig b/src/browser/webapi/DOMParser.zig index 35831295..051f004b 100644 --- a/src/browser/webapi/DOMParser.zig +++ b/src/browser/webapi/DOMParser.zig @@ -24,8 +24,6 @@ const Document = @import("Document.zig"); const HTMLDocument = @import("HTMLDocument.zig"); const DOMParser = @This(); -// @ZIGDOM support empty structs -_: u8 = 0, pub fn init() DOMParser { return .{}; @@ -63,6 +61,7 @@ pub const JsApi = struct { pub const name = "DOMParser"; pub const prototype_chain = bridge.prototypeChain(); pub var class_id: bridge.ClassId = undefined; + pub const empty_with_no_proto = true; }; pub const constructor = bridge.constructor(DOMParser.init, .{}); diff --git a/src/browser/webapi/NodeFilter.zig b/src/browser/webapi/NodeFilter.zig index c9fab415..232355dc 100644 --- a/src/browser/webapi/NodeFilter.zig +++ b/src/browser/webapi/NodeFilter.zig @@ -85,6 +85,7 @@ pub const JsApi = struct { pub const name = "NodeFilter"; pub const prototype_chain = bridge.prototypeChain(); pub var class_id: bridge.ClassId = undefined; + pub const empty_with_no_proto = true; }; pub const FILTER_ACCEPT = bridge.property(NodeFilter.FILTER_ACCEPT); diff --git a/src/lightpanda.zig b/src/lightpanda.zig index 57d27793..9c15f722 100644 --- a/src/lightpanda.zig +++ b/src/lightpanda.zig @@ -19,8 +19,12 @@ const std = @import("std"); pub const App = @import("App.zig"); pub const Server = @import("Server.zig"); +pub const Page = @import("browser/Page.zig"); +pub const Browser = @import("browser/Browser.zig"); +pub const Session = @import("browser/Session.zig"); pub const log = @import("log.zig"); +pub const js = @import("browser/js/js.zig"); pub const dump = @import("browser/dump.zig"); pub const build_config = @import("build_config"); @@ -32,7 +36,6 @@ pub const FetchOpts = struct { writer: ?*std.Io.Writer = null, }; pub fn fetch(app: *App, url: [:0]const u8, opts: FetchOpts) !void { - const Browser = @import("browser/Browser.zig"); var browser = try Browser.init(app); defer browser.deinit(); diff --git a/src/main_legacy_test.zig b/src/main_legacy_test.zig new file mode 100644 index 00000000..4dc93e7e --- /dev/null +++ b/src/main_legacy_test.zig @@ -0,0 +1,238 @@ +const std = @import("std"); +const lp = @import("lightpanda"); + +const Allocator = std.mem.Allocator; + +// used in custom panic handler +var current_test: ?[]const u8 = null; + +pub fn main() !void { + var gpa: std.heap.DebugAllocator(.{}) = .init; + defer _ = gpa.deinit(); + + const allocator = gpa.allocator(); + + var http_server = try TestHTTPServer.init(); + defer http_server.deinit(); + + { + var wg: std.Thread.WaitGroup = .{}; + wg.startMany(1); + var thrd = try std.Thread.spawn(.{}, TestHTTPServer.run, .{ &http_server, &wg }); + thrd.detach(); + wg.wait(); + } + lp.log.opts.level = .warn; + + var app = try lp.App.init(allocator, .{ + .run_mode = .serve, + .tls_verify_host = false, + .user_agent = "User-Agent: Lightpanda/1.0 internal-tester", + }); + defer app.deinit(); + + var test_arena = std.heap.ArenaAllocator.init(allocator); + defer test_arena.deinit(); + + var browser = try lp.Browser.init(app); + defer browser.deinit(); + + const session = try browser.newSession(); + + var dir = try std.fs.cwd().openDir("src/browser/tests/legacy/", .{ .iterate = true, .no_follow = true }); + defer dir.close(); + var walker = try dir.walk(allocator); + defer walker.deinit(); + while (try walker.next()) |entry| { + _ = test_arena.reset(.retain_capacity); + if (entry.kind != .file) { + continue; + } + + if (!std.mem.endsWith(u8, entry.basename, ".html")) { + continue; + } + std.debug.print("\n===={s}====\n", .{entry.path}); + current_test = entry.path; + run(test_arena.allocator(), entry.path, session) catch |err| { + std.debug.print("Failure: {s} - {any}\n", .{ entry.path, err }); + }; + } +} + +pub fn run(allocator: Allocator, file: []const u8, session: *lp.Session) !void { + const url = try std.fmt.allocPrintSentinel(allocator, "http://localhost:9589/{s}", .{file}, 0); + + const page = try session.createPage(); + defer session.removePage(); + + const js_context = page.js; + var try_catch: lp.js.TryCatch = undefined; + try_catch.init(js_context); + defer try_catch.deinit(); + + try page.navigate(url, .{}); + session.fetchWait(2000); + + page._session.browser.runMicrotasks(); + page._session.browser.runMessageLoop(); + + js_context.eval("testing.assertOk()", "testing.assertOk()") catch |err| { + const msg = try_catch.err(allocator) catch @errorName(err) orelse "unknown"; + + std.debug.print("{s}: test failure\nError: {s}\n", .{ file, msg }); + return err; + }; +} + +const TestHTTPServer = struct { + shutdown: bool, + dir: std.fs.Dir, + listener: ?std.net.Server, + + pub fn init() !TestHTTPServer { + return .{ + .dir = try std.fs.cwd().openDir("src/browser/tests/legacy/", .{}), + .shutdown = true, + .listener = null, + }; + } + + pub fn deinit(self: *TestHTTPServer) void { + self.shutdown = true; + if (self.listener) |*listener| { + listener.deinit(); + } + self.dir.close(); + } + + pub fn run(self: *TestHTTPServer, wg: *std.Thread.WaitGroup) !void { + const address = try std.net.Address.parseIp("127.0.0.1", 9589); + + self.listener = try address.listen(.{ .reuse_address = true }); + var listener = &self.listener.?; + + wg.finish(); + + while (true) { + const conn = listener.accept() catch |err| { + if (self.shutdown) { + return; + } + return err; + }; + const thrd = try std.Thread.spawn(.{}, handleConnection, .{ self, conn }); + thrd.detach(); + } + } + + fn handleConnection(self: *TestHTTPServer, conn: std.net.Server.Connection) !void { + defer conn.stream.close(); + + var req_buf: [2048]u8 = undefined; + var conn_reader = conn.stream.reader(&req_buf); + var conn_writer = conn.stream.writer(&req_buf); + + var http_server = std.http.Server.init(conn_reader.interface(), &conn_writer.interface); + + while (true) { + var req = http_server.receiveHead() catch |err| switch (err) { + error.ReadFailed => continue, + error.HttpConnectionClosing => continue, + else => { + std.debug.print("Test HTTP Server error: {}\n", .{err}); + return err; + }, + }; + + self.handler(&req) catch |err| { + std.debug.print("test http error '{s}': {}\n", .{ req.head.target, err }); + try req.respond("server error", .{ .status = .internal_server_error }); + return; + }; + } + } + + fn handler(server: *TestHTTPServer, req: *std.http.Server.Request) !void { + const path = req.head.target; + + // strip out leading '/' to make the path relative + const file = try server.dir.openFile(path[1..], .{}); + defer file.close(); + + const stat = try file.stat(); + var send_buffer: [4096]u8 = undefined; + + var res = try req.respondStreaming(&send_buffer, .{ + .content_length = stat.size, + .respond_options = .{ + .extra_headers = &.{ + .{ .name = "content-type", .value = getContentType(path) }, + }, + }, + }); + + var read_buffer: [4096]u8 = undefined; + var reader = file.reader(&read_buffer); + _ = try res.writer.sendFileAll(&reader, .unlimited); + try res.writer.flush(); + try res.end(); + } + + pub fn sendFile(req: *std.http.Server.Request, file_path: []const u8) !void { + var file = std.fs.cwd().openFile(file_path, .{}) catch |err| switch (err) { + error.FileNotFound => return req.respond("server error", .{ .status = .not_found }), + else => return err, + }; + defer file.close(); + + const stat = try file.stat(); + var send_buffer: [4096]u8 = undefined; + + var res = try req.respondStreaming(&send_buffer, .{ + .content_length = stat.size, + .respond_options = .{ + .extra_headers = &.{ + .{ .name = "content-type", .value = getContentType(file_path) }, + }, + }, + }); + + var read_buffer: [4096]u8 = undefined; + var reader = file.reader(&read_buffer); + _ = try res.writer.sendFileAll(&reader, .unlimited); + try res.writer.flush(); + try res.end(); + } + + fn getContentType(file_path: []const u8) []const u8 { + if (std.mem.endsWith(u8, file_path, ".js")) { + return "application/json"; + } + + if (std.mem.endsWith(u8, file_path, ".html")) { + return "text/html"; + } + + if (std.mem.endsWith(u8, file_path, ".htm")) { + return "text/html"; + } + + if (std.mem.endsWith(u8, file_path, ".xml")) { + // some wpt tests do this + return "text/xml"; + } + + std.debug.print("TestHTTPServer asked to serve an unknown file type: {s}\n", .{file_path}); + return "text/html"; + } +}; + +pub const panic = std.debug.FullPanic(struct { + pub fn panicFn(msg: []const u8, first_trace_addr: ?usize) noreturn { + if (current_test) |ct| { + std.debug.print("===panic running: {s}===\n", .{ct}); + } + std.debug.defaultPanic(msg, first_trace_addr); + } +}.panicFn); diff --git a/tests/html/bug-html-parsing-4.html b/tests/html/bug-html-parsing-4.html deleted file mode 100644 index 391ac0c7..00000000 --- a/tests/html/bug-html-parsing-4.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - -