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.
Files changed (64) hide show
  1. package/README.md +6 -6
  2. package/THIRD_PARTY_NOTICES.md +5 -2
  3. package/docs/layout-regressions.md +65 -0
  4. package/docs/pagination-regressions.md +7 -6
  5. package/package.json +1 -1
  6. package/vendor/README.md +35 -0
  7. package/vendor/blitz-dom/Cargo.toml +113 -0
  8. package/vendor/blitz-dom/LICENSE-APACHE +176 -0
  9. package/vendor/blitz-dom/LICENSE-MIT +23 -0
  10. package/vendor/blitz-dom/assets/default.css +1142 -0
  11. package/vendor/blitz-dom/assets/moz-bullet-font.otf +0 -0
  12. package/vendor/blitz-dom/src/accessibility.rs +255 -0
  13. package/vendor/blitz-dom/src/config.rs +97 -0
  14. package/vendor/blitz-dom/src/cssom.rs +971 -0
  15. package/vendor/blitz-dom/src/debug.rs +206 -0
  16. package/vendor/blitz-dom/src/document.rs +3395 -0
  17. package/vendor/blitz-dom/src/events/driver.rs +427 -0
  18. package/vendor/blitz-dom/src/events/focus.rs +40 -0
  19. package/vendor/blitz-dom/src/events/ime.rs +31 -0
  20. package/vendor/blitz-dom/src/events/keyboard.rs +174 -0
  21. package/vendor/blitz-dom/src/events/mod.rs +315 -0
  22. package/vendor/blitz-dom/src/events/pointer.rs +849 -0
  23. package/vendor/blitz-dom/src/font_metrics.rs +177 -0
  24. package/vendor/blitz-dom/src/form.rs +463 -0
  25. package/vendor/blitz-dom/src/html.rs +38 -0
  26. package/vendor/blitz-dom/src/iframe.rs +186 -0
  27. package/vendor/blitz-dom/src/layout/construct.rs +1328 -0
  28. package/vendor/blitz-dom/src/layout/damage.rs +642 -0
  29. package/vendor/blitz-dom/src/layout/inline.rs +1160 -0
  30. package/vendor/blitz-dom/src/layout/list.rs +237 -0
  31. package/vendor/blitz-dom/src/layout/mod.rs +969 -0
  32. package/vendor/blitz-dom/src/layout/paint_tree.rs +462 -0
  33. package/vendor/blitz-dom/src/layout/replaced.rs +439 -0
  34. package/vendor/blitz-dom/src/layout/table.rs +967 -0
  35. package/vendor/blitz-dom/src/layout/text_transform.rs +979 -0
  36. package/vendor/blitz-dom/src/layout/writing_mode.rs +437 -0
  37. package/vendor/blitz-dom/src/lib.rs +160 -0
  38. package/vendor/blitz-dom/src/mutator.rs +1818 -0
  39. package/vendor/blitz-dom/src/net.rs +649 -0
  40. package/vendor/blitz-dom/src/node/attributes.rs +60 -0
  41. package/vendor/blitz-dom/src/node/custom_widget.rs +178 -0
  42. package/vendor/blitz-dom/src/node/element.rs +1106 -0
  43. package/vendor/blitz-dom/src/node/mod.rs +30 -0
  44. package/vendor/blitz-dom/src/node/node.rs +2036 -0
  45. package/vendor/blitz-dom/src/node/scrollbar.rs +237 -0
  46. package/vendor/blitz-dom/src/node/serialize.rs +225 -0
  47. package/vendor/blitz-dom/src/node/stylo_data.rs +142 -0
  48. package/vendor/blitz-dom/src/node/svg.rs +265 -0
  49. package/vendor/blitz-dom/src/node/text.rs +804 -0
  50. package/vendor/blitz-dom/src/query_selector.rs +275 -0
  51. package/vendor/blitz-dom/src/resolve.rs +474 -0
  52. package/vendor/blitz-dom/src/resolved_style.rs +797 -0
  53. package/vendor/blitz-dom/src/scrolling.rs +780 -0
  54. package/vendor/blitz-dom/src/selection.rs +122 -0
  55. package/vendor/blitz-dom/src/stylo.rs +1518 -0
  56. package/vendor/blitz-dom/src/stylo_device.rs +88 -0
  57. package/vendor/blitz-dom/src/stylo_to_cursor_icon.rs +49 -0
  58. package/vendor/blitz-dom/src/stylo_to_kurbo.rs +129 -0
  59. package/vendor/blitz-dom/src/stylo_to_parley.rs +655 -0
  60. package/vendor/blitz-dom/src/traversal.rs +600 -0
  61. package/vendor/blitz-dom/src/tree.rs +136 -0
  62. package/vendor/blitz-dom/src/url.rs +63 -0
  63. package/vendor/blitz-dom/src/util.rs +256 -0
  64. 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
+ }