maplibre-gl 2.0.3 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/build/rollup_plugins.js +1 -0
  2. package/dist/maplibre-gl-dev.js +54589 -0
  3. package/dist/maplibre-gl.css +1 -1
  4. package/dist/maplibre-gl.d.ts +49 -15
  5. package/dist/maplibre-gl.js +3 -3
  6. package/dist/maplibre-gl.js.map +1 -1
  7. package/dist/package.json +1 -0
  8. package/package.json +78 -100
  9. package/src/css/maplibre-gl.css +36 -36
  10. package/src/data/bucket/symbol_bucket.test.ts +1 -1
  11. package/src/data/bucket/symbol_bucket.ts +3 -3
  12. package/src/data/program_configuration.ts +1 -1
  13. package/src/render/draw_debug.ts +1 -1
  14. package/src/render/glyph_manager.ts +1 -1
  15. package/src/render/painter.ts +5 -3
  16. package/src/render/program/circle_program.ts +1 -1
  17. package/src/render/program/line_program.ts +3 -3
  18. package/src/render/program/symbol_program.ts +1 -1
  19. package/src/source/geojson_source.test.ts +2 -1
  20. package/src/source/geojson_source.ts +1 -1
  21. package/src/source/image_source.test.ts +153 -0
  22. package/src/source/raster_dem_tile_source.test.ts +2 -1
  23. package/src/source/raster_dem_tile_source.ts +1 -1
  24. package/src/source/raster_tile_source.test.ts +2 -1
  25. package/src/source/raster_tile_source.ts +1 -1
  26. package/src/source/source_cache.test.ts +1 -1
  27. package/src/source/tile.test.ts +1 -1
  28. package/src/source/tile_cache.test.ts +6 -4
  29. package/src/source/tile_id.test.ts +10 -12
  30. package/src/source/tile_id.ts +2 -2
  31. package/src/source/vector_tile_source.test.ts +14 -2
  32. package/src/source/vector_tile_source.ts +3 -4
  33. package/src/style/load_glyph_range.test.ts +0 -2
  34. package/src/style/load_sprite.ts +2 -1
  35. package/src/style/properties.ts +1 -1
  36. package/src/style/style.test.ts +24 -13
  37. package/src/style/style.ts +1 -1
  38. package/src/style/style_layer/custom_style_layer.ts +2 -2
  39. package/src/style/style_layer/fill_extrusion_style_layer.ts +1 -1
  40. package/src/style/style_layer/symbol_style_layer.ts +19 -0
  41. package/src/style/style_layer/symbol_style_layer_properties.ts +6 -0
  42. package/src/style-spec/CHANGELOG.md +6 -0
  43. package/src/style-spec/package.json +1 -1
  44. package/src/style-spec/reference/v8.json +68 -2
  45. package/src/style-spec/types.ts +2 -0
  46. package/src/symbol/collision_index.ts +19 -19
  47. package/src/symbol/grid_index.test.ts +42 -19
  48. package/src/symbol/grid_index.ts +62 -33
  49. package/src/symbol/placement.ts +82 -53
  50. package/src/symbol/symbol_style_layer.test.ts +48 -1
  51. package/src/ui/camera.test.ts +4 -4
  52. package/src/ui/camera.ts +8 -0
  53. package/src/ui/control/logo_control.test.ts +1 -0
  54. package/src/ui/handler/scroll_zoom.test.ts +2 -1
  55. package/src/ui/map.test.ts +77 -10
  56. package/src/ui/map.ts +33 -8
  57. package/src/util/ajax.test.ts +206 -0
  58. package/src/util/test/util.ts +14 -0
