Update web-platform-tests to revision 0a28ecf697d96db228f8382db0e41f1c54314dad

This commit is contained in:
WPT Sync Bot 2019-04-02 21:51:07 -04:00
parent 1ff56aa84f
commit 52045cb370
106 changed files with 1208 additions and 778 deletions

View file

@ -0,0 +1,18 @@
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
def generate_payload(request, server_data):
file = os.path.join(request.doc_root, "webaudio", "resources",
"sin_440Hz_-6dBFS_1s.wav")
return open(file, "rb").read()
def main(request, response):
handler = lambda data: generate_payload(request, data)
subresource.respond(request,
response,
payload_generator = handler,
access_control_allow_origin = "*",
content_type = "audio/wav")

View file

@ -0,0 +1,11 @@
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
def generate_payload(server_data):
return subresource.get_template("document.html.template") % server_data
def main(request, response):
subresource.respond(request,
response,
payload_generator = generate_payload)

View file

@ -0,0 +1,14 @@
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
def generate_payload(server_data):
return ''
def main(request, response):
subresource.respond(request,
response,
payload_generator = generate_payload,
access_control_allow_origin = "*",
content_type = "text/plain")

View file

@ -0,0 +1,72 @@
import os, sys, base64
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
def generate_payload(request, server_data):
data = ('{"headers": %(headers)s}') % server_data
if "id" in request.GET:
request.server.stash.put(request.GET["id"], data)
# Simple base64 encoded .tff font
return base64.decodestring("AAEAAAANAIAAAwBQRkZUTU6u6MkAAAXcAAAAHE9TLzJWYW"
"QKAAABWAAAAFZjbWFwAA8D7wAAAcAAAAFCY3Z0IAAhAnkA"
"AAMEAAAABGdhc3D//wADAAAF1AAAAAhnbHlmCC6aTwAAAx"
"QAAACMaGVhZO8ooBcAAADcAAAANmhoZWEIkAV9AAABFAAA"
"ACRobXR4EZQAhQAAAbAAAAAQbG9jYQBwAFQAAAMIAAAACm"
"1heHAASQA9AAABOAAAACBuYW1lehAVOgAAA6AAAAIHcG9z"
"dP+uADUAAAWoAAAAKgABAAAAAQAAMhPyuV8PPPUACwPoAA"
"AAAMU4Lm0AAAAAxTgubQAh/5wFeAK8AAAACAACAAAAAAAA"
"AAEAAAK8/5wAWgXcAAAAAAV4AAEAAAAAAAAAAAAAAAAAAA"
"AEAAEAAAAEAAwAAwAAAAAAAgAAAAEAAQAAAEAALgAAAAAA"
"AQXcAfQABQAAAooCvAAAAIwCigK8AAAB4AAxAQIAAAIABg"
"kAAAAAAAAAAAABAAAAAAAAAAAAAAAAUGZFZABAAEEAQQMg"
"/zgAWgK8AGQAAAABAAAAAAAABdwAIQAAAAAF3AAABdwAZA"
"AAAAMAAAADAAAAHAABAAAAAAA8AAMAAQAAABwABAAgAAAA"
"BAAEAAEAAABB//8AAABB////wgABAAAAAAAAAQYAAAEAAA"
"AAAAAAAQIAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAhAnkAAAAqACoAKgBGAAAAAgAhAA"
"ABKgKaAAMABwAusQEALzyyBwQA7TKxBgXcPLIDAgDtMgCx"
"AwAvPLIFBADtMrIHBgH8PLIBAgDtMjMRIREnMxEjIQEJ6M"
"fHApr9ZiECWAAAAwBk/5wFeAK8AAMABwALAAABNSEVATUh"
"FQE1IRUB9AH0/UQDhPu0BRQB9MjI/tTIyP7UyMgAAAAAAA"
"4ArgABAAAAAAAAACYATgABAAAAAAABAAUAgQABAAAAAAAC"
"AAYAlQABAAAAAAADACEA4AABAAAAAAAEAAUBDgABAAAAAA"
"AFABABNgABAAAAAAAGAAUBUwADAAEECQAAAEwAAAADAAEE"
"CQABAAoAdQADAAEECQACAAwAhwADAAEECQADAEIAnAADAA"
"EECQAEAAoBAgADAAEECQAFACABFAADAAEECQAGAAoBRwBD"
"AG8AcAB5AHIAaQBnAGgAdAAgACgAYwApACAAMgAwADAAOA"
"AgAE0AbwB6AGkAbABsAGEAIABDAG8AcgBwAG8AcgBhAHQA"
"aQBvAG4AAENvcHlyaWdodCAoYykgMjAwOCBNb3ppbGxhIE"
"NvcnBvcmF0aW9uAABNAGEAcgBrAEEAAE1hcmtBAABNAGUA"
"ZABpAHUAbQAATWVkaXVtAABGAG8AbgB0AEYAbwByAGcAZQ"
"AgADIALgAwACAAOgAgAE0AYQByAGsAQQAgADoAIAA1AC0A"
"MQAxAC0AMgAwADAAOAAARm9udEZvcmdlIDIuMCA6IE1hcm"
"tBIDogNS0xMS0yMDA4AABNAGEAcgBrAEEAAE1hcmtBAABW"
"AGUAcgBzAGkAbwBuACAAMAAwADEALgAwADAAMAAgAABWZX"
"JzaW9uIDAwMS4wMDAgAABNAGEAcgBrAEEAAE1hcmtBAAAA"
"AgAAAAAAAP+DADIAAAABAAAAAAAAAAAAAAAAAAAAAAAEAA"
"AAAQACACQAAAAAAAH//wACAAAAAQAAAADEPovuAAAAAMU4"
"Lm0AAAAAxTgubQ==");
def generate_report_headers_payload(request, server_data):
stashed_data = request.server.stash.take(request.GET["id"])
return stashed_data
def main(request, response):
handler = lambda data: generate_payload(request, data)
content_type = 'application/x-font-truetype'
if "report-headers" in request.GET:
handler = lambda data: generate_report_headers_payload(request, data)
content_type = 'application/json'
subresource.respond(request,
response,
payload_generator = handler,
content_type = content_type,
access_control_allow_origin = "*")

