File: browser_net_autoscroll.js

package info (click to toggle)
wine-gecko-2.24 2.24%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 740,092 kB
  • ctags: 688,789
  • sloc: cpp: 3,160,639; ansic: 1,619,153; python: 164,084; java: 128,022; asm: 114,527; xml: 69,863; sh: 55,281; makefile: 49,648; perl: 20,454; objc: 2,344; yacc: 2,066; pascal: 995; lex: 982; exp: 449; php: 244; lisp: 228; awk: 211; sed: 61; csh: 21; ada: 16; ruby: 3
file content (89 lines) | stat: -rw-r--r-- 3,053 bytes parent folder | download | duplicates (4)
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
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

/**
 * Bug 863102 - Automatically scroll down upon new network requests.
 */

function test() {
  let monitor, debuggee, requestsContainer, scrollTop;

  initNetMonitor(INFINITE_GET_URL).then(([aTab, aDebuggee, aMonitor]) => {
    monitor = aMonitor;
    debuggee = aDebuggee;
    let win = monitor.panelWin;
    let topNode = win.document.getElementById("requests-menu-contents");
    requestsContainer = topNode.getElementsByTagName("scrollbox")[0];
    ok(!!requestsContainer, "Container element exists as expected.");
  })

  // (1) Check that the scroll position is maintained at the bottom
  // when the requests overflow the vertical size of the container.
  .then(() => {
    return waitForRequestsToOverflowContainer(monitor, requestsContainer);
  })
  .then(() => {
    ok(scrolledToBottom(requestsContainer), "Scrolled to bottom on overflow.");
  })

  // (2) Now set the scroll position somewhere in the middle and check
  // that additional requests do not change the scroll position.
  .then(() => {
    let children = requestsContainer.childNodes;
    let middleNode = children.item(children.length / 2);
    middleNode.scrollIntoView();
    ok(!scrolledToBottom(requestsContainer), "Not scrolled to bottom.");
    scrollTop = requestsContainer.scrollTop; // save for comparison later
    return waitForNetworkEvents(monitor, 8);
  })
  .then(() => {
    is(requestsContainer.scrollTop, scrollTop, "Did not scroll.");
  })

  // (3) Now set the scroll position back at the bottom and check that
  // additional requests *do* cause the container to scroll down.
  .then(() => {
    requestsContainer.scrollTop = requestsContainer.scrollHeight;
    ok(scrolledToBottom(requestsContainer), "Set scroll position to bottom.");
    return waitForNetworkEvents(monitor, 8);
  })
  .then(() => {
    ok(scrolledToBottom(requestsContainer), "Still scrolled to bottom.");
  })

  // (4) Now select an item in the list and check that additional requests
  // do not change the scroll position.
  .then(() => {
    monitor.panelWin.NetMonitorView.RequestsMenu.selectedIndex = 0;
    return waitForNetworkEvents(monitor, 8);
  })
  .then(() => {
    is(requestsContainer.scrollTop, 0, "Did not scroll.");
  })

  // Done; clean up.
  .then(() => {
    return teardown(monitor).then(finish);
  })

  // Handle exceptions in the chain of promises.
  .then(null, (err) => {
    ok(false, err);
    finish();
  });

  function waitForRequestsToOverflowContainer (aMonitor, aContainer) {
    return waitForNetworkEvents(aMonitor, 1).then(() => {
      if (aContainer.scrollHeight > aContainer.clientHeight) {
        // Wait for some more just for good measure.
        return waitForNetworkEvents(aMonitor, 8);
      } else {
        return waitForRequestsToOverflowContainer(aMonitor, aContainer);
      }
    });
  }

  function scrolledToBottom(aElement) {
    return aElement.scrollTop + aElement.clientHeight >= aElement.scrollHeight;
  }
}