diff --git a/testing/web-platform/tests/common/security-features/tools/generate.py b/testing/web-platform/tests/common/security-features/tools/generate.py index fc10e635dbd0..a97a396e3047 100644 --- a/testing/web-platform/tests/common/security-features/tools/generate.py +++ b/testing/web-platform/tests/common/security-features/tools/generate.py @@ -57,6 +57,45 @@ def dump_test_parameters(selection): selection, indent=2, separators=(',', ': '), sort_keys=True) +def handle_deliveries(policy_deliveries): + ''' + Generate elements and HTTP headers for the given list of + PolicyDelivery. + TODO(hiroshige): Merge duplicated code here, scope/document.py, etc. + ''' + + meta = '' + headers = {} + + for delivery in policy_deliveries: + if delivery.value is None: + continue + if delivery.key == 'referrerPolicy': + if delivery.delivery_type == 'meta': + meta += \ + '' % delivery.value + elif delivery.delivery_type == 'http-rp': + headers['Referrer-Policy'] = delivery.value + # TODO(kristijanburnik): Limit to WPT origins. + headers['Access-Control-Allow-Origin'] = '*' + else: + raise Exception( + 'Invalid delivery_type: %s' % delivery.delivery_type) + elif delivery.key == 'mixedContent': + assert (delivery.value == 'opt-in') + if delivery.delivery_type == 'meta': + meta += '' + elif delivery.delivery_type == 'http-rp': + headers['Content-Security-Policy'] = 'block-all-mixed-content' + else: + raise Exception( + 'Invalid delivery_type: %s' % delivery.delivery_type) + else: + raise Exception('Invalid delivery_key: %s' % delivery.key) + return {"meta": meta, "headers": headers} + + def generate_selection(config, selection, spec, test_html_template_basename): test_parameters = dump_test_parameters(selection) # Adjust the template for the test invoking JS. Indent it to look nice. @@ -109,13 +148,16 @@ def generate_selection(config, selection, spec, test_html_template_basename): except: pass - delivery = config.handleDelivery(selection, spec) + delivery = handle_deliveries([ + util.PolicyDelivery(selection['delivery_type'], + selection['delivery_key'], + selection['delivery_value']) + ]) if len(delivery['headers']) > 0: with open(test_headers_filename, "w") as f: for header in delivery['headers']: - f.write(header) - f.write('\n') + f.write('%s: %s\n' % (header, delivery['headers'][header])) selection['meta_delivery_method'] = delivery['meta'] # Obey the lint and pretty format. diff --git a/testing/web-platform/tests/common/security-features/tools/util.py b/testing/web-platform/tests/common/security-features/tools/util.py index 1f6c86e6efcc..fc8d3b30ef71 100644 --- a/testing/web-platform/tests/common/security-features/tools/util.py +++ b/testing/web-platform/tests/common/security-features/tools/util.py @@ -39,3 +39,14 @@ def load_spec_json(path_to_spec): print(read_nth_line(f, line_number).rstrip()) print(" " * (column - 1) + "^") sys.exit(1) + + +class PolicyDelivery(object): + ''' + See `@typedef PolicyDelivery` comments in `resources/common.js`. + ''' + + def __init__(self, delivery_type, key, value): + self.delivery_type = delivery_type + self.key = key + self.value = value diff --git a/testing/web-platform/tests/mixed-content/generic/tools/generate.py b/testing/web-platform/tests/mixed-content/generic/tools/generate.py index ed978bcef9cc..9c911aa6c410 100755 --- a/testing/web-platform/tests/mixed-content/generic/tools/generate.py +++ b/testing/web-platform/tests/mixed-content/generic/tools/generate.py @@ -48,25 +48,6 @@ expectation: %(expectation)s self.spec_directory = os.path.abspath( os.path.join(script_directory, '..', '..')) - def handleDelivery(self, selection, spec): - delivery_type = selection['delivery_type'] - delivery_value = selection['delivery_value'] - - meta = '' - headers = [] - - if delivery_value is not None: - if delivery_type == 'meta': - meta = '' - elif delivery_type == 'http-rp': - headers.append( - "Content-Security-Policy: block-all-mixed-content") - else: - raise ValueError("Invalid delivery_type %s" % delivery_type) - - return {"meta": meta, "headers": headers} - if __name__ == '__main__': generate.main(MixedContentConfig()) diff --git a/testing/web-platform/tests/referrer-policy/generic/tools/generate.py b/testing/web-platform/tests/referrer-policy/generic/tools/generate.py index 98374982a8d1..ba1e963787be 100755 --- a/testing/web-platform/tests/referrer-policy/generic/tools/generate.py +++ b/testing/web-platform/tests/referrer-policy/generic/tools/generate.py @@ -42,33 +42,6 @@ the target request is %(origin)s.''' self.spec_directory = os.path.abspath( os.path.join(script_directory, '..', '..')) - def handleDelivery(self, selection, spec): - delivery_type = selection['delivery_type'] - delivery_value = selection['delivery_value'] - - meta = '' - headers = [] - if delivery_value != None: - if delivery_type == 'meta': - meta = \ - '' % delivery_value - elif delivery_type == 'http-rp': - meta = \ - "" - headers.append('Referrer-Policy: ' + '%s' % delivery_value) - # TODO(kristijanburnik): Limit to WPT origins. - headers.append('Access-Control-Allow-Origin: *') - elif delivery_type == 'attr': - # attr-referrer is supported by the JS test wrapper. - pass - elif delivery_type == 'rel-noref': - # rel=noreferrer is supported by the JS test wrapper. - pass - else: - raise ValueError('Not implemented delivery_type: ' \ - + delivery_type) - return {"meta": meta, "headers": headers} - if __name__ == '__main__': generate.main(ReferrerPolicyConfig())