Source code
Revision control
Copy as Markdown
Other Tools
<!DOCTYPE HTML>
<html>
<head>
  <title>A hit testing test involving a scenario with a scale transform</title>
  <script type="application/javascript" src="apz_test_utils.js"></script>
  <script type="application/javascript" src="apz_test_native_event_utils.js"></script>
  <script src="/tests/SimpleTest/paint_listener.js"></script>
  <meta name="viewport" content="width=device-width"/>
  <style>
    /*
     * This test tries to approximate the layer structure of
     * APZHitTestingTester.ComplexMultiLayerTree from TestHitTesting.cpp.
     *
     * Notes:
     *   - The elements are named after the layers in the testcase
     *     (e.g. "layer1"), but where multiple elements share an APZC,
     *     new elements named "scroller1" etc. are introduced to be
     *     the scroll containers.
     *   - overflow: hidden is used to avoid spurious scrollbar layers.
     *     To trigger APZC creation, the test code explicitly sets display
     *     port margins.
     *   - Perspective transforms are used to force an element to be
     *     layerized if it otherwise wouldn't.
     *   - One difference is that the entire contents of the APZC that
     *     scrolls layer{4,6,8} is shifted to the right by 100px.
     *     Otherwise, the dimensions of the layers make it such that
     *     this APZC's composition bounds covers up layers{1,2,3}
     *     and those cannot be hit.
     */
    body, html {
      margin: 0;
      padding: 0;
      width: 100%;
      height: 100%;
    }
    #scroller1 {
      position: absolute;
      left: 0;
      top: 0;
      width: 250px;
      height: 350px;
      overflow: hidden;
    }
    #layer1 {
      position: absolute;
      left: 0px;
      top: 0px;
      width: 100px;
      height: 100px;
      background: red;
    }
    #layer2 {
      position: absolute;
      left: 50px;
      top: 50px;
      width: 200px;
      height: 300px;
      background: yellow;
      transform: scale(1.0);
      perspective: 10px;
    }
    #layer3 {
      position: absolute;
      left: 10px;
      top: 10px;
      width: 10px;
      height: 10px;
      background: green;
      transform: scale(1.0);
      perspective: 10px;
    }
    #scroller2 {
      position: absolute;
      left: 100px;
      top: 0px;
      width: 300px;
      height: 400px;
      overflow: hidden;
    }
    #layer4 {
      position: absolute;
      left: 0px;
      top: 200px;
      width: 100px;
      height: 100px;
      background: purple;
    }
    #layer5 {
      position: absolute;
      left: 200px;
      top: 0px;
      width: 100px;
      height: 400px;
      background: pink;
      transform: scale(1.0);
      perspective: 10px;
    }
    #layer6 {
      position: absolute;
      left: 0px;
      top: 0px;
      width: 100px;
      height: 200px;
      background: orange;
    }
    #layer7 {
      position: absolute;
      left: 0px;
      top: 0px;
      width: 100px;
      height: 200px;
      background: navy;
      overflow: hidden;
    }
    #layer8 {
      position: absolute;
      left: 0px;
      top: 200px;
      width: 100px;
      height: 100px;
      background: lightgreen;
      transform: scale(1.0);
      perspective: 10px;
    }
    #layer9 {
      position: absolute;
      left: 0px;
      top: 300px;
      width: 100px;
      height: 100px;
      background: turquoise;
      overflow: hidden;
    }
  </style>
</head>
<body>
  <div id="scroller1">
    <div id="layer1"></div>
    <div id="layer2">
      <div id="layer3"></div>
    </div>
  </div>
  <div id="scroller2">
    <div id="layer4"></div>
    <div id="layer5">
      <div id="layer6">
        <div id="layer7"></div>
      </div>
      <div id="layer8"></div>
      <div id="layer9"></div>
    </div>
  </div>
</body>
<script type="application/javascript">
async function test() {
  var config = getHitTestConfig();
  var utils = config.utils;
  // Trigger APZC creation.
  utils.setDisplayPortForElement(0, 0, 250, 350, scroller1, 1);
  await promiseApzFlushedRepaints();
  utils.setDisplayPortForElement(0, 0, 300, 400, scroller2, 1);
  await promiseApzFlushedRepaints();
  utils.setDisplayPortForElement(0, 0, 100, 200, layer7, 1);
  await promiseApzFlushedRepaints();
  utils.setDisplayPortForElement(0, 0, 100, 200, layer9, 1);
  await promiseApzFlushedRepaints();
  checkHitResult(hitTest({x: 25, y: 25}),
                 APZHitResultFlags.VISIBLE,
                 utils.getViewId(scroller1),
                 utils.getLayersId(),
                 "scroller1");
  checkHitResult(hitTest({x: 350, y: 100}),
                 APZHitResultFlags.VISIBLE,
                 utils.getViewId(layer7),
                 utils.getLayersId(),
                 "layer7");
  checkHitResult(hitTest({x: 375, y: 375}),
                 APZHitResultFlags.VISIBLE,
                 utils.getViewId(layer9),
                 utils.getLayersId(),
                 "layer7");
}
waitUntilApzStable()
.then(test)
.then(subtestDone, subtestFailed);
</script>
</html>