File: nested.py

package info (click to toggle)
firefox-esr 140.4.0esr-1~deb13u1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 4,539,284 kB
  • sloc: cpp: 7,381,286; javascript: 6,388,710; ansic: 3,710,139; python: 1,393,780; xml: 628,165; asm: 426,916; java: 184,004; sh: 65,742; makefile: 19,302; objc: 13,059; perl: 12,912; yacc: 4,583; cs: 3,846; pascal: 3,352; lex: 1,720; ruby: 1,226; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10
file content (38 lines) | stat: -rw-r--r-- 1,414 bytes parent folder | download | duplicates (17)
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
def main(request, response):
    origin = request.GET.first(b"origin");
    value = request.GET.first(b"value");
    # This is used to solve the race condition we have for postMessages
    shouldSucceed = request.GET.first(b"loadShouldSucceed", b"false");
    return ([(b"Content-Type", b"text/html")],
            b"""<!DOCTYPE html>
<title>XFO.</title>
<body>
<script>
  var gotMessage = false;
  window.addEventListener("message", e => {
    gotMessage = true;
    window.parent.postMessage(e.data, "*");
  });

  var i = document.createElement("iframe");
  i.src = "%s/x-frame-options/support/xfo.py?value=%s";
  i.onload = _ => {
    // Why 100ms timeout? Because that seems to be enough to stop the
    // load event from racing with the onmessage event, and it's at least
    // as long as the two renderAnimationFrame calls that used to be here.
    setTimeout(_ => {
      // The race condition problem we have is it is possible
      // that the sub iframe is loaded before the postMessage is
      // dispatched, as a result, the "Failed" message is sent
      // out. So the way we fixed is we simply let the timeout
      // to happen if we expect the "Loaded" postMessage to be
      // sent
      if (!gotMessage && %s != true) {
        window.parent.postMessage("Failed", "*");
      }
    }, 100);
  };
  document.body.appendChild(i);
</script>
            """ % (origin, value, shouldSucceed))