commands/FBAutoLayoutCommands.py (93 lines of code) (raw):

#!/usr/bin/python # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. import fbchisellldbbase as fb import fbchisellldbviewhelpers as viewHelpers import lldb def lldbcommands(): return [ FBPrintAutolayoutTrace(), FBAutolayoutBorderAmbiguous(), FBAutolayoutUnborderAmbiguous(), ] class FBPrintAutolayoutTrace(fb.FBCommand): def name(self): return "paltrace" def description(self): return ( "Print the Auto Layout trace for the given view. " "Defaults to the key window." ) def args(self): return [ fb.FBCommandArgument( arg="view", type="UIView *", help="The view to print the Auto Layout trace for.", default="(id)[[UIApplication sharedApplication] keyWindow]", ) ] def run(self, arguments, options): view = fb.evaluateInputExpression(arguments[0]) opt = fb.evaluateBooleanExpression( "[UIView instancesRespondToSelector:@selector(_autolayoutTraceRecursively:)]" ) traceCall = "_autolayoutTraceRecursively:1" if opt else "_autolayoutTrace" print(fb.describeObject("[{} {}]".format(view, traceCall))) def setBorderOnAmbiguousViewRecursive(view, width, color): if not fb.evaluateBooleanExpression( "[(id)%s isKindOfClass:(Class)[UIView class]]" % view ): return isAmbiguous = fb.evaluateBooleanExpression("(BOOL)[%s hasAmbiguousLayout]" % view) if isAmbiguous: layer = viewHelpers.convertToLayer(view) fb.evaluateEffect("[%s setBorderWidth:(CGFloat)%s]" % (layer, width)) fb.evaluateEffect( "[%s setBorderColor:(CGColorRef)[(id)[UIColor %sColor] CGColor]]" % (layer, color) ) subviews = fb.evaluateExpression("(id)[%s subviews]" % view) subviewsCount = int(fb.evaluateExpression("(int)[(id)%s count]" % subviews)) if subviewsCount > 0: for i in range(0, subviewsCount): subview = fb.evaluateExpression("(id)[%s objectAtIndex:%i]" % (subviews, i)) setBorderOnAmbiguousViewRecursive(subview, width, color) class FBAutolayoutBorderAmbiguous(fb.FBCommand): def name(self): return "alamborder" def description(self): return "Put a border around views with an ambiguous layout" def options(self): return [ fb.FBCommandArgument( short="-c", long="--color", arg="color", type="string", default="red", help="A color name such as 'red', 'green', 'magenta', etc.", ), fb.FBCommandArgument( short="-w", long="--width", arg="width", type="CGFloat", default=2.0, help="Desired width of border.", ), ] def run(self, arguments, options): keyWindow = fb.evaluateExpression( "(id)[[UIApplication sharedApplication] keyWindow]" ) setBorderOnAmbiguousViewRecursive(keyWindow, options.width, options.color) lldb.debugger.HandleCommand("caflush") class FBAutolayoutUnborderAmbiguous(fb.FBCommand): def name(self): return "alamunborder" def description(self): return "Removes the border around views with an ambiguous layout" def run(self, arguments, options): keyWindow = fb.evaluateExpression( "(id)[[UIApplication sharedApplication] keyWindow]" ) setBorderOnAmbiguousViewRecursive(keyWindow, 0, "red") lldb.debugger.HandleCommand("caflush")