1,修复 https://mobile.yangkeduo.com/chat_detail.html?mall_id=56482上传图片不了的问题。
react_pdd_fc4c9d525f1e872e3a17.js
原因是处理blob有问题。
此网站把file blob对象传给xhr,获取响应后
FileReader.readAsArrayBuffer(response);
把blob传给了FileReader。
再在FileReader.onload里
发现e.target.result.byteLength == 0
所以原因是
BlobResourceLoader里收到数据后,如果请求是m_request.downloadToFile()类型,则
应该像WebURLLoaderManager里一样,先存到WebURLLoaderManager::m_blobCache,再走client->didDownloadData,
而不是直接走client->didReceiveData。
否则一个是会触发XMLHttpRequest::responseBlob()里的断言(因为client这里最后会通知到xhr对象),
其次XMLHttpRequest::didReceiveResponse如果发现不是downloadToFile类型的请求,则不会走
XMLHttpRequest::createBlobDataHandleFromResponse。
另外,存数据给WebURLLoaderManager::m_blobCache,也是为了创建下个BlobResourceLoader的时候,
里面存有从m_blobCache获取到的数据。
总结一下,第一个BlobResourceLoader负责把xhr传来的blob url加载并获取数据,再传给FileReader对应的第二个。
BlobResourceLoader去加载。由于第一个BlobResourceLoader对应请求是downloadToFile类型,所以要特殊处理。
js重现代码:
function onFileReadLoad(t) {
alert("__callstack__ l : " + t.byteLength); // weolar
}
(fileReader = new FileReader).onload = function(e) {
onFileReadLoad(e.target.result); // weolar
}
function(e, t) {
var n = new XMLHttpRequest;
n.open("GET", e, !0),
n.responseType = "blob",
n.onload = function(e) {
200 != this.status && 0 !== this.status || t(this.response)
},
n.send()
} (src, function(e) {
fileReader.readAsArrayBuffer(e); // e == this.response
})