View file

@ -0,0 +1,114 @@
import os, sys, array, math, StringIO
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
class Image:
"""This class partially implements the interface of the PIL.Image.Image.
One day in the future WPT might support the PIL module or another imaging
library, so this hacky BMP implementation will no longer be required.
"""
def __init__(self, width, height):
self.width = width
self.height = height
self.img = bytearray([0 for i in range(3 * width * height)])
@staticmethod
def new(mode, size, color=0):
return Image(size[0], size[1])
def _int_to_bytes(self, number):
packed_bytes = [0, 0, 0, 0]
for i in range(4):
packed_bytes[i] = number & 0xFF
number >>= 8
return packed_bytes
def putdata(self, color_data):
for y in range(self.height):
for x in range(self.width):
i = x + y * self.width
if i > len(color_data) - 1:
return
self.img[i * 3: i * 3 + 3] = color_data[i][::-1]
def save(self, f, type):
assert type == "BMP"
# 54 bytes of preambule + image color data.
filesize = 54 + 3 * self.width * self.height;
# 14 bytes of header.
bmpfileheader = bytearray(['B', 'M'] + self._int_to_bytes(filesize) +
[0, 0, 0, 0, 54, 0, 0, 0])
# 40 bytes of info.
bmpinfoheader = bytearray([40, 0, 0, 0] +
self._int_to_bytes(self.width) +
self._int_to_bytes(self.height) +
[1, 0, 24] + (25 * [0]))
padlength = (4 - (self.width * 3) % 4) % 4
bmppad = bytearray([0, 0, 0]);
padding = bmppad[0 : padlength]
f.write(bmpfileheader)
f.write(bmpinfoheader)
for i in range(self.height):
offset = self.width * (self.height - i - 1) * 3
f.write(self.img[offset : offset + 3 * self.width])
f.write(padding)
def encode_string_as_bmp_image(string_data):
data_bytes = array.array("B", string_data)
num_bytes = len(data_bytes)
# Convert data bytes to color data (RGB).
color_data = []
num_components = 3
rgb = [0] * num_components
i = 0
for byte in data_bytes:
component_index = i % num_components
rgb[component_index] = byte
if component_index == (num_components - 1) or i == (num_bytes - 1):
color_data.append(tuple(rgb))
rgb = [0] * num_components
i += 1
# Render image.
num_pixels = len(color_data)
sqrt = int(math.ceil(math.sqrt(num_pixels)))
img = Image.new("RGB", (sqrt, sqrt), "black")
img.putdata(color_data)
# Flush image to string.
f = StringIO.StringIO()
img.save(f, "BMP")
f.seek(0)
return f.read()
def generate_payload(request, server_data):
data = ('{"headers": %(headers)s}') % server_data
if "id" in request.GET:
request.server.stash.put(request.GET["id"], data)
data = encode_string_as_bmp_image(data)
return data
def generate_report_headers_payload(request, server_data):
stashed_data = request.server.stash.take(request.GET["id"])
return stashed_data
def main(request, response):
handler = lambda data: generate_payload(request, data)
content_type = 'image/bmp'
if "report-headers" in request.GET:
handler = lambda data: generate_report_headers_payload(request, data)
content_type = 'application/json'
subresource.respond(request,
response,
payload_generator = handler,
content_type = content_type,
access_control_allow_origin = "*")

