diff --git a/src/browser/Page.zig b/src/browser/Page.zig index 48daeeb5..aab9b6f7 100644 --- a/src/browser/Page.zig +++ b/src/browser/Page.zig @@ -100,6 +100,7 @@ _script_manager: ScriptManager, // List of active MutationObservers _mutation_observers: std.ArrayList(*MutationObserver) = .{}, _mutation_delivery_scheduled: bool = false, +_mutation_delivery_depth: u32 = 0, // List of active IntersectionObservers _intersection_observers: std.ArrayList(*IntersectionObserver) = .{}, @@ -244,6 +245,7 @@ fn reset(self: *Page, comptime initializing: bool) !void { self._mutation_observers = .{}; self._mutation_delivery_scheduled = false; + self._mutation_delivery_depth = 0; self._intersection_observers = .{}; self._intersection_delivery_scheduled = false; self._customized_builtin_definitions = .{}; @@ -849,6 +851,18 @@ pub fn deliverMutations(self: *Page) void { } self._mutation_delivery_scheduled = false; + self._mutation_delivery_depth += 1; + defer if (!self._mutation_delivery_scheduled) { + // reset the depth once nothing is left to be scheduled + self._mutation_delivery_depth = 0; + }; + + if (self._mutation_delivery_depth > 100) { + log.err(.page, "page.MutationLimit", .{}); + self._mutation_delivery_depth = 0; + return; + } + // Iterate backwards to handle observers that disconnect during their callback var i = self._mutation_observers.items.len; while (i > 0) { diff --git a/src/browser/tests/legacy/dom/mutation_observer.html b/src/browser/tests/legacy/dom/mutation_observer.html deleted file mode 100644 index f67cb924..00000000 --- a/src/browser/tests/legacy/dom/mutation_observer.html +++ /dev/null @@ -1,76 +0,0 @@ - -
-

And

-

And

-

And

- - - - -