You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by mo...@apache.org on 2019/04/30 05:49:56 UTC

[incubator-weex] branch master updated: [iOS] report exception when native render error

This is an automated email from the ASF dual-hosted git repository.

moshen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-weex.git


The following commit(s) were added to refs/heads/master by this push:
     new 9c8ea85  [iOS] report exception when native render error
     new 507dc0b  Merge pull request #2385 from jianhan-he/master
9c8ea85 is described below

commit 9c8ea85fd11f1f7bc2ac7215fdc9016a2977e916
Author: linghe.lh <li...@alibaba-inc.com>
AuthorDate: Tue Apr 30 11:51:06 2019 +0800

    [iOS] report exception when native render error
---
 ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m   | 21 ++++++++++++----
 ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm     |  8 +++---
 ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h        |  1 +
 ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h  |  5 ++--
 ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m  | 29 ++++++++++++++++------
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m      |  6 +++--
 .../core/network/ios/default_request_handler.mm    |  2 +-
 7 files changed, 51 insertions(+), 21 deletions(-)

diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
index be90637..a4b6cf5 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
@@ -153,7 +153,10 @@ _Pragma("clang diagnostic pop") \
             });
         }
         else {
-            WXLogError(@"No data render handler found!");
+            WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
+            WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+            NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+            instance.onFailed(error);
         }
         return 0;
     }];
