@scoova/mgl 1.0.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.txt +116 -0
- package/README.md +174 -0
- package/build/banner.ts +12 -0
- package/build/bump-version-changelog.js +26 -0
- package/build/check-bundle-size.js +77 -0
- package/build/generate-dist-package.js +26 -0
- package/build/generate-doc-images.ts +78 -0
- package/build/generate-docs.ts +190 -0
- package/build/generate-shaders.ts +68 -0
- package/build/generate-struct-arrays.ts +438 -0
- package/build/generate-style-code.ts +283 -0
- package/build/readme.md +56 -0
- package/build/release-notes.js +45 -0
- package/build/rollup/bundle_prelude.js +29 -0
- package/build/rollup/maplibregl.js +22 -0
- package/build/rollup_plugins.ts +58 -0
- package/dist/LICENSE.txt +116 -0
- package/dist/maplibre-gl.css +1 -0
- package/dist/maplibre-gl.d.ts +13304 -0
- package/dist/maplibre-gl.js +59 -0
- package/dist/maplibre-gl.js.map +1 -0
- package/dist/package.json +1 -0
- package/package.json +192 -0
- package/src/css/maplibre-gl.css +854 -0
- package/src/css/svg/maplibregl-ctrl-attrib.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-compass.svg +4 -0
- package/src/css/svg/maplibregl-ctrl-fullscreen.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-geolocate.svg +5 -0
- package/src/css/svg/maplibregl-ctrl-logo.svg +11 -0
- package/src/css/svg/maplibregl-ctrl-shrink.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-terrain.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-zoom-in.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-zoom-out.svg +3 -0
- package/src/data/array_types.g.ts +1130 -0
- package/src/data/bucket/circle_attributes.ts +8 -0
- package/src/data/bucket/circle_bucket.ts +197 -0
- package/src/data/bucket/fill_attributes.ts +8 -0
- package/src/data/bucket/fill_bucket.test.ts +95 -0
- package/src/data/bucket/fill_bucket.ts +228 -0
- package/src/data/bucket/fill_extrusion_attributes.ts +13 -0
- package/src/data/bucket/fill_extrusion_bucket.ts +305 -0
- package/src/data/bucket/heatmap_bucket.ts +12 -0
- package/src/data/bucket/line_attributes.ts +8 -0
- package/src/data/bucket/line_attributes_ext.ts +8 -0
- package/src/data/bucket/line_bucket.test.ts +142 -0
- package/src/data/bucket/line_bucket.ts +592 -0
- package/src/data/bucket/pattern_attributes.ts +9 -0
- package/src/data/bucket/pattern_bucket_features.ts +57 -0
- package/src/data/bucket/symbol_attributes.ts +122 -0
- package/src/data/bucket/symbol_bucket.test.ts +243 -0
- package/src/data/bucket/symbol_bucket.ts +975 -0
- package/src/data/bucket.ts +123 -0
- package/src/data/dem_data.test.ts +237 -0
- package/src/data/dem_data.ts +171 -0
- package/src/data/evaluation_feature.ts +18 -0
- package/src/data/extent.ts +13 -0
- package/src/data/feature_index.ts +337 -0
- package/src/data/feature_position_map.test.ts +33 -0
- package/src/data/feature_position_map.ts +126 -0
- package/src/data/index_array_type.ts +9 -0
- package/src/data/load_geometry.test.ts +49 -0
- package/src/data/load_geometry.ts +44 -0
- package/src/data/pos3d_attributes.ts +5 -0
- package/src/data/pos_attributes.ts +5 -0
- package/src/data/program_configuration.ts +735 -0
- package/src/data/raster_bounds_attributes.ts +6 -0
- package/src/data/segment.ts +89 -0
- package/src/geo/edge_insets.test.ts +83 -0
- package/src/geo/edge_insets.ts +146 -0
- package/src/geo/lng_lat.test.ts +65 -0
- package/src/geo/lng_lat.ts +169 -0
- package/src/geo/lng_lat_bounds.test.ts +357 -0
- package/src/geo/lng_lat_bounds.ts +356 -0
- package/src/geo/mercator_coordinate.test.ts +34 -0
- package/src/geo/mercator_coordinate.ts +157 -0
- package/src/geo/projection/projection.ts +72 -0
- package/src/geo/transform.test.ts +509 -0
- package/src/geo/transform.ts +1072 -0
- package/src/gl/color_mode.ts +31 -0
- package/src/gl/context.ts +321 -0
- package/src/gl/cull_face_mode.ts +22 -0
- package/src/gl/depth_mode.ts +26 -0
- package/src/gl/framebuffer.ts +48 -0
- package/src/gl/index_buffer.ts +55 -0
- package/src/gl/render_pool.test.ts +69 -0
- package/src/gl/render_pool.ts +93 -0
- package/src/gl/state.test.ts +125 -0
- package/src/gl/stencil_mode.ts +27 -0
- package/src/gl/types.ts +59 -0
- package/src/gl/value.ts +534 -0
- package/src/gl/vertex_buffer.test.ts +57 -0
- package/src/gl/vertex_buffer.ts +111 -0
- package/src/gl/webgl2.ts +12 -0
- package/src/index.test.ts +121 -0
- package/src/index.ts +250 -0
- package/src/render/draw_background.ts +53 -0
- package/src/render/draw_circle.ts +113 -0
- package/src/render/draw_collision_debug.ts +168 -0
- package/src/render/draw_custom.test.ts +73 -0
- package/src/render/draw_custom.ts +45 -0
- package/src/render/draw_debug.test.ts +122 -0
- package/src/render/draw_debug.ts +148 -0
- package/src/render/draw_fill.test.ts +137 -0
- package/src/render/draw_fill.ts +128 -0
- package/src/render/draw_fill_extrusion.ts +97 -0
- package/src/render/draw_heatmap.ts +228 -0
- package/src/render/draw_hillshade.ts +119 -0
- package/src/render/draw_line.ts +125 -0
- package/src/render/draw_raster.ts +133 -0
- package/src/render/draw_sky.ts +44 -0
- package/src/render/draw_symbol.test.ts +223 -0
- package/src/render/draw_symbol.ts +499 -0
- package/src/render/draw_terrain.ts +99 -0
- package/src/render/glyph_atlas.ts +83 -0
- package/src/render/glyph_manager.test.ts +147 -0
- package/src/render/glyph_manager.ts +198 -0
- package/src/render/image_atlas.ts +159 -0
- package/src/render/image_manager.ts +337 -0
- package/src/render/line_atlas.test.ts +38 -0
- package/src/render/line_atlas.ts +214 -0
- package/src/render/mesh.ts +25 -0
- package/src/render/painter.test.ts +51 -0
- package/src/render/painter.ts +666 -0
- package/src/render/program/background_program.ts +100 -0
- package/src/render/program/circle_program.ts +61 -0
- package/src/render/program/clipping_mask_program.ts +19 -0
- package/src/render/program/collision_program.ts +47 -0
- package/src/render/program/debug_program.ts +29 -0
- package/src/render/program/fill_extrusion_program.ts +120 -0
- package/src/render/program/fill_program.ts +121 -0
- package/src/render/program/heatmap_program.ts +76 -0
- package/src/render/program/hillshade_program.ts +116 -0
- package/src/render/program/line_program.ts +207 -0
- package/src/render/program/pattern.ts +102 -0
- package/src/render/program/program_uniforms.ts +46 -0
- package/src/render/program/raster_program.ts +88 -0
- package/src/render/program/sky_program.ts +28 -0
- package/src/render/program/symbol_program.ts +266 -0
- package/src/render/program/terrain_program.ts +116 -0
- package/src/render/program.ts +233 -0
- package/src/render/render_to_texture.test.ts +151 -0
- package/src/render/render_to_texture.ts +197 -0
- package/src/render/terrain.test.ts +322 -0
- package/src/render/terrain.ts +464 -0
- package/src/render/texture.ts +114 -0
- package/src/render/uniform_binding.test.ts +122 -0
- package/src/render/uniform_binding.ts +157 -0
- package/src/render/update_pattern_positions_in_program.test.ts +74 -0
- package/src/render/update_pattern_positions_in_program.ts +50 -0
- package/src/render/vertex_array_object.ts +163 -0
- package/src/shaders/README.md +42 -0
- package/src/shaders/_prelude.fragment.glsl +19 -0
- package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
- package/src/shaders/_prelude.vertex.glsl +148 -0
- package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
- package/src/shaders/background.fragment.glsl +10 -0
- package/src/shaders/background.fragment.glsl.g.ts +2 -0
- package/src/shaders/background.vertex.glsl +7 -0
- package/src/shaders/background.vertex.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.fragment.glsl +28 -0
- package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.vertex.glsl +19 -0
- package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/circle.fragment.glsl +34 -0
- package/src/shaders/circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/circle.vertex.glsl +68 -0
- package/src/shaders/circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.fragment.glsl +3 -0
- package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.vertex.glsl +7 -0
- package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_box.fragment.glsl +20 -0
- package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_box.vertex.glsl +27 -0
- package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.fragment.glsl +17 -0
- package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.vertex.glsl +59 -0
- package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/debug.fragment.glsl +9 -0
- package/src/shaders/debug.fragment.glsl.g.ts +2 -0
- package/src/shaders/debug.vertex.glsl +12 -0
- package/src/shaders/debug.vertex.glsl.g.ts +2 -0
- package/src/shaders/encode_attribute.test.ts +11 -0
- package/src/shaders/encode_attribute.ts +13 -0
- package/src/shaders/fill.fragment.glsl +13 -0
- package/src/shaders/fill.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill.vertex.glsl +13 -0
- package/src/shaders/fill.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.fragment.glsl +9 -0
- package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.vertex.glsl +84 -0
- package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl +47 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl +96 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.fragment.glsl +17 -0
- package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.vertex.glsl +17 -0
- package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.fragment.glsl +39 -0
- package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.vertex.glsl +39 -0
- package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap.fragment.glsl +22 -0
- package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap.vertex.glsl +54 -0
- package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.fragment.glsl +15 -0
- package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.vertex.glsl +11 -0
- package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade.fragment.glsl +52 -0
- package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade.vertex.glsl +11 -0
- package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.fragment.glsl +77 -0
- package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
- package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
- package/src/shaders/line.fragment.glsl +30 -0
- package/src/shaders/line.fragment.glsl.g.ts +2 -0
- package/src/shaders/line.vertex.glsl +89 -0
- package/src/shaders/line.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.fragment.glsl +34 -0
- package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.vertex.glsl +92 -0
- package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.fragment.glsl +77 -0
- package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.vertex.glsl +103 -0
- package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.fragment.glsl +45 -0
- package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.vertex.glsl +101 -0
- package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/raster.fragment.glsl +53 -0
- package/src/shaders/raster.fragment.glsl.g.ts +2 -0
- package/src/shaders/raster.vertex.glsl +21 -0
- package/src/shaders/raster.vertex.glsl.g.ts +2 -0
- package/src/shaders/shaders.ts +197 -0
- package/src/shaders/sky.fragment.glsl +17 -0
- package/src/shaders/sky.fragment.glsl.g.ts +2 -0
- package/src/shaders/sky.vertex.glsl +5 -0
- package/src/shaders/sky.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_icon.fragment.glsl +17 -0
- package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_icon.vertex.glsl +117 -0
- package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.fragment.glsl +58 -0
- package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.vertex.glsl +142 -0
- package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
- package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.vertex.glsl +140 -0
- package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain.fragment.glsl +32 -0
- package/src/shaders/terrain.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain.vertex.glsl +17 -0
- package/src/shaders/terrain.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain_coords.fragment.glsl +11 -0
- package/src/shaders/terrain_coords.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain_coords.vertex.glsl +13 -0
- package/src/shaders/terrain_coords.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain_depth.fragment.glsl +15 -0
- package/src/shaders/terrain_depth.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain_depth.vertex.glsl +13 -0
- package/src/shaders/terrain_depth.vertex.glsl.g.ts +2 -0
- package/src/source/canvas_source.test.ts +210 -0
- package/src/source/canvas_source.ts +227 -0
- package/src/source/geojson_source.test.ts +492 -0
- package/src/source/geojson_source.ts +431 -0
- package/src/source/geojson_source_diff.test.ts +364 -0
- package/src/source/geojson_source_diff.ts +172 -0
- package/src/source/geojson_worker_source.test.ts +399 -0
- package/src/source/geojson_worker_source.ts +303 -0
- package/src/source/geojson_wrapper.test.ts +32 -0
- package/src/source/geojson_wrapper.ts +81 -0
- package/src/source/image_source.test.ts +235 -0
- package/src/source/image_source.ts +338 -0
- package/src/source/load_tilejson.ts +47 -0
- package/src/source/pixels_to_tile_units.ts +25 -0
- package/src/source/protocol_crud.ts +48 -0
- package/src/source/query_features.test.ts +31 -0
- package/src/source/query_features.ts +252 -0
- package/src/source/raster_dem_tile_source.test.ts +158 -0
- package/src/source/raster_dem_tile_source.ts +166 -0
- package/src/source/raster_dem_tile_worker_source.test.ts +36 -0
- package/src/source/raster_dem_tile_worker_source.ts +38 -0
- package/src/source/raster_tile_source.test.ts +206 -0
- package/src/source/raster_tile_source.ts +227 -0
- package/src/source/rtl_text_plugin_main_thread.test.ts +170 -0
- package/src/source/rtl_text_plugin_main_thread.ts +89 -0
- package/src/source/rtl_text_plugin_status.ts +33 -0
- package/src/source/rtl_text_plugin_worker.ts +49 -0
- package/src/source/source.test.ts +41 -0
- package/src/source/source.ts +186 -0
- package/src/source/source_cache.test.ts +2069 -0
- package/src/source/source_cache.ts +1102 -0
- package/src/source/source_state.ts +157 -0
- package/src/source/terrain_source_cache.test.ts +105 -0
- package/src/source/terrain_source_cache.ts +204 -0
- package/src/source/tile.test.ts +290 -0
- package/src/source/tile.ts +478 -0
- package/src/source/tile_bounds.ts +34 -0
- package/src/source/tile_cache.test.ts +130 -0
- package/src/source/tile_cache.ts +208 -0
- package/src/source/tile_id.test.ts +112 -0
- package/src/source/tile_id.ts +221 -0
- package/src/source/vector_tile_source.test.ts +401 -0
- package/src/source/vector_tile_source.ts +283 -0
- package/src/source/vector_tile_worker_source.test.ts +396 -0
- package/src/source/vector_tile_worker_source.ts +199 -0
- package/src/source/video_source.test.ts +124 -0
- package/src/source/video_source.ts +204 -0
- package/src/source/worker.test.ts +233 -0
- package/src/source/worker.ts +301 -0
- package/src/source/worker_source.ts +117 -0
- package/src/source/worker_tile.test.ts +226 -0
- package/src/source/worker_tile.ts +208 -0
- package/src/style/create_style_layer.ts +39 -0
- package/src/style/evaluation_parameters.ts +62 -0
- package/src/style/format_section_override.test.ts +62 -0
- package/src/style/format_section_override.ts +50 -0
- package/src/style/light.test.ts +86 -0
- package/src/style/light.ts +135 -0
- package/src/style/load_glyph_range.test.ts +40 -0
- package/src/style/load_glyph_range.ts +32 -0
- package/src/style/load_sprite.test.ts +227 -0
- package/src/style/load_sprite.ts +71 -0
- package/src/style/parse_glyph_pbf.ts +42 -0
- package/src/style/pauseable_placement.ts +138 -0
- package/src/style/properties.ts +726 -0
- package/src/style/query_utils.test.ts +107 -0
- package/src/style/query_utils.ts +70 -0
- package/src/style/sky.ts +127 -0
- package/src/style/style.test.ts +2654 -0
- package/src/style/style.ts +1814 -0
- package/src/style/style_glyph.ts +25 -0
- package/src/style/style_image.ts +188 -0
- package/src/style/style_layer/background_style_layer.ts +17 -0
- package/src/style/style_layer/background_style_layer_properties.g.ts +40 -0
- package/src/style/style_layer/circle_style_layer.ts +98 -0
- package/src/style/style_layer/circle_style_layer_properties.g.ts +76 -0
- package/src/style/style_layer/custom_style_layer.ts +233 -0
- package/src/style/style_layer/fill_extrusion_style_layer.ts +224 -0
- package/src/style/style_layer/fill_extrusion_style_layer_properties.g.ts +55 -0
- package/src/style/style_layer/fill_style_layer.test.ts +37 -0
- package/src/style/style_layer/fill_style_layer.ts +65 -0
- package/src/style/style_layer/fill_style_layer_properties.g.ts +64 -0
- package/src/style/style_layer/heatmap_style_layer.ts +74 -0
- package/src/style/style_layer/heatmap_style_layer_properties.g.ts +46 -0
- package/src/style/style_layer/hillshade_style_layer.ts +21 -0
- package/src/style/style_layer/hillshade_style_layer_properties.g.ts +49 -0
- package/src/style/style_layer/line_style_layer.test.ts +50 -0
- package/src/style/style_layer/line_style_layer.ts +131 -0
- package/src/style/style_layer/line_style_layer_properties.g.ts +88 -0
- package/src/style/style_layer/overlap_mode.test.ts +57 -0
- package/src/style/style_layer/overlap_mode.ts +25 -0
- package/src/style/style_layer/raster_style_layer.ts +17 -0
- package/src/style/style_layer/raster_style_layer_properties.g.ts +55 -0
- package/src/style/style_layer/symbol_style_layer.ts +195 -0
- package/src/style/style_layer/symbol_style_layer_properties.g.ts +218 -0
- package/src/style/style_layer/typed_style_layer.ts +9 -0
- package/src/style/style_layer/variable_text_anchor.test.ts +117 -0
- package/src/style/style_layer/variable_text_anchor.ts +163 -0
- package/src/style/style_layer.test.ts +372 -0
- package/src/style/style_layer.ts +287 -0
- package/src/style/style_layer_index.test.ts +99 -0
- package/src/style/style_layer_index.ts +78 -0
- package/src/style/validate_style.ts +53 -0
- package/src/style/zoom_history.ts +40 -0
- package/src/symbol/anchor.test.ts +14 -0
- package/src/symbol/anchor.ts +22 -0
- package/src/symbol/check_max_angle.test.ts +54 -0
- package/src/symbol/check_max_angle.ts +76 -0
- package/src/symbol/clip_line.test.ts +154 -0
- package/src/symbol/clip_line.ts +66 -0
- package/src/symbol/collision_feature.test.ts +98 -0
- package/src/symbol/collision_feature.ts +114 -0
- package/src/symbol/collision_index.test.ts +19 -0
- package/src/symbol/collision_index.ts +618 -0
- package/src/symbol/cross_tile_symbol_index.test.ts +260 -0
- package/src/symbol/cross_tile_symbol_index.ts +367 -0
- package/src/symbol/get_anchors.test.ts +113 -0
- package/src/symbol/get_anchors.ts +167 -0
- package/src/symbol/grid_index.test.ts +75 -0
- package/src/symbol/grid_index.ts +414 -0
- package/src/symbol/merge_lines.test.ts +30 -0
- package/src/symbol/merge_lines.ts +80 -0
- package/src/symbol/one_em.ts +3 -0
- package/src/symbol/opacity_state.ts +23 -0
- package/src/symbol/path_interpolator.test.ts +134 -0
- package/src/symbol/path_interpolator.ts +55 -0
- package/src/symbol/placement.ts +1371 -0
- package/src/symbol/projection.test.ts +171 -0
- package/src/symbol/projection.ts +833 -0
- package/src/symbol/quads.test.ts +157 -0
- package/src/symbol/quads.ts +349 -0
- package/src/symbol/shaping.test.ts +360 -0
- package/src/symbol/shaping.ts +911 -0
- package/src/symbol/symbol_layout.ts +739 -0
- package/src/symbol/symbol_size.ts +129 -0
- package/src/symbol/symbol_style_layer.test.ts +103 -0
- package/src/symbol/transform_text.ts +27 -0
- package/src/ui/anchor.ts +27 -0
- package/src/ui/camera.test.ts +2301 -0
- package/src/ui/camera.ts +1520 -0
- package/src/ui/control/attribution_control.test.ts +543 -0
- package/src/ui/control/attribution_control.ts +209 -0
- package/src/ui/control/control.ts +67 -0
- package/src/ui/control/fullscreen_control.test.ts +114 -0
- package/src/ui/control/fullscreen_control.ts +189 -0
- package/src/ui/control/geolocate_control.test.ts +619 -0
- package/src/ui/control/geolocate_control.ts +725 -0
- package/src/ui/control/logo_control.test.ts +88 -0
- package/src/ui/control/logo_control.ts +86 -0
- package/src/ui/control/navigation_control.test.ts +238 -0
- package/src/ui/control/navigation_control.ts +294 -0
- package/src/ui/control/scale_control.test.ts +52 -0
- package/src/ui/control/scale_control.ts +152 -0
- package/src/ui/control/terrain_control.test.ts +58 -0
- package/src/ui/control/terrain_control.ts +74 -0
- package/src/ui/default_locale.ts +25 -0
- package/src/ui/events.ts +758 -0
- package/src/ui/handler/box_zoom.test.ts +163 -0
- package/src/ui/handler/box_zoom.ts +171 -0
- package/src/ui/handler/click_zoom.ts +55 -0
- package/src/ui/handler/cooperative_gestures.test.ts +338 -0
- package/src/ui/handler/cooperative_gestures.ts +111 -0
- package/src/ui/handler/dblclick_zoom.test.ts +151 -0
- package/src/ui/handler/drag_handler.ts +174 -0
- package/src/ui/handler/drag_move_state_manager.ts +115 -0
- package/src/ui/handler/drag_pan.test.ts +487 -0
- package/src/ui/handler/drag_rotate.test.ts +859 -0
- package/src/ui/handler/handler_util.ts +10 -0
- package/src/ui/handler/keyboard.test.ts +235 -0
- package/src/ui/handler/keyboard.ts +212 -0
- package/src/ui/handler/map_event.test.ts +158 -0
- package/src/ui/handler/map_event.ts +161 -0
- package/src/ui/handler/mouse.ts +92 -0
- package/src/ui/handler/mouse_handler_interface.test.ts +111 -0
- package/src/ui/handler/mouse_rotate.test.ts +62 -0
- package/src/ui/handler/one_finger_touch_drag.ts +45 -0
- package/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts +77 -0
- package/src/ui/handler/scroll_zoom.test.ts +382 -0
- package/src/ui/handler/scroll_zoom.ts +379 -0
- package/src/ui/handler/shim/dblclick_zoom.ts +64 -0
- package/src/ui/handler/shim/drag_pan.ts +104 -0
- package/src/ui/handler/shim/drag_rotate.ts +76 -0
- package/src/ui/handler/shim/two_fingers_touch.ts +112 -0
- package/src/ui/handler/tap_drag_zoom.test.ts +113 -0
- package/src/ui/handler/tap_drag_zoom.ts +112 -0
- package/src/ui/handler/tap_recognizer.ts +138 -0
- package/src/ui/handler/tap_zoom.ts +98 -0
- package/src/ui/handler/touch_pan.ts +115 -0
- package/src/ui/handler/transform-provider.ts +44 -0
- package/src/ui/handler/two_fingers_touch.test.ts +283 -0
- package/src/ui/handler/two_fingers_touch.ts +336 -0
- package/src/ui/handler_inertia.ts +157 -0
- package/src/ui/handler_manager.ts +637 -0
- package/src/ui/hash.test.ts +404 -0
- package/src/ui/hash.ts +153 -0
- package/src/ui/map.ts +3393 -0
- package/src/ui/map_tests/map_animation.test.ts +61 -0
- package/src/ui/map_tests/map_basic.test.ts +223 -0
- package/src/ui/map_tests/map_bounds.test.ts +123 -0
- package/src/ui/map_tests/map_calculate_camera_options.test.ts +113 -0
- package/src/ui/map_tests/map_canvas.test.ts +59 -0
- package/src/ui/map_tests/map_control.test.ts +61 -0
- package/src/ui/map_tests/map_disable_handlers.test.ts +38 -0
- package/src/ui/map_tests/map_events.test.ts +1001 -0
- package/src/ui/map_tests/map_feature_state.test.ts +421 -0
- package/src/ui/map_tests/map_images.test.ts +175 -0
- package/src/ui/map_tests/map_is_moving.test.ts +164 -0
- package/src/ui/map_tests/map_is_rotating.test.ts +62 -0
- package/src/ui/map_tests/map_is_zooming.test.ts +86 -0
- package/src/ui/map_tests/map_layer.test.ts +457 -0
- package/src/ui/map_tests/map_options.test.ts +64 -0
- package/src/ui/map_tests/map_pitch.test.ts +90 -0
- package/src/ui/map_tests/map_pixel_ratio.test.ts +75 -0
- package/src/ui/map_tests/map_query_rendered_features.test.ts +93 -0
- package/src/ui/map_tests/map_render.test.ts +90 -0
- package/src/ui/map_tests/map_request_render_frame.test.ts +51 -0
- package/src/ui/map_tests/map_resize.test.ts +120 -0
- package/src/ui/map_tests/map_style.test.ts +541 -0
- package/src/ui/map_tests/map_terrian.test.ts +104 -0
- package/src/ui/map_tests/map_webgl.test.ts +72 -0
- package/src/ui/map_tests/map_world_copies.test.ts +103 -0
- package/src/ui/map_tests/map_zoom.test.ts +95 -0
- package/src/ui/marker.test.ts +1149 -0
- package/src/ui/marker.ts +880 -0
- package/src/ui/popup.test.ts +827 -0
- package/src/ui/popup.ts +717 -0
- package/src/util/abort_error.ts +21 -0
- package/src/util/actor.test.ts +218 -0
- package/src/util/actor.ts +241 -0
- package/src/util/actor_messages.ts +149 -0
- package/src/util/ajax.test.ts +237 -0
- package/src/util/ajax.ts +297 -0
- package/src/util/browser.test.ts +23 -0
- package/src/util/browser.ts +63 -0
- package/src/util/color_ramp.test.ts +105 -0
- package/src/util/color_ramp.ts +56 -0
- package/src/util/config.ts +29 -0
- package/src/util/dictionary_coder.ts +23 -0
- package/src/util/dispatcher.test.ts +76 -0
- package/src/util/dispatcher.ts +78 -0
- package/src/util/dom.ts +135 -0
- package/src/util/evented.test.ts +231 -0
- package/src/util/evented.ts +178 -0
- package/src/util/find_pole_of_inaccessibility.test.ts +21 -0
- package/src/util/find_pole_of_inaccessibility.ts +130 -0
- package/src/util/geolocation_support.test.ts +43 -0
- package/src/util/geolocation_support.ts +23 -0
- package/src/util/global_worker_pool.ts +65 -0
- package/src/util/image.ts +150 -0
- package/src/util/image_request.test.ts +408 -0
- package/src/util/image_request.ts +246 -0
- package/src/util/intersection_tests.ts +206 -0
- package/src/util/is_char_in_unicode_block.test.ts +15 -0
- package/src/util/is_char_in_unicode_block.ts +345 -0
- package/src/util/offscreen_canvas_distorted.test.ts +13 -0
- package/src/util/offscreen_canvas_distorted.ts +39 -0
- package/src/util/offscreen_canvas_supported.ts +11 -0
- package/src/util/performance.ts +117 -0
- package/src/util/primitives.test.ts +140 -0
- package/src/util/primitives.ts +143 -0
- package/src/util/request_manager.ts +42 -0
- package/src/util/resolve_tokens.test.ts +45 -0
- package/src/util/resolve_tokens.ts +17 -0
- package/src/util/script_detection.test.ts +138 -0
- package/src/util/script_detection.ts +376 -0
- package/src/util/smart_wrap.test.ts +97 -0
- package/src/util/smart_wrap.ts +58 -0
- package/src/util/struct_array.test.ts +101 -0
- package/src/util/struct_array.ts +246 -0
- package/src/util/style.test.ts +34 -0
- package/src/util/style.ts +28 -0
- package/src/util/task_queue.test.ts +114 -0
- package/src/util/task_queue.ts +64 -0
- package/src/util/test/util.ts +185 -0
- package/src/util/throttle.test.ts +42 -0
- package/src/util/throttle.ts +28 -0
- package/src/util/throttled_invoker.ts +41 -0
- package/src/util/transferable_grid_index.test.ts +56 -0
- package/src/util/transferable_grid_index.ts +214 -0
- package/src/util/util.test.ts +414 -0
- package/src/util/util.ts +724 -0
- package/src/util/vectortile_to_geojson.ts +72 -0
- package/src/util/verticalize_punctuation.ts +110 -0
- package/src/util/web_worker.ts +16 -0
- package/src/util/web_worker_transfer.test.ts +153 -0
- package/src/util/web_worker_transfer.ts +254 -0
- package/src/util/webp_supported.ts +63 -0
- package/src/util/worker_pool.test.ts +43 -0
- package/src/util/worker_pool.ts +58 -0
- package/src/util/world_bounds.test.ts +59 -0
- package/src/util/world_bounds.ts +46 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import {register} from './web_worker_transfer';
|
|
2
|
+
|
|
3
|
+
export type Size = {
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
type Point2D = {
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
function createImage(image: any, {
|
|
14
|
+
width,
|
|
15
|
+
height
|
|
16
|
+
}: Size, channels: number, data?: Uint8Array | Uint8ClampedArray) {
|
|
17
|
+
if (!data) {
|
|
18
|
+
data = new Uint8Array(width * height * channels);
|
|
19
|
+
} else if (data instanceof Uint8ClampedArray) {
|
|
20
|
+
data = new Uint8Array(data.buffer);
|
|
21
|
+
} else if (data.length !== width * height * channels) {
|
|
22
|
+
throw new RangeError(`mismatched image size. expected: ${data.length} but got: ${width * height * channels}`);
|
|
23
|
+
}
|
|
24
|
+
image.width = width;
|
|
25
|
+
image.height = height;
|
|
26
|
+
image.data = data;
|
|
27
|
+
return image;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function resizeImage(image: any, {
|
|
31
|
+
width,
|
|
32
|
+
height
|
|
33
|
+
}: Size, channels: number) {
|
|
34
|
+
if (width === image.width && height === image.height) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const newImage = createImage({}, {width, height}, channels);
|
|
39
|
+
|
|
40
|
+
copyImage(image, newImage, {x: 0, y: 0}, {x: 0, y: 0}, {
|
|
41
|
+
width: Math.min(image.width, width),
|
|
42
|
+
height: Math.min(image.height, height)
|
|
43
|
+
}, channels);
|
|
44
|
+
|
|
45
|
+
image.width = width;
|
|
46
|
+
image.height = height;
|
|
47
|
+
image.data = newImage.data;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function copyImage(srcImg: any, dstImg: any, srcPt: Point2D, dstPt: Point2D, size: Size, channels: number) {
|
|
51
|
+
if (size.width === 0 || size.height === 0) {
|
|
52
|
+
return dstImg;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (size.width > srcImg.width ||
|
|
56
|
+
size.height > srcImg.height ||
|
|
57
|
+
srcPt.x > srcImg.width - size.width ||
|
|
58
|
+
srcPt.y > srcImg.height - size.height) {
|
|
59
|
+
throw new RangeError('out of range source coordinates for image copy');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (size.width > dstImg.width ||
|
|
63
|
+
size.height > dstImg.height ||
|
|
64
|
+
dstPt.x > dstImg.width - size.width ||
|
|
65
|
+
dstPt.y > dstImg.height - size.height) {
|
|
66
|
+
throw new RangeError('out of range destination coordinates for image copy');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const srcData = srcImg.data;
|
|
70
|
+
const dstData = dstImg.data;
|
|
71
|
+
|
|
72
|
+
if (srcData === dstData) throw new Error('srcData equals dstData, so image is already copied');
|
|
73
|
+
|
|
74
|
+
for (let y = 0; y < size.height; y++) {
|
|
75
|
+
const srcOffset = ((srcPt.y + y) * srcImg.width + srcPt.x) * channels;
|
|
76
|
+
const dstOffset = ((dstPt.y + y) * dstImg.width + dstPt.x) * channels;
|
|
77
|
+
for (let i = 0; i < size.width * channels; i++) {
|
|
78
|
+
dstData[dstOffset + i] = srcData[srcOffset + i];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return dstImg;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* An image with alpha color value
|
|
86
|
+
*/
|
|
87
|
+
export class AlphaImage {
|
|
88
|
+
width: number;
|
|
89
|
+
height: number;
|
|
90
|
+
data: Uint8Array;
|
|
91
|
+
|
|
92
|
+
constructor(size: Size, data?: Uint8Array | Uint8ClampedArray) {
|
|
93
|
+
createImage(this, size, 1, data);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
resize(size: Size) {
|
|
97
|
+
resizeImage(this, size, 1);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
clone() {
|
|
101
|
+
return new AlphaImage({width: this.width, height: this.height}, new Uint8Array(this.data));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
static copy(srcImg: AlphaImage, dstImg: AlphaImage, srcPt: Point2D, dstPt: Point2D, size: Size) {
|
|
105
|
+
copyImage(srcImg, dstImg, srcPt, dstPt, size, 1);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* An object to store image data not premultiplied, because ImageData is not premultiplied.
|
|
111
|
+
* UNPACK_PREMULTIPLY_ALPHA_WEBGL must be used when uploading to a texture.
|
|
112
|
+
*/
|
|
113
|
+
export class RGBAImage {
|
|
114
|
+
width: number;
|
|
115
|
+
height: number;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* data must be a Uint8Array instead of Uint8ClampedArray because texImage2D does not support Uint8ClampedArray in all browsers.
|
|
119
|
+
*/
|
|
120
|
+
data: Uint8Array;
|
|
121
|
+
|
|
122
|
+
constructor(size: Size, data?: Uint8Array | Uint8ClampedArray) {
|
|
123
|
+
createImage(this, size, 4, data);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
resize(size: Size) {
|
|
127
|
+
resizeImage(this, size, 4);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
replace(data: Uint8Array | Uint8ClampedArray, copy?: boolean) {
|
|
131
|
+
if (copy) {
|
|
132
|
+
this.data.set(data);
|
|
133
|
+
} else if (data instanceof Uint8ClampedArray) {
|
|
134
|
+
this.data = new Uint8Array(data.buffer);
|
|
135
|
+
} else {
|
|
136
|
+
this.data = data;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
clone() {
|
|
141
|
+
return new RGBAImage({width: this.width, height: this.height}, new Uint8Array(this.data));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
static copy(srcImg: RGBAImage | ImageData, dstImg: RGBAImage, srcPt: Point2D, dstPt: Point2D, size: Size) {
|
|
145
|
+
copyImage(srcImg, dstImg, srcPt, dstPt, size, 4);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
register('AlphaImage', AlphaImage);
|
|
150
|
+
register('RGBAImage', RGBAImage);
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
import {config} from './config';
|
|
2
|
+
import {webpSupported} from './webp_supported';
|
|
3
|
+
import {sleep, stubAjaxGetImage} from './test/util';
|
|
4
|
+
import {fakeServer, type FakeServer} from 'nise';
|
|
5
|
+
import {ImageRequest} from './image_request';
|
|
6
|
+
import {isAbortError} from './abort_error';
|
|
7
|
+
import * as ajax from './ajax';
|
|
8
|
+
|
|
9
|
+
describe('ImageRequest', () => {
|
|
10
|
+
let server: FakeServer;
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
global.fetch = null;
|
|
13
|
+
server = fakeServer.create();
|
|
14
|
+
ImageRequest.resetRequestQueue();
|
|
15
|
+
stubAjaxGetImage(undefined);
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
server.restore();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test('getImage respects maxParallelImageRequests', async () => {
|
|
22
|
+
server.respondWith(request => request.respond(200, {'Content-Type': 'image/png'}, ''));
|
|
23
|
+
|
|
24
|
+
const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
|
|
25
|
+
|
|
26
|
+
const promises: Promise<any>[] = [];
|
|
27
|
+
for (let i = 0; i < maxRequests + 5; i++) {
|
|
28
|
+
promises.push(ImageRequest.getImage({url: ''}, new AbortController()));
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
expect(server.requests).toHaveLength(maxRequests);
|
|
32
|
+
|
|
33
|
+
server.requests[0].respond(200);
|
|
34
|
+
await promises[0];
|
|
35
|
+
expect(server.requests).toHaveLength(maxRequests + 1);
|
|
36
|
+
server.requests[1].respond(200);
|
|
37
|
+
await promises[1];
|
|
38
|
+
expect(server.requests).toHaveLength(maxRequests + 2);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('getImage respects maxParallelImageRequests and continues to respond even when server returns 404', async () => {
|
|
42
|
+
server.respondWith(request => request.respond(404));
|
|
43
|
+
|
|
44
|
+
const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
|
|
45
|
+
|
|
46
|
+
for (let i = 0; i < maxRequests + 5; i++) {
|
|
47
|
+
ImageRequest.getImage({url: ''}, new AbortController()).catch(() => {});
|
|
48
|
+
}
|
|
49
|
+
expect(server.requests).toHaveLength(maxRequests);
|
|
50
|
+
server.respond();
|
|
51
|
+
await sleep(0);
|
|
52
|
+
expect(server.requests).toHaveLength(maxRequests + 5);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('Cancel: getImage cancelling frees up request for maxParallelImageRequests', async () => {
|
|
56
|
+
const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
|
|
57
|
+
|
|
58
|
+
for (let i = 0; i < maxRequests + 1; i++) {
|
|
59
|
+
const abortController = new AbortController();
|
|
60
|
+
ImageRequest.getImage({url: ''}, abortController).catch((e) => expect(isAbortError(e)).toBeTruthy());
|
|
61
|
+
abortController.abort();
|
|
62
|
+
await sleep(0);
|
|
63
|
+
}
|
|
64
|
+
expect(server.requests).toHaveLength(maxRequests + 1);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('Cancel: getImage requests that were once queued are still abortable', async () => {
|
|
68
|
+
const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
|
|
69
|
+
|
|
70
|
+
const abortControllers: AbortController[] = [];
|
|
71
|
+
for (let i = 0; i < maxRequests; i++) {
|
|
72
|
+
const abortController = new AbortController();
|
|
73
|
+
abortControllers.push(abortController);
|
|
74
|
+
ImageRequest.getImage({url: ''}, abortController).catch(() => {});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// the limit of allowed requests is reached
|
|
78
|
+
expect(server.requests).toHaveLength(maxRequests);
|
|
79
|
+
|
|
80
|
+
const queuedURL = 'this-is-the-queued-request';
|
|
81
|
+
const abortController = new AbortController();
|
|
82
|
+
ImageRequest.getImage({url: queuedURL}, abortController).catch((e) => expect(isAbortError(e)).toBeTruthy());
|
|
83
|
+
|
|
84
|
+
// the new requests is queued because the limit is reached
|
|
85
|
+
expect(server.requests).toHaveLength(maxRequests);
|
|
86
|
+
|
|
87
|
+
// cancel the first request to let the queued request start
|
|
88
|
+
abortControllers[0].abort();
|
|
89
|
+
await sleep(0);
|
|
90
|
+
expect(server.requests).toHaveLength(maxRequests + 1);
|
|
91
|
+
|
|
92
|
+
// abort the previously queued request and confirm that it is aborted
|
|
93
|
+
const queuedRequest = server.requests[server.requests.length - 1];
|
|
94
|
+
expect(queuedRequest.url).toBe(queuedURL);
|
|
95
|
+
expect((queuedRequest as any).aborted).toBeUndefined();
|
|
96
|
+
abortController.abort();
|
|
97
|
+
expect((queuedRequest as any).aborted).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test('getImage sends accept/webp when supported', async () => {
|
|
101
|
+
server.respondWith((request) => {
|
|
102
|
+
expect(request.requestHeaders.accept.includes('image/webp')).toBeTruthy();
|
|
103
|
+
request.respond(200, {'Content-Type': 'image/webp'}, '');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// mock webp support
|
|
107
|
+
webpSupported.supported = true;
|
|
108
|
+
|
|
109
|
+
const promise = ImageRequest.getImage({url: ''}, new AbortController());
|
|
110
|
+
|
|
111
|
+
server.respond();
|
|
112
|
+
|
|
113
|
+
await expect(promise).resolves.toBeDefined();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('getImage uses createImageBitmap when supported', async () => {
|
|
117
|
+
server.respondWith(request => request.respond(200, {'Content-Type': 'image/png',
|
|
118
|
+
'Cache-Control': 'cache',
|
|
119
|
+
'Expires': 'expires'}, ''));
|
|
120
|
+
|
|
121
|
+
stubAjaxGetImage(() => Promise.resolve(new ImageBitmap()));
|
|
122
|
+
const promise = ImageRequest.getImage({url: ''}, new AbortController());
|
|
123
|
+
server.respond();
|
|
124
|
+
|
|
125
|
+
const response = await promise;
|
|
126
|
+
|
|
127
|
+
expect(response.data).toBeInstanceOf(ImageBitmap);
|
|
128
|
+
expect(response.cacheControl).toBe('cache');
|
|
129
|
+
expect(response.expires).toBe('expires');
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test('getImage using createImageBitmap throws exception', async () => {
|
|
133
|
+
server.respondWith(request => request.respond(200, {'Content-Type': 'image/png',
|
|
134
|
+
'Cache-Control': 'cache',
|
|
135
|
+
'Expires': 'expires'}, ''));
|
|
136
|
+
|
|
137
|
+
stubAjaxGetImage(() => Promise.reject(new Error('error')));
|
|
138
|
+
|
|
139
|
+
const promise = ImageRequest.getImage({url: ''}, new AbortController());
|
|
140
|
+
|
|
141
|
+
server.respond();
|
|
142
|
+
|
|
143
|
+
await expect(promise).rejects.toThrow();
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test('getImage uses HTMLImageElement when createImageBitmap is not supported', async () => {
|
|
147
|
+
const makeRequestSky = jest.spyOn(ajax, 'makeRequest');
|
|
148
|
+
server.respondWith(request => request.respond(200, {'Content-Type': 'image/png',
|
|
149
|
+
'Cache-Control': 'cache',
|
|
150
|
+
'Expires': 'expires'}, ''));
|
|
151
|
+
|
|
152
|
+
const promise = ImageRequest.getImage({url: ''}, new AbortController());
|
|
153
|
+
|
|
154
|
+
server.respond();
|
|
155
|
+
expect(makeRequestSky).toHaveBeenCalledTimes(1);
|
|
156
|
+
makeRequestSky.mockClear();
|
|
157
|
+
const response = await promise;
|
|
158
|
+
expect(response.data).toBeInstanceOf(HTMLImageElement);
|
|
159
|
+
expect(response.cacheControl).toBe('cache');
|
|
160
|
+
expect(response.expires).toBe('expires');
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test('getImage using HTMLImageElement with same-origin credentials', async () => {
|
|
164
|
+
const makeRequestSky = jest.spyOn(ajax, 'makeRequest');
|
|
165
|
+
const promise = ImageRequest.getImage({url: '', credentials: 'same-origin'}, new AbortController(), false);
|
|
166
|
+
|
|
167
|
+
expect(makeRequestSky).toHaveBeenCalledTimes(0);
|
|
168
|
+
makeRequestSky.mockClear();
|
|
169
|
+
|
|
170
|
+
const response = await promise;
|
|
171
|
+
|
|
172
|
+
expect(response.data).toBeInstanceOf(HTMLImageElement);
|
|
173
|
+
expect((response.data as HTMLImageElement).crossOrigin).toBe('anonymous');
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test('getImage using HTMLImageElement with include credentials', async () => {
|
|
177
|
+
const makeRequestSky = jest.spyOn(ajax, 'makeRequest');
|
|
178
|
+
const promise = ImageRequest.getImage({url: '', credentials: 'include'}, new AbortController(), false);
|
|
179
|
+
|
|
180
|
+
expect(makeRequestSky).toHaveBeenCalledTimes(0);
|
|
181
|
+
makeRequestSky.mockClear();
|
|
182
|
+
|
|
183
|
+
const response = await promise;
|
|
184
|
+
|
|
185
|
+
expect(response.data).toBeInstanceOf(HTMLImageElement);
|
|
186
|
+
expect((response.data as HTMLImageElement).crossOrigin).toBe('use-credentials');
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test('getImage using HTMLImageElement with accept header', async () => {
|
|
190
|
+
const makeRequestSky = jest.spyOn(ajax, 'makeRequest');
|
|
191
|
+
const promise = ImageRequest.getImage({url: '', credentials: 'include', headers: {accept: 'accept'}}, new AbortController(), false);
|
|
192
|
+
|
|
193
|
+
expect(makeRequestSky).toHaveBeenCalledTimes(0);
|
|
194
|
+
makeRequestSky.mockClear();
|
|
195
|
+
|
|
196
|
+
const response = await promise;
|
|
197
|
+
expect(response.data).toBeInstanceOf(HTMLImageElement);
|
|
198
|
+
expect((response.data as HTMLImageElement).crossOrigin).toBe('use-credentials');
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test('getImage uses makeRequest when custom Headers are added', () => {
|
|
202
|
+
const makeRequestSky = jest.spyOn(ajax, 'makeRequest');
|
|
203
|
+
|
|
204
|
+
ImageRequest.getImage({url: '', credentials: 'include', headers: {custom: 'test', accept: 'image'}}, new AbortController(), false);
|
|
205
|
+
|
|
206
|
+
expect(makeRequestSky).toHaveBeenCalledTimes(1);
|
|
207
|
+
makeRequestSky.mockClear();
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test('getImage request returned 404 response for fetch request', async () => {
|
|
211
|
+
server.respondWith(request => request.respond(404));
|
|
212
|
+
|
|
213
|
+
const promise = ImageRequest.getImage({url: ''}, new AbortController());
|
|
214
|
+
|
|
215
|
+
server.respond();
|
|
216
|
+
|
|
217
|
+
await expect(promise).rejects.toThrow('Not Found');
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
test('getImage request failed for HTTPImageRequest', async () => {
|
|
221
|
+
const promise = ImageRequest.getImage({url: 'error'}, new AbortController(), false);
|
|
222
|
+
await expect(promise).rejects.toThrow(/Could not load image.*/);
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
test('Cancel: getImage request cancelled for HTTPImageRequest', async () => {
|
|
226
|
+
let imageUrl;
|
|
227
|
+
const requestUrl = 'test';
|
|
228
|
+
// eslint-disable-next-line accessor-pairs
|
|
229
|
+
Object.defineProperty(global.Image.prototype, 'src', {
|
|
230
|
+
set(url: string) {
|
|
231
|
+
imageUrl = url;
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
const abortController = new AbortController();
|
|
236
|
+
ImageRequest.getImage({url: requestUrl}, abortController, false).catch(() => {});
|
|
237
|
+
|
|
238
|
+
expect(imageUrl).toBe(requestUrl);
|
|
239
|
+
expect(abortController.signal.aborted).toBeFalsy();
|
|
240
|
+
abortController.abort();
|
|
241
|
+
expect(abortController.signal.aborted).toBeTruthy();
|
|
242
|
+
expect(imageUrl).toBe('');
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
test('Cancel: getImage request cancelled', async () => {
|
|
246
|
+
server.respondWith(request => request.respond(200, {'Content-Type': 'image/png',
|
|
247
|
+
'Cache-Control': 'cache',
|
|
248
|
+
'Expires': 'expires'}, ''));
|
|
249
|
+
|
|
250
|
+
const abortController = new AbortController();
|
|
251
|
+
let response = false;
|
|
252
|
+
ImageRequest.getImage({url: ''}, abortController)
|
|
253
|
+
.then(() => { response = true; })
|
|
254
|
+
.catch(() => { response = true; });
|
|
255
|
+
|
|
256
|
+
abortController.abort();
|
|
257
|
+
|
|
258
|
+
server.respond();
|
|
259
|
+
|
|
260
|
+
expect(response).toBeFalsy();
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
test('Cancel: Cancellation of an image which has not yet been requested', async () => {
|
|
264
|
+
const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
|
|
265
|
+
|
|
266
|
+
let callbackCounter = 0;
|
|
267
|
+
const promiseCallback = () => { callbackCounter++; };
|
|
268
|
+
|
|
269
|
+
const abortConstollers: {url: string; abortController: AbortController}[] = [];
|
|
270
|
+
for (let i = 0; i < maxRequests + 100; i++) {
|
|
271
|
+
const url = `${i}`;
|
|
272
|
+
const abortController = new AbortController();
|
|
273
|
+
abortConstollers.push({url, abortController});
|
|
274
|
+
ImageRequest.getImage({url}, abortController).then(promiseCallback).catch(() => {});
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
abortConstollers[0].abortController.abort();
|
|
278
|
+
await sleep(0);
|
|
279
|
+
// Queue should move forward and next request is made
|
|
280
|
+
expect(server.requests).toHaveLength(maxRequests + 1);
|
|
281
|
+
|
|
282
|
+
// Cancel request should not call callback
|
|
283
|
+
expect(callbackCounter).toBe(0);
|
|
284
|
+
|
|
285
|
+
// Cancel request which is not yet issued. It should not fire callback
|
|
286
|
+
const nextRequestInQueue = abortConstollers[server.requests.length];
|
|
287
|
+
const cancelledImageUrl = nextRequestInQueue.url;
|
|
288
|
+
nextRequestInQueue.abortController.abort();
|
|
289
|
+
|
|
290
|
+
// Queue should not move forward as cancelled image was sitting in queue
|
|
291
|
+
expect(server.requests).toHaveLength(maxRequests + 1);
|
|
292
|
+
expect(callbackCounter).toBe(0);
|
|
293
|
+
|
|
294
|
+
// On server response, next image queued should not be the cancelled image
|
|
295
|
+
server.requests[1].respond(200);
|
|
296
|
+
await sleep(0);
|
|
297
|
+
expect(callbackCounter).toBe(1);
|
|
298
|
+
expect(server.requests).toHaveLength(maxRequests + 2);
|
|
299
|
+
// Verify that the last request made skipped the cancelled image request
|
|
300
|
+
expect(server.requests[server.requests.length - 1].url).toBe((parseInt(cancelledImageUrl) + 1).toString());
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
test('throttling: one throttling client will result in throttle behavior for all', () => {
|
|
304
|
+
const maxRequestsPerFrame = config.MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME;
|
|
305
|
+
const callbackHandles = [];
|
|
306
|
+
|
|
307
|
+
// add one for each
|
|
308
|
+
callbackHandles.push(ImageRequest.addThrottleControl(() => false));
|
|
309
|
+
callbackHandles.push(ImageRequest.addThrottleControl(() => true));
|
|
310
|
+
|
|
311
|
+
let callbackCounter = 0;
|
|
312
|
+
const promiseCallback = () => { callbackCounter++; };
|
|
313
|
+
|
|
314
|
+
for (let i = 0; i < maxRequestsPerFrame + 1; i++) {
|
|
315
|
+
ImageRequest.getImage({url: ''}, new AbortController()).then(promiseCallback);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
expect(server.requests).toHaveLength(maxRequestsPerFrame);
|
|
319
|
+
|
|
320
|
+
// all pending
|
|
321
|
+
expect(callbackCounter).toBe(0);
|
|
322
|
+
|
|
323
|
+
for (const handle of callbackHandles) {
|
|
324
|
+
ImageRequest.removeThrottleControl(handle);
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
test('throttling: image queue will process MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME if throttling control returns true', () => {
|
|
329
|
+
const maxRequestsPerFrame = config.MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME;
|
|
330
|
+
const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
|
|
331
|
+
const controlId = ImageRequest.addThrottleControl(() => true);
|
|
332
|
+
|
|
333
|
+
let callbackCounter = 0;
|
|
334
|
+
const promiseCallback = () => { callbackCounter++; };
|
|
335
|
+
|
|
336
|
+
for (let i = 0; i < maxRequests; i++) {
|
|
337
|
+
ImageRequest.getImage({url: ''}, new AbortController()).then(promiseCallback);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Should only fire request to a max allowed per frame
|
|
341
|
+
expect(server.requests).toHaveLength(maxRequestsPerFrame);
|
|
342
|
+
|
|
343
|
+
// all pending
|
|
344
|
+
expect(callbackCounter).toBe(0);
|
|
345
|
+
|
|
346
|
+
ImageRequest.removeThrottleControl(controlId);
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
test('throttling: image queue will process MAX_PARALLEL_IMAGE_REQUESTS if throttling control returns false', () => {
|
|
350
|
+
const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
|
|
351
|
+
const controlId = ImageRequest.addThrottleControl(() => false);
|
|
352
|
+
|
|
353
|
+
let callbackCounter = 0;
|
|
354
|
+
const promiseCallback = () => { callbackCounter++; };
|
|
355
|
+
|
|
356
|
+
for (let i = 0; i < maxRequests + 100; i++) {
|
|
357
|
+
ImageRequest.getImage({url: ''}, new AbortController()).then(promiseCallback);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// all should be processed because throttle control is returning false
|
|
361
|
+
expect(server.requests).toHaveLength(maxRequests);
|
|
362
|
+
|
|
363
|
+
// all pending
|
|
364
|
+
expect(callbackCounter).toBe(0);
|
|
365
|
+
|
|
366
|
+
ImageRequest.removeThrottleControl(controlId);
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
test('throttling: removing throttling client will process all requests', async () => {
|
|
370
|
+
const requestParameter = {'Content-Type': 'image/png', url: ''};
|
|
371
|
+
const maxRequestsPerFrame = config.MAX_PARALLEL_IMAGE_REQUESTS_PER_FRAME;
|
|
372
|
+
|
|
373
|
+
// add 10, and one of them is throttling
|
|
374
|
+
const throttlingIndex = 5;
|
|
375
|
+
for (let i = 0; i < 10; i++) {
|
|
376
|
+
const throttlingClient: boolean = (i === throttlingIndex);
|
|
377
|
+
ImageRequest.addThrottleControl(() => throttlingClient);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// make 2 times + 1 more requests
|
|
381
|
+
const requestsMade = 2 * maxRequestsPerFrame + 1;
|
|
382
|
+
const completedMap: {[index: number]: boolean} = {};
|
|
383
|
+
for (let i = 0; i < requestsMade; i++) {
|
|
384
|
+
const promise = ImageRequest.getImage(requestParameter, new AbortController());
|
|
385
|
+
promise.catch(() => {});
|
|
386
|
+
promise.then(() => { completedMap[i] = true; });
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// up to the config value
|
|
390
|
+
expect(server.requests).toHaveLength(maxRequestsPerFrame);
|
|
391
|
+
|
|
392
|
+
const itemIndexToComplete = 6;
|
|
393
|
+
server.requests[itemIndexToComplete].respond(200);
|
|
394
|
+
|
|
395
|
+
// unleash it by removing the throttling client
|
|
396
|
+
ImageRequest.removeThrottleControl(throttlingIndex);
|
|
397
|
+
await sleep(0);
|
|
398
|
+
expect(server.requests).toHaveLength(requestsMade);
|
|
399
|
+
|
|
400
|
+
// all pending
|
|
401
|
+
expect(Object.keys(completedMap)).toHaveLength(1);
|
|
402
|
+
|
|
403
|
+
// everything should still be pending except itemIndexToComplete
|
|
404
|
+
for (let i = 0; i < maxRequestsPerFrame + 1; i++) {
|
|
405
|
+
expect(completedMap[i]).toBe(i === itemIndexToComplete ? true : undefined);
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
});
|