* [android] Report layer overflow limit error on android 4.x.

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/52e84f2d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/52e84f2d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/52e84f2d

Branch: refs/heads/master
Commit: 52e84f2d8ae3bd7a82bf9c884bf2c41afb0a6a57
Parents: 46ce1c5
Author: miomin <[email protected]>
Authored: Fri May 4 11:39:07 2018 +0800
Committer: YorkShen <[email protected]>
Committed: Mon May 7 15:52:09 2018 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/WXSDKInstance.java     | 10 ++++++
 .../java/com/taobao/weex/common/Constants.java  |  1 +
 .../com/taobao/weex/common/WXErrorCode.java     |  5 ++-
 .../taobao/weex/ui/component/WXComponent.java   | 10 ------
 .../com/taobao/weex/ui/component/WXDiv.java     | 31 ++++++-----------
 .../com/taobao/weex/ui/component/WXEmbed.java   | 10 ++++--
 .../taobao/weex/ui/component/WXVContainer.java  |  3 --
 .../com/taobao/weex/ui/view/WXFrameLayout.java  | 36 ++++++++++++++++++--
 8 files changed, 63 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java 
b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index 3904f78..9354949 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -171,6 +171,16 @@ public class WXSDKInstance implements 
IWXActivityStateListener,View.OnLayoutChan
   private ComponentObserver mComponentObserver;
   private Map<String, GraphicActionAddElement> inactiveAddElementAction = new 
ArrayMap<>();
 
+  private boolean hasLayerLimit = false;
+
+  public void setLayerLimit(boolean hasLayerLimit) {
+    this.hasLayerLimit = hasLayerLimit;
+  }
+
+  public boolean isLayerLimit() {
+    return hasLayerLimit;
+  }
+
   /**
    * set open SandBox
    * @param flag

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java 
b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
index c423ad1..d5e4ee1 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
@@ -189,6 +189,7 @@ public class Constants {
     String ARIA_HIDDEN = "ariaHidden";
     String ROLE = "role";
 
+    String LAYERLIMIT = "layerLimit";
     String LAYER_LIMIT = "layer-limit";
 
     String DIRECTION = "direction";

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java 
b/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
index 0f77ec9..838b42f 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
@@ -201,7 +201,6 @@ public enum WXErrorCode {
   WX_KEY_EXCEPTION_DOM_MODULEINVO("-9317", "[WX_KEY_EXCEPTION_DOM_MODULEINVO] 
details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
 
-
   /**
    * WX Key Exception Commit RT JsBridge eg. js excute runtime error
    */
