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,640 @@
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
+ //! Gecko's definition of a pseudo-element.
6
+ //!
7
+ //! Note that a few autogenerated bits of this live in
8
+ //! `pseudo_element_definition.mako.rs`. If you touch that file, you probably
9
+ //! need to update the checked-in files for Servo.
10
+
11
+ use crate::gecko_bindings::structs::PseudoStyleType;
12
+ use crate::pref;
13
+ use crate::properties::longhands::display::computed_value::T as Display;
14
+ use crate::properties::{ComputedValues, PropertyFlags};
15
+ use crate::selector_parser::PseudoElementCascadeType;
16
+ use crate::str::{starts_with_ignore_ascii_case, string_as_ascii_lowercase};
17
+ use crate::string_cache::Atom;
18
+ use crate::values::serialize_atom_identifier;
19
+ use crate::values::AtomIdent;
20
+ use cssparser::{Parser, ToCss};
21
+ use selectors::parser::PseudoElement as PseudoElementTrait;
22
+ use std::fmt;
23
+ use style_traits::ParseError;
24
+
25
+ bitflags! {
26
+ /// Various pseudo-element flags, see pseudo_elements.toml and anonymous_boxes.toml for the
27
+ /// meaning.
28
+ #[derive(Clone, Copy, Default)]
29
+ pub struct PseudoStyleTypeFlags : u16 {
30
+ /// No flags
31
+ const NONE = 0;
32
+ /// Whether we're enabled in UA sheets.
33
+ const ENABLED_IN_UA = 1 << 0;
34
+ /// Whether we're enabled in chrome sheets.
35
+ const ENABLED_IN_CHROME = 1 << 1;
36
+ /// Whether we're enabled by a pref.
37
+ const ENABLED_BY_PREF = 1 << 2;
38
+ /// Whether we're an anonymous box.
39
+ const IS_PSEUDO_ELEMENT = 1 << 3;
40
+ /// Whether we're a CSS2 pseudo-element.
41
+ const IS_CSS2 = 1 << 4;
42
+ /// Whether we're an eagerly-cascaded pseudo-element.
43
+ const IS_EAGER = 1 << 5;
44
+ /// Whether we can be created by JS
45
+ const IS_JS_CREATED_NAC = 1 << 6;
46
+ /// Whether we can be a flex or grid item.
47
+ const IS_FLEX_OR_GRID_ITEM = 1 << 7;
48
+ /// Whether we're backed by a real element.
49
+ const IS_ELEMENT_BACKED = 1 << 8;
50
+ /// Whether we're a tree-abiding pseudo as per
51
+ /// https://drafts.csswg.org/css-pseudo-4/#treelike
52
+ const IS_TREE_ABIDING = 1 << 9;
53
+ /// Whether we support user-action state pseudo-classes after the pseudo-element.
54
+ const SUPPORTS_USER_ACTION_STATE = 1 << 10;
55
+ /// Whether we are an inheriting anon-box.
56
+ const IS_INHERITING_ANON_BOX = 1 << 11;
57
+ /// Whether we are a non-inheriting anon box.
58
+ const IS_NON_INHERITING_ANON_BOX = 1 << 12;
59
+ /// Combo of the above to cover all anon boxes.
60
+ const IS_ANON_BOX = Self::IS_INHERITING_ANON_BOX.bits() |
61
+ Self::IS_NON_INHERITING_ANON_BOX.bits();
62
+ /// Whether we're a wrapping anon box.
63
+ const IS_WRAPPER_ANON_BOX = 1 << 13;
64
+ /// Whether we parse as an element-backed pseudo-element.
65
+ const PARSES_AS_ELEMENT_BACKED = 1 << 14;
66
+ /// Whether we take an argument. Such pseudo-elements share an `index()` with the other
67
+ /// pseudo-elements of the same kind, so they can't be told apart by it alone.
68
+ const HAS_ARGUMENT = 1 << 15;
69
+ }
70
+ }
71
+
72
+ include!(concat!(
73
+ env!("OUT_DIR"),
74
+ "/gecko/pseudo_element_definition.rs"
75
+ ));
76
+
77
+ /// The target we are using for parsing pseudo-elements.
78
+ pub enum Target {
79
+ /// When parsing a selector, we want to use the full syntax.
80
+ Selector,
81
+ /// When parsing the pseudo-element string (from CSSOM), we only accept CusomIdent for named
82
+ /// view transition pseudo-elements.
83
+ Cssom,
84
+ }
85
+
86
+ /// The type to hold the value of `<pt-name-and-class-selector>`.
87
+ ///
88
+ /// `<pt-name-and-class-selector> = <pt-name-selector> <pt-class-selector>? | <pt-class-selector>`
89
+ /// `<pt-name-selector> = '*' | <custom-ident>`
90
+ /// `<pt-class-selector> = ['.' <custom-ident>]+`
91
+ ///
92
+ /// This type should have at least one element.
93
+ /// If there is no <pt-name-selector>, the first element would be the universal symbol, i.e. '*'.
94
+ /// In other words, when we match it, ".abc" is the same as "*.abc".
95
+ /// Note that we also serialize ".abc" as "*.abc".
96
+ ///
97
+ /// We use a single ThinVec<> to represent this structure to avoid allocating too much memory for a
98
+ /// single selectors::parser::Component (max: 24 bytes) and PseudoElement (max: 16 bytes).
99
+ ///
100
+ /// https://drafts.csswg.org/css-view-transitions-2/#typedef-pt-name-and-class-selector
101
+ #[derive(Clone, Debug, Eq, Hash, MallocSizeOf, PartialEq, ToShmem)]
102
+ pub struct PtNameAndClassSelector(thin_vec::ThinVec<Atom>);
103
+
104
+ impl PtNameAndClassSelector {
105
+ /// Constructs a new one from a name.
106
+ pub fn from_name(name: Atom) -> Self {
107
+ Self(thin_vec::thin_vec![name])
108
+ }
109
+
110
+ /// Returns the name component.
111
+ pub fn name(&self) -> &Atom {
112
+ debug_assert!(!self.0.is_empty());
113
+ self.0.first().expect("Shouldn't be empty")
114
+ }
115
+
116
+ /// Returns the classes component.
117
+ pub fn classes(&self) -> &[Atom] {
118
+ debug_assert!(!self.0.is_empty());
119
+ &self.0[1..]
120
+ }
121
+
122
+ /// Returns the vector we store.
123
+ pub fn name_and_classes(&self) -> &thin_vec::ThinVec<Atom> {
124
+ &self.0
125
+ }
126
+
127
+ /// Parse the pseudo-element tree name and/or class.
128
+ /// |for_selector| is true if we are parsing the CSS selectors and so need to check the
129
+ /// universal symbol, i.e. '*', and classes.
130
+ // Note: We share the same type for both pseudo-element and pseudo-element selector. The
131
+ // universal symbol (i.e. '*') and `<pt-class-selector>` are used only in the selector (for
132
+ // matching).
133
+ pub fn parse(input: &mut Parser, target: Target) -> Result<Self, ParseError> {
134
+ use crate::values::CustomIdent;
135
+ use cssparser::Token;
136
+ use style_traits::StyleParseErrorKind;
137
+
138
+ // <pt-name-selector> = '*' | <custom-ident>
139
+ let parse_pt_name = |input: &mut Parser| {
140
+ // For pseudo-element string, we don't accept '*'.
141
+ if matches!(target, Target::Selector)
142
+ && input.try_parse(|i| i.expect_delim('*')).is_ok()
143
+ {
144
+ Ok(atom!("*"))
145
+ } else {
146
+ CustomIdent::parse(input, &[]).map(|c| c.0)
147
+ }
148
+ };
149
+ let name = input.try_parse(parse_pt_name);
150
+
151
+ // Skip <pt-class-selector> for pseudo-element string.
152
+ if matches!(target, Target::Cssom) {
153
+ return name.map(Self::from_name);
154
+ }
155
+
156
+ // <pt-class-selector> = ['.' <custom-ident>]+
157
+ let parse_pt_class = |input: &mut Parser| {
158
+ // The white space is forbidden:
159
+ // 1. Between <pt-name-selector> and <pt-class-selector>
160
+ // 2. Between any of the components of <pt-class-selector>.
161
+ match input.next_including_whitespace()? {
162
+ Token::Delim('.') => (),
163
+ _ => return Err(ParseError::unexpected_token()),
164
+ }
165
+ // Whitespace is not allowed between '.' and the class name.
166
+ if input.try_parse(|i| i.expect_whitespace()).is_ok() {
167
+ return Err(ParseError::unexpected_token());
168
+ }
169
+ CustomIdent::parse(input, &[]).map(|c| c.0)
170
+ };
171
+ // If there is no `<pt-name-selector>`, it's fine to have whitespaces before the first '.'.
172
+ if name.is_err() {
173
+ input.skip_whitespace();
174
+ }
175
+ let mut classes = thin_vec::ThinVec::new();
176
+ while let Ok(class) = input.try_parse(parse_pt_class) {
177
+ classes.push(class);
178
+ }
179
+
180
+ // If we don't have `<pt-name-selector>`, we must have `<pt-class-selector>`, per the
181
+ // syntax: `<pt-name-selector> <pt-class-selector>? | <pt-class-selector>`.
182
+ if name.is_err() && classes.is_empty() {
183
+ return Err(ParseError::custom(StyleParseErrorKind::UnspecifiedError));
184
+ }
185
+
186
+ // Use the universal symbol as the first element to present the part of
187
+ // `<pt-name-selector>` because they are equivalent (and the serialization is the same).
188
+ let mut result = thin_vec::thin_vec![name.unwrap_or(atom!("*"))];
189
+ result.append(&mut classes);
190
+
191
+ Ok(Self(result))
192
+ }
193
+ }
194
+
195
+ impl ToCss for PtNameAndClassSelector {
196
+ fn to_css<W>(&self, dest: &mut W) -> fmt::Result
197
+ where
198
+ W: fmt::Write,
199
+ {
200
+ let name = self.name();
201
+ if name == &atom!("*") {
202
+ // serialize_atom_identifier() may serialize "*" as "\*", so we handle it separately.
203
+ dest.write_char('*')?;
204
+ } else {
205
+ serialize_atom_identifier(name, dest)?;
206
+ }
207
+
208
+ for class in self.classes() {
209
+ dest.write_char('.')?;
210
+ serialize_atom_identifier(class, dest)?;
211
+ }
212
+
213
+ Ok(())
214
+ }
215
+ }
216
+
217
+ impl PseudoElementTrait for PseudoElement {
218
+ // ::slotted() should support all tree-abiding pseudo-elements, see
219
+ // https://drafts.csswg.org/css-scoping/#slotted-pseudo
220
+ // https://drafts.csswg.org/css-pseudo-4/#treelike
221
+ #[inline]
222
+ fn valid_after_slotted(&self) -> bool {
223
+ self.flags()
224
+ .intersects(PseudoStyleTypeFlags::IS_TREE_ABIDING)
225
+ }
226
+
227
+ // ::before/::after should support ::marker, but no others.
228
+ // https://drafts.csswg.org/css-pseudo-4/#marker-pseudo
229
+ #[inline]
230
+ fn valid_after_before_or_after(&self) -> bool {
231
+ matches!(*self, Self::Marker)
232
+ }
233
+
234
+ #[inline]
235
+ fn accepts_state_pseudo_classes(&self) -> bool {
236
+ // Note: if the pseudo element is a descendants of a pseudo element, `only-child` should be
237
+ // allowed after it.
238
+ self.supports_user_action_state() || self.is_in_pseudo_element_tree()
239
+ }
240
+
241
+ #[inline]
242
+ fn specificity_count(&self) -> u32 {
243
+ self.specificity_count()
244
+ }
245
+
246
+ #[inline]
247
+ fn is_in_pseudo_element_tree(&self) -> bool {
248
+ // All the named view transition pseudo-elements are the descendants of a pseudo-element
249
+ // root.
250
+ self.is_named_view_transition()
251
+ }
252
+
253
+ fn parses_as_element_backed(&self) -> bool {
254
+ self.flags()
255
+ .intersects(PseudoStyleTypeFlags::PARSES_AS_ELEMENT_BACKED)
256
+ }
257
+
258
+ /// Whether the current pseudo element is ::before or ::after.
259
+ #[inline]
260
+ fn is_before_or_after(&self) -> bool {
261
+ matches!(*self, PseudoElement::Before | PseudoElement::After)
262
+ }
263
+ }
264
+
265
+ impl PseudoElement {
266
+ /// Whether this pseudo-element is "element-backed", which means that it inherits from its regular
267
+ /// flat tree parent, which might not be the originating element.
268
+ #[inline]
269
+ pub fn is_element_backed(&self) -> bool {
270
+ self.flags()
271
+ .intersects(PseudoStyleTypeFlags::IS_ELEMENT_BACKED)
272
+ }
273
+
274
+ /// Returns the kind of cascade type that a given pseudo is going to use.
275
+ ///
276
+ /// In Gecko we only compute ::before and ::after eagerly. We save the rules
277
+ /// for anonymous boxes separately, so we resolve them as precomputed
278
+ /// pseudos.
279
+ ///
280
+ /// We resolve the others lazily, see `Servo_ResolvePseudoStyle`.
281
+ pub fn cascade_type(&self) -> PseudoElementCascadeType {
282
+ if self.is_eager() {
283
+ debug_assert!(!self.is_anon_box());
284
+ return PseudoElementCascadeType::Eager;
285
+ }
286
+
287
+ if self.is_precomputed() {
288
+ return PseudoElementCascadeType::Precomputed;
289
+ }
290
+
291
+ PseudoElementCascadeType::Lazy
292
+ }
293
+
294
+ /// Returns an index of the pseudo-element.
295
+ #[inline]
296
+ pub fn index(&self) -> usize {
297
+ self.discriminant() as usize
298
+ }
299
+
300
+ #[inline]
301
+ fn discriminant(&self) -> u8 {
302
+ // SAFETY: #[repr(u8) guarantees this, see comments in
303
+ // https://doc.rust-lang.org/std/mem/fn.discriminant.html
304
+ unsafe { *(self as *const _ as *const u8) }
305
+ }
306
+
307
+ /// Whether this pseudo-element is an unknown Webkit-prefixed pseudo-element.
308
+ #[inline]
309
+ pub fn is_unknown_webkit_pseudo_element(&self) -> bool {
310
+ matches!(*self, PseudoElement::UnknownWebkit(..))
311
+ }
312
+
313
+ /// Whether this pseudo-element is an anonymous box.
314
+ #[inline]
315
+ pub fn is_anon_box(&self) -> bool {
316
+ self.flags().intersects(PseudoStyleTypeFlags::IS_ANON_BOX)
317
+ }
318
+
319
+ /// Whether this pseudo-element is eagerly-cascaded.
320
+ #[inline]
321
+ pub fn is_eager(&self) -> bool {
322
+ self.flags().intersects(PseudoStyleTypeFlags::IS_EAGER)
323
+ }
324
+
325
+ /// Whether this pseudo-element takes an argument.
326
+ #[inline]
327
+ pub fn has_argument(&self) -> bool {
328
+ self.flags().intersects(PseudoStyleTypeFlags::HAS_ARGUMENT)
329
+ }
330
+
331
+ /// Gets the canonical index of this eagerly-cascaded pseudo-element.
332
+ #[inline]
333
+ pub fn eager_index(&self) -> usize {
334
+ EAGER_PSEUDOS
335
+ .iter()
336
+ .position(|p| p == self)
337
+ .expect("Not an eager pseudo")
338
+ }
339
+
340
+ /// Creates a pseudo-element from an eager index.
341
+ #[inline]
342
+ pub fn from_eager_index(i: usize) -> Self {
343
+ EAGER_PSEUDOS[i].clone()
344
+ }
345
+
346
+ /// Whether animations for the current pseudo element are stored in the
347
+ /// parent element.
348
+ #[inline]
349
+ pub fn animations_stored_in_parent(&self) -> bool {
350
+ matches!(
351
+ *self,
352
+ Self::Before | Self::After | Self::Marker | Self::Backdrop
353
+ )
354
+ }
355
+
356
+ /// Whether this pseudo-element is the ::before pseudo.
357
+ #[inline]
358
+ pub fn is_before(&self) -> bool {
359
+ *self == PseudoElement::Before
360
+ }
361
+
362
+ /// Whether this pseudo-element is the ::after pseudo.
363
+ #[inline]
364
+ pub fn is_after(&self) -> bool {
365
+ *self == PseudoElement::After
366
+ }
367
+
368
+ /// Whether this pseudo-element is the ::marker pseudo.
369
+ #[inline]
370
+ pub fn is_marker(&self) -> bool {
371
+ *self == PseudoElement::Marker
372
+ }
373
+
374
+ /// Whether this pseudo-element is the ::selection pseudo.
375
+ #[inline]
376
+ pub fn is_selection(&self) -> bool {
377
+ *self == PseudoElement::Selection
378
+ }
379
+
380
+ /// Whether this pseudo-element is ::first-letter.
381
+ #[inline]
382
+ pub fn is_first_letter(&self) -> bool {
383
+ *self == PseudoElement::FirstLetter
384
+ }
385
+
386
+ /// Whether this pseudo-element is ::first-line.
387
+ #[inline]
388
+ pub fn is_first_line(&self) -> bool {
389
+ *self == PseudoElement::FirstLine
390
+ }
391
+
392
+ /// Whether this pseudo-element is lazily-cascaded.
393
+ #[inline]
394
+ pub fn is_lazy(&self) -> bool {
395
+ !self.is_eager() && !self.is_precomputed()
396
+ }
397
+
398
+ /// The identifier of the highlight this pseudo-element represents.
399
+ pub fn highlight_name(&self) -> Option<&AtomIdent> {
400
+ match *self {
401
+ Self::Highlight(ref name) => Some(name),
402
+ _ => None,
403
+ }
404
+ }
405
+
406
+ /// Whether this pseudo-element is the ::highlight pseudo.
407
+ pub fn is_highlight(&self) -> bool {
408
+ matches!(*self, Self::Highlight(_))
409
+ }
410
+
411
+ /// Whether this pseudo-element is the ::target-text pseudo.
412
+ #[inline]
413
+ pub fn is_target_text(&self) -> bool {
414
+ *self == PseudoElement::TargetText
415
+ }
416
+
417
+ /// Whether this is a highlight pseudo-element that is styled lazily during
418
+ /// painting rather than during the restyle traversal. These pseudos need
419
+ /// explicit repaint triggering when their styles change.
420
+ #[inline]
421
+ pub fn is_lazy_painted_highlight_pseudo(&self) -> bool {
422
+ self.is_selection() || self.is_highlight() || self.is_target_text()
423
+ }
424
+
425
+ /// Whether this pseudo-element is a named view transition pseudo-element.
426
+ pub fn is_named_view_transition(&self) -> bool {
427
+ matches!(
428
+ *self,
429
+ Self::ViewTransitionGroup(..)
430
+ | Self::ViewTransitionImagePair(..)
431
+ | Self::ViewTransitionOld(..)
432
+ | Self::ViewTransitionNew(..)
433
+ )
434
+ }
435
+
436
+ /// The count we contribute to the specificity from this pseudo-element.
437
+ pub fn specificity_count(&self) -> u32 {
438
+ match *self {
439
+ Self::ViewTransitionGroup(ref name_and_class)
440
+ | Self::ViewTransitionImagePair(ref name_and_class)
441
+ | Self::ViewTransitionOld(ref name_and_class)
442
+ | Self::ViewTransitionNew(ref name_and_class) => {
443
+ // The specificity of a named view transition pseudo-element selector with either:
444
+ // 1. a <pt-name-selector> with a <custom-ident>; or
445
+ // 2. a <pt-class-selector> with at least one <custom-ident>,
446
+ // is equivalent to a type selector.
447
+ //
448
+ // The specificity of a named view transition pseudo-element selector with a `*`
449
+ // argument and with an empty <pt-class-selector> is zero.
450
+ // https://drafts.csswg.org/css-view-transitions-2/#pseudo-element-class-additions
451
+ (name_and_class.name() != &atom!("*") || !name_and_class.classes().is_empty())
452
+ as u32
453
+ },
454
+ _ => 1,
455
+ }
456
+ }
457
+
458
+ /// Whether this pseudo-element supports user action selectors.
459
+ pub fn supports_user_action_state(&self) -> bool {
460
+ self.flags()
461
+ .intersects(PseudoStyleTypeFlags::SUPPORTS_USER_ACTION_STATE)
462
+ }
463
+
464
+ /// Returns true if the given pseudo-element is enabled for the document
465
+ /// represented by `url_data`, according to its `enabled_domains_pref` toml
466
+ /// setting. A pseudo-element without such a pref is enabled everywhere, an
467
+ /// empty list is enabled nowhere, and `*` is enabled everywhere.
468
+ fn is_pseudo_enabled_for_url(&self, url_data: &crate::stylesheets::UrlExtraData) -> bool {
469
+ let Some(list) = self.enabled_domains() else {
470
+ return true;
471
+ };
472
+ if list == "*" {
473
+ return true;
474
+ }
475
+ unsafe { crate::gecko_bindings::bindings::Gecko_IsURIInList(url_data.ptr(), &*list) }
476
+ }
477
+
478
+ /// Whether this pseudo-element is enabled for all content.
479
+ pub fn enabled_in_content(
480
+ &self,
481
+ url_data: &crate::stylesheets::UrlExtraData,
482
+ for_supports_rule: bool,
483
+ ) -> bool {
484
+ if !Self::type_enabled_in_content(self.pseudo_type()) {
485
+ return false;
486
+ }
487
+ if !self.is_pseudo_enabled_for_url(url_data) {
488
+ return false;
489
+ }
490
+ if for_supports_rule && matches!(*self, Self::WebkitScrollbar) {
491
+ // ::-webkit-scrollbar remains false in @supports even when we "support" it, like
492
+ // other unknown webkit pseudo-elements.
493
+ return false;
494
+ }
495
+ true
496
+ }
497
+
498
+ /// Whether this pseudo is enabled explicitly in UA sheets.
499
+ pub fn enabled_in_ua_sheets(&self) -> bool {
500
+ self.flags().intersects(PseudoStyleTypeFlags::ENABLED_IN_UA)
501
+ }
502
+
503
+ /// Whether this pseudo is enabled explicitly in chrome sheets.
504
+ pub fn enabled_in_chrome(&self) -> bool {
505
+ self.flags()
506
+ .intersects(PseudoStyleTypeFlags::ENABLED_IN_CHROME)
507
+ }
508
+
509
+ /// Whether this pseudo-element skips flex/grid container display-based
510
+ /// fixup.
511
+ #[inline]
512
+ pub fn skip_item_display_fixup(&self) -> bool {
513
+ !self
514
+ .flags()
515
+ .intersects(PseudoStyleTypeFlags::IS_FLEX_OR_GRID_ITEM)
516
+ }
517
+
518
+ /// Whether this pseudo-element is precomputed.
519
+ #[inline]
520
+ pub fn is_precomputed(&self) -> bool {
521
+ self.is_anon_box()
522
+ }
523
+
524
+ /// Property flag that properties must have to apply to this pseudo-element.
525
+ #[inline]
526
+ pub fn property_restriction(&self) -> Option<PropertyFlags> {
527
+ Some(match *self {
528
+ PseudoElement::FirstLetter => PropertyFlags::APPLIES_TO_FIRST_LETTER,
529
+ PseudoElement::FirstLine => PropertyFlags::APPLIES_TO_FIRST_LINE,
530
+ PseudoElement::Placeholder => PropertyFlags::APPLIES_TO_PLACEHOLDER,
531
+ PseudoElement::Cue => PropertyFlags::APPLIES_TO_CUE,
532
+ PseudoElement::Marker => PropertyFlags::APPLIES_TO_MARKER,
533
+ _ => return None,
534
+ })
535
+ }
536
+
537
+ /// Whether this pseudo-element should actually exist if it has
538
+ /// the given styles.
539
+ pub fn should_exist(&self, style: &ComputedValues) -> bool {
540
+ debug_assert!(self.is_eager());
541
+
542
+ if style.get_box().clone_display() == Display::None {
543
+ return false;
544
+ }
545
+
546
+ if self.is_before_or_after() && style.ineffective_content_property() {
547
+ return false;
548
+ }
549
+
550
+ true
551
+ }
552
+
553
+ /// Parse the pseudo-element string without the check of enabled state. This may includes
554
+ /// all possible PseudoElement, including tree pseudo-elements and anonymous box.
555
+ // TODO: Bug 1845712. Merge this with the pseudo element part in parse_one_simple_selector().
556
+ pub fn parse_ignore_enabled_state(input: &mut Parser) -> Result<Self, ParseError> {
557
+ use crate::gecko::selector_parser;
558
+ use cssparser::Token;
559
+ use selectors::parser::{is_css2_pseudo_element, SelectorParseErrorKind};
560
+ use style_traits::StyleParseErrorKind;
561
+
562
+ // The pseudo-element string should start with ':'.
563
+ input.expect_colon()?;
564
+
565
+ let next = input.next_including_whitespace()?;
566
+ if !matches!(next, Token::Colon) {
567
+ // Parse a CSS2 pseudo-element.
568
+ let name = match next {
569
+ Token::Ident(name) if is_css2_pseudo_element(name) => name,
570
+ _ => return Err(ParseError::custom(StyleParseErrorKind::UnspecifiedError)),
571
+ };
572
+ return PseudoElement::from_slice(name).ok_or(ParseError::custom(
573
+ SelectorParseErrorKind::UnsupportedPseudoClassOrElement,
574
+ ));
575
+ }
576
+
577
+ // Now we have double colons, so check the following tokens.
578
+ match input.next_including_whitespace()?.clone() {
579
+ Token::Ident(name) => {
580
+ // We don't need to parse unknown ::-webkit-* pseudo-elements in this function.
581
+ PseudoElement::from_slice(&name).ok_or(ParseError::custom(
582
+ SelectorParseErrorKind::UnsupportedPseudoClassOrElement,
583
+ ))
584
+ },
585
+ Token::Function(name) => {
586
+ // Note: ::slotted() and ::part() are not accepted in getComputedStyle().
587
+ // https://drafts.csswg.org/cssom/#dom-window-getcomputedstyle
588
+ input.parse_nested_block(|input| {
589
+ selector_parser::parse_functional_pseudo_element_with_name(
590
+ &name,
591
+ input,
592
+ Target::Cssom,
593
+ )
594
+ })
595
+ },
596
+ _ => Err(ParseError::unexpected_token()),
597
+ }
598
+ }
599
+
600
+ /// Returns true if this pseudo-element matches its selector.
601
+ pub fn matches_named_view_transition_pseudo_element(
602
+ &self,
603
+ selector: &Self,
604
+ element: &super::wrapper::GeckoElement,
605
+ ) -> bool {
606
+ use crate::gecko_bindings::bindings;
607
+
608
+ match (self, selector) {
609
+ (
610
+ &Self::ViewTransitionGroup(ref name),
611
+ &Self::ViewTransitionGroup(ref s_name_class),
612
+ )
613
+ | (
614
+ &Self::ViewTransitionImagePair(ref name),
615
+ &Self::ViewTransitionImagePair(ref s_name_class),
616
+ )
617
+ | (&Self::ViewTransitionOld(ref name), &Self::ViewTransitionOld(ref s_name_class))
618
+ | (&Self::ViewTransitionNew(ref name), &Self::ViewTransitionNew(ref s_name_class)) => {
619
+ // Named view transition pseudos accept the universal selector as the name, so we
620
+ // check it first.
621
+ // https://drafts.csswg.org/css-view-transitions-1/#named-view-transition-pseudo
622
+ let s_name = s_name_class.name();
623
+ if s_name != name.name() && s_name != &atom!("*") {
624
+ return false;
625
+ }
626
+
627
+ // We have to check class list only when the name is matched and there are one or
628
+ // more <pt-class-selector>s.
629
+ s_name_class.classes().is_empty()
630
+ || unsafe {
631
+ bindings::Gecko_MatchViewTransitionClass(
632
+ element.0,
633
+ s_name_class.name_and_classes(),
634
+ )
635
+ }
636
+ },
637
+ _ => false,
638
+ }
639
+ }
640
+ }