View file

@ -0,0 +1,13 @@
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
def generate_payload(server_data):
return subresource.get_template("script.js.template") % server_data
def main(request, response):
subresource.respond(request,
response,
payload_generator = generate_payload,
content_type = "application/javascript")

View file

@ -0,0 +1,12 @@
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
def generate_payload(server_data):
return subresource.get_template("shared-worker.js.template") % server_data
def main(request, response):
subresource.respond(request,
response,
payload_generator = generate_payload,
content_type = "application/javascript")

View file

@ -0,0 +1,54 @@
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
def generate_payload(request, server_data):
data = ('{"headers": %(headers)s}') % server_data
type = 'image'
if "type" in request.GET:
type = request.GET["type"]
if "id" in request.GET:
request.server.stash.put(request.GET["id"], data)
if type == 'image':
return subresource.get_template("image.css.template") % {"id": request.GET["id"]}
elif type == 'font':
return subresource.get_template("font.css.template") % {"id": request.GET["id"]}
elif type == 'svg':
return subresource.get_template("svg.css.template") % {
"id": request.GET["id"],
"property": request.GET["property"]}
def generate_import_rule(request, server_data):
return "@import url('%(url)s');" % {
"url": subresource.create_url(request, swap_origin=True,
query_parameter_to_remove="import-rule")
}
def generate_report_headers_payload(request, server_data):
stashed_data = request.server.stash.take(request.GET["id"])
return stashed_data
def main(request, response):
payload_generator = lambda data: generate_payload(request, data)
content_type = "text/css"
referrer_policy = "unsafe-url"
if "import-rule" in request.GET:
payload_generator = lambda data: generate_import_rule(request, data)
if "report-headers" in request.GET:
payload_generator = lambda data: generate_report_headers_payload(request, data)
content_type = 'application/json'
if "referrer-policy" in request.GET:
referrer_policy = request.GET["referrer-policy"]
subresource.respond(
request,
response,
payload_generator = payload_generator,
content_type = content_type,
maybe_additional_headers = { "Referrer-Policy": referrer_policy })

View file

