chromium/third_party/blink/web_tests/screen_orientation/window-orientationchange-event-subframe.html

<!DOCTYPE html>
<html>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>

<iframe id="testIframe" sandbox="allow-scripts allow-same-origin" style="display:none">
</iframe>

<script>
var test = async_test("Test subframes receive window orientationchange events (includes window.onorientationchange and an event listener for orientationchange)");

if (window.internals && internals.runtimeFlags.orientationEventEnabled) {
  var orientations = [
    'portrait-primary',
    'portrait-secondary',
    'landscape-primary',
    'landscape-secondary'
  ];

  var orientationAngles = [
    0,
    180,
    90,
    -90
  ];

  var currentIndex = 0;
  var eventsReceived = 0;
  var numOrientationChanges = 0;

  function getNextIndex() {
    return (currentIndex + 1) % orientations.length;
  }

  function changeOrientation() {
    testRunner.setMockScreenOrientation(orientations[getNextIndex()]);
    currentIndex = getNextIndex();
    ++numOrientationChanges;
  }

  window.onmessage = test.step_func(function (ev) {
    assert_equals(ev.data, orientationAngles[currentIndex], "subframe received orientationchange event (window.screen.orientation.type=" + window.screen.orientation.type + ")");
    ++eventsReceived;

    // Once *both* of the event handlers/listeners have seen this event,
    // change the orientation or end the test.
    if ((eventsReceived % 2) == 0) {
      assert_equals(eventsReceived, numOrientationChanges*2);

      if (numOrientationChanges < 4) {
        changeOrientation();
      } else if (numOrientationChanges == 4) {
        test.done();
      }
    }
  });

  var testIframe = document.getElementById("testIframe");
  testIframe.src = "resources/iframe-listen-window-orientationchange.html";
  testIframe.onload = changeOrientation;
} else {
  console.error("This test requires window.internals and the orientationchange event to be enabled.");
  test.done();
}
</script>
</body>
</html>