Skip to content

Commit 3130e06

Browse files
authored
Remove fallback to BlobBuilder if Blob constructor is missing (#19277)
This code for handling the absence of Blob constructor goes back to 2012: a97aab0 I'm pretty there is nobody depending on this today. I think we would have to go back to chrome 32 or firefox 14 or safari 6 in order to actually need this: https://caniuse.com/blobbuilder I noticed this looked like it should be removed when following the link in tools/file_packager.py to https://crbug.com/124926, which was marked as WontFix over 10 years ago.
1 parent 90732f8 commit 3130e06

File tree

5 files changed

+46
-93
lines changed

5 files changed

+46
-93
lines changed

ChangeLog.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ See docs/process.md for more on how version tagging works.
2020

2121
3.1.38 (in development)
2222
-----------------------
23+
- Remove extra code for falling back to long-deprecated BlobBuilder browser API
24+
when Blob constructor is missing. This was a fix for an issue that has long
25+
been fixed. (#19277)
2326

2427
3.1.37 - 04/26/23
2528
-----------------

src/closure-externs/closure-externs.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,6 @@ var wakaUnknownAfter;
171171
* @suppress {undefinedVars}
172172
*/
173173
var wakaUnknownBefore;
174-
/**
175-
* @suppress {undefinedVars}
176-
*/
177-
var MozBlobBuilder;
178174

179175
// Module loaders externs, for AMD etc.
180176

src/headless.js

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -295,19 +295,6 @@ if (typeof console == "undefined") {
295295
}
296296
};
297297
}
298-
var MozBlobBuilder = () => {
299-
this.data = new Uint8Array(0);
300-
this.append = function(buffer) {
301-
var data = new Uint8Array(buffer);
302-
var combined = new Uint8Array(this.data.length + data.length);
303-
combined.set(this.data);
304-
combined.set(data, this.data.length);
305-
this.data = combined;
306-
};
307-
this.getBlob = function() {
308-
return this.data.buffer; // return the buffer as a "blob". XXX We might need to change this if it is not opaque
309-
};
310-
};
311298