@@ -0,0 +1,206 @@
1
+ import {
2
+ getArrayBuffer,
3
+ getJSON,
4
+ postData,
5
+ getImage,
6
+ resetImageRequestQueue
7
+ } from './ajax';
8
+ import config from './config';
9
+ import webpSupported from './webp_supported';
10
+ import {fakeServer, SinonFakeServer} from 'sinon';
11
+ import {stubAjaxGetImage} from './test/util';
12
+
13
+ describe('ajax', () => {
14
+ let server: SinonFakeServer;
15
+ beforeEach(() => {
16
+ global.fetch = null;
17
+ server = fakeServer.create();
18
+ });
19
+ afterEach(() => {
20
+ server.restore();
21
+ });
22
+
23
+ test('getArrayBuffer, 404', done => {
24
+ server.respondWith(request => {
25
+ request.respond(404, undefined, undefined);
26
+ });
27
+ getArrayBuffer({url:''}, (error) => {
28
+ expect((error as any).status).toBe(404);
29
+ done();
30
+ });
31
+ server.respond();
32
+ });
33
+
34
+ test('getJSON', done => {
35
+ server.respondWith(request => {
36
+ request.respond(200, {'Content-Type': 'application/json'}, '{"foo": "bar"}');
37
+ });
38
+ getJSON({url:''}, (error, body) => {
39
+ expect(error).toBeFalsy();
40
+ expect(body).toEqual({foo: 'bar'});
41
+ done();
42
+ });
43
+ server.respond();
44
+ });
45
+
46
+ test('getJSON, invalid syntax', done => {
47
+ server.respondWith(request => {
48
+ request.respond(200, {'Content-Type': 'application/json'}, 'how do i even');
49
+ });
50
+ getJSON({url:''}, (error) => {
51
+ expect(error).toBeTruthy();
52
+ done();
53
+ });
54
+ server.respond();
55
+ });
56
+
57
+ test('getJSON, 404', done => {
58
+ server.respondWith(request => {
59
+ request.respond(404, undefined, undefined);
60
+ });
61
+ getJSON({url:''}, (error) => {
62
+ expect((error as any).status).toBe(404);
63
+ done();
64
+ });
65
+ server.respond();
66
+ });
67
+
68
+ test('getJSON, 401: non-Mapbox domain', done => {
69
+ server.respondWith(request => {
70
+ request.respond(401, undefined, undefined);
71
+ });
72
+ getJSON({url:''}, (error) => {
73
+ expect((error as any).status).toBe(401);
74
+ expect(error.message).toBe('Unauthorized');
75
+ done();
76
+ });
77
+ server.respond();
78
+ });
79
+
80
+ test('postData, 204(no content): no error', done => {
81
+ server.respondWith(request => {
82
+ request.respond(204, undefined, undefined);
83
+ });
84
+ postData({url:'api.mapbox.com'}, (error) => {
85
+ expect(error).toBeNull();
86
+ done();
87
+ });
88
+ server.respond();
89
+ });
90
+
91
+ test('getImage respects maxParallelImageRequests', done => {
92
+ server.respondWith(request => request.respond(200, {'Content-Type': 'image/png'}, ''));
93
+
94
+ const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
95
+
96
+ function callback(err) {
97
+ if (err) return;
98
+ // last request is only added after we got a response from one of the previous ones
99
+ expect(server.requests).toHaveLength(maxRequests + 1);
100
+ done();
101
+ }
102
+
103
+ for (let i = 0; i < maxRequests + 1; i++) {
104
+ getImage({url: ''}, callback);
105
+ }
106
+ expect(server.requests).toHaveLength(maxRequests);
107
+
108
+ server.requests[0].respond(undefined, undefined, undefined);
109
+ });
110
+
111
+ test('getImage cancelling frees up request for maxParallelImageRequests', done => {
112
+ resetImageRequestQueue();
113
+
114
+ server.respondWith(request => request.respond(200, {'Content-Type': 'image/png'}, ''));
115
+
116
+ const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
117
+
118
+ for (let i = 0; i < maxRequests + 1; i++) {
119
+ getImage({url: ''}, () => done('test failed: getImage callback was called')).cancel();
120
+ }
121
+ expect(server.requests).toHaveLength(maxRequests + 1);
122
+ done();
123
+ });
124
+
125
+ test('getImage requests that were once queued are still abortable', done => {
126
+ resetImageRequestQueue();
127
+
128
+ const maxRequests = config.MAX_PARALLEL_IMAGE_REQUESTS;
129
+
130
+ const requests = [];
131
+ for (let i = 0; i < maxRequests; i++) {
132
+ requests.push(getImage({url: ''}, () => {}));
133
+ }
134
+
135
+ // the limit of allowed requests is reached
136
+ expect(server.requests).toHaveLength(maxRequests);
137
+
138
+ const queuedURL = 'this-is-the-queued-request';
139
+ const queued = getImage({url: queuedURL}, () => done('test failed: getImage callback was called'));
140
+
141
+ // the new requests is queued because the limit is reached
142
+ expect(server.requests).toHaveLength(maxRequests);
143
+
144
+ // cancel the first request to let the queued request start
145
+ requests[0].cancel();
146
+ expect(server.requests).toHaveLength(maxRequests + 1);
147
+
148
+ // abort the previously queued request and confirm that it is aborted
149
+ const queuedRequest = server.requests[server.requests.length - 1];
150
+ expect(queuedRequest.url).toBe(queuedURL);
151
+ expect((queuedRequest as any).aborted).toBeUndefined();
152
+ queued.cancel();
153
+ expect((queuedRequest as any).aborted).toBe(true);
154
+
155
+ done();
156
+ });
157
+
158
+ test('getImage sends accept/webp when supported', done => {
159
+ resetImageRequestQueue();
160
+
161
+ server.respondWith((request) => {
162
+ expect(request.requestHeaders.accept.includes('image/webp')).toBeTruthy();
163
+ request.respond(200, {'Content-Type': 'image/webp'}, '');
164
+ });
165
+
166
+ // mock webp support
167
+ webpSupported.supported = true;
168
+
169
+ getImage({url: ''}, () => { done(); });
170
+
171
+ server.respond();
172
+ });
173
+
174
+ test('getImage uses ImageBitmap when supported', done => {
175
+ resetImageRequestQueue();
176
+
177
+ server.respondWith(request => request.respond(200, {'Content-Type': 'image/png'}, ''));
178
+
179
+ stubAjaxGetImage(() => Promise.resolve(new ImageBitmap()));
180
+
181
+ getImage({url: ''}, (err, img) => {
182
+ if (err) done(err);
183
+ expect(img).toBeInstanceOf(ImageBitmap);
184
+ done();
185
+ });
186
+
187
+ server.respond();
188
+ });
189
+
190
+ test('getImage uses HTMLImageElement when ImageBitmap is not supported', done => {
191
+ resetImageRequestQueue();
192
+
193
+ server.respondWith(request => request.respond(200, {'Content-Type': 'image/png'}, ''));
194
+
195
+ stubAjaxGetImage(undefined);
196
+
197
+ getImage({url: ''}, (err, img) => {
198
+ if (err) done(`get image failed with error ${err.message}`);
199
+ expect(img).toBeInstanceOf(HTMLImageElement);
200
+ done();
201
+ });
202
+
203
+ server.respond();
204
+ });
205
+
206
+ });
@@ -99,3 +99,17 @@ export function getMockDispatcher() {
99
99
 
100
100
  return mockDispatcher;
101
101
  }
102
+
103
+ export function stubAjaxGetImage(createImageBitmap) {
104
+ global.createImageBitmap = createImageBitmap;
105
+
106
+ global.URL.revokeObjectURL = () => {};
107
+ global.URL.createObjectURL = (_) => { return null; };
108
+
109
+ // eslint-disable-next-line accessor-pairs
110
+ Object.defineProperty(global.Image.prototype, 'src', {
111
+ set(_) {
112
+ this.onload();
113
+ }
114
+ });
115
+ }