blitz-pdf 0.0.0-stage → 0.1.0

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 (370) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +355 -2
  3. package/THIRD_PARTY_NOTICES.md +25 -0
  4. package/assets/icon.svg +4 -0
  5. package/dist/api.d.ts +7 -0
  6. package/dist/api.d.ts.map +1 -0
  7. package/dist/api.js +46 -0
  8. package/dist/api.js.map +1 -0
  9. package/dist/assets.d.ts +7 -0
  10. package/dist/assets.d.ts.map +1 -0
  11. package/dist/assets.js +52 -0
  12. package/dist/assets.js.map +1 -0
  13. package/dist/browser.d.ts +3 -0
  14. package/dist/browser.d.ts.map +1 -0
  15. package/dist/browser.js +3 -0
  16. package/dist/browser.js.map +1 -0
  17. package/dist/node.d.ts +3 -0
  18. package/dist/node.d.ts.map +1 -0
  19. package/dist/node.js +10 -0
  20. package/dist/node.js.map +1 -0
  21. package/dist/options.d.ts +24 -0
  22. package/dist/options.d.ts.map +1 -0
  23. package/dist/options.js +135 -0
  24. package/dist/options.js.map +1 -0
  25. package/dist/types.d.ts +51 -0
  26. package/dist/types.d.ts.map +1 -0
  27. package/dist/types.js +2 -0
  28. package/dist/types.js.map +1 -0
  29. package/examples/bun.ts +8 -0
  30. package/examples/german-invoice/README.md +70 -0
  31. package/examples/german-invoice/data.mjs +83 -0
  32. package/examples/german-invoice/invoice.css +59 -0
  33. package/examples/german-invoice/template.mjs +49 -0
  34. package/examples/german-invoice.mjs +20 -0
  35. package/examples/invoice.html +29 -0
  36. package/examples/node.mjs +8 -0
  37. package/examples/pagination.html +40 -0
  38. package/examples/pagination.mjs +8 -0
  39. package/licenses/DejaVu.txt +187 -0
  40. package/licenses/RUST_DEPENDENCIES.txt +11577 -0
  41. package/package.json +89 -4
  42. package/src/api.ts +44 -0
  43. package/src/assets.ts +43 -0
  44. package/src/browser.ts +6 -0
  45. package/src/node.ts +12 -0
  46. package/src/options.ts +101 -0
  47. package/src/types.ts +49 -0
  48. package/vendor/README.md +17 -0
  49. package/vendor/stylo/.cargo-ok +1 -0
  50. package/vendor/stylo/.cargo_vcs_info.json +6 -0
  51. package/vendor/stylo/Cargo.lock +1485 -0
  52. package/vendor/stylo/Cargo.toml +274 -0
  53. package/vendor/stylo/LICENSE +373 -0
  54. package/vendor/stylo/README.md +6 -0
  55. package/vendor/stylo/applicable_declarations.rs +328 -0
  56. package/vendor/stylo/author_styles.rs +79 -0
  57. package/vendor/stylo/bezier.rs +176 -0
  58. package/vendor/stylo/bloom.rs +414 -0
  59. package/vendor/stylo/build.rs +91 -0
  60. package/vendor/stylo/build_gecko.rs +393 -0
  61. package/vendor/stylo/color/color_function.rs +601 -0
  62. package/vendor/stylo/color/component.rs +207 -0
  63. package/vendor/stylo/color/convert.rs +935 -0
  64. package/vendor/stylo/color/gamut/raytrace.rs +265 -0
  65. package/vendor/stylo/color/gamut.rs +227 -0
  66. package/vendor/stylo/color/mix.rs +645 -0
  67. package/vendor/stylo/color/mod.rs +750 -0
  68. package/vendor/stylo/color/parsing.rs +770 -0
  69. package/vendor/stylo/color/to_css.rs +297 -0
  70. package/vendor/stylo/context.rs +716 -0
  71. package/vendor/stylo/counter_style/mod.rs +754 -0
  72. package/vendor/stylo/counter_style/predefined.rs +61 -0
  73. package/vendor/stylo/counter_style/update_predefined.py +35 -0
  74. package/vendor/stylo/custom_properties.rs +2023 -0
  75. package/vendor/stylo/custom_properties_map.rs +220 -0
  76. package/vendor/stylo/data.rs +693 -0
  77. package/vendor/stylo/device/gecko.rs +486 -0
  78. package/vendor/stylo/device/mod.rs +304 -0
  79. package/vendor/stylo/device/servo.rs +507 -0
  80. package/vendor/stylo/dom.rs +1164 -0
  81. package/vendor/stylo/dom_apis.rs +937 -0
  82. package/vendor/stylo/driver.rs +172 -0
  83. package/vendor/stylo/error_reporting.rs +484 -0
  84. package/vendor/stylo/font_face.rs +558 -0
  85. package/vendor/stylo/font_metrics.rs +124 -0
  86. package/vendor/stylo/gecko/anon_boxes.toml +113 -0
  87. package/vendor/stylo/gecko/arc_types.rs +211 -0
  88. package/vendor/stylo/gecko/conversions.rs +59 -0
  89. package/vendor/stylo/gecko/data.rs +222 -0
  90. package/vendor/stylo/gecko/media_features.rs +971 -0
  91. package/vendor/stylo/gecko/mod.rs +20 -0
  92. package/vendor/stylo/gecko/non_ts_pseudo_class_list.rs +119 -0
  93. package/vendor/stylo/gecko/pseudo_element.rs +640 -0
  94. package/vendor/stylo/gecko/pseudo_element_definition.mako.rs +298 -0
  95. package/vendor/stylo/gecko/pseudo_elements.py +137 -0
  96. package/vendor/stylo/gecko/pseudo_elements.toml +197 -0
  97. package/vendor/stylo/gecko/regen_pseudo_elements.py +33 -0
  98. package/vendor/stylo/gecko/restyle_damage.rs +127 -0
  99. package/vendor/stylo/gecko/selector_parser.rs +627 -0
  100. package/vendor/stylo/gecko/snapshot.rs +202 -0
  101. package/vendor/stylo/gecko/snapshot_helpers.rs +334 -0
  102. package/vendor/stylo/gecko/traversal.rs +52 -0
  103. package/vendor/stylo/gecko/wrapper.rs +2258 -0
  104. package/vendor/stylo/gecko_bindings/mod.rs +34 -0
  105. package/vendor/stylo/gecko_bindings/sugar/mod.rs +12 -0
  106. package/vendor/stylo/gecko_bindings/sugar/ns_com_ptr.rs +15 -0
  107. package/vendor/stylo/gecko_bindings/sugar/ns_compatibility.rs +19 -0
  108. package/vendor/stylo/gecko_bindings/sugar/ns_style_auto_array.rs +111 -0
  109. package/vendor/stylo/gecko_bindings/sugar/origin_flags.rs +31 -0
  110. package/vendor/stylo/gecko_bindings/sugar/ownership.rs +70 -0
  111. package/vendor/stylo/gecko_bindings/sugar/refptr.rs +299 -0
  112. package/vendor/stylo/gecko_string_cache/mod.rs +543 -0
  113. package/vendor/stylo/gecko_string_cache/namespace.rs +106 -0
  114. package/vendor/stylo/global_style_data.rs +224 -0
  115. package/vendor/stylo/invalidation/element/document_state.rs +156 -0
  116. package/vendor/stylo/invalidation/element/element_wrapper.rs +432 -0
  117. package/vendor/stylo/invalidation/element/invalidation_map.rs +1631 -0
  118. package/vendor/stylo/invalidation/element/invalidator.rs +1470 -0
  119. package/vendor/stylo/invalidation/element/mod.rs +13 -0
  120. package/vendor/stylo/invalidation/element/relative_selector.rs +1399 -0
  121. package/vendor/stylo/invalidation/element/restyle_hints.rs +226 -0
  122. package/vendor/stylo/invalidation/element/state_and_attributes.rs +756 -0
  123. package/vendor/stylo/invalidation/media_queries.rs +144 -0
  124. package/vendor/stylo/invalidation/mod.rs +10 -0
  125. package/vendor/stylo/invalidation/stylesheets.rs +745 -0
  126. package/vendor/stylo/invalidation/viewport_units.rs +71 -0
  127. package/vendor/stylo/lib.rs +336 -0
  128. package/vendor/stylo/logical_geometry.rs +1684 -0
  129. package/vendor/stylo/macros.rs +70 -0
  130. package/vendor/stylo/matching.rs +1226 -0
  131. package/vendor/stylo/media_queries/media_list.rs +168 -0
  132. package/vendor/stylo/media_queries/media_query.rs +190 -0
  133. package/vendor/stylo/media_queries/mod.rs +13 -0
  134. package/vendor/stylo/parallel.rs +205 -0
  135. package/vendor/stylo/parser.rs +276 -0
  136. package/vendor/stylo/piecewise_linear.rs +282 -0
  137. package/vendor/stylo/prefs.rs +33 -0
  138. package/vendor/stylo/properties/build.py +119 -0
  139. package/vendor/stylo/properties/cascade.rs +2704 -0
  140. package/vendor/stylo/properties/computed_value_flags.rs +206 -0
  141. package/vendor/stylo/properties/counted_unknown_properties.py +104 -0
  142. package/vendor/stylo/properties/counter_style_descriptors.toml +45 -0
  143. package/vendor/stylo/properties/data.py +1375 -0
  144. package/vendor/stylo/properties/declaration_block.rs +1788 -0
  145. package/vendor/stylo/properties/font_face_descriptors.toml +50 -0
  146. package/vendor/stylo/properties/gecko.mako.rs +1555 -0
  147. package/vendor/stylo/properties/helpers/animated_properties.mako.rs +800 -0
  148. package/vendor/stylo/properties/helpers.mako.rs +812 -0
  149. package/vendor/stylo/properties/longhands.toml +4305 -0
  150. package/vendor/stylo/properties/mod.rs +1857 -0
  151. package/vendor/stylo/properties/properties.html.mako +31 -0
  152. package/vendor/stylo/properties/properties.mako.rs +3103 -0
  153. package/vendor/stylo/properties/property_descriptors.toml +18 -0
  154. package/vendor/stylo/properties/shorthands.rs +4241 -0
  155. package/vendor/stylo/properties/shorthands.toml +575 -0
  156. package/vendor/stylo/properties/vendored_python/mako-1.3.10-py3-none-any.whl +0 -0
  157. package/vendor/stylo/properties/vendored_python/markupsafe/LICENSE.txt +28 -0
  158. package/vendor/stylo/properties/vendored_python/markupsafe/__init__.py +384 -0
  159. package/vendor/stylo/properties/vendored_python/toml-0.10.2-py2.py3-none-any.whl +0 -0
  160. package/vendor/stylo/properties/view_transition_descriptors.toml +11 -0
  161. package/vendor/stylo/properties_and_values/mod.rs +12 -0
  162. package/vendor/stylo/properties_and_values/registry.rs +65 -0
  163. package/vendor/stylo/properties_and_values/rule.rs +331 -0
  164. package/vendor/stylo/properties_and_values/syntax/ascii.rs +60 -0
  165. package/vendor/stylo/properties_and_values/syntax/data_type.rs +146 -0
  166. package/vendor/stylo/properties_and_values/syntax/mod.rs +437 -0
  167. package/vendor/stylo/properties_and_values/value.rs +758 -0
  168. package/vendor/stylo/queries/condition.rs +996 -0
  169. package/vendor/stylo/queries/feature.rs +199 -0
  170. package/vendor/stylo/queries/feature_expression.rs +1170 -0
  171. package/vendor/stylo/queries/mod.rs +19 -0
  172. package/vendor/stylo/queries/values.rs +46 -0
  173. package/vendor/stylo/rule_cache.rs +267 -0
  174. package/vendor/stylo/rule_collector.rs +554 -0
  175. package/vendor/stylo/rule_tree/core.rs +787 -0
  176. package/vendor/stylo/rule_tree/level.rs +396 -0
  177. package/vendor/stylo/rule_tree/map.rs +201 -0
  178. package/vendor/stylo/rule_tree/mod.rs +427 -0
  179. package/vendor/stylo/rule_tree/source.rs +80 -0
  180. package/vendor/stylo/rule_tree/unsafe_box.rs +78 -0
  181. package/vendor/stylo/scoped_tls.rs +80 -0
  182. package/vendor/stylo/selector_map.rs +1050 -0
  183. package/vendor/stylo/selector_parser.rs +305 -0
  184. package/vendor/stylo/servo/animation.rs +1922 -0
  185. package/vendor/stylo/servo/attr.rs +714 -0
  186. package/vendor/stylo/servo/encoding_support.rs +81 -0
  187. package/vendor/stylo/servo/media_features.rs +254 -0
  188. package/vendor/stylo/servo/mod.rs +16 -0
  189. package/vendor/stylo/servo/restyle_damage.rs +215 -0
  190. package/vendor/stylo/servo/selector_parser.rs +1036 -0
  191. package/vendor/stylo/servo/shadow_parts.rs +207 -0
  192. package/vendor/stylo/shared_lock.rs +271 -0
  193. package/vendor/stylo/sharing/checks.rs +281 -0
  194. package/vendor/stylo/sharing/mod.rs +1000 -0
  195. package/vendor/stylo/simple_buckets_map.rs +52 -0
  196. package/vendor/stylo/str.rs +168 -0
  197. package/vendor/stylo/style_adjuster.rs +1086 -0
  198. package/vendor/stylo/style_resolver.rs +658 -0
  199. package/vendor/stylo/stylesheet_set.rs +658 -0
  200. package/vendor/stylo/stylesheets/appearance_base_rule.rs +51 -0
  201. package/vendor/stylo/stylesheets/container_rule.rs +769 -0
  202. package/vendor/stylo/stylesheets/counter_style_rule.rs +7 -0
  203. package/vendor/stylo/stylesheets/document_rule.rs +272 -0
  204. package/vendor/stylo/stylesheets/font_face_rule.rs +7 -0
  205. package/vendor/stylo/stylesheets/font_feature_values_rule.rs +481 -0
  206. package/vendor/stylo/stylesheets/font_palette_values_rule.rs +304 -0
  207. package/vendor/stylo/stylesheets/import_rule.rs +259 -0
  208. package/vendor/stylo/stylesheets/keyframes_rule.rs +733 -0
  209. package/vendor/stylo/stylesheets/layer_rule.rs +221 -0
  210. package/vendor/stylo/stylesheets/loader.rs +29 -0
  211. package/vendor/stylo/stylesheets/margin_rule.rs +190 -0
  212. package/vendor/stylo/stylesheets/media_rule.rs +191 -0
  213. package/vendor/stylo/stylesheets/mod.rs +918 -0
  214. package/vendor/stylo/stylesheets/namespace_rule.rs +43 -0
  215. package/vendor/stylo/stylesheets/nested_declarations_rule.rs +51 -0
  216. package/vendor/stylo/stylesheets/origin.rs +249 -0
  217. package/vendor/stylo/stylesheets/page_rule.rs +354 -0
  218. package/vendor/stylo/stylesheets/position_try_rule.rs +68 -0
  219. package/vendor/stylo/stylesheets/property_rule.rs +5 -0
  220. package/vendor/stylo/stylesheets/rule_list.rs +167 -0
  221. package/vendor/stylo/stylesheets/rule_parser.rs +1189 -0
  222. package/vendor/stylo/stylesheets/rules_iterator.rs +397 -0
  223. package/vendor/stylo/stylesheets/scope_rule.rs +511 -0
  224. package/vendor/stylo/stylesheets/starting_style_rule.rs +54 -0
  225. package/vendor/stylo/stylesheets/style_rule.rs +80 -0
  226. package/vendor/stylo/stylesheets/stylesheet.rs +570 -0
  227. package/vendor/stylo/stylesheets/supports_rule.rs +486 -0
  228. package/vendor/stylo/stylesheets/view_transition_rule.rs +81 -0
  229. package/vendor/stylo/stylist.rs +5076 -0
  230. package/vendor/stylo/thread_state.rs +87 -0
  231. package/vendor/stylo/traversal.rs +765 -0
  232. package/vendor/stylo/traversal_flags.rs +68 -0
  233. package/vendor/stylo/typed_om/mod.rs +981 -0
  234. package/vendor/stylo/typed_om/numeric.rs +128 -0
  235. package/vendor/stylo/typed_om/numeric_declaration.rs +93 -0
  236. package/vendor/stylo/typed_om/numeric_type.rs +640 -0
  237. package/vendor/stylo/typed_om/sum_value.rs +426 -0
  238. package/vendor/stylo/url/gecko.rs +367 -0
  239. package/vendor/stylo/url/mod.rs +71 -0
  240. package/vendor/stylo/url/servo.rs +239 -0
  241. package/vendor/stylo/use_counters/mod.rs +137 -0
  242. package/vendor/stylo/values/animated/color.rs +103 -0
  243. package/vendor/stylo/values/animated/effects.rs +26 -0
  244. package/vendor/stylo/values/animated/font.rs +37 -0
  245. package/vendor/stylo/values/animated/grid.rs +161 -0
  246. package/vendor/stylo/values/animated/lists.rs +141 -0
  247. package/vendor/stylo/values/animated/mod.rs +550 -0
  248. package/vendor/stylo/values/animated/svg.rs +46 -0
  249. package/vendor/stylo/values/animated/text.rs +58 -0
  250. package/vendor/stylo/values/animated/transform.rs +1592 -0
  251. package/vendor/stylo/values/computed/align.rs +90 -0
  252. package/vendor/stylo/values/computed/angle.rs +130 -0
  253. package/vendor/stylo/values/computed/animation.rs +124 -0
  254. package/vendor/stylo/values/computed/background.rs +13 -0
  255. package/vendor/stylo/values/computed/basic_shape.rs +267 -0
  256. package/vendor/stylo/values/computed/border.rs +163 -0
  257. package/vendor/stylo/values/computed/box.rs +267 -0
  258. package/vendor/stylo/values/computed/calc.rs +334 -0
  259. package/vendor/stylo/values/computed/color.rs +161 -0
  260. package/vendor/stylo/values/computed/column.rs +11 -0
  261. package/vendor/stylo/values/computed/corner_shape.rs +155 -0
  262. package/vendor/stylo/values/computed/counters.rs +26 -0
  263. package/vendor/stylo/values/computed/easing.rs +109 -0
  264. package/vendor/stylo/values/computed/effects.rs +30 -0
  265. package/vendor/stylo/values/computed/flex.rs +19 -0
  266. package/vendor/stylo/values/computed/font.rs +1517 -0
  267. package/vendor/stylo/values/computed/image.rs +273 -0
  268. package/vendor/stylo/values/computed/length.rs +576 -0
  269. package/vendor/stylo/values/computed/length_percentage.rs +1055 -0
  270. package/vendor/stylo/values/computed/list.rs +16 -0
  271. package/vendor/stylo/values/computed/mod.rs +1141 -0
  272. package/vendor/stylo/values/computed/motion.rs +73 -0
  273. package/vendor/stylo/values/computed/outline.rs +7 -0
  274. package/vendor/stylo/values/computed/page.rs +77 -0
  275. package/vendor/stylo/values/computed/param.rs +9 -0
  276. package/vendor/stylo/values/computed/percentage.rs +143 -0
  277. package/vendor/stylo/values/computed/position.rs +273 -0
  278. package/vendor/stylo/values/computed/ratio.rs +88 -0
  279. package/vendor/stylo/values/computed/rect.rs +19 -0
  280. package/vendor/stylo/values/computed/resolution.rs +76 -0
  281. package/vendor/stylo/values/computed/svg.rs +66 -0
  282. package/vendor/stylo/values/computed/table.rs +7 -0
  283. package/vendor/stylo/values/computed/text.rs +199 -0
  284. package/vendor/stylo/values/computed/time.rs +83 -0
  285. package/vendor/stylo/values/computed/transform.rs +559 -0
  286. package/vendor/stylo/values/computed/tree_counting.rs +30 -0
  287. package/vendor/stylo/values/computed/ui.rs +23 -0
  288. package/vendor/stylo/values/computed/url.rs +12 -0
  289. package/vendor/stylo/values/distance.rs +139 -0
  290. package/vendor/stylo/values/generics/animation.rs +363 -0
  291. package/vendor/stylo/values/generics/background.rs +65 -0
  292. package/vendor/stylo/values/generics/basic_shape.rs +1389 -0
  293. package/vendor/stylo/values/generics/border.rs +303 -0
  294. package/vendor/stylo/values/generics/box.rs +552 -0
  295. package/vendor/stylo/values/generics/calc.rs +2986 -0
  296. package/vendor/stylo/values/generics/color.rs +318 -0
  297. package/vendor/stylo/values/generics/column.rs +44 -0
  298. package/vendor/stylo/values/generics/counters.rs +320 -0
  299. package/vendor/stylo/values/generics/easing.rs +132 -0
  300. package/vendor/stylo/values/generics/effects.rs +131 -0
  301. package/vendor/stylo/values/generics/flex.rs +34 -0
  302. package/vendor/stylo/values/generics/font.rs +376 -0
  303. package/vendor/stylo/values/generics/grid.rs +962 -0
  304. package/vendor/stylo/values/generics/image.rs +653 -0
  305. package/vendor/stylo/values/generics/length.rs +656 -0
  306. package/vendor/stylo/values/generics/mod.rs +303 -0
  307. package/vendor/stylo/values/generics/motion.rs +274 -0
  308. package/vendor/stylo/values/generics/page.rs +167 -0
  309. package/vendor/stylo/values/generics/position.rs +669 -0
  310. package/vendor/stylo/values/generics/ratio.rs +88 -0
  311. package/vendor/stylo/values/generics/rect.rs +147 -0
  312. package/vendor/stylo/values/generics/size.rs +102 -0
  313. package/vendor/stylo/values/generics/svg.rs +226 -0
  314. package/vendor/stylo/values/generics/text.rs +268 -0
  315. package/vendor/stylo/values/generics/transform.rs +1157 -0
  316. package/vendor/stylo/values/generics/ui.rs +147 -0
  317. package/vendor/stylo/values/generics/url.rs +51 -0
  318. package/vendor/stylo/values/mod.rs +820 -0
  319. package/vendor/stylo/values/resolved/animation.rs +33 -0
  320. package/vendor/stylo/values/resolved/color.rs +53 -0
  321. package/vendor/stylo/values/resolved/counters.rs +45 -0
  322. package/vendor/stylo/values/resolved/mod.rs +316 -0
  323. package/vendor/stylo/values/specified/align.rs +711 -0
  324. package/vendor/stylo/values/specified/angle.rs +407 -0
  325. package/vendor/stylo/values/specified/animation.rs +921 -0
  326. package/vendor/stylo/values/specified/background.rs +270 -0
  327. package/vendor/stylo/values/specified/basic_shape.rs +986 -0
  328. package/vendor/stylo/values/specified/border.rs +430 -0
  329. package/vendor/stylo/values/specified/box.rs +2231 -0
  330. package/vendor/stylo/values/specified/calc.rs +1657 -0
  331. package/vendor/stylo/values/specified/color.rs +1210 -0
  332. package/vendor/stylo/values/specified/column.rs +11 -0
  333. package/vendor/stylo/values/specified/corner_shape.rs +152 -0
  334. package/vendor/stylo/values/specified/counters.rs +242 -0
  335. package/vendor/stylo/values/specified/easing.rs +225 -0
  336. package/vendor/stylo/values/specified/effects.rs +421 -0
  337. package/vendor/stylo/values/specified/flex.rs +42 -0
  338. package/vendor/stylo/values/specified/font.rs +2103 -0
  339. package/vendor/stylo/values/specified/frequency.rs +39 -0
  340. package/vendor/stylo/values/specified/grid.rs +407 -0
  341. package/vendor/stylo/values/specified/image.rs +1385 -0
  342. package/vendor/stylo/values/specified/intersection_observer.rs +80 -0
  343. package/vendor/stylo/values/specified/length.rs +2024 -0
  344. package/vendor/stylo/values/specified/list.rs +190 -0
  345. package/vendor/stylo/values/specified/mod.rs +531 -0
  346. package/vendor/stylo/values/specified/motion.rs +316 -0
  347. package/vendor/stylo/values/specified/number.rs +603 -0
  348. package/vendor/stylo/values/specified/outline.rs +69 -0
  349. package/vendor/stylo/values/specified/page.rs +94 -0
  350. package/vendor/stylo/values/specified/param.rs +121 -0
  351. package/vendor/stylo/values/specified/percentage.rs +364 -0
  352. package/vendor/stylo/values/specified/position.rs +2247 -0
  353. package/vendor/stylo/values/specified/ratio.rs +29 -0
  354. package/vendor/stylo/values/specified/rect.rs +28 -0
  355. package/vendor/stylo/values/specified/resolution.rs +237 -0
  356. package/vendor/stylo/values/specified/source_size_list.rs +135 -0
  357. package/vendor/stylo/values/specified/svg.rs +427 -0
  358. package/vendor/stylo/values/specified/svg_path.rs +1115 -0
  359. package/vendor/stylo/values/specified/table.rs +38 -0
  360. package/vendor/stylo/values/specified/text.rs +1561 -0
  361. package/vendor/stylo/values/specified/time.rs +313 -0
  362. package/vendor/stylo/values/specified/transform.rs +599 -0
  363. package/vendor/stylo/values/specified/tree_counting.rs +32 -0
  364. package/vendor/stylo/values/specified/ui.rs +344 -0
  365. package/vendor/stylo/values/specified/url.rs +12 -0
  366. package/vendor/stylo/values/tagged_numeric.rs +253 -0
  367. package/wasm/blitz_pdf.d.ts +67 -0
  368. package/wasm/blitz_pdf.js +699 -0
  369. package/wasm/blitz_pdf_bg.wasm +0 -0
  370. package/wasm/blitz_pdf_bg.wasm.d.ts +20 -0
