summaryrefslogtreecommitdiffstats
path: root/layout/generic/test/page_scroll_with_fixed_pos_window.html
blob: 9c2b6586c4f493383a121311157a71f808dfea7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<!DOCTYPE HTML>
<html>
<head>
  <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, user-scalable=no" />
  <title>Scrolling by pages with fixed-pos headers and footers</title>
  <style>
  .fp { position:fixed; left:0; width:100%; }
  .fp2 { position:fixed; left:0; width:100%; }
  </style>
</head>
<body onscroll="didScroll()" onload="test()">
<div class="fp" id="top" style="top:0; height:10px; background:yellow;"></div>
<div class="fp2" id="top2" style="top:10px; height:11px; background:blue;"></div>
<div class="fp" style="top:50%; height:7px; background:cyan;"></div>
<div class="fp2" id="bottom2" style="bottom:9px; height:12px; background:red;"></div>
<div class="fp" id="bottom" style="bottom:0; height:13px; background:yellow;"></div>
<p id="target">Something to click on to get focus
<div style="height:3000px;"></div>
<pre id="test">
<script class="testbody">
var SimpleTest = window.opener.SimpleTest;
var SpecialPowers = window.opener.SpecialPowers;
var is = window.opener.is;

function showElements(show, classname) {
  var elements = document.getElementsByClassName(classname);
  for (var i = 0; i < elements.length; ++i) {
    elements[i].style.display = show ? '' : 'none';
  }
  document.documentElement.getBoundingClientRect();
}
function showFixedPosElements(show) {
  showElements(show, "fp");
}
function showFixedPosElements2(show) {
  showElements(show, "fp2");
}

var nextCont;
function didScroll() {
  var c = nextCont;
  nextCont = null;
  if (c) {
    c();
  }
}

function resetScrollAndScrollDownOnePageWithContinuation(cont) {
  if (document.documentElement.scrollTop != 0) {
    document.documentElement.scrollTop = 0;
    nextCont = function() {
      setTimeout(function() { scrollDownOnePageWithContinuation(cont) }, 0);
    };
  } else {
    scrollDownOnePageWithContinuation(cont);
  }
}

function scrollDownOnePageWithContinuation(cont) {
  nextCont = cont;
  window.scrollByPages(1);
}

function test() {
  var smoothScrollPref = "general.smoothScroll";
  SpecialPowers.pushPrefEnv({"set":[[smoothScrollPref, false]]}, runTest);
}

function runTest() {
  showFixedPosElements(false);
  showFixedPosElements2(false);
  resetScrollAndScrollDownOnePageWithContinuation(function() {
    var fullPageScrollDown = document.documentElement.scrollTop;

    showFixedPosElements(true);
    resetScrollAndScrollDownOnePageWithContinuation(function() {
      var fullPageScrollDownWithHeaderAndFooter = document.documentElement.scrollTop;
      is(fullPageScrollDownWithHeaderAndFooter, fullPageScrollDown - (10 + 13),
         "Reduce scroll distance by size of small header and footer");

      document.getElementById("bottom").style.height = (window.innerHeight - 20) + "px";
      resetScrollAndScrollDownOnePageWithContinuation(function() {
        is(document.documentElement.scrollTop, fullPageScrollDown - 10,
           "Ignore really big elements when reducing scroll size");   
        document.getElementById("bottom").style.height = "13px";

        document.getElementById("top").style.width = "100px";
        resetScrollAndScrollDownOnePageWithContinuation(function() {
          is(document.documentElement.scrollTop, fullPageScrollDown - 13,
             "Ignore elements that don't span the entire viewport side");
          document.getElementById("top").style.width = "100%";

          showFixedPosElements2(true);
          resetScrollAndScrollDownOnePageWithContinuation(function() {
            is(document.documentElement.scrollTop, fullPageScrollDown - (10 + 11 + 9 + 12),
               "Combine multiple overlapping elements");
            showFixedPosElements2(false);

            document.getElementById("top").style.width = "400px";
            resetScrollAndScrollDownOnePageWithContinuation(function() {
              is(document.documentElement.scrollTop, fullPageScrollDown - (10 + 13),
                 "Don't ignore elements that span more than half the viewport side");
              document.getElementById("top").style.width = "100%";

              document.getElementById("top").style.top = "-40px";
              document.getElementById("top").style.transform = "translateY(38px)";
              resetScrollAndScrollDownOnePageWithContinuation(function() {
                is(document.documentElement.scrollTop,
                   fullPageScrollDown - (10 + 13 - 40 + 38),
                   "Account for offset and transform");
                document.getElementById("top").style.width = "100%";

                // Scroll back up so test results are visible
                document.documentElement.scrollTop = 0;
                SimpleTest.finish();
                window.close();
              });
            });
          });
        });
      });
    });
  });
}
</script>
</pre>
</body>
</html>