@ohos-ports/html2canvas-pro 0.0.0-stage → 2.3.2-beta.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.
- package/LICENSE +21 -0
- package/README.md +86 -2
- package/dist/html2canvas-pro.cjs +11191 -0
- package/dist/html2canvas-pro.cjs.map +1 -0
- package/dist/html2canvas-pro.esm.js +11182 -0
- package/dist/html2canvas-pro.esm.js.map +1 -0
- package/dist/html2canvas-pro.js +11196 -0
- package/dist/html2canvas-pro.js.map +1 -0
- package/dist/html2canvas-pro.min.js +10 -0
- package/dist/lib/config.js +49 -0
- package/dist/lib/core/abort-helper.js +20 -0
- package/dist/lib/core/background-parser.js +41 -0
- package/dist/lib/core/bitwise.js +5 -0
- package/dist/lib/core/cache-storage.js +268 -0
- package/dist/lib/core/config-assembler.js +88 -0
- package/dist/lib/core/constants.js +25 -0
- package/dist/lib/core/context.js +19 -0
- package/dist/lib/core/debugger.js +27 -0
- package/dist/lib/core/features.js +190 -0
- package/dist/lib/core/logger.js +56 -0
- package/dist/lib/core/lru-map.js +66 -0
- package/dist/lib/core/origin-checker.js +53 -0
- package/dist/lib/core/performance-monitor.js +185 -0
- package/dist/lib/core/render-element.js +132 -0
- package/dist/lib/core/util.js +4 -0
- package/dist/lib/core/validator.js +500 -0
- package/dist/lib/css/grouped/background-styles.js +36 -0
- package/dist/lib/css/grouped/border-styles.js +75 -0
- package/dist/lib/css/grouped/font-styles.js +93 -0
- package/dist/lib/css/grouped/layout-styles.js +127 -0
- package/dist/lib/css/index.js +330 -0
- package/dist/lib/css/layout/bounds.js +52 -0
- package/dist/lib/css/layout/text.js +133 -0
- package/dist/lib/css/property-descriptor.js +2 -0
- package/dist/lib/css/property-descriptors/background-blend-mode.js +41 -0
- package/dist/lib/css/property-descriptors/background-clip.js +23 -0
- package/dist/lib/css/property-descriptors/background-color.js +10 -0
- package/dist/lib/css/property-descriptors/background-image.js +24 -0
- package/dist/lib/css/property-descriptors/background-origin.js +23 -0
- package/dist/lib/css/property-descriptors/background-position.js +19 -0
- package/dist/lib/css/property-descriptors/background-repeat.js +33 -0
- package/dist/lib/css/property-descriptors/background-size.js +23 -0
- package/dist/lib/css/property-descriptors/border-color.js +14 -0
- package/dist/lib/css/property-descriptors/border-image-repeat.js +42 -0
- package/dist/lib/css/property-descriptors/border-image-slice.js +45 -0
- package/dist/lib/css/property-descriptors/border-image-source.js +22 -0
- package/dist/lib/css/property-descriptors/border-radius.js +15 -0
- package/dist/lib/css/property-descriptors/border-style.js +26 -0
- package/dist/lib/css/property-descriptors/border-width.js +20 -0
- package/dist/lib/css/property-descriptors/box-decoration-break.js +18 -0
- package/dist/lib/css/property-descriptors/box-shadow.js +54 -0
- package/dist/lib/css/property-descriptors/clip-path.js +189 -0
- package/dist/lib/css/property-descriptors/color.js +10 -0
- package/dist/lib/css/property-descriptors/content.js +19 -0
- package/dist/lib/css/property-descriptors/counter-increment.js +35 -0
- package/dist/lib/css/property-descriptors/counter-reset.js +18 -0
- package/dist/lib/css/property-descriptors/direction.js +18 -0
- package/dist/lib/css/property-descriptors/display.js +81 -0
- package/dist/lib/css/property-descriptors/duration.js +14 -0
- package/dist/lib/css/property-descriptors/filter.js +76 -0
- package/dist/lib/css/property-descriptors/float.js +22 -0
- package/dist/lib/css/property-descriptors/font-family.js +32 -0
- package/dist/lib/css/property-descriptors/font-size.js +10 -0
- package/dist/lib/css/property-descriptors/font-style.js +20 -0
- package/dist/lib/css/property-descriptors/font-variant-ligatures.js +34 -0
- package/dist/lib/css/property-descriptors/font-variant.js +13 -0
- package/dist/lib/css/property-descriptors/font-weight.js +25 -0
- package/dist/lib/css/property-descriptors/image-rendering.js +33 -0
- package/dist/lib/css/property-descriptors/letter-spacing.js +21 -0
- package/dist/lib/css/property-descriptors/line-break.js +23 -0
- package/dist/lib/css/property-descriptors/line-height.js +24 -0
- package/dist/lib/css/property-descriptors/list-style-image.js +17 -0
- package/dist/lib/css/property-descriptors/list-style-position.js +18 -0
- package/dist/lib/css/property-descriptors/list-style-type.js +122 -0
- package/dist/lib/css/property-descriptors/margin.js +13 -0
- package/dist/lib/css/property-descriptors/mix-blend-mode.js +31 -0
- package/dist/lib/css/property-descriptors/object-fit.js +28 -0
- package/dist/lib/css/property-descriptors/object-position.js +42 -0
- package/dist/lib/css/property-descriptors/opacity.js +16 -0
- package/dist/lib/css/property-descriptors/overflow-wrap.js +18 -0
- package/dist/lib/css/property-descriptors/overflow.js +27 -0
- package/dist/lib/css/property-descriptors/padding.js +14 -0
- package/dist/lib/css/property-descriptors/paint-order.js +33 -0
- package/dist/lib/css/property-descriptors/position.js +22 -0
- package/dist/lib/css/property-descriptors/quotes.js +41 -0
- package/dist/lib/css/property-descriptors/rotate.js +27 -0
- package/dist/lib/css/property-descriptors/text-align.js +21 -0
- package/dist/lib/css/property-descriptors/text-decoration-color.js +10 -0
- package/dist/lib/css/property-descriptors/text-decoration-line.js +28 -0
- package/dist/lib/css/property-descriptors/text-decoration-style.js +24 -0
- package/dist/lib/css/property-descriptors/text-decoration-thickness.js +26 -0
- package/dist/lib/css/property-descriptors/text-overflow.js +18 -0
- package/dist/lib/css/property-descriptors/text-shadow.js +46 -0
- package/dist/lib/css/property-descriptors/text-transform.js +20 -0
- package/dist/lib/css/property-descriptors/text-underline-offset.js +23 -0
- package/dist/lib/css/property-descriptors/transform-origin.js +24 -0
- package/dist/lib/css/property-descriptors/transform.js +57 -0
- package/dist/lib/css/property-descriptors/visibility.js +20 -0
- package/dist/lib/css/property-descriptors/webkit-line-clamp.js +26 -0
- package/dist/lib/css/property-descriptors/webkit-text-stroke-color.js +10 -0
- package/dist/lib/css/property-descriptors/webkit-text-stroke-width.js +16 -0
- package/dist/lib/css/property-descriptors/word-break.js +26 -0
- package/dist/lib/css/property-descriptors/writing-mode.js +28 -0
- package/dist/lib/css/property-descriptors/z-index.js +19 -0
- package/dist/lib/css/property-descriptors/zoom.js +18 -0
- package/dist/lib/css/syntax/parser.js +140 -0
- package/dist/lib/css/syntax/token-constants.js +214 -0
- package/dist/lib/css/syntax/token-singletons.js +36 -0
- package/dist/lib/css/syntax/token-types.js +10 -0
- package/dist/lib/css/syntax/tokenizer.js +502 -0
- package/dist/lib/css/type-descriptor.js +2 -0
- package/dist/lib/css/types/angle.js +80 -0
- package/dist/lib/css/types/color-math.js +25 -0
- package/dist/lib/css/types/color-spaces/a98.js +78 -0
- package/dist/lib/css/types/color-spaces/p3.js +86 -0
- package/dist/lib/css/types/color-spaces/pro-photo.js +83 -0
- package/dist/lib/css/types/color-spaces/rec2020.js +85 -0
- package/dist/lib/css/types/color-spaces/srgb.js +79 -0
- package/dist/lib/css/types/color-utilities.js +342 -0
- package/dist/lib/css/types/color.js +400 -0
- package/dist/lib/css/types/functions/-prefix-linear-gradient.js +32 -0
- package/dist/lib/css/types/functions/-prefix-radial-gradient.js +83 -0
- package/dist/lib/css/types/functions/-webkit-gradient.js +59 -0
- package/dist/lib/css/types/functions/counter.js +367 -0
- package/dist/lib/css/types/functions/gradient.js +163 -0
- package/dist/lib/css/types/functions/linear-gradient.js +27 -0
- package/dist/lib/css/types/functions/radial-gradient.js +90 -0
- package/dist/lib/css/types/functions/repeating-linear-gradient.js +9 -0
- package/dist/lib/css/types/image.js +62 -0
- package/dist/lib/css/types/index.js +2 -0
- package/dist/lib/css/types/length-percentage.js +197 -0
- package/dist/lib/css/types/length.js +5 -0
- package/dist/lib/css/types/safe-eval.js +80 -0
- package/dist/lib/css/types/time.js +17 -0
- package/dist/lib/dom/document-cloner.js +597 -0
- package/dist/lib/dom/dom-normalizer.js +115 -0
- package/dist/lib/dom/element-container.js +56 -0
- package/dist/lib/dom/elements/li-element-container.js +11 -0
- package/dist/lib/dom/elements/ol-element-container.js +12 -0
- package/dist/lib/dom/elements/select-element-container.js +12 -0
- package/dist/lib/dom/elements/textarea-element-container.js +11 -0
- package/dist/lib/dom/node-parser.js +112 -0
- package/dist/lib/dom/node-type-guards.js +81 -0
- package/dist/lib/dom/replaced-elements/canvas-element-container.js +13 -0
- package/dist/lib/dom/replaced-elements/iframe-element-container.js +38 -0
- package/dist/lib/dom/replaced-elements/image-element-container.js +14 -0
- package/dist/lib/dom/replaced-elements/index.js +2 -0
- package/dist/lib/dom/replaced-elements/input-element-container.js +89 -0
- package/dist/lib/dom/replaced-elements/svg-element-container.js +19 -0
- package/dist/lib/dom/slot-cloner.js +176 -0
- package/dist/lib/dom/text-container.js +35 -0
- package/dist/lib/index.js +49 -0
- package/dist/lib/options.js +2 -0
- package/dist/lib/render/background.js +188 -0
- package/dist/lib/render/bezier-curve.js +34 -0
- package/dist/lib/render/border.js +104 -0
- package/dist/lib/render/bound-curves.js +188 -0
- package/dist/lib/render/box-sizing.js +20 -0
- package/dist/lib/render/canvas/background-renderer.js +327 -0
- package/dist/lib/render/canvas/border-image-renderer.js +153 -0
- package/dist/lib/render/canvas/border-renderer.js +184 -0
- package/dist/lib/render/canvas/canvas-path.js +25 -0
- package/dist/lib/render/canvas/canvas-renderer.js +312 -0
- package/dist/lib/render/canvas/content-renderer.js +204 -0
- package/dist/lib/render/canvas/effects-renderer.js +171 -0
- package/dist/lib/render/canvas/font-utils.js +29 -0
- package/dist/lib/render/canvas/foreignobject-renderer.js +38 -0
- package/dist/lib/render/canvas/text/text-decoration-renderer.js +99 -0
- package/dist/lib/render/canvas/text-renderer.js +485 -0
- package/dist/lib/render/effects.js +231 -0
- package/dist/lib/render/font-metrics.js +53 -0
- package/dist/lib/render/object-fit.js +91 -0
- package/dist/lib/render/path.js +26 -0
- package/dist/lib/render/renderer-interface.js +2 -0
- package/dist/lib/render/stacking-context.js +340 -0
- package/dist/lib/render/vector.js +16 -0
- package/dist/types/config.d.ts +44 -0
- package/dist/types/core/abort-helper.d.ts +12 -0
- package/dist/types/core/background-parser.d.ts +16 -0
- package/dist/types/core/bitwise.d.ts +1 -0
- package/dist/types/core/cache-storage.d.ts +68 -0
- package/dist/types/core/config-assembler.d.ts +28 -0
- package/dist/types/core/constants.d.ts +22 -0
- package/dist/types/core/context.d.ts +22 -0
- package/dist/types/core/debugger.d.ts +8 -0
- package/dist/types/core/features.d.ts +12 -0
- package/dist/types/core/logger.d.ts +18 -0
- package/dist/types/core/lru-map.d.ts +37 -0
- package/dist/types/core/origin-checker.d.ts +33 -0
- package/dist/types/core/performance-monitor.d.ts +120 -0
- package/dist/types/core/render-element.d.ts +3 -0
- package/dist/types/core/util.d.ts +1 -0
- package/dist/types/core/validator.d.ts +130 -0
- package/dist/types/css/grouped/background-styles.d.ts +16 -0
- package/dist/types/css/grouped/border-styles.d.ts +31 -0
- package/dist/types/css/grouped/font-styles.d.ts +35 -0
- package/dist/types/css/grouped/layout-styles.d.ts +46 -0
- package/dist/types/css/index.d.ts +185 -0
- package/dist/types/css/layout/bounds.d.ts +14 -0
- package/dist/types/css/layout/text.d.ts +10 -0
- package/dist/types/css/property-descriptor.d.ts +40 -0
- package/dist/types/css/property-descriptors/background-blend-mode.d.ts +23 -0
- package/dist/types/css/property-descriptors/background-clip.d.ts +8 -0
- package/dist/types/css/property-descriptors/background-color.d.ts +2 -0
- package/dist/types/css/property-descriptors/background-image.d.ts +3 -0
- package/dist/types/css/property-descriptors/background-origin.d.ts +8 -0
- package/dist/types/css/property-descriptors/background-position.d.ts +5 -0
- package/dist/types/css/property-descriptors/background-repeat.d.ts +9 -0
- package/dist/types/css/property-descriptors/background-size.d.ts +11 -0
- package/dist/types/css/property-descriptors/border-color.d.ts +5 -0
- package/dist/types/css/property-descriptors/border-image-repeat.d.ts +12 -0
- package/dist/types/css/property-descriptors/border-image-slice.d.ts +10 -0
- package/dist/types/css/property-descriptors/border-image-source.d.ts +4 -0
- package/dist/types/css/property-descriptors/border-radius.d.ts +7 -0
- package/dist/types/css/property-descriptors/border-style.d.ts +12 -0
- package/dist/types/css/property-descriptors/border-width.d.ts +5 -0
- package/dist/types/css/property-descriptors/box-decoration-break.d.ts +6 -0
- package/dist/types/css/property-descriptors/box-shadow.d.ts +14 -0
- package/dist/types/css/property-descriptors/clip-path.d.ts +62 -0
- package/dist/types/css/property-descriptors/color.d.ts +2 -0
- package/dist/types/css/property-descriptors/content.d.ts +4 -0
- package/dist/types/css/property-descriptors/counter-increment.d.ts +10 -0
- package/dist/types/css/property-descriptors/counter-reset.d.ts +7 -0
- package/dist/types/css/property-descriptors/direction.d.ts +6 -0
- package/dist/types/css/property-descriptors/display.d.ts +35 -0
- package/dist/types/css/property-descriptors/duration.d.ts +2 -0
- package/dist/types/css/property-descriptors/filter.d.ts +3 -0
- package/dist/types/css/property-descriptors/float.d.ts +9 -0
- package/dist/types/css/property-descriptors/font-family.d.ts +4 -0
- package/dist/types/css/property-descriptors/font-size.d.ts +2 -0
- package/dist/types/css/property-descriptors/font-style.d.ts +7 -0
- package/dist/types/css/property-descriptors/font-variant-ligatures.d.ts +14 -0
- package/dist/types/css/property-descriptors/font-variant.d.ts +2 -0
- package/dist/types/css/property-descriptors/font-weight.d.ts +2 -0
- package/dist/types/css/property-descriptors/image-rendering.d.ts +8 -0
- package/dist/types/css/property-descriptors/letter-spacing.d.ts +2 -0
- package/dist/types/css/property-descriptors/line-break.d.ts +6 -0
- package/dist/types/css/property-descriptors/line-height.d.ts +4 -0
- package/dist/types/css/property-descriptors/list-style-image.d.ts +3 -0
- package/dist/types/css/property-descriptors/list-style-position.d.ts +6 -0
- package/dist/types/css/property-descriptors/list-style-type.d.ts +58 -0
- package/dist/types/css/property-descriptors/margin.d.ts +5 -0
- package/dist/types/css/property-descriptors/mix-blend-mode.d.ts +21 -0
- package/dist/types/css/property-descriptors/object-fit.d.ts +10 -0
- package/dist/types/css/property-descriptors/object-position.d.ts +4 -0
- package/dist/types/css/property-descriptors/opacity.d.ts +2 -0
- package/dist/types/css/property-descriptors/overflow-wrap.d.ts +6 -0
- package/dist/types/css/property-descriptors/overflow.d.ts +9 -0
- package/dist/types/css/property-descriptors/padding.d.ts +5 -0
- package/dist/types/css/property-descriptors/paint-order.d.ts +8 -0
- package/dist/types/css/property-descriptors/position.d.ts +9 -0
- package/dist/types/css/property-descriptors/quotes.d.ts +8 -0
- package/dist/types/css/property-descriptors/rotate.d.ts +3 -0
- package/dist/types/css/property-descriptors/text-align.d.ts +7 -0
- package/dist/types/css/property-descriptors/text-decoration-color.d.ts +2 -0
- package/dist/types/css/property-descriptors/text-decoration-line.d.ts +10 -0
- package/dist/types/css/property-descriptors/text-decoration-style.d.ts +9 -0
- package/dist/types/css/property-descriptors/text-decoration-thickness.d.ts +3 -0
- package/dist/types/css/property-descriptors/text-overflow.d.ts +6 -0
- package/dist/types/css/property-descriptors/text-shadow.d.ts +12 -0
- package/dist/types/css/property-descriptors/text-transform.d.ts +8 -0
- package/dist/types/css/property-descriptors/text-underline-offset.d.ts +3 -0
- package/dist/types/css/property-descriptors/transform-origin.d.ts +4 -0
- package/dist/types/css/property-descriptors/transform.d.ts +4 -0
- package/dist/types/css/property-descriptors/visibility.d.ts +7 -0
- package/dist/types/css/property-descriptors/webkit-line-clamp.d.ts +7 -0
- package/dist/types/css/property-descriptors/webkit-text-stroke-color.d.ts +2 -0
- package/dist/types/css/property-descriptors/webkit-text-stroke-width.d.ts +2 -0
- package/dist/types/css/property-descriptors/word-break.d.ts +7 -0
- package/dist/types/css/property-descriptors/writing-mode.d.ts +11 -0
- package/dist/types/css/property-descriptors/z-index.d.ts +7 -0
- package/dist/types/css/property-descriptors/zoom.d.ts +3 -0
- package/dist/types/css/syntax/parser.d.ts +34 -0
- package/dist/types/css/syntax/token-constants.d.ts +74 -0
- package/dist/types/css/syntax/token-singletons.d.ts +22 -0
- package/dist/types/css/syntax/token-types.d.ts +72 -0
- package/dist/types/css/syntax/tokenizer.d.ts +32 -0
- package/dist/types/css/type-descriptor.d.ts +6 -0
- package/dist/types/css/types/angle.d.ts +7 -0
- package/dist/types/css/types/color-math.d.ts +12 -0
- package/dist/types/css/types/color-spaces/a98.d.ts +39 -0
- package/dist/types/css/types/color-spaces/p3.d.ts +45 -0
- package/dist/types/css/types/color-spaces/pro-photo.d.ts +45 -0
- package/dist/types/css/types/color-spaces/rec2020.d.ts +45 -0
- package/dist/types/css/types/color-spaces/srgb.d.ts +38 -0
- package/dist/types/css/types/color-utilities.d.ts +107 -0
- package/dist/types/css/types/color.d.ts +8 -0
- package/dist/types/css/types/functions/-prefix-linear-gradient.d.ts +4 -0
- package/dist/types/css/types/functions/-prefix-radial-gradient.d.ts +4 -0
- package/dist/types/css/types/functions/-webkit-gradient.d.ts +4 -0
- package/dist/types/css/types/functions/counter.d.ts +10 -0
- package/dist/types/css/types/functions/gradient.d.ts +7 -0
- package/dist/types/css/types/functions/linear-gradient.d.ts +4 -0
- package/dist/types/css/types/functions/radial-gradient.d.ts +12 -0
- package/dist/types/css/types/functions/repeating-linear-gradient.d.ts +4 -0
- package/dist/types/css/types/image.d.ts +56 -0
- package/dist/types/css/types/index.d.ts +1 -0
- package/dist/types/css/types/length-percentage.d.ts +62 -0
- package/dist/types/css/types/length.d.ts +4 -0
- package/dist/types/css/types/safe-eval.d.ts +8 -0
- package/dist/types/css/types/time.d.ts +2 -0
- package/dist/types/dom/document-cloner.d.ts +57 -0
- package/dist/types/dom/dom-normalizer.d.ts +62 -0
- package/dist/types/dom/element-container.d.ts +31 -0
- package/dist/types/dom/elements/li-element-container.d.ts +6 -0
- package/dist/types/dom/elements/ol-element-container.d.ts +7 -0
- package/dist/types/dom/elements/select-element-container.d.ts +6 -0
- package/dist/types/dom/elements/textarea-element-container.d.ts +6 -0
- package/dist/types/dom/node-parser.d.ts +3 -0
- package/dist/types/dom/node-type-guards.d.ts +32 -0
- package/dist/types/dom/replaced-elements/canvas-element-container.d.ts +8 -0
- package/dist/types/dom/replaced-elements/iframe-element-container.d.ts +14 -0
- package/dist/types/dom/replaced-elements/image-element-container.d.ts +8 -0
- package/dist/types/dom/replaced-elements/index.d.ts +4 -0
- package/dist/types/dom/replaced-elements/input-element-container.d.ts +14 -0
- package/dist/types/dom/replaced-elements/svg-element-container.d.ts +8 -0
- package/dist/types/dom/slot-cloner.d.ts +66 -0
- package/dist/types/dom/text-container.d.ts +8 -0
- package/dist/types/index.d.ts +36 -0
- package/dist/types/options.d.ts +62 -0
- package/dist/types/render/background.d.ts +16 -0
- package/dist/types/render/bezier-curve.d.ts +14 -0
- package/dist/types/render/border.d.ts +6 -0
- package/dist/types/render/bound-curves.d.ts +32 -0
- package/dist/types/render/box-sizing.d.ts +4 -0
- package/dist/types/render/canvas/background-renderer.d.ts +94 -0
- package/dist/types/render/canvas/border-image-renderer.d.ts +18 -0
- package/dist/types/render/canvas/border-renderer.d.ts +67 -0
- package/dist/types/render/canvas/canvas-path.d.ts +3 -0
- package/dist/types/render/canvas/canvas-renderer.d.ts +60 -0
- package/dist/types/render/canvas/content-renderer.d.ts +43 -0
- package/dist/types/render/canvas/effects-renderer.d.ts +90 -0
- package/dist/types/render/canvas/font-utils.d.ts +19 -0
- package/dist/types/render/canvas/foreignobject-renderer.d.ts +10 -0
- package/dist/types/render/canvas/text/text-decoration-renderer.d.ts +18 -0
- package/dist/types/render/canvas/text-renderer.d.ts +103 -0
- package/dist/types/render/effects.d.ts +112 -0
- package/dist/types/render/font-metrics.d.ts +11 -0
- package/dist/types/render/object-fit.d.ts +19 -0
- package/dist/types/render/path.d.ts +13 -0
- package/dist/types/render/renderer-interface.d.ts +28 -0
- package/dist/types/render/stacking-context.d.ts +49 -0
- package/dist/types/render/vector.d.ts +9 -0
- package/package.json +139 -4
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DOM Normalizer
|
|
4
|
+
* Handles DOM side effects that need to happen before rendering
|
|
5
|
+
* Extracted from ElementContainer to follow SRP
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.DOMNormalizer = void 0;
|
|
9
|
+
const node_type_guards_1 = require("./node-type-guards");
|
|
10
|
+
/**
|
|
11
|
+
* Normalize element styles for accurate rendering
|
|
12
|
+
* This includes disabling animations and neutralizing transforms.
|
|
13
|
+
*/
|
|
14
|
+
class DOMNormalizer {
|
|
15
|
+
/**
|
|
16
|
+
* Normalize a single element and return original styles.
|
|
17
|
+
*
|
|
18
|
+
* ## Why we replace transforms with an identity value instead of "none"
|
|
19
|
+
*
|
|
20
|
+
* `getBoundingClientRect()` returns visual (post-transform) coordinates, so we
|
|
21
|
+
* must neutralize any active transform before measuring element bounds.
|
|
22
|
+
*
|
|
23
|
+
* The naive approach of setting `transform: none` (or `rotate: none`) has a
|
|
24
|
+
* critical side-effect: per **CSS Transforms Level 2**, an element whose
|
|
25
|
+
* `transform` is non-none automatically becomes the **containing block** for
|
|
26
|
+
* all of its `position: absolute` *and* `position: fixed` descendants.
|
|
27
|
+
* Setting it to `none` destroys that role, causing children to resolve their
|
|
28
|
+
* percentage dimensions and offsets against an unintended ancestor — which
|
|
29
|
+
* produces completely wrong bounds.
|
|
30
|
+
*
|
|
31
|
+
* Solution: instead of removing the transform, we replace it with a visually
|
|
32
|
+
* inert identity value:
|
|
33
|
+
*
|
|
34
|
+
* - `transform: scale(0.5)` → `transform: translate(0, 0)`
|
|
35
|
+
* - `translate(0, 0)` is an identity transform (no visual change, no layout shift).
|
|
36
|
+
* - `getBoundingClientRect()` returns the same layout-space coordinates as
|
|
37
|
+
* if there were no transform at all.
|
|
38
|
+
* - Because the value is still non-none, the element **remains a containing
|
|
39
|
+
* block** for both `position: absolute` and `position: fixed` descendants.
|
|
40
|
+
*
|
|
41
|
+
* - `rotate: 45deg` → `rotate: 0deg`
|
|
42
|
+
* - `0deg` is the identity rotation; `0deg ≠ none`, so the same containing-
|
|
43
|
+
* block guarantee holds.
|
|
44
|
+
*
|
|
45
|
+
* @param element - Element to normalize
|
|
46
|
+
* @param styles - Parsed CSS styles
|
|
47
|
+
* @returns Original styles map for restoration
|
|
48
|
+
*/
|
|
49
|
+
static normalizeElement(element, styles) {
|
|
50
|
+
const originalStyles = {};
|
|
51
|
+
if (!(0, node_type_guards_1.isHTMLElementNode)(element)) {
|
|
52
|
+
return originalStyles;
|
|
53
|
+
}
|
|
54
|
+
// Disable animations to capture static state
|
|
55
|
+
if (styles.animationDuration.some((duration) => duration > 0)) {
|
|
56
|
+
originalStyles.animationDuration = element.style.animationDuration;
|
|
57
|
+
element.style.animationDuration = '0s';
|
|
58
|
+
}
|
|
59
|
+
// Replace the actual transform with an identity translate so that:
|
|
60
|
+
// 1. getBoundingClientRect() returns layout-space (unscaled/unrotated) coords.
|
|
61
|
+
// 2. The element still satisfies "transform != none" and therefore keeps
|
|
62
|
+
// its role as a containing block for position:absolute / position:fixed
|
|
63
|
+
// descendants (CSS Transforms Level 2 §2.3).
|
|
64
|
+
if (styles.transform !== null) {
|
|
65
|
+
originalStyles.transform = element.style.transform;
|
|
66
|
+
element.style.transform = 'translate(0, 0)';
|
|
67
|
+
}
|
|
68
|
+
// Same rationale for the standalone `rotate` property.
|
|
69
|
+
// `rotate: 0deg` is an identity rotation with no visual effect.
|
|
70
|
+
//
|
|
71
|
+
// However, individual transform properties (`rotate`, `translate`, `scale`)
|
|
72
|
+
// are part of CSS Transforms Level 2 and their containing-block guarantee
|
|
73
|
+
// is not uniformly implemented across all browsers. To be safe, if `rotate`
|
|
74
|
+
// is the only transform-like property active on this element, we also set
|
|
75
|
+
// `transform: translate(0, 0)` so that the containing-block role is reliably
|
|
76
|
+
// preserved via the well-supported `transform` property.
|
|
77
|
+
if (styles.rotate !== null) {
|
|
78
|
+
originalStyles.rotate = element.style.rotate;
|
|
79
|
+
element.style.rotate = '0deg';
|
|
80
|
+
// Individual transform properties (`rotate`, `translate`, `scale`) are
|
|
81
|
+
// CSS Transforms Level 2 and their containing-block guarantee is not
|
|
82
|
+
// uniformly implemented in all browsers. If `transform` was not already
|
|
83
|
+
// set to translate(0,0) in the block above (i.e. this element has
|
|
84
|
+
// `rotate` but no `transform`), we set it now so the containing-block
|
|
85
|
+
// role is reliably established via the widely-supported `transform`
|
|
86
|
+
// property – independently of browser support for individual props.
|
|
87
|
+
if (originalStyles.transform === undefined) {
|
|
88
|
+
originalStyles.transform = element.style.transform;
|
|
89
|
+
element.style.transform = 'translate(0, 0)';
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return originalStyles;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Restore element styles after rendering.
|
|
96
|
+
*
|
|
97
|
+
* @param element - Element to restore
|
|
98
|
+
* @param originalStyles - Original styles to restore
|
|
99
|
+
*/
|
|
100
|
+
static restoreElement(element, originalStyles) {
|
|
101
|
+
if (!(0, node_type_guards_1.isHTMLElementNode)(element)) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (originalStyles.animationDuration !== undefined) {
|
|
105
|
+
element.style.animationDuration = originalStyles.animationDuration;
|
|
106
|
+
}
|
|
107
|
+
if (originalStyles.transform !== undefined) {
|
|
108
|
+
element.style.transform = originalStyles.transform;
|
|
109
|
+
}
|
|
110
|
+
if (originalStyles.rotate !== undefined) {
|
|
111
|
+
element.style.rotate = originalStyles.rotate;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.DOMNormalizer = DOMNormalizer;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ElementContainer = void 0;
|
|
4
|
+
const index_1 = require("../css/index");
|
|
5
|
+
const bounds_1 = require("../css/layout/bounds");
|
|
6
|
+
const node_type_guards_1 = require("./node-type-guards");
|
|
7
|
+
const debugger_1 = require("../core/debugger");
|
|
8
|
+
const dom_normalizer_1 = require("./dom-normalizer");
|
|
9
|
+
class ElementContainer {
|
|
10
|
+
constructor(context, element, options = {}) {
|
|
11
|
+
this.context = context;
|
|
12
|
+
this.textNodes = [];
|
|
13
|
+
this.elements = [];
|
|
14
|
+
this.createsStackingContext = false;
|
|
15
|
+
this.createsRealStackingContext = false;
|
|
16
|
+
this.isListOwner = false;
|
|
17
|
+
this.debugRender = false;
|
|
18
|
+
if ((0, debugger_1.isDebugging)(element, 3 /* DebuggerType.PARSE */)) {
|
|
19
|
+
debugger;
|
|
20
|
+
}
|
|
21
|
+
this.styles = new index_1.CSSParsedDeclaration(context, context.config.window.getComputedStyle(element, null));
|
|
22
|
+
const shouldNormalize = options.normalizeDom !== false;
|
|
23
|
+
if (shouldNormalize && (0, node_type_guards_1.isHTMLElementNode)(element)) {
|
|
24
|
+
this.originalStyles = dom_normalizer_1.DOMNormalizer.normalizeElement(element, this.styles);
|
|
25
|
+
this.originalElement = element;
|
|
26
|
+
}
|
|
27
|
+
this.bounds = (0, bounds_1.parseBounds)(this.context, element);
|
|
28
|
+
if ((0, debugger_1.isDebugging)(element, 4 /* DebuggerType.RENDER */)) {
|
|
29
|
+
this.debugRender = true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Restore original element styles (if normalized)
|
|
34
|
+
* Call this after rendering is complete to clean up DOM state
|
|
35
|
+
*/
|
|
36
|
+
restore() {
|
|
37
|
+
if (this.originalStyles && this.originalElement) {
|
|
38
|
+
dom_normalizer_1.DOMNormalizer.restoreElement(this.originalElement, this.originalStyles);
|
|
39
|
+
// Clear references to prevent memory leaks
|
|
40
|
+
this.originalStyles = undefined;
|
|
41
|
+
this.originalElement = undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Recursively restore all elements in the tree
|
|
46
|
+
* Call this on the root container after rendering is complete
|
|
47
|
+
*/
|
|
48
|
+
restoreTree() {
|
|
49
|
+
this.restore();
|
|
50
|
+
// Recursively restore all child elements
|
|
51
|
+
for (const child of this.elements) {
|
|
52
|
+
child.restoreTree();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.ElementContainer = ElementContainer;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LIElementContainer = void 0;
|
|
4
|
+
const element_container_1 = require("../element-container");
|
|
5
|
+
class LIElementContainer extends element_container_1.ElementContainer {
|
|
6
|
+
constructor(context, element) {
|
|
7
|
+
super(context, element);
|
|
8
|
+
this.value = element.value;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.LIElementContainer = LIElementContainer;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OLElementContainer = void 0;
|
|
4
|
+
const element_container_1 = require("../element-container");
|
|
5
|
+
class OLElementContainer extends element_container_1.ElementContainer {
|
|
6
|
+
constructor(context, element) {
|
|
7
|
+
super(context, element);
|
|
8
|
+
this.start = element.start;
|
|
9
|
+
this.reversed = typeof element.reversed === 'boolean' && element.reversed === true;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.OLElementContainer = OLElementContainer;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SelectElementContainer = void 0;
|
|
4
|
+
const element_container_1 = require("../element-container");
|
|
5
|
+
class SelectElementContainer extends element_container_1.ElementContainer {
|
|
6
|
+
constructor(context, element) {
|
|
7
|
+
super(context, element);
|
|
8
|
+
const option = element.options[element.selectedIndex || 0];
|
|
9
|
+
this.value = option ? option.text || '' : '';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.SelectElementContainer = SelectElementContainer;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TextareaElementContainer = void 0;
|
|
4
|
+
const element_container_1 = require("../element-container");
|
|
5
|
+
class TextareaElementContainer extends element_container_1.ElementContainer {
|
|
6
|
+
constructor(context, element) {
|
|
7
|
+
super(context, element);
|
|
8
|
+
this.value = element.value;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.TextareaElementContainer = TextareaElementContainer;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseTree = void 0;
|
|
4
|
+
const element_container_1 = require("./element-container");
|
|
5
|
+
const text_container_1 = require("./text-container");
|
|
6
|
+
const image_element_container_1 = require("./replaced-elements/image-element-container");
|
|
7
|
+
const canvas_element_container_1 = require("./replaced-elements/canvas-element-container");
|
|
8
|
+
const svg_element_container_1 = require("./replaced-elements/svg-element-container");
|
|
9
|
+
const li_element_container_1 = require("./elements/li-element-container");
|
|
10
|
+
const ol_element_container_1 = require("./elements/ol-element-container");
|
|
11
|
+
const input_element_container_1 = require("./replaced-elements/input-element-container");
|
|
12
|
+
const select_element_container_1 = require("./elements/select-element-container");
|
|
13
|
+
const textarea_element_container_1 = require("./elements/textarea-element-container");
|
|
14
|
+
const iframe_element_container_1 = require("./replaced-elements/iframe-element-container");
|
|
15
|
+
const node_type_guards_1 = require("./node-type-guards");
|
|
16
|
+
const bitwise_1 = require("../core/bitwise");
|
|
17
|
+
const LIST_OWNERS = ['OL', 'UL', 'MENU'];
|
|
18
|
+
const parseNodeTree = (context, node, parent, root) => {
|
|
19
|
+
for (let childNode = node.firstChild, nextNode; childNode; childNode = nextNode) {
|
|
20
|
+
nextNode = childNode.nextSibling;
|
|
21
|
+
// Fixes #2238 #1624 - Fix the issue of TextNode content being overlooked in rendering due to being perceived as blank by trim().
|
|
22
|
+
if ((0, node_type_guards_1.isTextNode)(childNode) && childNode.data.length > 0) {
|
|
23
|
+
parent.textNodes.push(new text_container_1.TextContainer(context, childNode, parent.styles));
|
|
24
|
+
}
|
|
25
|
+
else if ((0, node_type_guards_1.isElementNode)(childNode)) {
|
|
26
|
+
if ((0, node_type_guards_1.isSlotElement)(childNode) && childNode.assignedNodes) {
|
|
27
|
+
childNode
|
|
28
|
+
.assignedNodes()
|
|
29
|
+
.forEach((assignedNode) => parseNodeTree(context, assignedNode, parent, root));
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
const container = createContainer(context, childNode);
|
|
33
|
+
if (container.styles.isVisible()) {
|
|
34
|
+
if (createsRealStackingContext(childNode, container, root)) {
|
|
35
|
+
container.createsRealStackingContext = true;
|
|
36
|
+
}
|
|
37
|
+
else if (createsStackingContext(container.styles)) {
|
|
38
|
+
container.createsStackingContext = true;
|
|
39
|
+
}
|
|
40
|
+
if (LIST_OWNERS.indexOf(childNode.tagName) !== -1) {
|
|
41
|
+
container.isListOwner = true;
|
|
42
|
+
}
|
|
43
|
+
parent.elements.push(container);
|
|
44
|
+
if (childNode.shadowRoot) {
|
|
45
|
+
parseNodeTree(context, childNode.shadowRoot, container, root);
|
|
46
|
+
}
|
|
47
|
+
else if (!(0, node_type_guards_1.isTextareaElement)(childNode) &&
|
|
48
|
+
!(0, node_type_guards_1.isSVGElement)(childNode) &&
|
|
49
|
+
!(0, node_type_guards_1.isSelectElement)(childNode)) {
|
|
50
|
+
parseNodeTree(context, childNode, container, root);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const createContainer = (context, element) => {
|
|
58
|
+
if ((0, node_type_guards_1.isImageElement)(element)) {
|
|
59
|
+
return new image_element_container_1.ImageElementContainer(context, element);
|
|
60
|
+
}
|
|
61
|
+
if ((0, node_type_guards_1.isCanvasElement)(element)) {
|
|
62
|
+
return new canvas_element_container_1.CanvasElementContainer(context, element);
|
|
63
|
+
}
|
|
64
|
+
if ((0, node_type_guards_1.isSVGElement)(element)) {
|
|
65
|
+
return new svg_element_container_1.SVGElementContainer(context, element);
|
|
66
|
+
}
|
|
67
|
+
if ((0, node_type_guards_1.isLIElement)(element)) {
|
|
68
|
+
return new li_element_container_1.LIElementContainer(context, element);
|
|
69
|
+
}
|
|
70
|
+
if ((0, node_type_guards_1.isOLElement)(element)) {
|
|
71
|
+
return new ol_element_container_1.OLElementContainer(context, element);
|
|
72
|
+
}
|
|
73
|
+
if ((0, node_type_guards_1.isInputElement)(element)) {
|
|
74
|
+
return new input_element_container_1.InputElementContainer(context, element);
|
|
75
|
+
}
|
|
76
|
+
if ((0, node_type_guards_1.isSelectElement)(element)) {
|
|
77
|
+
return new select_element_container_1.SelectElementContainer(context, element);
|
|
78
|
+
}
|
|
79
|
+
if ((0, node_type_guards_1.isTextareaElement)(element)) {
|
|
80
|
+
return new textarea_element_container_1.TextareaElementContainer(context, element);
|
|
81
|
+
}
|
|
82
|
+
if ((0, node_type_guards_1.isIFrameElement)(element)) {
|
|
83
|
+
return new iframe_element_container_1.IFrameElementContainer(context, element, exports.parseTree);
|
|
84
|
+
}
|
|
85
|
+
return new element_container_1.ElementContainer(context, element);
|
|
86
|
+
};
|
|
87
|
+
const parseTree = (context, element) => {
|
|
88
|
+
const container = createContainer(context, element);
|
|
89
|
+
container.createsRealStackingContext = true;
|
|
90
|
+
parseNodeTree(context, element, container, container);
|
|
91
|
+
return container;
|
|
92
|
+
};
|
|
93
|
+
exports.parseTree = parseTree;
|
|
94
|
+
const createsRealStackingContext = (node, container, root) => {
|
|
95
|
+
return (container.styles.isPositionedWithZIndex() ||
|
|
96
|
+
container.styles.opacity < 1 ||
|
|
97
|
+
container.styles.isTransformed() ||
|
|
98
|
+
((0, node_type_guards_1.isBodyElement)(node) && root.styles.isTransparent()));
|
|
99
|
+
};
|
|
100
|
+
const createsStackingContext = (styles) => {
|
|
101
|
+
// Positioned and floating elements create stacking contexts
|
|
102
|
+
if (styles.isPositioned() || styles.isFloating()) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
// Fix for Issue #137: Inline-level containers (inline-flex, inline-block, etc.)
|
|
106
|
+
// should create stacking contexts to prevent their children from being added
|
|
107
|
+
// to the parent's stacking context, which causes rendering order issues
|
|
108
|
+
return ((0, bitwise_1.contains)(styles.display, 268435456 /* DISPLAY.INLINE_FLEX */) ||
|
|
109
|
+
(0, bitwise_1.contains)(styles.display, 33554432 /* DISPLAY.INLINE_BLOCK */) ||
|
|
110
|
+
(0, bitwise_1.contains)(styles.display, 536870912 /* DISPLAY.INLINE_GRID */) ||
|
|
111
|
+
(0, bitwise_1.contains)(styles.display, 134217728 /* DISPLAY.INLINE_TABLE */));
|
|
112
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DOM Node Type Guards
|
|
4
|
+
*
|
|
5
|
+
* All DOM node type guards consolidated here to eliminate duplication
|
|
6
|
+
* and provide a single source of truth for node type checking.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.canHavePseudoElements = exports.isCustomElement = exports.isOLElement = exports.isLIElement = exports.isSlotElement = exports.isSelectElement = exports.isTextareaElement = exports.isScriptElement = exports.isStyleElement = exports.isIFrameElement = exports.isImageElement = exports.isVideoElement = exports.isCanvasElement = exports.isBodyElement = exports.isSVGElement = exports.isHTMLElement = exports.isInputElement = exports.isHTMLElementNode = exports.isSVGElementNode = exports.isTextNode = exports.isElementNode = void 0;
|
|
10
|
+
// --- Generic node type guards ---
|
|
11
|
+
const isElementNode = (node) => node.nodeType === Node.ELEMENT_NODE;
|
|
12
|
+
exports.isElementNode = isElementNode;
|
|
13
|
+
const isTextNode = (node) => node.nodeType === Node.TEXT_NODE;
|
|
14
|
+
exports.isTextNode = isTextNode;
|
|
15
|
+
const isSVGElementNode = (element) => typeof element.className === 'object';
|
|
16
|
+
exports.isSVGElementNode = isSVGElementNode;
|
|
17
|
+
const isHTMLElementNode = (node) => (0, exports.isElementNode)(node) && typeof node.style !== 'undefined' && !(0, exports.isSVGElementNode)(node);
|
|
18
|
+
exports.isHTMLElementNode = isHTMLElementNode;
|
|
19
|
+
// --- Tag name based type guards ---
|
|
20
|
+
const isInputElement = (node) => node.tagName === 'INPUT';
|
|
21
|
+
exports.isInputElement = isInputElement;
|
|
22
|
+
const isHTMLElement = (node) => node.tagName === 'HTML';
|
|
23
|
+
exports.isHTMLElement = isHTMLElement;
|
|
24
|
+
const isSVGElement = (node) => node.tagName === 'svg';
|
|
25
|
+
exports.isSVGElement = isSVGElement;
|
|
26
|
+
const isBodyElement = (node) => node.tagName === 'BODY';
|
|
27
|
+
exports.isBodyElement = isBodyElement;
|
|
28
|
+
const isCanvasElement = (node) => node.tagName === 'CANVAS';
|
|
29
|
+
exports.isCanvasElement = isCanvasElement;
|
|
30
|
+
const isVideoElement = (node) => node.tagName === 'VIDEO';
|
|
31
|
+
exports.isVideoElement = isVideoElement;
|
|
32
|
+
const isImageElement = (node) => node.tagName === 'IMG';
|
|
33
|
+
exports.isImageElement = isImageElement;
|
|
34
|
+
const isIFrameElement = (node) => node.tagName === 'IFRAME';
|
|
35
|
+
exports.isIFrameElement = isIFrameElement;
|
|
36
|
+
const isStyleElement = (node) => node.tagName === 'STYLE';
|
|
37
|
+
exports.isStyleElement = isStyleElement;
|
|
38
|
+
const isScriptElement = (node) => node.tagName === 'SCRIPT';
|
|
39
|
+
exports.isScriptElement = isScriptElement;
|
|
40
|
+
const isTextareaElement = (node) => node.tagName === 'TEXTAREA';
|
|
41
|
+
exports.isTextareaElement = isTextareaElement;
|
|
42
|
+
const isSelectElement = (node) => node.tagName === 'SELECT';
|
|
43
|
+
exports.isSelectElement = isSelectElement;
|
|
44
|
+
const isSlotElement = (node) => node.tagName === 'SLOT';
|
|
45
|
+
exports.isSlotElement = isSlotElement;
|
|
46
|
+
const isLIElement = (node) => node.tagName === 'LI';
|
|
47
|
+
exports.isLIElement = isLIElement;
|
|
48
|
+
const isOLElement = (node) => node.tagName === 'OL';
|
|
49
|
+
exports.isOLElement = isOLElement;
|
|
50
|
+
const isCustomElement = (element) => !(0, exports.isSVGElementNode)(element) && element.tagName.indexOf('-') > 0;
|
|
51
|
+
exports.isCustomElement = isCustomElement;
|
|
52
|
+
const VOID_OR_REPLACED_TAGS = new Set([
|
|
53
|
+
'IMG',
|
|
54
|
+
'VIDEO',
|
|
55
|
+
'AUDIO',
|
|
56
|
+
'CANVAS',
|
|
57
|
+
'IFRAME',
|
|
58
|
+
'INPUT',
|
|
59
|
+
'TEXTAREA',
|
|
60
|
+
'SELECT',
|
|
61
|
+
'BR',
|
|
62
|
+
'HR',
|
|
63
|
+
'META',
|
|
64
|
+
'LINK',
|
|
65
|
+
'BASE',
|
|
66
|
+
'COL',
|
|
67
|
+
'SOURCE',
|
|
68
|
+
'TRACK',
|
|
69
|
+
'WBR',
|
|
70
|
+
'AREA',
|
|
71
|
+
'PARAM',
|
|
72
|
+
'EMBED',
|
|
73
|
+
'OBJECT'
|
|
74
|
+
]);
|
|
75
|
+
/**
|
|
76
|
+
* Check if an element can have ::before / ::after pseudo-elements.
|
|
77
|
+
* Per the CSS spec, replaced elements and void elements cannot have pseudo-elements.
|
|
78
|
+
* SVG elements also do not support pseudo-elements.
|
|
79
|
+
*/
|
|
80
|
+
const canHavePseudoElements = (element) => !(0, exports.isSVGElementNode)(element) && !VOID_OR_REPLACED_TAGS.has(element.tagName);
|
|
81
|
+
exports.canHavePseudoElements = canHavePseudoElements;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CanvasElementContainer = void 0;
|
|
4
|
+
const element_container_1 = require("../element-container");
|
|
5
|
+
class CanvasElementContainer extends element_container_1.ElementContainer {
|
|
6
|
+
constructor(context, canvas) {
|
|
7
|
+
super(context, canvas);
|
|
8
|
+
this.canvas = canvas;
|
|
9
|
+
this.intrinsicWidth = canvas.width;
|
|
10
|
+
this.intrinsicHeight = canvas.height;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.CanvasElementContainer = CanvasElementContainer;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IFrameElementContainer = void 0;
|
|
4
|
+
const element_container_1 = require("../element-container");
|
|
5
|
+
const color_1 = require("../../css/types/color");
|
|
6
|
+
const color_utilities_1 = require("../../css/types/color-utilities");
|
|
7
|
+
class IFrameElementContainer extends element_container_1.ElementContainer {
|
|
8
|
+
constructor(context, iframe, parseTreeFn) {
|
|
9
|
+
super(context, iframe);
|
|
10
|
+
this.src = iframe.src;
|
|
11
|
+
this.width = parseInt(iframe.width, 10) || 0;
|
|
12
|
+
this.height = parseInt(iframe.height, 10) || 0;
|
|
13
|
+
this.backgroundColor = this.styles.backgroundColor;
|
|
14
|
+
this.parseTreeFn = parseTreeFn;
|
|
15
|
+
try {
|
|
16
|
+
if (iframe.contentWindow &&
|
|
17
|
+
iframe.contentWindow.document &&
|
|
18
|
+
iframe.contentWindow.document.documentElement &&
|
|
19
|
+
this.parseTreeFn) {
|
|
20
|
+
this.tree = this.parseTreeFn(context, iframe.contentWindow.document.documentElement);
|
|
21
|
+
// http://www.w3.org/TR/css3-background/#special-backgrounds
|
|
22
|
+
const documentBackgroundColor = iframe.contentWindow.document.documentElement
|
|
23
|
+
? (0, color_1.parseColor)(context, getComputedStyle(iframe.contentWindow.document.documentElement).backgroundColor)
|
|
24
|
+
: color_1.COLORS.TRANSPARENT;
|
|
25
|
+
const bodyBackgroundColor = iframe.contentWindow.document.body
|
|
26
|
+
? (0, color_1.parseColor)(context, getComputedStyle(iframe.contentWindow.document.body).backgroundColor)
|
|
27
|
+
: color_1.COLORS.TRANSPARENT;
|
|
28
|
+
this.backgroundColor = (0, color_utilities_1.isTransparent)(documentBackgroundColor)
|
|
29
|
+
? (0, color_utilities_1.isTransparent)(bodyBackgroundColor)
|
|
30
|
+
? this.styles.backgroundColor
|
|
31
|
+
: bodyBackgroundColor
|
|
32
|
+
: documentBackgroundColor;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (e) { }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.IFrameElementContainer = IFrameElementContainer;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ImageElementContainer = void 0;
|
|
4
|
+
const element_container_1 = require("../element-container");
|
|
5
|
+
class ImageElementContainer extends element_container_1.ElementContainer {
|
|
6
|
+
constructor(context, img) {
|
|
7
|
+
super(context, img);
|
|
8
|
+
this.src = img.currentSrc || img.src;
|
|
9
|
+
this.intrinsicWidth = img.naturalWidth;
|
|
10
|
+
this.intrinsicHeight = img.naturalHeight;
|
|
11
|
+
this.context.cache.addImage(this.src);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.ImageElementContainer = ImageElementContainer;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InputElementContainer = exports.PLACEHOLDER_COLOR = exports.INPUT_COLOR = exports.PASSWORD = exports.RADIO = exports.CHECKBOX = void 0;
|
|
4
|
+
const element_container_1 = require("../element-container");
|
|
5
|
+
const bounds_1 = require("../../css/layout/bounds");
|
|
6
|
+
const CHECKBOX_BORDER_RADIUS = [
|
|
7
|
+
{
|
|
8
|
+
type: 15 /* TokenType.DIMENSION_TOKEN */,
|
|
9
|
+
flags: 0,
|
|
10
|
+
unit: 'px',
|
|
11
|
+
number: 3
|
|
12
|
+
}
|
|
13
|
+
];
|
|
14
|
+
const RADIO_BORDER_RADIUS = [
|
|
15
|
+
{
|
|
16
|
+
type: 16 /* TokenType.PERCENTAGE_TOKEN */,
|
|
17
|
+
flags: 0,
|
|
18
|
+
number: 50
|
|
19
|
+
}
|
|
20
|
+
];
|
|
21
|
+
const reformatInputBounds = (bounds) => {
|
|
22
|
+
if (bounds.width > bounds.height) {
|
|
23
|
+
return new bounds_1.Bounds(bounds.left + (bounds.width - bounds.height) / 2, bounds.top, bounds.height, bounds.height);
|
|
24
|
+
}
|
|
25
|
+
else if (bounds.width < bounds.height) {
|
|
26
|
+
return new bounds_1.Bounds(bounds.left, bounds.top + (bounds.height - bounds.width) / 2, bounds.width, bounds.width);
|
|
27
|
+
}
|
|
28
|
+
return bounds;
|
|
29
|
+
};
|
|
30
|
+
const getInputValue = (node) => {
|
|
31
|
+
const value = node.type === exports.PASSWORD ? new Array(node.value.length + 1).join('\u2022') : node.value;
|
|
32
|
+
return value.length === 0 ? node.placeholder || '' : value;
|
|
33
|
+
};
|
|
34
|
+
const isPlaceholder = (node) => {
|
|
35
|
+
return node.value.length === 0 && !!node.placeholder;
|
|
36
|
+
};
|
|
37
|
+
exports.CHECKBOX = 'checkbox';
|
|
38
|
+
exports.RADIO = 'radio';
|
|
39
|
+
exports.PASSWORD = 'password';
|
|
40
|
+
exports.INPUT_COLOR = 0x2a2a2aff;
|
|
41
|
+
// Default placeholder color (similar to browsers: rgba(117, 117, 117, 1) or #757575)
|
|
42
|
+
exports.PLACEHOLDER_COLOR = 0x757575ff;
|
|
43
|
+
class InputElementContainer extends element_container_1.ElementContainer {
|
|
44
|
+
constructor(context, input) {
|
|
45
|
+
super(context, input);
|
|
46
|
+
this.type = input.type.toLowerCase();
|
|
47
|
+
this.checked = input.checked;
|
|
48
|
+
this.value = getInputValue(input);
|
|
49
|
+
this.isPlaceholder = isPlaceholder(input);
|
|
50
|
+
if (this.type === exports.CHECKBOX || this.type === exports.RADIO) {
|
|
51
|
+
this.styles.backgroundColor = 0xdededeff;
|
|
52
|
+
this.styles.borderTopColor =
|
|
53
|
+
this.styles.borderRightColor =
|
|
54
|
+
this.styles.borderBottomColor =
|
|
55
|
+
this.styles.borderLeftColor =
|
|
56
|
+
0xa5a5a5ff;
|
|
57
|
+
this.styles.borderTopWidth =
|
|
58
|
+
this.styles.borderRightWidth =
|
|
59
|
+
this.styles.borderBottomWidth =
|
|
60
|
+
this.styles.borderLeftWidth =
|
|
61
|
+
1;
|
|
62
|
+
this.styles.borderTopStyle =
|
|
63
|
+
this.styles.borderRightStyle =
|
|
64
|
+
this.styles.borderBottomStyle =
|
|
65
|
+
this.styles.borderLeftStyle =
|
|
66
|
+
1 /* BORDER_STYLE.SOLID */;
|
|
67
|
+
this.styles.backgroundClip = [0 /* BACKGROUND_CLIP.BORDER_BOX */];
|
|
68
|
+
this.styles.backgroundOrigin = [0 /* BACKGROUND_ORIGIN.BORDER_BOX */];
|
|
69
|
+
this.bounds = reformatInputBounds(this.bounds);
|
|
70
|
+
}
|
|
71
|
+
switch (this.type) {
|
|
72
|
+
case exports.CHECKBOX:
|
|
73
|
+
this.styles.borderTopRightRadius =
|
|
74
|
+
this.styles.borderTopLeftRadius =
|
|
75
|
+
this.styles.borderBottomRightRadius =
|
|
76
|
+
this.styles.borderBottomLeftRadius =
|
|
77
|
+
CHECKBOX_BORDER_RADIUS;
|
|
78
|
+
break;
|
|
79
|
+
case exports.RADIO:
|
|
80
|
+
this.styles.borderTopRightRadius =
|
|
81
|
+
this.styles.borderTopLeftRadius =
|
|
82
|
+
this.styles.borderBottomRightRadius =
|
|
83
|
+
this.styles.borderBottomLeftRadius =
|
|
84
|
+
RADIO_BORDER_RADIUS;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.InputElementContainer = InputElementContainer;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SVGElementContainer = void 0;
|
|
4
|
+
const element_container_1 = require("../element-container");
|
|
5
|
+
const bounds_1 = require("../../css/layout/bounds");
|
|
6
|
+
class SVGElementContainer extends element_container_1.ElementContainer {
|
|
7
|
+
constructor(context, img) {
|
|
8
|
+
super(context, img);
|
|
9
|
+
const s = new XMLSerializer();
|
|
10
|
+
const bounds = (0, bounds_1.parseBounds)(context, img);
|
|
11
|
+
img.setAttribute('width', `${bounds.width}px`);
|
|
12
|
+
img.setAttribute('height', `${bounds.height}px`);
|
|
13
|
+
this.svg = `data:image/svg+xml,${encodeURIComponent(s.serializeToString(img))}`;
|
|
14
|
+
this.intrinsicWidth = img.width.baseVal.value;
|
|
15
|
+
this.intrinsicHeight = img.height.baseVal.value;
|
|
16
|
+
this.context.cache.addImage(this.svg);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.SVGElementContainer = SVGElementContainer;
|