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

Commit 86bc455

Browse files
committed
[iOS] output render timeline on iOS
1 parent ff2c079 commit 86bc455

File tree

14 files changed

+156
-17
lines changed

14 files changed

+156
-17
lines changed

ios/sdk/WeexSDK.xcodeproj/project.pbxproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,6 @@
272272
74FD6E041C7C0E9600DBEB6D /* WXScrollerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 74FD6E031C7C0E9600DBEB6D /* WXScrollerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
273273
7704894822AA358500E7606F /* WXConsoleLogModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 7704894622AA358400E7606F /* WXConsoleLogModule.h */; };
274274
7704894922AA358500E7606F /* WXConsoleLogModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 7704894622AA358400E7606F /* WXConsoleLogModule.h */; };
275-
7704894A22AA358500E7606F /* WXConsoleLogModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 7704894722AA358400E7606F /* WXConsoleLogModule.m */; };
276-
7704894B22AA358500E7606F /* WXConsoleLogModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 7704894722AA358400E7606F /* WXConsoleLogModule.m */; };
277275
7715EB6221A69DD9001F1108 /* WXRichText.h in Headers */ = {isa = PBXBuildFile; fileRef = 7715EB6021A69DD8001F1108 /* WXRichText.h */; settings = {ATTRIBUTES = (Public, ); }; };
278276
7715EB6321A69DD9001F1108 /* WXRichText.h in Headers */ = {isa = PBXBuildFile; fileRef = 7715EB6021A69DD8001F1108 /* WXRichText.h */; settings = {ATTRIBUTES = (Public, ); }; };
279277
7715EB6421A69DD9001F1108 /* WXRichText.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7715EB6121A69DD9001F1108 /* WXRichText.mm */; };
@@ -551,6 +549,8 @@
551549
BA5F00F21FC5AFFE00F76B5C /* WXLocaleModule.m in Sources */ = {isa = PBXBuildFile; fileRef = BA5F00F01FC5AFFE00F76B5C /* WXLocaleModule.m */; };
552550
BA5F00F31FC6834900F76B5C /* WXLocaleModule.h in Headers */ = {isa = PBXBuildFile; fileRef = BA5F00EF1FC5AFFE00F76B5C /* WXLocaleModule.h */; };
553551
BA5F00F41FC6834C00F76B5C /* WXLocaleModule.m in Sources */ = {isa = PBXBuildFile; fileRef = BA5F00F01FC5AFFE00F76B5C /* WXLocaleModule.m */; };
552+
BD35ADEA2303BEA60050ED82 /* WXConsoleLogModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = BD35ADE92303BEA60050ED82 /* WXConsoleLogModule.mm */; };
553+
BD35ADEB2303BEA60050ED82 /* WXConsoleLogModule.mm in Sources */ = {isa = PBXBuildFile; fileRef = BD35ADE92303BEA60050ED82 /* WXConsoleLogModule.mm */; };
554554
BD88C13722F02101004467AA /* render_action_add_child_to_richtext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD88C13522F02101004467AA /* render_action_add_child_to_richtext.cpp */; };
555555
BD88C13822F02101004467AA /* render_action_add_child_to_richtext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD88C13522F02101004467AA /* render_action_add_child_to_richtext.cpp */; };
556556
BD88C13922F02101004467AA /* render_action_add_child_to_richtext.h in Headers */ = {isa = PBXBuildFile; fileRef = BD88C13622F02101004467AA /* render_action_add_child_to_richtext.h */; };
@@ -1142,7 +1142,6 @@
11421142
74F7BFF41DC782EC004D0871 /* testRootView.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = testRootView.js; sourceTree = "<group>"; };
11431143
74FD6E031C7C0E9600DBEB6D /* WXScrollerProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXScrollerProtocol.h; sourceTree = "<group>"; };
11441144
7704894622AA358400E7606F /* WXConsoleLogModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXConsoleLogModule.h; sourceTree = "<group>"; };
1145-
7704894722AA358400E7606F /* WXConsoleLogModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXConsoleLogModule.m; sourceTree = "<group>"; };
11461145
7715EB6021A69DD8001F1108 /* WXRichText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXRichText.h; sourceTree = "<group>"; };
11471146
7715EB6121A69DD9001F1108 /* WXRichText.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WXRichText.mm; sourceTree = "<group>"; };
11481147
773CB1D6227F0C92005C758A /* JsonPage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JsonPage.h; sourceTree = "<group>"; };
@@ -1299,6 +1298,7 @@
12991298
B8F3323B2141A4C500701BA0 /* string_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_util.h; sourceTree = "<group>"; };
13001299
BA5F00EF1FC5AFFE00F76B5C /* WXLocaleModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WXLocaleModule.h; sourceTree = "<group>"; };
13011300
BA5F00F01FC5AFFE00F76B5C /* WXLocaleModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WXLocaleModule.m; sourceTree = "<group>"; };
1301+
BD35ADE92303BEA60050ED82 /* WXConsoleLogModule.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WXConsoleLogModule.mm; sourceTree = "<group>"; };
13021302
BD88C13522F02101004467AA /* render_action_add_child_to_richtext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_add_child_to_richtext.cpp; sourceTree = "<group>"; };
13031303
BD88C13622F02101004467AA /* render_action_add_child_to_richtext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_add_child_to_richtext.h; sourceTree = "<group>"; };
13041304
BD88C13B22F02111004467AA /* render_action_remove_child_from_richtext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_remove_child_from_richtext.cpp; sourceTree = "<group>"; };
@@ -1938,7 +1938,7 @@
19381938
isa = PBXGroup;
19391939
children = (
19401940
7704894622AA358400E7606F /* WXConsoleLogModule.h */,
1941-
7704894722AA358400E7606F /* WXConsoleLogModule.m */,
1941+
BD35ADE92303BEA60050ED82 /* WXConsoleLogModule.mm */,
19421942
BA5F00EF1FC5AFFE00F76B5C /* WXLocaleModule.h */,
19431943
BA5F00F01FC5AFFE00F76B5C /* WXLocaleModule.m */,
19441944
DCE2CF981F46D4220021BDC4 /* WXVoiceOverModule.m */,
@@ -3150,7 +3150,6 @@
31503150
742AD7321DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.m in Sources */,
31513151
74CFDD421F45941E007A1A66 /* WXRecycleListTemplateManager.m in Sources */,
31523152
747DF6831E31AEE4005C53A8 /* WXLength.m in Sources */,
3153-
7704894A22AA358500E7606F /* WXConsoleLogModule.m in Sources */,
31543153
17E5ACE2209211BD00EE81F1 /* WXTransition.mm in Sources */,
31553154
77E65A0E1C155E99008B8775 /* WXDivComponent.m in Sources */,
31563155
B8D66CAB21255730003960BD /* wson_util.cpp in Sources */,
@@ -3246,6 +3245,7 @@
32463245
74EF31AE1DE58BE200667A07 /* WXURLRewriteDefaultImpl.m in Sources */,
32473246
17B122262090AAB000387E33 /* WXSDKError.m in Sources */,
32483247
B8D66C1F21255730003960BD /* layout.cpp in Sources */,
3248+
BD35ADEA2303BEA60050ED82 /* WXConsoleLogModule.mm in Sources */,
32493249
B8D66C2B21255730003960BD /* render_manager.cpp in Sources */,
32503250
453F374E219A76A600A03F1D /* WXConvertUtility.mm in Sources */,
32513251
C4B3D6D51E6954300013F38D /* WXEditComponent.mm in Sources */,
@@ -3367,7 +3367,6 @@
33673367
B8D66C4C21255730003960BD /* render_action_remove_event.cpp in Sources */,
33683368
74B81AE41F73C3E500D3A61D /* WXRecycleListComponent.mm in Sources */,
33693369
B8D66C6421255730003960BD /* render_text.cpp in Sources */,
3370-
7704894B22AA358500E7606F /* WXConsoleLogModule.m in Sources */,
33713370
DC7764951F3C685200B5727E /* WXRecyclerDragController.m in Sources */,
33723371
B89543F420EB18B5006EAD63 /* WXCoreBridge.mm in Sources */,
33733372
DCA4453D1EFA55B300D0CFA8 /* WXRootView.m in Sources */,
@@ -3437,6 +3436,7 @@
34373436
DCA445651EFA55B300D0CFA8 /* WXClipboardModule.m in Sources */,
34383437
B8D66C4421255730003960BD /* render_action_remove_element.cpp in Sources */,
34393438
B8D66BFC2125572F003960BD /* render_performance.cpp in Sources */,
3439+
BD35ADEB2303BEA60050ED82 /* WXConsoleLogModule.mm in Sources */,
34403440
DCA445661EFA55B300D0CFA8 /* WXNavigatorModule.m in Sources */,
34413441
DCA445671EFA55B300D0CFA8 /* WXStorageModule.m in Sources */,
34423442
B8D66C2021255730003960BD /* layout.cpp in Sources */,

ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,11 @@ - (void)registerGlobalFunctions
147147
[_jsBridge registerCallUpdateComponentData:^NSInteger(NSString *instanceId, NSString *componentId, NSString *jsonData) {
148148
if (_dataRenderHandler) {
149149
WXPerformBlockOnComponentThread(^{
150+
long start = [WXUtility getUnixFixTimeMillis];
151+
WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
152+
[instance.apmInstance addUpdateComponentDataTimestamp:start];
150153
[_dataRenderHandler callUpdateComponentData:instanceId componentId:componentId jsonData:jsonData];
154+
[instance.apmInstance addUpdateComponentDataTime:[WXUtility getUnixFixTimeMillis] - start];
151155
});
152156
}
153157
else {
@@ -529,15 +533,12 @@ - (void)createInstance:(NSString *)instanceIdString
529533
}
530534
if ([WXDebugTool isDevToolDebug]) {
531535
[self callJSMethod:@"createInstanceContext" args:@[instanceIdString, newOptions, data?:@[],raxAPIScript?:@""]];
532-
[sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_LOAD_BUNDLE_END];
533536

534537
if ([NSURL URLWithString:sdkInstance.pageName]) {
535538
[sdkInstance.instanceJavaScriptContext executeJavascript:jsBundleString withSourceURL:[NSURL URLWithString:sdkInstance.pageName]];
536539
} else {
537540
[sdkInstance.instanceJavaScriptContext executeJavascript:jsBundleString];
538541
}
539-
WX_MONITOR_INSTANCE_PERF_END(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
540-
[sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_EXECUTE_BUNDLE_END];
541542
} else {
542543
NSDictionary* immutableOptions = [newOptions copy];
543544
sdkInstance.callCreateInstanceContext = [NSString stringWithFormat:@"instanceId:%@\noptions:%@\ndata:%@", instanceIdString, immutableOptions, data];
@@ -548,6 +549,7 @@ - (void)createInstance:(NSString *)instanceIdString
548549
@"instanceId":sdkInstance.instanceId?:@"unknownId"
549550
};
550551
__weak typeof(self) weakSelf = self;
552+
[sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_LOAD_BUNDLE_END];
551553
[self callJSMethod:@"createInstanceContext" args:@[instanceIdString, immutableOptions, data?:@[]] onContext:nil completion:^(JSValue *instanceContextEnvironment) {
552554
if (sdkInstance.pageName) {
553555
[sdkInstance.instanceJavaScriptContext.javaScriptContext setName:sdkInstance.pageName];
@@ -578,14 +580,13 @@ - (void)createInstance:(NSString *)instanceIdString
578580
}];
579581
}
580582
}
581-
583+
582584
if (raxAPIScript) {
583585
[sdkInstance.instanceJavaScriptContext executeJavascript:raxAPIScript withSourceURL:[NSURL URLWithString:raxAPIScriptPath]];
584586
NSArray* allKeys = [WXUtility extractPropertyNamesOfJSValueObject:sdkInstance.instanceJavaScriptContext.javaScriptContext.globalObject];
585587
sdkInstance.executeRaxApiResult = [NSString stringWithFormat:@"%@", allKeys];
586588
}
587589

588-
[sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_LOAD_BUNDLE_END];
589590
NSDictionary* funcInfo = @{
590591
@"func":@"createInstance",
591592
@"arg":@"start",

ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,8 @@ namespace WeexCore
232232

233233
+ (void)layoutPage:(NSString*)pageId forced:(BOOL)forced;
234234

235+
+ (double)getLayoutTime:(NSString*)pageId;
236+
235237
+ (void)closePage:(NSString*)pageId;
236238

237239
+ (BOOL)reloadPageLayout:(NSString*)pageId;

ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1639,6 +1639,14 @@ + (void)layoutPage:(NSString*)pageId forced:(BOOL)forced
16391639
}
16401640
}
16411641

1642+
+ (double)getLayoutTime:(NSString*)pageId {
1643+
if (platformBridge) {
1644+
const char* page = [pageId UTF8String] ?: "";
1645+
return platformBridge->core_side()->GetLayoutTime(page);
1646+
}
1647+
return 0;
1648+
}
1649+
16421650
+ (void)closePage:(NSString*)pageId
16431651
{
16441652
if (platformBridge) {

ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,8 +316,8 @@ - (void)addComponent:(NSString*)ref
316316
if (supercomponent.ignoreInteraction) {
317317
component.ignoreInteraction = YES;
318318
} else {
319-
if ([[attributes objectForKey:@"ignoreInteraction"] boolValue]) {
320-
component.ignoreInteraction = YES;
319+
if ([attributes objectForKey:@"ignoreInteraction"]) {
320+
component.ignoreInteraction = [[attributes objectForKey:@"ignoreInteraction"] boolValue];
321321
} else {
322322
if (component->_positionType == WXPositionTypeFixed) {
323323
component.ignoreInteraction = YES;

ios/sdk/WeexSDK/Sources/Model/WXComponent.mm

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -455,13 +455,12 @@ - (UIView *)view
455455
[self setNeedsDisplay];
456456
[[NSNotificationCenter defaultCenter] postNotificationName:WX_COMPONENT_NOTIFICATION_VIEW_LOADED object:self];
457457
[self viewDidLoad];
458+
double diffTime = CACurrentMediaTime()*1000 - startCreateViewTime;
459+
[self.weexInstance.performance recordViewCreatePerformance:diffTime];
458460

459461
if (_lazyCreateView) {
460462
[self _buildViewHierarchyLazily];
461463
}
462-
463-
double diffTime = CACurrentMediaTime()*1000 - startCreateViewTime;
464-
[self.weexInstance.performance recordViewCreatePerformance:diffTime];
465464
[self _handleFirstScreenTime];
466465

467466
[self.weexInstance.performance onViewLoad:self];

ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#import "WXImageComponent.h"
2929
#import "WXUtility.h"
3030
#import "WXAnalyzerCenter+Transfer.h"
31+
#import "WXCoreBridge.h"
3132

3233
@interface WXPerformance()
3334
@property (nonatomic, assign) bool hasRecordFsRenderTimeByPosition;
@@ -112,7 +113,7 @@ - (void) _handleRenderTime:(WXComponent*)targetComponent withModifyTime:(double)
112113
if ([targetComponent.type isEqualToString:@"videoplus"]) {
113114
return;
114115
}
115-
116+
116117
bool inScreen = CGRectIntersectsRect(rootFrame, absoluteFrame);
117118
if (!inScreen) {
118119
return;
@@ -131,6 +132,7 @@ - (void) _handleRenderTime:(WXComponent*)targetComponent withModifyTime:(double)
131132
[targetComponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_EXECUTE_JS_TIME curMaxValue:self.callJsTime];
132133
[targetComponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_CREATE_COMPONENT_TIME curMaxValue:self.componentCreateTime];
133134
[targetComponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_CREATE_VIEW_TIME curMaxValue:self.viewCreateTime];
135+
[targetComponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_LAYOUT_TIME curMaxValue:[WXCoreBridge getLayoutTime:targetComponent.weexInstance.instanceId]];
134136

135137
self.interactionTime = self.interactionTime < diff ? diff :self.interactionTime;
136138
}

ios/sdk/WeexSDK/Sources/Module/WXConsoleLogModule.m renamed to ios/sdk/WeexSDK/Sources/Module/WXConsoleLogModule.mm

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#import "WXConsoleLogModule.h"
2121
#import "WXLog.h"
22+
#include "base/log_defines.h"
2223

2324
#if !TARGET_OS_WATCH
2425
#import <asl.h>
@@ -91,21 +92,26 @@ - (void)switchLogLevel:(NSString*)logLevel callback:(WXKeepAliveCallback)callbac
9192
}
9293

9394
if ([logLevel isEqualToString:@"off"]) {
95+
weex::base::LogImplement::getLog()->setPrintLevel(WeexCore::LogLevel::Off);
9496
[WXLog registerExternalLog:OriginalLogger];
9597
}
9698
else if ([logLevel isEqualToString:@"error"]) {
99+
weex::base::LogImplement::getLog()->setPrintLevel(WeexCore::LogLevel::Error);
97100
[WXConsoleLogHandler sharedInstance].logLevel = WXLogLevelError;
98101
[WXLog registerExternalLog:[WXConsoleLogHandler sharedInstance]];
99102
}
100103
else if ([logLevel isEqualToString:@"warning"]) {
104+
weex::base::LogImplement::getLog()->setPrintLevel(WeexCore::LogLevel::Warn);
101105
[WXConsoleLogHandler sharedInstance].logLevel = WXLogLevelWarning;
102106
[WXLog registerExternalLog:[WXConsoleLogHandler sharedInstance]];
103107
}
104108
else if ([logLevel isEqualToString:@"info"]) {
109+
weex::base::LogImplement::getLog()->setPrintLevel(WeexCore::LogLevel::Info);
105110
[WXConsoleLogHandler sharedInstance].logLevel = WXLogLevelInfo;
106111
[WXLog registerExternalLog:[WXConsoleLogHandler sharedInstance]];
107112
}
108113
else if ([logLevel isEqualToString:@"debug"]) {
114+
weex::base::LogImplement::getLog()->setPrintLevel(WeexCore::LogLevel::Debug);
109115
[WXConsoleLogHandler sharedInstance].logLevel = WXLogLevelDebug;
110116
[WXLog registerExternalLog:[WXConsoleLogHandler sharedInstance]];
111117
}

ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ extern NSString* const KEY_PAGE_PROPERTIES_UIKIT_TYPE;
4545
extern NSString* const KEY_PAGE_STAGES_START;
4646
extern NSString* const KEY_PAGE_STAGES_DOWN_BUNDLE_START;
4747
extern NSString* const KEY_PAGE_STAGES_DOWN_BUNDLE_END;
48+
extern NSString* const KEY_PAGE_STAGES_DOWN_JS_START;
49+
extern NSString* const KEY_PAGE_STAGES_DOWN_JS_END;
4850
extern NSString* const KEY_PAGE_STAGES_CUSTOM_PREPROCESS_START;
4951
extern NSString* const KEY_PAGE_STAGES_CUSTOM_PREPROCESS_END;
5052
extern NSString* const KEY_PAGE_STAGES_RENDER_ORGIGIN;
@@ -66,6 +68,7 @@ extern NSString* const KEY_PAGE_STATS_FS_CALL_JS_NUM;
6668
extern NSString* const KEY_PAGE_STATS_EXECUTE_JS_TIME;
6769
extern NSString* const KEY_PAGE_STATS_CREATE_COMPONENT_TIME;
6870
extern NSString* const KEY_PAGE_STATS_CREATE_VIEW_TIME;
71+
extern NSString* const KEY_PAGE_STATS_LAYOUT_TIME;
6972
extern NSString* const KEY_PAGE_STATS_FS_TIMER_NUM;
7073
extern NSString* const KEY_PAGE_STATS_FS_CALL_NATIVE_TIME;
7174
extern NSString* const KEY_PAGE_STATS_FS_CALL_NATIVE_NUM;
@@ -137,6 +140,8 @@ extern NSString* const VALUE_ERROR_CODE_DEFAULT;
137140
- (void) updateMaxStats:(NSString *)name curMaxValue:(double)maxValue;
138141
- (void) updateExtInfoFromResponseHeader:(NSDictionary*) extInfo;
139142
- (void) forceSetInteractionTime:(long) unixTime;
143+
- (void) addUpdateComponentDataTimestamp:(long)unixTime;
144+
- (void) addUpdateComponentDataTime:(long)unixTime;
140145

141146

142147
#pragma mark - called by IWXHttpAdapter implementer

0 commit comments

Comments
 (0)