Skip to content

Commit b4e0f5c

Browse files
authored
[Wasm64] Better support + testing for fetch API (#19276)
1 parent 3130e06 commit b4e0f5c

File tree

4 files changed

+54
-32
lines changed

4 files changed

+54
-32
lines changed

src/Fetch.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -241,17 +241,17 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
241241
var fetch_attr = fetch + {{{ C_STRUCTS.emscripten_fetch_t.__attributes }}};
242242
var requestMethod = UTF8ToString(fetch_attr);
243243
if (!requestMethod) requestMethod = 'GET';
244-
var userData = HEAPU32[fetch + {{{ C_STRUCTS.emscripten_fetch_t.userData }}} >> 2];
245-
var fetchAttributes = HEAPU32[fetch_attr + {{{ C_STRUCTS.emscripten_fetch_attr_t.attributes }}} >> 2];
246-
var timeoutMsecs = HEAPU32[fetch_attr + {{{ C_STRUCTS.emscripten_fetch_attr_t.timeoutMSecs }}} >> 2];
247-
var withCredentials = !!HEAPU32[fetch_attr + {{{ C_STRUCTS.emscripten_fetch_attr_t.withCredentials }}} >> 2];
248-
var destinationPath = HEAPU32[fetch_attr + {{{ C_STRUCTS.emscripten_fetch_attr_t.destinationPath }}} >> 2];
249-
var userName = HEAPU32[fetch_attr + {{{ C_STRUCTS.emscripten_fetch_attr_t.userName }}} >> 2];
250-
var password = HEAPU32[fetch_attr + {{{ C_STRUCTS.emscripten_fetch_attr_t.password }}} >> 2];
251-
var requestHeaders = HEAPU32[fetch_attr + {{{ C_STRUCTS.emscripten_fetch_attr_t.requestHeaders }}} >> 2];
252-
var overriddenMimeType = HEAPU32[fetch_attr + {{{ C_STRUCTS.emscripten_fetch_attr_t.overriddenMimeType }}} >> 2];
253-
var dataPtr = HEAPU32[fetch_attr + {{{ C_STRUCTS.emscripten_fetch_attr_t.requestData }}} >> 2];
254-
var dataLength = HEAPU32[fetch_attr + {{{ C_STRUCTS.emscripten_fetch_attr_t.requestDataSize }}} >> 2];
244+
var userData = {{{ makeGetValue('fetch_attr', C_STRUCTS.emscripten_fetch_t.userData, '*') }}};
245+
var fetchAttributes = {{{ makeGetValue('fetch_attr', C_STRUCTS.emscripten_fetch_attr_t.attributes, 'u32') }}};
246+
var timeoutMsecs = {{{ makeGetValue('fetch_attr', C_STRUCTS.emscripten_fetch_attr_t.timeoutMSecs, 'u32') }}};
247+
var withCredentials = !!{{{ makeGetValue('fetch_attr', C_STRUCTS.emscripten_fetch_attr_t.withCredentials, 'u8') }}};
248+
var destinationPath = {{{ makeGetValue('fetch_attr', C_STRUCTS.emscripten_fetch_attr_t.destinationPath, '*') }}};
249+
var userName = {{{ makeGetValue('fetch_attr', C_STRUCTS.emscripten_fetch_attr_t.userName, '*') }}};
250+
var password = {{{ makeGetValue('fetch_attr', C_STRUCTS.emscripten_fetch_attr_t.password, '*') }}};
251+
var requestHeaders = {{{ makeGetValue('fetch_attr', C_STRUCTS.emscripten_fetch_attr_t.requestHeaders, '*') }}};
252+
var overriddenMimeType = {{{ makeGetValue('fetch_attr', C_STRUCTS.emscripten_fetch_attr_t.overriddenMimeType, '*') }}};
253+
var dataPtr = {{{ makeGetValue('fetch_attr', C_STRUCTS.emscripten_fetch_attr_t.requestData, '*') }}};
254+
var dataLength = {{{ makeGetValue('fetch_attr', C_STRUCTS.emscripten_fetch_attr_t.requestDataSize, '*') }}};
255255

256256
var fetchAttrLoadToMemory = !!(fetchAttributes & {{{ cDefs.EMSCRIPTEN_FETCH_LOAD_TO_MEMORY }}});
257257
var fetchAttrStreamData = !!(fetchAttributes & {{{ cDefs.EMSCRIPTEN_FETCH_STREAM_DATA }}});
@@ -289,11 +289,11 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
289289
}
290290
if (requestHeaders) {
291291
for (;;) {
292-
var key = HEAPU32[requestHeaders >> 2];
292+
var key = {{{ makeGetValue('requestHeaders', 0, '*') }}};
293293
if (!key) break;
294-
var value = HEAPU32[requestHeaders + 4 >> 2];
294+
var value = {{{ makeGetValue('requestHeaders', POINTER_SIZE, '*') }}};
295295
if (!value) break;
296-
requestHeaders += 8;
296+
requestHeaders += {{{ 2 * POINTER_SIZE }}};
297297
var keyStr = UTF8ToString(key);
298298
var valueStr = UTF8ToString(value);
299299
#if FETCH_DEBUG
@@ -302,7 +302,7 @@ function fetchXHR(fetch, onsuccess, onerror, onprogress, onreadystatechange) {
302302
xhr.setRequestHeader(keyStr, valueStr);
303303
}
304304
}
305-
var id = HEAPU32[fetch + {{{ C_STRUCTS.emscripten_fetch_t.id }}} >> 2];
305+
var id = {{{ makeGetValue('fetch', C_STRUCTS.emscripten_fetch_t.id, 'u32') }}};
306306
Fetch.xhrs[id] = xhr;
307307
var data = (dataPtr && dataLength) ? HEAPU8.slice(dataPtr, dataPtr + dataLength) : null;
308308
// TODO: Support specifying custom headers to the request.

src/generated_struct_info64.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,28 +1336,28 @@
13361336
"value": 8
13371337
},
13381338
"emscripten_fetch_attr_t": {
1339-
"__size__": 152,
1339+
"__size__": 144,
13401340
"attributes": 72,
1341-
"destinationPath": 96,
1341+
"destinationPath": 88,
13421342
"onerror": 48,
13431343
"onprogress": 56,
13441344
"onreadystatechange": 64,
13451345
"onsuccess": 40,
1346-
"overriddenMimeType": 128,
1347-
"password": 112,
1348-
"requestData": 136,
1349-
"requestDataSize": 144,
1350-
"requestHeaders": 120,
1346+
"overriddenMimeType": 120,
1347+
"password": 104,
1348+
"requestData": 128,
1349+
"requestDataSize": 136,
1350+
"requestHeaders": 112,
13511351
"requestMethod": 0,
1352-
"timeoutMSecs": 80,
1352+
"timeoutMSecs": 76,
13531353
"userData": 32,
1354-
"userName": 104,
1355-
"withCredentials": 88
1354+
"userName": 96,
1355+
"withCredentials": 80
13561356
},
13571357
"emscripten_fetch_t": {
13581358
"__attributes": 128,
13591359
"__proxyState": 124,
1360-
"__size__": 280,
1360+
"__size__": 272,
13611361
"data": 24,
13621362
"dataOffset": 40,
13631363
"id": 0,

system/include/emscripten/fetch.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ typedef struct emscripten_fetch_attr_t {
8585

8686
// Specifies the amount of time the request can take before failing due to a
8787
// timeout.
88-
unsigned long timeoutMSecs;
88+
uint32_t timeoutMSecs;
8989

9090
// Indicates whether cross-site access control requests should be made using
9191
// credentials.

test/test_browser.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,26 @@ def metafunc(self, with_wasm64):
124124
return metafunc
125125

126126

127+
def also_with_wasm2js_or_wasm64(f):
128+
assert callable(f)
129+
130+
def metafunc(self, with_wasm2js, with_wasm64):
131+
if with_wasm2js:
132+
self.set_setting('WASM', 0)
133+
f(self)
134+
elif with_wasm64:
135+
self.set_setting('MEMORY64')
136+
self.emcc_args.append('-Wno-experimental')
137+
f(self)
138+
else:
139+
f(self)
140+
141+
metafunc._parameterize = {'': (False, False),
142+
'wasm2js': (True, False),
143+
'wasm64': (False, True)}
144+
return metafunc
145+
146+
127147
def shell_with_script(shell_file, output_file, replacement):
128148
shell = read_file(path_from_root('src', shell_file))
129149
create_file(output_file, shell.replace('{{{ SCRIPT }}}', replacement))
@@ -4602,7 +4622,7 @@ def test_preallocated_heap(self):
46024622
self.btest_exit('test_preallocated_heap.cpp', args=['-sWASM=0', '-sINITIAL_MEMORY=16MB', '-sABORTING_MALLOC=0', '--shell-file', test_file('test_preallocated_heap_shell.html')])
46034623

46044624
# Tests emscripten_fetch() usage to XHR data directly to memory without persisting results to IndexedDB.
4605-
@also_with_wasm2js
4625+
@also_with_wasm2js_or_wasm64
46064626
def test_fetch_to_memory(self):
46074627
# Test error reporting in the negative case when the file URL doesn't exist. (http 404)
46084628
self.btest_exit('fetch/to_memory.cpp',
@@ -4626,29 +4646,29 @@ def test_fetch_from_thread(self, args):
46264646
args=args + ['-pthread', '-sPROXY_TO_PTHREAD', '-sFETCH_DEBUG', '-sFETCH', '-DFILE_DOES_NOT_EXIST'],
46274647
also_wasm2js=True)
46284648

4629-
@also_with_wasm2js
4649+
@also_with_wasm2js_or_wasm64
46304650
def test_fetch_to_indexdb(self):
46314651
shutil.copyfile(test_file('gears.png'), 'gears.png')
46324652
self.btest_exit('fetch/to_indexeddb.cpp',
46334653
args=['-sFETCH_DEBUG', '-sFETCH'])
46344654

46354655
# Tests emscripten_fetch() usage to persist an XHR into IndexedDB and subsequently load up from there.
4636-
@also_with_wasm2js
4656+
@also_with_wasm2js_or_wasm64
46374657
def test_fetch_cached_xhr(self):
46384658
shutil.copyfile(test_file('gears.png'), 'gears.png')
46394659
self.btest_exit('fetch/cached_xhr.cpp',
46404660
args=['-sFETCH_DEBUG', '-sFETCH'])
46414661

46424662
# Tests that response headers get set on emscripten_fetch_t values.
46434663
@no_firefox('https://github.com/emscripten-core/emscripten/issues/16868')
4644-
@also_with_wasm2js
4664+
@also_with_wasm2js_or_wasm64
46454665
@requires_threads
46464666
def test_fetch_response_headers(self):
46474667
shutil.copyfile(test_file('gears.png'), 'gears.png')
46484668
self.btest_exit('fetch/response_headers.cpp', args=['-sFETCH_DEBUG', '-sFETCH', '-pthread', '-sPROXY_TO_PTHREAD'])
46494669

46504670
# Test emscripten_fetch() usage to stream a XHR in to memory without storing the full file in memory
4651-
@also_with_wasm2js
4671+
@also_with_wasm2js_or_wasm64
46524672
def test_fetch_stream_file(self):
46534673
self.skipTest('moz-chunked-arraybuffer was firefox-only and has been removed')
46544674
# Strategy: create a large 128MB file, and compile with a small 16MB Emscripten heap, so that the tested file
@@ -4674,6 +4694,7 @@ def test_fetch_xhr_abort(self):
46744694
# Tests emscripten_fetch() usage in synchronous mode when used from the main
46754695
# thread proxied to a Worker with -sPROXY_TO_PTHREAD option.
46764696
@no_firefox('https://github.com/emscripten-core/emscripten/issues/16868')
4697+
@also_with_wasm64
46774698
@requires_threads
46784699
def test_fetch_sync_xhr(self):
46794700
shutil.copyfile(test_file('gears.png'), 'gears.png')
@@ -4682,6 +4703,7 @@ def test_fetch_sync_xhr(self):
46824703
# Tests emscripten_fetch() usage when user passes none of the main 3 flags (append/replace/no_download).
46834704
# In that case, in append is implicitly understood.
46844705
@no_firefox('https://github.com/emscripten-core/emscripten/issues/16868')
4706+
@also_with_wasm64
46854707
@requires_threads
46864708
def test_fetch_implicit_append(self):
46874709
shutil.copyfile(test_file('gears.png'), 'gears.png')

0 commit comments

Comments
 (0)