@ -0,0 +1,164 @@
import os, json, urllib, urlparse
def get_template(template_basename):
script_directory = os.path.dirname(os.path.abspath(__file__))
template_directory = os.path.abspath(os.path.join(script_directory,
"template"))
template_filename = os.path.join(template_directory, template_basename);
with open(template_filename, "r") as f:
return f.read()
def redirect(url, response):
response.add_required_headers = False
response.writer.write_status(301)
response.writer.write_header("access-control-allow-origin", "*")
response.writer.write_header("location", url)
response.writer.end_headers()
response.writer.write("")
# TODO(kristijanburnik): subdomain_prefix is a hardcoded value aligned with
# referrer-policy-test-case.js. The prefix should be configured in one place.
def __get_swapped_origin_netloc(netloc, subdomain_prefix = "www1."):
if netloc.startswith(subdomain_prefix):
return netloc[len(subdomain_prefix):]
else:
return subdomain_prefix + netloc
# Creates a URL (typically a redirect target URL) that is the same as the
# current request URL `request.url`, except for:
# - When `swap_scheme` or `swap_origin` is True, its scheme/origin is changed
# to the other one. (http <-> https, ws <-> wss, etc.)
# - `query_parameter_to_remove` parameter is removed from query part.
# Its default is "redirection" to avoid redirect loops.
def create_url(request, swap_scheme = False, swap_origin = False,
query_parameter_to_remove = "redirection"):
parsed = urlparse.urlsplit(request.url)
destination_netloc = parsed.netloc
scheme = parsed.scheme
if swap_scheme:
scheme = "http" if parsed.scheme == "https" else "https"
hostname = parsed.netloc.split(':')[0]
port = request.server.config["ports"][scheme][0]
destination_netloc = ":".join([hostname, str(port)])
if swap_origin:
destination_netloc = __get_swapped_origin_netloc(destination_netloc)
parsed_query = urlparse.parse_qsl(parsed.query, keep_blank_values=True)
parsed_query = filter(lambda x: x[0] != query_parameter_to_remove,
parsed_query)
destination_url = urlparse.urlunsplit(urlparse.SplitResult(
scheme = scheme,
netloc = destination_netloc,
path = parsed.path,
query = urllib.urlencode(parsed_query),
fragment = None))
return destination_url
def preprocess_redirection(request, response):
if "redirection" not in request.GET:
return False
redirection = request.GET["redirection"]
if redirection == "no-redirect":
return False
elif redirection == "keep-scheme-redirect":
redirect_url = create_url(request, swap_scheme=False)
elif redirection == "swap-scheme-redirect":
redirect_url = create_url(request, swap_scheme=True)
elif redirection == "keep-origin-redirect":
redirect_url = create_url(request, swap_origin=False)
elif redirection == "swap-origin-redirect":
redirect_url = create_url(request, swap_origin=True)
else:
raise ValueError("Invalid redirection type '%s'" % redirection)
redirect(redirect_url, response)
return True
def preprocess_stash_action(request, response):
if "action" not in request.GET:
return False
action = request.GET["action"]
key = request.GET["key"]
stash = request.server.stash
path = request.GET.get("path", request.url.split('?'))[0]
if action == "put":
value = request.GET["value"]
stash.take(key=key, path=path)
stash.put(key=key, value=value, path=path)
response_data = json.dumps({"status": "success", "result": key})
elif action == "purge":
value = stash.take(key=key, path=path)
return False
elif action == "take":
value = stash.take(key=key, path=path)
if value is None:
status = "allowed"
else:
status = "blocked"
response_data = json.dumps({"status": status, "result": value})
else:
return False
response.add_required_headers = False
response.writer.write_status(200)
response.writer.write_header("content-type", "text/javascript")
response.writer.write_header("cache-control", "no-cache; must-revalidate")
response.writer.end_headers()
response.writer.write(response_data)
return True
def __noop(request, response):
return ""
def respond(request,
response,
status_code = 200,
content_type = "text/html",
payload_generator = __noop,
cache_control = "no-cache; must-revalidate",
access_control_allow_origin = "*",
maybe_additional_headers = None):
if preprocess_redirection(request, response):
return
if preprocess_stash_action(request, response):
return
response.add_required_headers = False
response.writer.write_status(status_code)
if access_control_allow_origin != None:
response.writer.write_header("access-control-allow-origin",
access_control_allow_origin)
response.writer.write_header("content-type", content_type)
response.writer.write_header("cache-control", cache_control)
additional_headers = maybe_additional_headers or {}
for header, value in additional_headers.items():
response.writer.write_header(header, value)
response.writer.end_headers()
server_data = {"headers": json.dumps(request.headers, indent = 4)}
payload = payload_generator(server_data)
response.writer.write(payload)

