You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by so...@apache.org on 2017/06/29 03:33:13 UTC

[2/5] incubator-weex git commit: * [android] clean up csslayout code

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/dom/flex/LayoutEngine.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/flex/LayoutEngine.java b/android/sdk/src/main/java/com/taobao/weex/dom/flex/LayoutEngine.java
deleted file mode 100755
index b6d6cd3..0000000
--- a/android/sdk/src/main/java/com/taobao/weex/dom/flex/LayoutEngine.java
+++ /dev/null
@@ -1,935 +0,0 @@
-/**
- * Copyright (c) 2014, Facebook, Inc. All rights reserved. <p/> This source code is licensed under
- * the BSD-cssstyle license found in the LICENSE file in the root directory of this source tree. An
- * additional grant of patent rights can be found in the PATENTS file in the same directory.
- */
-package com.taobao.weex.dom.flex;
-
-import static com.taobao.weex.dom.flex.CSSLayout.DIMENSION_HEIGHT;
-import static com.taobao.weex.dom.flex.CSSLayout.DIMENSION_WIDTH;
-import static com.taobao.weex.dom.flex.CSSLayout.POSITION_BOTTOM;
-import static com.taobao.weex.dom.flex.CSSLayout.POSITION_LEFT;
-import static com.taobao.weex.dom.flex.CSSLayout.POSITION_RIGHT;
-import static com.taobao.weex.dom.flex.CSSLayout.POSITION_TOP;
-
-/**
- * Calculates layouts based on CSS cssstyle. See {@link #layoutNode(CSSLayoutContext, CSSNode,
- * float, CSSDirection)}.
- */
-@Deprecated
-public class LayoutEngine {
-
-  private static final int CSS_FLEX_DIRECTION_COLUMN =
-      CSSFlexDirection.COLUMN.ordinal();
-  private static final int CSS_FLEX_DIRECTION_COLUMN_REVERSE =
-      CSSFlexDirection.COLUMN_REVERSE.ordinal();
-  private static final int CSS_FLEX_DIRECTION_ROW =
-      CSSFlexDirection.ROW.ordinal();
-  private static final int CSS_FLEX_DIRECTION_ROW_REVERSE =
-      CSSFlexDirection.ROW_REVERSE.ordinal();
-
-  private static final int CSS_POSITION_RELATIVE = CSSPositionType.RELATIVE.ordinal();
-  private static final int CSS_POSITION_ABSOLUTE = CSSPositionType.ABSOLUTE.ordinal();
-
-  private static final int[] leading = {
-      POSITION_TOP,
-      POSITION_BOTTOM,
-      POSITION_LEFT,
-      POSITION_RIGHT,
-  };
-
-  private static final int[] trailing = {
-      POSITION_BOTTOM,
-      POSITION_TOP,
-      POSITION_RIGHT,
-      POSITION_LEFT,
-  };
-
-  private static final int[] pos = {
-      POSITION_TOP,
-      POSITION_BOTTOM,
-      POSITION_LEFT,
-      POSITION_RIGHT,
-  };
-
-  private static final int[] dim = {
-      DIMENSION_HEIGHT,
-      DIMENSION_HEIGHT,
-      DIMENSION_WIDTH,
-      DIMENSION_WIDTH,
-  };
-
-  private static final int[] leadingSpacing = {
-      Spacing.TOP,
-      Spacing.BOTTOM,
-      Spacing.START,
-      Spacing.START
-  };
-
-  private static final int[] trailingSpacing = {
-      Spacing.BOTTOM,
-      Spacing.TOP,
-      Spacing.END,
-      Spacing.END
-  };
-
-  private static float boundAxis(CSSNode node, int axis, float value) {
-    float min = CSSConstants.UNDEFINED;
-    float max = CSSConstants.UNDEFINED;
-
-    if (axis == CSS_FLEX_DIRECTION_COLUMN ||
-        axis == CSS_FLEX_DIRECTION_COLUMN_REVERSE) {
-      min = node.cssstyle.minHeight;
-      max = node.cssstyle.maxHeight;
-    } else if (axis == CSS_FLEX_DIRECTION_ROW ||
-               axis == CSS_FLEX_DIRECTION_ROW_REVERSE) {
-      min = node.cssstyle.minWidth;
-      max = node.cssstyle.maxWidth;
-    }
-
-    float boundValue = value;
-
-    if (!Float.isNaN(max) && max >= 0.0 && boundValue > max) {
-      boundValue = max;
-    }
-    if (!Float.isNaN(min) && min >= 0.0 && boundValue < min) {
-      boundValue = min;
-    }
-
-    return boundValue;
-  }
-
-  private static void setDimensionFromStyle(CSSNode node, int axis) {
-    // The parent already computed us a width or height. We just skip it
-    if (!Float.isNaN(node.csslayout.dimensions[dim[axis]])) {
-      return;
-    }
-    // We only run if there's a width or height defined
-    if (Float.isNaN(node.cssstyle.dimensions[dim[axis]]) ||
-        node.cssstyle.dimensions[dim[axis]] <= 0.0) {
-      return;
-    }
-
-    // The dimensions can never be smaller than the padding and border
-    float maxLayoutDimension = Math.max(
-        boundAxis(node, axis, node.cssstyle.dimensions[dim[axis]]),
-        node.cssstyle.padding.getWithFallback(leadingSpacing[axis], leading[axis]) +
-        node.cssstyle.padding.getWithFallback(trailingSpacing[axis], trailing[axis]) +
-        node.cssstyle.border.getWithFallback(leadingSpacing[axis], leading[axis]) +
-        node.cssstyle.border.getWithFallback(trailingSpacing[axis], trailing[axis]));
-    node.csslayout.dimensions[dim[axis]] = maxLayoutDimension;
-  }
-
-  private static float getRelativePosition(CSSNode node, int axis) {
-    float lead = node.cssstyle.position[leading[axis]];
-    if (!Float.isNaN(lead)) {
-      return lead;
-    }
-
-    float trailingPos = node.cssstyle.position[trailing[axis]];
-    return Float.isNaN(trailingPos) ? 0 : -trailingPos;
-  }
-
-  private static int resolveAxis(
-      int axis,
-      CSSDirection direction) {
-    if (direction == CSSDirection.RTL) {
-      if (axis == CSS_FLEX_DIRECTION_ROW) {
-        return CSS_FLEX_DIRECTION_ROW_REVERSE;
-      } else if (axis == CSS_FLEX_DIRECTION_ROW_REVERSE) {
-        return CSS_FLEX_DIRECTION_ROW;
-      }
-    }
-
-    return axis;
-  }
-
-  private static CSSDirection resolveDirection(CSSNode node, CSSDirection parentDirection) {
-    CSSDirection direction = node.cssstyle.direction;
-    if (direction == CSSDirection.INHERIT) {
-      direction = (parentDirection == null ? CSSDirection.LTR : parentDirection);
-    }
-
-    return direction;
-  }
-
-  private static int getFlexDirection(CSSNode node) {
-    return node.cssstyle.flexDirection.ordinal();
-  }
-
-  private static int getCrossFlexDirection(
-      int axis,
-      CSSDirection direction) {
-    if (axis == CSS_FLEX_DIRECTION_COLUMN ||
-        axis == CSS_FLEX_DIRECTION_COLUMN_REVERSE) {
-      return resolveAxis(CSS_FLEX_DIRECTION_ROW, direction);
-    } else {
-      return CSS_FLEX_DIRECTION_COLUMN;
-    }
-  }
-
-  private static CSSAlign getAlignItem(CSSNode node, CSSNode child) {
-    if (child.cssstyle.alignSelf != CSSAlign.AUTO) {
-      return child.cssstyle.alignSelf;
-    }
-    return node.cssstyle.alignItems;
-  }
-
-  private static boolean isMeasureDefined(CSSNode node) {
-    return node.isMeasureDefined();
-  }
-
-  static boolean needsRelayout(CSSNode node, float parentMaxWidth) {
-    return node.isDirty() ||
-           !FloatUtil.floatsEqual(
-               node.lastLayout.requestedHeight,
-               node.csslayout.dimensions[DIMENSION_HEIGHT]) ||
-           !FloatUtil.floatsEqual(
-               node.lastLayout.requestedWidth,
-               node.csslayout.dimensions[DIMENSION_WIDTH]) ||
-           !FloatUtil.floatsEqual(node.lastLayout.parentMaxWidth, parentMaxWidth);
-  }
-
-  /*package*/
-  static void layoutNode(
-      CSSLayoutContext layoutContext,
-      CSSNode node,
-      float parentMaxWidth,
-      CSSDirection parentDirection) {
-    if (needsRelayout(node, parentMaxWidth)) {
-      node.lastLayout.requestedWidth = node.csslayout.dimensions[DIMENSION_WIDTH];
-      node.lastLayout.requestedHeight = node.csslayout.dimensions[DIMENSION_HEIGHT];
-      node.lastLayout.parentMaxWidth = parentMaxWidth;
-
-      layoutNodeImpl(layoutContext, node, parentMaxWidth, parentDirection);
-      node.updateLastLayout(node.csslayout);
-    } else {
-      node.csslayout.copy(node.lastLayout);
-      node.updateLastLayout(node.lastLayout);//nothing changed
-    }
-
-    node.markHasNewLayout();
-  }
-
-  private static void layoutNodeImpl(
-      CSSLayoutContext layoutContext,
-      CSSNode node,
-      float parentMaxWidth,
-      CSSDirection parentDirection) {
-    for (int i = 0, childCount = node.getChildCount(); i < childCount; i++) {
-      node.getChildAt(i).csslayout.resetResult();
-    }
-    if (!node.isShow()) {
-      return;
-    }
-
-    /** START_GENERATED **/
-
-    CSSDirection direction = resolveDirection(node, parentDirection);
-    int mainAxis = resolveAxis(getFlexDirection(node), direction);
-    int crossAxis = getCrossFlexDirection(mainAxis, direction);
-    int resolvedRowAxis = resolveAxis(CSS_FLEX_DIRECTION_ROW, direction);
-
-    // Handle width and height cssstyle attributes
-    setDimensionFromStyle(node, mainAxis);
-    setDimensionFromStyle(node, crossAxis);
-
-    // Set the resolved resolution in the node's csslayout
-    node.csslayout.direction = direction;
-
-    // The position is set by the parent, but we need to complete it with a
-    // delta composed of the margin and left/top/right/bottom
-    node.csslayout.position[leading[mainAxis]] += node.cssstyle.margin.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) +
-                                                  getRelativePosition(node, mainAxis);
-    node.csslayout.position[trailing[mainAxis]] += node.cssstyle.margin.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]) +
-                                                   getRelativePosition(node, mainAxis);
-    node.csslayout.position[leading[crossAxis]] += node.cssstyle.margin.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) +
-                                                   getRelativePosition(node, crossAxis);
-    node.csslayout.position[trailing[crossAxis]] += node.cssstyle.margin.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis]) +
-                                                    getRelativePosition(node, crossAxis);
-
-    // Inline immutable values from the target node to avoid excessive method
-    // invocations during the csslayout calculation.
-    int childCount = node.getChildCount();
-    float paddingAndBorderAxisResolvedRow = ((node.cssstyle.padding.getWithFallback(leadingSpacing[resolvedRowAxis], leading[resolvedRowAxis]) +
-                                              node.cssstyle.border.getWithFallback(leadingSpacing[resolvedRowAxis], leading[resolvedRowAxis])) +
-                                             (node.cssstyle.padding.getWithFallback(trailingSpacing[resolvedRowAxis], trailing[resolvedRowAxis]) +
-                                              node.cssstyle.border.getWithFallback(trailingSpacing[resolvedRowAxis], trailing[resolvedRowAxis])));
-
-    if (isMeasureDefined(node)) {
-      boolean isResolvedRowDimDefined = !Float.isNaN(node.csslayout.dimensions[dim[resolvedRowAxis]]);
-
-      float width = CSSConstants.UNDEFINED;
-      if ((!Float.isNaN(node.cssstyle.dimensions[dim[resolvedRowAxis]]) && node.cssstyle.dimensions[dim[resolvedRowAxis]] >= 0.0)) {
-        width = node.cssstyle.dimensions[DIMENSION_WIDTH];
-      } else if (isResolvedRowDimDefined) {
-        width = node.csslayout.dimensions[dim[resolvedRowAxis]];
-      } else {
-        width = parentMaxWidth -
-                (node.cssstyle.margin.getWithFallback(leadingSpacing[resolvedRowAxis], leading[resolvedRowAxis]) + node.cssstyle.margin.getWithFallback(trailingSpacing[resolvedRowAxis], trailing[resolvedRowAxis]));
-      }
-      width -= paddingAndBorderAxisResolvedRow;
-
-      // We only need to give a dimension for the text if we haven't got any
-      // for it computed yet. It can either be from the cssstyle attribute or because
-      // the element is flexible.
-      boolean isRowUndefined = !(!Float.isNaN(node.cssstyle.dimensions[dim[resolvedRowAxis]]) && node.cssstyle.dimensions[dim[resolvedRowAxis]] >= 0.0) && !isResolvedRowDimDefined;
-      boolean isColumnUndefined = !(!Float.isNaN(node.cssstyle.dimensions[dim[CSS_FLEX_DIRECTION_COLUMN]]) && node.cssstyle.dimensions[dim[CSS_FLEX_DIRECTION_COLUMN]] >= 0.0) &&
-                                  Float.isNaN(node.csslayout.dimensions[dim[CSS_FLEX_DIRECTION_COLUMN]]);
-
-      // Let's not measure the text if we already know both dimensions
-      if (isRowUndefined || isColumnUndefined) {
-        MeasureOutput measureDim = node.measure(
-
-            layoutContext.measureOutput,
-            width
-                                               );
-        if (isRowUndefined) {
-          node.csslayout.dimensions[DIMENSION_WIDTH] = measureDim.width +
-                                                       paddingAndBorderAxisResolvedRow;
-        }
-        if (isColumnUndefined) {
-          node.csslayout.dimensions[DIMENSION_HEIGHT] = measureDim.height +
-                                                        ((node.cssstyle.padding.getWithFallback(leadingSpacing[CSS_FLEX_DIRECTION_COLUMN], leading[CSS_FLEX_DIRECTION_COLUMN]) + node.cssstyle.border.getWithFallback(leadingSpacing[CSS_FLEX_DIRECTION_COLUMN], leading[CSS_FLEX_DIRECTION_COLUMN])) + (node.cssstyle.padding.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_COLUMN], trailing[CSS_FLEX_DIRECTION_COLUMN]) + node.cssstyle.border.getWithFallback(trailingSpacing[CSS_FLEX_DIRECTION_COLUMN], trailing[CSS_FLEX_DIRECTION_COLUMN])));
-        }
-      }
-      if (childCount == 0) {
-        return;
-      }
-    }
-
-    boolean isNodeFlexWrap = (node.cssstyle.flexWrap == CSSWrap.WRAP);
-
-    CSSJustify justifyContent = node.cssstyle.justifyContent;
-
-    float leadingPaddingAndBorderMain = (node.cssstyle.padding.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) + node.cssstyle.border.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]));
-    float leadingPaddingAndBorderCross = (node.cssstyle.padding.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) + node.cssstyle.border.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]));
-    float paddingAndBorderAxisMain = ((node.cssstyle.padding.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) + node.cssstyle.border.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis])) + (node.cssstyle.padding.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]) + node.cssstyle.border.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis])));
-    float paddingAndBorderAxisCross = ((node.cssstyle.padding.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) + node.cssstyle.border.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis])) + (node.cssstyle.padding.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis]) + node.cssstyle.border.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis])));
-
-    boolean isMainDimDefined = !Float.isNaN(node.csslayout.dimensions[dim[mainAxis]]);
-    boolean isCrossDimDefined = !Float.isNaN(node.csslayout.dimensions[dim[crossAxis]]);
-    boolean isMainRowDirection = (mainAxis == CSS_FLEX_DIRECTION_ROW || mainAxis == CSS_FLEX_DIRECTION_ROW_REVERSE);
-
-    int i;
-    int ii;
-    CSSNode child;
-    int axis;
-
-    CSSNode firstAbsoluteChild = null;
-    CSSNode currentAbsoluteChild = null;
-
-    float definedMainDim = CSSConstants.UNDEFINED;
-    if (isMainDimDefined) {
-      definedMainDim = node.csslayout.dimensions[dim[mainAxis]] - paddingAndBorderAxisMain;
-    }
-
-    // We want to execute the next two loops one per line with flex-wrap
-    int startLine = 0;
-    int endLine = 0;
-    // int nextOffset = 0;
-    int alreadyComputedNextLayout = 0;
-    // We aggregate the total dimensions of the container in those two variables
-    float linesCrossDim = 0;
-    float linesMainDim = 0;
-    int linesCount = 0;
-    while (endLine < childCount) {
-      // <Loop A> Layout non flexible children and count children by type
-
-      // mainContentDim is accumulation of the dimensions and margin of all the
-      // non flexible children. This will be used in order to either set the
-      // dimensions of the node if none already exist, or to compute the
-      // remaining space left for the flexible children.
-      float mainContentDim = 0;
-
-      // There are three kind of children, non flexible, flexible and absolute.
-      // We need to know how many there are in order to distribute the space.
-      int flexibleChildrenCount = 0;
-      float totalFlexible = 0;
-      int nonFlexibleChildrenCount = 0;
-
-      // Use the line loop to position children in the main axis for as long
-      // as they are using a simple stacking behaviour. Children that are
-      // immediately stacked in the initial loop will not be touched again
-      // in <Loop C>.
-      boolean isSimpleStackMain =
-          (isMainDimDefined && justifyContent == CSSJustify.FLEX_START) ||
-          (!isMainDimDefined && justifyContent != CSSJustify.CENTER);
-      int firstComplexMain = (isSimpleStackMain ? childCount : startLine);
-
-      // Use the initial line loop to position children in the cross axis for
-      // as long as they are relatively positioned with alignment STRETCH or
-      // FLEX_START. Children that are immediately stacked in the initial loop
-      // will not be touched again in <Loop D>.
-      boolean isSimpleStackCross = true;
-      int firstComplexCross = childCount;
-
-      CSSNode firstFlexChild = null;
-      CSSNode currentFlexChild = null;
-
-      float mainDim = leadingPaddingAndBorderMain;
-      float crossDim = 0;
-
-      float maxWidth;
-      for (i = startLine; i < childCount; ++i) {
-        child = node.getChildAt(i);
-        if (!child.isShow()) {
-          endLine = i + 1;
-          continue;
-        }
-        child.lineIndex = linesCount;
-
-        child.nextAbsoluteChild = null;
-        child.nextFlexChild = null;
-
-        CSSAlign alignItem = getAlignItem(node, child);
-
-        // Pre-fill cross axis dimensions when the child is using stretch before
-        // we call the recursive csslayout pass
-        if (alignItem == CSSAlign.STRETCH &&
-            child.cssstyle.positionType == CSSPositionType.RELATIVE &&
-            isCrossDimDefined &&
-            !(!Float.isNaN(child.cssstyle.dimensions[dim[crossAxis]]) && child.cssstyle.dimensions[dim[crossAxis]] >= 0.0)) {
-          child.csslayout.dimensions[dim[crossAxis]] = Math.max(
-              boundAxis(child, crossAxis, node.csslayout.dimensions[dim[crossAxis]] -
-                                          paddingAndBorderAxisCross - (child.cssstyle.margin.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) + child.cssstyle.margin.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis]))),
-              // You never want to go smaller than padding
-              ((child.cssstyle.padding.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) + child.cssstyle.border.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis])) + (child.cssstyle.padding.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis]) + child.cssstyle.border.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis])))
-                                                               );
-        } else if (child.cssstyle.positionType == CSSPositionType.ABSOLUTE) {
-          // Store a private linked list of absolutely positioned children
-          // so that we can efficiently traverse them later.
-          if (firstAbsoluteChild == null) {
-            firstAbsoluteChild = child;
-          }
-          if (currentAbsoluteChild != null) {
-            currentAbsoluteChild.nextAbsoluteChild = child;
-          }
-          currentAbsoluteChild = child;
-
-          // Pre-fill dimensions when using absolute position and both offsets for the axis are defined (either both
-          // left and right or top and bottom).
-          for (ii = 0; ii < 2; ii++) {
-            axis = (ii != 0) ? CSS_FLEX_DIRECTION_ROW : CSS_FLEX_DIRECTION_COLUMN;
-            if (!Float.isNaN(node.csslayout.dimensions[dim[axis]]) &&
-                !(!Float.isNaN(child.cssstyle.dimensions[dim[axis]]) && child.cssstyle.dimensions[dim[axis]] >= 0.0) &&
-                !Float.isNaN(child.cssstyle.position[leading[axis]]) &&
-                !Float.isNaN(child.cssstyle.position[trailing[axis]])) {
-              child.csslayout.dimensions[dim[axis]] = Math.max(
-                  boundAxis(child, axis, node.csslayout.dimensions[dim[axis]] -
-                                         ((node.cssstyle.padding.getWithFallback(leadingSpacing[axis], leading[axis]) + node.cssstyle.border.getWithFallback(leadingSpacing[axis], leading[axis])) + (node.cssstyle.padding.getWithFallback(trailingSpacing[axis], trailing[axis]) + node.cssstyle.border.getWithFallback(trailingSpacing[axis], trailing[axis]))) -
-                                         (child.cssstyle.margin.getWithFallback(leadingSpacing[axis], leading[axis]) + child.cssstyle.margin.getWithFallback(trailingSpacing[axis], trailing[axis])) -
-                                         (Float.isNaN(child.cssstyle.position[leading[axis]]) ? 0 : child.cssstyle.position[leading[axis]]) -
-                                         (Float.isNaN(child.cssstyle.position[trailing[axis]]) ? 0 : child.cssstyle.position[trailing[axis]])),
-                  // You never want to go smaller than padding
-                  ((child.cssstyle.padding.getWithFallback(leadingSpacing[axis], leading[axis]) + child.cssstyle.border.getWithFallback(leadingSpacing[axis], leading[axis])) + (child.cssstyle.padding.getWithFallback(trailingSpacing[axis], trailing[axis]) + child.cssstyle.border.getWithFallback(trailingSpacing[axis], trailing[axis])))
-                                                              );
-            }
-          }
-        }
-
-        float nextContentDim = 0;
-
-        // It only makes sense to consider a child flexible if we have a computed
-        // dimension for the node.
-        if (isMainDimDefined && (child.cssstyle.positionType == CSSPositionType.RELATIVE && child.cssstyle.flex > 0)) {
-          flexibleChildrenCount++;
-          totalFlexible += child.cssstyle.flex;
-
-          // Store a private linked list of flexible children so that we can
-          // efficiently traverse them later.
-          if (firstFlexChild == null) {
-            firstFlexChild = child;
-          }
-          if (currentFlexChild != null) {
-            currentFlexChild.nextFlexChild = child;
-          }
-          currentFlexChild = child;
-
-          // Even if we don't know its exact size yet, we already know the padding,
-          // border and margin. We'll use this partial information, which represents
-          // the smallest possible size for the child, to compute the remaining
-          // available space.
-          nextContentDim = ((child.cssstyle.padding.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) + child.cssstyle.border.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis])) + (child.cssstyle.padding.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]) + child.cssstyle.border.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]))) +
-                           (child.cssstyle.margin.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) + child.cssstyle.margin.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]));
-
-        } else {
-          maxWidth = CSSConstants.UNDEFINED;
-          if (!isMainRowDirection) {
-            if ((!Float.isNaN(node.cssstyle.dimensions[dim[resolvedRowAxis]]) && node.cssstyle.dimensions[dim[resolvedRowAxis]] >= 0.0)) {
-              maxWidth = node.csslayout.dimensions[dim[resolvedRowAxis]] -
-                         paddingAndBorderAxisResolvedRow;
-            } else {
-              maxWidth = parentMaxWidth -
-                         (node.cssstyle.margin.getWithFallback(leadingSpacing[resolvedRowAxis], leading[resolvedRowAxis]) + node.cssstyle.margin.getWithFallback(trailingSpacing[resolvedRowAxis], trailing[resolvedRowAxis])) -
-                         paddingAndBorderAxisResolvedRow;
-            }
-          }
-
-          // This is the main recursive call. We csslayout non flexible children.
-          if (alreadyComputedNextLayout == 0) {
-            layoutNode(layoutContext, child, maxWidth, direction);
-          }
-
-          // Absolute positioned elements do not take part of the csslayout, so we
-          // don't use them to compute mainContentDim
-          if (child.cssstyle.positionType == CSSPositionType.RELATIVE) {
-            nonFlexibleChildrenCount++;
-            // At this point we know the final size and margin of the element.
-            nextContentDim = (child.csslayout.dimensions[dim[mainAxis]] + child.cssstyle.margin.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) + child.cssstyle.margin.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]));
-          }
-        }
-
-        // The element we are about to add would make us go to the next line
-        if (isNodeFlexWrap &&
-            isMainDimDefined &&
-            mainContentDim + nextContentDim > definedMainDim &&
-            // If there's only one element, then it's bigger than the content
-            // and needs its own line
-            i != startLine) {
-          nonFlexibleChildrenCount--;
-          alreadyComputedNextLayout = 1;
-          break;
-        }
-
-        // Disable simple stacking in the main axis for the current line as
-        // we found a non-trivial child. The remaining children will be laid out
-        // in <Loop C>.
-        if (isSimpleStackMain &&
-            (child.cssstyle.positionType != CSSPositionType.RELATIVE || (child.cssstyle.positionType == CSSPositionType.RELATIVE && child.cssstyle.flex > 0))) {
-          isSimpleStackMain = false;
-          firstComplexMain = i;
-        }
-
-        // Disable simple stacking in the cross axis for the current line as
-        // we found a non-trivial child. The remaining children will be laid out
-        // in <Loop D>.
-        if (isSimpleStackCross &&
-            (child.cssstyle.positionType != CSSPositionType.RELATIVE ||
-             (alignItem != CSSAlign.STRETCH && alignItem != CSSAlign.FLEX_START) ||
-             Float.isNaN(child.csslayout.dimensions[dim[crossAxis]]))) {
-          isSimpleStackCross = false;
-          firstComplexCross = i;
-        }
-
-        if (isSimpleStackMain) {
-          child.csslayout.position[pos[mainAxis]] += mainDim;
-          if (isMainDimDefined) {
-            child.csslayout.position[trailing[mainAxis]] = node.csslayout.dimensions[dim[mainAxis]] - child.csslayout.dimensions[dim[mainAxis]] - child.csslayout.position[pos[mainAxis]];
-          }
-
-          mainDim += (child.csslayout.dimensions[dim[mainAxis]] + child.cssstyle.margin.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) + child.cssstyle.margin.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]));
-          crossDim = Math.max(crossDim, boundAxis(child, crossAxis, (child.csslayout.dimensions[dim[crossAxis]] + child.cssstyle.margin.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) + child.cssstyle.margin.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis]))));
-        }
-
-        if (isSimpleStackCross) {
-          child.csslayout.position[pos[crossAxis]] += linesCrossDim + leadingPaddingAndBorderCross;
-          if (isCrossDimDefined) {
-            child.csslayout.position[trailing[crossAxis]] = node.csslayout.dimensions[dim[crossAxis]] - child.csslayout.dimensions[dim[crossAxis]] - child.csslayout.position[pos[crossAxis]];
-          }
-        }
-
-        alreadyComputedNextLayout = 0;
-        mainContentDim += nextContentDim;
-        endLine = i + 1;
-      }
-
-      // <Loop B> Layout flexible children and allocate empty space
-
-      // In order to position the elements in the main axis, we have two
-      // controls. The space between the beginning and the first element
-      // and the space between each two elements.
-      float leadingMainDim = 0;
-      float betweenMainDim = 0;
-
-      // The remaining available space that needs to be allocated
-      float remainingMainDim = 0;
-      if (isMainDimDefined) {
-        remainingMainDim = definedMainDim - mainContentDim;
-      } else {
-        remainingMainDim = Math.max(mainContentDim, 0) - mainContentDim;
-      }
-
-      // If there are flexible children in the mix, they are going to fill the
-      // remaining space
-      if (flexibleChildrenCount != 0) {
-        float flexibleMainDim = remainingMainDim / totalFlexible;
-        float baseMainDim;
-        float boundMainDim;
-
-        // If the flex share of remaining space doesn't meet min/max bounds,
-        // remove this child from flex calculations.
-        currentFlexChild = firstFlexChild;
-        while (currentFlexChild != null) {
-          if (currentFlexChild.isShow()) {
-            baseMainDim = flexibleMainDim * currentFlexChild.cssstyle.flex +
-                          ((currentFlexChild.cssstyle.padding.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) + currentFlexChild.cssstyle.border.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis])) + (currentFlexChild.cssstyle.padding.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]) + currentFlexChild.cssstyle.border.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis])));
-            boundMainDim = boundAxis(currentFlexChild, mainAxis, baseMainDim);
-
-            if (baseMainDim != boundMainDim) {
-              remainingMainDim -= boundMainDim;
-              totalFlexible -= currentFlexChild.cssstyle.flex;
-            }
-          }
-          currentFlexChild = currentFlexChild.nextFlexChild;
-        }
-        flexibleMainDim = remainingMainDim / totalFlexible;
-
-        // The non flexible children can overflow the container, in this case
-        // we should just assume that there is no space available.
-        if (flexibleMainDim < 0) {
-          flexibleMainDim = 0;
-        }
-
-        currentFlexChild = firstFlexChild;
-        while (currentFlexChild != null) {
-          if (currentFlexChild.isShow()) {
-            // At this point we know the final size of the element in the main
-            // dimension
-            currentFlexChild.csslayout.dimensions[dim[mainAxis]] = boundAxis(currentFlexChild, mainAxis,
-                                                                             flexibleMainDim * currentFlexChild.cssstyle.flex +
-                                                                             ((currentFlexChild.cssstyle.padding.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) + currentFlexChild.cssstyle.border.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis])) + (currentFlexChild.cssstyle.padding.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]) + currentFlexChild.cssstyle.border.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis])))
-                                                                            );
-
-            maxWidth = CSSConstants.UNDEFINED;
-            if ((!Float.isNaN(node.cssstyle.dimensions[dim[resolvedRowAxis]]) && node.cssstyle.dimensions[dim[resolvedRowAxis]] >= 0.0)) {
-              maxWidth = node.csslayout.dimensions[dim[resolvedRowAxis]] -
-                         paddingAndBorderAxisResolvedRow;
-            } else if (!isMainRowDirection) {
-              maxWidth = parentMaxWidth -
-                         (node.cssstyle.margin.getWithFallback(leadingSpacing[resolvedRowAxis], leading[resolvedRowAxis]) + node.cssstyle.margin.getWithFallback(trailingSpacing[resolvedRowAxis], trailing[resolvedRowAxis])) -
-                         paddingAndBorderAxisResolvedRow;
-            }
-
-            // And we recursively call the csslayout algorithm for this child
-            layoutNode(layoutContext, currentFlexChild, maxWidth, direction);
-          }
-          child = currentFlexChild;
-          currentFlexChild = currentFlexChild.nextFlexChild;
-          child.nextFlexChild = null;
-        }
-
-        // We use justifyContent to figure out how to allocate the remaining
-        // space available
-      } else if (justifyContent != CSSJustify.FLEX_START) {
-        if (justifyContent == CSSJustify.CENTER) {
-          leadingMainDim = remainingMainDim / 2;
-        } else if (justifyContent == CSSJustify.FLEX_END) {
-          leadingMainDim = remainingMainDim;
-        } else if (justifyContent == CSSJustify.SPACE_BETWEEN) {
-          remainingMainDim = Math.max(remainingMainDim, 0);
-          if (flexibleChildrenCount + nonFlexibleChildrenCount - 1 != 0) {
-            betweenMainDim = remainingMainDim /
-                             (flexibleChildrenCount + nonFlexibleChildrenCount - 1);
-          } else {
-            betweenMainDim = 0;
-          }
-        } else if (justifyContent == CSSJustify.SPACE_AROUND) {
-          // Space on the edges is half of the space between elements
-          betweenMainDim = remainingMainDim /
-                           (flexibleChildrenCount + nonFlexibleChildrenCount);
-          leadingMainDim = betweenMainDim / 2;
-        }
-      }
-
-      // <Loop C> Position elements in the main axis and compute dimensions
-
-      // At this point, all the children have their dimensions set. We need to
-      // find their position. In order to do that, we accumulate data in
-      // variables that are also useful to compute the total dimensions of the
-      // container!
-      mainDim += leadingMainDim;
-
-      for (i = firstComplexMain; i < endLine; ++i) {
-        child = node.getChildAt(i);
-        if (!child.isShow()) {
-          continue;
-        }
-
-        if (child.cssstyle.positionType == CSSPositionType.ABSOLUTE &&
-            !Float.isNaN(child.cssstyle.position[leading[mainAxis]])) {
-          // In case the child is position absolute and has left/top being
-          // defined, we override the position to whatever the user said
-          // (and margin/border).
-          child.csslayout.position[pos[mainAxis]] = (Float.isNaN(child.cssstyle.position[leading[mainAxis]]) ? 0 : child.cssstyle.position[leading[mainAxis]]) +
-                                                    node.cssstyle.border.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) +
-                                                    child.cssstyle.margin.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]);
-        } else {
-          // If the child is position absolute (without top/left) or relative,
-          // we put it at the current accumulated offset.
-          child.csslayout.position[pos[mainAxis]] += mainDim;
-
-          // Define the trailing position accordingly.
-          if (isMainDimDefined) {
-            child.csslayout.position[trailing[mainAxis]] = node.csslayout.dimensions[dim[mainAxis]] - child.csslayout.dimensions[dim[mainAxis]] - child.csslayout.position[pos[mainAxis]];
-          }
-
-          // Now that we placed the element, we need to update the variables
-          // We only need to do that for relative elements. Absolute elements
-          // do not take part in that phase.
-          if (child.cssstyle.positionType == CSSPositionType.RELATIVE) {
-            // The main dimension is the sum of all the elements dimension plus
-            // the spacing.
-            mainDim += betweenMainDim + (child.csslayout.dimensions[dim[mainAxis]] + child.cssstyle.margin.getWithFallback(leadingSpacing[mainAxis], leading[mainAxis]) + child.cssstyle.margin.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]));
-            // The cross dimension is the max of the elements dimension since there
-            // can only be one element in that cross dimension.
-            crossDim = Math.max(crossDim, boundAxis(child, crossAxis, (child.csslayout.dimensions[dim[crossAxis]] + child.cssstyle.margin.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) + child.cssstyle.margin.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis]))));
-          }
-        }
-      }
-
-      float containerCrossAxis = node.csslayout.dimensions[dim[crossAxis]];
-      if (!isCrossDimDefined) {
-        containerCrossAxis = Math.max(
-            // For the cross dim, we add both sides at the end because the value
-            // is aggregate via a max function. Intermediate negative values
-            // can mess this computation otherwise
-            boundAxis(node, crossAxis, crossDim + paddingAndBorderAxisCross),
-            paddingAndBorderAxisCross
-                                     );
-      }
-
-      // <Loop D> Position elements in the cross axis
-      for (i = firstComplexCross; i < endLine; ++i) {
-        child = node.getChildAt(i);
-        if (!child.isShow()) {
-          continue;
-        }
-
-        if (child.cssstyle.positionType == CSSPositionType.ABSOLUTE &&
-            !Float.isNaN(child.cssstyle.position[leading[crossAxis]])) {
-          // In case the child is absolutely positionned and has a
-          // top/left/bottom/right being set, we override all the previously
-          // computed positions to set it correctly.
-          child.csslayout.position[pos[crossAxis]] = (Float.isNaN(child.cssstyle.position[leading[crossAxis]]) ? 0 : child.cssstyle.position[leading[crossAxis]]) +
-                                                     node.cssstyle.border.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) +
-                                                     child.cssstyle.margin.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]);
-
-        } else {
-          float leadingCrossDim = leadingPaddingAndBorderCross;
-
-          // For a relative children, we're either using alignItems (parent) or
-          // alignSelf (child) in order to determine the position in the cross axis
-          if (child.cssstyle.positionType == CSSPositionType.RELATIVE) {
-            /*eslint-disable */
-            // This variable is intentionally re-defined as the code is transpiled to a block scope language
-            CSSAlign alignItem = getAlignItem(node, child);
-            /*eslint-enable */
-            if (alignItem == CSSAlign.STRETCH) {
-              // You can only stretch if the dimension has not already been set
-              // previously.
-              if (Float.isNaN(child.csslayout.dimensions[dim[crossAxis]])) {
-                child.csslayout.dimensions[dim[crossAxis]] = Math.max(
-                    boundAxis(child, crossAxis, containerCrossAxis -
-                                                paddingAndBorderAxisCross - (child.cssstyle.margin.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) + child.cssstyle.margin.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis]))),
-                    // You never want to go smaller than padding
-                    ((child.cssstyle.padding.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) + child.cssstyle.border.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis])) + (child.cssstyle.padding.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis]) + child.cssstyle.border.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis])))
-                                                                     );
-              }
-            } else if (alignItem != CSSAlign.FLEX_START) {
-              // The remaining space between the parent dimensions+padding and child
-              // dimensions+margin.
-              float remainingCrossDim = containerCrossAxis -
-                                        paddingAndBorderAxisCross - (child.csslayout.dimensions[dim[crossAxis]] + child.cssstyle.margin.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) + child.cssstyle.margin.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis]));
-
-              if (alignItem == CSSAlign.CENTER) {
-                leadingCrossDim += remainingCrossDim / 2;
-              } else { // CSSAlign.FLEX_END
-                leadingCrossDim += remainingCrossDim;
-              }
-            }
-          }
-
-          // And we apply the position
-          child.csslayout.position[pos[crossAxis]] += linesCrossDim + leadingCrossDim;
-
-          // Define the trailing position accordingly.
-          if (isCrossDimDefined) {
-            child.csslayout.position[trailing[crossAxis]] = node.csslayout.dimensions[dim[crossAxis]] - child.csslayout.dimensions[dim[crossAxis]] - child.csslayout.position[pos[crossAxis]];
-          }
-        }
-      }
-
-      linesCrossDim += crossDim;
-      linesMainDim = Math.max(linesMainDim, mainDim);
-      linesCount += 1;
-      startLine = endLine;
-    }
-
-    // <Loop E>
-    //
-    // Note(prenaux): More than one line, we need to csslayout the crossAxis
-    // according to alignContent.
-    //
-    // Note that we could probably remove <Loop D> and handle the one line case
-    // here too, but for the moment this is safer since it won't interfere with
-    // previously working code.
-    //
-    // See specs:
-    // http://www.w3.org/TR/2012/CR-css3-flexbox-20120918/#csslayout-algorithm
-    // section 9.4
-    //
-    if (linesCount > 1 && isCrossDimDefined) {
-      float nodeCrossAxisInnerSize = node.csslayout.dimensions[dim[crossAxis]] -
-                                     paddingAndBorderAxisCross;
-      float remainingAlignContentDim = nodeCrossAxisInnerSize - linesCrossDim;
-
-      float crossDimLead = 0;
-      float currentLead = leadingPaddingAndBorderCross;
-
-      CSSAlign alignContent = node.cssstyle.alignContent;
-      if (alignContent == CSSAlign.FLEX_END) {
-        currentLead += remainingAlignContentDim;
-      } else if (alignContent == CSSAlign.CENTER) {
-        currentLead += remainingAlignContentDim / 2;
-      } else if (alignContent == CSSAlign.STRETCH) {
-        if (nodeCrossAxisInnerSize > linesCrossDim) {
-          crossDimLead = (remainingAlignContentDim / linesCount);
-        }
-      }
-
-      int endIndex = 0;
-      for (i = 0; i < linesCount; ++i) {
-        int startIndex = endIndex;
-
-        // compute the line's height and find the endIndex
-        float lineHeight = 0;
-        for (ii = startIndex; ii < childCount; ++ii) {
-          child = node.getChildAt(ii);
-
-          if (!child.isShow() || child.cssstyle.positionType != CSSPositionType.RELATIVE) {
-            continue;
-          }
-          if (child.lineIndex != i) {
-            break;
-          }
-          if (!Float.isNaN(child.csslayout.dimensions[dim[crossAxis]])) {
-            lineHeight = Math.max(
-                lineHeight,
-                child.csslayout.dimensions[dim[crossAxis]] + (child.cssstyle.margin.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]) + child.cssstyle.margin.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis]))
-                                 );
-          }
-        }
-        endIndex = ii;
-        lineHeight += crossDimLead;
-
-        for (ii = startIndex; ii < endIndex; ++ii) {
-          child = node.getChildAt(ii);
-
-          if (!child.isShow() || child.cssstyle.positionType != CSSPositionType.RELATIVE) {
-            continue;
-          }
-
-          CSSAlign alignContentAlignItem = getAlignItem(node, child);
-          if (alignContentAlignItem == CSSAlign.FLEX_START) {
-            child.csslayout.position[pos[crossAxis]] = currentLead + child.cssstyle.margin.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]);
-          } else if (alignContentAlignItem == CSSAlign.FLEX_END) {
-            child.csslayout.position[pos[crossAxis]] = currentLead + lineHeight - child.cssstyle.margin.getWithFallback(trailingSpacing[crossAxis], trailing[crossAxis]) - child.csslayout.dimensions[dim[crossAxis]];
-          } else if (alignContentAlignItem == CSSAlign.CENTER) {
-            float childHeight = child.csslayout.dimensions[dim[crossAxis]];
-            child.csslayout.position[pos[crossAxis]] = currentLead + (lineHeight - childHeight) / 2;
-          } else if (alignContentAlignItem == CSSAlign.STRETCH) {
-            child.csslayout.position[pos[crossAxis]] = currentLead + child.cssstyle.margin.getWithFallback(leadingSpacing[crossAxis], leading[crossAxis]);
-            // TODO(prenaux): Correctly set the height of items with undefined
-            //                (auto) crossAxis dimension.
-          }
-        }
-
-        currentLead += lineHeight;
-      }
-    }
-
-    boolean needsMainTrailingPos = false;
-    boolean needsCrossTrailingPos = false;
-
-    // If the user didn't specify a width or height, and it has not been set
-    // by the container, then we set it via the children.
-    if (!isMainDimDefined) {
-      node.csslayout.dimensions[dim[mainAxis]] = Math.max(
-          // We're missing the last padding at this point to get the final
-          // dimension
-          boundAxis(node, mainAxis, linesMainDim + (node.cssstyle.padding.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]) + node.cssstyle.border.getWithFallback(trailingSpacing[mainAxis], trailing[mainAxis]))),
-          // We can never assign a width smaller than the padding and borders
-          paddingAndBorderAxisMain
-                                                         );
-
-      if (mainAxis == CSS_FLEX_DIRECTION_ROW_REVERSE ||
-          mainAxis == CSS_FLEX_DIRECTION_COLUMN_REVERSE) {
-        needsMainTrailingPos = true;
-      }
-    }
-
-    if (!isCrossDimDefined) {
-      node.csslayout.dimensions[dim[crossAxis]] = Math.max(
-          // For the cross dim, we add both sides at the end because the value
-          // is aggregate via a max function. Intermediate negative values
-          // can mess this computation otherwise
-          boundAxis(node, crossAxis, linesCrossDim + paddingAndBorderAxisCross),
-          paddingAndBorderAxisCross
-                                                          );
-
-      if (crossAxis == CSS_FLEX_DIRECTION_ROW_REVERSE ||
-          crossAxis == CSS_FLEX_DIRECTION_COLUMN_REVERSE) {
-        needsCrossTrailingPos = true;
-      }
-    }
-
-    // <Loop F> Set trailing position if necessary
-    if (needsMainTrailingPos || needsCrossTrailingPos) {
-      for (i = 0; i < childCount; ++i) {
-        child = node.getChildAt(i);
-        if (!child.isShow()) {
-          continue;
-        }
-
-        if (needsMainTrailingPos) {
-          child.csslayout.position[trailing[mainAxis]] = node.csslayout.dimensions[dim[mainAxis]] - child.csslayout.dimensions[dim[mainAxis]] - child.csslayout.position[pos[mainAxis]];
-        }
-
-        if (needsCrossTrailingPos) {
-          child.csslayout.position[trailing[crossAxis]] = node.csslayout.dimensions[dim[crossAxis]] - child.csslayout.dimensions[dim[crossAxis]] - child.csslayout.position[pos[crossAxis]];
-        }
-      }
-    }
-
-    // <Loop G> Calculate dimensions for absolutely positioned elements
-    currentAbsoluteChild = firstAbsoluteChild;
-    while (currentAbsoluteChild != null) {
-      if (currentAbsoluteChild.isShow()) {
-        // Pre-fill dimensions when using absolute position and both offsets for
-        // the axis are defined (either both left and right or top and bottom).
-        for (ii = 0; ii < 2; ii++) {
-          axis = (ii != 0) ? CSS_FLEX_DIRECTION_ROW : CSS_FLEX_DIRECTION_COLUMN;
-
-          if (!Float.isNaN(node.csslayout.dimensions[dim[axis]]) &&
-              !(!Float.isNaN(currentAbsoluteChild.cssstyle.dimensions[dim[axis]]) && currentAbsoluteChild.cssstyle.dimensions[dim[axis]] >= 0.0) &&
-              !Float.isNaN(currentAbsoluteChild.cssstyle.position[leading[axis]]) &&
-              !Float.isNaN(currentAbsoluteChild.cssstyle.position[trailing[axis]])) {
-            currentAbsoluteChild.csslayout.dimensions[dim[axis]] = Math.max(
-                boundAxis(currentAbsoluteChild, axis, node.csslayout.dimensions[dim[axis]] -
-                                                      (node.cssstyle.border.getWithFallback(leadingSpacing[axis], leading[axis]) + node.cssstyle.border.getWithFallback(trailingSpacing[axis], trailing[axis])) -
-                                                      (currentAbsoluteChild.cssstyle.margin.getWithFallback(leadingSpacing[axis], leading[axis]) + currentAbsoluteChild.cssstyle.margin.getWithFallback(trailingSpacing[axis], trailing[axis])) -
-                                                      (Float.isNaN(currentAbsoluteChild.cssstyle.position[leading[axis]]) ? 0 : currentAbsoluteChild.cssstyle.position[leading[axis]]) -
-                                                      (Float.isNaN(currentAbsoluteChild.cssstyle.position[trailing[axis]]) ? 0 : currentAbsoluteChild.cssstyle.position[trailing[axis]])
-                         ),
-                // You never want to go smaller than padding
-                ((currentAbsoluteChild.cssstyle.padding.getWithFallback(leadingSpacing[axis], leading[axis]) + currentAbsoluteChild.cssstyle.border.getWithFallback(leadingSpacing[axis], leading[axis])) + (currentAbsoluteChild.cssstyle.padding.getWithFallback(trailingSpacing[axis], trailing[axis]) + currentAbsoluteChild.cssstyle.border.getWithFallback(trailingSpacing[axis], trailing[axis])))
-                                                                           );
-          }
-
-          if (!Float.isNaN(currentAbsoluteChild.cssstyle.position[trailing[axis]]) &&
-              !!Float.isNaN(currentAbsoluteChild.cssstyle.position[leading[axis]])) {
-            currentAbsoluteChild.csslayout.position[leading[axis]] =
-                node.csslayout.dimensions[dim[axis]] -
-                currentAbsoluteChild.csslayout.dimensions[dim[axis]] -
-                (Float.isNaN(currentAbsoluteChild.cssstyle.position[trailing[axis]]) ? 0 : currentAbsoluteChild.cssstyle.position[trailing[axis]]);
-          }
-        }
-      }
-      child = currentAbsoluteChild;
-      currentAbsoluteChild = currentAbsoluteChild.nextAbsoluteChild;
-      child.nextAbsoluteChild = null;
-    }
-  }
-  /** END_GENERATED **/
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/dom/flex/MeasureOutput.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/flex/MeasureOutput.java b/android/sdk/src/main/java/com/taobao/weex/dom/flex/MeasureOutput.java
deleted file mode 100755
index 90c2134..0000000
--- a/android/sdk/src/main/java/com/taobao/weex/dom/flex/MeasureOutput.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * Copyright (c) 2014, Facebook, Inc. All rights reserved. <p/> This source code is licensed under
- * the BSD-style license found in the LICENSE file in the root directory of this source tree. An
- * additional grant of patent rights can be found in the PATENTS file in the same directory.
- */
-package com.taobao.weex.dom.flex;
-
-/**
- * POJO to hold the output of the measure function.
- */
-@Deprecated
-public class MeasureOutput {
-
-  public float width;
-  public float height;
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/dom/flex/Spacing.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/flex/Spacing.java b/android/sdk/src/main/java/com/taobao/weex/dom/flex/Spacing.java
deleted file mode 100755
index 6a08be7..0000000
--- a/android/sdk/src/main/java/com/taobao/weex/dom/flex/Spacing.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/**
- * Copyright (c) 2014, Facebook, Inc. All rights reserved. <p/> This source code is licensed under
- * the BSD-style license found in the LICENSE file in the root directory of this source tree. An
- * additional grant of patent rights can be found in the PATENTS file in the same directory.
- */
-package com.taobao.weex.dom.flex;
-
-//import javax.annotation.Nullable;
-
-import java.util.Arrays;
-
-/**
- * Class representing CSS spacing (padding, margin, and borders). This is mostly necessary to
- * properly implement interactions and updates for properties like margin, marginLeft, and
- * marginHorizontal.
- */
-@Deprecated
-public class Spacing /**implements Cloneable**/
-{
-
-  /**
-   * Spacing type that represents the left direction. E.g. {@code marginLeft}.
-   */
-  public static final int LEFT = 0;
-  /**
-   * Spacing type that represents the top direction. E.g. {@code marginTop}.
-   */
-  public static final int TOP = 1;
-  /**
-   * Spacing type that represents the right direction. E.g. {@code marginRight}.
-   */
-  public static final int RIGHT = 2;
-  /**
-   * Spacing type that represents the bottom direction. E.g. {@code marginBottom}.
-   */
-  public static final int BOTTOM = 3;
-  /**
-   * Spacing type that represents vertical direction (top and bottom). E.g. {@code marginVertical}.
-   */
-  public static final int VERTICAL = 4;
-  /**
-   * Spacing type that represents horizontal direction (left and right). E.g.
-   * {@code marginHorizontal}.
-   */
-  public static final int HORIZONTAL = 5;
-  /**
-   * Spacing type that represents start direction e.g. left in left-to-right, right in right-to-left.
-   */
-  public static final int START = 6;
-  /**
-   * Spacing type that represents end direction e.g. right in left-to-right, left in right-to-left.
-   */
-  public static final int END = 7;
-  /**
-   * Spacing type that represents all directions (left, top, right, bottom). E.g. {@code margin}.
-   */
-  public static final int ALL = 8;
-
-  private static final int[] sFlagsMap = {
-      1, /*LEFT*/
-      2, /*TOP*/
-      4, /*RIGHT*/
-      8, /*BOTTOM*/
-      16, /*VERTICAL*/
-      32, /*HORIZONTAL*/
-      64, /*START*/
-      128, /*END*/
-      256, /*ALL*/
-  };
-
-  private final float[] mSpacing = newFullSpacingArray();
-  private float[] mDefaultSpacing = null;
-  private int mValueFlags = 0;
-  private boolean mHasAliasesSet;
-
-  private static float[] newFullSpacingArray() {
-    return new float[]{
-        CSSConstants.UNDEFINED,
-        CSSConstants.UNDEFINED,
-        CSSConstants.UNDEFINED,
-        CSSConstants.UNDEFINED,
-        CSSConstants.UNDEFINED,
-        CSSConstants.UNDEFINED,
-        CSSConstants.UNDEFINED,
-        CSSConstants.UNDEFINED,
-        CSSConstants.UNDEFINED,
-    };
-  }
-
-  /**
-   * Set a spacing value.
-   *
-   * @param spacingType one of {@link #LEFT}, {@link #TOP}, {@link #RIGHT}, {@link #BOTTOM},
-   *        {@link #VERTICAL}, {@link #HORIZONTAL}, {@link #ALL}
-   * @param value the value for this direction
-   * @return {@code true} if the spacing has changed, or {@code false} if the same value was already
-   *         set
-   */
-  public boolean set(int spacingType, float value) {
-    if (!FloatUtil.floatsEqual(mSpacing[spacingType], value)) {
-      mSpacing[spacingType] = value;
-
-      if (CSSConstants.isUndefined(value)) {
-        mValueFlags &= ~sFlagsMap[spacingType];
-      } else {
-        mValueFlags |= sFlagsMap[spacingType];
-      }
-
-      mHasAliasesSet =
-          (mValueFlags & sFlagsMap[ALL]) != 0 ||
-          (mValueFlags & sFlagsMap[VERTICAL]) != 0 ||
-          (mValueFlags & sFlagsMap[HORIZONTAL]) != 0;
-
-      return true;
-    }
-    return false;
-  }
-
-  /**
-   * Set a default spacing value. This is used as a fallback when no spacing has been set for a
-   * particular direction.
-   *
-   * @param spacingType one of {@link #LEFT}, {@link #TOP}, {@link #RIGHT}, {@link #BOTTOM}
-   * @param value the default value for this direction
-   * @return
-   */
-  public boolean setDefault(int spacingType, float value) {
-    if (mDefaultSpacing == null) {
-      mDefaultSpacing = newSpacingResultArray();
-    }
-    if (!FloatUtil.floatsEqual(mDefaultSpacing[spacingType], value)) {
-      mDefaultSpacing[spacingType] = value;
-      return true;
-    }
-    return false;
-  }
-
-  private static float[] newSpacingResultArray() {
-    return newSpacingResultArray(0);
-  }
-
-  private static float[] newSpacingResultArray(float defaultValue) {
-    return new float[]{
-        defaultValue,
-        defaultValue,
-        defaultValue,
-        defaultValue,
-        defaultValue,
-        defaultValue,
-        CSSConstants.UNDEFINED,
-        CSSConstants.UNDEFINED,
-        defaultValue,
-    };
-  }
-
-  /**
-   * Get the raw value (that was set using {@link #set(int, float)}), without taking into account
-   * any default values.
-   *
-   * @param spacingType one of {@link #LEFT}, {@link #TOP}, {@link #RIGHT}, {@link #BOTTOM},
-   *        {@link #VERTICAL}, {@link #HORIZONTAL}, {@link #ALL}
-   */
-  public float getRaw(int spacingType) {
-    return mSpacing[spacingType];
-  }
-
-  /**
-   * Resets the spacing instance to its default state. This method is meant to be used when
-   * recycling {@link Spacing} instances.
-   */
-  void reset() {
-    Arrays.fill(mSpacing, CSSConstants.UNDEFINED);
-    mDefaultSpacing = null;
-    mHasAliasesSet = false;
-    mValueFlags = 0;
-  }
-
-  /**
-   * Try to get start value and fallback to given type if not defined. This is used privately
-   * by the layout engine as a more efficient way to fetch direction-aware values by
-   * avoid extra method invocations.
-   */
-  float getWithFallback(int spacingType, int fallbackType) {
-    return
-        (mValueFlags & sFlagsMap[spacingType]) != 0
-        ? mSpacing[spacingType]
-        : get(fallbackType);
-  }
-
-  /**
-   * Get the spacing for a direction. This takes into account any default values that have been set.
-   *
-   * @param spacingType one of {@link #LEFT}, {@link #TOP}, {@link #RIGHT}, {@link #BOTTOM}
-   */
-  public float get(int spacingType) {
-    float defaultValue = (mDefaultSpacing != null)
-                         ? mDefaultSpacing[spacingType]
-                         : (spacingType == START || spacingType == END ? CSSConstants.UNDEFINED : 0);
-
-    if (mValueFlags == 0) {
-      return defaultValue;
-    }
-
-    if ((mValueFlags & sFlagsMap[spacingType]) != 0) {
-      return mSpacing[spacingType];
-    }
-
-    if (mHasAliasesSet) {
-      int secondType = spacingType == TOP || spacingType == BOTTOM ? VERTICAL : HORIZONTAL;
-      if ((mValueFlags & sFlagsMap[secondType]) != 0) {
-        return mSpacing[secondType];
-      } else if ((mValueFlags & sFlagsMap[ALL]) != 0) {
-        return mSpacing[ALL];
-      }
-    }
-
-    return defaultValue;
-  }
-
-  public boolean equal(Spacing spacing) {
-    return FloatUtil.floatsEqual(get(LEFT), spacing.get(LEFT))
-           && FloatUtil.floatsEqual(get(TOP), spacing.get(TOP))
-           && FloatUtil.floatsEqual(get(RIGHT), spacing.get(RIGHT))
-           && FloatUtil.floatsEqual(get(BOTTOM), spacing.get(BOTTOM));
-  }
-
-  //	@Override
-  //	public Spacing clone(){
-  //
-  //		try {
-  //			return (Spacing) super.clone();
-  //		} catch (CloneNotSupportedException e) {
-  //			e.printStackTrace();
-  //		}
-  //		return null;
-  //	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/ui/RenderActionContextImpl.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/RenderActionContextImpl.java b/android/sdk/src/main/java/com/taobao/weex/ui/RenderActionContextImpl.java
index 2aad830..e38c8f3 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/RenderActionContextImpl.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/RenderActionContextImpl.java
@@ -18,25 +18,10 @@
  */
 package com.taobao.weex.ui;
 
-import android.graphics.Rect;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-
-import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.WXSDKInstance;
-import com.taobao.weex.bridge.JSCallback;
-import com.taobao.weex.common.WXRenderStrategy;
 import com.taobao.weex.dom.ImmutableDomObject;
-import com.taobao.weex.dom.WXDomObject;
-import com.taobao.weex.dom.flex.Spacing;
 import com.taobao.weex.dom.RenderActionContext;
-import com.taobao.weex.ui.animation.WXAnimationBean;
-import com.taobao.weex.ui.animation.WXAnimationModule;
-import com.taobao.weex.ui.component.Scrollable;
 import com.taobao.weex.ui.component.WXComponent;
-import com.taobao.weex.ui.component.WXComponentFactory;
-import com.taobao.weex.ui.component.WXVContainer;
-import com.taobao.weex.utils.WXViewUtils;
 
 import java.util.HashMap;
 import java.util.Map;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
index 046cb20..ea12461 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
@@ -55,7 +55,7 @@ import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.dom.WXDomTask;
 import com.taobao.weex.dom.WXStyle;
 import com.taobao.weex.dom.action.Actions;
-import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.Spacing;
 import com.taobao.weex.ui.IFComponentHolder;
 import com.taobao.weex.ui.animation.WXAnimationModule;
 import com.taobao.weex.ui.component.pesudo.OnActivePseudoListner;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
index 0bf7b92..9a5e468 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java
@@ -27,7 +27,6 @@ import android.widget.FrameLayout;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
 import com.taobao.weex.dom.WXDomObject;
-import com.taobao.weex.dom.flex.CSSLayout;
 import com.taobao.weex.ui.component.WXVContainer;
 import com.taobao.weex.ui.view.WXFrameLayout;
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
index 9b36be4..66b6539 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
@@ -25,7 +25,7 @@ import com.taobao.weex.annotation.Component;
 import com.taobao.weex.common.Constants;
 import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.dom.WXRecyclerDomObject;
-import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.Spacing;
 import com.taobao.weex.ui.component.WXBaseRefresh;
 import com.taobao.weex.ui.component.WXBasicComponentType;
 import com.taobao.weex.ui.component.WXComponent;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderCorner.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderCorner.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderCorner.java
index a396063..007f7c1 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderCorner.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderCorner.java
@@ -22,7 +22,7 @@ import android.graphics.PointF;
 import android.graphics.RectF;
 import android.support.annotation.NonNull;
 
-import com.taobao.weex.dom.flex.FloatUtil;
+import com.taobao.weex.dom.LayoutUtility;
 
 abstract class BorderCorner {
 
@@ -58,7 +58,7 @@ abstract class BorderCorner {
    * @return true for a rounded outer corner, otherwise false.
    */
   boolean hasOuterCorner() {
-    return getOuterCornerRadius() > 0 && !FloatUtil.floatsEqual(0, getOuterCornerRadius());
+    return getOuterCornerRadius() > 0 && !LayoutUtility.floatsEqual(0, getOuterCornerRadius());
   }
 
   protected float getPreBorderWidth() {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderDrawable.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderDrawable.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderDrawable.java
index a05a964..d133897 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderDrawable.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderDrawable.java
@@ -36,8 +36,8 @@ import android.support.annotation.VisibleForTesting;
 import android.util.SparseArray;
 import android.util.SparseIntArray;
 
-import com.taobao.weex.dom.flex.FloatUtil;
-import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.Spacing;
+import com.taobao.weex.dom.LayoutUtility;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXViewUtils;
 
@@ -178,7 +178,7 @@ public class BorderDrawable extends Drawable {
       mBorderWidth = new SparseArray<>(5);
       mBorderWidth.put(Spacing.ALL, DEFAULT_BORDER_WIDTH);
     }
-    if (!FloatUtil.floatsEqual(getBorderWidth(position), width)) {
+    if (!LayoutUtility.floatsEqual(getBorderWidth(position), width)) {
       BorderUtil.updateSparseArray(mBorderWidth, position, width);
       mBorderWidth.put(position, width);
       mNeedUpdatePath = true;
@@ -195,7 +195,7 @@ public class BorderDrawable extends Drawable {
       mBorderRadius = new SparseArray<>(5);
       mBorderRadius.put(Spacing.ALL, DEFAULT_BORDER_RADIUS);
     }
-    if (!FloatUtil.floatsEqual(getBorderRadius(mBorderRadius, position), radius)) {
+    if (!LayoutUtility.floatsEqual(getBorderRadius(mBorderRadius, position), radius)) {
       BorderUtil.updateSparseArray(mBorderRadius, position, radius, true);
       mNeedUpdatePath = true;
       invalidateSelf();
@@ -276,10 +276,10 @@ public class BorderDrawable extends Drawable {
 
   public boolean isRounded() {
     return mBorderRadius != null &&
-           (!FloatUtil.floatsEqual(getBorderRadius(mBorderRadius, BORDER_TOP_LEFT_RADIUS), 0) ||
-            !FloatUtil.floatsEqual(getBorderRadius(mBorderRadius, BORDER_TOP_RIGHT_RADIUS), 0) ||
-            !FloatUtil.floatsEqual(getBorderRadius(mBorderRadius, BORDER_BOTTOM_RIGHT_RADIUS), 0) ||
-            !FloatUtil.floatsEqual(getBorderRadius(mBorderRadius, BORDER_BOTTOM_LEFT_RADIUS), 0));
+           (!LayoutUtility.floatsEqual(getBorderRadius(mBorderRadius, BORDER_TOP_LEFT_RADIUS), 0) ||
+            !LayoutUtility.floatsEqual(getBorderRadius(mBorderRadius, BORDER_TOP_RIGHT_RADIUS), 0) ||
+            !LayoutUtility.floatsEqual(getBorderRadius(mBorderRadius, BORDER_BOTTOM_RIGHT_RADIUS), 0) ||
+            !LayoutUtility.floatsEqual(getBorderRadius(mBorderRadius, BORDER_BOTTOM_LEFT_RADIUS), 0));
   }
 
   public
@@ -397,7 +397,7 @@ public class BorderDrawable extends Drawable {
   }
 
   private void updateFactor(@NonNull List<Float> list, float numerator, float denominator) {
-    if (!FloatUtil.floatsEqual(denominator, 0)) {
+    if (!LayoutUtility.floatsEqual(denominator, 0)) {
       list.add(numerator / denominator);
     }
   }
@@ -435,7 +435,7 @@ public class BorderDrawable extends Drawable {
   }
 
   private void drawOneSide(Canvas canvas, @NonNull BorderEdge borderEdge) {
-    if (!FloatUtil.floatsEqual(0, getBorderWidth(borderEdge.getEdge()))) {
+    if (!LayoutUtility.floatsEqual(0, getBorderWidth(borderEdge.getEdge()))) {
       preparePaint(borderEdge.getEdge());
       borderEdge.drawEdge(canvas, mPaint);
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderEdge.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderEdge.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderEdge.java
index 0da0354..1aeefb7 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderEdge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderEdge.java
@@ -24,7 +24,7 @@ import android.graphics.PointF;
 import android.graphics.RectF;
 import android.support.annotation.NonNull;
 
-import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.Spacing;
 
 /**
  * Edge for border. Every border has four edges, and each edge has a previous corner and a post

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderStyle.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderStyle.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderStyle.java
index aab38f7..1636b2e 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderStyle.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderStyle.java
@@ -24,7 +24,7 @@ import android.graphics.PathEffect;
 import android.graphics.Shader;
 import android.support.annotation.Nullable;
 
-import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.Spacing;
 
 enum BorderStyle {
   SOLID,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderUtil.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderUtil.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderUtil.java
index 4ce218e..71dbbc7 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderUtil.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderUtil.java
@@ -24,7 +24,7 @@ import android.support.annotation.Nullable;
 import android.util.SparseArray;
 import android.util.SparseIntArray;
 
-import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.Spacing;
 
 class BorderUtil {
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderWidthStyleColorType.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderWidthStyleColorType.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderWidthStyleColorType.java
index 44ec8f8..48133d3 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderWidthStyleColorType.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/border/BorderWidthStyleColorType.java
@@ -21,7 +21,7 @@ package com.taobao.weex.ui.view.border;
 
 import android.support.annotation.IntDef;
 
-import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.Spacing;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/main/java/com/taobao/weex/utils/WXDomUtils.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXDomUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXDomUtils.java
index afa8152..d0ea1fe 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXDomUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXDomUtils.java
@@ -20,9 +20,8 @@
 package com.taobao.weex.utils;
 
 import com.taobao.weex.dom.ImmutableDomObject;
-import com.taobao.weex.dom.WXDomObject;
-import com.taobao.weex.dom.flex.CSSConstants;
-import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.Spacing;
+import com.taobao.weex.dom.LayoutUtility;
 
 public class WXDomUtils {
 
@@ -37,17 +36,17 @@ public class WXDomUtils {
     Spacing padding = domObject.getPadding();
     Spacing border = domObject.getBorder();
 
-    if (!CSSConstants.isUndefined((leftPadding = padding.get(Spacing.LEFT)))) {
+    if (!LayoutUtility.isUndefined((leftPadding = padding.get(Spacing.LEFT)))) {
       rawWidth -= leftPadding;
     }
-    if (!CSSConstants.isUndefined((rightPadding = padding.get(Spacing.RIGHT)))) {
+    if (!LayoutUtility.isUndefined((rightPadding = padding.get(Spacing.RIGHT)))) {
       rawWidth -= rightPadding;
     }
 
-    if (!CSSConstants.isUndefined(leftBorder = border.get(Spacing.LEFT))) {
+    if (!LayoutUtility.isUndefined(leftBorder = border.get(Spacing.LEFT))) {
       rawWidth -= leftBorder;
     }
-    if (!CSSConstants.isUndefined(rightBorder = border.get(Spacing.RIGHT))) {
+    if (!LayoutUtility.isUndefined(rightBorder = border.get(Spacing.RIGHT))) {
       rawWidth -= rightBorder;
     }
     return rawWidth;
@@ -64,17 +63,17 @@ public class WXDomUtils {
     Spacing padding = domObject.getPadding();
     Spacing border = domObject.getBorder();
 
-    if (!CSSConstants.isUndefined((topPadding = padding.get(Spacing.TOP)))) {
+    if (!LayoutUtility.isUndefined((topPadding = padding.get(Spacing.TOP)))) {
       rawHeight -= topPadding;
     }
-    if (!CSSConstants.isUndefined((bottomPadding = padding.get(Spacing.BOTTOM)))) {
+    if (!LayoutUtility.isUndefined((bottomPadding = padding.get(Spacing.BOTTOM)))) {
       rawHeight -= bottomPadding;
     }
 
-    if (!CSSConstants.isUndefined(topBorder = border.get(Spacing.TOP))) {
+    if (!LayoutUtility.isUndefined(topBorder = border.get(Spacing.TOP))) {
       rawHeight -= topBorder;
     }
-    if (!CSSConstants.isUndefined(bottomBorder = border.get(Spacing.BOTTOM))) {
+    if (!LayoutUtility.isUndefined(bottomBorder = border.get(Spacing.BOTTOM))) {
       rawHeight -= bottomBorder;
     }
     return rawHeight;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/test/java/com/taobao/weex/dom/TestDomObject.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/TestDomObject.java b/android/sdk/src/test/java/com/taobao/weex/dom/TestDomObject.java
index 6e67d04..9fcd9cb 100644
--- a/android/sdk/src/test/java/com/taobao/weex/dom/TestDomObject.java
+++ b/android/sdk/src/test/java/com/taobao/weex/dom/TestDomObject.java
@@ -19,7 +19,6 @@
 package com.taobao.weex.dom;
 
 import com.facebook.yoga.YogaEdge;
-import com.taobao.weex.dom.flex.CSSLayout;
 
 import static com.taobao.weex.common.Constants.Event;
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/test/java/com/taobao/weex/dom/WXTextDomObjectTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/WXTextDomObjectTest.java b/android/sdk/src/test/java/com/taobao/weex/dom/WXTextDomObjectTest.java
index 4f1e87f..b96e98f 100644
--- a/android/sdk/src/test/java/com/taobao/weex/dom/WXTextDomObjectTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/dom/WXTextDomObjectTest.java
@@ -18,11 +18,12 @@
  */
 package com.taobao.weex.dom;
 
+import com.facebook.yoga.YogaMeasureMode;
+import com.facebook.yoga.YogaMeasureOutput;
 import com.taobao.weappplus_sdk.BuildConfig;
 import com.taobao.weex.common.Constants;
 import static com.taobao.weex.common.Constants.Name.*;
 
-import com.taobao.weex.dom.flex.MeasureOutput;
 import com.taobao.weex.ui.component.WXComponent;
 import org.junit.After;
 import org.junit.Before;
@@ -63,13 +64,10 @@ public class WXTextDomObjectTest {
   @Test
   public void testMeasure() throws Exception {
     testLayoutBefore();
-    MeasureOutput output = new MeasureOutput();
     WXTextDomObject mock = PowerMockito.spy(dom);
     PowerMockito.when(mock,"getTextWidth",dom.getTextPaint(),100f,false).thenReturn(10f);
-    // TODO: 21/06/2017
-//    WXTextDomObject.TEXT_MEASURE_FUNCTION.measure(mock,100,output);
-//
-//    assertEquals(output.width,10f,0.1f);
+    long result = WXTextDomObject.TEXT_MEASURE_FUNCTION.measure(mock,100, YogaMeasureMode.UNDEFINED,10,YogaMeasureMode.UNDEFINED);
+    assertEquals(YogaMeasureOutput.getWidth(result),10f,0.1f);
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/test/java/com/taobao/weex/ui/component/WXDivTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/ui/component/WXDivTest.java b/android/sdk/src/test/java/com/taobao/weex/ui/component/WXDivTest.java
index 53b52c3..fcc3545 100644
--- a/android/sdk/src/test/java/com/taobao/weex/ui/component/WXDivTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/ui/component/WXDivTest.java
@@ -24,16 +24,12 @@ import com.taobao.weex.WXSDKInstanceTest;
 import com.taobao.weex.dom.TestDomObject;
 import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.dom.WXEvent;
-import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.Spacing;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.Mockito;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/test/java/com/taobao/weex/ui/component/WXTextTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/ui/component/WXTextTest.java b/android/sdk/src/test/java/com/taobao/weex/ui/component/WXTextTest.java
index 0181457..845f5a2 100644
--- a/android/sdk/src/test/java/com/taobao/weex/ui/component/WXTextTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/ui/component/WXTextTest.java
@@ -25,7 +25,7 @@ import com.taobao.weex.common.Constants;
 import com.taobao.weex.dom.TestDomObject;
 import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.dom.WXTextDomObject;
-import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.Spacing;
 import com.taobao.weex.ui.SimpleComponentHolder;
 
 import org.junit.Before;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d44f9618/android/sdk/src/test/java/com/taobao/weex/ui/view/border/BorderDrawableTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/ui/view/border/BorderDrawableTest.java b/android/sdk/src/test/java/com/taobao/weex/ui/view/border/BorderDrawableTest.java
index 85089fe..08255f6 100644
--- a/android/sdk/src/test/java/com/taobao/weex/ui/view/border/BorderDrawableTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/ui/view/border/BorderDrawableTest.java
@@ -24,7 +24,7 @@ import android.graphics.Color;
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
 
-import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.dom.Spacing;
 import com.taobao.weex.utils.WXResourceUtils;
 
 import org.junit.Before;