async HttpRequest(msg, realm) {
    if (IS_FIREFOX) msg = nullObjFrom(msg); // copying into our realm to set its props freely
    else setPrototypeOf(msg, null);
    const { url } = msg;
    const data = !IS_FIREFOX && msg.data;
    const uaData = getUAData && navigator::getUAData();
    const sch = url::slice(0, 5);
    if (sch === 'data:' || sch === 'blob:') {
      return requestVirtualUrl(msg, url, realm);
    }
    requests[msg.id] = {
      __proto__: null,
      realm,
      [kXhrType]: msg[kXhrType],
    };
    // In Firefox we recreate FormData in bg::decodeBody
    if (data && data.length > 1 && data[1] !== 'usp') {
      // TODO: support huge data by splitting it to multiple messages
      msg.data = await encodeBody(data[0], data[1]);
    }
    msg.ua = getUAProps::map((fn, i) => (!i ? navigator : uaData)::fn());
    return sendCmd('HttpRequest', msg);
  }
@param {GMReq.Message.Web} msg
@param {VMScriptInjectInto} realm
@returns {Promise<void>}