You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ky...@apache.org on 2018/05/07 07:53:23 UTC
[50/52] [abbrv] incubator-weex git commit: * [android] Report layer
overflow limit error on android 4.x.
* [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 <69...@qq.com>
Authored: Fri May 4 11:39:07 2018 +0800
Committer: YorkShen <sh...@gmail.com>
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;
+ }
}