This is an automated email from the ASF dual-hosted git repository. cxfeng 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 adfa157 Fix multicontext recreate (#1818) adfa157 is described below commit adfa157737424d9f6424f032e42001b5273007f4 Author: wqyfavor <wqyfa...@163.com> AuthorDate: Mon Nov 26 19:30:54 2018 +0800 Fix multicontext recreate (#1818) * [iOS] Remove multicontext switch. * [iOS] Remove multicontext switch. * [iOS] For normal instance, do not create default jscontext which will be deallocated soon. --- ios/sdk/WeexSDK.xcodeproj/project.pbxproj | 6 -- ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m | 49 +++++------- ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.h | 5 +- ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm | 99 ++++++++++++------------ ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m | 17 ---- ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h | 2 - ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m | 21 +---- 7 files changed, 79 insertions(+), 120 deletions(-) diff --git a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj index d6aca1d..aeb4d3b 100644 --- a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj +++ b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj @@ -923,7 +923,6 @@ DCA445C41EFA57E300D0CFA8 /* WXAppConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 74A4BA941CB365D100195969 /* WXAppConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; DCA445C51EFA57E800D0CFA8 /* WXAComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AE5B7501CAB7DBD0082FDDB /* WXAComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; DCA445C61EFA57EE00D0CFA8 /* NSObject+WXSwizzle.h in Headers */ = {isa = PBXBuildFile; fileRef = 74896F2E1D1AC79400D1D593 /* NSObject+WXSwizzle.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DCA445C91EFA58CE00D0CFA8 /* native-bundle-main.js in Resources */ = {isa = PBXBuildFile; fileRef = DCF0CD9D1EAF3A6B0062CA8F /* native-bundle-main.js */; }; DCA445CA1EFA58CE00D0CFA8 /* wx_load_er...@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 59AC02501D2A7E6E00355112 /* wx_load_er...@3x.png */; }; DCA445CB1EFA590600D0CFA8 /* WXComponent+Layout.h in Headers */ = {isa = PBXBuildFile; fileRef = 744BEA571D0520F300452B5D /* WXComponent+Layout.h */; settings = {ATTRIBUTES = (Public, ); }; }; DCA445CC1EFA592800D0CFA8 /* WXResourceLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 742AD7381DF98C8B007DC46C /* WXResourceLoader.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -1030,7 +1029,6 @@ DCEA54631F2B7DBA000ECB23 /* WXTracingManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4E97D321F1EF46D00ABC314 /* WXTracingManager.m */; }; DCF087611DCAE161005CD6EB /* WXInvocationConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = DCF0875F1DCAE161005CD6EB /* WXInvocationConfig.h */; }; DCF087621DCAE161005CD6EB /* WXInvocationConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = DCF087601DCAE161005CD6EB /* WXInvocationConfig.m */; }; - DCF0CD9E1EAF3A6B0062CA8F /* native-bundle-main.js in Resources */ = {isa = PBXBuildFile; fileRef = DCF0CD9D1EAF3A6B0062CA8F /* native-bundle-main.js */; }; DCF343671E49CAEE00A2FB34 /* WXJSExceptionInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = DCF343651E49CAEE00A2FB34 /* WXJSExceptionInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; DCF343681E49CAEE00A2FB34 /* WXJSExceptionInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = DCF343661E49CAEE00A2FB34 /* WXJSExceptionInfo.m */; }; ED053500207F4DEB007B4568 /* JSContext+Weex.h in Headers */ = {isa = PBXBuildFile; fileRef = ED0534FE207F4DEB007B4568 /* JSContext+Weex.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -1599,7 +1597,6 @@ DCE7F1EE20AD358A00D471E7 /* WXPageEventNotifyEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WXPageEventNotifyEvent.h; path = Protocol/WXPageEventNotifyEvent.h; sourceTree = "<group>"; }; DCF0875F1DCAE161005CD6EB /* WXInvocationConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXInvocationConfig.h; sourceTree = "<group>"; }; DCF087601DCAE161005CD6EB /* WXInvocationConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXInvocationConfig.m; sourceTree = "<group>"; }; - DCF0CD9D1EAF3A6B0062CA8F /* native-bundle-main.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = "native-bundle-main.js"; path = "../../../../pre-build/native-bundle-main.js"; sourceTree = "<group>"; }; DCF343651E49CAEE00A2FB34 /* WXJSExceptionInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXJSExceptionInfo.h; sourceTree = "<group>"; }; DCF343661E49CAEE00A2FB34 /* WXJSExceptionInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXJSExceptionInfo.m; sourceTree = "<group>"; }; ED0534FE207F4DEB007B4568 /* JSContext+Weex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "JSContext+Weex.h"; sourceTree = "<group>"; }; @@ -1926,7 +1923,6 @@ DCD8D0F22073392A0002C420 /* weex-polyfill.js */, DC15A3D92010BC93009C8977 /* weex-main-jsfm.js */, DC15A3DA2010BC93009C8977 /* weex-rax-api.js */, - DCF0CD9D1EAF3A6B0062CA8F /* native-bundle-main.js */, 59AC02501D2A7E6E00355112 /* wx_load_er...@3x.png */, ); path = Resources; @@ -3409,7 +3405,6 @@ buildActionMask = 2147483647; files = ( DC15A3DC2010BC93009C8977 /* weex-rax-api.js in Resources */, - DCF0CD9E1EAF3A6B0062CA8F /* native-bundle-main.js in Resources */, DCD8D0F32073392A0002C420 /* weex-polyfill.js in Resources */, DC15A3DB2010BC93009C8977 /* weex-main-jsfm.js in Resources */, 59AC02511D2A7E6E00355112 /* wx_load_er...@3x.png in Resources */, @@ -3421,7 +3416,6 @@ buildActionMask = 2147483647; files = ( DCD8D0F52073393B0002C420 /* weex-main-jsfm.js in Resources */, - DCA445C91EFA58CE00D0CFA8 /* native-bundle-main.js in Resources */, DCD8D0F42073392A0002C420 /* weex-polyfill.js in Resources */, DCD8D0F62073393B0002C420 /* weex-rax-api.js in Resources */, DCA445CA1EFA58CE00D0CFA8 /* wx_load_er...@3x.png in Resources */, diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m index 811ed62..0dfe18d 100644 --- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m +++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m @@ -264,7 +264,7 @@ _Pragma("clang diagnostic pop") \ NSMutableDictionary * newOptions = options ? [options mutableCopy] : [NSMutableDictionary new]; NSMutableArray * newArguments = [arguments mutableCopy]; - if ([WXSDKManager sharedInstance].multiContext && [instance.bundleType.lowercaseString isEqualToString:@"rax"]) { + if ([instance.bundleType.lowercaseString isEqualToString:@"rax"]) { // we need to adjust __weex_options__ params in arguments to options compatible with rax javaScript framework. NSDictionary * weexOptions = nil; for(int i = 0;i < [arguments count]; i ++) { @@ -420,13 +420,9 @@ _Pragma("clang diagnostic pop") \ NSArray *args = nil; WX_MONITOR_INSTANCE_PERF_START(WXFirstScreenJSFExecuteTime, [WXSDKManager instanceForID:instanceIdString]); WX_MONITOR_INSTANCE_PERF_START(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]); - BOOL shoudMultiContext = [WXSDKManager sharedInstance].multiContext; - NSString * bundleType = nil; - - if (shoudMultiContext) { - bundleType = [self _pareJSBundleType:instanceIdString jsBundleString:jsBundleString]; // bundleType can be Vue, Rax and the new framework. - } - if (bundleType&&shoudMultiContext) { + + NSString * bundleType = [self _pareJSBundleType:instanceIdString jsBundleString:jsBundleString]; // bundleType can be Vue, Rax and the new framework. + if (bundleType) { [sdkInstance.apmInstance setProperty:KEY_PAGE_PROPERTIES_BUNDLE_TYPE withValue:bundleType]; NSMutableDictionary *newOptions = [options mutableCopy]; if (!options) { @@ -1029,29 +1025,26 @@ _Pragma("clang diagnostic pop") \ NSDictionary *userInfo = nil; BOOL commitException = YES; WXSDKInstance * instance = nil; - if ([WXSDKManager sharedInstance].multiContext) { - if (context.instanceId) { - // instance page javaScript runtime exception - instance = [WXSDKManager instanceForID:context.instanceId]; - if (instance) { - // instance already existed - commitException = YES; - } else { - // instance already destroyed - commitException = NO; - } + + if (context.instanceId) { + // instance page javaScript runtime exception + instance = [WXSDKManager instanceForID:context.instanceId]; + if (instance) { + // instance already existed + commitException = YES; } else { - // weex-main-jsfm.js runtime exception throws - message = [NSString stringWithFormat:@"[WX_KEY_EXCEPTION_WXBRIDGE] [%@:%@:%@] %@ js stack: %@", exception[@"sourceURL"], exception[@"line"], exception[@"column"], [exception toString], [exception[@"stack"] toObject]]; - if (!JSValueIsUndefined(context.JSGlobalContextRef, exception[@"sourceURL"].JSValueRef)) { - bundleUrl = exception[@"sourceURL"].toString; - } else { - bundleUrl = @"weex-main-jsfm"; - } - userInfo = [NSDictionary dictionary]; + // instance already destroyed + commitException = NO; } } else { - instance = [WXSDKEngine topInstance]; + // weex-main-jsfm.js runtime exception throws + message = [NSString stringWithFormat:@"[WX_KEY_EXCEPTION_WXBRIDGE] [%@:%@:%@] %@ js stack: %@", exception[@"sourceURL"], exception[@"line"], exception[@"column"], [exception toString], [exception[@"stack"] toObject]]; + if (!JSValueIsUndefined(context.JSGlobalContextRef, exception[@"sourceURL"].JSValueRef)) { + bundleUrl = exception[@"sourceURL"].toString; + } else { + bundleUrl = @"weex-main-jsfm"; + } + userInfo = [NSDictionary dictionary]; } NSDictionary* wxExtFuncInfo = [context[@"wxExtFuncInfo"] toDictionary]; diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.h b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.h index 6472ea7..f0f61e4 100644 --- a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.h +++ b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.h @@ -20,5 +20,8 @@ #import "WXBridgeProtocol.h" @interface WXJSCoreBridge : NSObject <WXBridgeProtocol> -@property (nonatomic,assign)BOOL multiContext; + +- (instancetype)init; +- (instancetype)initWithoutDefaultContext; + @end diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm index ade954d..de414bd 100644 --- a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm +++ b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm @@ -60,54 +60,18 @@ - (instancetype)init { - self = [super init]; - - if(self){ + self = [self initWithoutDefaultContext]; + [self createDefaultContext]; + return self; +} - _jsContext = [[JSContext alloc] init]; - if (WX_SYS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { - _jsContext.name = @"Weex Context"; - } +- (instancetype)initWithoutDefaultContext +{ + if (self = [super init]) { _timers = [NSMutableArray new]; _callbacks = [NSMutableDictionary new]; _intervalTimerId = 0; _intervaltimers = [NSMutableDictionary new]; - _multiContext = NO; - - __weak typeof(self) weakSelf = self; - - [WXBridgeContext mountContextEnvironment:_jsContext]; - - _jsContext[@"setTimeout"] = ^(JSValue *function, JSValue *timeout) { - // this setTimeout is used by internal logic in JS framework, normal setTimeout called by users will call WXTimerModule's method; - [weakSelf performSelector: @selector(triggerTimeout:) withObject:^() { - [function callWithArguments:@[]]; - } afterDelay:[timeout toDouble] / 1000]; - }; - - _jsContext[@"setTimeoutWeex"] = ^(JSValue *appId, JSValue *ret,JSValue *arg ) { - [weakSelf triggerTimeout:[appId toString] ret:[ret toString] arg:[arg toString]]; - }; - - _jsContext[@"setIntervalWeex"] = ^(JSValue *appId, JSValue *function,JSValue *arg) { - return [weakSelf triggerInterval:[appId toString] function:^() { - [function callWithArguments:@[]]; - } arg:[arg toString]]; - }; - - _jsContext[@"clearIntervalWeex"] = ^(JSValue *appId, JSValue *ret,JSValue *arg) { - - [weakSelf triggerClearInterval:[appId toString] ret:[[ret toNumber] longLongValue]]; - }; - - _jsContext[@"clearTimeoutWeex"] = ^(JSValue *ret) { - [weakSelf triggerClearTimeout:[ret toString]]; - }; - - _jsContext[@"extendCallNative"] = ^(JSValue *value ) { - return [weakSelf extendCallNative:[value toDictionary]]; - }; - } return self; } @@ -145,11 +109,7 @@ WXAssertParam(frameworkScript); if (WX_SYS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { - NSString * fileName = @"native-bundle-main.js"; - if ([WXSDKManager sharedInstance].multiContext) { - fileName = @"weex-main-jsfm.js"; - } - [_jsContext evaluateScript:frameworkScript withSourceURL:[NSURL URLWithString:fileName]]; + [_jsContext evaluateScript:frameworkScript withSourceURL:[NSURL URLWithString:@"weex-main-jsfm.js"]]; }else{ [_jsContext evaluateScript:frameworkScript]; } @@ -426,6 +386,49 @@ } #pragma mark - Private + +- (void)createDefaultContext +{ + __weak typeof(self) weakSelf = self; + + _jsContext = [[JSContext alloc] init]; + if (WX_SYS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { + _jsContext.name = @"Weex Context"; + } + + [WXBridgeContext mountContextEnvironment:_jsContext]; + + _jsContext[@"setTimeout"] = ^(JSValue *function, JSValue *timeout) { + // this setTimeout is used by internal logic in JS framework, normal setTimeout called by users will call WXTimerModule's method; + [weakSelf performSelector: @selector(triggerTimeout:) withObject:^() { + [function callWithArguments:@[]]; + } afterDelay:[timeout toDouble] / 1000]; + }; + + _jsContext[@"setTimeoutWeex"] = ^(JSValue *appId, JSValue *ret,JSValue *arg ) { + [weakSelf triggerTimeout:[appId toString] ret:[ret toString] arg:[arg toString]]; + }; + + _jsContext[@"setIntervalWeex"] = ^(JSValue *appId, JSValue *function,JSValue *arg) { + return [weakSelf triggerInterval:[appId toString] function:^() { + [function callWithArguments:@[]]; + } arg:[arg toString]]; + }; + + _jsContext[@"clearIntervalWeex"] = ^(JSValue *appId, JSValue *ret,JSValue *arg) { + + [weakSelf triggerClearInterval:[appId toString] ret:[[ret toNumber] longLongValue]]; + }; + + _jsContext[@"clearTimeoutWeex"] = ^(JSValue *ret) { + [weakSelf triggerClearTimeout:[ret toString]]; + }; + + _jsContext[@"extendCallNative"] = ^(JSValue *value ) { + return [weakSelf extendCallNative:[value toDictionary]]; + }; +} + -(void)addInstance:(NSString *)instance callback:(NSString *)callback { if(instance.length > 0){ diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m b/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m index 980d4fd..47a2880 100644 --- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m +++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m @@ -224,15 +224,6 @@ + (void)initSDKEnvironment { NSString *fileName = @"weex-main-jsfm"; - [WXSDKManager sharedInstance].multiContext = YES; - - if ([[NSUserDefaults standardUserDefaults] objectForKey:@"createInstanceUsingMutliContext"]) { - BOOL createInstanceUsingMutliContext = [[[NSUserDefaults standardUserDefaults] objectForKey:@"createInstanceUsingMutliContext"] boolValue]; - if (!createInstanceUsingMutliContext) { - fileName = @"native-bundle-main"; - [WXSDKManager sharedInstance].multiContext = NO; - } - } NSString *filePath = [[NSBundle bundleForClass:self] pathForResource:fileName ofType:@"js"]; if (filePath == nil) { filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"js"]; @@ -330,14 +321,6 @@ static NSDictionary *_customEnvironment; + (void)restart { NSString *fileName = @"weex-main-jsfm"; - [WXSDKManager sharedInstance].multiContext = YES; - if ([[NSUserDefaults standardUserDefaults] objectForKey:@"createInstanceUsingMutliContext"]) { - BOOL createInstanceUsingMutliContext = [[[NSUserDefaults standardUserDefaults] objectForKey:@"createInstanceUsingMutliContext"] boolValue]; - if (!createInstanceUsingMutliContext) { - fileName = @"native-bundle-main"; - [WXSDKManager sharedInstance].multiContext = NO; - } - } NSString *filePath = [[NSBundle bundleForClass:self] pathForResource:fileName ofType:@"js"]; if (filePath == nil) { filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"js"]; diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h index f272347..9f8e454 100644 --- a/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h +++ b/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h @@ -25,8 +25,6 @@ @interface WXSDKManager : NSObject -@property (nonatomic, assign) BOOL multiContext; - /** *@abstract Returns sdk manager */ diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m index 4a04c14..deb383e 100644 --- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m +++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m @@ -142,7 +142,7 @@ typedef enum : NSUInteger { } // WXDebugger is a singleton actually and should not call its init twice. - _instanceJavaScriptContext = _debugJS ? [NSClassFromString(@"WXDebugger") alloc] : [[WXJSCoreBridge alloc] init]; + _instanceJavaScriptContext = _debugJS ? [NSClassFromString(@"WXDebugger") alloc] : [[WXJSCoreBridge alloc] initWithoutDefaultContext]; if (!_debugJS) { id<WXBridgeProtocol> jsBridge = [[WXSDKManager bridgeMgr] valueForKeyPath:@"bridgeCtx.jsBridge"]; JSContext* globalContex = jsBridge.javaScriptContext; @@ -450,30 +450,15 @@ typedef enum : NSUInteger { BOOL enableRTLLayoutDirection = [[configCenter configForKey:@"iOS_weex_ext_config.enableRTLLayoutDirection" defaultValue:@(YES) isDefault:NULL] boolValue]; [WXUtility setEnableRTLLayoutDirection:enableRTLLayoutDirection]; - - BOOL shoudMultiContext = NO; - shoudMultiContext = [[configCenter configForKey:@"iOS_weex_ext_config.createInstanceUsingMutliContext" defaultValue:@(YES) isDefault:NULL] boolValue]; - if(shoudMultiContext && ![WXSDKManager sharedInstance].multiContext) { - [WXSDKManager sharedInstance].multiContext = YES; - [[NSUserDefaults standardUserDefaults] setObject:@"1" forKey:@"createInstanceUsingMutliContext"]; - [WXSDKEngine restart]; - return YES; - } - if (!shoudMultiContext && [WXSDKManager sharedInstance].multiContext) { - [WXSDKManager sharedInstance].multiContext = NO; - [[NSUserDefaults standardUserDefaults] setObject:@"0" forKey:@"createInstanceUsingMutliContext"]; - [WXSDKEngine restart]; - return YES; - } } return NO; } -- (void)renderWithMainBundleString:(NSNotification*)notification { +- (void)renderWithMainBundleString:(NSNotification*)notification +{ [self _renderWithMainBundleString:_mainBundleString]; } - - (void)_renderWithRequest:(WXResourceRequest *)request options:(NSDictionary *)options data:(id)data; { NSURL *url = request.URL;