continueConnect_(reverse) {
    // Wait until the peer is fully established.  Establishment is sometimes
    // very slow indeed, especially on virtual machines, so a fixed timeout is
    // not suitable.  This wait is required because we want to take precise
    // control of the channel startup timing, and shouldn't be needed in
    // production use, where the inner frame's channel is typically not started
    // by a DOM call as it is here.
    if (!this.getInnerPeer_() || !this.getInnerPeer_().instantiateChannel) {
      window.setTimeout(goog.bind(this.continueConnect_, this, reverse), 100);
      return;
    }

    const connectFromOuterFrame = goog.bind(
        this.channel_.connect, this.channel_,
        goog.bind(this.outerFrameConnected_, this));
    const innerConfig = this.innerFrameCfg_;
    /**
     * @suppress {missingProperties} suppression added to enable type checking
     */
    const connectFromInnerFrame = goog.bind(
        this.getInnerPeer_().instantiateChannel, this.getInnerPeer_(),
        innerConfig);

    // Take control of the timing and reverse of each frame's first SETUP call.
    // If these happen to fire right on top of each other, that tends to mask
    // problems that reliably occur when there is a short delay.
    window.setTimeout(connectFromOuterFrame, reverse ? 1 : 10);
    window.setTimeout(connectFromInnerFrame, reverse ? 10 : 1);
  }
@param {boolean} reverse
@private
@suppress {missingProperties} suppression added to enable type checking