def ellipse(): values = [] if Random.bool(): values.extend([shape_radius(), shape_radius()]) if Random.bool(): values.extend(["at", position()]) return "ellipse({})".format(cat(values))
def srcset(): values = [image_url()] if Random.bool(): values.append("{}w".format(Random.integer())) if Random.bool(): values.append("{}x".format(Random.integer())) return cat(values)
def circle(): values = [] if Random.bool(): values.append(shape_radius()) if Random.bool(): values.extend(["at", position()]) return "circle({})".format(cat(values))
def generate(self, _): if Random.bool(): self.value = "accumulate" else: values = ["new"] if Random.bool(): values.extend([Random.integer() for _ in range(4)]) self.value = cat(values)
def length(relative=False): if (not relative) or Random.bool(): if Random.bool(): return "{}px".format(Random.integer()) else: return "{}em".format(Random.number()) else: return "{}{}".format(Random.integer(), Random.choice(["vw", "vh", "vmin", "vmax"]))
def single(): values = [ "'{}'".format( Random.choice([ "smcp", "c2sc", "zero", "hist", "liga", "tnum", "frac", "swsh", "ss07", "dlig", "vert", "hwid", "twid", "qwid", "kern", "onum" ])) ] if Random.bool(): if Random.bool(): values.append(Random.choice(["on", "off"])) else: values.append(Random.integer()) return cat(values)
def list_size(): if Random.bool(): return Random.range(1, 5) else: # Special sizes that may trigger realloc # See ./animations/crash-when-animation-is-running-while-getting-value.html return Random.choice([7, 8, 9, 15, 16, 17, 31, 32, 33, 63, 64, 65])
def fuzz_css(self): class CSSMode(Enum): Mutate = 1 Append = 2 Replace = 3 Misc = 4 css_modes = [ CSSMode.Mutate, CSSMode.Append, CSSMode.Replace, CSSMode.Misc ] css_weights = [10, 5, 1, 1] trial = 0 while trial < 10: c = Random.choices(css_modes, css_weights)[0] if c == CSSMode.Mutate: ok = self.css.mutate_css_style_rule(self.dom_context) elif c == CSSMode.Append: ok = self.css.append_css_style_rule(self.dom_context) elif c == CSSMode.Replace: ok = self.css.replace_css_style_rule(self.dom_context) else: if Random.bool(): ok = self.css.mutate_css_keyframes_rule(self.dom_context) else: ok = self.css.mutate_css_variable(self.dom_context) assert ok is not None if ok: return True trial += 1 return False
def generate(self, context): if Random.bool(): self.cla = context.global_context.get_token("class") self.elem = None else: self.cla = None self.elem = context.global_context.get_object(docs.elements)
def polygon(): values = [] if Random.bool(): values.append(fill_rule()) num = Random.range(2, 5) for _ in range(num): values.append("{} {}".format(length_percentage(), length_percentage())) return "polygon({})".format(seq(values))
def border_radius(): num = Random.range(1, 4) values = [length_percentage() for _ in range(num)] if Random.bool(): values.append("/") num = Random.range(1, 4) values.extend([length_percentage() for _ in range(num)]) return cat(values)
def get_svg_animatable_attribute(elem): has_regular = elem in svg_animatable_regular_attributes has_presentation = elem in svg_animatable_presentation_attributes if (not has_presentation) or (has_regular and Random.bool()): return Random.choice(svg_animatable_regular_attributes[elem]) else: return Random.choice(svg_animatable_presentation_attributes[elem])
def mutate(self, context) -> bool: if Random.bool(): # 1. mutate selector value return self.selector.mutate(context.global_context) else: # 2. change to another selector self.generate(context) return True
def mutate(self, context) -> bool: if len(self.ths) == 0 or Random.bool(): # 1. add one self.append_th(context) else: # 2. replace one del self.ths[Random.selector(len(self.ths))] self.append_th(context) return True
def font_stretch_value(): if Random.bool(): return Random.choice([ "normal", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded" ]) else: return percentage()
def generate_abs(self): self.elem = None self.action = None self.repeat_num = None self.event = None if Random.bool(): self.abs = dv.clock() else: self.abs = "indefinite"
def line_to(): if Random.bool(): cmd = Random.choice(["L", "l"]) x = Random.integer() y = Random.integer() return "{} {},{}".format(cmd, x, y) else: cmd = Random.choice(["H", "h", "V", "v"]) x = Random.integer() return "{} {}".format(cmd, x)
def generate(self, _): values = [ Random.choice([ "xMinYMin", "xMidYMin", "xMaxYMin", "xMinYMid", "xMidYMid", "xMaxYMid", "xMinYMax", "xMidYMax", "xMaxYMax" ]) ] if Random.bool(): values.append(Random.choice(["meet", "slice"])) self.value = cat(values)
def __init__(self, name): super().__init__(name) self.value_class = None self.value_count = None self.type = None if self.name == "SVGAnimateMotionElement": self.value_class = svg.CoordinateValue if self.name != "SVGSetElement": if Random.bool(): self.value_count = max(1, dv.list_size())
def position(): c = Random.selector(3) if c == 0: values = [Random.choice(["left", "center", "right"])] if Random.bool(): values.append(Random.choice(["top", "center", "bottom"])) return cat(values) elif c == 1: values = [ Random.choice(["left", "center", "right"]), length_percentage() ] if Random.bool(): values.extend([ Random.choice(["top", "center", "bottom"]), length_percentage() ]) return cat(values) else: return cat([length_percentage(), length_percentage()])
def mutate_text(self) -> bool: if Random.bool(): if docs.is_svg_text_element(self.name): self.last_text = Random.string() return True return False else: if self.parent is None or docs.is_svg_text_element( self.parent.name): self.ahead_text = Random.string() return True return False
def generate_dynamic(self, context): self.fill_value = None self.paint_server = context.get_object(docs.svg_paint_server_elements) if self.paint_server is None: self.generate_static() return if Random.bool(): self.color = dv.color() else: self.color = None
def generate(self, _): if Random.bool(): self.value = "normal" else: selectors = Random.selectors(3) values = [] if selectors[0]: values.append("fill") if selectors[1]: values.append("stroke") if selectors[2]: values.append("markers") self.value = cat(values)
def media_query(): media_type = Random.choice(["all", "print", "screen"]) if Random.bool(): return media_type media_feature = Random.choice( ["min-width", "max-width", "min-height", "max-height", "orientation"]) if media_feature == "orientation": media_feature_value = Random.choice(["portrait", "landscape"]) else: media_feature_value = "{}px".format(Random.integer()) return "{} and ({}:{})".format(media_type, media_feature, media_feature_value)
def generate_nodes(self, context): if Random.bool(): self.generate_html_elements(context, TreeConfig.root_element_count) else: self.generate_html_elements(context, TreeConfig.root_element_count) self.generate_svg_elements(context, TreeConfig.root_element_count) # else: # self.generate_svg_elements(context, TreeConfig.root_element_count) for _ in range(self.max_element_count): element = self.insert_element(context) if element is not None: element.generate_text()
def merge(self, other, merge_map): p = q = 0 while p < self.api_count and q < other.api_count: if Random.bool(): p += 1 continue other_api = other.apis[q] other_api.merge_fix(merge_map) self.merge_api(other_api, p) p += 1 q += 1 if q < other.api_count: for i in range(q, other.api_count): self.merge_api(other.apis[i], p) p += 1
def fuzz_js_functions(self): trial = 0 while trial < 10: target_func = self.main if Random.bool() else Random.choice( self.event_handlers) c = Random.selector(4) if c == 0: ok = target_func.append_api() elif c == 1: ok = target_func.insert_api() elif c == 2: ok = target_func.replace_api() else: ok = target_func.mutate_api() if ok: return True trial += 1 return False
def auto_complete(): if Random.bool(): return Random.choice(["on", "off"]) else: return Random.choice([ "name", "honorific-prefix", "given-name", "additional-name", "family-name", "honorific-suffix", "nickname", "email", "username", "new-password", "current-password", "one-time-code", "organization-title", "organization", "street-address", "address-line1", "address-line2", "address-line3", "address-level1", "address-level2", "address-level3", "address-level4", "country", "country-name", "postal-code", "cc-name", "cc-given-name", "cc-additional-name", "cc-family-name", "cc-number", "cc-exp", "cc-exp-month", "cc-exp-year", "cc-csc", "cc-type", "transaction-currency", "transaction-amount", "language", "bday", "bday-day", "bday-month", "bday-year", "sex", "tel", "tel-country-code", "tel-national", "tel-area-code", "tel-local", "tel-extension", "impp", "url", "photo" ])
def generate(self, _): if Random.bool(): self.value = "x" else: self.value = dv.frame_url()
def generate(self, _): if Random.bool(): self.value = "auto" else: self.value = Random.number()