Skip to content

Commit 67fa4c1

Browse files
authored
Re-enable XHR as fallback for fetch on webview (#22026)
In #22015 we switched `readAsync` to be based on fetch rather than XHR. However that broke the assumption in `getBinaryenPromise` that was assuming `readAsync` was XHR-based. This change reinstates the XHR fallback in the case of webviews where loading from `file://` URLs is not only possible but (apparently) common. Sadly we don't have any webview tests so I have no way to actually test this within our current frameworks.
1 parent b0ec4e1 commit 67fa4c1

File tree

81 files changed

+116
-108
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+116
-108
lines changed

src/preamble.js

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -642,36 +642,21 @@ function getBinarySync(file) {
642642

643643
function getBinaryPromise(binaryFile) {
644644
#if !SINGLE_FILE
645-
// If we don't have the binary yet, try to load it asynchronously.
646-
// Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.
647-
// See https://github.com/github/fetch/pull/92#issuecomment-140665932
648-
// Cordova or Electron apps are typically loaded from a file:// url.
649-
// So use fetch if it is available and the url is not a file, otherwise fall back to XHR.
645+
// If we don't have the binary yet, load it asynchronously using readAsync.
650646
if (!wasmBinary
651647
#if SUPPORT_BASE64_EMBEDDING
652-
&& !isDataURI(binaryFile)
653-
#endif
654-
&& (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {
655-
if (typeof fetch == 'function'
656-
#if ENVIRONMENT_MAY_BE_WEBVIEW
657-
&& !isFileURI(binaryFile)
658-
#endif
659-
) {
660-
return fetch(binaryFile, {{{ makeModuleReceiveExpr('fetchSettings', "{ credentials: 'same-origin' }") }}}).then((response) => {
661-
if (!response['ok']) {
662-
throw `failed to load wasm binary file at '${binaryFile}'`;
663-
}
664-
return response['arrayBuffer']();
665-
}).catch(() => getBinarySync(binaryFile));
666-
}
667-
#if ENVIRONMENT_MAY_BE_WEBVIEW
668-
else if (readAsync) {
669-
// fetch is not available or url is file => try XHR (readAsync uses XHR internally)
670-
return new Promise((resolve, reject) => {
671-
readAsync(binaryFile, (response) => resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))), reject)
672-
});
673-
}
648+
|| isDataURI(binaryFile)
674649
#endif
650+
) {
651+
// Fetch the binary use readAsync
652+
return new Promise((resolve, reject) => {
653+
readAsync(binaryFile,
654+
(response) => resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))),
655+
(error) => {
656+
try { resolve(getBinarySync(binaryFile)); }
657+
catch (e) { reject(e); }
658+
});
659+
});
675660
}
676661
#endif
677662

src/web_or_worker_shell_read.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,35 @@
2222
}
2323

2424
readAsync = (url, onload, onerror) => {
25-
fetch(url)
25+
#if ENVIRONMENT_MAY_BE_WEBVIEW
26+
// Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.
27+
// See https://github.com/github/fetch/pull/92#issuecomment-140665932
28+
// Cordova or Electron apps are typically loaded from a file:// url.
29+
// So use XHR on webview if URL is a file URL.
30+
if (isFileURI(url)) {
31+
var xhr = new XMLHttpRequest();
32+
xhr.open('GET', url, true);
33+
xhr.responseType = 'arraybuffer';
34+
xhr.onload = () => {
35+
if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
36+
onload(xhr.response);
37+
return;
38+
}
39+
onerror();
40+
};
41+
xhr.onerror = onerror;
42+
xhr.send(null);
43+
return;
44+
}
45+
#elif ASSERTIONS
46+
assert(!isFileURI(url), "readAsync does not work with file:// URLs");
47+
#endif
48+
fetch(url, {{{ makeModuleReceiveExpr('fetchSettings', "{ credentials: 'same-origin' }") }}})
2649
.then((response) => {
2750
if (response.ok) {
2851
return response.arrayBuffer();
2952
}
30-
return Promise.reject(new Error(response.statusText + ' : ' + response.url));
53+
return Promise.reject(new Error(response.status + ' : ' + response.url));
3154
})
3255
.then(onload, onerror)
3356
};
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9813
1+
9817
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24096
1+
24102
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9797
1+
9801
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24064
1+
24070
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
10897
1+
10895
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
28002
1+
28008
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9777
1+
9774
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
23989
1+
23995
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9777
1+
9774
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
23989
1+
23995
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
10904
1+
10900
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
28002
1+
28008
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9813
1+
9817
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
24096
1+
24102
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
11922
1+
11930
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7774
1+
7766
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
19120
1+
19126
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3095
1+
3088
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6672
1+
6680
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8122
1+
8111
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
21887
1+
21927
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2938
1+
2937
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7529
1+
7568
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2594
1+
2589
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5362
1+
5370
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2509
1+
2505
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5208
1+
5216
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2509
1+
2505
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5208
1+
5216
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2495
1+
2487
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5175
1+
5183
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6405
1+
6409
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
14186
1+
14194
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1862
1+
1858
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3999
1+
4008
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2509
1+
2505
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5208
1+
5216
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2074
1+
2071
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4433
1+
4442
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2113
1+
2106
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4480
1+
4489
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2541
1+
2537
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5352
1+
5359
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2687
1+
2685
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5649
1+
5657
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2379
1+
2374
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5038
1+
5047
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2346
1+
2344
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4969
1+
4977
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2096
1+
2092
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4484
1+
4493
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2113
1+
2106
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4480
1+
4489
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2113
1+
2106
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4480
1+
4489
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1627
1+
1608
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3419
1+
3384
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
6706
1+
6678
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
17995
1+
18019
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1728
1+
1705
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4100
1+
4130
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1559
1+
1540
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3124
1+
3089
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1521
1+
1504
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3074
1+
3039
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1521
1+
1504
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3074
1+
3039
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1514
1+
1496
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3059
1+
3024
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1521
1+
1504
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3074
1+
3039
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5237
1+
5223
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
11387
1+
11396
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1521
1+
1504
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3074
1+
3039
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
55401
1+
55440
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
31301
1+
31340
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
54264
1+
54303

test/test_browser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4331,7 +4331,7 @@ def test_small_js_flags(self):
43314331
print('size:', size)
43324332
# Note that this size includes test harness additions (for reporting the result, etc.).
43334333
if not self.is_wasm64() and not self.is_2gb():
4334-
self.assertLess(abs(size - 4510), 100)
4334+
self.assertLess(abs(size - 4477), 100)
43354335

43364336
# Tests that it is possible to initialize and render WebGL content in a
43374337
# pthread by using OffscreenCanvas.

0 commit comments

Comments
 (0)