@@ -426,7 +429,9 @@ _Pragma("clang diagnostic pop") \
             });
         }
         else {
-            WXLogError(@"No data render handler found!");
+            WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+            NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+            sdkInstance.onFailed(error);
         }
         WX_MONITOR_INSTANCE_PERF_END(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
         [sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_LOAD_BUNDLE_END];
@@ -599,7 +604,9 @@ _Pragma("clang diagnostic pop") \
             });
         }
         else {
-            WXLogError(@"No data render handler found!");
+            WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+            NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+            sdkInstance.onFailed(error);
         }
         WX_MONITOR_INSTANCE_PERF_END(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
         [sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_LOAD_BUNDLE_END];
@@ -732,7 +739,9 @@ _Pragma("clang diagnostic pop") \
             });
         }
         else {
-            WXLogError(@"No data render handler found!");
+            WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+            NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+            sdkInstance.onFailed(error);
         }
     } else {
         [self callJSMethod:@"destroyInstance" args:@[instance]];
@@ -757,7 +766,9 @@ _Pragma("clang diagnostic pop") \
     WXSDKInstance *sdkInstance = [WXSDKManager instanceForID:instance];
     if (sdkInstance.dataRender) {
         if (!_dataRenderHandler) {
-            WXLogError(@"No data render handler found!");
+            WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+            NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+            sdkInstance.onFailed(error);
             return;
         }
         WXPerformBlockOnComponentThread(^{
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
index 8bb2624..50aa502 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
@@ -132,13 +132,13 @@ namespace WeexCore
             if (!instance) {
                 break;
             }
-            WXSDKErrCode errorCode = WX_KEY_EXCEPTION_DEGRADE;
+            WXSDKErrCode errorCode = WX_ERR_JS_EXECUTE;
             BOOL is_render_failed = NO;
-            if (func && strcmp(func, "createInstance") == 0) {
-                errorCode = WX_KEY_EXCEPTION_EMPTY_SCREEN_JS;
+            if (func && (strcmp(func, "CreatePageWithContent") == 0 || strcmp(func, "UpdateComponentData") == 0)) {
+                errorCode = WX_ERR_EAGLE_RENDER;
                 WXComponentManager *manager = instance.componentManager;
                 if (manager.isValid) {
-                    NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":[NSString stringWithUTF8String:exception]}];
+                    NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":[NSString stringWithUTF8String:exception], @"exception function:":@(func)}];
                     [manager renderFailed:error];
                 }
                 is_render_failed = YES;
diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
index 99b1f60..689b046 100644
--- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
+++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
@@ -55,6 +55,7 @@ typedef NS_ENUM(int, WXSDKErrCode)
     WX_ERR_RENDER_REMOVEEVENT = -2107,
     WX_ERR_RENDER_SCROLLTOELEMENT = -2110,
     WX_ERR_RENDER_TWICE = -2111,
+    WX_ERR_EAGLE_RENDER = -2112,
     WX_ERR_RENDER_END = -2199,
     
     WX_ERR_DOWNLOAD_START = -2201,
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
index 29d9fd1..1cbdad7 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
@@ -118,9 +118,10 @@ extern "C" {
 
 /**
  + *  download JS Script
- + *  @param scriptUrl    :   script url
+ + *  @param instance    :   instance id
+ + *  @param scriptUrl   :   script url
  + **/
-- (void)DownloadJS:(NSURL *)scriptUrl completion:(void (^)(NSString *script))complection;
+- (void)DownloadJS:(NSString *)instance url:(NSURL *)scriptUrl completion:(void (^)(NSString *script))complection;
 
 /**
  *  Register JS service Script
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
index 2954a69..78cd4cd 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
@@ -300,21 +300,32 @@ void WXPerformBlockSyncOnBridgeThread(void (^block) (void))
     return value;
 }
 
-- (void)DownloadJS:(NSURL *)scriptUrl completion:(void (^)(NSString *script))complection;
+- (void)DownloadJS:(NSString*)instance url:(NSURL *)scriptUrl completion:(void (^)(NSString *script))complection;
 {
     if (!scriptUrl || ![scriptUrl.absoluteString length]) {
-        complection(nil);
+        if (complection) {
+            complection(nil);
+        }
         return;
     }
     WXResourceRequest* request = [WXResourceRequest requestWithURL:scriptUrl];
     WXResourceLoader* jsLoader = [[WXResourceLoader alloc] initWithRequest:request];
     jsLoader.onFinished = ^(WXResourceResponse *response, NSData *data) {
         NSString* jsString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
-        complection(jsString);
+        if (complection) {
+            complection(jsString);
+        }
     };
     jsLoader.onFailed = ^(NSError *loadError) {
-        WXLogError(@"No js URL found");
-        complection(nil);
+        if (complection) {
+            complection(nil);
+        }
+
+        WXSDKInstance *sdkInstance = [WXSDKManager instanceForID:instance];
+        NSString *errorMessage = [NSString stringWithFormat:@"Request to %@ occurs an error:%@, info:%@", request.URL, loadError.localizedDescription, loadError.userInfo];
+        WXSDKErrCode errorCode = WX_KEY_EXCEPTION_JS_DOWNLOAD;
+        NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{NSLocalizedDescriptionKey:(errorMessage?:@"No message")}];
+        sdkInstance.onFailed(error);
     };
 
    [jsLoader start];
@@ -424,7 +435,9 @@ void WXPerformBlockSyncOnBridgeThread(void (^block) (void))
             });
         }
         else {
-            WXLogError(@"No data render handler found!");
+            WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+            NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+            instance.onFailed(error);
         }
         return;
     }
@@ -497,7 +510,9 @@ void WXPerformBlockSyncOnBridgeThread(void (^block) (void))
             });
         }
         else {
-            WXLogError(@"No data render handler found!");
+            WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+            NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+            instance.onFailed(error);
         }
     }
     else {
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
index d5be31b..2ed9999 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -272,7 +272,7 @@ typedef enum : NSUInteger {
 }
 
 - (void)_downloadAndExecScript:(NSURL *)url {
-    [[WXSDKManager bridgeMgr] DownloadJS:url completion:^(NSString *script) {
+    [[WXSDKManager bridgeMgr] DownloadJS:_instanceId url:url completion:^(NSString *script) {
         if (!script) {
             return;
         }
@@ -287,7 +287,9 @@ typedef enum : NSUInteger {
                 });
             }
             else {
-                WXLogError(@"No data render handler found!");
+                WXSDKErrCode errorCode = WX_ERR_EAGLE_RENDER;
+                NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
+                self.onFailed(error);
             }
             return;
         }
diff --git a/weex_core/Source/core/network/ios/default_request_handler.mm b/weex_core/Source/core/network/ios/default_request_handler.mm
index a6a35db..02e42b3 100644
--- a/weex_core/Source/core/network/ios/default_request_handler.mm
+++ b/weex_core/Source/core/network/ios/default_request_handler.mm
@@ -31,7 +31,7 @@ namespace network {
 
     void DefaultRequestHandler::Send(const char* instance_id, const char* url, Callback callback) {
         NSURL* nsURL = [NSURL URLWithString:NSSTRING(url)];
-        [[WXSDKManager bridgeMgr] DownloadJS:nsURL completion:^(NSString *script) {
+        [[WXSDKManager bridgeMgr] DownloadJS:@(instance_id) url:nsURL completion:^(NSString *script) {
             WXPerformBlockOnBridgeThread(^{
                 callback([script UTF8String] ? : "");
             });