<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>window.performance User Timing measure() method is throwing the proper exceptions</title>
        <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
        <link rel="help" href="https://w3c.github.io/user-timing/#dom-performance-measure"/>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="resources/webperftestharness.js"></script>

    <script>
// test data
var zeroedNavTimingAtt = undefined;

setup(function () {
   // for testing the INVALID_ACCESS_ERR exception, find a navigation timing attribute with a value of zero
   for (var i in timingAttributes) {
     if (window.performance.timing[timingAttributes[i]] == 0) {
        zeroedNavTimingAtt = timingAttributes[i];
     }
   }
   if (zeroedNavTimingAtt == undefined) {
       throw new Error("A navigation timing attribute with a value of 0 was not found to test for the " +
                          "INVALID_ACCESS_ERR exception thrown by window.performance.measure().")
   }
});

test(function () {
   assert_throws_dom("InvalidAccessError", function () {
       window.performance.measure("measure", zeroedNavTimingAtt);
   });
}, "window.performance.measure(\"measure\", \"" + zeroedNavTimingAtt + "\"), where \"" +
                              zeroedNavTimingAtt + "\" is a navigation timing attribute with a value of 0, throws a " +
                              "InvalidAccessError exception.");

test(function () {
   assert_throws_dom("InvalidAccessError", function () {
       window.performance.measure("measure", zeroedNavTimingAtt, "responseEnd");
   });
}, "window.performance.measure(\"measure\", \"" + zeroedNavTimingAtt + "\", " +
                              "\"responseEnd\"), where \"" + zeroedNavTimingAtt + "\" is a navigation timing " +
                              "attribute with a value of 0, throws a InvalidAccessError exception.");

test(function () {
   assert_throws_dom("InvalidAccessError", function () {
       window.performance.measure("measure", "navigationStart", zeroedNavTimingAtt);
   });
}, "window.performance.measure(\"measure\", \"navigationStart\", \"" + zeroedNavTimingAtt +
                              "\"), where \"" + zeroedNavTimingAtt + "\" is a navigation timing attribute with a " +
                              "value of 0, throws a InvalidAccessError exception.");

test(function () {
   assert_throws_dom("InvalidAccessError", function () {
       window.performance.measure("measure", zeroedNavTimingAtt, zeroedNavTimingAtt);
   });
}, "window.performance.measure(\"measure\", \"" + zeroedNavTimingAtt + "\", \"" +
                              zeroedNavTimingAtt + "\"), where \"" + zeroedNavTimingAtt + "\" is a navigation timing " +
                              "attribute with a value of 0, throws a InvalidAccessError exception.");
    </script>
    </head>
    <body>
        <h1>Description</h1>
        <p><code>window.performance.measure()</code> method throws a InvalidAccessError
           whenever a navigation timing attribute with a value of zero is provided as the startMark or endMark.
        </p>

        <div id="log"></div>
    </body>
</html>
