Index: third_party/WebKit/LayoutTests/external/wpt/referrer-policy/generic/subresource/image.py |
diff --git a/third_party/WebKit/LayoutTests/external/wpt/referrer-policy/generic/subresource/image.py b/third_party/WebKit/LayoutTests/external/wpt/referrer-policy/generic/subresource/image.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b6306181e585aafefec68825849ac1709b3e35e7 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/external/wpt/referrer-policy/generic/subresource/image.py |
@@ -0,0 +1,100 @@ |
+import os, sys, array, json, 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(server_data): |
+ data = ('{"headers": %(headers)s}') % server_data |
+ return encode_string_as_bmp_image(data) |
+ |
+def main(request, response): |
+ subresource.respond(request, |
+ response, |
+ payload_generator = generate_payload, |
+ content_type = "image/bmp", |
+ access_control_allow_origin = "*") |