Skip to content
This repository has been archived by the owner on Jun 3, 2021. It is now read-only.

[WEEX-622][iOS] record jsservice name to context && modify white scre… #1541

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 45 additions & 31 deletions ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
Original file line number Diff line number Diff line change
Expand Up @@ -498,11 +498,17 @@ - (void)createInstance:(NSString *)instanceIdString
}

[sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_LOAD_BUNDLE_END];
NSDictionary* funcInfo = @{
@"func":@"createInstance",
@"arg":@"start"
};
sdkInstance.instanceJavaScriptContext.javaScriptContext[@"wxExtFuncInfo"]= funcInfo;
if ([NSURL URLWithString:sdkInstance.pageName] || sdkInstance.scriptURL) {
[sdkInstance.instanceJavaScriptContext executeJavascript:jsBundleString withSourceURL:[NSURL URLWithString:sdkInstance.pageName]?:sdkInstance.scriptURL];
} else {
[sdkInstance.instanceJavaScriptContext executeJavascript:jsBundleString];
}
sdkInstance.instanceJavaScriptContext.javaScriptContext[@"wxExtFuncInfo"] = nil;
WX_MONITOR_INSTANCE_PERF_END(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
}];
}
Expand All @@ -515,8 +521,15 @@ - (void)createInstance:(NSString *)instanceIdString
} else {
args = @[instanceIdString, jsBundleString, options ?: @{}];
}
[self _mountInstanceInfoToGlobalContext:sdkInstance];
NSDictionary* funcInfo = @{
@"func":@"createInstance",
@"arg":@"start",
@"instanceId":sdkInstance.instanceId?:@"unknownId"
};
sdkInstance.instanceJavaScriptContext.javaScriptContext[@"wxExtFuncInfo"] = funcInfo;
[self callJSMethod:@"createInstance" args:args];
sdkInstance.instanceJavaScriptContext.javaScriptContext[@"wxExtFuncInfo"] = nil;

WX_MONITOR_INSTANCE_PERF_END(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
}
}
Expand All @@ -531,21 +544,6 @@ - (BOOL) _shouldMountExtInfoToInstanceContxt
return shouldMountInstanceContextExtInfo;
}

- (void) _mountInstanceInfoToGlobalContext:(WXSDKInstance*) instance
{
if (![self _shouldMountExtInfoToInstanceContxt]) {
return;
}
JSContext* globalContext = self.jsBridge.javaScriptContext;
if (!globalContext && [globalContext.name isEqualToString:@"Weex Context"]) {
return;
}
NSMutableDictionary *extInfo = [NSMutableDictionary dictionaryWithDictionary:@{
@"wxInstanceId":instance.instanceId?:@"unSetInstanceId"
}];
globalContext[@"wxInstanceExtInfo"] = extInfo;
}

- (void)createInstance:(NSString *)instanceIdString
contents:(NSData *)contents
options:(NSDictionary *)options
Expand Down Expand Up @@ -841,12 +839,18 @@ - (void)executeJsService:(NSString *)script withName:(NSString *)name
{
if(self.frameworkLoadFinished) {
WXAssert(script, @"param script required!");
NSDictionary* funcInfo = @{
@"func":@"executeJsService",
@"arg":name?:@"unsetScriptName"
};
self.jsBridge.javaScriptContext[@"wxExtFuncInfo"] = funcInfo;
[self.jsBridge executeJavascript:script];
self.jsBridge.javaScriptContext[@"wxExtFuncInfo"] = nil;

if ([self.jsBridge exception]) {
NSString *exception = [[self.jsBridge exception] toString];
NSMutableString *errMsg = [NSMutableString stringWithFormat:@"[WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE] %@",exception];
[WXExceptionUtils commitCriticalExceptionRT:@"WX_KEY_EXCEPTION_INVOKE" errCode:[NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_INVOKE] function:@"" exception:errMsg extParams:nil];
NSMutableString *errMsg = [NSMutableString stringWithFormat:@"[WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE] name:%@,arg:%@,exception :$@",name,exception];
[WXExceptionUtils commitCriticalExceptionRT:@"WX_KEY_EXCEPTION_INVOKE" errCode:[NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_INVOKE] function:@"executeJsService" exception:errMsg extParams:nil];
WX_MONITOR_FAIL(WXMTJSService, WX_ERR_JSFRAMEWORK_EXECUTE, errMsg);
} else {
// success
Expand Down Expand Up @@ -1030,33 +1034,43 @@ + (void)mountContextEnvironment:(JSContext*)context
bundleUrl = @"weex-main-jsfm";
}
userInfo = [NSDictionary dictionary];
tryFindInstanceInfoInGlobalContext = YES;
JSValue* instanceExtInfoValue = [context objectForKeyedSubscript:@"wxInstanceExtInfo"];
if (nil != instanceExtInfoValue) {
NSDictionary* instanceInfo = [instanceExtInfoValue toDictionary];
NSString* exceptionInstanceId = [instanceInfo objectForKey:@"wxInstanceId"];
if (nil != exceptionInstanceId) {
instance = [WXSDKManager instanceForID:exceptionInstanceId];
}
}
errorCode = [NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_EMPTY_SCREEN_JS];
}
} else {
instance = [WXSDKEngine topInstance];
}

