HttpRequest(opts, src) {
    const tabId = src.tab.id;
    const frameId = getFrameDocIdFromSrc(src);
    const { id, events } = opts;
    /** @type {GMReq.BG} */
    const req = requests[id] = {
      id,
      tabId,
      [kFrameId]: frameId,
      frame: getFrameDocIdAsObj(frameId),
      xhr: new XMLHttpRequest(),
    };
    const cb = res => requests[id] && (
      sendTabCmd(tabId, 'HttpRequested', res, req.frame)
    );
    return httpRequest(opts, events, src, cb)
    .catch(events.includes('error') && (err => cb({
      id,
      error: err.message || err,
      data: null,
      type: 'error',
    })));
  }
@param {GMReq.Message.Web} opts
@param {VMMessageSender} src
@return {Promise<void>}