mirror of
				https://github.com/lightpanda-io/browser.git
				synced 2025-10-30 15:41:48 +00:00 
			
		
		
		
	Merge pull request #1050 from lightpanda-io/event_window_bubble
Event window bubble
This commit is contained in:
		| @@ -148,8 +148,15 @@ pub const EventTarget = struct { | |||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn _dispatchEvent(self: *parser.EventTarget, event: *parser.Event) !bool { |     pub fn _dispatchEvent(self: *parser.EventTarget, event: *parser.Event, page: *Page) !bool { | ||||||
|         return try parser.eventTargetDispatchEvent(self, event); |         const res = try parser.eventTargetDispatchEvent(self, event); | ||||||
|  |  | ||||||
|  |         if (!parser.eventBubbles(event) or parser.eventIsStopped(event)) { | ||||||
|  |             return res; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         try page.window.dispatchForDocumentTarget(event); | ||||||
|  |         return true; | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -517,6 +517,13 @@ pub fn eventStopPropagation(evt: *Event) void { | |||||||
|     std.debug.assert(err == c.DOM_NO_ERR); |     std.debug.assert(err == c.DOM_NO_ERR); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | pub fn eventIsStopped(evt: *Event) bool { | ||||||
|  |     var res: bool = undefined; | ||||||
|  |     const err = c._dom_event_is_stopped(evt, &res); | ||||||
|  |     std.debug.assert(err == c.DOM_NO_ERR); | ||||||
|  |     return res; | ||||||
|  | } | ||||||
|  |  | ||||||
| pub fn eventStopImmediatePropagation(evt: *Event) void { | pub fn eventStopImmediatePropagation(evt: *Event) void { | ||||||
|     const err = c._dom_event_stop_immediate_propagation(evt); |     const err = c._dom_event_stop_immediate_propagation(evt); | ||||||
|     std.debug.assert(err == c.DOM_NO_ERR); |     std.debug.assert(err == c.DOM_NO_ERR); | ||||||
| @@ -604,7 +611,7 @@ fn eventTargetVtable(et: *EventTarget) c.dom_event_target_vtable { | |||||||
|     return @as([*c]const c.dom_event_target_vtable, @ptrCast(vtable_aligned)).*; |     return @as([*c]const c.dom_event_target_vtable, @ptrCast(vtable_aligned)).*; | ||||||
| } | } | ||||||
|  |  | ||||||
| pub inline fn toEventTarget(comptime T: type, v: *T) *EventTarget { | pub fn toEventTarget(comptime T: type, v: *T) *EventTarget { | ||||||
|     if (comptime eventTargetTBaseFieldName(T)) |field| { |     if (comptime eventTargetTBaseFieldName(T)) |field| { | ||||||
|         const et_aligned: *align(@alignOf(EventTarget)) EventTargetTBase = @alignCast(&@field(v, field)); |         const et_aligned: *align(@alignOf(EventTarget)) EventTargetTBase = @alignCast(&@field(v, field)); | ||||||
|         return @as(*EventTarget, @ptrCast(et_aligned)); |         return @as(*EventTarget, @ptrCast(et_aligned)); | ||||||
|   | |||||||
| @@ -13,4 +13,12 @@ | |||||||
|  |  | ||||||
|   el.dispatchEvent(new CustomEvent('c2', {detail: {over: 9000}})); |   el.dispatchEvent(new CustomEvent('c2', {detail: {over: 9000}})); | ||||||
|   testing.expectEqual("c2-9000", capture); |   testing.expectEqual("c2-9000", capture); | ||||||
|  |  | ||||||
|  |   let window_calls = 0; | ||||||
|  |   window.addEventListener('c1', () => { | ||||||
|  |     window_calls += 1; | ||||||
|  |   }); | ||||||
|  |  | ||||||
|  |   el.dispatchEvent(new CustomEvent('c1', {bubbles: true})); | ||||||
|  |   testing.expectEqual(1, window_calls); | ||||||
| </script> | </script> | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								vendor/netsurf/libdom
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								vendor/netsurf/libdom
									
									
									
									
										vendored
									
									
								
							 Submodule vendor/netsurf/libdom updated: 0a6ba2c73d...a251317928
									
								
							
		Reference in New Issue
	
	Block a user
	 Karl Seguin
					Karl Seguin