NSDictionary* wxExtFuncInfo = [context[@"wxExtFuncInfo"] toDictionary];
NSString* recordFunc = [wxExtFuncInfo objectForKey:@"func"];
NSString* recordArg = [wxExtFuncInfo objectForKey:@"arg"];
NSString* recordInsstanceId = [wxExtFuncInfo objectForKey:@"instanceId"];
if (nil == instance) {
instance = [WXSDKManager instanceForID:recordInsstanceId];
tryFindInstanceInfoInGlobalContext = nil!= instance;
}

if(nil != instance && [recordFunc isEqualToString:@"createInstance"] && !instance.apmInstance.hasAddView){
errorCode = [NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_EMPTY_SCREEN_JS];
}

if (instance && !tryFindInstanceInfoInGlobalContext) {
if (instance) {
bundleUrl = instance.pageName?:([instance.scriptURL absoluteString]?:@"WX_KEY_EXCEPTION_WXBRIDGE");
message = [NSString stringWithFormat:@"[WX_KEY_EXCEPTION_WXBRIDGE] [%@:%@:%@] %@\n%@\n%@\n%@\n%@\n%@", exception[@"sourceURL"], exception[@"line"], exception[@"column"], [exception toString], [exception[@"stack"] toObject], instance.scriptURL.absoluteString, instance.callCreateInstanceContext?:@"", instance.createInstanceContextResult?:@"", instance.executeRaxApiResult?:@""];
userInfo = @{@"jsMainBundleStringContentLength":instance.userInfo[@"jsMainBundleStringContentLength"]?:@"",
@"jsMainBundleStringContentMd5":instance.userInfo[@"jsMainBundleStringContentMd5"]?:@""};
}

if (commitException) {
WXJSExceptionInfo * jsExceptionInfo = [[WXJSExceptionInfo alloc] initWithInstanceId:instance.instanceId bundleUrl:bundleUrl errorCode:errorCode functionName:@"" exception:message userInfo:[userInfo mutableCopy]];
NSMutableDictionary* reportInfo = [[NSMutableDictionary alloc] initWithDictionary:[userInfo mutableCopy]];
[reportInfo setObject:context.name?:@"unknownContextName" forKey:@"wxContextName"];

WXJSExceptionInfo * jsExceptionInfo = [[WXJSExceptionInfo alloc] initWithInstanceId:instance.instanceId bundleUrl:bundleUrl errorCode:errorCode functionName:[NSString stringWithFormat:@"func: %@ arg:%@",recordFunc,recordArg]?:@"exceptionHandler" exception:message userInfo:reportInfo];

[WXExceptionUtils commitCriticalExceptionRT:jsExceptionInfo.instanceId errCode:jsExceptionInfo.errorCode function:@"exceptionHandler" exception:jsExceptionInfo.exception extParams:jsExceptionInfo.userInfo];
if (nil == instance) {
[WXExceptionUtils commitCriticalExceptionRT:jsExceptionInfo];
}else{
[WXExceptionUtils commitCriticalExceptionRT:jsExceptionInfo.instanceId errCode:jsExceptionInfo.errorCode function:jsExceptionInfo.functionName exception:jsExceptionInfo.exception extParams:jsExceptionInfo.userInfo];
}

WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_JS_EXECUTE, message);
if (instance.onJSRuntimeException && !tryFindInstanceInfoInGlobalContext) {
instance.onJSRuntimeException(jsExceptionInfo);
Expand Down