312299
// additional setup
313300
if (!Module['canvas']) {

src/library_browser.js

Lines changed: 42 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,6 @@ var LibraryBrowser = {
105105

106106
if (Browser.initted) return;
107107
Browser.initted = true;
108-
109-
try {
110-
new Blob();
111-
Browser.hasBlobConstructor = true;
112-
} catch(e) {
113-
Browser.hasBlobConstructor = false;
114-
err("warning: no blob constructor, cannot create blobs with mimetypes");
115-
}
116-
Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? err("warning: no BlobBuilder") : null));
117108
Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : undefined;
118109
if (!Module.noImageDecoding && typeof Browser.URLObject == 'undefined') {
119110
err("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.");
@@ -133,22 +124,10 @@ var LibraryBrowser = {
133124
return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name);
134125
};
135126
imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) {
136-
var b = null;
137-
if (Browser.hasBlobConstructor) {
138-
try {
139-
b = new Blob([byteArray], { type: Browser.getMimetype(name) });
140-
if (b.size !== byteArray.length) { // Safari bug #118630
141-
// Safari's Blob can only take an ArrayBuffer
142-
b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });
143-
}
144-
} catch(e) {
145-
warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder');
146-
}
147-
}
148-
if (!b) {
149-
var bb = new Browser.BlobBuilder();
150-
bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range
151-
b = bb.getBlob();
127+
var b = new Blob([byteArray], { type: Browser.getMimetype(name) });
128+
if (b.size !== byteArray.length) { // Safari bug #118630
129+
// Safari's Blob can only take an ArrayBuffer
130+
b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) });
152131
}
153132
var url = Browser.URLObject.createObjectURL(b);
154133
#if ASSERTIONS
@@ -192,56 +171,48 @@ var LibraryBrowser = {
192171
preloadedAudios[name] = new Audio(); // empty shim
193172
if (onerror) onerror();
194173
}
195-
if (Browser.hasBlobConstructor) {
196-
try {
197-
var b = new Blob([byteArray], { type: Browser.getMimetype(name) });
198-
} catch(e) {
199-
return fail();
200-
}
201-
var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!
174+
var b = new Blob([byteArray], { type: Browser.getMimetype(name) });
175+
var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this!
202176
#if ASSERTIONS
203-
assert(typeof url == 'string', 'createObjectURL must return a url as a string');
177+
assert(typeof url == 'string', 'createObjectURL must return a url as a string');
204178
#endif
205-
var audio = new Audio();
206-
audio.addEventListener('canplaythrough', () => finish(audio), false); // use addEventListener due to chromium bug 124926
207-
audio.onerror = function audio_onerror(event) {
208-
if (done) return;
209-
err('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');
210-
function encode64(data) {
211-
var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
212-
var PAD = '=';
213-
var ret = '';
214-
var leftchar = 0;
215-
var leftbits = 0;
216-
for (var i = 0; i < data.length; i++) {
217-
leftchar = (leftchar << 8) | data[i];
218-
leftbits += 8;
219-
while (leftbits >= 6) {
220-
var curr = (leftchar >> (leftbits-6)) & 0x3f;
221-
leftbits -= 6;
222-
ret += BASE[curr];
223-
}
224-
}
225-
if (leftbits == 2) {
226-
ret += BASE[(leftchar&3) << 4];
227-
ret += PAD + PAD;
228-
} else if (leftbits == 4) {
229-
ret += BASE[(leftchar&0xf) << 2];
230-
ret += PAD;
179+
var audio = new Audio();
180+
audio.addEventListener('canplaythrough', () => finish(audio), false); // use addEventListener due to chromium bug 124926
181+
audio.onerror = function audio_onerror(event) {
182+
if (done) return;
183+
err('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach');
184+
function encode64(data) {
185+
var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
186+
var PAD = '=';
187+
var ret = '';
188+
var leftchar = 0;
189+
var leftbits = 0;
190+
for (var i = 0; i < data.length; i++) {
191+
leftchar = (leftchar << 8) | data[i];
192+
leftbits += 8;
193+
while (leftbits >= 6) {
194+
var curr = (leftchar >> (leftbits-6)) & 0x3f;
195+
leftbits -= 6;
196+
ret += BASE[curr];
231197
}
232-
return ret;
233198
}
234-
audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);
235-
finish(audio); // we don't wait for confirmation this worked - but it's worth trying
236-
};
237-
audio.src = url;
238-
// workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror
239-
safeSetTimeout(() => {
240-
finish(audio); // try to use it even though it is not necessarily ready to play
241-
}, 10000);
242-
} else {
243-
return fail();
244-
}
199+
if (leftbits == 2) {
200+
ret += BASE[(leftchar&3) << 4];
201+
ret += PAD + PAD;
202+
} else if (leftbits == 4) {
203+
ret += BASE[(leftchar&0xf) << 2];
204+
ret += PAD;
205+
}
206+
return ret;
207+
}
208+
audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray);
209+
finish(audio); // we don't wait for confirmation this worked - but it's worth trying
210+
};
211+
audio.src = url;
212+
// workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror
213+
safeSetTimeout(() => {
214+
finish(audio); // try to use it even though it is not necessarily ready to play
215+
}, 10000);
245216
};
246217
Module['preloadPlugins'].push(audioPlugin);
247218

tools/file_packager.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -635,11 +635,7 @@ def generate_js(data_target, data_files, metadata):
635635
Module['FS_createPreloadedFile'](this.name, null, byteArray, true, true, function() {
636636
Module['removeRunDependency']('fp ' + that.name);
637637
}, function() {
638-
if (that.audio) {
639-
Module['removeRunDependency']('fp ' + that.name); // workaround for chromium bug 124926 (still no audio with this, but at least we don't hang)
640-
} else {
641-
err('Preloading file ' + that.name + ' failed');
642-
}
638+
err('Preloading file ' + that.name + ' failed');
643639
}, false, true); // canOwn this data in the filesystem, it is a slide into the heap that will never change\n'''
644640
create_data = '''// canOwn this data in the filesystem, it is a slide into the heap that will never change
645641
Module['FS_createDataFile'](this.name, null, byteArray, true, true, true);

0 commit comments

Comments
 (0)