@@ -0,0 +1,414 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ //! The style bloom filter is used as an optimization when matching deep
6
+ //! descendant selectors.
7
+
8
+ #![deny(missing_docs)]
9
+
10
+ use crate::LocalName;
11
+ use crate::dom::{SendElement, TElement};
12
+ use atomic_refcell::{AtomicRefCell, AtomicRefMut};
13
+ use selectors::bloom::BloomFilter;
14
+ use smallvec::SmallVec;
15
+
16
+ thread_local! {
17
+ /// Bloom filters are large allocations, so we store them in thread-local storage
18
+ /// such that they can be reused across style traversals. StyleBloom is responsible
19
+ /// for ensuring that the bloom filter is zeroed when it is dropped.
20
+ ///
21
+ /// We intentionally leak this from TLS because we don't have the guarantee
22
+ /// of TLS destructors to run in worker threads.
23
+ ///
24
+ /// Also, leaking it guarantees that we can borrow it indefinitely.
25
+ ///
26
+ /// We could change this once https://github.com/rayon-rs/rayon/issues/688
27
+ /// is fixed, hopefully, which point we'd need to change the filter member below to be an
28
+ /// arc and carry an owning reference around or so.
29
+ static BLOOM_KEY: &'static AtomicRefCell<BloomFilter> = Box::leak(Default::default());
30
+ }
31
+
32
+ /// A struct that allows us to fast-reject deep descendant selectors avoiding
33
+ /// selector-matching.
34
+ ///
35
+ /// This is implemented using a counting bloom filter, and it's a standard
36
+ /// optimization. See Gecko's `AncestorFilter`, and Blink's and WebKit's
37
+ /// `SelectorFilter`.
38
+ ///
39
+ /// The constraints for Servo's style system are a bit different compared to
40
+ /// traditional style systems given Servo does a parallel breadth-first
41
+ /// traversal instead of a sequential depth-first traversal.
42
+ ///
43
+ /// This implies that we need to track a bit more state than other browsers to
44
+ /// ensure we're doing the correct thing during the traversal, and being able to
45
+ /// apply this optimization effectively.
46
+ ///
47
+ /// Concretely, we have a bloom filter instance per worker thread, and we track
48
+ /// the current DOM depth in order to find a common ancestor when it doesn't
49
+ /// match the previous element we've styled.
50
+ ///
51
+ /// This is usually a pretty fast operation (we use to be one level deeper than
52
+ /// the previous one), but in the case of work-stealing, we may needed to push
53
+ /// and pop multiple elements.
54
+ ///
55
+ /// See the `insert_parents_recovering`, where most of the magic happens.
56
+ ///
57
+ /// Regarding thread-safety, this struct is safe because:
58
+ ///
59
+ /// * We clear this after a restyle.
60
+ /// * The DOM shape and attributes (and every other thing we access here) are
61
+ /// immutable during a restyle.
62
+ ///
63
+ pub struct StyleBloom<E: TElement> {
64
+ /// A handle to the bloom filter from the thread upon which this StyleBloom
65
+ /// was created. We use AtomicRefCell so that this is all |Send|, which allows
66
+ /// StyleBloom to live in ThreadLocalStyleContext, which is dropped from the
67
+ /// parent thread.
68
+ filter: AtomicRefMut<'static, BloomFilter>,
69
+
70
+ /// The stack of elements that this bloom filter contains, along with the
71
+ /// number of hashes pushed for each element.
72
+ elements: SmallVec<[PushedElement<E>; 16]>,
73
+
74
+ /// Stack of hashes that have been pushed onto this filter.
75
+ pushed_hashes: SmallVec<[u32; 64]>,
76
+ }
77
+
78
+ /// The very rough benchmarks in the selectors crate show clear()
79
+ /// costing about 25 times more than remove_hash(). We use this to implement
80
+ /// clear() more efficiently when only a small number of hashes have been
81
+ /// pushed.
82
+ ///
83
+ /// One subtly to note is that remove_hash() will not touch the value
84
+ /// if the filter overflowed. However, overflow can only occur if we
85
+ /// get 255 collisions on the same hash value, and 25 < 255.
86
+ const MEMSET_CLEAR_THRESHOLD: usize = 25;
87
+
88
+ struct PushedElement<E: TElement> {
89
+ /// The element that was pushed.
90
+ element: SendElement<E>,
91
+
92
+ /// The number of hashes pushed for the element.
93
+ num_hashes: usize,
94
+ }
95
+
96
+ impl<E: TElement> PushedElement<E> {
97
+ fn new(el: E, num_hashes: usize) -> Self {
98
+ PushedElement {
99
+ element: unsafe { SendElement::new(el) },
100
+ num_hashes,
101
+ }
102
+ }
103
+ }
104
+
105
+ /// Returns whether the attribute name is excluded from the bloom filter.
106
+ ///
107
+ /// We do this for attributes that are very common but not commonly used in
108
+ /// selectors.
109
+ #[inline]
110
+ pub fn is_attr_name_excluded_from_filter(name: &LocalName) -> bool {
111
+ *name == local_name!("class") || *name == local_name!("id") || *name == local_name!("style")
112
+ }
113
+
114
+ /// Gather all relevant hash for fast-reject filters from an element.
115
+ pub fn each_relevant_element_hash<E, F>(element: E, mut f: F)
116
+ where
117
+ E: TElement,
118
+ F: FnMut(u32),
119
+ {
120
+ f(element.local_name().get_hash32());
121
+ f(element.namespace().get_hash32());
122
+
123
+ if let Some(id) = element.id() {
124
+ f(id.get_hash32());
125
+ }
126
+
127
+ element.each_class(|class| f(class.get_hash32()));
128
+
129
+ element.each_attr_name(|name| {
130
+ if !is_attr_name_excluded_from_filter(name) {
131
+ f(name.get_hash32())
132
+ }
133
+ });
134
+ }
135
+
136
+ impl<E: TElement> Drop for StyleBloom<E> {
137
+ fn drop(&mut self) {
138
+ // Leave the reusable bloom filter in a zeroed state.
139
+ self.clear();
140
+ }
141
+ }
142
+
143
+ impl<E: TElement> Default for StyleBloom<E> {
144
+ fn default() -> Self {
145
+ Self::new()
146
+ }
147
+ }
148
+
149
+ impl<E: TElement> StyleBloom<E> {
150
+ /// Create an empty `StyleBloom`. Because StyleBloom acquires the thread-
151
+ /// local filter buffer, creating multiple live StyleBloom instances at
152
+ /// the same time on the same thread will panic.
153
+
154
+ // Forced out of line to limit stack frame sizes after extra inlining from
155
+ // https://github.com/rust-lang/rust/pull/43931
156
+ //
157
+ // See https://github.com/servo/servo/pull/18420#issuecomment-328769322
158
+ #[inline(never)]
159
+ pub fn new() -> Self {
160
+ let filter = BLOOM_KEY.with(|b| b.borrow_mut());
161
+ debug_assert!(
162
+ filter.is_zeroed(),
163
+ "Forgot to zero the bloom filter last time"
164
+ );
165
+ StyleBloom {
166
+ filter,
167
+ elements: Default::default(),
168
+ pushed_hashes: Default::default(),
169
+ }
170
+ }
171
+
172
+ /// Return the bloom filter used properly by the `selectors` crate.
173
+ pub fn filter(&self) -> &BloomFilter {
174
+ &self.filter
175
+ }
176
+
177
+ /// Push an element to the bloom filter, knowing that it's a child of the
178
+ /// last element parent.
179
+ pub fn push(&mut self, element: E) {
180
+ if cfg!(debug_assertions) && self.elements.is_empty() {
181
+ assert!(element.traversal_parent().is_none());
182
+ }
183
+ self.push_internal(element);
184
+ }
185
+
186
+ /// Same as `push`, but without asserting, in order to use it from
187
+ /// `rebuild`.
188
+ fn push_internal(&mut self, element: E) {
189
+ let mut count = 0;
190
+ each_relevant_element_hash(element, |hash| {
191
+ count += 1;
192
+ self.filter.insert_hash(hash);
193
+ self.pushed_hashes.push(hash);
194
+ });
195
+ self.elements.push(PushedElement::new(element, count));
196
+ }
197
+
198
+ /// Pop the last element in the bloom filter and return it.
199
+ #[inline]
200
+ fn pop(&mut self) -> Option<E> {
201
+ let PushedElement {
202
+ element,
203
+ num_hashes,
204
+ } = self.elements.pop()?;
205
+ let popped_element = *element;
206
+
207
+ // Verify that the pushed hashes match the ones we'd get from the element.
208
+ let mut expected_hashes = vec![];
209
+ if cfg!(debug_assertions) {
210
+ each_relevant_element_hash(popped_element, |hash| expected_hashes.push(hash));
211
+ }
212
+
213
+ for _ in 0..num_hashes {
214
+ let hash = self.pushed_hashes.pop().unwrap();
215
+ debug_assert_eq!(expected_hashes.pop().unwrap(), hash);
216
+ self.filter.remove_hash(hash);
217
+ }
218
+
219
+ Some(popped_element)
220
+ }
221
+
222
+ /// Returns the DOM depth of elements that can be correctly
223
+ /// matched against the bloom filter (that is, the number of
224
+ /// elements in our list).
225
+ pub fn matching_depth(&self) -> usize {
226
+ self.elements.len()
227
+ }
228
+
229
+ /// Clears the bloom filter.
230
+ pub fn clear(&mut self) {
231
+ self.elements.clear();
232
+
233
+ if self.pushed_hashes.len() > MEMSET_CLEAR_THRESHOLD {
234
+ self.filter.clear();
235
+ self.pushed_hashes.clear();
236
+ } else {
237
+ for hash in self.pushed_hashes.drain(..) {
238
+ self.filter.remove_hash(hash);
239
+ }
240
+ debug_assert!(self.filter.is_zeroed());
241
+ }
242
+ }
243
+
244
+ /// Rebuilds the bloom filter up to the parent of the given element.
245
+ pub fn rebuild(&mut self, mut element: E) {
246
+ self.clear();
247
+
248
+ let mut parents_to_insert = SmallVec::<[E; 16]>::new();
249
+ while let Some(parent) = element.traversal_parent() {
250
+ parents_to_insert.push(parent);
251
+ element = parent;
252
+ }
253
+
254
+ for parent in parents_to_insert.drain(..).rev() {
255
+ self.push(parent);
256
+ }
257
+ }
258
+
259
+ /// In debug builds, asserts that all the parents of `element` are in the
260
+ /// bloom filter.
261
+ ///
262
+ /// Goes away in release builds.
263
+ pub fn assert_complete(&self, mut element: E) {
264
+ if cfg!(debug_assertions) {
265
+ let mut checked = 0;
266
+ while let Some(parent) = element.traversal_parent() {
267
+ assert_eq!(
268
+ parent,
269
+ *(self.elements[self.elements.len() - 1 - checked].element)
270
+ );
271
+ element = parent;
272
+ checked += 1;
273
+ }
274
+ assert_eq!(checked, self.elements.len());
275
+ }
276
+ }
277
+
278
+ /// Get the element that represents the chain of things inserted
279
+ /// into the filter right now. That chain is the given element
280
+ /// (if any) and its ancestors.
281
+ #[inline]
282
+ pub fn current_parent(&self) -> Option<E> {
283
+ self.elements.last().map(|el| *el.element)
284
+ }
285
+
286
+ /// Insert the parents of an element in the bloom filter, trying to recover
287
+ /// the filter if the last element inserted doesn't match.
288
+ ///
289
+ /// Gets the element depth in the dom, to make it efficient, or if not
290
+ /// provided always rebuilds the filter from scratch.
291
+ ///
292
+ /// Returns the new bloom filter depth, that the traversal code is
293
+ /// responsible to keep around if it wants to get an effective filter.
294
+ pub fn insert_parents_recovering(&mut self, element: E, element_depth: usize) {
295
+ // Easy case, we're in a different restyle, or we're empty.
296
+ if self.elements.is_empty() {
297
+ self.rebuild(element);
298
+ return;
299
+ }
300
+
301
+ let traversal_parent = match element.traversal_parent() {
302
+ Some(parent) => parent,
303
+ None => {
304
+ // Yay, another easy case.
305
+ self.clear();
306
+ return;
307
+ },
308
+ };
309
+
310
+ if self.current_parent() == Some(traversal_parent) {
311
+ // Ta da, cache hit, we're all done.
312
+ return;
313
+ }
314
+
315
+ if element_depth == 0 {
316
+ self.clear();
317
+ return;
318
+ }
319
+
320
+ // We should've early exited above.
321
+ debug_assert!(
322
+ element_depth != 0,
323
+ "We should have already cleared the bloom filter"
324
+ );
325
+ debug_assert!(!self.elements.is_empty(), "How! We should've just rebuilt!");
326
+
327
+ // Now the fun begins: We have the depth of the dom and the depth of the
328
+ // last element inserted in the filter, let's try to find a common
329
+ // parent.
330
+ //
331
+ // The current depth, that is, the depth of the last element inserted in
332
+ // the bloom filter, is the number of elements _minus one_, that is: if
333
+ // there's one element, it must be the root -> depth zero.
334
+ let mut current_depth = self.elements.len() - 1;
335
+
336
+ // If the filter represents an element too deep in the dom, we need to
337
+ // pop ancestors.
338
+ while current_depth > element_depth - 1 {
339
+ self.pop().expect("Emilio is bad at math");
340
+ current_depth -= 1;
341
+ }
342
+
343
+ // Now let's try to find a common parent in the bloom filter chain,
344
+ // starting with traversal_parent.
345
+ let mut common_parent = traversal_parent;
346
+ let mut common_parent_depth = element_depth - 1;
347
+
348
+ // Let's collect the parents we are going to need to insert once we've
349
+ // found the common one.
350
+ let mut parents_to_insert = SmallVec::<[E; 16]>::new();
351
+
352
+ // If the bloom filter still doesn't have enough elements, the common
353
+ // parent is up in the dom.
354
+ while common_parent_depth > current_depth {
355
+ // TODO(emilio): Seems like we could insert parents here, then
356
+ // reverse the slice.
357
+ parents_to_insert.push(common_parent);
358
+ common_parent = common_parent.traversal_parent().expect("We were lied to");
359
+ common_parent_depth -= 1;
360
+ }
361
+
362
+ // Now the two depths are the same.
363
+ debug_assert_eq!(common_parent_depth, current_depth);
364
+
365
+ // Happy case: The parents match, we only need to push the ancestors
366
+ // we've collected and we'll never enter in this loop.
367
+ //
368
+ // Not-so-happy case: Parent's don't match, so we need to keep going up
369
+ // until we find a common ancestor.
370
+ //
371
+ // Gecko currently models native anonymous content that conceptually
372
+ // hangs off the document (such as scrollbars) as a separate subtree
373
+ // from the document root.
374
+ //
375
+ // Thus it's possible with Gecko that we do not find any common
376
+ // ancestor.
377
+ while *(self.elements.last().unwrap().element) != common_parent {
378
+ parents_to_insert.push(common_parent);
379
+ self.pop().unwrap();
380
+ common_parent = match common_parent.traversal_parent() {
381
+ Some(parent) => parent,
382
+ None => {
383
+ debug_assert!(self.elements.is_empty());
384
+ if cfg!(feature = "gecko") {
385
+ break;
386
+ } else {
387
+ panic!("should have found a common ancestor");
388
+ }
389
+ },
390
+ }
391
+ }
392
+
393
+ // Now the parents match, so insert the stack of elements we have been
394
+ // collecting so far.
395
+ for parent in parents_to_insert.drain(..).rev() {
396
+ self.push(parent);
397
+ }
398
+
399
+ debug_assert_eq!(self.elements.len(), element_depth);
400
+
401
+ // We're done! Easy.
402
+ }
403
+ }
404
+
405
+ pub(crate) trait AtomExt {
406
+ fn get_hash32(&self) -> u32;
407
+ }
408
+
409
+ impl<Static: string_cache::StaticAtomSet> AtomExt for string_cache::Atom<Static> {
410
+ fn get_hash32(&self) -> u32 {
411
+ let hash64 = self.get_hash();
412
+ (hash64 >> 32) as u32 ^ (hash64 as u32)
413
+ }
414
+ }
@@ -0,0 +1,91 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+
5
+ use std::env;
6
+ use std::path::Path;
7
+ use std::process::{exit, Command};
8
+ use std::sync::LazyLock;
9
+ use walkdir::WalkDir;
10
+
11
+ #[cfg(feature = "gecko")]
12
+ mod build_gecko;
13
+
14
+ #[cfg(not(feature = "gecko"))]
15
+ mod build_gecko {
16
+ pub fn generate() {}
17
+ }
18
+
19
+ pub static PYTHON: LazyLock<String> = LazyLock::new(|| {
20
+ env::var("PYTHON3").ok().unwrap_or_else(|| {
21
+ let candidates = if cfg!(windows) {
22
+ ["python.exe"]
23
+ } else {
24
+ ["python3"]
25
+ };
26
+ for &name in &candidates {
27
+ if Command::new(name)
28
+ .arg("--version")
29
+ .output()
30
+ .ok()
31
+ .is_some_and(|out| out.status.success())
32
+ {
33
+ return name.to_owned();
34
+ }
35
+ }
36
+ panic!(
37
+ "Can't find python (tried {})! Try fixing PATH or setting the PYTHON3 env var",
38
+ candidates.join(", ")
39
+ )
40
+ })
41
+ });
42
+
43
+ fn generate_properties(engine: &str) {
44
+ for entry in WalkDir::new("properties") {
45
+ let entry = entry.unwrap();
46
+ match entry.path().extension().and_then(|e| e.to_str()) {
47
+ Some("mako") | Some("rs") | Some("py") | Some("zip") | Some("toml") => {
48
+ println!("cargo:rerun-if-changed={}", entry.path().display());
49
+ },
50
+ _ => {},
51
+ }
52
+ }
53
+
54
+ let script = Path::new(&env::var_os("CARGO_MANIFEST_DIR").unwrap())
55
+ .join("properties")
56
+ .join("build.py");
57
+
58
+ let status = Command::new(&*PYTHON)
59
+ // `cargo publish` isn't happy with the `__pycache__` files that are created
60
+ // when we run the property generator.
61
+ //
62
+ // TODO(mrobinson): Is this happening because of how we run this script? It
63
+ // would be better to ensure are just placed in the output directory.
64
+ .env("PYTHONDONTWRITEBYTECODE", "1")
65
+ .arg(&script)
66
+ .arg(engine)
67
+ .arg("style-crate")
68
+ .status()
69
+ .unwrap();
70
+ if !status.success() {
71
+ exit(1)
72
+ }
73
+ }
74
+
75
+ fn main() {
76
+ let gecko = cfg!(feature = "gecko");
77
+ let servo = cfg!(feature = "servo");
78
+ let engine = match (gecko, servo) {
79
+ (true, false) => "gecko",
80
+ (false, true) => "servo",
81
+ _ => panic!(
82
+ "\n\n\
83
+ The style crate requires enabling one of its 'servo' or 'gecko' feature flags. \
84
+ \n\n"
85
+ ),
86
+ };
87
+ println!("cargo:rerun-if-changed=build.rs");
88
+ println!("cargo:out_dir={}", env::var("OUT_DIR").unwrap());
89
+ generate_properties(engine);
90
+ build_gecko::generate();
91
+ }