3.6.0安卓打包 fetch 自动设置blob

  • Creator 版本: 3.6.0

  • 目标平台: Android studio 自带的模拟器 api level:30 abi:x86

  • 重现方式 创建hellow world模板工程 分别使用fetch 和 XMLHttpRequest请求同一个接口

  • 首个报错: jsb_xmlhttprequest.cpp 里面SE_PRECONDITION2(false, false, “Invalid response type”);

  • 编辑器操作系统: windows10

  • 重现概率: 100%

  • 分析: web-adapter.js里面以下代码设置了fetch为blob,但是jsb_xmlhttprequest.cpp里面没有该类型的解析。

web-adapter.js
if ('responseType' in xhr && support.blob) {
    xhr.responseType = 'blob'
}

jsb_xmlhttprequest.cpp
static bool XMLHttpRequest_getResponse(se::State &s) { //NOLINT(readability-identifier-naming, google-runtime-references)
    auto *xhr = static_cast<XMLHttpRequest *>(s.nativeThisObject());

    if (xhr->getResponseType() == XMLHttpRequest::ResponseType::STRING) {
        s.rval().setString(xhr->getResponseText());
    } else {
        if (xhr->getReadyState() != XMLHttpRequest::ReadyState::DONE) {
            s.rval().setNull();
        } else {
            if (xhr->getResponseType() == XMLHttpRequest::ResponseType::JSON) {
                const ccstd::string &jsonText = xhr->getResponseText();
                se::HandleObject seObj(se::Object::createJSONObject(jsonText));
                if (!seObj.isEmpty()) {
                    s.rval().setObject(seObj);
                } else {
                    s.rval().setNull();
                }
            } else if (xhr->getResponseType() == XMLHttpRequest::ResponseType::ARRAY_BUFFER) {
                const Data &data = xhr->getResponseData();
                se::HandleObject seObj(se::Object::createArrayBufferObject(data.getBytes(), data.getSize()));
                if (!seObj.isEmpty()) {
                    s.rval().setObject(seObj);
                } else {
                    s.rval().setNull();
                }
            } else {
                SE_PRECONDITION2(false, false, "Invalid response type");
            }
        }
    }
    return true;
}
SE_BIND_PROP_GET(XMLHttpRequest_getResponse)