mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-28 22:53:28 +00:00
Merge pull request #1155 from lightpanda-io/composition_event
add CompositionEvent
This commit is contained in:
@@ -227,7 +227,6 @@ pub const TreeWalker = struct {
|
|||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
if (!result.should_descend) {
|
if (!result.should_descend) {
|
||||||
// This is an .accept node - return it
|
// This is an .accept node - return it
|
||||||
self.current_node = result.node;
|
self.current_node = result.node;
|
||||||
|
|||||||
57
src/browser/events/composition_event.zig
Normal file
57
src/browser/events/composition_event.zig
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
// Copyright (C) 2023-2025 Lightpanda (Selecy SAS)
|
||||||
|
//
|
||||||
|
// Francis Bouvier <francis@lightpanda.io>
|
||||||
|
// Pierre Tachoire <pierre@lightpanda.io>
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
const parser = @import("../netsurf.zig");
|
||||||
|
|
||||||
|
// https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent
|
||||||
|
pub const CompositionEvent = struct {
|
||||||
|
data: []const u8,
|
||||||
|
proto: parser.Event,
|
||||||
|
|
||||||
|
pub const union_make_copy = true;
|
||||||
|
pub const prototype = *parser.Event;
|
||||||
|
|
||||||
|
pub const ConstructorOptions = struct {
|
||||||
|
data: []const u8 = "",
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn constructor(event_type: []const u8, options_: ?ConstructorOptions) !CompositionEvent {
|
||||||
|
const options: ConstructorOptions = options_ orelse .{};
|
||||||
|
|
||||||
|
const event = try parser.eventCreate();
|
||||||
|
defer parser.eventDestroy(event);
|
||||||
|
try parser.eventInit(event, event_type, .{});
|
||||||
|
parser.eventSetInternalType(event, .composition_event);
|
||||||
|
|
||||||
|
return .{
|
||||||
|
.proto = event.*,
|
||||||
|
.data = options.data,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_data(self: *const CompositionEvent) []const u8 {
|
||||||
|
return self.data;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const testing = @import("../../testing.zig");
|
||||||
|
test "Browser: Events.Composition" {
|
||||||
|
try testing.htmlRunner("events/composition.html");
|
||||||
|
}
|
||||||
@@ -37,6 +37,7 @@ const KeyboardEvent = @import("keyboard_event.zig").KeyboardEvent;
|
|||||||
const ErrorEvent = @import("../html/error_event.zig").ErrorEvent;
|
const ErrorEvent = @import("../html/error_event.zig").ErrorEvent;
|
||||||
const MessageEvent = @import("../dom/MessageChannel.zig").MessageEvent;
|
const MessageEvent = @import("../dom/MessageChannel.zig").MessageEvent;
|
||||||
const PopStateEvent = @import("../html/History.zig").PopStateEvent;
|
const PopStateEvent = @import("../html/History.zig").PopStateEvent;
|
||||||
|
const CompositionEvent = @import("composition_event.zig").CompositionEvent;
|
||||||
|
|
||||||
// Event interfaces
|
// Event interfaces
|
||||||
pub const Interfaces = .{
|
pub const Interfaces = .{
|
||||||
@@ -48,6 +49,7 @@ pub const Interfaces = .{
|
|||||||
ErrorEvent,
|
ErrorEvent,
|
||||||
MessageEvent,
|
MessageEvent,
|
||||||
PopStateEvent,
|
PopStateEvent,
|
||||||
|
CompositionEvent,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Union = generate.Union(Interfaces);
|
pub const Union = generate.Union(Interfaces);
|
||||||
@@ -76,6 +78,7 @@ pub const Event = struct {
|
|||||||
.message_event => .{ .MessageEvent = @as(*MessageEvent, @ptrCast(evt)).* },
|
.message_event => .{ .MessageEvent = @as(*MessageEvent, @ptrCast(evt)).* },
|
||||||
.keyboard_event => .{ .KeyboardEvent = @as(*parser.KeyboardEvent, @ptrCast(evt)) },
|
.keyboard_event => .{ .KeyboardEvent = @as(*parser.KeyboardEvent, @ptrCast(evt)) },
|
||||||
.pop_state => .{ .PopStateEvent = @as(*PopStateEvent, @ptrCast(evt)).* },
|
.pop_state => .{ .PopStateEvent = @as(*PopStateEvent, @ptrCast(evt)).* },
|
||||||
|
.composition_event => .{ .CompositionEvent = (@as(*CompositionEvent, @fieldParentPtr("proto", evt))).* },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -559,6 +559,7 @@ pub const EventType = enum(u8) {
|
|||||||
message_event = 7,
|
message_event = 7,
|
||||||
keyboard_event = 8,
|
keyboard_event = 8,
|
||||||
pop_state = 9,
|
pop_state = 9,
|
||||||
|
composition_event = 10,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const MutationEvent = c.dom_mutation_event;
|
pub const MutationEvent = c.dom_mutation_event;
|
||||||
|
|||||||
36
src/tests/events/composition.html
Normal file
36
src/tests/events/composition.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<script src="../testing.js"></script>
|
||||||
|
|
||||||
|
<script id=noNata>
|
||||||
|
{
|
||||||
|
let event = new CompositionEvent("test", {});
|
||||||
|
testing.expectEqual(true, event instanceof CompositionEvent);
|
||||||
|
testing.expectEqual(true, event instanceof Event);
|
||||||
|
|
||||||
|
testing.expectEqual("test", event.type);
|
||||||
|
testing.expectEqual("", event.data);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script id=withData>
|
||||||
|
{
|
||||||
|
let event = new CompositionEvent("test2", {data: "over 9000!"});
|
||||||
|
testing.expectEqual("test2", event.type);
|
||||||
|
testing.expectEqual("over 9000!", event.data);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script id=dispatch>
|
||||||
|
{
|
||||||
|
let called = 0;
|
||||||
|
document.addEventListener('CE', (e) => {
|
||||||
|
testing.expectEqual('test-data', e.data);
|
||||||
|
testing.expectEqual(true, e instanceof CompositionEvent);
|
||||||
|
called += 1
|
||||||
|
});
|
||||||
|
|
||||||
|
document.dispatchEvent(new CompositionEvent('CE', {data: 'test-data'}));
|
||||||
|
testing.expectEqual(1, called);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
Reference in New Issue
Block a user