View file

@ -0,0 +1,36 @@
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
def generate_payload(request, server_data):
data = ('{"headers": %(headers)s}') % server_data
if "id" in request.GET:
with request.server.stash.lock:
request.server.stash.take(request.GET["id"])
request.server.stash.put(request.GET["id"], data)
return "<svg xmlns='http://www.w3.org/2000/svg'></svg>";
def generate_payload_embedded(request, server_data):
return subresource.get_template("svg.embedded.template") % {
"id": request.GET["id"],
"property": request.GET["property"]};
def generate_report_headers_payload(request, server_data):
stashed_data = request.server.stash.take(request.GET["id"])
return stashed_data
def main(request, response):
handler = lambda data: generate_payload(request, data)
content_type = 'image/svg+xml'
if "embedded-svg" in request.GET:
handler = lambda data: generate_payload_embedded(request, data)
if "report-headers" in request.GET:
handler = lambda data: generate_report_headers_payload(request, data)
content_type = 'application/json'
subresource.respond(request,
response,
payload_generator = handler,
content_type = content_type)

View file

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<title>This page reports back it's request details to the parent frame</title>
</head>
<body>
<script>
var result = {
location: document.location.toString(),
referrer: document.referrer.length > 0 ? document.referrer : undefined,
headers: %(headers)s
};
parent.postMessage(result, "*");
</script>
</body>
</html>

View file

@ -0,0 +1,9 @@
@font-face {
font-family: 'wpt';
font-style: normal;
font-weight: normal;
src: url(/common/security-features/subresource/font.py?id=%(id)s) format('truetype');
}
body {
font-family: 'wpt';
}

View file

@ -0,0 +1,3 @@
div.styled::before {
content:url(/common/security-features/subresource/image.py?id=%(id)s)
}

View file

@ -0,0 +1,3 @@
postMessage({
"headers": %(headers)s
}, "*");

View file

@ -0,0 +1,5 @@
onconnect = function(e) {
e.ports[0].postMessage({
"headers": %(headers)s
});
};

View file

@ -0,0 +1,3 @@
path {
%(property)s: url(/common/security-features/subresource/svg.py?id=%(id)s#invalidFragment);
}

View file

@ -0,0 +1,5 @@
<?xml version='1.0' standalone='no'?>
<?xml-stylesheet href='stylesheet.py?id=%(id)s&amp;type=svg&amp;property=%(property)s' type='text/css'?>
<svg xmlns='http://www.w3.org/2000/svg'>
<path d='M 50,5 95,100 5,100 z' />
</svg>

After

Width:  |  Height:  |  Size: 228 B

View file

@ -0,0 +1,3 @@
postMessage({
"headers": %(headers)s
});

View file

@ -0,0 +1,17 @@
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
def generate_payload(request, server_data):
file = os.path.join(request.doc_root, "media", "movie_5.ogv")
return open(file, "rb").read()
def main(request, response):
handler = lambda data: generate_payload(request, data)
subresource.respond(request,
response,
payload_generator = handler,
access_control_allow_origin = "*",
content_type = "video/ogg")

View file

@ -0,0 +1,12 @@
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
def generate_payload(server_data):
return subresource.get_template("worker.js.template") % server_data
def main(request, response):
subresource.respond(request,
response,
payload_generator = generate_payload,
content_type = "application/javascript")

View file

@ -0,0 +1,15 @@
import os, sys
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import subresource
def generate_payload(server_data):
data = ('{"headers": %(headers)s}') % server_data
return data
def main(request, response):
subresource.respond(request,
response,
payload_generator = generate_payload,
access_control_allow_origin = "*",
content_type = "application/json")