blitz-pdf 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/THIRD_PARTY_NOTICES.md +5 -2
- package/docs/layout-regressions.md +65 -0
- package/docs/pagination-regressions.md +7 -6
- package/package.json +1 -1
- package/vendor/README.md +35 -0
- package/vendor/blitz-dom/Cargo.toml +113 -0
- package/vendor/blitz-dom/LICENSE-APACHE +176 -0
- package/vendor/blitz-dom/LICENSE-MIT +23 -0
- package/vendor/blitz-dom/assets/default.css +1142 -0
- package/vendor/blitz-dom/assets/moz-bullet-font.otf +0 -0
- package/vendor/blitz-dom/src/accessibility.rs +255 -0
- package/vendor/blitz-dom/src/config.rs +97 -0
- package/vendor/blitz-dom/src/cssom.rs +971 -0
- package/vendor/blitz-dom/src/debug.rs +206 -0
- package/vendor/blitz-dom/src/document.rs +3395 -0
- package/vendor/blitz-dom/src/events/driver.rs +427 -0
- package/vendor/blitz-dom/src/events/focus.rs +40 -0
- package/vendor/blitz-dom/src/events/ime.rs +31 -0
- package/vendor/blitz-dom/src/events/keyboard.rs +174 -0
- package/vendor/blitz-dom/src/events/mod.rs +315 -0
- package/vendor/blitz-dom/src/events/pointer.rs +849 -0
- package/vendor/blitz-dom/src/font_metrics.rs +177 -0
- package/vendor/blitz-dom/src/form.rs +463 -0
- package/vendor/blitz-dom/src/html.rs +38 -0
- package/vendor/blitz-dom/src/iframe.rs +186 -0
- package/vendor/blitz-dom/src/layout/construct.rs +1328 -0
- package/vendor/blitz-dom/src/layout/damage.rs +642 -0
- package/vendor/blitz-dom/src/layout/inline.rs +1160 -0
- package/vendor/blitz-dom/src/layout/list.rs +237 -0
- package/vendor/blitz-dom/src/layout/mod.rs +969 -0
- package/vendor/blitz-dom/src/layout/paint_tree.rs +462 -0
- package/vendor/blitz-dom/src/layout/replaced.rs +439 -0
- package/vendor/blitz-dom/src/layout/table.rs +967 -0
- package/vendor/blitz-dom/src/layout/text_transform.rs +979 -0
- package/vendor/blitz-dom/src/layout/writing_mode.rs +437 -0
- package/vendor/blitz-dom/src/lib.rs +160 -0
- package/vendor/blitz-dom/src/mutator.rs +1818 -0
- package/vendor/blitz-dom/src/net.rs +649 -0
- package/vendor/blitz-dom/src/node/attributes.rs +60 -0
- package/vendor/blitz-dom/src/node/custom_widget.rs +178 -0
- package/vendor/blitz-dom/src/node/element.rs +1106 -0
- package/vendor/blitz-dom/src/node/mod.rs +30 -0
- package/vendor/blitz-dom/src/node/node.rs +2036 -0
- package/vendor/blitz-dom/src/node/scrollbar.rs +237 -0
- package/vendor/blitz-dom/src/node/serialize.rs +225 -0
- package/vendor/blitz-dom/src/node/stylo_data.rs +142 -0
- package/vendor/blitz-dom/src/node/svg.rs +265 -0
- package/vendor/blitz-dom/src/node/text.rs +804 -0
- package/vendor/blitz-dom/src/query_selector.rs +275 -0
- package/vendor/blitz-dom/src/resolve.rs +474 -0
- package/vendor/blitz-dom/src/resolved_style.rs +797 -0
- package/vendor/blitz-dom/src/scrolling.rs +780 -0
- package/vendor/blitz-dom/src/selection.rs +122 -0
- package/vendor/blitz-dom/src/stylo.rs +1518 -0
- package/vendor/blitz-dom/src/stylo_device.rs +88 -0
- package/vendor/blitz-dom/src/stylo_to_cursor_icon.rs +49 -0
- package/vendor/blitz-dom/src/stylo_to_kurbo.rs +129 -0
- package/vendor/blitz-dom/src/stylo_to_parley.rs +655 -0
- package/vendor/blitz-dom/src/traversal.rs +600 -0
- package/vendor/blitz-dom/src/tree.rs +136 -0
- package/vendor/blitz-dom/src/url.rs +63 -0
- package/vendor/blitz-dom/src/util.rs +256 -0
- package/wasm/blitz_pdf_bg.wasm +0 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
mod driver;
|
|
2
|
+
mod focus;
|
|
3
|
+
mod ime;
|
|
4
|
+
mod keyboard;
|
|
5
|
+
mod pointer;
|
|
6
|
+
|
|
7
|
+
use crate::util::Point;
|
|
8
|
+
use blitz_traits::events::{DomEvent, DomEventData, PointerCoords, UiEvent};
|
|
9
|
+
pub use driver::{EventDriver, EventHandler, NoopEventHandler};
|
|
10
|
+
use focus::generate_focus_events;
|
|
11
|
+
pub(crate) use ime::handle_ime_event;
|
|
12
|
+
use keyboard::{KeyboardOrTextInputEvent, handle_key_or_input_event};
|
|
13
|
+
pub(crate) use pointer::DragMode;
|
|
14
|
+
use pointer::{handle_click, handle_pointerdown, handle_pointermove, handle_pointerup};
|
|
15
|
+
|
|
16
|
+
use crate::{BaseDocument, events::pointer::handle_wheel};
|
|
17
|
+
|
|
18
|
+
fn adjust_coords_for_subdocument(
|
|
19
|
+
coords: &mut PointerCoords,
|
|
20
|
+
offset: Point<f32>,
|
|
21
|
+
viewport_scroll: Point<f64>,
|
|
22
|
+
) {
|
|
23
|
+
coords.page_x -= offset.x - viewport_scroll.x as f32;
|
|
24
|
+
coords.page_y -= offset.y - viewport_scroll.y as f32;
|
|
25
|
+
coords.client_x -= offset.x;
|
|
26
|
+
coords.client_y -= offset.y;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
fn map_dom_event_to_ui_event(
|
|
30
|
+
event: &mut DomEvent,
|
|
31
|
+
node_offset: Point<f32>,
|
|
32
|
+
viewport_scroll: Point<f64>,
|
|
33
|
+
) -> Option<UiEvent> {
|
|
34
|
+
// TODO: eliminate clone
|
|
35
|
+
match event.data.clone() {
|
|
36
|
+
DomEventData::PointerMove(mut event) => {
|
|
37
|
+
adjust_coords_for_subdocument(&mut event.coords, node_offset, viewport_scroll);
|
|
38
|
+
Some(UiEvent::PointerMove(event))
|
|
39
|
+
}
|
|
40
|
+
DomEventData::PointerDown(mut event) => {
|
|
41
|
+
adjust_coords_for_subdocument(&mut event.coords, node_offset, viewport_scroll);
|
|
42
|
+
Some(UiEvent::PointerDown(event))
|
|
43
|
+
}
|
|
44
|
+
DomEventData::PointerUp(mut event) => {
|
|
45
|
+
adjust_coords_for_subdocument(&mut event.coords, node_offset, viewport_scroll);
|
|
46
|
+
Some(UiEvent::PointerUp(event))
|
|
47
|
+
}
|
|
48
|
+
DomEventData::PointerCancel(mut event) => {
|
|
49
|
+
adjust_coords_for_subdocument(&mut event.coords, node_offset, viewport_scroll);
|
|
50
|
+
Some(UiEvent::PointerCancel(event))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The sub-document receives no further move events once the pointer
|
|
54
|
+
// has left it, so the leave must be forwarded for it to end its hover
|
|
55
|
+
DomEventData::PointerLeave(mut event) => {
|
|
56
|
+
adjust_coords_for_subdocument(&mut event.coords, node_offset, viewport_scroll);
|
|
57
|
+
Some(UiEvent::PointerLeave(event))
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Enter/over/out events will be recreated by sub-document's event driver
|
|
61
|
+
// based move events
|
|
62
|
+
DomEventData::PointerEnter(_) => None,
|
|
63
|
+
DomEventData::PointerOver(_) => None,
|
|
64
|
+
DomEventData::PointerOut(_) => None,
|
|
65
|
+
|
|
66
|
+
// Mouse events will be recreated by sub-document's event driver
|
|
67
|
+
// based pointer events
|
|
68
|
+
DomEventData::MouseMove(_) => None,
|
|
69
|
+
DomEventData::MouseDown(_) => None,
|
|
70
|
+
DomEventData::MouseUp(_) => None,
|
|
71
|
+
DomEventData::MouseEnter(_) => None,
|
|
72
|
+
DomEventData::MouseLeave(_) => None,
|
|
73
|
+
DomEventData::MouseOver(_) => None,
|
|
74
|
+
DomEventData::MouseOut(_) => None,
|
|
75
|
+
|
|
76
|
+
// Touch events will be recreated by sub-document's event driver
|
|
77
|
+
// based pointer events
|
|
78
|
+
DomEventData::TouchStart(_) => None,
|
|
79
|
+
DomEventData::TouchMove(_) => None,
|
|
80
|
+
DomEventData::TouchEnd(_) => None,
|
|
81
|
+
DomEventData::TouchCancel(_) => None,
|
|
82
|
+
|
|
83
|
+
DomEventData::KeyDown(data) => Some(UiEvent::KeyDown(data)),
|
|
84
|
+
DomEventData::KeyUp(data) => Some(UiEvent::KeyUp(data)),
|
|
85
|
+
DomEventData::Ime(data) => Some(UiEvent::Ime(data)),
|
|
86
|
+
DomEventData::AppleStandardKeybinding(data) => Some(UiEvent::AppleStandardKeybinding(data)),
|
|
87
|
+
|
|
88
|
+
DomEventData::KeyPress(_) => None,
|
|
89
|
+
DomEventData::Click(_) => None,
|
|
90
|
+
DomEventData::ContextMenu(_) => None,
|
|
91
|
+
DomEventData::DoubleClick(_) => None,
|
|
92
|
+
DomEventData::Input(_) => None,
|
|
93
|
+
DomEventData::Wheel(data) => Some(UiEvent::Wheel(data)),
|
|
94
|
+
DomEventData::Scroll(_) => None,
|
|
95
|
+
DomEventData::Focus(_) => None,
|
|
96
|
+
DomEventData::Blur(_) => None,
|
|
97
|
+
DomEventData::FocusIn(_) => None,
|
|
98
|
+
DomEventData::FocusOut(_) => None,
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
pub(crate) fn handle_dom_event<F: FnMut(DomEvent)>(
|
|
103
|
+
doc: &mut BaseDocument,
|
|
104
|
+
event: &mut DomEvent,
|
|
105
|
+
mut dispatch_event: F,
|
|
106
|
+
) {
|
|
107
|
+
let target_node_id = event.target;
|
|
108
|
+
let node = &mut doc.nodes[target_node_id];
|
|
109
|
+
let pos = node.absolute_position(0.0, 0.0);
|
|
110
|
+
|
|
111
|
+
// Whether this event can move the caret/selection (or change the text) of a text input,
|
|
112
|
+
// in which case we need to update the input's scroll offset afterwards.
|
|
113
|
+
let may_move_text_input_caret = match &event.data {
|
|
114
|
+
DomEventData::KeyDown(_)
|
|
115
|
+
| DomEventData::AppleStandardKeybinding(_)
|
|
116
|
+
| DomEventData::Ime(_)
|
|
117
|
+
| DomEventData::Click(_) => true,
|
|
118
|
+
DomEventData::PointerDown(event) | DomEventData::PointerMove(event) => {
|
|
119
|
+
!event.buttons.is_empty()
|
|
120
|
+
}
|
|
121
|
+
_ => false,
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
// Handle event forwarding for sub-document
|
|
125
|
+
if let Some(sub_doc) = node.subdoc_mut() {
|
|
126
|
+
let viewport_scroll = sub_doc.inner().viewport_scroll();
|
|
127
|
+
|
|
128
|
+
let set_focus = matches!(
|
|
129
|
+
&event.data,
|
|
130
|
+
DomEventData::PointerDown(_) | DomEventData::PointerUp(_)
|
|
131
|
+
);
|
|
132
|
+
let ui_event = map_dom_event_to_ui_event(event, pos, viewport_scroll);
|
|
133
|
+
|
|
134
|
+
if let Some(ui_event) = ui_event {
|
|
135
|
+
sub_doc.handle_ui_event(ui_event);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if set_focus {
|
|
139
|
+
generate_focus_events(
|
|
140
|
+
doc,
|
|
141
|
+
&mut |doc| {
|
|
142
|
+
doc.set_focus_to(target_node_id);
|
|
143
|
+
},
|
|
144
|
+
&mut dispatch_event,
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Handle event forwarding for custom widget
|
|
152
|
+
#[cfg(feature = "custom-widget")]
|
|
153
|
+
if let Some(widget_data) = node
|
|
154
|
+
.element_data_mut()
|
|
155
|
+
.and_then(|el| el.custom_widget_data_mut())
|
|
156
|
+
{
|
|
157
|
+
let set_focus = matches!(
|
|
158
|
+
&event.data,
|
|
159
|
+
DomEventData::PointerDown(_) | DomEventData::PointerUp(_)
|
|
160
|
+
);
|
|
161
|
+
let viewport_scroll = Point { x: 0.0, y: 0.0 };
|
|
162
|
+
let ui_event = map_dom_event_to_ui_event(event, pos, viewport_scroll);
|
|
163
|
+
|
|
164
|
+
if let Some(ui_event) = ui_event {
|
|
165
|
+
widget_data.widget.handle_event(&ui_event);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if set_focus {
|
|
169
|
+
generate_focus_events(
|
|
170
|
+
doc,
|
|
171
|
+
&mut |doc| {
|
|
172
|
+
doc.set_focus_to(target_node_id);
|
|
173
|
+
},
|
|
174
|
+
&mut dispatch_event,
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
match &event.data {
|
|
182
|
+
DomEventData::PointerMove(event) => {
|
|
183
|
+
let changed = handle_pointermove(doc, target_node_id, event, dispatch_event);
|
|
184
|
+
if changed {
|
|
185
|
+
doc.shell_provider.request_redraw();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
DomEventData::MouseMove(_) => {
|
|
189
|
+
// Do nothing (handled in PointerMove)
|
|
190
|
+
}
|
|
191
|
+
DomEventData::PointerDown(event) => {
|
|
192
|
+
handle_pointerdown(
|
|
193
|
+
doc,
|
|
194
|
+
target_node_id,
|
|
195
|
+
event.page_x(),
|
|
196
|
+
event.page_y(),
|
|
197
|
+
event.button,
|
|
198
|
+
event.mods,
|
|
199
|
+
&mut dispatch_event,
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
DomEventData::MouseDown(_) => {
|
|
203
|
+
// Do nothing (handled in PointerDown)
|
|
204
|
+
}
|
|
205
|
+
DomEventData::PointerUp(event) => {
|
|
206
|
+
handle_pointerup(doc, target_node_id, event, dispatch_event);
|
|
207
|
+
}
|
|
208
|
+
DomEventData::MouseUp(_) => {
|
|
209
|
+
// Do nothing (handled in PointerUp)
|
|
210
|
+
}
|
|
211
|
+
DomEventData::PointerCancel(_) => {
|
|
212
|
+
// Do nothing (active state is reset in the event driver)
|
|
213
|
+
}
|
|
214
|
+
DomEventData::Click(event) => {
|
|
215
|
+
handle_click(doc, target_node_id, event, &mut dispatch_event);
|
|
216
|
+
}
|
|
217
|
+
DomEventData::KeyDown(event) => {
|
|
218
|
+
handle_key_or_input_event(
|
|
219
|
+
doc,
|
|
220
|
+
target_node_id,
|
|
221
|
+
KeyboardOrTextInputEvent::KeyPress(event.clone()),
|
|
222
|
+
dispatch_event,
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
DomEventData::KeyPress(_) => {
|
|
226
|
+
// Do nothing (no default action)
|
|
227
|
+
}
|
|
228
|
+
DomEventData::KeyUp(_) => {
|
|
229
|
+
// Do nothing (no default action)
|
|
230
|
+
}
|
|
231
|
+
DomEventData::AppleStandardKeybinding(event) => {
|
|
232
|
+
handle_key_or_input_event(
|
|
233
|
+
doc,
|
|
234
|
+
target_node_id,
|
|
235
|
+
KeyboardOrTextInputEvent::AppleStandardKeyBinding(event.clone()),
|
|
236
|
+
dispatch_event,
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
DomEventData::Ime(event) => {
|
|
240
|
+
handle_ime_event(doc, event.clone(), dispatch_event);
|
|
241
|
+
}
|
|
242
|
+
DomEventData::Input(_) => {
|
|
243
|
+
// Do nothing (no default action)
|
|
244
|
+
}
|
|
245
|
+
DomEventData::ContextMenu(_) => {
|
|
246
|
+
// TODO: Open context menu
|
|
247
|
+
}
|
|
248
|
+
DomEventData::DoubleClick(_) => {
|
|
249
|
+
// Do nothing (no default action)
|
|
250
|
+
}
|
|
251
|
+
DomEventData::PointerEnter(_) => {
|
|
252
|
+
// Do nothing (no default action)
|
|
253
|
+
}
|
|
254
|
+
DomEventData::PointerLeave(_) => {
|
|
255
|
+
// Do nothing (no default action)
|
|
256
|
+
}
|
|
257
|
+
DomEventData::PointerOver(_) => {
|
|
258
|
+
// Do nothing (no default action)
|
|
259
|
+
}
|
|
260
|
+
DomEventData::PointerOut(_) => {
|
|
261
|
+
// Do nothing (no default action)
|
|
262
|
+
}
|
|
263
|
+
DomEventData::MouseEnter(_) => {
|
|
264
|
+
// Do nothing (no default action)
|
|
265
|
+
}
|
|
266
|
+
DomEventData::MouseLeave(_) => {
|
|
267
|
+
// Do nothing (no default action)
|
|
268
|
+
}
|
|
269
|
+
DomEventData::MouseOver(_) => {
|
|
270
|
+
// Do nothing (no default action)
|
|
271
|
+
}
|
|
272
|
+
DomEventData::MouseOut(_) => {
|
|
273
|
+
// Do nothing (no default action)
|
|
274
|
+
}
|
|
275
|
+
DomEventData::TouchStart(_) => {
|
|
276
|
+
// Do nothing (default action handled via PointerDown)
|
|
277
|
+
}
|
|
278
|
+
DomEventData::TouchMove(_) => {
|
|
279
|
+
// Do nothing (default action handled via PointerMove)
|
|
280
|
+
}
|
|
281
|
+
DomEventData::TouchEnd(_) => {
|
|
282
|
+
// Do nothing (default action handled via PointerUp)
|
|
283
|
+
}
|
|
284
|
+
DomEventData::TouchCancel(_) => {
|
|
285
|
+
// Do nothing (default action handled via PointerCancel)
|
|
286
|
+
}
|
|
287
|
+
DomEventData::Scroll(_) => {
|
|
288
|
+
// Handled elsewhere
|
|
289
|
+
}
|
|
290
|
+
DomEventData::Wheel(event) => {
|
|
291
|
+
handle_wheel(doc, target_node_id, event.clone(), dispatch_event);
|
|
292
|
+
}
|
|
293
|
+
DomEventData::Focus(_) => {
|
|
294
|
+
// Do nothing (no default action)
|
|
295
|
+
}
|
|
296
|
+
DomEventData::Blur(_) => {
|
|
297
|
+
// Do nothing (no default action)
|
|
298
|
+
}
|
|
299
|
+
DomEventData::FocusIn(_) => {
|
|
300
|
+
// Do nothing (no default action)
|
|
301
|
+
}
|
|
302
|
+
DomEventData::FocusOut(_) => {
|
|
303
|
+
// Do nothing (no default action)
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Keep the focused text input scrolled so that its caret stays visible. Keyboard/IME events
|
|
308
|
+
// target the focused input, and pointer events that hit a text input focus it, so the
|
|
309
|
+
// focused node is the input whose caret may have moved.
|
|
310
|
+
if may_move_text_input_caret {
|
|
311
|
+
if let Some(focus_id) = doc.focus_node_id {
|
|
312
|
+
doc.clamp_text_input_scroll(focus_id);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|