def mutate(self, context) -> bool: c = Random.selector(4) if c == 0 or len(self.declarations) == 0: return self.append(context) elif c == 1: del self.declarations[Random.selector(len(self.declarations))] return self.append(context) else: decl = Random.choice(self.declarations) return decl.mutate(context)
def insert_api(self): line = Random.selector(self.api_count + 1) self.context.shift_object_location(line) self.context.line = line api = self.generate_api() self.apis.insert(line, api) return True
def mutate(self, context) -> bool: if len(self.keyframe_rules) < CSSConfig.max_css_keyframe_count \ and Random.selector(3) == 0: self.append_keyframe_rule(context) return True else: keyframe_name, keyframe_rule = Random.choice( list(self.keyframe_rules.items())) if Random.selector(5) == 0: del self.keyframe_rules[keyframe_name] name = self.generate_keyframe_name() self.keyframe_rules[name] = keyframe_rule keyframe_rule.name = name return True else: return keyframe_rule.mutate(context)
def mutate(self, context) -> bool: c = Random.selector(1 + len(self.args)) if c == 0: return self.this.mutate(context) else: arg = Random.choice(self.args) return arg.mutate(context)
def insert_node(self): element_count = self.dom_tree.element_count if Random.selector(element_count + 1) == 0: element = self.dom_tree.insert_root_element(self.dom_context) else: element = self.dom_tree.insert_element(self.dom_context) return element is not None
def mutate_api(self): if self.api_count == 0: return False line = Random.selector(self.api_count) self.context.line = line api = self.apis[line] return api.mutate(self.context)
def tab_index(): c = Random.selector(3) if c == 0: return "-1" elif c == 1: return str(Random.range(0, 5)) else: return Random.integer()
def mutate(self, context): c = Random.selector(3) if c == 0: self.this.mutate(context) elif c == 1: self.arg.mutate(context) else: self.selector.mutate(context)
def generate(self, _): c = Random.selector(3) if c == 0: self.value = "auto" elif c == 1: self.value = "auto-reverse" else: self.value = Random.integer()
def generate(self, _): c = Random.selector(3) if c == 0: self.value = Random.choice(["auto", "auto-start-reverse"]) elif c == 1: self.value = dv.angle() else: self.value = Random.number()
def generate(self, context): c = Random.selector(5) if c == 0 or c == 1: self.generate_abs() elif c == 2 or c == 3: self.generate_rel1(context) else: self.generate_rel2(context)
def mutate(self, context) -> bool: c = Random.selector(10) if c == 0: self.selector.append(context) return True elif c == 1 or c == 2: return self.selector.mutate(context) else: return self.declaration.mutate(context)
def coords(): c = Random.selector(3) if c == 0: n = 4 elif c == 1: n = 3 else: n = Random.range(3, 5) * 2 return seq([Random.integer() for _ in range(n)])
def mutate(self, context) -> bool: c = Random.selector(3) if c == 0: # 1. mutate one selector = Random.choice(self.selectors) return selector.mutate(context) elif c == 1: # 2. replace one if len(self.selectors) == 0: return False del self.selectors[Random.selector(len(self.selectors))] self.append(context) return True else: if len(self.selectors) >= CSSConfig.max_css_selector_count: return False self.append(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 create_css_basic_selector(scope=None): c = Random.selector(4) if c == 0: return CSSUniversalSelector() elif c == 1: return CSSElementSelector(scope) elif c == 2: return CSSClassSelector() else: return CSSIDSelector(scope)
def generate(self, _): c = Random.selector(4) if c == 0: self.value = "x" elif c == 1: self.value = dv.image_url() elif c == 2: self.value = dv.audio_url() else: self.value = dv.video_url()
def color(): c = Random.selector(5) if c == 0: return Random.choice(["currentColor", "transparent"]) elif c == 1: return Random.choice(["red", "blue", "green", "black", "white"]) elif c == 2: return "#{}".format(Random.hex_digits(Random.choice([6, 8]))) elif c == 3: return "rgb({})".format(seq([Random.hex_byte() for _ in range(3)])) else: return "rgba({})".format(seq([Random.hex_byte() for _ in range(4)]))
def path_cmd(): c = Random.selector(5) if c == 0: return move_to() elif c == 1: return line_to() elif c == 2: return bezier_curve() elif c == 3: return arc_curve() else: return close_path()
def mutate(self, context): c = Random.selector(4) if c == 0: return self.a.mutate(context) elif c == 1: return self.b.mutate(context) elif c == 2: ok = self.a.mutate(context) ok = ok or self.b.mutate(context) return ok else: self.generate(context) return True
def svg_transform(): c = Random.selector(6) if c == 0: return dv.translate() elif c == 1: return dv.scale() elif c == 2: return dv.rotate() elif c == 3: return dv.skew_x() elif c == 4: return dv.skew_y() else: return dv.matrix()
def replace_api(self): if self.api_count == 0: return False trial = 0 while trial < self.api_count: line = Random.selector(self.api_count) self.context.line = line old_api = self.apis[line] if old_api.ret is None: new_api = self.generate_api() self.apis[line] = new_api return True trial += 1 return False
def insert_root_element(self, context): if self.full: return None if Random.selector(5) > 0: name = Random.choice(docs.html_general_child_elements) else: name = Random.choice(docs.html_other_child_elements) child = of.create_object(name) self.add_root_element(child) if child is not None: self.init_element(context, child) return child
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 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(self, context) -> bool: c = Random.selector(4) if c == 0: prop = Random.choice(list(self.props.keys())) value_class = get_css_property_value(prop) value = value_class() value.generate(context) self.props[prop].append(value) return True elif c == 1: prop = Random.choice(list(self.props.keys())) values = self.props[prop] value = Random.choice(values) return value.mutate(context) elif c == 2: self.append_prop(context) return True else: # 3. replace property prop = Random.choice(list(self.props.keys())) del self.props[prop] self.append_prop(context) return True
def bezier_curve(): c = Random.selector(3) if c == 0: cmd = Random.choice(["C", "c"]) x1 = Random.integer() y1 = Random.integer() x2 = Random.integer() y2 = Random.integer() x = Random.integer() y = Random.integer() return "{} {},{} {},{} {},{}".format(cmd, x1, y1, x2, y2, x, y) elif c == 1: cmd = Random.choice(["Q", "q", "S", "s"]) x2 = Random.integer() y2 = Random.integer() x = Random.integer() y = Random.integer() return "{} {},{} {},{}".format(cmd, x2, y2, x, y) else: cmd = Random.choice(["T", "t"]) x = Random.integer() y = Random.integer() return "{} {},{}".format(cmd, x, y)
def mutate(self, context) -> bool: if Random.selector(5) == 0: self.keyframe_rule.name = dv.keyframe_name() return True else: return self.keyframe_rule.mutate(context.global_context)
def replace_css_style_rule(self, context): count = len(self.css_style_rules) if count == 0: return False del self.css_style_rules[Random.selector(count)] return self.append_css_style_rule(context)
def get_token(self, token): return "{}{}".format(token, Random.selector(self.token_limit[token]))