Source code

Revision control

Copy as Markdown

Other Tools

import random
import time
from wptserve.utils import isomorphic_decode
"""
This script serves
"""
def main(request, response):
inlineOrExternal = request.GET.first(b"inlineOrExternal", b"null")
hasBlockingStylesheet = request.GET.first(b"hasBlockingStylesheet", b"true") == b"true"
result = request.GET.first(b"result", b"success")
type = u"text/javascript" if request.GET.first(b"type", b"classic") == b"classic" else u"module"
response.headers.set(b"Content-Type", b"text/html; charset=utf-8")
response.headers.set(b"Transfer-Encoding", b"chunked")
response.write_status_headers()
# Step 1: Start parsing.
body = u"""<!DOCTYPE html>
<head>
<script>
parent.postMessage("fox", "*");
</script>
"""
if hasBlockingStylesheet:
body += u"""
<link rel="stylesheet" href="slow-flag-setter.py?result=css&cache=%f">
""" % random.random()
body += u"""
</head>
<body>
"""
if inlineOrExternal == b"inline" or inlineOrExternal == b"external" or inlineOrExternal == b"empty-src":
body += u"""
<streaming-element>
"""
# Trigger DOM processing
body += u"A" * 100000
response.writer.write(u"%x\r\n" % len(body))
response.writer.write(body)
response.writer.write(u"\r\n")
body = u""
if inlineOrExternal == b"inline":
time.sleep(1)
body += u"""
<script id="s1" type="%s"
onload="scriptOnLoad()"
onerror="scriptOnError(event)">
if (!window.readyToEvaluate) {
window.didExecute = "executed too early";
} else {
window.didExecute = "executed";
}
""" % type
if result == b"parse-error":
body += u"1=2 parse error\n"
body += u"""
</script>
</streaming-element>
"""
elif inlineOrExternal == b"external":
time.sleep(1)
body += u"""
<script id="s1" type="%s"
src="slow-flag-setter.py?result=%s&cache=%s"
onload="scriptOnLoad()"
onerror="scriptOnError(event)"></script>
</streaming-element>
""" % (type, isomorphic_decode(result), random.random())
elif inlineOrExternal == b"empty-src":
time.sleep(1)
body += u"""
<script id="s1" type="%s"
src=""
onload="scriptOnLoad()"
onerror="scriptOnError(event)"></script>
</streaming-element>
""" % (type,)
# // if readyToEvaluate is false, the script is probably
# // wasn't blocked by stylesheets as expected.
# Trigger DOM processing
body += u"B" * 100000
response.writer.write(u"%x\r\n" % len(body))
response.writer.write(body)
response.writer.write(u"\r\n")
response.writer.write(u"0\r\n")
response.writer.write(u"\r\n")