@vizor-vr/player 0.2.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 +58 -0
- package/dist/__tests__/adapter-factory.test.d.ts +2 -0
- package/dist/__tests__/adapter-factory.test.d.ts.map +1 -0
- package/dist/__tests__/analytics-collector.test.d.ts +2 -0
- package/dist/__tests__/analytics-collector.test.d.ts.map +1 -0
- package/dist/__tests__/annotation-manager.test.d.ts +2 -0
- package/dist/__tests__/annotation-manager.test.d.ts.map +1 -0
- package/dist/__tests__/annotation-popup.test.d.ts +2 -0
- package/dist/__tests__/annotation-popup.test.d.ts.map +1 -0
- package/dist/__tests__/annotation-sprite.test.d.ts +2 -0
- package/dist/__tests__/annotation-sprite.test.d.ts.map +1 -0
- package/dist/__tests__/audio-manager.test.d.ts +2 -0
- package/dist/__tests__/audio-manager.test.d.ts.map +1 -0
- package/dist/__tests__/base-element-attrs.test.d.ts +2 -0
- package/dist/__tests__/base-element-attrs.test.d.ts.map +1 -0
- package/dist/__tests__/camera-controller.test.d.ts +2 -0
- package/dist/__tests__/camera-controller.test.d.ts.map +1 -0
- package/dist/__tests__/caption-renderer.test.d.ts +2 -0
- package/dist/__tests__/caption-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/cc-button.test.d.ts +2 -0
- package/dist/__tests__/cc-button.test.d.ts.map +1 -0
- package/dist/__tests__/chat-button.test.d.ts +2 -0
- package/dist/__tests__/chat-button.test.d.ts.map +1 -0
- package/dist/__tests__/chat-panel.test.d.ts +2 -0
- package/dist/__tests__/chat-panel.test.d.ts.map +1 -0
- package/dist/__tests__/cinema-projection.test.d.ts +2 -0
- package/dist/__tests__/cinema-projection.test.d.ts.map +1 -0
- package/dist/__tests__/collab-client.test.d.ts +2 -0
- package/dist/__tests__/collab-client.test.d.ts.map +1 -0
- package/dist/__tests__/compass.test.d.ts +2 -0
- package/dist/__tests__/compass.test.d.ts.map +1 -0
- package/dist/__tests__/controls-overlay.test.d.ts +2 -0
- package/dist/__tests__/controls-overlay.test.d.ts.map +1 -0
- package/dist/__tests__/cubemap-projection.test.d.ts +2 -0
- package/dist/__tests__/cubemap-projection.test.d.ts.map +1 -0
- package/dist/__tests__/dash-adapter.test.d.ts +2 -0
- package/dist/__tests__/dash-adapter.test.d.ts.map +1 -0
- package/dist/__tests__/eac-projection.test.d.ts +2 -0
- package/dist/__tests__/eac-projection.test.d.ts.map +1 -0
- package/dist/__tests__/equirect-projection.test.d.ts +2 -0
- package/dist/__tests__/equirect-projection.test.d.ts.map +1 -0
- package/dist/__tests__/event-emitter.test.d.ts +2 -0
- package/dist/__tests__/event-emitter.test.d.ts.map +1 -0
- package/dist/__tests__/feature-gates-branding.test.d.ts +2 -0
- package/dist/__tests__/feature-gates-branding.test.d.ts.map +1 -0
- package/dist/__tests__/feature-gates.test.d.ts +2 -0
- package/dist/__tests__/feature-gates.test.d.ts.map +1 -0
- package/dist/__tests__/fisheye-projection.test.d.ts +2 -0
- package/dist/__tests__/fisheye-projection.test.d.ts.map +1 -0
- package/dist/__tests__/flat-projection.test.d.ts +2 -0
- package/dist/__tests__/flat-projection.test.d.ts.map +1 -0
- package/dist/__tests__/flat-video-integration.test.d.ts +2 -0
- package/dist/__tests__/flat-video-integration.test.d.ts.map +1 -0
- package/dist/__tests__/fullscreen-button.test.d.ts +2 -0
- package/dist/__tests__/fullscreen-button.test.d.ts.map +1 -0
- package/dist/__tests__/gaze-cursor-manager.test.d.ts +2 -0
- package/dist/__tests__/gaze-cursor-manager.test.d.ts.map +1 -0
- package/dist/__tests__/gaze-sender.test.d.ts +2 -0
- package/dist/__tests__/gaze-sender.test.d.ts.map +1 -0
- package/dist/__tests__/gaze-tracker.test.d.ts +2 -0
- package/dist/__tests__/gaze-tracker.test.d.ts.map +1 -0
- package/dist/__tests__/hls-adapter.test.d.ts +2 -0
- package/dist/__tests__/hls-adapter.test.d.ts.map +1 -0
- package/dist/__tests__/hotspot-interaction.test.d.ts +2 -0
- package/dist/__tests__/hotspot-interaction.test.d.ts.map +1 -0
- package/dist/__tests__/hotspot-manager.test.d.ts +2 -0
- package/dist/__tests__/hotspot-manager.test.d.ts.map +1 -0
- package/dist/__tests__/hotspot-renderer.test.d.ts +2 -0
- package/dist/__tests__/hotspot-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/integrity.test.d.ts +2 -0
- package/dist/__tests__/integrity.test.d.ts.map +1 -0
- package/dist/__tests__/keyboard-shortcuts.test.d.ts +2 -0
- package/dist/__tests__/keyboard-shortcuts.test.d.ts.map +1 -0
- package/dist/__tests__/license-checker.test.d.ts +2 -0
- package/dist/__tests__/license-checker.test.d.ts.map +1 -0
- package/dist/__tests__/live-indicator.test.d.ts +2 -0
- package/dist/__tests__/live-indicator.test.d.ts.map +1 -0
- package/dist/__tests__/live.test.d.ts +2 -0
- package/dist/__tests__/live.test.d.ts.map +1 -0
- package/dist/__tests__/master-key.test.d.ts +2 -0
- package/dist/__tests__/master-key.test.d.ts.map +1 -0
- package/dist/__tests__/media-element.test.d.ts +2 -0
- package/dist/__tests__/media-element.test.d.ts.map +1 -0
- package/dist/__tests__/meta-config.test.d.ts +2 -0
- package/dist/__tests__/meta-config.test.d.ts.map +1 -0
- package/dist/__tests__/play-button.test.d.ts +2 -0
- package/dist/__tests__/play-button.test.d.ts.map +1 -0
- package/dist/__tests__/player-exports.test.d.ts +2 -0
- package/dist/__tests__/player-exports.test.d.ts.map +1 -0
- package/dist/__tests__/player-state.test.d.ts +2 -0
- package/dist/__tests__/player-state.test.d.ts.map +1 -0
- package/dist/__tests__/playlist-controls.test.d.ts +2 -0
- package/dist/__tests__/playlist-controls.test.d.ts.map +1 -0
- package/dist/__tests__/playlist-panel.test.d.ts +2 -0
- package/dist/__tests__/playlist-panel.test.d.ts.map +1 -0
- package/dist/__tests__/playlist.test.d.ts +2 -0
- package/dist/__tests__/playlist.test.d.ts.map +1 -0
- package/dist/__tests__/progressive-adapter.test.d.ts +2 -0
- package/dist/__tests__/progressive-adapter.test.d.ts.map +1 -0
- package/dist/__tests__/quality-selector.test.d.ts +2 -0
- package/dist/__tests__/quality-selector.test.d.ts.map +1 -0
- package/dist/__tests__/renderer.test.d.ts +2 -0
- package/dist/__tests__/renderer.test.d.ts.map +1 -0
- package/dist/__tests__/security/license-key-exposure.test.d.ts +2 -0
- package/dist/__tests__/security/license-key-exposure.test.d.ts.map +1 -0
- package/dist/__tests__/security/sanitize-xss.test.d.ts +2 -0
- package/dist/__tests__/security/sanitize-xss.test.d.ts.map +1 -0
- package/dist/__tests__/security/sri-generation.test.d.ts +2 -0
- package/dist/__tests__/security/sri-generation.test.d.ts.map +1 -0
- package/dist/__tests__/security/xss-annotations.test.d.ts +2 -0
- package/dist/__tests__/security/xss-annotations.test.d.ts.map +1 -0
- package/dist/__tests__/security/xss-captions.test.d.ts +2 -0
- package/dist/__tests__/security/xss-captions.test.d.ts.map +1 -0
- package/dist/__tests__/seek-bar.test.d.ts +2 -0
- package/dist/__tests__/seek-bar.test.d.ts.map +1 -0
- package/dist/__tests__/source-manager.test.d.ts +2 -0
- package/dist/__tests__/source-manager.test.d.ts.map +1 -0
- package/dist/__tests__/sprint1-memory-disposal.test.d.ts +10 -0
- package/dist/__tests__/sprint1-memory-disposal.test.d.ts.map +1 -0
- package/dist/__tests__/sprint3-frustum-adaptive.test.d.ts +9 -0
- package/dist/__tests__/sprint3-frustum-adaptive.test.d.ts.map +1 -0
- package/dist/__tests__/sprint5-bundle-memory.test.d.ts +18 -0
- package/dist/__tests__/sprint5-bundle-memory.test.d.ts.map +1 -0
- package/dist/__tests__/voice-button.test.d.ts +2 -0
- package/dist/__tests__/voice-button.test.d.ts.map +1 -0
- package/dist/__tests__/voice-manager.test.d.ts +2 -0
- package/dist/__tests__/voice-manager.test.d.ts.map +1 -0
- package/dist/__tests__/volume-control.test.d.ts +2 -0
- package/dist/__tests__/volume-control.test.d.ts.map +1 -0
- package/dist/__tests__/vr-button.test.d.ts +2 -0
- package/dist/__tests__/vr-button.test.d.ts.map +1 -0
- package/dist/__tests__/vz-cinema-element.test.d.ts +2 -0
- package/dist/__tests__/vz-cinema-element.test.d.ts.map +1 -0
- package/dist/__tests__/vz-img-element.test.d.ts +2 -0
- package/dist/__tests__/vz-img-element.test.d.ts.map +1 -0
- package/dist/__tests__/vz-playlist-element.test.d.ts +2 -0
- package/dist/__tests__/vz-playlist-element.test.d.ts.map +1 -0
- package/dist/__tests__/vz-tour-element.test.d.ts +2 -0
- package/dist/__tests__/vz-tour-element.test.d.ts.map +1 -0
- package/dist/__tests__/vz-tour-img.test.d.ts +2 -0
- package/dist/__tests__/vz-tour-img.test.d.ts.map +1 -0
- package/dist/__tests__/vz-tour-portal.test.d.ts +2 -0
- package/dist/__tests__/vz-tour-portal.test.d.ts.map +1 -0
- package/dist/__tests__/vz-video-element.test.d.ts +2 -0
- package/dist/__tests__/vz-video-element.test.d.ts.map +1 -0
- package/dist/__tests__/watermark-guard.test.d.ts +2 -0
- package/dist/__tests__/watermark-guard.test.d.ts.map +1 -0
- package/dist/__tests__/watermark.test.d.ts +2 -0
- package/dist/__tests__/watermark.test.d.ts.map +1 -0
- package/dist/__tests__/webvtt-parser.test.d.ts +2 -0
- package/dist/__tests__/webvtt-parser.test.d.ts.map +1 -0
- package/dist/__tests__/xr-controller.test.d.ts +2 -0
- package/dist/__tests__/xr-controller.test.d.ts.map +1 -0
- package/dist/__tests__/xr-manager.test.d.ts +2 -0
- package/dist/__tests__/xr-manager.test.d.ts.map +1 -0
- package/dist/analytics/analytics-collector.d.ts +29 -0
- package/dist/analytics/analytics-collector.d.ts.map +1 -0
- package/dist/analytics/gaze-tracker.d.ts +44 -0
- package/dist/analytics/gaze-tracker.d.ts.map +1 -0
- package/dist/analytics/index.d.ts +32 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/annotations/annotation-manager.d.ts +31 -0
- package/dist/annotations/annotation-manager.d.ts.map +1 -0
- package/dist/annotations/annotation-popup.d.ts +21 -0
- package/dist/annotations/annotation-popup.d.ts.map +1 -0
- package/dist/annotations/annotation-sprite.d.ts +10 -0
- package/dist/annotations/annotation-sprite.d.ts.map +1 -0
- package/dist/annotations/index.d.ts +4 -0
- package/dist/annotations/index.d.ts.map +1 -0
- package/dist/annotations-C0ugfCn4.js +2158 -0
- package/dist/annotations-C0ugfCn4.js.map +1 -0
- package/dist/audio/ambisonic-renderer.d.ts +36 -0
- package/dist/audio/ambisonic-renderer.d.ts.map +1 -0
- package/dist/audio/audio-manager.d.ts +44 -0
- package/dist/audio/audio-manager.d.ts.map +1 -0
- package/dist/captions/caption-renderer.d.ts +57 -0
- package/dist/captions/caption-renderer.d.ts.map +1 -0
- package/dist/captions/index.d.ts +3 -0
- package/dist/captions/index.d.ts.map +1 -0
- package/dist/captions/webvtt-parser.d.ts +31 -0
- package/dist/captions/webvtt-parser.d.ts.map +1 -0
- package/dist/captions-BP0H2E03.js +274 -0
- package/dist/captions-BP0H2E03.js.map +1 -0
- package/dist/collab-BXPomrS0.js +978 -0
- package/dist/collab-BXPomrS0.js.map +1 -0
- package/dist/collaborative/chat-button.d.ts +22 -0
- package/dist/collaborative/chat-button.d.ts.map +1 -0
- package/dist/collaborative/chat-panel.d.ts +46 -0
- package/dist/collaborative/chat-panel.d.ts.map +1 -0
- package/dist/collaborative/collab-client.d.ts +73 -0
- package/dist/collaborative/collab-client.d.ts.map +1 -0
- package/dist/collaborative/gaze-cursor-manager.d.ts +29 -0
- package/dist/collaborative/gaze-cursor-manager.d.ts.map +1 -0
- package/dist/collaborative/gaze-sender.d.ts +29 -0
- package/dist/collaborative/gaze-sender.d.ts.map +1 -0
- package/dist/collaborative/voice-button.d.ts +25 -0
- package/dist/collaborative/voice-button.d.ts.map +1 -0
- package/dist/collaborative/voice-manager.d.ts +45 -0
- package/dist/collaborative/voice-manager.d.ts.map +1 -0
- package/dist/config/format-registry.d.ts +2 -0
- package/dist/config/format-registry.d.ts.map +1 -0
- package/dist/config/meta-config.d.ts +14 -0
- package/dist/config/meta-config.d.ts.map +1 -0
- package/dist/controls/cc-button.d.ts +24 -0
- package/dist/controls/cc-button.d.ts.map +1 -0
- package/dist/controls/compass.d.ts +15 -0
- package/dist/controls/compass.d.ts.map +1 -0
- package/dist/controls/controls-overlay.d.ts +46 -0
- package/dist/controls/controls-overlay.d.ts.map +1 -0
- package/dist/controls/fullscreen-button.d.ts +16 -0
- package/dist/controls/fullscreen-button.d.ts.map +1 -0
- package/dist/controls/icons.d.ts +23 -0
- package/dist/controls/icons.d.ts.map +1 -0
- package/dist/controls/keyboard-shortcuts.d.ts +21 -0
- package/dist/controls/keyboard-shortcuts.d.ts.map +1 -0
- package/dist/controls/live-indicator.d.ts +17 -0
- package/dist/controls/live-indicator.d.ts.map +1 -0
- package/dist/controls/play-button.d.ts +14 -0
- package/dist/controls/play-button.d.ts.map +1 -0
- package/dist/controls/playlist-controls.d.ts +18 -0
- package/dist/controls/playlist-controls.d.ts.map +1 -0
- package/dist/controls/playlist-panel.d.ts +27 -0
- package/dist/controls/playlist-panel.d.ts.map +1 -0
- package/dist/controls/quality-menu.d.ts +17 -0
- package/dist/controls/quality-menu.d.ts.map +1 -0
- package/dist/controls/seek-bar.d.ts +23 -0
- package/dist/controls/seek-bar.d.ts.map +1 -0
- package/dist/controls/volume-control.d.ts +14 -0
- package/dist/controls/volume-control.d.ts.map +1 -0
- package/dist/controls/vr-button.d.ts +14 -0
- package/dist/controls/vr-button.d.ts.map +1 -0
- package/dist/core/base-element.d.ts +53 -0
- package/dist/core/base-element.d.ts.map +1 -0
- package/dist/core/event-emitter.d.ts +23 -0
- package/dist/core/event-emitter.d.ts.map +1 -0
- package/dist/core/html-element.d.ts +13 -0
- package/dist/core/html-element.d.ts.map +1 -0
- package/dist/core/media-element.d.ts +86 -0
- package/dist/core/media-element.d.ts.map +1 -0
- package/dist/core/player-state.d.ts +63 -0
- package/dist/core/player-state.d.ts.map +1 -0
- package/dist/dash-adapter-tid9ZyhO.js +75 -0
- package/dist/dash-adapter-tid9ZyhO.js.map +1 -0
- package/dist/elements/vz-annotation.d.ts +26 -0
- package/dist/elements/vz-annotation.d.ts.map +1 -0
- package/dist/elements/vz-cinema.d.ts +28 -0
- package/dist/elements/vz-cinema.d.ts.map +1 -0
- package/dist/elements/vz-img.d.ts +27 -0
- package/dist/elements/vz-img.d.ts.map +1 -0
- package/dist/elements/vz-live.d.ts +36 -0
- package/dist/elements/vz-live.d.ts.map +1 -0
- package/dist/elements/vz-playlist.d.ts +74 -0
- package/dist/elements/vz-playlist.d.ts.map +1 -0
- package/dist/elements/vz-tour-img.d.ts +21 -0
- package/dist/elements/vz-tour-img.d.ts.map +1 -0
- package/dist/elements/vz-tour-portal.d.ts +19 -0
- package/dist/elements/vz-tour-portal.d.ts.map +1 -0
- package/dist/elements/vz-tour.d.ts +49 -0
- package/dist/elements/vz-tour.d.ts.map +1 -0
- package/dist/elements/vz-video.d.ts +21 -0
- package/dist/elements/vz-video.d.ts.map +1 -0
- package/dist/hls-adapter-BivH46L_.js +97 -0
- package/dist/hls-adapter-BivH46L_.js.map +1 -0
- package/dist/hotspots/hotspot-interaction.d.ts +23 -0
- package/dist/hotspots/hotspot-interaction.d.ts.map +1 -0
- package/dist/hotspots/hotspot-manager.d.ts +18 -0
- package/dist/hotspots/hotspot-manager.d.ts.map +1 -0
- package/dist/hotspots/hotspot-renderer.d.ts +26 -0
- package/dist/hotspots/hotspot-renderer.d.ts.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/license/feature-gates.d.ts +6 -0
- package/dist/license/feature-gates.d.ts.map +1 -0
- package/dist/license/integrity.d.ts +33 -0
- package/dist/license/integrity.d.ts.map +1 -0
- package/dist/license/license-checker.d.ts +18 -0
- package/dist/license/license-checker.d.ts.map +1 -0
- package/dist/license/master-key.d.ts +14 -0
- package/dist/license/master-key.d.ts.map +1 -0
- package/dist/license/watermark-guard.d.ts +24 -0
- package/dist/license/watermark-guard.d.ts.map +1 -0
- package/dist/license/watermark.d.ts +19 -0
- package/dist/license/watermark.d.ts.map +1 -0
- package/dist/register-CwnmiGEs.js +5740 -0
- package/dist/register-CwnmiGEs.js.map +1 -0
- package/dist/register.d.ts +6 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +5 -0
- package/dist/register.js.map +1 -0
- package/dist/renderer/camera-controller.d.ts +75 -0
- package/dist/renderer/camera-controller.d.ts.map +1 -0
- package/dist/renderer/projections/cinema-projection.d.ts +32 -0
- package/dist/renderer/projections/cinema-projection.d.ts.map +1 -0
- package/dist/renderer/projections/cubemap-projection.d.ts +34 -0
- package/dist/renderer/projections/cubemap-projection.d.ts.map +1 -0
- package/dist/renderer/projections/eac-projection.d.ts +35 -0
- package/dist/renderer/projections/eac-projection.d.ts.map +1 -0
- package/dist/renderer/projections/equirect-projection.d.ts +27 -0
- package/dist/renderer/projections/equirect-projection.d.ts.map +1 -0
- package/dist/renderer/projections/fisheye-projection.d.ts +28 -0
- package/dist/renderer/projections/fisheye-projection.d.ts.map +1 -0
- package/dist/renderer/projections/flat-projection.d.ts +32 -0
- package/dist/renderer/projections/flat-projection.d.ts.map +1 -0
- package/dist/renderer/projections/projection.d.ts +18 -0
- package/dist/renderer/projections/projection.d.ts.map +1 -0
- package/dist/renderer/renderer.d.ts +72 -0
- package/dist/renderer/renderer.d.ts.map +1 -0
- package/dist/renderer/shaders/eac.glsl.d.ts +12 -0
- package/dist/renderer/shaders/eac.glsl.d.ts.map +1 -0
- package/dist/renderer/shaders/fisheye.glsl.d.ts +22 -0
- package/dist/renderer/shaders/fisheye.glsl.d.ts.map +1 -0
- package/dist/spatial-BeadwNJA.js +146 -0
- package/dist/spatial-BeadwNJA.js.map +1 -0
- package/dist/sri.json +12 -0
- package/dist/streaming/adapter-factory.d.ts +8 -0
- package/dist/streaming/adapter-factory.d.ts.map +1 -0
- package/dist/streaming/dash-adapter.d.ts +21 -0
- package/dist/streaming/dash-adapter.d.ts.map +1 -0
- package/dist/streaming/hls-adapter.d.ts +26 -0
- package/dist/streaming/hls-adapter.d.ts.map +1 -0
- package/dist/streaming/progressive-adapter.d.ts +18 -0
- package/dist/streaming/progressive-adapter.d.ts.map +1 -0
- package/dist/streaming/quality-selector.d.ts +25 -0
- package/dist/streaming/quality-selector.d.ts.map +1 -0
- package/dist/streaming/source-manager.d.ts +46 -0
- package/dist/streaming/source-manager.d.ts.map +1 -0
- package/dist/streaming/types.d.ts +25 -0
- package/dist/streaming/types.d.ts.map +1 -0
- package/dist/styles/controls.d.ts +15 -0
- package/dist/styles/controls.d.ts.map +1 -0
- package/dist/three-Bci7aSeI.js +20078 -0
- package/dist/three-Bci7aSeI.js.map +1 -0
- package/dist/utils/fullscreen.d.ts +6 -0
- package/dist/utils/fullscreen.d.ts.map +1 -0
- package/dist/utils/sanitize.d.ts +19 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/vizor.js +113 -0
- package/dist/vizor.js.map +1 -0
- package/dist/xr/xr-controller.d.ts +27 -0
- package/dist/xr/xr-controller.d.ts.map +1 -0
- package/dist/xr/xr-manager.d.ts +43 -0
- package/dist/xr/xr-manager.d.ts.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,2158 @@
|
|
|
1
|
+
import { C as CanvasTexture, L as LinearFilter, S as SpriteMaterial, a as Sprite, R as Raycaster, V as Vector2, F as Frustum, M as Matrix4 } from "./three-Bci7aSeI.js";
|
|
2
|
+
var VzFormat;
|
|
3
|
+
(function(VzFormat2) {
|
|
4
|
+
VzFormat2["MONO_360"] = "MONO_360";
|
|
5
|
+
VzFormat2["MONO_FLAT"] = "MONO_FLAT";
|
|
6
|
+
VzFormat2["STEREO_180_LR"] = "STEREO_180_LR";
|
|
7
|
+
VzFormat2["STEREO_180_TB"] = "STEREO_180_TB";
|
|
8
|
+
VzFormat2["STEREO_180_LR_SPHERICAL"] = "STEREO_180_LR_SPHERICAL";
|
|
9
|
+
VzFormat2["STEREO_180_TB_SPHERICAL"] = "STEREO_180_TB_SPHERICAL";
|
|
10
|
+
VzFormat2["STEREO_360_LR"] = "STEREO_360_LR";
|
|
11
|
+
VzFormat2["STEREO_360_TB"] = "STEREO_360_TB";
|
|
12
|
+
VzFormat2["STEREO_FLAT_LR"] = "STEREO_FLAT_LR";
|
|
13
|
+
VzFormat2["STEREO_FLAT_LR_SQUARE"] = "STEREO_FLAT_LR_SQUARE";
|
|
14
|
+
VzFormat2["STEREO_FLAT_TB"] = "STEREO_FLAT_TB";
|
|
15
|
+
VzFormat2["STEREO_FLAT_TB_SQUARE"] = "STEREO_FLAT_TB_SQUARE";
|
|
16
|
+
VzFormat2["MONO_CUBEMAP"] = "MONO_CUBEMAP";
|
|
17
|
+
VzFormat2["STEREO_CUBEMAP"] = "STEREO_CUBEMAP";
|
|
18
|
+
VzFormat2["MONO_EAC"] = "MONO_EAC";
|
|
19
|
+
VzFormat2["STEREO_EAC_TB"] = "STEREO_EAC_TB";
|
|
20
|
+
VzFormat2["MONO_FISHEYE"] = "MONO_FISHEYE";
|
|
21
|
+
VzFormat2["STEREO_FISHEYE_LR"] = "STEREO_FISHEYE_LR";
|
|
22
|
+
VzFormat2["CARDBOARD_PHOTO"] = "CARDBOARD_PHOTO";
|
|
23
|
+
})(VzFormat || (VzFormat = {}));
|
|
24
|
+
const FORMAT_REGISTRY = {
|
|
25
|
+
[VzFormat.MONO_360]: {
|
|
26
|
+
format: VzFormat.MONO_360,
|
|
27
|
+
projection: "equirect",
|
|
28
|
+
stereoMode: "mono",
|
|
29
|
+
fovH: 360,
|
|
30
|
+
fovV: 180,
|
|
31
|
+
supportsVideo: true,
|
|
32
|
+
supportsImage: true,
|
|
33
|
+
isFlat: false
|
|
34
|
+
},
|
|
35
|
+
[VzFormat.MONO_FLAT]: {
|
|
36
|
+
format: VzFormat.MONO_FLAT,
|
|
37
|
+
projection: "flat",
|
|
38
|
+
stereoMode: "mono",
|
|
39
|
+
fovH: 0,
|
|
40
|
+
fovV: 0,
|
|
41
|
+
supportsVideo: true,
|
|
42
|
+
supportsImage: true,
|
|
43
|
+
isFlat: true
|
|
44
|
+
},
|
|
45
|
+
[VzFormat.STEREO_180_LR]: {
|
|
46
|
+
format: VzFormat.STEREO_180_LR,
|
|
47
|
+
projection: "equirect",
|
|
48
|
+
stereoMode: "sbs",
|
|
49
|
+
fovH: 180,
|
|
50
|
+
fovV: 180,
|
|
51
|
+
supportsVideo: true,
|
|
52
|
+
supportsImage: true,
|
|
53
|
+
isFlat: false
|
|
54
|
+
},
|
|
55
|
+
[VzFormat.STEREO_180_TB]: {
|
|
56
|
+
format: VzFormat.STEREO_180_TB,
|
|
57
|
+
projection: "equirect",
|
|
58
|
+
stereoMode: "tb",
|
|
59
|
+
fovH: 180,
|
|
60
|
+
fovV: 180,
|
|
61
|
+
supportsVideo: true,
|
|
62
|
+
supportsImage: true,
|
|
63
|
+
isFlat: false
|
|
64
|
+
},
|
|
65
|
+
[VzFormat.STEREO_180_LR_SPHERICAL]: {
|
|
66
|
+
format: VzFormat.STEREO_180_LR_SPHERICAL,
|
|
67
|
+
projection: "spherical",
|
|
68
|
+
stereoMode: "sbs",
|
|
69
|
+
fovH: 180,
|
|
70
|
+
fovV: 180,
|
|
71
|
+
supportsVideo: true,
|
|
72
|
+
supportsImage: true,
|
|
73
|
+
isFlat: false
|
|
74
|
+
},
|
|
75
|
+
[VzFormat.STEREO_180_TB_SPHERICAL]: {
|
|
76
|
+
format: VzFormat.STEREO_180_TB_SPHERICAL,
|
|
77
|
+
projection: "spherical",
|
|
78
|
+
stereoMode: "tb",
|
|
79
|
+
fovH: 180,
|
|
80
|
+
fovV: 180,
|
|
81
|
+
supportsVideo: true,
|
|
82
|
+
supportsImage: true,
|
|
83
|
+
isFlat: false
|
|
84
|
+
},
|
|
85
|
+
[VzFormat.STEREO_360_LR]: {
|
|
86
|
+
format: VzFormat.STEREO_360_LR,
|
|
87
|
+
projection: "equirect",
|
|
88
|
+
stereoMode: "sbs",
|
|
89
|
+
fovH: 360,
|
|
90
|
+
fovV: 180,
|
|
91
|
+
supportsVideo: true,
|
|
92
|
+
supportsImage: true,
|
|
93
|
+
isFlat: false
|
|
94
|
+
},
|
|
95
|
+
[VzFormat.STEREO_360_TB]: {
|
|
96
|
+
format: VzFormat.STEREO_360_TB,
|
|
97
|
+
projection: "equirect",
|
|
98
|
+
stereoMode: "tb",
|
|
99
|
+
fovH: 360,
|
|
100
|
+
fovV: 180,
|
|
101
|
+
supportsVideo: true,
|
|
102
|
+
supportsImage: true,
|
|
103
|
+
isFlat: false
|
|
104
|
+
},
|
|
105
|
+
[VzFormat.STEREO_FLAT_LR]: {
|
|
106
|
+
format: VzFormat.STEREO_FLAT_LR,
|
|
107
|
+
projection: "flat",
|
|
108
|
+
stereoMode: "sbs",
|
|
109
|
+
fovH: 0,
|
|
110
|
+
fovV: 0,
|
|
111
|
+
supportsVideo: true,
|
|
112
|
+
supportsImage: false,
|
|
113
|
+
isFlat: true
|
|
114
|
+
},
|
|
115
|
+
[VzFormat.STEREO_FLAT_LR_SQUARE]: {
|
|
116
|
+
format: VzFormat.STEREO_FLAT_LR_SQUARE,
|
|
117
|
+
projection: "flat",
|
|
118
|
+
stereoMode: "sbs",
|
|
119
|
+
fovH: 0,
|
|
120
|
+
fovV: 0,
|
|
121
|
+
supportsVideo: true,
|
|
122
|
+
supportsImage: false,
|
|
123
|
+
isFlat: true
|
|
124
|
+
},
|
|
125
|
+
[VzFormat.STEREO_FLAT_TB]: {
|
|
126
|
+
format: VzFormat.STEREO_FLAT_TB,
|
|
127
|
+
projection: "flat",
|
|
128
|
+
stereoMode: "tb",
|
|
129
|
+
fovH: 0,
|
|
130
|
+
fovV: 0,
|
|
131
|
+
supportsVideo: true,
|
|
132
|
+
supportsImage: false,
|
|
133
|
+
isFlat: true
|
|
134
|
+
},
|
|
135
|
+
[VzFormat.STEREO_FLAT_TB_SQUARE]: {
|
|
136
|
+
format: VzFormat.STEREO_FLAT_TB_SQUARE,
|
|
137
|
+
projection: "flat",
|
|
138
|
+
stereoMode: "tb",
|
|
139
|
+
fovH: 0,
|
|
140
|
+
fovV: 0,
|
|
141
|
+
supportsVideo: true,
|
|
142
|
+
supportsImage: false,
|
|
143
|
+
isFlat: true
|
|
144
|
+
},
|
|
145
|
+
[VzFormat.MONO_CUBEMAP]: {
|
|
146
|
+
format: VzFormat.MONO_CUBEMAP,
|
|
147
|
+
projection: "cubemap",
|
|
148
|
+
stereoMode: "mono",
|
|
149
|
+
fovH: 360,
|
|
150
|
+
fovV: 180,
|
|
151
|
+
supportsVideo: true,
|
|
152
|
+
supportsImage: true,
|
|
153
|
+
isFlat: false
|
|
154
|
+
},
|
|
155
|
+
[VzFormat.STEREO_CUBEMAP]: {
|
|
156
|
+
format: VzFormat.STEREO_CUBEMAP,
|
|
157
|
+
projection: "cubemap",
|
|
158
|
+
stereoMode: "tb",
|
|
159
|
+
fovH: 360,
|
|
160
|
+
fovV: 180,
|
|
161
|
+
supportsVideo: true,
|
|
162
|
+
supportsImage: true,
|
|
163
|
+
isFlat: false
|
|
164
|
+
},
|
|
165
|
+
[VzFormat.MONO_EAC]: {
|
|
166
|
+
format: VzFormat.MONO_EAC,
|
|
167
|
+
projection: "eac",
|
|
168
|
+
stereoMode: "mono",
|
|
169
|
+
fovH: 360,
|
|
170
|
+
fovV: 180,
|
|
171
|
+
supportsVideo: true,
|
|
172
|
+
supportsImage: true,
|
|
173
|
+
isFlat: false
|
|
174
|
+
},
|
|
175
|
+
[VzFormat.STEREO_EAC_TB]: {
|
|
176
|
+
format: VzFormat.STEREO_EAC_TB,
|
|
177
|
+
projection: "eac",
|
|
178
|
+
stereoMode: "tb",
|
|
179
|
+
fovH: 360,
|
|
180
|
+
fovV: 180,
|
|
181
|
+
supportsVideo: true,
|
|
182
|
+
supportsImage: true,
|
|
183
|
+
isFlat: false
|
|
184
|
+
},
|
|
185
|
+
[VzFormat.MONO_FISHEYE]: {
|
|
186
|
+
format: VzFormat.MONO_FISHEYE,
|
|
187
|
+
projection: "fisheye",
|
|
188
|
+
stereoMode: "mono",
|
|
189
|
+
fovH: 360,
|
|
190
|
+
fovV: 180,
|
|
191
|
+
supportsVideo: true,
|
|
192
|
+
supportsImage: true,
|
|
193
|
+
isFlat: false
|
|
194
|
+
},
|
|
195
|
+
[VzFormat.STEREO_FISHEYE_LR]: {
|
|
196
|
+
format: VzFormat.STEREO_FISHEYE_LR,
|
|
197
|
+
projection: "fisheye",
|
|
198
|
+
stereoMode: "sbs",
|
|
199
|
+
fovH: 360,
|
|
200
|
+
fovV: 180,
|
|
201
|
+
supportsVideo: true,
|
|
202
|
+
supportsImage: true,
|
|
203
|
+
isFlat: false
|
|
204
|
+
},
|
|
205
|
+
[VzFormat.CARDBOARD_PHOTO]: {
|
|
206
|
+
format: VzFormat.CARDBOARD_PHOTO,
|
|
207
|
+
projection: "equirect",
|
|
208
|
+
stereoMode: "sbs",
|
|
209
|
+
fovH: 360,
|
|
210
|
+
fovV: 180,
|
|
211
|
+
supportsVideo: false,
|
|
212
|
+
supportsImage: true,
|
|
213
|
+
isFlat: false
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
function getFormatMeta(format) {
|
|
217
|
+
return FORMAT_REGISTRY[format];
|
|
218
|
+
}
|
|
219
|
+
function parseFormat(format) {
|
|
220
|
+
if (format in VzFormat) {
|
|
221
|
+
return format;
|
|
222
|
+
}
|
|
223
|
+
return void 0;
|
|
224
|
+
}
|
|
225
|
+
const DEFAULT_CONFIG = {
|
|
226
|
+
format: VzFormat.MONO_360,
|
|
227
|
+
loop: false,
|
|
228
|
+
muted: false,
|
|
229
|
+
preload: "metadata",
|
|
230
|
+
fps: 30,
|
|
231
|
+
startLat: 0,
|
|
232
|
+
startLon: 0,
|
|
233
|
+
focalLength: 75,
|
|
234
|
+
minFocalLength: 30,
|
|
235
|
+
maxFocalLength: 120,
|
|
236
|
+
displayMode: "inline",
|
|
237
|
+
corsFallbackRedirectConfirmation: true,
|
|
238
|
+
seekable: false,
|
|
239
|
+
primaryColor: "#f43f5e",
|
|
240
|
+
secondaryColor: "#1a1a2e",
|
|
241
|
+
hideCompass: false,
|
|
242
|
+
hideVrButton: false,
|
|
243
|
+
hideSettings: false,
|
|
244
|
+
hideFullscreen: false,
|
|
245
|
+
hideControls: false,
|
|
246
|
+
hideTitle: false,
|
|
247
|
+
hideBrandLogo: false,
|
|
248
|
+
hideWatermark: false
|
|
249
|
+
};
|
|
250
|
+
const SPHERE_DEFAULTS = {
|
|
251
|
+
radius: 500,
|
|
252
|
+
widthSegments: 64,
|
|
253
|
+
heightSegments: 32
|
|
254
|
+
};
|
|
255
|
+
const CAMERA_DEFAULTS = {
|
|
256
|
+
fov: 75,
|
|
257
|
+
near: 0.1,
|
|
258
|
+
far: 1e3,
|
|
259
|
+
dampingFactor: 0.08,
|
|
260
|
+
dragSensitivity: 0.25,
|
|
261
|
+
keyboardPanSpeed: 2,
|
|
262
|
+
zoomSpeed: 0.05
|
|
263
|
+
};
|
|
264
|
+
const ANALYTICS_BATCH_INTERVAL = 1e4;
|
|
265
|
+
const GAZE_SAMPLE_INTERVAL = 333;
|
|
266
|
+
const GAZE_BATCH_INTERVAL = 5e3;
|
|
267
|
+
const COLLAB_GAZE_INTERVAL = 200;
|
|
268
|
+
const COLLAB_GAZE_THRESHOLD = 2;
|
|
269
|
+
const COLLAB_GAZE_LERP_FACTOR = 0.15;
|
|
270
|
+
const TIER_FEATURES = {
|
|
271
|
+
free: {
|
|
272
|
+
stereoFormats: false,
|
|
273
|
+
formats180: false,
|
|
274
|
+
adaptiveStreaming: false,
|
|
275
|
+
qualitySelector: false,
|
|
276
|
+
tours: false,
|
|
277
|
+
cinema: false,
|
|
278
|
+
hub: false,
|
|
279
|
+
spatialAudio: false,
|
|
280
|
+
webxr: false,
|
|
281
|
+
customBranding: false,
|
|
282
|
+
brandLogoColors: false,
|
|
283
|
+
analytics: false,
|
|
284
|
+
analyticsHeatmaps: false,
|
|
285
|
+
collaborative: false,
|
|
286
|
+
chapters: false,
|
|
287
|
+
aiChaptering: false,
|
|
288
|
+
captions: true,
|
|
289
|
+
keyboardShortcuts: true,
|
|
290
|
+
playlist: false,
|
|
291
|
+
drm: false,
|
|
292
|
+
webhooks: false,
|
|
293
|
+
removeWatermark: false
|
|
294
|
+
},
|
|
295
|
+
starter: {
|
|
296
|
+
stereoFormats: true,
|
|
297
|
+
formats180: true,
|
|
298
|
+
adaptiveStreaming: true,
|
|
299
|
+
qualitySelector: true,
|
|
300
|
+
tours: false,
|
|
301
|
+
cinema: false,
|
|
302
|
+
hub: false,
|
|
303
|
+
spatialAudio: false,
|
|
304
|
+
webxr: true,
|
|
305
|
+
customBranding: true,
|
|
306
|
+
brandLogoColors: false,
|
|
307
|
+
analytics: true,
|
|
308
|
+
analyticsHeatmaps: false,
|
|
309
|
+
collaborative: false,
|
|
310
|
+
chapters: false,
|
|
311
|
+
aiChaptering: false,
|
|
312
|
+
captions: true,
|
|
313
|
+
keyboardShortcuts: true,
|
|
314
|
+
playlist: false,
|
|
315
|
+
drm: false,
|
|
316
|
+
webhooks: false,
|
|
317
|
+
removeWatermark: true
|
|
318
|
+
},
|
|
319
|
+
pro: {
|
|
320
|
+
stereoFormats: true,
|
|
321
|
+
formats180: true,
|
|
322
|
+
adaptiveStreaming: true,
|
|
323
|
+
qualitySelector: true,
|
|
324
|
+
tours: true,
|
|
325
|
+
cinema: true,
|
|
326
|
+
hub: false,
|
|
327
|
+
spatialAudio: true,
|
|
328
|
+
webxr: true,
|
|
329
|
+
customBranding: true,
|
|
330
|
+
brandLogoColors: true,
|
|
331
|
+
analytics: true,
|
|
332
|
+
analyticsHeatmaps: true,
|
|
333
|
+
collaborative: false,
|
|
334
|
+
chapters: true,
|
|
335
|
+
aiChaptering: false,
|
|
336
|
+
captions: true,
|
|
337
|
+
keyboardShortcuts: true,
|
|
338
|
+
playlist: true,
|
|
339
|
+
drm: false,
|
|
340
|
+
webhooks: true,
|
|
341
|
+
removeWatermark: true
|
|
342
|
+
},
|
|
343
|
+
enterprise: {
|
|
344
|
+
stereoFormats: true,
|
|
345
|
+
formats180: true,
|
|
346
|
+
adaptiveStreaming: true,
|
|
347
|
+
qualitySelector: true,
|
|
348
|
+
tours: true,
|
|
349
|
+
cinema: true,
|
|
350
|
+
hub: true,
|
|
351
|
+
spatialAudio: true,
|
|
352
|
+
webxr: true,
|
|
353
|
+
customBranding: true,
|
|
354
|
+
brandLogoColors: true,
|
|
355
|
+
analytics: true,
|
|
356
|
+
analyticsHeatmaps: true,
|
|
357
|
+
collaborative: true,
|
|
358
|
+
chapters: true,
|
|
359
|
+
aiChaptering: true,
|
|
360
|
+
captions: true,
|
|
361
|
+
keyboardShortcuts: true,
|
|
362
|
+
playlist: true,
|
|
363
|
+
drm: true,
|
|
364
|
+
webhooks: true,
|
|
365
|
+
removeWatermark: true
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
function getFeaturesForTier(tier) {
|
|
369
|
+
return TIER_FEATURES[tier];
|
|
370
|
+
}
|
|
371
|
+
const MEDIA_EVENTS = [
|
|
372
|
+
"play",
|
|
373
|
+
"pause",
|
|
374
|
+
"playing",
|
|
375
|
+
"seeking",
|
|
376
|
+
"seeked",
|
|
377
|
+
"ended",
|
|
378
|
+
"loadstart",
|
|
379
|
+
"progress",
|
|
380
|
+
"suspend",
|
|
381
|
+
"abort",
|
|
382
|
+
"error",
|
|
383
|
+
"emptied",
|
|
384
|
+
"stalled",
|
|
385
|
+
"loadedmetadata",
|
|
386
|
+
"loadeddata",
|
|
387
|
+
"canplay",
|
|
388
|
+
"canplaythrough",
|
|
389
|
+
"durationchange",
|
|
390
|
+
"timeupdate",
|
|
391
|
+
"ratechange",
|
|
392
|
+
"resize",
|
|
393
|
+
"volumechange",
|
|
394
|
+
"waiting"
|
|
395
|
+
];
|
|
396
|
+
const SEEK_STEP = 5;
|
|
397
|
+
const VOLUME_STEP = 0.05;
|
|
398
|
+
function degToRad(degrees) {
|
|
399
|
+
return degrees * Math.PI / 180;
|
|
400
|
+
}
|
|
401
|
+
function clamp(value, min, max) {
|
|
402
|
+
return Math.min(Math.max(value, min), max);
|
|
403
|
+
}
|
|
404
|
+
function latLonToSpherical(lat, lon) {
|
|
405
|
+
return {
|
|
406
|
+
phi: degToRad(90 - lat),
|
|
407
|
+
theta: degToRad(lon)
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
function normalizeAngle(angle) {
|
|
411
|
+
while (angle > 180)
|
|
412
|
+
angle -= 360;
|
|
413
|
+
while (angle < -180)
|
|
414
|
+
angle += 360;
|
|
415
|
+
return angle;
|
|
416
|
+
}
|
|
417
|
+
/*! @license DOMPurify 3.4.11 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.11/LICENSE */
|
|
418
|
+
function _arrayLikeToArray(r, a) {
|
|
419
|
+
(null == a || a > r.length) && (a = r.length);
|
|
420
|
+
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
|
|
421
|
+
return n;
|
|
422
|
+
}
|
|
423
|
+
function _arrayWithHoles(r) {
|
|
424
|
+
if (Array.isArray(r)) return r;
|
|
425
|
+
}
|
|
426
|
+
function _iterableToArrayLimit(r, l) {
|
|
427
|
+
var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
|
|
428
|
+
if (null != t) {
|
|
429
|
+
var e, n, i, u, a = [], f = true, o = false;
|
|
430
|
+
try {
|
|
431
|
+
if (i = (t = t.call(r)).next, 0 === l) ;
|
|
432
|
+
else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = true) ;
|
|
433
|
+
} catch (r2) {
|
|
434
|
+
o = true, n = r2;
|
|
435
|
+
} finally {
|
|
436
|
+
try {
|
|
437
|
+
if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
|
|
438
|
+
} finally {
|
|
439
|
+
if (o) throw n;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return a;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
function _nonIterableRest() {
|
|
446
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
447
|
+
}
|
|
448
|
+
function _slicedToArray(r, e) {
|
|
449
|
+
return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
|
|
450
|
+
}
|
|
451
|
+
function _unsupportedIterableToArray(r, a) {
|
|
452
|
+
if (r) {
|
|
453
|
+
if ("string" == typeof r) return _arrayLikeToArray(r, a);
|
|
454
|
+
var t = {}.toString.call(r).slice(8, -1);
|
|
455
|
+
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
const entries = Object.entries, setPrototypeOf = Object.setPrototypeOf, isFrozen = Object.isFrozen, getPrototypeOf = Object.getPrototypeOf, getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
|
|
459
|
+
let freeze = Object.freeze, seal = Object.seal, create = Object.create;
|
|
460
|
+
let _ref = typeof Reflect !== "undefined" && Reflect, apply = _ref.apply, construct = _ref.construct;
|
|
461
|
+
if (!freeze) {
|
|
462
|
+
freeze = function freeze2(x) {
|
|
463
|
+
return x;
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
if (!seal) {
|
|
467
|
+
seal = function seal2(x) {
|
|
468
|
+
return x;
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
if (!apply) {
|
|
472
|
+
apply = function apply2(func, thisArg) {
|
|
473
|
+
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
|
|
474
|
+
args[_key - 2] = arguments[_key];
|
|
475
|
+
}
|
|
476
|
+
return func.apply(thisArg, args);
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
if (!construct) {
|
|
480
|
+
construct = function construct2(Func) {
|
|
481
|
+
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
|
482
|
+
args[_key2 - 1] = arguments[_key2];
|
|
483
|
+
}
|
|
484
|
+
return new Func(...args);
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
const arrayForEach = unapply(Array.prototype.forEach);
|
|
488
|
+
const arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);
|
|
489
|
+
const arrayPop = unapply(Array.prototype.pop);
|
|
490
|
+
const arrayPush = unapply(Array.prototype.push);
|
|
491
|
+
const arraySplice = unapply(Array.prototype.splice);
|
|
492
|
+
const arrayIsArray = Array.isArray;
|
|
493
|
+
const stringToLowerCase = unapply(String.prototype.toLowerCase);
|
|
494
|
+
const stringToString = unapply(String.prototype.toString);
|
|
495
|
+
const stringMatch = unapply(String.prototype.match);
|
|
496
|
+
const stringReplace = unapply(String.prototype.replace);
|
|
497
|
+
const stringIndexOf = unapply(String.prototype.indexOf);
|
|
498
|
+
const stringTrim = unapply(String.prototype.trim);
|
|
499
|
+
const numberToString = unapply(Number.prototype.toString);
|
|
500
|
+
const booleanToString = unapply(Boolean.prototype.toString);
|
|
501
|
+
const bigintToString = typeof BigInt === "undefined" ? null : unapply(BigInt.prototype.toString);
|
|
502
|
+
const symbolToString = typeof Symbol === "undefined" ? null : unapply(Symbol.prototype.toString);
|
|
503
|
+
const objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);
|
|
504
|
+
const objectToString = unapply(Object.prototype.toString);
|
|
505
|
+
const regExpTest = unapply(RegExp.prototype.test);
|
|
506
|
+
const typeErrorCreate = unconstruct(TypeError);
|
|
507
|
+
function unapply(func) {
|
|
508
|
+
return function(thisArg) {
|
|
509
|
+
if (thisArg instanceof RegExp) {
|
|
510
|
+
thisArg.lastIndex = 0;
|
|
511
|
+
}
|
|
512
|
+
for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
|
|
513
|
+
args[_key3 - 1] = arguments[_key3];
|
|
514
|
+
}
|
|
515
|
+
return apply(func, thisArg, args);
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
function unconstruct(Func) {
|
|
519
|
+
return function() {
|
|
520
|
+
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
521
|
+
args[_key4] = arguments[_key4];
|
|
522
|
+
}
|
|
523
|
+
return construct(Func, args);
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
function addToSet(set, array) {
|
|
527
|
+
let transformCaseFunc = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : stringToLowerCase;
|
|
528
|
+
if (setPrototypeOf) {
|
|
529
|
+
setPrototypeOf(set, null);
|
|
530
|
+
}
|
|
531
|
+
if (!arrayIsArray(array)) {
|
|
532
|
+
return set;
|
|
533
|
+
}
|
|
534
|
+
let l = array.length;
|
|
535
|
+
while (l--) {
|
|
536
|
+
let element = array[l];
|
|
537
|
+
if (typeof element === "string") {
|
|
538
|
+
const lcElement = transformCaseFunc(element);
|
|
539
|
+
if (lcElement !== element) {
|
|
540
|
+
if (!isFrozen(array)) {
|
|
541
|
+
array[l] = lcElement;
|
|
542
|
+
}
|
|
543
|
+
element = lcElement;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
set[element] = true;
|
|
547
|
+
}
|
|
548
|
+
return set;
|
|
549
|
+
}
|
|
550
|
+
function cleanArray(array) {
|
|
551
|
+
for (let index = 0; index < array.length; index++) {
|
|
552
|
+
const isPropertyExist = objectHasOwnProperty(array, index);
|
|
553
|
+
if (!isPropertyExist) {
|
|
554
|
+
array[index] = null;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
return array;
|
|
558
|
+
}
|
|
559
|
+
function clone(object) {
|
|
560
|
+
const newObject = create(null);
|
|
561
|
+
for (const _ref2 of entries(object)) {
|
|
562
|
+
var _ref3 = _slicedToArray(_ref2, 2);
|
|
563
|
+
const property = _ref3[0];
|
|
564
|
+
const value = _ref3[1];
|
|
565
|
+
const isPropertyExist = objectHasOwnProperty(object, property);
|
|
566
|
+
if (isPropertyExist) {
|
|
567
|
+
if (arrayIsArray(value)) {
|
|
568
|
+
newObject[property] = cleanArray(value);
|
|
569
|
+
} else if (value && typeof value === "object" && value.constructor === Object) {
|
|
570
|
+
newObject[property] = clone(value);
|
|
571
|
+
} else {
|
|
572
|
+
newObject[property] = value;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
return newObject;
|
|
577
|
+
}
|
|
578
|
+
function stringifyValue(value) {
|
|
579
|
+
switch (typeof value) {
|
|
580
|
+
case "string": {
|
|
581
|
+
return value;
|
|
582
|
+
}
|
|
583
|
+
case "number": {
|
|
584
|
+
return numberToString(value);
|
|
585
|
+
}
|
|
586
|
+
case "boolean": {
|
|
587
|
+
return booleanToString(value);
|
|
588
|
+
}
|
|
589
|
+
case "bigint": {
|
|
590
|
+
return bigintToString ? bigintToString(value) : "0";
|
|
591
|
+
}
|
|
592
|
+
case "symbol": {
|
|
593
|
+
return symbolToString ? symbolToString(value) : "Symbol()";
|
|
594
|
+
}
|
|
595
|
+
case "undefined": {
|
|
596
|
+
return objectToString(value);
|
|
597
|
+
}
|
|
598
|
+
case "function":
|
|
599
|
+
case "object": {
|
|
600
|
+
if (value === null) {
|
|
601
|
+
return objectToString(value);
|
|
602
|
+
}
|
|
603
|
+
const valueAsRecord = value;
|
|
604
|
+
const valueToString = lookupGetter(valueAsRecord, "toString");
|
|
605
|
+
if (typeof valueToString === "function") {
|
|
606
|
+
const stringified = valueToString(valueAsRecord);
|
|
607
|
+
return typeof stringified === "string" ? stringified : objectToString(stringified);
|
|
608
|
+
}
|
|
609
|
+
return objectToString(value);
|
|
610
|
+
}
|
|
611
|
+
default: {
|
|
612
|
+
return objectToString(value);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
function lookupGetter(object, prop) {
|
|
617
|
+
while (object !== null) {
|
|
618
|
+
const desc = getOwnPropertyDescriptor(object, prop);
|
|
619
|
+
if (desc) {
|
|
620
|
+
if (desc.get) {
|
|
621
|
+
return unapply(desc.get);
|
|
622
|
+
}
|
|
623
|
+
if (typeof desc.value === "function") {
|
|
624
|
+
return unapply(desc.value);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
object = getPrototypeOf(object);
|
|
628
|
+
}
|
|
629
|
+
function fallbackValue() {
|
|
630
|
+
return null;
|
|
631
|
+
}
|
|
632
|
+
return fallbackValue;
|
|
633
|
+
}
|
|
634
|
+
function isRegex(value) {
|
|
635
|
+
try {
|
|
636
|
+
regExpTest(value, "");
|
|
637
|
+
return true;
|
|
638
|
+
} catch (_unused) {
|
|
639
|
+
return false;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
const html$1 = freeze(["a", "abbr", "acronym", "address", "area", "article", "aside", "audio", "b", "bdi", "bdo", "big", "blink", "blockquote", "body", "br", "button", "canvas", "caption", "center", "cite", "code", "col", "colgroup", "content", "data", "datalist", "dd", "decorator", "del", "details", "dfn", "dialog", "dir", "div", "dl", "dt", "element", "em", "fieldset", "figcaption", "figure", "font", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "i", "img", "input", "ins", "kbd", "label", "legend", "li", "main", "map", "mark", "marquee", "menu", "menuitem", "meter", "nav", "nobr", "ol", "optgroup", "option", "output", "p", "picture", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "search", "section", "select", "shadow", "slot", "small", "source", "spacer", "span", "strike", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "time", "tr", "track", "tt", "u", "ul", "var", "video", "wbr"]);
|
|
643
|
+
const svg$1 = freeze(["svg", "a", "altglyph", "altglyphdef", "altglyphitem", "animatecolor", "animatemotion", "animatetransform", "circle", "clippath", "defs", "desc", "ellipse", "enterkeyhint", "exportparts", "filter", "font", "g", "glyph", "glyphref", "hkern", "image", "inputmode", "line", "lineargradient", "marker", "mask", "metadata", "mpath", "part", "path", "pattern", "polygon", "polyline", "radialgradient", "rect", "stop", "style", "switch", "symbol", "text", "textpath", "title", "tref", "tspan", "view", "vkern"]);
|
|
644
|
+
const svgFilters = freeze(["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence"]);
|
|
645
|
+
const svgDisallowed = freeze(["animate", "color-profile", "cursor", "discard", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignobject", "hatch", "hatchpath", "mesh", "meshgradient", "meshpatch", "meshrow", "missing-glyph", "script", "set", "solidcolor", "unknown", "use"]);
|
|
646
|
+
const mathMl$1 = freeze(["math", "menclose", "merror", "mfenced", "mfrac", "mglyph", "mi", "mlabeledtr", "mmultiscripts", "mn", "mo", "mover", "mpadded", "mphantom", "mroot", "mrow", "ms", "mspace", "msqrt", "mstyle", "msub", "msup", "msubsup", "mtable", "mtd", "mtext", "mtr", "munder", "munderover", "mprescripts"]);
|
|
647
|
+
const mathMlDisallowed = freeze(["maction", "maligngroup", "malignmark", "mlongdiv", "mscarries", "mscarry", "msgroup", "mstack", "msline", "msrow", "semantics", "annotation", "annotation-xml", "mprescripts", "none"]);
|
|
648
|
+
const text = freeze(["#text"]);
|
|
649
|
+
const html = freeze(["accept", "action", "align", "alt", "autocapitalize", "autocomplete", "autopictureinpicture", "autoplay", "background", "bgcolor", "border", "capture", "cellpadding", "cellspacing", "checked", "cite", "class", "clear", "color", "cols", "colspan", "command", "commandfor", "controls", "controlslist", "coords", "crossorigin", "datetime", "decoding", "default", "dir", "disabled", "disablepictureinpicture", "disableremoteplayback", "download", "draggable", "enctype", "enterkeyhint", "exportparts", "face", "for", "headers", "height", "hidden", "high", "href", "hreflang", "id", "inert", "inputmode", "integrity", "ismap", "kind", "label", "lang", "list", "loading", "loop", "low", "max", "maxlength", "media", "method", "min", "minlength", "multiple", "muted", "name", "nonce", "noshade", "novalidate", "nowrap", "open", "optimum", "part", "pattern", "placeholder", "playsinline", "popover", "popovertarget", "popovertargetaction", "poster", "preload", "pubdate", "radiogroup", "readonly", "rel", "required", "rev", "reversed", "role", "rows", "rowspan", "spellcheck", "scope", "selected", "shape", "size", "sizes", "slot", "span", "srclang", "start", "src", "srcset", "step", "style", "summary", "tabindex", "title", "translate", "type", "usemap", "valign", "value", "width", "wrap", "xmlns"]);
|
|
650
|
+
const svg = freeze(["accent-height", "accumulate", "additive", "alignment-baseline", "amplitude", "ascent", "attributename", "attributetype", "azimuth", "basefrequency", "baseline-shift", "begin", "bias", "by", "class", "clip", "clippathunits", "clip-path", "clip-rule", "color", "color-interpolation", "color-interpolation-filters", "color-profile", "color-rendering", "cx", "cy", "d", "dx", "dy", "diffuseconstant", "direction", "display", "divisor", "dur", "edgemode", "elevation", "end", "exponent", "fill", "fill-opacity", "fill-rule", "filter", "filterunits", "flood-color", "flood-opacity", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "fx", "fy", "g1", "g2", "glyph-name", "glyphref", "gradientunits", "gradienttransform", "height", "href", "id", "image-rendering", "in", "in2", "intercept", "k", "k1", "k2", "k3", "k4", "kerning", "keypoints", "keysplines", "keytimes", "lang", "lengthadjust", "letter-spacing", "kernelmatrix", "kernelunitlength", "lighting-color", "local", "marker-end", "marker-mid", "marker-start", "markerheight", "markerunits", "markerwidth", "maskcontentunits", "maskunits", "max", "mask", "mask-type", "media", "method", "mode", "min", "name", "numoctaves", "offset", "operator", "opacity", "order", "orient", "orientation", "origin", "overflow", "paint-order", "path", "pathlength", "patterncontentunits", "patterntransform", "patternunits", "points", "preservealpha", "preserveaspectratio", "primitiveunits", "r", "rx", "ry", "radius", "refx", "refy", "repeatcount", "repeatdur", "restart", "result", "rotate", "scale", "seed", "shape-rendering", "slope", "specularconstant", "specularexponent", "spreadmethod", "startoffset", "stddeviation", "stitchtiles", "stop-color", "stop-opacity", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke", "stroke-width", "style", "surfacescale", "systemlanguage", "tabindex", "tablevalues", "targetx", "targety", "transform", "transform-origin", "text-anchor", "text-decoration", "text-rendering", "textlength", "type", "u1", "u2", "unicode", "values", "viewbox", "visibility", "version", "vert-adv-y", "vert-origin-x", "vert-origin-y", "width", "word-spacing", "wrap", "writing-mode", "xchannelselector", "ychannelselector", "x", "x1", "x2", "xmlns", "y", "y1", "y2", "z", "zoomandpan"]);
|
|
651
|
+
const mathMl = freeze(["accent", "accentunder", "align", "bevelled", "close", "columnalign", "columnlines", "columnspacing", "columnspan", "denomalign", "depth", "dir", "display", "displaystyle", "encoding", "fence", "frame", "height", "href", "id", "largeop", "length", "linethickness", "lquote", "lspace", "mathbackground", "mathcolor", "mathsize", "mathvariant", "maxsize", "minsize", "movablelimits", "notation", "numalign", "open", "rowalign", "rowlines", "rowspacing", "rowspan", "rspace", "rquote", "scriptlevel", "scriptminsize", "scriptsizemultiplier", "selection", "separator", "separators", "stretchy", "subscriptshift", "supscriptshift", "symmetric", "voffset", "width", "xmlns"]);
|
|
652
|
+
const xml = freeze(["xlink:href", "xml:id", "xlink:title", "xml:space", "xmlns:xlink"]);
|
|
653
|
+
const MUSTACHE_EXPR = seal(/{{[\w\W]*|^[\w\W]*}}/g);
|
|
654
|
+
const ERB_EXPR = seal(/<%[\w\W]*|^[\w\W]*%>/g);
|
|
655
|
+
const TMPLIT_EXPR = seal(/\${[\w\W]*/g);
|
|
656
|
+
const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]+$/);
|
|
657
|
+
const ARIA_ATTR = seal(/^aria-[\-\w]+$/);
|
|
658
|
+
const IS_ALLOWED_URI = seal(
|
|
659
|
+
/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i
|
|
660
|
+
// eslint-disable-line no-useless-escape
|
|
661
|
+
);
|
|
662
|
+
const IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
|
|
663
|
+
const ATTR_WHITESPACE = seal(
|
|
664
|
+
/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g
|
|
665
|
+
// eslint-disable-line no-control-regex
|
|
666
|
+
);
|
|
667
|
+
const DOCTYPE_NAME = seal(/^html$/i);
|
|
668
|
+
const CUSTOM_ELEMENT = seal(/^[a-z][.\w]*(-[.\w]+)+$/i);
|
|
669
|
+
const ELEMENT_MARKUP_PROBE = seal(/<[/\w!]/g);
|
|
670
|
+
const COMMENT_MARKUP_PROBE = seal(/<[/\w]/g);
|
|
671
|
+
const FALLBACK_TAG_CLOSE = seal(/<\/no(script|embed|frames)/i);
|
|
672
|
+
const SELF_CLOSING_TAG = seal(/\/>/i);
|
|
673
|
+
const NODE_TYPE = {
|
|
674
|
+
element: 1,
|
|
675
|
+
attribute: 2,
|
|
676
|
+
text: 3,
|
|
677
|
+
cdataSection: 4,
|
|
678
|
+
entityReference: 5,
|
|
679
|
+
// Deprecated
|
|
680
|
+
entityNode: 6,
|
|
681
|
+
// Deprecated
|
|
682
|
+
processingInstruction: 7,
|
|
683
|
+
comment: 8,
|
|
684
|
+
document: 9,
|
|
685
|
+
documentType: 10,
|
|
686
|
+
documentFragment: 11,
|
|
687
|
+
notation: 12
|
|
688
|
+
// Deprecated
|
|
689
|
+
};
|
|
690
|
+
const getGlobal = function getGlobal2() {
|
|
691
|
+
return typeof window === "undefined" ? null : window;
|
|
692
|
+
};
|
|
693
|
+
const _createTrustedTypesPolicy = function _createTrustedTypesPolicy2(trustedTypes, purifyHostElement) {
|
|
694
|
+
if (typeof trustedTypes !== "object" || typeof trustedTypes.createPolicy !== "function") {
|
|
695
|
+
return null;
|
|
696
|
+
}
|
|
697
|
+
let suffix = null;
|
|
698
|
+
const ATTR_NAME = "data-tt-policy-suffix";
|
|
699
|
+
if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {
|
|
700
|
+
suffix = purifyHostElement.getAttribute(ATTR_NAME);
|
|
701
|
+
}
|
|
702
|
+
const policyName = "dompurify" + (suffix ? "#" + suffix : "");
|
|
703
|
+
try {
|
|
704
|
+
return trustedTypes.createPolicy(policyName, {
|
|
705
|
+
createHTML(html2) {
|
|
706
|
+
return html2;
|
|
707
|
+
},
|
|
708
|
+
createScriptURL(scriptUrl) {
|
|
709
|
+
return scriptUrl;
|
|
710
|
+
}
|
|
711
|
+
});
|
|
712
|
+
} catch (_) {
|
|
713
|
+
console.warn("TrustedTypes policy " + policyName + " could not be created.");
|
|
714
|
+
return null;
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
const _createHooksMap = function _createHooksMap2() {
|
|
718
|
+
return {
|
|
719
|
+
afterSanitizeAttributes: [],
|
|
720
|
+
afterSanitizeElements: [],
|
|
721
|
+
afterSanitizeShadowDOM: [],
|
|
722
|
+
beforeSanitizeAttributes: [],
|
|
723
|
+
beforeSanitizeElements: [],
|
|
724
|
+
beforeSanitizeShadowDOM: [],
|
|
725
|
+
uponSanitizeAttribute: [],
|
|
726
|
+
uponSanitizeElement: [],
|
|
727
|
+
uponSanitizeShadowNode: []
|
|
728
|
+
};
|
|
729
|
+
};
|
|
730
|
+
const _resolveSetOption = function _resolveSetOption2(cfg, key, fallback, options) {
|
|
731
|
+
return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key]) ? addToSet(options.base ? clone(options.base) : {}, cfg[key], options.transform) : fallback;
|
|
732
|
+
};
|
|
733
|
+
function createDOMPurify() {
|
|
734
|
+
let window2 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : getGlobal();
|
|
735
|
+
const DOMPurify = (root) => createDOMPurify(root);
|
|
736
|
+
DOMPurify.version = "3.4.11";
|
|
737
|
+
DOMPurify.removed = [];
|
|
738
|
+
if (!window2 || !window2.document || window2.document.nodeType !== NODE_TYPE.document || !window2.Element) {
|
|
739
|
+
DOMPurify.isSupported = false;
|
|
740
|
+
return DOMPurify;
|
|
741
|
+
}
|
|
742
|
+
let document2 = window2.document;
|
|
743
|
+
const originalDocument = document2;
|
|
744
|
+
const currentScript = originalDocument.currentScript;
|
|
745
|
+
window2.DocumentFragment;
|
|
746
|
+
const HTMLTemplateElement = window2.HTMLTemplateElement, Node = window2.Node, Element = window2.Element, NodeFilter = window2.NodeFilter, _window$NamedNodeMap = window2.NamedNodeMap;
|
|
747
|
+
_window$NamedNodeMap === void 0 ? window2.NamedNodeMap || window2.MozNamedAttrMap : _window$NamedNodeMap;
|
|
748
|
+
window2.HTMLFormElement;
|
|
749
|
+
const DOMParser = window2.DOMParser, trustedTypes = window2.trustedTypes;
|
|
750
|
+
const ElementPrototype = Element.prototype;
|
|
751
|
+
const cloneNode = lookupGetter(ElementPrototype, "cloneNode");
|
|
752
|
+
const remove = lookupGetter(ElementPrototype, "remove");
|
|
753
|
+
const getNextSibling = lookupGetter(ElementPrototype, "nextSibling");
|
|
754
|
+
const getChildNodes = lookupGetter(ElementPrototype, "childNodes");
|
|
755
|
+
const getParentNode = lookupGetter(ElementPrototype, "parentNode");
|
|
756
|
+
const getShadowRoot = lookupGetter(ElementPrototype, "shadowRoot");
|
|
757
|
+
const getAttributes = lookupGetter(ElementPrototype, "attributes");
|
|
758
|
+
const getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, "nodeType") : null;
|
|
759
|
+
const getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, "nodeName") : null;
|
|
760
|
+
if (typeof HTMLTemplateElement === "function") {
|
|
761
|
+
const template = document2.createElement("template");
|
|
762
|
+
if (template.content && template.content.ownerDocument) {
|
|
763
|
+
document2 = template.content.ownerDocument;
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
let trustedTypesPolicy;
|
|
767
|
+
let emptyHTML = "";
|
|
768
|
+
let defaultTrustedTypesPolicy;
|
|
769
|
+
let defaultTrustedTypesPolicyResolved = false;
|
|
770
|
+
let IN_TRUSTED_TYPES_POLICY = 0;
|
|
771
|
+
const _assertNotInTrustedTypesPolicy = function _assertNotInTrustedTypesPolicy2() {
|
|
772
|
+
if (IN_TRUSTED_TYPES_POLICY > 0) {
|
|
773
|
+
throw typeErrorCreate('A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.');
|
|
774
|
+
}
|
|
775
|
+
};
|
|
776
|
+
const _createTrustedHTML = function _createTrustedHTML2(html2) {
|
|
777
|
+
_assertNotInTrustedTypesPolicy();
|
|
778
|
+
IN_TRUSTED_TYPES_POLICY++;
|
|
779
|
+
try {
|
|
780
|
+
return trustedTypesPolicy.createHTML(html2);
|
|
781
|
+
} finally {
|
|
782
|
+
IN_TRUSTED_TYPES_POLICY--;
|
|
783
|
+
}
|
|
784
|
+
};
|
|
785
|
+
const _createTrustedScriptURL = function _createTrustedScriptURL2(scriptUrl) {
|
|
786
|
+
_assertNotInTrustedTypesPolicy();
|
|
787
|
+
IN_TRUSTED_TYPES_POLICY++;
|
|
788
|
+
try {
|
|
789
|
+
return trustedTypesPolicy.createScriptURL(scriptUrl);
|
|
790
|
+
} finally {
|
|
791
|
+
IN_TRUSTED_TYPES_POLICY--;
|
|
792
|
+
}
|
|
793
|
+
};
|
|
794
|
+
const _getDefaultTrustedTypesPolicy = function _getDefaultTrustedTypesPolicy2() {
|
|
795
|
+
if (!defaultTrustedTypesPolicyResolved) {
|
|
796
|
+
defaultTrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);
|
|
797
|
+
defaultTrustedTypesPolicyResolved = true;
|
|
798
|
+
}
|
|
799
|
+
return defaultTrustedTypesPolicy;
|
|
800
|
+
};
|
|
801
|
+
const _document = document2, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName;
|
|
802
|
+
const importNode = originalDocument.importNode;
|
|
803
|
+
let hooks = _createHooksMap();
|
|
804
|
+
DOMPurify.isSupported = typeof entries === "function" && typeof getParentNode === "function" && implementation && implementation.createHTMLDocument !== void 0;
|
|
805
|
+
const MUSTACHE_EXPR$1 = MUSTACHE_EXPR, ERB_EXPR$1 = ERB_EXPR, TMPLIT_EXPR$1 = TMPLIT_EXPR, DATA_ATTR$1 = DATA_ATTR, ARIA_ATTR$1 = ARIA_ATTR, IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA, ATTR_WHITESPACE$1 = ATTR_WHITESPACE, CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;
|
|
806
|
+
let IS_ALLOWED_URI$1 = IS_ALLOWED_URI;
|
|
807
|
+
let ALLOWED_TAGS = null;
|
|
808
|
+
const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);
|
|
809
|
+
let ALLOWED_ATTR = null;
|
|
810
|
+
const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);
|
|
811
|
+
let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {
|
|
812
|
+
tagNameCheck: {
|
|
813
|
+
writable: true,
|
|
814
|
+
configurable: false,
|
|
815
|
+
enumerable: true,
|
|
816
|
+
value: null
|
|
817
|
+
},
|
|
818
|
+
attributeNameCheck: {
|
|
819
|
+
writable: true,
|
|
820
|
+
configurable: false,
|
|
821
|
+
enumerable: true,
|
|
822
|
+
value: null
|
|
823
|
+
},
|
|
824
|
+
allowCustomizedBuiltInElements: {
|
|
825
|
+
writable: true,
|
|
826
|
+
configurable: false,
|
|
827
|
+
enumerable: true,
|
|
828
|
+
value: false
|
|
829
|
+
}
|
|
830
|
+
}));
|
|
831
|
+
let FORBID_TAGS = null;
|
|
832
|
+
let FORBID_ATTR = null;
|
|
833
|
+
const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {
|
|
834
|
+
tagCheck: {
|
|
835
|
+
writable: true,
|
|
836
|
+
configurable: false,
|
|
837
|
+
enumerable: true,
|
|
838
|
+
value: null
|
|
839
|
+
},
|
|
840
|
+
attributeCheck: {
|
|
841
|
+
writable: true,
|
|
842
|
+
configurable: false,
|
|
843
|
+
enumerable: true,
|
|
844
|
+
value: null
|
|
845
|
+
}
|
|
846
|
+
}));
|
|
847
|
+
let ALLOW_ARIA_ATTR = true;
|
|
848
|
+
let ALLOW_DATA_ATTR = true;
|
|
849
|
+
let ALLOW_UNKNOWN_PROTOCOLS = false;
|
|
850
|
+
let ALLOW_SELF_CLOSE_IN_ATTR = true;
|
|
851
|
+
let SAFE_FOR_TEMPLATES = false;
|
|
852
|
+
let SAFE_FOR_XML = true;
|
|
853
|
+
let WHOLE_DOCUMENT = false;
|
|
854
|
+
let SET_CONFIG = false;
|
|
855
|
+
let SET_CONFIG_ALLOWED_TAGS = null;
|
|
856
|
+
let SET_CONFIG_ALLOWED_ATTR = null;
|
|
857
|
+
let FORCE_BODY = false;
|
|
858
|
+
let RETURN_DOM = false;
|
|
859
|
+
let RETURN_DOM_FRAGMENT = false;
|
|
860
|
+
let RETURN_TRUSTED_TYPE = false;
|
|
861
|
+
let SANITIZE_DOM = true;
|
|
862
|
+
let SANITIZE_NAMED_PROPS = false;
|
|
863
|
+
const SANITIZE_NAMED_PROPS_PREFIX = "user-content-";
|
|
864
|
+
let KEEP_CONTENT = true;
|
|
865
|
+
let IN_PLACE = false;
|
|
866
|
+
let USE_PROFILES = {};
|
|
867
|
+
let FORBID_CONTENTS = null;
|
|
868
|
+
const DEFAULT_FORBID_CONTENTS = addToSet({}, [
|
|
869
|
+
"annotation-xml",
|
|
870
|
+
"audio",
|
|
871
|
+
"colgroup",
|
|
872
|
+
"desc",
|
|
873
|
+
"foreignobject",
|
|
874
|
+
"head",
|
|
875
|
+
"iframe",
|
|
876
|
+
"math",
|
|
877
|
+
"mi",
|
|
878
|
+
"mn",
|
|
879
|
+
"mo",
|
|
880
|
+
"ms",
|
|
881
|
+
"mtext",
|
|
882
|
+
"noembed",
|
|
883
|
+
"noframes",
|
|
884
|
+
"noscript",
|
|
885
|
+
"plaintext",
|
|
886
|
+
"script",
|
|
887
|
+
// <selectedcontent> mirrors the selected <option>'s subtree, cloned by
|
|
888
|
+
// the UA (customizable <select>) — including any on* handlers — and the
|
|
889
|
+
// engine re-mirrors synchronously whenever a removal changes which
|
|
890
|
+
// option/selectedcontent is current, even inside DOMPurify's inert
|
|
891
|
+
// DOMParser document. Hoisting its children on removal re-inserts a fresh
|
|
892
|
+
// mirror target ahead of the walk, which the engine refills, looping
|
|
893
|
+
// forever (DoS) and amplifying output. Dropping its content on removal
|
|
894
|
+
// (rather than hoisting) breaks that cascade; the content is a duplicate
|
|
895
|
+
// of the option, which is sanitized on its own. See campaign-3 F1/F6.
|
|
896
|
+
"selectedcontent",
|
|
897
|
+
"style",
|
|
898
|
+
"svg",
|
|
899
|
+
"template",
|
|
900
|
+
"thead",
|
|
901
|
+
"title",
|
|
902
|
+
"video",
|
|
903
|
+
"xmp"
|
|
904
|
+
]);
|
|
905
|
+
let DATA_URI_TAGS = null;
|
|
906
|
+
const DEFAULT_DATA_URI_TAGS = addToSet({}, ["audio", "video", "img", "source", "image", "track"]);
|
|
907
|
+
let URI_SAFE_ATTRIBUTES = null;
|
|
908
|
+
const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ["alt", "class", "for", "id", "label", "name", "pattern", "placeholder", "role", "summary", "title", "value", "style", "xmlns"]);
|
|
909
|
+
const MATHML_NAMESPACE = "http://www.w3.org/1998/Math/MathML";
|
|
910
|
+
const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
|
|
911
|
+
const HTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
|
|
912
|
+
let NAMESPACE = HTML_NAMESPACE;
|
|
913
|
+
let IS_EMPTY_INPUT = false;
|
|
914
|
+
let ALLOWED_NAMESPACES = null;
|
|
915
|
+
const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);
|
|
916
|
+
const DEFAULT_MATHML_TEXT_INTEGRATION_POINTS = freeze(["mi", "mo", "mn", "ms", "mtext"]);
|
|
917
|
+
let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);
|
|
918
|
+
const DEFAULT_HTML_INTEGRATION_POINTS = freeze(["annotation-xml"]);
|
|
919
|
+
let HTML_INTEGRATION_POINTS = addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);
|
|
920
|
+
const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ["title", "style", "font", "a", "script"]);
|
|
921
|
+
let PARSER_MEDIA_TYPE = null;
|
|
922
|
+
const SUPPORTED_PARSER_MEDIA_TYPES = ["application/xhtml+xml", "text/html"];
|
|
923
|
+
const DEFAULT_PARSER_MEDIA_TYPE = "text/html";
|
|
924
|
+
let transformCaseFunc = null;
|
|
925
|
+
let CONFIG = null;
|
|
926
|
+
const formElement = document2.createElement("form");
|
|
927
|
+
const isRegexOrFunction = function isRegexOrFunction2(testValue) {
|
|
928
|
+
return testValue instanceof RegExp || testValue instanceof Function;
|
|
929
|
+
};
|
|
930
|
+
const _parseConfig = function _parseConfig2() {
|
|
931
|
+
let cfg = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
932
|
+
if (CONFIG && CONFIG === cfg) {
|
|
933
|
+
return;
|
|
934
|
+
}
|
|
935
|
+
if (!cfg || typeof cfg !== "object") {
|
|
936
|
+
cfg = {};
|
|
937
|
+
}
|
|
938
|
+
cfg = clone(cfg);
|
|
939
|
+
PARSER_MEDIA_TYPE = // eslint-disable-next-line unicorn/prefer-includes
|
|
940
|
+
SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;
|
|
941
|
+
transformCaseFunc = PARSER_MEDIA_TYPE === "application/xhtml+xml" ? stringToString : stringToLowerCase;
|
|
942
|
+
ALLOWED_TAGS = _resolveSetOption(cfg, "ALLOWED_TAGS", DEFAULT_ALLOWED_TAGS, {
|
|
943
|
+
transform: transformCaseFunc
|
|
944
|
+
});
|
|
945
|
+
ALLOWED_ATTR = _resolveSetOption(cfg, "ALLOWED_ATTR", DEFAULT_ALLOWED_ATTR, {
|
|
946
|
+
transform: transformCaseFunc
|
|
947
|
+
});
|
|
948
|
+
ALLOWED_NAMESPACES = _resolveSetOption(cfg, "ALLOWED_NAMESPACES", DEFAULT_ALLOWED_NAMESPACES, {
|
|
949
|
+
transform: stringToString
|
|
950
|
+
});
|
|
951
|
+
URI_SAFE_ATTRIBUTES = _resolveSetOption(cfg, "ADD_URI_SAFE_ATTR", DEFAULT_URI_SAFE_ATTRIBUTES, {
|
|
952
|
+
transform: transformCaseFunc,
|
|
953
|
+
base: DEFAULT_URI_SAFE_ATTRIBUTES
|
|
954
|
+
});
|
|
955
|
+
DATA_URI_TAGS = _resolveSetOption(cfg, "ADD_DATA_URI_TAGS", DEFAULT_DATA_URI_TAGS, {
|
|
956
|
+
transform: transformCaseFunc,
|
|
957
|
+
base: DEFAULT_DATA_URI_TAGS
|
|
958
|
+
});
|
|
959
|
+
FORBID_CONTENTS = _resolveSetOption(cfg, "FORBID_CONTENTS", DEFAULT_FORBID_CONTENTS, {
|
|
960
|
+
transform: transformCaseFunc
|
|
961
|
+
});
|
|
962
|
+
FORBID_TAGS = _resolveSetOption(cfg, "FORBID_TAGS", clone({}), {
|
|
963
|
+
transform: transformCaseFunc
|
|
964
|
+
});
|
|
965
|
+
FORBID_ATTR = _resolveSetOption(cfg, "FORBID_ATTR", clone({}), {
|
|
966
|
+
transform: transformCaseFunc
|
|
967
|
+
});
|
|
968
|
+
USE_PROFILES = objectHasOwnProperty(cfg, "USE_PROFILES") ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === "object" ? clone(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;
|
|
969
|
+
ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false;
|
|
970
|
+
ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false;
|
|
971
|
+
ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false;
|
|
972
|
+
ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false;
|
|
973
|
+
SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false;
|
|
974
|
+
SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false;
|
|
975
|
+
WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false;
|
|
976
|
+
RETURN_DOM = cfg.RETURN_DOM || false;
|
|
977
|
+
RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false;
|
|
978
|
+
RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false;
|
|
979
|
+
FORCE_BODY = cfg.FORCE_BODY || false;
|
|
980
|
+
SANITIZE_DOM = cfg.SANITIZE_DOM !== false;
|
|
981
|
+
SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false;
|
|
982
|
+
KEEP_CONTENT = cfg.KEEP_CONTENT !== false;
|
|
983
|
+
IN_PLACE = cfg.IN_PLACE || false;
|
|
984
|
+
IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI;
|
|
985
|
+
NAMESPACE = typeof cfg.NAMESPACE === "string" ? cfg.NAMESPACE : HTML_NAMESPACE;
|
|
986
|
+
MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, "MATHML_TEXT_INTEGRATION_POINTS") && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === "object" ? clone(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);
|
|
987
|
+
HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, "HTML_INTEGRATION_POINTS") && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === "object" ? clone(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);
|
|
988
|
+
const customElementHandling = objectHasOwnProperty(cfg, "CUSTOM_ELEMENT_HANDLING") && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === "object" ? clone(cfg.CUSTOM_ELEMENT_HANDLING) : create(null);
|
|
989
|
+
CUSTOM_ELEMENT_HANDLING = create(null);
|
|
990
|
+
if (objectHasOwnProperty(customElementHandling, "tagNameCheck") && isRegexOrFunction(customElementHandling.tagNameCheck)) {
|
|
991
|
+
CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck;
|
|
992
|
+
}
|
|
993
|
+
if (objectHasOwnProperty(customElementHandling, "attributeNameCheck") && isRegexOrFunction(customElementHandling.attributeNameCheck)) {
|
|
994
|
+
CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck;
|
|
995
|
+
}
|
|
996
|
+
if (objectHasOwnProperty(customElementHandling, "allowCustomizedBuiltInElements") && typeof customElementHandling.allowCustomizedBuiltInElements === "boolean") {
|
|
997
|
+
CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements;
|
|
998
|
+
}
|
|
999
|
+
seal(CUSTOM_ELEMENT_HANDLING);
|
|
1000
|
+
if (SAFE_FOR_TEMPLATES) {
|
|
1001
|
+
ALLOW_DATA_ATTR = false;
|
|
1002
|
+
}
|
|
1003
|
+
if (RETURN_DOM_FRAGMENT) {
|
|
1004
|
+
RETURN_DOM = true;
|
|
1005
|
+
}
|
|
1006
|
+
if (USE_PROFILES) {
|
|
1007
|
+
ALLOWED_TAGS = addToSet({}, text);
|
|
1008
|
+
ALLOWED_ATTR = create(null);
|
|
1009
|
+
if (USE_PROFILES.html === true) {
|
|
1010
|
+
addToSet(ALLOWED_TAGS, html$1);
|
|
1011
|
+
addToSet(ALLOWED_ATTR, html);
|
|
1012
|
+
}
|
|
1013
|
+
if (USE_PROFILES.svg === true) {
|
|
1014
|
+
addToSet(ALLOWED_TAGS, svg$1);
|
|
1015
|
+
addToSet(ALLOWED_ATTR, svg);
|
|
1016
|
+
addToSet(ALLOWED_ATTR, xml);
|
|
1017
|
+
}
|
|
1018
|
+
if (USE_PROFILES.svgFilters === true) {
|
|
1019
|
+
addToSet(ALLOWED_TAGS, svgFilters);
|
|
1020
|
+
addToSet(ALLOWED_ATTR, svg);
|
|
1021
|
+
addToSet(ALLOWED_ATTR, xml);
|
|
1022
|
+
}
|
|
1023
|
+
if (USE_PROFILES.mathMl === true) {
|
|
1024
|
+
addToSet(ALLOWED_TAGS, mathMl$1);
|
|
1025
|
+
addToSet(ALLOWED_ATTR, mathMl);
|
|
1026
|
+
addToSet(ALLOWED_ATTR, xml);
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
EXTRA_ELEMENT_HANDLING.tagCheck = null;
|
|
1030
|
+
EXTRA_ELEMENT_HANDLING.attributeCheck = null;
|
|
1031
|
+
if (objectHasOwnProperty(cfg, "ADD_TAGS")) {
|
|
1032
|
+
if (typeof cfg.ADD_TAGS === "function") {
|
|
1033
|
+
EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;
|
|
1034
|
+
} else if (arrayIsArray(cfg.ADD_TAGS)) {
|
|
1035
|
+
if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
|
|
1036
|
+
ALLOWED_TAGS = clone(ALLOWED_TAGS);
|
|
1037
|
+
}
|
|
1038
|
+
addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
if (objectHasOwnProperty(cfg, "ADD_ATTR")) {
|
|
1042
|
+
if (typeof cfg.ADD_ATTR === "function") {
|
|
1043
|
+
EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;
|
|
1044
|
+
} else if (arrayIsArray(cfg.ADD_ATTR)) {
|
|
1045
|
+
if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
|
|
1046
|
+
ALLOWED_ATTR = clone(ALLOWED_ATTR);
|
|
1047
|
+
}
|
|
1048
|
+
addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
if (objectHasOwnProperty(cfg, "ADD_URI_SAFE_ATTR") && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) {
|
|
1052
|
+
addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);
|
|
1053
|
+
}
|
|
1054
|
+
if (objectHasOwnProperty(cfg, "FORBID_CONTENTS") && arrayIsArray(cfg.FORBID_CONTENTS)) {
|
|
1055
|
+
if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
|
|
1056
|
+
FORBID_CONTENTS = clone(FORBID_CONTENTS);
|
|
1057
|
+
}
|
|
1058
|
+
addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);
|
|
1059
|
+
}
|
|
1060
|
+
if (objectHasOwnProperty(cfg, "ADD_FORBID_CONTENTS") && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {
|
|
1061
|
+
if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
|
|
1062
|
+
FORBID_CONTENTS = clone(FORBID_CONTENTS);
|
|
1063
|
+
}
|
|
1064
|
+
addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);
|
|
1065
|
+
}
|
|
1066
|
+
if (KEEP_CONTENT) {
|
|
1067
|
+
ALLOWED_TAGS["#text"] = true;
|
|
1068
|
+
}
|
|
1069
|
+
if (WHOLE_DOCUMENT) {
|
|
1070
|
+
addToSet(ALLOWED_TAGS, ["html", "head", "body"]);
|
|
1071
|
+
}
|
|
1072
|
+
if (ALLOWED_TAGS.table) {
|
|
1073
|
+
addToSet(ALLOWED_TAGS, ["tbody"]);
|
|
1074
|
+
delete FORBID_TAGS.tbody;
|
|
1075
|
+
}
|
|
1076
|
+
if (cfg.TRUSTED_TYPES_POLICY) {
|
|
1077
|
+
if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== "function") {
|
|
1078
|
+
throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');
|
|
1079
|
+
}
|
|
1080
|
+
if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== "function") {
|
|
1081
|
+
throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');
|
|
1082
|
+
}
|
|
1083
|
+
const previousTrustedTypesPolicy = trustedTypesPolicy;
|
|
1084
|
+
trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;
|
|
1085
|
+
try {
|
|
1086
|
+
emptyHTML = _createTrustedHTML("");
|
|
1087
|
+
} catch (error) {
|
|
1088
|
+
trustedTypesPolicy = previousTrustedTypesPolicy;
|
|
1089
|
+
throw error;
|
|
1090
|
+
}
|
|
1091
|
+
} else if (cfg.TRUSTED_TYPES_POLICY === null) {
|
|
1092
|
+
trustedTypesPolicy = void 0;
|
|
1093
|
+
emptyHTML = "";
|
|
1094
|
+
} else {
|
|
1095
|
+
if (trustedTypesPolicy === void 0) {
|
|
1096
|
+
trustedTypesPolicy = _getDefaultTrustedTypesPolicy();
|
|
1097
|
+
}
|
|
1098
|
+
if (trustedTypesPolicy && typeof emptyHTML === "string") {
|
|
1099
|
+
emptyHTML = _createTrustedHTML("");
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
if (freeze) {
|
|
1103
|
+
freeze(cfg);
|
|
1104
|
+
}
|
|
1105
|
+
CONFIG = cfg;
|
|
1106
|
+
};
|
|
1107
|
+
const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);
|
|
1108
|
+
const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);
|
|
1109
|
+
const _checkSvgNamespace = function _checkSvgNamespace2(tagName, parent, parentTagName) {
|
|
1110
|
+
if (parent.namespaceURI === HTML_NAMESPACE) {
|
|
1111
|
+
return tagName === "svg";
|
|
1112
|
+
}
|
|
1113
|
+
if (parent.namespaceURI === MATHML_NAMESPACE) {
|
|
1114
|
+
return tagName === "svg" && (parentTagName === "annotation-xml" || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);
|
|
1115
|
+
}
|
|
1116
|
+
return Boolean(ALL_SVG_TAGS[tagName]);
|
|
1117
|
+
};
|
|
1118
|
+
const _checkMathMlNamespace = function _checkMathMlNamespace2(tagName, parent, parentTagName) {
|
|
1119
|
+
if (parent.namespaceURI === HTML_NAMESPACE) {
|
|
1120
|
+
return tagName === "math";
|
|
1121
|
+
}
|
|
1122
|
+
if (parent.namespaceURI === SVG_NAMESPACE) {
|
|
1123
|
+
return tagName === "math" && HTML_INTEGRATION_POINTS[parentTagName];
|
|
1124
|
+
}
|
|
1125
|
+
return Boolean(ALL_MATHML_TAGS[tagName]);
|
|
1126
|
+
};
|
|
1127
|
+
const _checkHtmlNamespace = function _checkHtmlNamespace2(tagName, parent, parentTagName) {
|
|
1128
|
+
if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {
|
|
1129
|
+
return false;
|
|
1130
|
+
}
|
|
1131
|
+
if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {
|
|
1132
|
+
return false;
|
|
1133
|
+
}
|
|
1134
|
+
return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);
|
|
1135
|
+
};
|
|
1136
|
+
const _checkValidNamespace = function _checkValidNamespace2(element) {
|
|
1137
|
+
let parent = getParentNode(element);
|
|
1138
|
+
if (!parent || !parent.tagName) {
|
|
1139
|
+
parent = {
|
|
1140
|
+
namespaceURI: NAMESPACE,
|
|
1141
|
+
tagName: "template"
|
|
1142
|
+
};
|
|
1143
|
+
}
|
|
1144
|
+
const tagName = stringToLowerCase(element.tagName);
|
|
1145
|
+
const parentTagName = stringToLowerCase(parent.tagName);
|
|
1146
|
+
if (!ALLOWED_NAMESPACES[element.namespaceURI]) {
|
|
1147
|
+
return false;
|
|
1148
|
+
}
|
|
1149
|
+
if (element.namespaceURI === SVG_NAMESPACE) {
|
|
1150
|
+
return _checkSvgNamespace(tagName, parent, parentTagName);
|
|
1151
|
+
}
|
|
1152
|
+
if (element.namespaceURI === MATHML_NAMESPACE) {
|
|
1153
|
+
return _checkMathMlNamespace(tagName, parent, parentTagName);
|
|
1154
|
+
}
|
|
1155
|
+
if (element.namespaceURI === HTML_NAMESPACE) {
|
|
1156
|
+
return _checkHtmlNamespace(tagName, parent, parentTagName);
|
|
1157
|
+
}
|
|
1158
|
+
if (PARSER_MEDIA_TYPE === "application/xhtml+xml" && ALLOWED_NAMESPACES[element.namespaceURI]) {
|
|
1159
|
+
return true;
|
|
1160
|
+
}
|
|
1161
|
+
return false;
|
|
1162
|
+
};
|
|
1163
|
+
const _forceRemove = function _forceRemove2(node) {
|
|
1164
|
+
arrayPush(DOMPurify.removed, {
|
|
1165
|
+
element: node
|
|
1166
|
+
});
|
|
1167
|
+
try {
|
|
1168
|
+
getParentNode(node).removeChild(node);
|
|
1169
|
+
} catch (_) {
|
|
1170
|
+
remove(node);
|
|
1171
|
+
if (!getParentNode(node)) {
|
|
1172
|
+
throw typeErrorCreate("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place");
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
};
|
|
1176
|
+
const _neutralizeRoot = function _neutralizeRoot2(root) {
|
|
1177
|
+
const childNodes = getChildNodes(root);
|
|
1178
|
+
if (childNodes) {
|
|
1179
|
+
const snapshot = [];
|
|
1180
|
+
arrayForEach(childNodes, (child) => {
|
|
1181
|
+
arrayPush(snapshot, child);
|
|
1182
|
+
});
|
|
1183
|
+
arrayForEach(snapshot, (child) => {
|
|
1184
|
+
try {
|
|
1185
|
+
remove(child);
|
|
1186
|
+
} catch (_) {
|
|
1187
|
+
}
|
|
1188
|
+
});
|
|
1189
|
+
}
|
|
1190
|
+
const attributes = getAttributes(root);
|
|
1191
|
+
if (attributes) {
|
|
1192
|
+
for (let i = attributes.length - 1; i >= 0; --i) {
|
|
1193
|
+
const attribute = attributes[i];
|
|
1194
|
+
const name = attribute && attribute.name;
|
|
1195
|
+
if (typeof name === "string") {
|
|
1196
|
+
try {
|
|
1197
|
+
root.removeAttribute(name);
|
|
1198
|
+
} catch (_) {
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
};
|
|
1204
|
+
const _removeAttribute = function _removeAttribute2(name, element) {
|
|
1205
|
+
try {
|
|
1206
|
+
arrayPush(DOMPurify.removed, {
|
|
1207
|
+
attribute: element.getAttributeNode(name),
|
|
1208
|
+
from: element
|
|
1209
|
+
});
|
|
1210
|
+
} catch (_) {
|
|
1211
|
+
arrayPush(DOMPurify.removed, {
|
|
1212
|
+
attribute: null,
|
|
1213
|
+
from: element
|
|
1214
|
+
});
|
|
1215
|
+
}
|
|
1216
|
+
element.removeAttribute(name);
|
|
1217
|
+
if (name === "is") {
|
|
1218
|
+
if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
|
|
1219
|
+
try {
|
|
1220
|
+
_forceRemove(element);
|
|
1221
|
+
} catch (_) {
|
|
1222
|
+
}
|
|
1223
|
+
} else {
|
|
1224
|
+
try {
|
|
1225
|
+
element.setAttribute(name, "");
|
|
1226
|
+
} catch (_) {
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
}
|
|
1230
|
+
};
|
|
1231
|
+
const _stripDisallowedAttributes = function _stripDisallowedAttributes2(element) {
|
|
1232
|
+
const attributes = getAttributes(element);
|
|
1233
|
+
if (!attributes) {
|
|
1234
|
+
return;
|
|
1235
|
+
}
|
|
1236
|
+
for (let i = attributes.length - 1; i >= 0; --i) {
|
|
1237
|
+
const attribute = attributes[i];
|
|
1238
|
+
const name = attribute && attribute.name;
|
|
1239
|
+
if (typeof name !== "string" || ALLOWED_ATTR[transformCaseFunc(name)]) {
|
|
1240
|
+
continue;
|
|
1241
|
+
}
|
|
1242
|
+
try {
|
|
1243
|
+
element.removeAttribute(name);
|
|
1244
|
+
} catch (_) {
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
};
|
|
1248
|
+
const _neutralizeSubtree = function _neutralizeSubtree2(root) {
|
|
1249
|
+
const stack = [root];
|
|
1250
|
+
while (stack.length > 0) {
|
|
1251
|
+
const node = stack.pop();
|
|
1252
|
+
const nodeType = getNodeType ? getNodeType(node) : node.nodeType;
|
|
1253
|
+
if (nodeType === NODE_TYPE.element) {
|
|
1254
|
+
_stripDisallowedAttributes(node);
|
|
1255
|
+
}
|
|
1256
|
+
const childNodes = getChildNodes(node);
|
|
1257
|
+
if (childNodes) {
|
|
1258
|
+
for (let i = childNodes.length - 1; i >= 0; --i) {
|
|
1259
|
+
stack.push(childNodes[i]);
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
};
|
|
1264
|
+
const _initDocument = function _initDocument2(dirty) {
|
|
1265
|
+
let doc = null;
|
|
1266
|
+
let leadingWhitespace = null;
|
|
1267
|
+
if (FORCE_BODY) {
|
|
1268
|
+
dirty = "<remove></remove>" + dirty;
|
|
1269
|
+
} else {
|
|
1270
|
+
const matches = stringMatch(dirty, /^[\r\n\t ]+/);
|
|
1271
|
+
leadingWhitespace = matches && matches[0];
|
|
1272
|
+
}
|
|
1273
|
+
if (PARSER_MEDIA_TYPE === "application/xhtml+xml" && NAMESPACE === HTML_NAMESPACE) {
|
|
1274
|
+
dirty = '<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>' + dirty + "</body></html>";
|
|
1275
|
+
}
|
|
1276
|
+
const dirtyPayload = trustedTypesPolicy ? _createTrustedHTML(dirty) : dirty;
|
|
1277
|
+
if (NAMESPACE === HTML_NAMESPACE) {
|
|
1278
|
+
try {
|
|
1279
|
+
doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);
|
|
1280
|
+
} catch (_) {
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
if (!doc || !doc.documentElement) {
|
|
1284
|
+
doc = implementation.createDocument(NAMESPACE, "template", null);
|
|
1285
|
+
try {
|
|
1286
|
+
doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;
|
|
1287
|
+
} catch (_) {
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
const body = doc.body || doc.documentElement;
|
|
1291
|
+
if (dirty && leadingWhitespace) {
|
|
1292
|
+
body.insertBefore(document2.createTextNode(leadingWhitespace), body.childNodes[0] || null);
|
|
1293
|
+
}
|
|
1294
|
+
if (NAMESPACE === HTML_NAMESPACE) {
|
|
1295
|
+
return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? "html" : "body")[0];
|
|
1296
|
+
}
|
|
1297
|
+
return WHOLE_DOCUMENT ? doc.documentElement : body;
|
|
1298
|
+
};
|
|
1299
|
+
const _createNodeIterator = function _createNodeIterator2(root) {
|
|
1300
|
+
return createNodeIterator.call(
|
|
1301
|
+
root.ownerDocument || root,
|
|
1302
|
+
root,
|
|
1303
|
+
// eslint-disable-next-line no-bitwise
|
|
1304
|
+
NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION,
|
|
1305
|
+
null
|
|
1306
|
+
);
|
|
1307
|
+
};
|
|
1308
|
+
const _stripTemplateExpressions = function _stripTemplateExpressions2(value) {
|
|
1309
|
+
value = stringReplace(value, MUSTACHE_EXPR$1, " ");
|
|
1310
|
+
value = stringReplace(value, ERB_EXPR$1, " ");
|
|
1311
|
+
value = stringReplace(value, TMPLIT_EXPR$1, " ");
|
|
1312
|
+
return value;
|
|
1313
|
+
};
|
|
1314
|
+
const _scrubTemplateExpressions2 = function _scrubTemplateExpressions(node) {
|
|
1315
|
+
var _node$querySelectorAl;
|
|
1316
|
+
node.normalize();
|
|
1317
|
+
const walker = createNodeIterator.call(
|
|
1318
|
+
node.ownerDocument || node,
|
|
1319
|
+
node,
|
|
1320
|
+
// eslint-disable-next-line no-bitwise
|
|
1321
|
+
NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION,
|
|
1322
|
+
null
|
|
1323
|
+
);
|
|
1324
|
+
let currentNode = walker.nextNode();
|
|
1325
|
+
while (currentNode) {
|
|
1326
|
+
currentNode.data = _stripTemplateExpressions(currentNode.data);
|
|
1327
|
+
currentNode = walker.nextNode();
|
|
1328
|
+
}
|
|
1329
|
+
const templates = (_node$querySelectorAl = node.querySelectorAll) === null || _node$querySelectorAl === void 0 ? void 0 : _node$querySelectorAl.call(node, "template");
|
|
1330
|
+
if (templates) {
|
|
1331
|
+
arrayForEach(templates, (tmpl) => {
|
|
1332
|
+
if (_isDocumentFragment(tmpl.content)) {
|
|
1333
|
+
_scrubTemplateExpressions2(tmpl.content);
|
|
1334
|
+
}
|
|
1335
|
+
});
|
|
1336
|
+
}
|
|
1337
|
+
};
|
|
1338
|
+
const _isClobbered = function _isClobbered2(element) {
|
|
1339
|
+
const realTagName = getNodeName ? getNodeName(element) : null;
|
|
1340
|
+
if (typeof realTagName !== "string") {
|
|
1341
|
+
return false;
|
|
1342
|
+
}
|
|
1343
|
+
if (transformCaseFunc(realTagName) !== "form") {
|
|
1344
|
+
return false;
|
|
1345
|
+
}
|
|
1346
|
+
return typeof element.nodeName !== "string" || typeof element.textContent !== "string" || typeof element.removeChild !== "function" || // Realm-safe NamedNodeMap detection: equality against the cached
|
|
1347
|
+
// prototype getter. Clobbered .attributes (e.g. <input name="attributes">)
|
|
1348
|
+
// makes the direct read diverge from the cached read; a clean form
|
|
1349
|
+
// (same-realm OR foreign-realm) has both reads pointing at the same
|
|
1350
|
+
// canonical NamedNodeMap.
|
|
1351
|
+
element.attributes !== getAttributes(element) || typeof element.removeAttribute !== "function" || typeof element.setAttribute !== "function" || typeof element.namespaceURI !== "string" || typeof element.insertBefore !== "function" || typeof element.hasChildNodes !== "function" || // NodeType clobbering probe. Cached Node.prototype.nodeType getter
|
|
1352
|
+
// returns the integer 1 for any Element regardless of realm; direct
|
|
1353
|
+
// read on a clobbered form (e.g. <input name="nodeType">) returns
|
|
1354
|
+
// the named child element. Cheap addition — nodeType is read from
|
|
1355
|
+
// an internal slot, no serialization cost — and removes a residual
|
|
1356
|
+
// clobbering surface used by several mXSS / PI / comment branches
|
|
1357
|
+
// in _sanitizeElements that compare currentNode.nodeType directly.
|
|
1358
|
+
element.nodeType !== getNodeType(element) || // HTMLFormElement has [LegacyOverrideBuiltIns]: a descendant named
|
|
1359
|
+
// "childNodes" shadows the prototype getter. Direct reads of
|
|
1360
|
+
// form.childNodes from a clobbered form return the named child
|
|
1361
|
+
// instead of the real NodeList, so any walk that reads it directly
|
|
1362
|
+
// skips the form's real children. Compare the direct read to the
|
|
1363
|
+
// cached Node.prototype getter — when the form's named-property
|
|
1364
|
+
// getter intercepts the read, the two values differ and we flag
|
|
1365
|
+
// the form. This catches every clobbering child type (input,
|
|
1366
|
+
// select, etc.) regardless of whether the named child happens to
|
|
1367
|
+
// carry a numeric .length, which a typeof-based probe would miss
|
|
1368
|
+
// (e.g. HTMLSelectElement.length is a defined unsigned-long).
|
|
1369
|
+
element.childNodes !== getChildNodes(element);
|
|
1370
|
+
};
|
|
1371
|
+
const _isDocumentFragment = function _isDocumentFragment2(value) {
|
|
1372
|
+
if (!getNodeType || typeof value !== "object" || value === null) {
|
|
1373
|
+
return false;
|
|
1374
|
+
}
|
|
1375
|
+
try {
|
|
1376
|
+
return getNodeType(value) === NODE_TYPE.documentFragment;
|
|
1377
|
+
} catch (_) {
|
|
1378
|
+
return false;
|
|
1379
|
+
}
|
|
1380
|
+
};
|
|
1381
|
+
const _isNode = function _isNode2(value) {
|
|
1382
|
+
if (!getNodeType || typeof value !== "object" || value === null) {
|
|
1383
|
+
return false;
|
|
1384
|
+
}
|
|
1385
|
+
try {
|
|
1386
|
+
return typeof getNodeType(value) === "number";
|
|
1387
|
+
} catch (_) {
|
|
1388
|
+
return false;
|
|
1389
|
+
}
|
|
1390
|
+
};
|
|
1391
|
+
function _executeHooks(hooks2, currentNode, data) {
|
|
1392
|
+
if (hooks2.length === 0) {
|
|
1393
|
+
return;
|
|
1394
|
+
}
|
|
1395
|
+
arrayForEach(hooks2, (hook) => {
|
|
1396
|
+
hook.call(DOMPurify, currentNode, data, CONFIG);
|
|
1397
|
+
});
|
|
1398
|
+
}
|
|
1399
|
+
const _isUnsafeNode = function _isUnsafeNode2(currentNode, tagName) {
|
|
1400
|
+
if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.textContent) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.innerHTML)) {
|
|
1401
|
+
return true;
|
|
1402
|
+
}
|
|
1403
|
+
if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && tagName === "style" && _isNode(currentNode.firstElementChild)) {
|
|
1404
|
+
return true;
|
|
1405
|
+
}
|
|
1406
|
+
if (currentNode.nodeType === NODE_TYPE.processingInstruction) {
|
|
1407
|
+
return true;
|
|
1408
|
+
}
|
|
1409
|
+
if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, currentNode.data)) {
|
|
1410
|
+
return true;
|
|
1411
|
+
}
|
|
1412
|
+
return false;
|
|
1413
|
+
};
|
|
1414
|
+
const _sanitizeDisallowedNode = function _sanitizeDisallowedNode2(currentNode, tagName) {
|
|
1415
|
+
if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {
|
|
1416
|
+
if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {
|
|
1417
|
+
return false;
|
|
1418
|
+
}
|
|
1419
|
+
if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {
|
|
1420
|
+
return false;
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {
|
|
1424
|
+
const parentNode = getParentNode(currentNode);
|
|
1425
|
+
const childNodes = getChildNodes(currentNode);
|
|
1426
|
+
if (childNodes && parentNode) {
|
|
1427
|
+
const childCount = childNodes.length;
|
|
1428
|
+
for (let i = childCount - 1; i >= 0; --i) {
|
|
1429
|
+
const hoisted = IN_PLACE ? childNodes[i] : cloneNode(childNodes[i], true);
|
|
1430
|
+
parentNode.insertBefore(hoisted, getNextSibling(currentNode));
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
_forceRemove(currentNode);
|
|
1435
|
+
return true;
|
|
1436
|
+
};
|
|
1437
|
+
const _sanitizeElements = function _sanitizeElements2(currentNode) {
|
|
1438
|
+
_executeHooks(hooks.beforeSanitizeElements, currentNode, null);
|
|
1439
|
+
if (_isClobbered(currentNode)) {
|
|
1440
|
+
_forceRemove(currentNode);
|
|
1441
|
+
return true;
|
|
1442
|
+
}
|
|
1443
|
+
const tagName = transformCaseFunc(getNodeName ? getNodeName(currentNode) : currentNode.nodeName);
|
|
1444
|
+
_executeHooks(hooks.uponSanitizeElement, currentNode, {
|
|
1445
|
+
tagName,
|
|
1446
|
+
allowedTags: ALLOWED_TAGS
|
|
1447
|
+
});
|
|
1448
|
+
if (_isUnsafeNode(currentNode, tagName)) {
|
|
1449
|
+
_forceRemove(currentNode);
|
|
1450
|
+
return true;
|
|
1451
|
+
}
|
|
1452
|
+
if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {
|
|
1453
|
+
return _sanitizeDisallowedNode(currentNode, tagName);
|
|
1454
|
+
}
|
|
1455
|
+
const nt = getNodeType ? getNodeType(currentNode) : currentNode.nodeType;
|
|
1456
|
+
if (nt === NODE_TYPE.element && !_checkValidNamespace(currentNode)) {
|
|
1457
|
+
_forceRemove(currentNode);
|
|
1458
|
+
return true;
|
|
1459
|
+
}
|
|
1460
|
+
if ((tagName === "noscript" || tagName === "noembed" || tagName === "noframes") && regExpTest(FALLBACK_TAG_CLOSE, currentNode.innerHTML)) {
|
|
1461
|
+
_forceRemove(currentNode);
|
|
1462
|
+
return true;
|
|
1463
|
+
}
|
|
1464
|
+
if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {
|
|
1465
|
+
const content = _stripTemplateExpressions(currentNode.textContent);
|
|
1466
|
+
if (currentNode.textContent !== content) {
|
|
1467
|
+
arrayPush(DOMPurify.removed, {
|
|
1468
|
+
element: currentNode.cloneNode()
|
|
1469
|
+
});
|
|
1470
|
+
currentNode.textContent = content;
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
_executeHooks(hooks.afterSanitizeElements, currentNode, null);
|
|
1474
|
+
return false;
|
|
1475
|
+
};
|
|
1476
|
+
const _isValidAttribute = function _isValidAttribute2(lcTag, lcName, value) {
|
|
1477
|
+
if (FORBID_ATTR[lcName]) {
|
|
1478
|
+
return false;
|
|
1479
|
+
}
|
|
1480
|
+
if (SANITIZE_DOM && (lcName === "id" || lcName === "name") && (value in document2 || value in formElement)) {
|
|
1481
|
+
return false;
|
|
1482
|
+
}
|
|
1483
|
+
const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);
|
|
1484
|
+
if (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$1, lcName)) ;
|
|
1485
|
+
else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) ;
|
|
1486
|
+
else if (!nameIsPermitted) {
|
|
1487
|
+
if (
|
|
1488
|
+
// First condition does a very basic check if a) it's basically a valid custom element tagname AND
|
|
1489
|
+
// b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
|
|
1490
|
+
// and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck
|
|
1491
|
+
_isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) || // Alternative, second condition checks if it's an `is`-attribute, AND
|
|
1492
|
+
// the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck
|
|
1493
|
+
lcName === "is" && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))
|
|
1494
|
+
) ;
|
|
1495
|
+
else {
|
|
1496
|
+
return false;
|
|
1497
|
+
}
|
|
1498
|
+
} else if (URI_SAFE_ATTRIBUTES[lcName]) ;
|
|
1499
|
+
else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, ""))) ;
|
|
1500
|
+
else if ((lcName === "src" || lcName === "xlink:href" || lcName === "href") && lcTag !== "script" && stringIndexOf(value, "data:") === 0 && DATA_URI_TAGS[lcTag]) ;
|
|
1501
|
+
else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, ""))) ;
|
|
1502
|
+
else if (value) {
|
|
1503
|
+
return false;
|
|
1504
|
+
} else ;
|
|
1505
|
+
return true;
|
|
1506
|
+
};
|
|
1507
|
+
const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, ["annotation-xml", "color-profile", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "missing-glyph"]);
|
|
1508
|
+
const _isBasicCustomElement = function _isBasicCustomElement2(tagName) {
|
|
1509
|
+
return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT$1, tagName);
|
|
1510
|
+
};
|
|
1511
|
+
const _applyTrustedTypesToAttribute = function _applyTrustedTypesToAttribute2(lcTag, lcName, namespaceURI, value) {
|
|
1512
|
+
if (trustedTypesPolicy && typeof trustedTypes === "object" && typeof trustedTypes.getAttributeType === "function" && !namespaceURI) {
|
|
1513
|
+
switch (trustedTypes.getAttributeType(lcTag, lcName)) {
|
|
1514
|
+
case "TrustedHTML": {
|
|
1515
|
+
return _createTrustedHTML(value);
|
|
1516
|
+
}
|
|
1517
|
+
case "TrustedScriptURL": {
|
|
1518
|
+
return _createTrustedScriptURL(value);
|
|
1519
|
+
}
|
|
1520
|
+
}
|
|
1521
|
+
}
|
|
1522
|
+
return value;
|
|
1523
|
+
};
|
|
1524
|
+
const _setAttributeValue = function _setAttributeValue2(currentNode, name, namespaceURI, value) {
|
|
1525
|
+
try {
|
|
1526
|
+
if (namespaceURI) {
|
|
1527
|
+
currentNode.setAttributeNS(namespaceURI, name, value);
|
|
1528
|
+
} else {
|
|
1529
|
+
currentNode.setAttribute(name, value);
|
|
1530
|
+
}
|
|
1531
|
+
if (_isClobbered(currentNode)) {
|
|
1532
|
+
_forceRemove(currentNode);
|
|
1533
|
+
} else {
|
|
1534
|
+
arrayPop(DOMPurify.removed);
|
|
1535
|
+
}
|
|
1536
|
+
} catch (_) {
|
|
1537
|
+
_removeAttribute(name, currentNode);
|
|
1538
|
+
}
|
|
1539
|
+
};
|
|
1540
|
+
const _sanitizeAttributes = function _sanitizeAttributes2(currentNode) {
|
|
1541
|
+
_executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);
|
|
1542
|
+
const attributes = currentNode.attributes;
|
|
1543
|
+
if (!attributes || _isClobbered(currentNode)) {
|
|
1544
|
+
return;
|
|
1545
|
+
}
|
|
1546
|
+
const hookEvent = {
|
|
1547
|
+
attrName: "",
|
|
1548
|
+
attrValue: "",
|
|
1549
|
+
keepAttr: true,
|
|
1550
|
+
allowedAttributes: ALLOWED_ATTR,
|
|
1551
|
+
forceKeepAttr: void 0
|
|
1552
|
+
};
|
|
1553
|
+
let l = attributes.length;
|
|
1554
|
+
const lcTag = transformCaseFunc(currentNode.nodeName);
|
|
1555
|
+
while (l--) {
|
|
1556
|
+
const attr = attributes[l];
|
|
1557
|
+
const name = attr.name, namespaceURI = attr.namespaceURI, attrValue = attr.value;
|
|
1558
|
+
const lcName = transformCaseFunc(name);
|
|
1559
|
+
const initValue = attrValue;
|
|
1560
|
+
let value = name === "value" ? initValue : stringTrim(initValue);
|
|
1561
|
+
hookEvent.attrName = lcName;
|
|
1562
|
+
hookEvent.attrValue = value;
|
|
1563
|
+
hookEvent.keepAttr = true;
|
|
1564
|
+
hookEvent.forceKeepAttr = void 0;
|
|
1565
|
+
_executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);
|
|
1566
|
+
value = hookEvent.attrValue;
|
|
1567
|
+
if (SANITIZE_NAMED_PROPS && (lcName === "id" || lcName === "name") && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {
|
|
1568
|
+
_removeAttribute(name, currentNode);
|
|
1569
|
+
value = SANITIZE_NAMED_PROPS_PREFIX + value;
|
|
1570
|
+
}
|
|
1571
|
+
if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {
|
|
1572
|
+
_removeAttribute(name, currentNode);
|
|
1573
|
+
continue;
|
|
1574
|
+
}
|
|
1575
|
+
if (lcName === "attributename" && stringMatch(value, "href")) {
|
|
1576
|
+
_removeAttribute(name, currentNode);
|
|
1577
|
+
continue;
|
|
1578
|
+
}
|
|
1579
|
+
if (hookEvent.forceKeepAttr) {
|
|
1580
|
+
continue;
|
|
1581
|
+
}
|
|
1582
|
+
if (!hookEvent.keepAttr) {
|
|
1583
|
+
_removeAttribute(name, currentNode);
|
|
1584
|
+
continue;
|
|
1585
|
+
}
|
|
1586
|
+
if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(SELF_CLOSING_TAG, value)) {
|
|
1587
|
+
_removeAttribute(name, currentNode);
|
|
1588
|
+
continue;
|
|
1589
|
+
}
|
|
1590
|
+
if (SAFE_FOR_TEMPLATES) {
|
|
1591
|
+
value = _stripTemplateExpressions(value);
|
|
1592
|
+
}
|
|
1593
|
+
if (!_isValidAttribute(lcTag, lcName, value)) {
|
|
1594
|
+
_removeAttribute(name, currentNode);
|
|
1595
|
+
continue;
|
|
1596
|
+
}
|
|
1597
|
+
value = _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value);
|
|
1598
|
+
if (value !== initValue) {
|
|
1599
|
+
_setAttributeValue(currentNode, name, namespaceURI, value);
|
|
1600
|
+
}
|
|
1601
|
+
}
|
|
1602
|
+
_executeHooks(hooks.afterSanitizeAttributes, currentNode, null);
|
|
1603
|
+
};
|
|
1604
|
+
const _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {
|
|
1605
|
+
let shadowNode = null;
|
|
1606
|
+
const shadowIterator = _createNodeIterator(fragment);
|
|
1607
|
+
_executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);
|
|
1608
|
+
while (shadowNode = shadowIterator.nextNode()) {
|
|
1609
|
+
_executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);
|
|
1610
|
+
_sanitizeElements(shadowNode);
|
|
1611
|
+
_sanitizeAttributes(shadowNode);
|
|
1612
|
+
if (_isDocumentFragment(shadowNode.content)) {
|
|
1613
|
+
_sanitizeShadowDOM2(shadowNode.content);
|
|
1614
|
+
}
|
|
1615
|
+
const shadowNodeType = getNodeType ? getNodeType(shadowNode) : shadowNode.nodeType;
|
|
1616
|
+
if (shadowNodeType === NODE_TYPE.element) {
|
|
1617
|
+
const innerSr = getShadowRoot(shadowNode);
|
|
1618
|
+
if (_isDocumentFragment(innerSr)) {
|
|
1619
|
+
_sanitizeAttachedShadowRoots(innerSr);
|
|
1620
|
+
_sanitizeShadowDOM2(innerSr);
|
|
1621
|
+
}
|
|
1622
|
+
}
|
|
1623
|
+
}
|
|
1624
|
+
_executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);
|
|
1625
|
+
};
|
|
1626
|
+
const _sanitizeAttachedShadowRoots = function _sanitizeAttachedShadowRoots2(root) {
|
|
1627
|
+
const stack = [{
|
|
1628
|
+
node: root,
|
|
1629
|
+
shadow: null
|
|
1630
|
+
}];
|
|
1631
|
+
while (stack.length > 0) {
|
|
1632
|
+
const item = stack.pop();
|
|
1633
|
+
if (item.shadow) {
|
|
1634
|
+
_sanitizeShadowDOM2(item.shadow);
|
|
1635
|
+
continue;
|
|
1636
|
+
}
|
|
1637
|
+
const node = item.node;
|
|
1638
|
+
const nodeType = getNodeType ? getNodeType(node) : node.nodeType;
|
|
1639
|
+
const isElement = nodeType === NODE_TYPE.element;
|
|
1640
|
+
const childNodes = getChildNodes(node);
|
|
1641
|
+
if (childNodes) {
|
|
1642
|
+
for (let i = childNodes.length - 1; i >= 0; --i) {
|
|
1643
|
+
stack.push({
|
|
1644
|
+
node: childNodes[i],
|
|
1645
|
+
shadow: null
|
|
1646
|
+
});
|
|
1647
|
+
}
|
|
1648
|
+
}
|
|
1649
|
+
if (isElement) {
|
|
1650
|
+
const rootName = getNodeName ? getNodeName(node) : null;
|
|
1651
|
+
if (typeof rootName === "string" && transformCaseFunc(rootName) === "template") {
|
|
1652
|
+
const content = node.content;
|
|
1653
|
+
if (_isDocumentFragment(content)) {
|
|
1654
|
+
stack.push({
|
|
1655
|
+
node: content,
|
|
1656
|
+
shadow: null
|
|
1657
|
+
});
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
}
|
|
1661
|
+
if (isElement) {
|
|
1662
|
+
const sr = getShadowRoot(node);
|
|
1663
|
+
if (_isDocumentFragment(sr)) {
|
|
1664
|
+
stack.push({
|
|
1665
|
+
node: null,
|
|
1666
|
+
shadow: sr
|
|
1667
|
+
}, {
|
|
1668
|
+
node: sr,
|
|
1669
|
+
shadow: null
|
|
1670
|
+
});
|
|
1671
|
+
}
|
|
1672
|
+
}
|
|
1673
|
+
}
|
|
1674
|
+
};
|
|
1675
|
+
DOMPurify.sanitize = function(dirty) {
|
|
1676
|
+
let cfg = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
1677
|
+
let body = null;
|
|
1678
|
+
let importedNode = null;
|
|
1679
|
+
let currentNode = null;
|
|
1680
|
+
let returnNode = null;
|
|
1681
|
+
IS_EMPTY_INPUT = !dirty;
|
|
1682
|
+
if (IS_EMPTY_INPUT) {
|
|
1683
|
+
dirty = "<!-->";
|
|
1684
|
+
}
|
|
1685
|
+
if (typeof dirty !== "string" && !_isNode(dirty)) {
|
|
1686
|
+
dirty = stringifyValue(dirty);
|
|
1687
|
+
if (typeof dirty !== "string") {
|
|
1688
|
+
throw typeErrorCreate("dirty is not a string, aborting");
|
|
1689
|
+
}
|
|
1690
|
+
}
|
|
1691
|
+
if (!DOMPurify.isSupported) {
|
|
1692
|
+
return dirty;
|
|
1693
|
+
}
|
|
1694
|
+
if (SET_CONFIG) {
|
|
1695
|
+
ALLOWED_TAGS = SET_CONFIG_ALLOWED_TAGS;
|
|
1696
|
+
ALLOWED_ATTR = SET_CONFIG_ALLOWED_ATTR;
|
|
1697
|
+
} else {
|
|
1698
|
+
_parseConfig(cfg);
|
|
1699
|
+
}
|
|
1700
|
+
if (hooks.uponSanitizeElement.length > 0 || hooks.uponSanitizeAttribute.length > 0) {
|
|
1701
|
+
ALLOWED_TAGS = clone(ALLOWED_TAGS);
|
|
1702
|
+
}
|
|
1703
|
+
if (hooks.uponSanitizeAttribute.length > 0) {
|
|
1704
|
+
ALLOWED_ATTR = clone(ALLOWED_ATTR);
|
|
1705
|
+
}
|
|
1706
|
+
DOMPurify.removed = [];
|
|
1707
|
+
const inPlace = IN_PLACE && typeof dirty !== "string" && _isNode(dirty);
|
|
1708
|
+
if (inPlace) {
|
|
1709
|
+
const nn = getNodeName ? getNodeName(dirty) : dirty.nodeName;
|
|
1710
|
+
if (typeof nn === "string") {
|
|
1711
|
+
const tagName = transformCaseFunc(nn);
|
|
1712
|
+
if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
|
|
1713
|
+
throw typeErrorCreate("root node is forbidden and cannot be sanitized in-place");
|
|
1714
|
+
}
|
|
1715
|
+
}
|
|
1716
|
+
if (_isClobbered(dirty)) {
|
|
1717
|
+
throw typeErrorCreate("root node is clobbered and cannot be sanitized in-place");
|
|
1718
|
+
}
|
|
1719
|
+
try {
|
|
1720
|
+
_sanitizeAttachedShadowRoots(dirty);
|
|
1721
|
+
} catch (error) {
|
|
1722
|
+
_neutralizeRoot(dirty);
|
|
1723
|
+
throw error;
|
|
1724
|
+
}
|
|
1725
|
+
} else if (_isNode(dirty)) {
|
|
1726
|
+
body = _initDocument("<!---->");
|
|
1727
|
+
importedNode = body.ownerDocument.importNode(dirty, true);
|
|
1728
|
+
if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === "BODY") {
|
|
1729
|
+
body = importedNode;
|
|
1730
|
+
} else if (importedNode.nodeName === "HTML") {
|
|
1731
|
+
body = importedNode;
|
|
1732
|
+
} else {
|
|
1733
|
+
body.appendChild(importedNode);
|
|
1734
|
+
}
|
|
1735
|
+
_sanitizeAttachedShadowRoots(importedNode);
|
|
1736
|
+
} else {
|
|
1737
|
+
if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && // eslint-disable-next-line unicorn/prefer-includes
|
|
1738
|
+
dirty.indexOf("<") === -1) {
|
|
1739
|
+
return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(dirty) : dirty;
|
|
1740
|
+
}
|
|
1741
|
+
body = _initDocument(dirty);
|
|
1742
|
+
if (!body) {
|
|
1743
|
+
return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : "";
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1746
|
+
if (body && FORCE_BODY) {
|
|
1747
|
+
_forceRemove(body.firstChild);
|
|
1748
|
+
}
|
|
1749
|
+
const nodeIterator = _createNodeIterator(inPlace ? dirty : body);
|
|
1750
|
+
try {
|
|
1751
|
+
while (currentNode = nodeIterator.nextNode()) {
|
|
1752
|
+
_sanitizeElements(currentNode);
|
|
1753
|
+
_sanitizeAttributes(currentNode);
|
|
1754
|
+
if (_isDocumentFragment(currentNode.content)) {
|
|
1755
|
+
_sanitizeShadowDOM2(currentNode.content);
|
|
1756
|
+
}
|
|
1757
|
+
}
|
|
1758
|
+
} catch (error) {
|
|
1759
|
+
if (inPlace) {
|
|
1760
|
+
_neutralizeRoot(dirty);
|
|
1761
|
+
}
|
|
1762
|
+
throw error;
|
|
1763
|
+
}
|
|
1764
|
+
if (inPlace) {
|
|
1765
|
+
arrayForEach(DOMPurify.removed, (entry) => {
|
|
1766
|
+
if (entry.element) {
|
|
1767
|
+
_neutralizeSubtree(entry.element);
|
|
1768
|
+
}
|
|
1769
|
+
});
|
|
1770
|
+
if (SAFE_FOR_TEMPLATES) {
|
|
1771
|
+
_scrubTemplateExpressions2(dirty);
|
|
1772
|
+
}
|
|
1773
|
+
return dirty;
|
|
1774
|
+
}
|
|
1775
|
+
if (RETURN_DOM) {
|
|
1776
|
+
if (SAFE_FOR_TEMPLATES) {
|
|
1777
|
+
_scrubTemplateExpressions2(body);
|
|
1778
|
+
}
|
|
1779
|
+
if (RETURN_DOM_FRAGMENT) {
|
|
1780
|
+
returnNode = createDocumentFragment.call(body.ownerDocument);
|
|
1781
|
+
while (body.firstChild) {
|
|
1782
|
+
returnNode.appendChild(body.firstChild);
|
|
1783
|
+
}
|
|
1784
|
+
} else {
|
|
1785
|
+
returnNode = body;
|
|
1786
|
+
}
|
|
1787
|
+
if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {
|
|
1788
|
+
returnNode = importNode.call(originalDocument, returnNode, true);
|
|
1789
|
+
}
|
|
1790
|
+
return returnNode;
|
|
1791
|
+
}
|
|
1792
|
+
let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
|
|
1793
|
+
if (WHOLE_DOCUMENT && ALLOWED_TAGS["!doctype"] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {
|
|
1794
|
+
serializedHTML = "<!DOCTYPE " + body.ownerDocument.doctype.name + ">\n" + serializedHTML;
|
|
1795
|
+
}
|
|
1796
|
+
if (SAFE_FOR_TEMPLATES) {
|
|
1797
|
+
serializedHTML = _stripTemplateExpressions(serializedHTML);
|
|
1798
|
+
}
|
|
1799
|
+
return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(serializedHTML) : serializedHTML;
|
|
1800
|
+
};
|
|
1801
|
+
DOMPurify.setConfig = function() {
|
|
1802
|
+
let cfg = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
1803
|
+
_parseConfig(cfg);
|
|
1804
|
+
SET_CONFIG = true;
|
|
1805
|
+
SET_CONFIG_ALLOWED_TAGS = ALLOWED_TAGS;
|
|
1806
|
+
SET_CONFIG_ALLOWED_ATTR = ALLOWED_ATTR;
|
|
1807
|
+
};
|
|
1808
|
+
DOMPurify.clearConfig = function() {
|
|
1809
|
+
CONFIG = null;
|
|
1810
|
+
SET_CONFIG = false;
|
|
1811
|
+
SET_CONFIG_ALLOWED_TAGS = null;
|
|
1812
|
+
SET_CONFIG_ALLOWED_ATTR = null;
|
|
1813
|
+
trustedTypesPolicy = defaultTrustedTypesPolicy;
|
|
1814
|
+
emptyHTML = "";
|
|
1815
|
+
};
|
|
1816
|
+
DOMPurify.isValidAttribute = function(tag, attr, value) {
|
|
1817
|
+
if (!CONFIG) {
|
|
1818
|
+
_parseConfig({});
|
|
1819
|
+
}
|
|
1820
|
+
const lcTag = transformCaseFunc(tag);
|
|
1821
|
+
const lcName = transformCaseFunc(attr);
|
|
1822
|
+
return _isValidAttribute(lcTag, lcName, value);
|
|
1823
|
+
};
|
|
1824
|
+
DOMPurify.addHook = function(entryPoint, hookFunction) {
|
|
1825
|
+
if (typeof hookFunction !== "function") {
|
|
1826
|
+
return;
|
|
1827
|
+
}
|
|
1828
|
+
if (!objectHasOwnProperty(hooks, entryPoint)) {
|
|
1829
|
+
return;
|
|
1830
|
+
}
|
|
1831
|
+
arrayPush(hooks[entryPoint], hookFunction);
|
|
1832
|
+
};
|
|
1833
|
+
DOMPurify.removeHook = function(entryPoint, hookFunction) {
|
|
1834
|
+
if (!objectHasOwnProperty(hooks, entryPoint)) {
|
|
1835
|
+
return void 0;
|
|
1836
|
+
}
|
|
1837
|
+
if (hookFunction !== void 0) {
|
|
1838
|
+
const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);
|
|
1839
|
+
return index === -1 ? void 0 : arraySplice(hooks[entryPoint], index, 1)[0];
|
|
1840
|
+
}
|
|
1841
|
+
return arrayPop(hooks[entryPoint]);
|
|
1842
|
+
};
|
|
1843
|
+
DOMPurify.removeHooks = function(entryPoint) {
|
|
1844
|
+
if (!objectHasOwnProperty(hooks, entryPoint)) {
|
|
1845
|
+
return;
|
|
1846
|
+
}
|
|
1847
|
+
hooks[entryPoint] = [];
|
|
1848
|
+
};
|
|
1849
|
+
DOMPurify.removeAllHooks = function() {
|
|
1850
|
+
hooks = _createHooksMap();
|
|
1851
|
+
};
|
|
1852
|
+
return DOMPurify;
|
|
1853
|
+
}
|
|
1854
|
+
var purify = createDOMPurify();
|
|
1855
|
+
function sanitizeUrl(url, fallback = "") {
|
|
1856
|
+
if (url == null) return fallback;
|
|
1857
|
+
const trimmed = String(url).trim();
|
|
1858
|
+
if (trimmed === "") return fallback;
|
|
1859
|
+
let cleaned = "";
|
|
1860
|
+
for (const ch of trimmed) {
|
|
1861
|
+
const code = ch.charCodeAt(0);
|
|
1862
|
+
if (code > 31 && code !== 127) cleaned += ch;
|
|
1863
|
+
}
|
|
1864
|
+
if (cleaned === "") return fallback;
|
|
1865
|
+
if (/^(\/\/?|\.\.?\/|#|\?)/.test(cleaned)) return cleaned;
|
|
1866
|
+
const schemeMatch = cleaned.match(/^([a-z][a-z0-9+.-]*):/i);
|
|
1867
|
+
if (schemeMatch) {
|
|
1868
|
+
const scheme = schemeMatch[1].toLowerCase();
|
|
1869
|
+
return scheme === "http" || scheme === "https" ? cleaned : fallback;
|
|
1870
|
+
}
|
|
1871
|
+
return cleaned;
|
|
1872
|
+
}
|
|
1873
|
+
const ANNOTATION_ALLOWED_TAGS = [
|
|
1874
|
+
"b",
|
|
1875
|
+
"i",
|
|
1876
|
+
"u",
|
|
1877
|
+
"em",
|
|
1878
|
+
"strong",
|
|
1879
|
+
"a",
|
|
1880
|
+
"br",
|
|
1881
|
+
"p",
|
|
1882
|
+
"ul",
|
|
1883
|
+
"ol",
|
|
1884
|
+
"li",
|
|
1885
|
+
"img",
|
|
1886
|
+
"span"
|
|
1887
|
+
];
|
|
1888
|
+
const ANNOTATION_ALLOWED_ATTR = ["href", "target", "src", "alt", "class"];
|
|
1889
|
+
function sanitizeAnnotationHtml(html2) {
|
|
1890
|
+
return purify.sanitize(html2, {
|
|
1891
|
+
ALLOWED_TAGS: ANNOTATION_ALLOWED_TAGS,
|
|
1892
|
+
ALLOWED_ATTR: ANNOTATION_ALLOWED_ATTR,
|
|
1893
|
+
ALLOW_DATA_ATTR: false
|
|
1894
|
+
});
|
|
1895
|
+
}
|
|
1896
|
+
const ANNOTATION_DISTANCE = 200;
|
|
1897
|
+
const SPRITE_SCALE = 12;
|
|
1898
|
+
const CANVAS_SIZE = 128;
|
|
1899
|
+
const ICON_MAP = {
|
|
1900
|
+
info: "ℹ",
|
|
1901
|
+
pin: "📍",
|
|
1902
|
+
star: "⭐",
|
|
1903
|
+
custom: "●"
|
|
1904
|
+
};
|
|
1905
|
+
class AnnotationSprite {
|
|
1906
|
+
static create(data) {
|
|
1907
|
+
const canvas = document.createElement("canvas");
|
|
1908
|
+
canvas.width = CANVAS_SIZE;
|
|
1909
|
+
canvas.height = CANVAS_SIZE;
|
|
1910
|
+
const ctx = canvas.getContext("2d");
|
|
1911
|
+
const cx = CANVAS_SIZE / 2;
|
|
1912
|
+
const cy = CANVAS_SIZE / 2;
|
|
1913
|
+
const radius = CANVAS_SIZE / 2 - 8;
|
|
1914
|
+
ctx.fillStyle = "rgba(75, 0, 130, 0.85)";
|
|
1915
|
+
ctx.beginPath();
|
|
1916
|
+
ctx.arc(cx, cy, radius, 0, Math.PI * 2);
|
|
1917
|
+
ctx.fill();
|
|
1918
|
+
ctx.strokeStyle = "rgba(255, 255, 255, 0.6)";
|
|
1919
|
+
ctx.lineWidth = 3;
|
|
1920
|
+
ctx.stroke();
|
|
1921
|
+
const iconKey = data.icon ?? "info";
|
|
1922
|
+
const icon = ICON_MAP[iconKey] ?? ICON_MAP.info;
|
|
1923
|
+
ctx.fillStyle = "#ffffff";
|
|
1924
|
+
ctx.font = "48px sans-serif";
|
|
1925
|
+
ctx.textAlign = "center";
|
|
1926
|
+
ctx.textBaseline = "middle";
|
|
1927
|
+
ctx.fillText(icon, cx, cy);
|
|
1928
|
+
const texture = new CanvasTexture(canvas);
|
|
1929
|
+
texture.minFilter = LinearFilter;
|
|
1930
|
+
texture.magFilter = LinearFilter;
|
|
1931
|
+
const material = new SpriteMaterial({
|
|
1932
|
+
map: texture,
|
|
1933
|
+
sizeAttenuation: true,
|
|
1934
|
+
depthTest: false
|
|
1935
|
+
});
|
|
1936
|
+
const sprite = new Sprite(material);
|
|
1937
|
+
const { phi, theta } = latLonToSpherical(data.lat, data.lon);
|
|
1938
|
+
sprite.position.set(
|
|
1939
|
+
ANNOTATION_DISTANCE * Math.sin(phi) * Math.cos(theta),
|
|
1940
|
+
ANNOTATION_DISTANCE * Math.cos(phi),
|
|
1941
|
+
ANNOTATION_DISTANCE * Math.sin(phi) * Math.sin(theta)
|
|
1942
|
+
);
|
|
1943
|
+
sprite.scale.set(SPRITE_SCALE, SPRITE_SCALE, 1);
|
|
1944
|
+
sprite.userData.annotationData = data;
|
|
1945
|
+
return sprite;
|
|
1946
|
+
}
|
|
1947
|
+
}
|
|
1948
|
+
class AnnotationPopup {
|
|
1949
|
+
container;
|
|
1950
|
+
titleEl;
|
|
1951
|
+
bodyEl;
|
|
1952
|
+
closeBtn;
|
|
1953
|
+
isOpen = false;
|
|
1954
|
+
constructor(shadowRoot) {
|
|
1955
|
+
this.container = document.createElement("div");
|
|
1956
|
+
this.container.style.cssText = [
|
|
1957
|
+
"position: absolute",
|
|
1958
|
+
"z-index: 1000",
|
|
1959
|
+
"max-width: 320px",
|
|
1960
|
+
"min-width: 200px",
|
|
1961
|
+
"background: rgba(20, 20, 30, 0.85)",
|
|
1962
|
+
"backdrop-filter: blur(12px)",
|
|
1963
|
+
"-webkit-backdrop-filter: blur(12px)",
|
|
1964
|
+
"border: 1px solid rgba(255, 255, 255, 0.15)",
|
|
1965
|
+
"border-radius: 12px",
|
|
1966
|
+
"padding: 0",
|
|
1967
|
+
"color: #fff",
|
|
1968
|
+
"font-family: system-ui, -apple-system, sans-serif",
|
|
1969
|
+
"font-size: 14px",
|
|
1970
|
+
"box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4)",
|
|
1971
|
+
"display: none",
|
|
1972
|
+
"pointer-events: auto",
|
|
1973
|
+
"overflow: hidden"
|
|
1974
|
+
].join(";");
|
|
1975
|
+
const header = document.createElement("div");
|
|
1976
|
+
header.style.cssText = [
|
|
1977
|
+
"display: flex",
|
|
1978
|
+
"align-items: center",
|
|
1979
|
+
"justify-content: space-between",
|
|
1980
|
+
"padding: 10px 14px",
|
|
1981
|
+
"background: rgba(75, 0, 130, 0.5)",
|
|
1982
|
+
"border-bottom: 1px solid rgba(255, 255, 255, 0.1)"
|
|
1983
|
+
].join(";");
|
|
1984
|
+
this.titleEl = document.createElement("h4");
|
|
1985
|
+
this.titleEl.style.cssText = [
|
|
1986
|
+
"margin: 0",
|
|
1987
|
+
"font-size: 15px",
|
|
1988
|
+
"font-weight: 600",
|
|
1989
|
+
"line-height: 1.3",
|
|
1990
|
+
"flex: 1"
|
|
1991
|
+
].join(";");
|
|
1992
|
+
this.closeBtn = document.createElement("button");
|
|
1993
|
+
this.closeBtn.textContent = "✕";
|
|
1994
|
+
this.closeBtn.style.cssText = [
|
|
1995
|
+
"background: none",
|
|
1996
|
+
"border: none",
|
|
1997
|
+
"color: rgba(255, 255, 255, 0.7)",
|
|
1998
|
+
"font-size: 16px",
|
|
1999
|
+
"cursor: pointer",
|
|
2000
|
+
"padding: 2px 6px",
|
|
2001
|
+
"margin-left: 8px",
|
|
2002
|
+
"border-radius: 4px",
|
|
2003
|
+
"line-height: 1"
|
|
2004
|
+
].join(";");
|
|
2005
|
+
this.closeBtn.addEventListener("click", (e) => {
|
|
2006
|
+
e.stopPropagation();
|
|
2007
|
+
this.hide();
|
|
2008
|
+
});
|
|
2009
|
+
header.appendChild(this.titleEl);
|
|
2010
|
+
header.appendChild(this.closeBtn);
|
|
2011
|
+
this.bodyEl = document.createElement("div");
|
|
2012
|
+
this.bodyEl.style.cssText = [
|
|
2013
|
+
"padding: 12px 14px",
|
|
2014
|
+
"line-height: 1.5",
|
|
2015
|
+
"max-height: 240px",
|
|
2016
|
+
"overflow-y: auto"
|
|
2017
|
+
].join(";");
|
|
2018
|
+
this.container.appendChild(header);
|
|
2019
|
+
this.container.appendChild(this.bodyEl);
|
|
2020
|
+
shadowRoot.appendChild(this.container);
|
|
2021
|
+
}
|
|
2022
|
+
/** Show the popup with annotation data near the given screen coordinates */
|
|
2023
|
+
show(data, screenX, screenY) {
|
|
2024
|
+
this.titleEl.textContent = data.title;
|
|
2025
|
+
this.bodyEl.innerHTML = sanitizeAnnotationHtml(data.htmlContent ?? "");
|
|
2026
|
+
this.container.style.display = "block";
|
|
2027
|
+
this.isOpen = true;
|
|
2028
|
+
requestAnimationFrame(() => {
|
|
2029
|
+
const parent = this.container.parentElement ?? this.container.offsetParent;
|
|
2030
|
+
if (!parent) return;
|
|
2031
|
+
const parentRect = parent.getBoundingClientRect();
|
|
2032
|
+
const popupRect = this.container.getBoundingClientRect();
|
|
2033
|
+
let left = screenX - parentRect.left + 12;
|
|
2034
|
+
let top = screenY - parentRect.top + 12;
|
|
2035
|
+
const maxLeft = parentRect.width - popupRect.width - 8;
|
|
2036
|
+
const maxTop = parentRect.height - popupRect.height - 8;
|
|
2037
|
+
if (left > maxLeft) left = screenX - parentRect.left - popupRect.width - 12;
|
|
2038
|
+
if (top > maxTop) top = screenY - parentRect.top - popupRect.height - 12;
|
|
2039
|
+
left = Math.max(8, left);
|
|
2040
|
+
top = Math.max(8, top);
|
|
2041
|
+
this.container.style.left = `${left}px`;
|
|
2042
|
+
this.container.style.top = `${top}px`;
|
|
2043
|
+
});
|
|
2044
|
+
}
|
|
2045
|
+
/** Hide the popup */
|
|
2046
|
+
hide() {
|
|
2047
|
+
this.container.style.display = "none";
|
|
2048
|
+
this.isOpen = false;
|
|
2049
|
+
}
|
|
2050
|
+
/** Remove the popup element from the DOM */
|
|
2051
|
+
dispose() {
|
|
2052
|
+
this.container.remove();
|
|
2053
|
+
}
|
|
2054
|
+
}
|
|
2055
|
+
class AnnotationManager {
|
|
2056
|
+
scene;
|
|
2057
|
+
camera;
|
|
2058
|
+
domElement;
|
|
2059
|
+
sprites = [];
|
|
2060
|
+
popup;
|
|
2061
|
+
raycaster = new Raycaster();
|
|
2062
|
+
pointer = new Vector2();
|
|
2063
|
+
frustum = new Frustum();
|
|
2064
|
+
projScreenMatrix = new Matrix4();
|
|
2065
|
+
boundOnClick;
|
|
2066
|
+
constructor(scene, camera, domElement, shadowRoot) {
|
|
2067
|
+
this.scene = scene;
|
|
2068
|
+
this.camera = camera;
|
|
2069
|
+
this.domElement = domElement;
|
|
2070
|
+
this.popup = new AnnotationPopup(shadowRoot);
|
|
2071
|
+
this.boundOnClick = (e) => this.onClick(e);
|
|
2072
|
+
this.domElement.addEventListener("click", this.boundOnClick);
|
|
2073
|
+
}
|
|
2074
|
+
/** Set annotations from <vz-annotation> child elements */
|
|
2075
|
+
setAnnotations(annotations) {
|
|
2076
|
+
this.clear();
|
|
2077
|
+
for (const data of annotations) {
|
|
2078
|
+
const sprite = AnnotationSprite.create(data);
|
|
2079
|
+
this.sprites.push({ data, sprite });
|
|
2080
|
+
this.scene.add(sprite);
|
|
2081
|
+
}
|
|
2082
|
+
}
|
|
2083
|
+
/** Called each frame with current video time. Toggle sprite visibility based on time windows + frustum culling. */
|
|
2084
|
+
update(currentTime) {
|
|
2085
|
+
this.projScreenMatrix.multiplyMatrices(
|
|
2086
|
+
this.camera.projectionMatrix,
|
|
2087
|
+
this.camera.matrixWorldInverse
|
|
2088
|
+
);
|
|
2089
|
+
this.frustum.setFromProjectionMatrix(this.projScreenMatrix);
|
|
2090
|
+
for (const { data, sprite } of this.sprites) {
|
|
2091
|
+
const start = data.timeStart ?? 0;
|
|
2092
|
+
const end = data.timeEnd ?? Infinity;
|
|
2093
|
+
const inTimeRange = currentTime >= start && currentTime <= end;
|
|
2094
|
+
sprite.visible = inTimeRange && this.frustum.containsPoint(sprite.position);
|
|
2095
|
+
}
|
|
2096
|
+
}
|
|
2097
|
+
/** Handle click: raycast against visible sprites, open popup if hit */
|
|
2098
|
+
onClick(event) {
|
|
2099
|
+
const rect = this.domElement.getBoundingClientRect();
|
|
2100
|
+
this.pointer.x = (event.clientX - rect.left) / rect.width * 2 - 1;
|
|
2101
|
+
this.pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
|
|
2102
|
+
this.raycaster.setFromCamera(this.pointer, this.camera);
|
|
2103
|
+
const visibleSprites = this.sprites.filter(({ sprite }) => sprite.visible).map(({ sprite }) => sprite);
|
|
2104
|
+
const intersects = this.raycaster.intersectObjects(visibleSprites);
|
|
2105
|
+
if (intersects.length > 0) {
|
|
2106
|
+
const hit = intersects[0].object;
|
|
2107
|
+
const annotationData = hit.userData.annotationData;
|
|
2108
|
+
if (annotationData) {
|
|
2109
|
+
event.stopPropagation();
|
|
2110
|
+
this.popup.show(annotationData, event.clientX, event.clientY);
|
|
2111
|
+
}
|
|
2112
|
+
}
|
|
2113
|
+
}
|
|
2114
|
+
/** Remove all annotation sprites from scene and dispose resources */
|
|
2115
|
+
clear() {
|
|
2116
|
+
for (const { sprite } of this.sprites) {
|
|
2117
|
+
this.scene.remove(sprite);
|
|
2118
|
+
sprite.material.map?.dispose();
|
|
2119
|
+
sprite.material.dispose();
|
|
2120
|
+
}
|
|
2121
|
+
this.sprites = [];
|
|
2122
|
+
this.popup.hide();
|
|
2123
|
+
}
|
|
2124
|
+
/** Full cleanup: clear sprites, remove event listeners, dispose popup */
|
|
2125
|
+
dispose() {
|
|
2126
|
+
this.clear();
|
|
2127
|
+
this.domElement.removeEventListener("click", this.boundOnClick);
|
|
2128
|
+
this.popup.dispose();
|
|
2129
|
+
}
|
|
2130
|
+
}
|
|
2131
|
+
export {
|
|
2132
|
+
AnnotationManager as A,
|
|
2133
|
+
COLLAB_GAZE_LERP_FACTOR as C,
|
|
2134
|
+
DEFAULT_CONFIG as D,
|
|
2135
|
+
GAZE_SAMPLE_INTERVAL as G,
|
|
2136
|
+
MEDIA_EVENTS as M,
|
|
2137
|
+
SPHERE_DEFAULTS as S,
|
|
2138
|
+
VOLUME_STEP as V,
|
|
2139
|
+
COLLAB_GAZE_INTERVAL as a,
|
|
2140
|
+
COLLAB_GAZE_THRESHOLD as b,
|
|
2141
|
+
AnnotationPopup as c,
|
|
2142
|
+
AnnotationSprite as d,
|
|
2143
|
+
parseFormat as e,
|
|
2144
|
+
CAMERA_DEFAULTS as f,
|
|
2145
|
+
getFeaturesForTier as g,
|
|
2146
|
+
clamp as h,
|
|
2147
|
+
degToRad as i,
|
|
2148
|
+
getFormatMeta as j,
|
|
2149
|
+
SEEK_STEP as k,
|
|
2150
|
+
latLonToSpherical as l,
|
|
2151
|
+
ANALYTICS_BATCH_INTERVAL as m,
|
|
2152
|
+
normalizeAngle as n,
|
|
2153
|
+
GAZE_BATCH_INTERVAL as o,
|
|
2154
|
+
purify as p,
|
|
2155
|
+
sanitizeAnnotationHtml as q,
|
|
2156
|
+
sanitizeUrl as s
|
|
2157
|
+
};
|
|
2158
|
+
//# sourceMappingURL=annotations-C0ugfCn4.js.map
|