<!DOCTYPE html>
<!--
Copyright 2020 The Cobalt Authors. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html>
<meta charset="utf-8">
<title>ttseries</title>
<script>
  var alternatedCount = 0;
  var alternatingChannels = setInterval(alternateChannels, 500);

  function alternateChannels() {
    const channel = window.h5vcc.updater.getUpdaterChannel();
    const status = window.h5vcc.updater.getUpdateStatus();

    if (channel == "qa") {
      console.log("channel changed from qa to tseries1");
      window.h5vcc.updater.setUpdaterChannel("tseries1");
      return;
    }

    if (alternatedCount < 5) {
      if (status != "Update installed, pending restart") {
        return;
      }

      if (channel == "tseries1") {
        console.log("channel changed from tseries1 to tseries2");
        window.h5vcc.updater.setUpdaterChannel("tseries2");
      } else {
        console.log("channel changed from " + channel + " to tseries1");
        window.h5vcc.updater.setUpdaterChannel("tseries1");
      }

      alternatedCount++;
      return;
    }

    console.log("continuous updates without restart working");

    clearInterval(alternatingChannels);
  }
</script>
</html>