@@ -212,8 +211,8 @@ public enum WXErrorCode {
    * renderErrorCode
    */
   WX_RENDER_ERR_JS_CREATE_INSTANCE("-9600", 
"WX_RENDER_ERR_JS_CREATE_INSTANCE",ErrorType.RENDER_ERROR,ErrorGroup.JS),
-  WX_RENDER_ERR_JS_RUNTIME("-9601", "WX_RENDER_ERR for js 
error",ErrorType.RENDER_ERROR,
-          ErrorGroup.JS),
+  WX_RENDER_ERR_JS_RUNTIME("-9601", "WX_RENDER_ERR for js 
error",ErrorType.RENDER_ERROR, ErrorGroup.JS),
+  WX_RENDER_ERR_LAYER_OVERFLOW("-9602", "WX_RENDER_ERR_LAYER_OVERFLOW", 
ErrorType.RENDER_ERROR, ErrorGroup.JS),
 
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/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 add5921..86f6347 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
@@ -171,16 +171,6 @@ public abstract class WXComponent<T extends View> extends 
WXBasicComponent imple
 
   private boolean waste = false;
 
-  private boolean hasLayerLimit = false;
-
-  protected void setLayerLimit(boolean hasLayerLimit) {
-    this.hasLayerLimit = hasLayerLimit;
-  }
-
-  public boolean isLayerLimit() {
-    return hasLayerLimit;
-  }
-
   private ContentBoxMeasurement contentBoxMeasurement;
   private WXTransition mTransition;
   private GraphicSize mPseudoResetGraphicSize;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java 
b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
index 9ebd7d8..f7954ee 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java
@@ -32,6 +32,8 @@ import com.taobao.weex.ui.flat.FlatComponent;
 import com.taobao.weex.ui.flat.WidgetContainer;
 import com.taobao.weex.ui.flat.widget.WidgetGroup;
 import com.taobao.weex.ui.view.WXFrameLayout;
+import com.taobao.weex.utils.WXUtils;
+
 import java.lang.reflect.InvocationTargetException;
 import java.util.LinkedList;
 
@@ -119,27 +121,14 @@ public class WXDiv extends WidgetContainer<WXFrameLayout> 
implements FlatCompone
     return !promoteToView(true);
   }
 
-  @WXComponentProp(name = Constants.Name.LAYER_LIMIT)
-  public void setLayerLimitModle(String layerLimit) {
-    setLayerLimit(getLayerLimit(layerLimit));
-  }
-
-  private boolean getLayerLimit(String layerLimit) {
-    boolean ret = false;
-    if (TextUtils.isEmpty(layerLimit)) {
-      return ret;
-    }
-
-    switch (layerLimit) {
-      case "true":
-        ret = true;
-        break;
-      case "false":
-        ret = false;
-        break;
-      default:
-        break;
+  @Override
+  protected boolean setProperty(String key, Object param) {
+    switch (key) {
+      case Constants.Name.LAYERLIMIT:
+      case Constants.Name.LAYER_LIMIT:
+        getInstance().setLayerLimit(WXUtils.getBoolean(param, false));
+        return true;
     }
-    return ret;
+    return super.setProperty(key, param);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
----------------------------------------------------------------------
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java 
b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
index 018612b..74c483c 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java
@@ -20,6 +20,7 @@ package com.taobao.weex.ui.component;
 
 import android.annotation.SuppressLint;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.Gravity;
 import android.view.View;
 import android.view.ViewGroup;
@@ -221,13 +222,13 @@ public class WXEmbed extends WXDiv implements 
WXSDKInstance.OnInstanceVisibleLis
   protected boolean setProperty(String key, Object param) {
     switch (key) {
       case Constants.Name.SRC:
-        String src = WXUtils.getString(param,null);
+        String src = WXUtils.getString(param, null);
         if (src != null)
           setSrc(src);
         return true;
       case Constants.Name.PRIORITY:
-        String priority = WXUtils.getString(param,null);
-        if (priority != null){
+        String priority = WXUtils.getString(param, null);
+        if (priority != null) {
           setPriority(priority);
         }
         return true;
@@ -332,10 +333,13 @@ public class WXEmbed extends WXDiv implements 
WXSDKInstance.OnInstanceVisibleLis
       return sdkInstance;
     }
 
+    sdkInstance.setLayerLimit(getInstance().isLayerLimit());
+
     sdkInstance.renderByUrl(WXPerformance.DEFAULT,
             url,
             null, null,
             WXRenderStrategy.APPEND_ASYNC);
+
     return sdkInstance;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java
----------------------------------------------------------------------
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java 
b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java
index 5d18cd5..9897e26 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java
@@ -269,9 +269,6 @@ public abstract class WXVContainer<T extends ViewGroup> 
extends WXComponent<T> {
     } else {
       mChildren.add(index, child);
     }
-
-    if (isLayerLimit())
-      child.setLayerLimit(true);
   }
 
   public final int indexOf(WXComponent comp) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java
----------------------------------------------------------------------
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java 
b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java
index ea05c7e..cfb1ec6 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java
@@ -23,12 +23,17 @@ import android.graphics.Canvas;
 import android.graphics.drawable.Drawable;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.util.Log;
 import android.view.MotionEvent;
+import android.view.View;
 import android.widget.FrameLayout;
+
+import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.ui.component.WXDiv;
 import com.taobao.weex.ui.flat.widget.Widget;
 import com.taobao.weex.ui.view.gesture.WXGesture;
 import com.taobao.weex.ui.view.gesture.WXGestureObservable;
+import com.taobao.weex.utils.WXExceptionUtils;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXViewUtils;
 import java.lang.ref.WeakReference;
@@ -96,12 +101,22 @@ public class WXFrameLayout extends FrameLayout implements 
WXGestureObservable,IR
 
   @Override
   protected void dispatchDraw(Canvas canvas) {
-    if (getComponent() != null && getComponent().isLayerLimit()) {
-      dispatchDrawInterval(canvas);
+    if (getComponent() != null && getComponent().getInstance().isLayerLimit()) 
{
+      try {
+        dispatchDrawInterval(canvas);
+      } catch (StackOverflowError e) {
+        int deep = calLayerDeep(this, 0);
+        
WXExceptionUtils.commitCriticalExceptionRT(getComponent().getInstanceId(),
+                WXErrorCode.WX_RENDER_ERR_LAYER_OVERFLOW,
+                "draw android view",
+                WXErrorCode.WX_RENDER_ERR_LAYER_OVERFLOW.getErrorMsg() + 
"Layer overflow limit error: " + deep + " layers!",
+                null);
+        throw new LayerOverFlowLimitException("Layer overflow limit error: " + 
deep + " layers!");
+      }
     } else {
       try {
         dispatchDrawInterval(canvas);
-      }catch (Throwable e){
+      } catch (StackOverflowError e){
         WXLogUtils.e("FlatGUI Crashed when dispatchDraw", 
WXLogUtils.getStackTrace(e));
       }
     }
@@ -120,4 +135,19 @@ public class WXFrameLayout extends FrameLayout implements 
WXGestureObservable,IR
       super.dispatchDraw(canvas);
     }
   }
+
+  static class LayerOverFlowLimitException extends RuntimeException {
+
+    public LayerOverFlowLimitException(String message) {
+      super(message);
+    }
+  }
+
+  private int calLayerDeep(View view, int deep) {
+    deep++;
+    if (view.getParent() != null && view.getParent() instanceof View) {
+      return calLayerDeep((View) view.getParent(), deep);
+    }
+    return deep;
+  }
 }

Reply via email to