139 lines
4.1 KiB
Python
139 lines
4.1 KiB
Python
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
import json
|
|
from urllib.request import urlretrieve
|
|
|
|
REVISION = "d4a6cff1ad499ac66bcfdf4b5a08dd0cec160225"
|
|
|
|
urlretrieve(
|
|
f"https://raw.githubusercontent.com/WICG/sanitizer-api/{REVISION}/builtins/safe-default-configuration.json",
|
|
"safe-default-configuration.json",
|
|
)
|
|
config = json.load(open("safe-default-configuration.json"))
|
|
|
|
# Make sure there are no unexpected keys (like removeAttributes)
|
|
assert set(config.keys()) == {"elements", "attributes", "comments", "dataAttributes"}
|
|
|
|
assert config["comments"] is False
|
|
assert config["dataAttributes"] is False
|
|
|
|
|
|
def attributes_list(attributes):
|
|
result = []
|
|
|
|
for attr in attributes:
|
|
assert set(attr.keys()) == {"name", "namespace"}
|
|
assert attr["namespace"] is None
|
|
result.append("nsGkAtoms::" + attr["name"])
|
|
|
|
# Should not have duplicate attributes
|
|
assert len(result) == len(set(result))
|
|
|
|
return result
|
|
|
|
|
|
xhtml_elements = []
|
|
mathml_elements = []
|
|
attributes = []
|
|
|
|
xhtml_element_with_attributes = []
|
|
mathml_element_with_attributes = []
|
|
|
|
for element in config["elements"]:
|
|
assert set(element.keys()) == {"name", "namespace", "attributes"}
|
|
|
|
namespace = element["namespace"]
|
|
atom = "nsGkAtoms::" + element["name"]
|
|
|
|
element_attributes = []
|
|
if element["attributes"]:
|
|
assert len(element["attributes"])
|
|
element_attributes.append("/* element */ " + atom)
|
|
element_attributes.extend(attributes_list(element["attributes"]))
|
|
element_attributes.append("nullptr")
|
|
|
|
if namespace == "http://www.w3.org/1999/xhtml":
|
|
xhtml_elements.append(atom)
|
|
xhtml_element_with_attributes.extend(element_attributes)
|
|
elif namespace == "http://www.w3.org/1998/Math/MathML":
|
|
mathml_elements.append(atom)
|
|
mathml_element_with_attributes.extend(element_attributes)
|
|
else:
|
|
raise TypeError(f"unknown namespace: {namespace}")
|
|
|
|
# Should not have duplicate elements
|
|
assert len(set(xhtml_elements)) == len(xhtml_elements)
|
|
assert len(set(mathml_elements)) == len(mathml_elements)
|
|
|
|
|
|
def create_list_body(l):
|
|
return "\n".join(map(lambda atom: f" {atom},", l))
|
|
|
|
|
|
xhtml_elements_body = create_list_body(xhtml_elements)
|
|
mathml_elements_body = create_list_body(mathml_elements)
|
|
|
|
attributes_body = create_list_body(attributes_list(config["attributes"]))
|
|
|
|
xhtml_element_with_attributes_body = create_list_body(
|
|
xhtml_element_with_attributes + ["/* sentinel */ nullptr"]
|
|
)
|
|
mathml_element_with_attributes_body = create_list_body(
|
|
mathml_element_with_attributes + ["/* sentinel */ nullptr"]
|
|
)
|
|
|
|
out = open("SanitizerDefaultConfig.h", "w")
|
|
out.write(
|
|
f"""/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef mozilla_dom_SanitizerDefaultConfig_h
|
|
#define mozilla_dom_SanitizerDefaultConfig_h
|
|
|
|
// This file is automatically generated by update-safe-default-configuration.py
|
|
|
|
#include "mozilla/dom/SanitizerTypes.h"
|
|
#include "SanitizerDefaultConfig.h"
|
|
#include "nsGkAtoms.h"
|
|
|
|
namespace mozilla::dom::sanitizer {{
|
|
|
|
constexpr nsStaticAtom* kDefaultHTMLElements[] = {{
|
|
// clang-format off
|
|
{ xhtml_elements_body }
|
|
// clang-format on
|
|
}};
|
|
|
|
constexpr nsStaticAtom* kDefaultMathMLElements[] = {{
|
|
// clang-format off
|
|
{ mathml_elements_body }
|
|
// clang-format on
|
|
}};
|
|
|
|
constexpr nsStaticAtom* kDefaultAttributes[] = {{
|
|
// clang-format off
|
|
{ attributes_body }
|
|
// clang-format on
|
|
}};
|
|
|
|
// Data is encoded as: element, attributes..., nullptr
|
|
constexpr nsStaticAtom* kHTMLElementWithAttributes[] = {{
|
|
// clang-format off
|
|
{ xhtml_element_with_attributes_body }
|
|
// clang-format on
|
|
}};
|
|
|
|
constexpr nsStaticAtom* kMathMLElementWithAttributes[] = {{
|
|
// clang-format off
|
|
{ mathml_element_with_attributes_body }
|
|
// clang-format on
|
|
}};
|
|
|
|
}} // namespace mozilla::dom::sanitizer
|
|
|
|
#endif // mozilla_dom_SanitizerDefaultConfig_h
|
|
"""
|
|
)
|