<!DOCTYPE html>
<!--
 | Tests that the platform user agent string will be accepted by one of the
 | user agent regexes.
-->
<html>
<head>
  <title>user-agent-test</title>
  <style>
    #result {
      width: 100px;
      height:100px;
      background-color:#0047AB;
    }
  </style>
</head>
<body>

<div id="result"></div>

<script>

function expect(condition, message) {
  if (!condition) {
    document.querySelector('#result').style.display = 'none';
    if (typeof message !== 'undefined') {
      console.error(message);
    } else {
      console.error('!condition block reached in |expect|');
    }
  }
}

// This matches a device.py file in Google's internal code repository.
function generateUserAgentRegexes() {
  const output = [];
  const uaFieldChars = "-.A-Za-z0-9\\,_/()";

  // Note that ?P<NAME> is used by python for named capture groups. JavaScript
  // does not support named capture groups, so they are commented out.
  // Additionally, all model names have been replaced with more general regexes.
  // YTTV 2016: Operator_DeviceType_Chipset/Firmware (Brand, Model, Connection)
  const string = "("/*?P<device>*/ + "(" + /*?P<operator>*/"[" + uaFieldChars + "'/]*)_"
      + "("/*?P<type>*/ + "[" + uaFieldChars + "/]+)_"
      + "("/*?P<chipset>*/ + "[" + uaFieldChars + "/_]+)) ?/ ?"
      + "[" + uaFieldChars + "_]* "
      + "\\(("/*?P<brand>*/ + "[" + uaFieldChars + "/_ ]+), ?("/*?P<model>*/ + "[^,]*), "
      + "?[WIREDLSwiredls\\/]*\\)";
  output.push(string);

  // TTV 2013: Device/Firmware (Brand, Model, Connection)
  output.push("("/*?P<device>*/ + "[-_.A-Za-z0-9\\/]+) ?/ ?[-_.A-Za-z0-9\\\\]* "
              + "\\(("/*?P<brand>*/ + "[-_.A-Za-z0-9\\/ ]+), ?("/*?P<model>*/ + "[^,]*), "
              + "?[WIREDLSwiredls\\/]*\\)");

  // YTTV 2012: Vendor Device/Firmware (Model, SKU, Lang, Country)
  output.push("("/*?P<brand>*/ + "[-_.A-Za-z0-9\\\\/]+) "
              + "("/*?P<device>*/ + "[-_.A-Za-z0-9\\\\]+)/[-_.A-Za-z0-9\\\\/]* \\(("/*?P<model>*/ + "[^,]*), "
              + "?[-_.A-Za-z0-9\\\\/]*,[^,]+,[^)]+\\)");

  // (REMOVED) Spec:
  output.push("("/*?P<device>*/ + "[a-zA-Z]+)/[0-9.]+ \\([^;]*; ?("/*?P<brand>*/ + "[^;]*); "
              + "?("/*?P<model>*/ + "[^;]*);[^;]*;[^;]*;[^)]*\\)");

  // (REMOVED) 2012:
  output.push("("/*?P<brand>*/ + "[G-L]+) Browser/[0-9.]+\\([^;]*; [E-L]+; "
              + "?("/*?P<model>*/ + "[^;]*);[^;]*;[^;]*;\\); [G-L]+ ("/*?P<device>*/ + "[-_.A-Za-z0-9\\\\/]+) ");

  // (REMOVED)
  // Note: device is more of a firmware version, but model should feasibly always match.
  output.push("("/*?P<brand>*/ + "[a-zA-Z]+)/("/*?P<model>*/ + "\\S+) \\(("/*?P<device>*/ + "[^)]+)\\)");

  output.push("[.A-Za-z0-9\\\\/]+ [a-zA-Z]+/[.0-9]+ ("/*?P<brand>*/ + "[a-zA-Z]+)[T-V]+/[.0-9]+ "
              + "model/("/*?P<model>*/ + "\\S+) ?[-_.A-Za-z0-9\\\\/]* build/[A-Za-z0-9]+");
  return output;
}

expect(
    generateUserAgentRegexes()
    .map(regex => new RegExp(regex, 'g').test(navigator.userAgent))
    .some(value => value),
    `userAgent string '${navigator.userAgent}' failed to match any acceptable regular expression`
);

</script>

</body>
</html>
