appium-webdriveragent 16.12.5 → 16.12.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.m +5 -2
- package/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m +3 -2
- package/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.m +113 -46
- package/WebDriverAgentLib/Commands/FBElementCommands.m +29 -9
- package/WebDriverAgentLib/Info.plist +2 -2
- package/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.m +2 -2
- package/WebDriverAgentLib/Utilities/FBMathUtils.h +28 -0
- package/WebDriverAgentLib/Utilities/FBMathUtils.m +26 -1
- package/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.m +3 -3
- package/WebDriverAgentTests/IntegrationApp/Classes/TouchableView.m +7 -1
- package/WebDriverAgentTests/IntegrationTests/FBElementSwipingTests.m +4 -4
- package/WebDriverAgentTests/IntegrationTests/FBIntegrationAppTests.m +12 -3
- package/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.h +7 -0
- package/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.m +10 -0
- package/WebDriverAgentTests/IntegrationTests/FBTapTest.m +83 -0
- package/build/lib/constants.d.ts +3 -0
- package/build/lib/constants.d.ts.map +1 -1
- package/build/lib/constants.js +3 -0
- package/build/lib/constants.js.map +1 -1
- package/build/lib/webdriveragent.d.ts.map +1 -1
- package/build/lib/webdriveragent.js +11 -25
- package/build/lib/webdriveragent.js.map +1 -1
- package/lib/constants.ts +3 -0
- package/lib/webdriveragent.ts +11 -28
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [16.12.7](https://github.com/appium/WebDriverAgent/compare/v16.12.6...v16.12.7) (2026-09-10)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* remaining strong box file ([#1255](https://github.com/appium/WebDriverAgent/issues/1255)) ([f5f7004](https://github.com/appium/WebDriverAgent/commit/f5f70041e463777d7604e84fd8d27bf11cb268b9))
|
|
6
|
+
|
|
7
|
+
## [16.12.6](https://github.com/appium/WebDriverAgent/compare/v16.12.5...v16.12.6) (2026-09-09)
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* rescale gesture coordinates for compatibility-mode window mismatches ([#1249](https://github.com/appium/WebDriverAgent/issues/1249)) ([25fcd95](https://github.com/appium/WebDriverAgent/commit/25fcd9558314c367c755b047cd0db0949654e90b))
|
|
12
|
+
|
|
1
13
|
## [16.12.5](https://github.com/appium/WebDriverAgent/compare/v16.12.4...v16.12.5) (2026-09-07)
|
|
2
14
|
|
|
3
15
|
### Bug Fixes
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
#if !TARGET_OS_TV
|
|
12
12
|
|
|
13
13
|
#import "FBErrorBuilder.h"
|
|
14
|
+
#import "FBMathUtils.h"
|
|
14
15
|
#import "XCUICoordinate.h"
|
|
15
16
|
#import "XCUIDevice.h"
|
|
16
17
|
|
|
@@ -36,8 +37,10 @@
|
|
|
36
37
|
} else {
|
|
37
38
|
CGVector offset = CGVectorMake(relativeCoordinate.CGPointValue.x,
|
|
38
39
|
relativeCoordinate.CGPointValue.y);
|
|
39
|
-
XCUICoordinate *hitPoint =
|
|
40
|
-
|
|
40
|
+
XCUICoordinate *hitPoint = FBCoordinateWithAnchorOffset(self, CGVectorMake(0, 0), offset, error);
|
|
41
|
+
if (nil == hitPoint) {
|
|
42
|
+
return NO;
|
|
43
|
+
}
|
|
41
44
|
if (nil == pressure || nil == duration) {
|
|
42
45
|
[hitPoint forcePress];
|
|
43
46
|
} else {
|
|
@@ -25,8 +25,9 @@ static const NSTimeInterval VALUE_CHANGE_TIMEOUT = 2;
|
|
|
25
25
|
{
|
|
26
26
|
id<FBXCElementSnapshot> snapshot = [self fb_standardSnapshot];
|
|
27
27
|
NSString *previousValue = snapshot.value;
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
// Stay in normalized offsets end-to-end: XCTest never rescales a composed raw
|
|
29
|
+
// coordinateWithOffset: for compatibility-mode windows (appium/appium#16185).
|
|
30
|
+
XCUICoordinate *endCoord = [self coordinateWithNormalizedOffset:CGVectorMake(0.5, 0.5 + relativeHeightOffset)];
|
|
30
31
|
// If picker value is reflected in its accessiblity id
|
|
31
32
|
// then fetching of the next snapshot may fail with StaleElementReferenceError
|
|
32
33
|
// because we bound elements by their accessbility ids by default.
|
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
#import "FBXCElementSnapshotWrapper.h"
|
|
17
17
|
#import "FBXCElementSnapshotWrapper+Helpers.h"
|
|
18
18
|
#import "XCUIElement+FBCaching.h"
|
|
19
|
+
#import "XCUIElement+FBResolve.h"
|
|
20
|
+
#import "XCUIElement+FBUID.h"
|
|
19
21
|
#import "XCUIApplication.h"
|
|
20
22
|
#import "XCUICoordinate.h"
|
|
21
23
|
#import "XCUIElement+FBIsVisible.h"
|
|
@@ -35,15 +37,37 @@ const CGFloat FBScrollTouchProportion = 0.75f;
|
|
|
35
37
|
|
|
36
38
|
@interface FBXCElementSnapshotWrapper (FBScrolling)
|
|
37
39
|
|
|
38
|
-
- (
|
|
39
|
-
- (
|
|
40
|
-
- (
|
|
41
|
-
- (
|
|
42
|
-
- (BOOL)fb_scrollByNormalizedVector:(CGVector)normalizedScrollVector
|
|
43
|
-
- (BOOL)fb_scrollByVector:(CGVector)vector
|
|
40
|
+
- (BOOL)fb_scrollUpByNormalizedDistance:(CGFloat)distance anchorElement:(XCUIElement *)anchorElement;
|
|
41
|
+
- (BOOL)fb_scrollDownByNormalizedDistance:(CGFloat)distance anchorElement:(XCUIElement *)anchorElement;
|
|
42
|
+
- (BOOL)fb_scrollLeftByNormalizedDistance:(CGFloat)distance anchorElement:(XCUIElement *)anchorElement;
|
|
43
|
+
- (BOOL)fb_scrollRightByNormalizedDistance:(CGFloat)distance anchorElement:(XCUIElement *)anchorElement;
|
|
44
|
+
- (BOOL)fb_scrollByNormalizedVector:(CGVector)normalizedScrollVector anchorElement:(XCUIElement *)anchorElement;
|
|
45
|
+
- (BOOL)fb_scrollByVector:(CGVector)vector anchorElement:(XCUIElement *)anchorElement error:(NSError **)error;
|
|
44
46
|
|
|
45
47
|
@end
|
|
46
48
|
|
|
49
|
+
/**
|
|
50
|
+
Resolves a live element for the given snapshot, so gesture coordinates can be anchored
|
|
51
|
+
to it (its frame gets rescaled by XCTest for compatibility-mode windows; a raw
|
|
52
|
+
XCUIApplication anchor never does - see appium/appium#16185). Returns nil, rather than
|
|
53
|
+
falling back to the application, if the snapshot can no longer be located: anchoring to
|
|
54
|
+
the application would silently reproduce the very bug this is fixing.
|
|
55
|
+
*/
|
|
56
|
+
static XCUIElement *FBLiveElementForSnapshot(id<FBXCElementSnapshot> snapshot, XCUIApplication *application)
|
|
57
|
+
{
|
|
58
|
+
NSString *uid = [FBXCElementSnapshotWrapper wdUIDWithSnapshot:snapshot];
|
|
59
|
+
if (nil == uid) {
|
|
60
|
+
return nil;
|
|
61
|
+
}
|
|
62
|
+
XCUIElement *result;
|
|
63
|
+
@autoreleasepool {
|
|
64
|
+
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K = %@", FBStringify(FBXCElementSnapshotWrapper, fb_uid), uid];
|
|
65
|
+
result = [[application.fb_query descendantsMatchingType:XCUIElementTypeAny] matchingPredicate:predicate].allElementsBoundByIndex.firstObject;
|
|
66
|
+
}
|
|
67
|
+
result.fb_isResolvedNatively = @NO;
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
|
|
47
71
|
@implementation XCUIElement (FBScrolling)
|
|
48
72
|
|
|
49
73
|
- (BOOL)fb_nativeScrollToVisibleWithError:(NSError **)error
|
|
@@ -61,28 +85,28 @@ const CGFloat FBScrollTouchProportion = 0.75f;
|
|
|
61
85
|
{
|
|
62
86
|
id<FBXCElementSnapshot> snapshot = [self fb_customSnapshot];
|
|
63
87
|
[[FBXCElementSnapshotWrapper ensureWrapped:snapshot] fb_scrollUpByNormalizedDistance:distance
|
|
64
|
-
|
|
88
|
+
anchorElement:self];
|
|
65
89
|
}
|
|
66
90
|
|
|
67
91
|
- (void)fb_scrollDownByNormalizedDistance:(CGFloat)distance
|
|
68
92
|
{
|
|
69
93
|
id<FBXCElementSnapshot> snapshot = [self fb_customSnapshot];
|
|
70
94
|
[[FBXCElementSnapshotWrapper ensureWrapped:snapshot] fb_scrollDownByNormalizedDistance:distance
|
|
71
|
-
|
|
95
|
+
anchorElement:self];
|
|
72
96
|
}
|
|
73
97
|
|
|
74
98
|
- (void)fb_scrollLeftByNormalizedDistance:(CGFloat)distance
|
|
75
99
|
{
|
|
76
100
|
id<FBXCElementSnapshot> snapshot = [self fb_customSnapshot];
|
|
77
101
|
[[FBXCElementSnapshotWrapper ensureWrapped:snapshot] fb_scrollLeftByNormalizedDistance:distance
|
|
78
|
-
|
|
102
|
+
anchorElement:self];
|
|
79
103
|
}
|
|
80
104
|
|
|
81
105
|
- (void)fb_scrollRightByNormalizedDistance:(CGFloat)distance
|
|
82
106
|
{
|
|
83
107
|
id<FBXCElementSnapshot> snapshot = [self fb_customSnapshot];
|
|
84
108
|
[[FBXCElementSnapshotWrapper ensureWrapped:snapshot] fb_scrollRightByNormalizedDistance:distance
|
|
85
|
-
|
|
109
|
+
anchorElement:self];
|
|
86
110
|
}
|
|
87
111
|
|
|
88
112
|
- (BOOL)fb_scrollToVisibleWithError:(NSError **)error
|
|
@@ -176,30 +200,52 @@ const CGFloat FBScrollTouchProportion = 0.75f;
|
|
|
176
200
|
}
|
|
177
201
|
}
|
|
178
202
|
|
|
203
|
+
// The scroll view's own identity is stable across scroll steps, so it only needs
|
|
204
|
+
// to be resolved to a live element once, up front; its frame does not, since it can
|
|
205
|
+
// change across scroll steps (rotation, keyboard, dynamic layout).
|
|
206
|
+
XCUIElement *scrollViewElement = FBLiveElementForSnapshot(scrollView, self.application);
|
|
207
|
+
if (nil == scrollViewElement) {
|
|
208
|
+
return
|
|
209
|
+
[[[FBErrorBuilder builder]
|
|
210
|
+
withDescriptionFormat:@"Failed to resolve a live element for the scrollable parent of '%@'", self.description]
|
|
211
|
+
buildError:error];
|
|
212
|
+
}
|
|
213
|
+
|
|
179
214
|
const NSUInteger maxScrollCount = 25;
|
|
180
215
|
NSUInteger scrollCount = 0;
|
|
181
|
-
FBXCElementSnapshotWrapper *scrollViewWrapped
|
|
216
|
+
FBXCElementSnapshotWrapper *scrollViewWrapped;
|
|
182
217
|
// Scrolling till cell is visible and get current value of frames
|
|
183
218
|
while (![self fb_isEquivalentElementSnapshotVisible:prescrollSnapshot] && scrollCount < maxScrollCount) {
|
|
219
|
+
BOOL didScroll;
|
|
184
220
|
@autoreleasepool {
|
|
221
|
+
// Re-snapshotting the scroll view every step keeps its frame from drifting too far
|
|
222
|
+
// out of sync with the live anchor element's frame used to resolve touch points.
|
|
223
|
+
scrollViewWrapped = [FBXCElementSnapshotWrapper ensureWrapped:[scrollViewElement fb_customSnapshot]];
|
|
185
224
|
if (targetCellIndex < visibleCellIndex) {
|
|
186
|
-
scrollDirection == FBXCUIElementScrollDirectionVertical ?
|
|
225
|
+
didScroll = scrollDirection == FBXCUIElementScrollDirectionVertical ?
|
|
187
226
|
[scrollViewWrapped fb_scrollUpByNormalizedDistance:normalizedScrollDistance
|
|
188
|
-
|
|
227
|
+
anchorElement:scrollViewElement] :
|
|
189
228
|
[scrollViewWrapped fb_scrollLeftByNormalizedDistance:normalizedScrollDistance
|
|
190
|
-
|
|
229
|
+
anchorElement:scrollViewElement];
|
|
191
230
|
}
|
|
192
231
|
else {
|
|
193
|
-
scrollDirection == FBXCUIElementScrollDirectionVertical ?
|
|
232
|
+
didScroll = scrollDirection == FBXCUIElementScrollDirectionVertical ?
|
|
194
233
|
[scrollViewWrapped fb_scrollDownByNormalizedDistance:normalizedScrollDistance
|
|
195
|
-
|
|
234
|
+
anchorElement:scrollViewElement] :
|
|
196
235
|
[scrollViewWrapped fb_scrollRightByNormalizedDistance:normalizedScrollDistance
|
|
197
|
-
|
|
236
|
+
anchorElement:scrollViewElement];
|
|
198
237
|
}
|
|
199
238
|
scrollCount++;
|
|
200
239
|
// Wait for scroll animation
|
|
201
240
|
[self fb_waitUntilStableWithTimeout:FBConfiguration.sharedInstance.animationCoolOffTimeout];
|
|
202
241
|
}
|
|
242
|
+
// The `error` out-param must not be written from inside the autorelease pool above.
|
|
243
|
+
if (!didScroll) {
|
|
244
|
+
return
|
|
245
|
+
[[[FBErrorBuilder builder]
|
|
246
|
+
withDescriptionFormat:@"Failed to scroll '%@': its frame is empty", self.description]
|
|
247
|
+
buildError:error];
|
|
248
|
+
}
|
|
203
249
|
}
|
|
204
250
|
|
|
205
251
|
if (scrollCount >= maxScrollCount) {
|
|
@@ -215,12 +261,13 @@ const CGFloat FBScrollTouchProportion = 0.75f;
|
|
|
215
261
|
FBXCElementSnapshotWrapper *targetCellSnapshotWrapped = [FBXCElementSnapshotWrapper ensureWrapped:[self fb_customSnapshot]];
|
|
216
262
|
targetCellSnapshot = [targetCellSnapshotWrapped fb_parentCellSnapshot];
|
|
217
263
|
CGRect visibleFrame = [FBXCElementSnapshotWrapper ensureWrapped:targetCellSnapshot].fb_visibleFrame;
|
|
218
|
-
|
|
264
|
+
|
|
219
265
|
CGVector scrollVector = CGVectorMake(visibleFrame.size.width - targetCellSnapshot.frame.size.width,
|
|
220
266
|
visibleFrame.size.height - targetCellSnapshot.frame.size.height
|
|
221
267
|
);
|
|
268
|
+
scrollViewWrapped = [FBXCElementSnapshotWrapper ensureWrapped:[scrollViewElement fb_customSnapshot]];
|
|
222
269
|
return [scrollViewWrapped fb_scrollByVector:scrollVector
|
|
223
|
-
|
|
270
|
+
anchorElement:scrollViewElement
|
|
224
271
|
error:error];
|
|
225
272
|
}
|
|
226
273
|
|
|
@@ -254,42 +301,42 @@ const CGFloat FBScrollTouchProportion = 0.75f;
|
|
|
254
301
|
return self.visibleFrame;
|
|
255
302
|
}
|
|
256
303
|
|
|
257
|
-
- (
|
|
258
|
-
|
|
304
|
+
- (BOOL)fb_scrollUpByNormalizedDistance:(CGFloat)distance
|
|
305
|
+
anchorElement:(XCUIElement *)anchorElement
|
|
259
306
|
{
|
|
260
|
-
[self fb_scrollByNormalizedVector:CGVectorMake(0.0, distance)
|
|
307
|
+
return [self fb_scrollByNormalizedVector:CGVectorMake(0.0, distance) anchorElement:anchorElement];
|
|
261
308
|
}
|
|
262
309
|
|
|
263
|
-
- (
|
|
264
|
-
|
|
310
|
+
- (BOOL)fb_scrollDownByNormalizedDistance:(CGFloat)distance
|
|
311
|
+
anchorElement:(XCUIElement *)anchorElement
|
|
265
312
|
{
|
|
266
|
-
[self fb_scrollByNormalizedVector:CGVectorMake(0.0, -distance)
|
|
313
|
+
return [self fb_scrollByNormalizedVector:CGVectorMake(0.0, -distance) anchorElement:anchorElement];
|
|
267
314
|
}
|
|
268
315
|
|
|
269
|
-
- (
|
|
270
|
-
|
|
316
|
+
- (BOOL)fb_scrollLeftByNormalizedDistance:(CGFloat)distance
|
|
317
|
+
anchorElement:(XCUIElement *)anchorElement
|
|
271
318
|
{
|
|
272
|
-
[self fb_scrollByNormalizedVector:CGVectorMake(distance, 0.0)
|
|
319
|
+
return [self fb_scrollByNormalizedVector:CGVectorMake(distance, 0.0) anchorElement:anchorElement];
|
|
273
320
|
}
|
|
274
321
|
|
|
275
|
-
- (
|
|
276
|
-
|
|
322
|
+
- (BOOL)fb_scrollRightByNormalizedDistance:(CGFloat)distance
|
|
323
|
+
anchorElement:(XCUIElement *)anchorElement
|
|
277
324
|
{
|
|
278
|
-
[self fb_scrollByNormalizedVector:CGVectorMake(-distance, 0.0)
|
|
325
|
+
return [self fb_scrollByNormalizedVector:CGVectorMake(-distance, 0.0) anchorElement:anchorElement];
|
|
279
326
|
}
|
|
280
327
|
|
|
281
328
|
- (BOOL)fb_scrollByNormalizedVector:(CGVector)normalizedScrollVector
|
|
282
|
-
|
|
329
|
+
anchorElement:(XCUIElement *)anchorElement
|
|
283
330
|
{
|
|
284
331
|
CGVector scrollVector = CGVectorMake(CGRectGetWidth(self.scrollingFrame) * normalizedScrollVector.dx,
|
|
285
332
|
CGRectGetHeight(self.scrollingFrame) * normalizedScrollVector.dy
|
|
286
333
|
);
|
|
287
|
-
return [self fb_scrollByVector:scrollVector
|
|
334
|
+
return [self fb_scrollByVector:scrollVector anchorElement:anchorElement error:nil];
|
|
288
335
|
}
|
|
289
336
|
|
|
290
337
|
- (BOOL)fb_scrollByVector:(CGVector)vector
|
|
291
|
-
|
|
292
|
-
|
|
338
|
+
anchorElement:(XCUIElement *)anchorElement
|
|
339
|
+
error:(NSError **)error
|
|
293
340
|
{
|
|
294
341
|
CGVector scrollBoundingVector = CGVectorMake(
|
|
295
342
|
CGRectGetWidth(self.scrollingFrame) * FBScrollTouchProportion,
|
|
@@ -306,29 +353,49 @@ const CGFloat FBScrollTouchProportion = 0.75f;
|
|
|
306
353
|
fabs(vector.dy) > fabs(scrollBoundingVector.dy) ? scrollBoundingVector.dy : vector.dy);
|
|
307
354
|
vector = CGVectorMake(vector.dx - scrollVector.dx, vector.dy - scrollVector.dy);
|
|
308
355
|
shouldFinishScrolling = FBVectorFuzzyEqualToVector(vector, CGZeroVector, 1) || --preciseScrollAttemptsCount <= 0;
|
|
309
|
-
if (![self fb_scrollAncestorScrollViewByVectorWithinScrollViewFrame:scrollVector
|
|
356
|
+
if (![self fb_scrollAncestorScrollViewByVectorWithinScrollViewFrame:scrollVector anchorElement:anchorElement error:error]){
|
|
310
357
|
return NO;
|
|
311
358
|
}
|
|
312
359
|
}
|
|
313
360
|
return YES;
|
|
314
361
|
}
|
|
315
362
|
|
|
316
|
-
|
|
363
|
+
// Normalized (0.0-1.0) touch-down offset within the scrolling frame, for the given
|
|
364
|
+
// scroll vector's direction.
|
|
365
|
+
- (CGVector)fb_normalizedHitPointOffsetForScrollingVector:(CGVector)scrollingVector
|
|
317
366
|
{
|
|
318
|
-
CGFloat x =
|
|
319
|
-
CGFloat y =
|
|
320
|
-
return CGVectorMake(
|
|
367
|
+
CGFloat x = scrollingVector.dx < 0.0f ? FBScrollTouchProportion : (1 - FBScrollTouchProportion);
|
|
368
|
+
CGFloat y = scrollingVector.dy < 0.0f ? FBScrollTouchProportion : (1 - FBScrollTouchProportion);
|
|
369
|
+
return CGVectorMake(x, y);
|
|
321
370
|
}
|
|
322
371
|
|
|
323
372
|
- (BOOL)fb_scrollAncestorScrollViewByVectorWithinScrollViewFrame:(CGVector)vector
|
|
324
|
-
|
|
325
|
-
|
|
373
|
+
anchorElement:(XCUIElement *)anchorElement
|
|
374
|
+
error:(NSError **)error
|
|
326
375
|
{
|
|
327
|
-
|
|
376
|
+
CGRect scrollingFrame = self.scrollingFrame;
|
|
377
|
+
CGRect anchorFrame = anchorElement.frame;
|
|
378
|
+
if (CGRectIsEmpty(scrollingFrame) || CGRectIsEmpty(anchorFrame)) {
|
|
379
|
+
return [[[FBErrorBuilder builder]
|
|
380
|
+
withDescriptionFormat:@"Cannot compute a scroll gesture for '%@': its frame is empty", self.fb_description]
|
|
381
|
+
buildError:error];
|
|
382
|
+
}
|
|
328
383
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
384
|
+
// Compute the touch-down/up points within the (possibly clipped) scrolling frame as
|
|
385
|
+
// before, then express them as fractions of the anchor element's own frame instead of
|
|
386
|
+
// raw points, which XCTest never rescales for compatibility-mode windows
|
|
387
|
+
// (appium/appium#16185). When scrollingFrame == anchorFrame this resolves to the exact
|
|
388
|
+
// same absolute point as before; it only differs once XCTest itself rescales anchorFrame.
|
|
389
|
+
CGVector proportion = [self fb_normalizedHitPointOffsetForScrollingVector:vector];
|
|
390
|
+
CGPoint startPoint = CGPointMake((CGFloat)floor(scrollingFrame.origin.x + scrollingFrame.size.width * proportion.dx),
|
|
391
|
+
(CGFloat)floor(scrollingFrame.origin.y + scrollingFrame.size.height * proportion.dy));
|
|
392
|
+
CGPoint endPoint = CGPointMake((CGFloat)floor(startPoint.x + vector.dx), (CGFloat)floor(startPoint.y + vector.dy));
|
|
393
|
+
CGVector startOffset = CGVectorMake((startPoint.x - anchorFrame.origin.x) / anchorFrame.size.width,
|
|
394
|
+
(startPoint.y - anchorFrame.origin.y) / anchorFrame.size.height);
|
|
395
|
+
CGVector endOffset = CGVectorMake((endPoint.x - anchorFrame.origin.x) / anchorFrame.size.width,
|
|
396
|
+
(endPoint.y - anchorFrame.origin.y) / anchorFrame.size.height);
|
|
397
|
+
XCUICoordinate *startCoordinate = [anchorElement coordinateWithNormalizedOffset:startOffset];
|
|
398
|
+
XCUICoordinate *endCoordinate = [anchorElement coordinateWithNormalizedOffset:endOffset];
|
|
332
399
|
|
|
333
400
|
if (FBPointFuzzyEqualToPoint(startCoordinate.screenPoint, endCoordinate.screenPoint, FBFuzzyPointThreshold)) {
|
|
334
401
|
return YES;
|
|
@@ -353,14 +353,23 @@
|
|
|
353
353
|
+ (id<FBResponsePayload>)handlePressAndDragCoordinateWithVelocity:(FBRouteRequest *)request
|
|
354
354
|
{
|
|
355
355
|
XCUIApplication *application = request.session.activeApplication;
|
|
356
|
+
NSError *error;
|
|
356
357
|
CGVector startOffset = CGVectorMake((CGFloat)[request.arguments[@"fromX"] doubleValue],
|
|
357
358
|
(CGFloat)[request.arguments[@"fromY"] doubleValue]);
|
|
358
359
|
XCUICoordinate *startCoordinate = [self.class gestureCoordinateWithOffset:startOffset
|
|
359
|
-
element:application
|
|
360
|
+
element:application
|
|
361
|
+
error:&error];
|
|
362
|
+
if (nil == startCoordinate) {
|
|
363
|
+
return FBResponseWithStatus([FBCommandStatus invalidElementStateErrorWithMessage:error.description traceback:nil]);
|
|
364
|
+
}
|
|
360
365
|
CGVector endOffset = CGVectorMake((CGFloat)[request.arguments[@"toX"] doubleValue],
|
|
361
366
|
(CGFloat)[request.arguments[@"toY"] doubleValue]);
|
|
362
367
|
XCUICoordinate *endCoordinate = [self.class gestureCoordinateWithOffset:endOffset
|
|
363
|
-
element:application
|
|
368
|
+
element:application
|
|
369
|
+
error:&error];
|
|
370
|
+
if (nil == endCoordinate) {
|
|
371
|
+
return FBResponseWithStatus([FBCommandStatus invalidElementStateErrorWithMessage:error.description traceback:nil]);
|
|
372
|
+
}
|
|
364
373
|
[startCoordinate pressForDuration:[request.arguments[@"pressDuration"] doubleValue]
|
|
365
374
|
thenDragToCoordinate:endCoordinate
|
|
366
375
|
withVelocity:[request.arguments[@"velocity"] doubleValue]
|
|
@@ -433,12 +442,19 @@
|
|
|
433
442
|
+ (id<FBResponsePayload>)handleDrag:(FBRouteRequest *)request
|
|
434
443
|
{
|
|
435
444
|
XCUIElement *target = [self targetFromRequest:request];
|
|
445
|
+
NSError *error;
|
|
436
446
|
CGVector startOffset = CGVectorMake([request.arguments[@"fromX"] doubleValue],
|
|
437
447
|
[request.arguments[@"fromY"] doubleValue]);
|
|
438
|
-
XCUICoordinate *startCoordinate = [self.class gestureCoordinateWithOffset:startOffset element:target];
|
|
448
|
+
XCUICoordinate *startCoordinate = [self.class gestureCoordinateWithOffset:startOffset element:target error:&error];
|
|
449
|
+
if (nil == startCoordinate) {
|
|
450
|
+
return FBResponseWithStatus([FBCommandStatus invalidElementStateErrorWithMessage:error.description traceback:nil]);
|
|
451
|
+
}
|
|
439
452
|
CGVector endOffset = CGVectorMake([request.arguments[@"toX"] doubleValue],
|
|
440
453
|
[request.arguments[@"toY"] doubleValue]);
|
|
441
|
-
XCUICoordinate *endCoordinate = [self.class gestureCoordinateWithOffset:endOffset element:target];
|
|
454
|
+
XCUICoordinate *endCoordinate = [self.class gestureCoordinateWithOffset:endOffset element:target error:&error];
|
|
455
|
+
if (nil == endCoordinate) {
|
|
456
|
+
return FBResponseWithStatus([FBCommandStatus invalidElementStateErrorWithMessage:error.description traceback:nil]);
|
|
457
|
+
}
|
|
442
458
|
NSTimeInterval duration = [request.arguments[@"duration"] doubleValue];
|
|
443
459
|
[startCoordinate pressForDuration:duration thenDragToCoordinate:endCoordinate];
|
|
444
460
|
return FBResponseWithOK();
|
|
@@ -659,12 +675,15 @@ static const NSInteger DEFAULT_MAX_PICKER_ATTEMPTS = 25;
|
|
|
659
675
|
|
|
660
676
|
@param offset absolute screen offset for the given application
|
|
661
677
|
@param element the element instance to perform the gesture on
|
|
662
|
-
@
|
|
678
|
+
@param error Error instance if any
|
|
679
|
+
@return translated gesture coordinates ready to be passed to XCUICoordinate methods, or
|
|
680
|
+
nil if the element is not visible on the screen
|
|
663
681
|
*/
|
|
664
|
-
+ (XCUICoordinate *)gestureCoordinateWithOffset:(CGVector)offset
|
|
665
|
-
|
|
682
|
+
+ (nullable XCUICoordinate *)gestureCoordinateWithOffset:(CGVector)offset
|
|
683
|
+
element:(XCUIElement *)element
|
|
684
|
+
error:(NSError **)error
|
|
666
685
|
{
|
|
667
|
-
return
|
|
686
|
+
return FBCoordinateWithAnchorOffset(element, CGVectorMake(0, 0), offset, error);
|
|
668
687
|
}
|
|
669
688
|
|
|
670
689
|
/**
|
|
@@ -688,7 +707,8 @@ static const NSInteger DEFAULT_MAX_PICKER_ATTEMPTS = 25;
|
|
|
688
707
|
return nil;
|
|
689
708
|
}
|
|
690
709
|
return [self gestureCoordinateWithOffset:CGVectorMake(x.doubleValue, y.doubleValue)
|
|
691
|
-
element:[self targetFromRequest:request]
|
|
710
|
+
element:[self targetFromRequest:request]
|
|
711
|
+
error:error];
|
|
692
712
|
}
|
|
693
713
|
|
|
694
714
|
/**
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
<key>CFBundlePackageType</key>
|
|
16
16
|
<string>FMWK</string>
|
|
17
17
|
<key>CFBundleShortVersionString</key>
|
|
18
|
-
<string>16.12.
|
|
18
|
+
<string>16.12.7</string>
|
|
19
19
|
<key>CFBundleSignature</key>
|
|
20
20
|
<string>????</string>
|
|
21
21
|
<key>CFBundleVersion</key>
|
|
22
|
-
<string>16.12.
|
|
22
|
+
<string>16.12.7</string>
|
|
23
23
|
<key>NSPrincipalClass</key>
|
|
24
24
|
<string/>
|
|
25
25
|
</dict>
|
|
@@ -74,9 +74,9 @@
|
|
|
74
74
|
return [element coordinateWithNormalizedOffset:CGVectorMake(0.5, 0.5)];
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
CGVector offset = CGVectorMake(positionOffset.CGPointValue.x, positionOffset.CGPointValue.y);
|
|
78
77
|
// TODO: Shall we throw an exception if hitPoint is out of the element frame?
|
|
79
|
-
|
|
78
|
+
CGVector offset = CGVectorMake(positionOffset.CGPointValue.x, positionOffset.CGPointValue.y);
|
|
79
|
+
return FBCoordinateWithAnchorOffset((XCUIElement *)element, CGVectorMake(0, 0), offset, error);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
@end
|
|
@@ -9,6 +9,10 @@
|
|
|
9
9
|
#import <UIKit/UIKit.h>
|
|
10
10
|
|
|
11
11
|
@class XCUIApplication;
|
|
12
|
+
@class XCUICoordinate;
|
|
13
|
+
@class XCUIElement;
|
|
14
|
+
|
|
15
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
12
16
|
|
|
13
17
|
extern CGFloat FBDefaultFrameFuzzyThreshold;
|
|
14
18
|
|
|
@@ -34,3 +38,27 @@ BOOL FBRectFuzzyEqualToRect(CGRect rect1, CGRect rect2, CGFloat threshold);
|
|
|
34
38
|
/*! Inverts size if necessary to match current screen orientation */
|
|
35
39
|
CGSize FBAdjustDimensionsForApplication(CGSize actualSize, UIInterfaceOrientation orientation);
|
|
36
40
|
#endif
|
|
41
|
+
|
|
42
|
+
#if !TARGET_OS_TV
|
|
43
|
+
/*!
|
|
44
|
+
Builds a coordinate for the given element from a raw points offset measured from a
|
|
45
|
+
normalized anchor point within the element's own frame - e.g. (0, 0) for an offset
|
|
46
|
+
relative to the top-left corner, (0.5, 0.5) for one relative to the center, as W3C
|
|
47
|
+
actions use. The offset is normalized against the element's wdFrame (the same
|
|
48
|
+
WDA-reported coordinate space pointsOffset itself is measured in) instead of being
|
|
49
|
+
passed through as a raw points offset, which XCTest never rescales for
|
|
50
|
+
compatibility-mode windows (see appium/appium#16185).
|
|
51
|
+
|
|
52
|
+
@param element the element to anchor the coordinate to
|
|
53
|
+
@param anchorOffset normalized offset of the anchor point within the element's wdFrame
|
|
54
|
+
@param pointsOffset raw points offset from the anchor point, in wdFrame's coordinate space
|
|
55
|
+
@param error populated if the element's frame is empty (not visible on the screen)
|
|
56
|
+
@return the resulting coordinate, or nil if the element's frame is empty
|
|
57
|
+
*/
|
|
58
|
+
XCUICoordinate * _Nullable FBCoordinateWithAnchorOffset(XCUIElement *element,
|
|
59
|
+
CGVector anchorOffset,
|
|
60
|
+
CGVector pointsOffset,
|
|
61
|
+
NSError **error);
|
|
62
|
+
#endif
|
|
63
|
+
|
|
64
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -8,7 +8,11 @@
|
|
|
8
8
|
|
|
9
9
|
#import "FBMathUtils.h"
|
|
10
10
|
|
|
11
|
+
#import "FBErrorBuilder.h"
|
|
11
12
|
#import "FBMacros.h"
|
|
13
|
+
#import "XCUICoordinate.h"
|
|
14
|
+
#import "XCUIElement.h"
|
|
15
|
+
#import "XCUIElement+FBWebDriverAttributes.h"
|
|
12
16
|
|
|
13
17
|
CGFloat FBDefaultFrameFuzzyThreshold = 2.0;
|
|
14
18
|
|
|
@@ -51,7 +55,7 @@ CGSize FBAdjustDimensionsForApplication(CGSize actualSize, UIInterfaceOrientatio
|
|
|
51
55
|
if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
|
|
52
56
|
/*
|
|
53
57
|
There is an XCTest bug that application.frame property returns exchanged dimensions for landscape mode.
|
|
54
|
-
This verification is just to make sure the bug is still there (since height is never greater than width in landscape)
|
|
58
|
+
This verification is just to make sure the bug is still there (since height is never greater than width in landscape)
|
|
55
59
|
and to make it still working properly after XCTest itself starts to respect landscape mode.
|
|
56
60
|
*/
|
|
57
61
|
if (actualSize.height > actualSize.width) {
|
|
@@ -61,3 +65,24 @@ CGSize FBAdjustDimensionsForApplication(CGSize actualSize, UIInterfaceOrientatio
|
|
|
61
65
|
return actualSize;
|
|
62
66
|
}
|
|
63
67
|
#endif
|
|
68
|
+
|
|
69
|
+
#if !TARGET_OS_TV
|
|
70
|
+
XCUICoordinate *FBCoordinateWithAnchorOffset(XCUIElement *element,
|
|
71
|
+
CGVector anchorOffset,
|
|
72
|
+
CGVector pointsOffset,
|
|
73
|
+
NSError **error)
|
|
74
|
+
{
|
|
75
|
+
// wdFrame matches the coordinate space pointsOffset was measured in; element.frame alone
|
|
76
|
+
// can already be pre-scaled for a compatibility-mode window mismatch, double-applying it.
|
|
77
|
+
CGRect frame = element.wdFrame;
|
|
78
|
+
if (CGRectIsEmpty(frame)) {
|
|
79
|
+
[[[FBErrorBuilder builder]
|
|
80
|
+
withDescriptionFormat:@"The element '%@' is not visible on the screen and thus is not interactable", element.description]
|
|
81
|
+
buildError:error];
|
|
82
|
+
return nil;
|
|
83
|
+
}
|
|
84
|
+
CGVector normalizedOffset = CGVectorMake(anchorOffset.dx + pointsOffset.dx / frame.size.width,
|
|
85
|
+
anchorOffset.dy + pointsOffset.dy / frame.size.height);
|
|
86
|
+
return [element coordinateWithNormalizedOffset:normalizedOffset];
|
|
87
|
+
}
|
|
88
|
+
#endif
|
|
@@ -162,7 +162,7 @@ static NSString *const FB_KEY_ACTIONS = @"actions";
|
|
|
162
162
|
return [super hitpointWithElement:element positionOffset:positionOffset error:error];
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
-
// An offset relative to the element is defined
|
|
165
|
+
// An offset relative to the element is defined.
|
|
166
166
|
if (CGRectIsEmpty(element.frame)) {
|
|
167
167
|
[FBLogger log:self.application.fb_descriptionRepresentation];
|
|
168
168
|
NSString *description = [NSString stringWithFormat:@"The element '%@' is not visible on the screen and thus is not interactable",
|
|
@@ -174,9 +174,9 @@ static NSString *const FB_KEY_ACTIONS = @"actions";
|
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
// W3C standard requires that relative element coordinates start at the center of the element's rectangle
|
|
177
|
-
CGVector offset = CGVectorMake(positionOffset.CGPointValue.x, positionOffset.CGPointValue.y);
|
|
178
177
|
// TODO: Shall we throw an exception if hitPoint is out of the element frame?
|
|
179
|
-
|
|
178
|
+
CGVector offset = CGVectorMake(positionOffset.CGPointValue.x, positionOffset.CGPointValue.y);
|
|
179
|
+
return FBCoordinateWithAnchorOffset((XCUIElement *)element, CGVectorMake(0.5, 0.5), offset, error);
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
@end
|
|
@@ -78,9 +78,15 @@
|
|
|
78
78
|
{
|
|
79
79
|
if (touch)
|
|
80
80
|
{
|
|
81
|
+
CGPoint location = [touch locationInView:self];
|
|
82
|
+
// Exposes the last touch-down location, in this view's own bounds coordinate
|
|
83
|
+
// space, for tests to assert on regardless of any window-level scaling.
|
|
84
|
+
self.isAccessibilityElement = YES;
|
|
85
|
+
self.accessibilityValue = [NSString stringWithFormat:@"%.2f,%.2f", location.x, location.y];
|
|
86
|
+
|
|
81
87
|
TouchSpotView *newView = [[TouchSpotView alloc] init];
|
|
82
88
|
newView.bounds = CGRectMake(0, 0, 1, 1);
|
|
83
|
-
newView.center =
|
|
89
|
+
newView.center = location;
|
|
84
90
|
[self addSubview:newView];
|
|
85
91
|
[UIView animateWithDuration:0.2 animations:^{
|
|
86
92
|
newView.bounds = CGRectMake(0, 0, 100, 100);
|
|
@@ -93,10 +93,10 @@
|
|
|
93
93
|
- (void)setUp
|
|
94
94
|
{
|
|
95
95
|
[super setUp];
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
// Each test (and retry) must start at row zero, not at the previous test's
|
|
97
|
+
// scroll offset. A velocity-based swipe need not undo an earlier swipe.
|
|
98
|
+
[self resetOrientation];
|
|
99
|
+
[self openScrollView];
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
- (void)testSwipeUp
|
|
@@ -47,10 +47,19 @@
|
|
|
47
47
|
NSUInteger count = 0;
|
|
48
48
|
for (NSNumber *orientation in orientations) {
|
|
49
49
|
[self rotateTo:orientation.integerValue];
|
|
50
|
+
// XCTest can report idle before the rotation animation finishes. Re-read
|
|
51
|
+
// the geometry until the controls have reached their on-screen layout.
|
|
52
|
+
FBAssertWaitTillBecomesTrue(
|
|
53
|
+
CGRectContainsRect(self.testedApplication.frame, canvas.frame)
|
|
54
|
+
&& CGRectContainsRect(self.testedApplication.frame, taps.frame)
|
|
55
|
+
&& CGRectContainsRect(self.testedApplication.frame, touches.frame));
|
|
50
56
|
CGRect screen = self.testedApplication.frame;
|
|
51
|
-
XCTAssertTrue(CGRectContainsRect(screen, canvas.frame)
|
|
52
|
-
|
|
53
|
-
XCTAssertTrue(CGRectContainsRect(screen,
|
|
57
|
+
XCTAssertTrue(CGRectContainsRect(screen, canvas.frame), @"Screen: %@; canvas: %@",
|
|
58
|
+
NSStringFromCGRect(screen), NSStringFromCGRect(canvas.frame));
|
|
59
|
+
XCTAssertTrue(CGRectContainsRect(screen, taps.frame), @"Screen: %@; taps: %@",
|
|
60
|
+
NSStringFromCGRect(screen), NSStringFromCGRect(taps.frame));
|
|
61
|
+
XCTAssertTrue(CGRectContainsRect(screen, touches.frame), @"Screen: %@; touches: %@",
|
|
62
|
+
NSStringFromCGRect(screen), NSStringFromCGRect(touches.frame));
|
|
54
63
|
XCTAssertGreaterThan(CGRectGetHeight(canvas.frame), 0);
|
|
55
64
|
[canvas tap];
|
|
56
65
|
NSString *expectedTaps = [NSString stringWithFormat:@"%lu", (unsigned long)++count];
|
|
@@ -91,4 +91,11 @@ extern NSArray<NSString *> *const FBMainViewButtonLabels;
|
|
|
91
91
|
*/
|
|
92
92
|
- (void)resetOrientation;
|
|
93
93
|
|
|
94
|
+
/**
|
|
95
|
+
appium/appium#16185: skips the current test unless the app's window size actually
|
|
96
|
+
differs from SpringBoard's, e.g. an iPhone-only app on iPad (built with
|
|
97
|
+
TARGETED_DEVICE_FAMILY=1).
|
|
98
|
+
*/
|
|
99
|
+
- (void)skipUnlessWindowSizeMismatchesDevice;
|
|
100
|
+
|
|
94
101
|
@end
|
|
@@ -163,4 +163,14 @@ NSArray<NSString *> *const FBMainViewButtonLabels = @[
|
|
|
163
163
|
FBAssertWaitTillBecomesTrue(self.testedApplication.alerts.count == 0);
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
+
- (void)skipUnlessWindowSizeMismatchesDevice
|
|
167
|
+
{
|
|
168
|
+
CGSize appSize = self.testedApplication.frame.size;
|
|
169
|
+
CGSize deviceSize = self.springboard.frame.size;
|
|
170
|
+
if (fabs(appSize.width - deviceSize.width) < 1 && fabs(appSize.height - deviceSize.height) < 1) {
|
|
171
|
+
XCTSkip(@"App window size matches SpringBoard's on this build/device, so it does not "
|
|
172
|
+
"reproduce the compatibility-mode mismatch from appium/appium#16185");
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
166
176
|
@end
|
|
@@ -11,9 +11,13 @@
|
|
|
11
11
|
#import "FBIntegrationTestCase.h"
|
|
12
12
|
|
|
13
13
|
#import "FBElementCache.h"
|
|
14
|
+
#import "FBMathUtils.h"
|
|
14
15
|
#import "FBTestMacros.h"
|
|
16
|
+
#import "XCUIApplication+FBTouchAction.h"
|
|
17
|
+
#import "XCUICoordinate.h"
|
|
15
18
|
#import "XCUIDevice+FBRotation.h"
|
|
16
19
|
#import "XCUIElement+FBIsVisible.h"
|
|
20
|
+
#import "XCUIElement+FBWebDriverAttributes.h"
|
|
17
21
|
|
|
18
22
|
@interface FBTapTest : FBIntegrationTestCase
|
|
19
23
|
@end
|
|
@@ -100,4 +104,83 @@
|
|
|
100
104
|
[self verifyTapByCoordinatesWithOrientation:UIDeviceOrientationPortraitUpsideDown];
|
|
101
105
|
}
|
|
102
106
|
|
|
107
|
+
// Element-less absolute offsets are never rescaled by XCTest's XCUICoordinate (verified by
|
|
108
|
+
// disassembling XCUIAutomation.framework), so this still fails under a window-size mismatch.
|
|
109
|
+
- (void)testTapAtElementRectCenterUnderWindowSizeMismatch
|
|
110
|
+
{
|
|
111
|
+
[self skipUnlessWindowSizeMismatchesDevice];
|
|
112
|
+
|
|
113
|
+
XCUIElement *dstButton = self.testedApplication.buttons[FBShowAlertButtonName];
|
|
114
|
+
CGRect rect = dstButton.wdFrame;
|
|
115
|
+
CGPoint center = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect));
|
|
116
|
+
|
|
117
|
+
// Mirrors FBBaseActionsSynthesizer's hitpointWithElement:positionOffset:
|
|
118
|
+
// for an absolute (x, y) offset, as used by touch/perform and W3C actions.
|
|
119
|
+
XCUICoordinate *appOrigin = [self.testedApplication coordinateWithNormalizedOffset:CGVectorMake(0, 0)];
|
|
120
|
+
XCUICoordinate *tapPoint = [appOrigin coordinateWithOffset:CGVectorMake(center.x, center.y)];
|
|
121
|
+
[tapPoint tap];
|
|
122
|
+
|
|
123
|
+
XCTExpectFailureInBlock(@"element-less absolute offsets are never rescaled by XCTest for a "
|
|
124
|
+
"compatibility-mode window (appium/appium#16185); starts failing "
|
|
125
|
+
"loudly here the moment XCTest fixes this itself", ^{
|
|
126
|
+
FBAssertWaitTillBecomesTrue(self.testedApplication.alerts.count > 0);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@end
|
|
131
|
+
|
|
132
|
+
// The Touch page's touchable view records each touch-down's location, in its own bounds
|
|
133
|
+
// coordinate space, as its accessibility value - a ground truth unaffected by any
|
|
134
|
+
// window-level scaling, letting these tests assert on exact landing position rather than
|
|
135
|
+
// just on whether a tap happened to land inside some (possibly large) target.
|
|
136
|
+
@interface FBElementOffsetTapTest : FBIntegrationTestCase
|
|
137
|
+
@end
|
|
138
|
+
|
|
139
|
+
@implementation FBElementOffsetTapTest
|
|
140
|
+
|
|
141
|
+
- (void)setUp
|
|
142
|
+
{
|
|
143
|
+
[super setUp];
|
|
144
|
+
[self launchApplication];
|
|
145
|
+
[self goToTouchPage];
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
- (CGPoint)lastTouchLocationOf:(XCUIElement *)touchable
|
|
149
|
+
{
|
|
150
|
+
NSString *value = touchable.value;
|
|
151
|
+
NSArray<NSString *> *components = [value componentsSeparatedByString:@","];
|
|
152
|
+
return CGPointMake(components.firstObject.doubleValue, components.lastObject.doubleValue);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// FBW3CActionsSynthesizer normalizes element-relative offsets against the element's own
|
|
156
|
+
// frame, so this keeps landing at the intended point under a window-size mismatch
|
|
157
|
+
// (appium/appium#16185), unlike an element-less absolute offset.
|
|
158
|
+
- (void)testTapWithElementOffsetUnderWindowSizeMismatch
|
|
159
|
+
{
|
|
160
|
+
[self skipUnlessWindowSizeMismatchesDevice];
|
|
161
|
+
|
|
162
|
+
XCUIElement *touchable = self.testedApplication.otherElements[@"touchableView"];
|
|
163
|
+
CGSize size = touchable.wdFrame.size;
|
|
164
|
+
CGVector offset = CGVectorMake(size.width / 4, -size.height / 4);
|
|
165
|
+
CGPoint expectedLocation = CGPointMake(size.width / 2 + offset.dx, size.height / 2 + offset.dy);
|
|
166
|
+
|
|
167
|
+
NSArray<NSDictionary<NSString *, id> *> *gesture =
|
|
168
|
+
@[@{
|
|
169
|
+
@"type": @"pointer",
|
|
170
|
+
@"id": @"finger1",
|
|
171
|
+
@"parameters": @{@"pointerType": @"touch"},
|
|
172
|
+
@"actions": @[
|
|
173
|
+
@{@"type": @"pointerMove", @"duration": @0, @"origin": touchable, @"x": @(offset.dx), @"y": @(offset.dy)},
|
|
174
|
+
@{@"type": @"pointerDown"},
|
|
175
|
+
@{@"type": @"pause", @"duration": @50},
|
|
176
|
+
@{@"type": @"pointerUp"},
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
];
|
|
180
|
+
NSError *error;
|
|
181
|
+
XCTAssertTrue([self.testedApplication fb_performW3CActions:gesture elementCache:nil error:&error]);
|
|
182
|
+
|
|
183
|
+
FBAssertWaitTillBecomesTrue(FBPointFuzzyEqualToPoint([self lastTouchLocationOf:touchable], expectedLocation, 5.0));
|
|
184
|
+
}
|
|
185
|
+
|
|
103
186
|
@end
|
package/build/lib/constants.d.ts
CHANGED
|
@@ -8,6 +8,9 @@ export declare const PLATFORM_NAME_TVOS = "tvOS";
|
|
|
8
8
|
export declare const PLATFORM_NAME_WATCHOS = "watchOS";
|
|
9
9
|
export declare const PLATFORM_NAME_IOS = "iOS";
|
|
10
10
|
export declare const SDK_DEVICE = "iphoneos";
|
|
11
|
+
/**
|
|
12
|
+
* @deprecated The WDA upgrade timestamp path is no longer used.
|
|
13
|
+
*/
|
|
11
14
|
export declare const WDA_UPGRADE_TIMESTAMP_PATH: string;
|
|
12
15
|
/**
|
|
13
16
|
* Harmless unused build setting override appended to every xcodebuild invocation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../lib/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B,eAAe,CAAC;AACvD,eAAO,MAAM,oBAAoB,sCAAsC,CAAC;AACxE,eAAO,MAAM,+BAA+B,gDAAyD,CAAC;AACtG,eAAO,MAAM,cAAc,oCAAoC,CAAC;AAChE,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAC9C,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAE/C,eAAO,MAAM,kBAAkB,SAAS,CAAC;AACzC,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAC/C,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAEvC,eAAO,MAAM,UAAU,aAAa,CAAC;AAErC,eAAO,MAAM,0BAA0B,QAAyD,CAAC;AAEjG;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,mCAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../lib/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B,eAAe,CAAC;AACvD,eAAO,MAAM,oBAAoB,sCAAsC,CAAC;AACxE,eAAO,MAAM,+BAA+B,gDAAyD,CAAC;AACtG,eAAO,MAAM,cAAc,oCAAoC,CAAC;AAChE,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAC9C,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAE/C,eAAO,MAAM,kBAAkB,SAAS,CAAC;AACzC,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAC/C,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AAEvC,eAAO,MAAM,UAAU,aAAa,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,0BAA0B,QAAyD,CAAC;AAEjG;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,mCAAmC,CAAC"}
|
package/build/lib/constants.js
CHANGED
|
@@ -9,6 +9,9 @@ export const PLATFORM_NAME_TVOS = 'tvOS';
|
|
|
9
9
|
export const PLATFORM_NAME_WATCHOS = 'watchOS';
|
|
10
10
|
export const PLATFORM_NAME_IOS = 'iOS';
|
|
11
11
|
export const SDK_DEVICE = 'iphoneos';
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated The WDA upgrade timestamp path is no longer used.
|
|
14
|
+
*/
|
|
12
15
|
export const WDA_UPGRADE_TIMESTAMP_PATH = path.join('.appium', 'webdriveragent', 'upgrade.time');
|
|
13
16
|
/**
|
|
14
17
|
* Harmless unused build setting override appended to every xcodebuild invocation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../lib/constants.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,mCAAmC,CAAC;AACxE,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,oBAAoB,GAAG,0BAA0B,EAAE,CAAC;AACtG,MAAM,CAAC,MAAM,cAAc,GAAG,iCAAiC,CAAC;AAChE,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;AAErC,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;AAEjG;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,gCAAgC,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../lib/constants.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAC;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,mCAAmC,CAAC;AACxE,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,oBAAoB,GAAG,0BAA0B,EAAE,CAAC;AACtG,MAAM,CAAC,MAAM,cAAc,GAAG,iCAAiC,CAAC;AAChE,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAC9C,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAC;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEvC,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;AAEjG;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,gCAAgC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webdriveragent.d.ts","sourceRoot":"","sources":["../../lib/webdriveragent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAGnD,OAAO,KAAK,EAAC,YAAY,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"webdriveragent.d.ts","sourceRoot":"","sources":["../../lib/webdriveragent.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { strongbox } from '@appium/strongbox';
|
|
|
4
4
|
import { fs, util } from '@appium/support';
|
|
5
5
|
import AsyncLock from 'async-lock';
|
|
6
6
|
import { waitForCondition } from 'asyncbox';
|
|
7
|
-
import { WDA_RUNNER_BUNDLE_ID, WDA_BASE_URL,
|
|
7
|
+
import { WDA_RUNNER_BUNDLE_ID, WDA_BASE_URL, DEFAULT_TEST_BUNDLE_SUFFIX } from './constants.js';
|
|
8
8
|
import { log as defaultLogger } from './logger.js';
|
|
9
9
|
import { NoSessionProxy } from './no-session-proxy.js';
|
|
10
10
|
import { BOOTSTRAP_PATH, getWDAUpgradeTimestamp, isWatchOS } from './utils/index.js';
|
|
@@ -498,33 +498,19 @@ export class WebDriverAgent {
|
|
|
498
498
|
}
|
|
499
499
|
const packageInfo = JSON.parse(await fs.readFile(path.join(BOOTSTRAP_PATH, 'package.json'), 'utf8'));
|
|
500
500
|
const box = strongbox(packageInfo.name);
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
try {
|
|
509
|
-
boxItem = await box.createItemWithValue(RECENT_MODULE_VERSION_ITEM_NAME, '5.0.0');
|
|
510
|
-
}
|
|
511
|
-
catch (e) {
|
|
512
|
-
this.log.warn(`The actual module version cannot be persisted: ${e.message}`);
|
|
513
|
-
return;
|
|
514
|
-
}
|
|
501
|
+
// Each Strongbox instance starts with an empty item map. Load the persisted value from disk.
|
|
502
|
+
const boxItem = await box.createItem(RECENT_MODULE_VERSION_ITEM_NAME);
|
|
503
|
+
let recentModuleVersion = boxItem.value;
|
|
504
|
+
if (recentModuleVersion === undefined) {
|
|
505
|
+
this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');
|
|
506
|
+
try {
|
|
507
|
+
await boxItem.write(packageInfo.version);
|
|
515
508
|
}
|
|
516
|
-
|
|
517
|
-
this.log.
|
|
518
|
-
try {
|
|
519
|
-
await box.createItemWithValue(RECENT_MODULE_VERSION_ITEM_NAME, packageInfo.version);
|
|
520
|
-
}
|
|
521
|
-
catch (e) {
|
|
522
|
-
this.log.warn(`The actual module version cannot be persisted: ${e.message}`);
|
|
523
|
-
}
|
|
524
|
-
return;
|
|
509
|
+
catch (e) {
|
|
510
|
+
this.log.warn(`The actual module version cannot be persisted: ${e.message}`);
|
|
525
511
|
}
|
|
512
|
+
return;
|
|
526
513
|
}
|
|
527
|
-
let recentModuleVersion = await boxItem.read();
|
|
528
514
|
try {
|
|
529
515
|
recentModuleVersion = util.coerceVersion(recentModuleVersion, true);
|
|
530
516
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webdriveragent.js","sourceRoot":"","sources":["../../lib/webdriveragent.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAC,EAAE,EAAE,IAAI,EAAC,MAAM,iBAAiB,CAAC;AAEzC,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAC,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAE1C,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAC,GAAG,IAAI,aAAa,EAAC,MAAM,aAAa,CAAC;AACjD,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAQrD,OAAO,EAAC,cAAc,EAAE,sBAAsB,EAAE,SAAS,EAAC,MAAM,kBAAkB,CAAC;AACnF,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GAGzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAE3C,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,sBAAsB,GAAG,IAAI,SAAS,EAAE,CAAC;AAC/C,MAAM,+BAA+B,GAAG,wBAAwB,CAAC;AACjE,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAErC,MAAM,OAAO,cAAc;IACzB,aAAa,CAAU;IACvB,SAAS,CAAU;IACV,IAAI,CAAqB;IACzB,MAAM,CAAc;IACpB,eAAe,CAAU;IACzB,YAAY,CAAU;IACtB,aAAa,CAAU;IACvB,IAAI,CAAU;IACd,YAAY,CAAU;IACtB,aAAa,CAAS;IACtB,UAAU,CAAS;IACnB,YAAY,CAAU;IAC/B,iBAAiB,CAAU;IAC3B,OAAO,CAAU;IACjB,kBAAkB,CAAU;IAC5B,cAAc,CAAkB;IAChC,OAAO,CAAkB;IACzB,WAAW,CAAO;IACD,GAAG,CAAe;IAClB,YAAY,CAAU;IACtB,WAAW,CAAW;IACtB,oBAAoB,CAAU;IAC9B,gBAAgB,CAAW;IAC3B,cAAc,CAAW;IACzB,eAAe,CAAU;IACzB,sBAAsB,CAAU;IAChC,gBAAgB,CAAS;IACzB,kBAAkB,CAAW;IAC7B,wBAAwB,CAAS;IACjC,OAAO,CAAuB;IACvC,qBAAqB,CAAsB;IAC3C,WAAW,CAAqB;IAChC,IAAI,CAAO;IAEnB;;;;OAIG;IACH,YAAY,IAAwB,EAAE,MAA2B,IAAI;QACnE,IAAI,CAAC,IAAI,GAAG,EAAC,GAAG,IAAI,EAAC,CAAC;QACtB,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,aAAa,CAAC;QAEhC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAEtC,IAAI,SAAS,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5D,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;QAChH,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAErD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,cAAc,CAAC;QAC9G,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,YAAY,CAAC;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAEpC,mEAAmE;QACnE,+DAA+D;QAC/D,iDAAiD;QACjD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAEhD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAEtD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC9C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC;QAE1D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAElD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,kBAAkB,CAAC;QACpE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAClD,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,IAAI,0BAA0B,CAAC;QAC5F,MAAM,cAAc,GAAG,uBAAuB,EAAE,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG;YACb,SAAS,EAAE;gBACT,GAAG,cAAc,CAAC,SAAS;gBAC3B,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS;aAC3B;YACD,sBAAsB,EAAE;gBACtB,GAAG,cAAc,CAAC,sBAAsB;gBACxC,GAAG,IAAI,CAAC,OAAO,EAAE,sBAAsB;aACxC;YACD,oBAAoB,EAAE;gBACpB,GAAG,cAAc,CAAC,oBAAoB;gBACtC,GAAG,IAAI,CAAC,OAAO,EAAE,oBAAoB;aACtC;SACF,CAAC;QAEF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,iBAAiB;YACvC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,UAAU,CACZ,IAAI,CAAC,MAAM,EACX;gBACE,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,UAAU,EAAE,IAAI,CAAC,YAAY;gBAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;gBAC3C,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;gBAC3C,aAAa,EAAE,IAAI,CAAC,gBAAgB;gBACpC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;gBACnD,mCAAmC,EAAE,IAAI,CAAC,mCAAmC;gBAC7E,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;aAC9C,EACD,IAAI,CAAC,GAAG,CACT,CAAC;IACR,CAAC;IAED;;;OAGG;IACH,IAAI,iBAAiB;QACnB,+CAA+C;QAC/C,4DAA4D;QAC5D,OAAO,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAClE,CAAC;IAED;;;;OAIG;IACH,IAAI,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,iBAAiB;QACnB,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACvH,CAAC;IAED;;;OAGG;IACH,IAAI,QAAQ;QACV,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACH,IAAI,GAAG;QACL,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,cAAc,CAAC;gBACjD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC;gBAClE,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,aAAa,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,IAAI,aAAa,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;YAC3G,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,IAAI,YAAY,CAAC,OAAgB;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,KAAK,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,IAAI,GAAG,CAAC,IAAY;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,wBAAwB;QAC5B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,wBAAwB,EAAE,CAAC;gBACjE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAc;gBAC7B,mBAAmB,EAAE,uBAAuB;aAC7C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,KAAK,CAAC,MAAM,CAAC,SAAiB;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,eAAe,CAAC,IAAI,mCAAmC,CAAC,CAAC;QACpF,IAAI,CAAC,qBAAqB,GAAG,eAAe,CAAC;QAC7C,OAAO,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACpG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CACrD,CAAC;QACF,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,CAAC,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAE1E,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACjC,+EAA+E;YAC/E,kEAAkE;YAClE,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,qBAAqB,CAAC,OAAsC;QAChE,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC1E,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,EAAC,uBAAuB,EAAE,UAAU,EAAC,GAAG,MAAM,CAAC,KAAY,CAAC;QAClE,kBAAkB;QAClB,IACE,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC;YACtC,IAAI,CAAC,kBAAkB,KAAK,uBAAuB,EACnD,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,qFAAqF,uBAAuB,IAAI,CACjH,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,gBAAgB;QAChB,IACE,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACtC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC;YACvC,oBAAoB,KAAK,uBAAuB,EAChD,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,oFAAoF,oBAAoB,EAAE,CAC3G,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,sBAAsB,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAC9D,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,sBAAsB,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,+CAA+C,UAAU,EAAE,CAAC,CAAC;QAC5E,IACE,sBAAsB;YACtB,UAAU;YACV,GAAG,sBAAsB,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,UAAU,EAAE,CAAC,WAAW,EAAE,EAC3E,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,qFAAqF;gBACnF,wDAAwD,sBAAsB,OAAO,UAAU,GAAG,CACrG,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACpD,CAAC,CAAC,iDAAiD,SAAS,WAAW,uBAAuB,GAAG;YACjG,CAAC,CAAC,iDAAiD,SAAS,GAAG,CAAC;QAClE,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,GAAG,OAAO,+DAA+D,IAAI,CAAC,GAAG,CAAC,IAAI,oCAAoC,CAC3H,CAAC;QACF,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,qBAAqB;QAC3B,MAAM,OAAO,GAA8B;YACzC,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAClD,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;YACnD,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,oBAAoB,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC9B,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YACjC,CAAC;YACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAChB,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;YACnB,CAAC;YACD,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;YACzD,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YAC/D,qBAAqB,EAAE,KAAK,IAAI,EAAE;gBAChC,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC9D,MAAM,sBAAsB,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;YAC5G,CAAC;YACD,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU;YACjC,cAAc,EAAE,GAAG,EAAE;gBACnB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBACrD,CAAC;gBACD,OAAO,IAAI,CAAC,cAAc,CAAC;YAC7B,CAAC;YACD,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE;gBACtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACzB,CAAC;SACF,CAAC;QACF,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAEO,YAAY,CAAC,SAAiB;QACpC,MAAM,SAAS,GAAQ;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS;YACtC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,SAAS;YACpD,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,OAAO,EAAE,IAAI,CAAC,oBAAoB;YAClC,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;YACvE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB;SACvC,CAAC;QACF,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1B,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE/D,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAEO,KAAK,CAAC,KAAa;QACzB,wEAAwE;QACxE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,aAAsB,EAAE,SAAkB;QAC5D,sEAAsE;QACtE,2DAA2D;QAC3D,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,cAAc,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAEzD,yEAAyE;QACzE,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,0BAA0B,CAAC,CAAC;QAC3F,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACK,KAAK,CAAC,SAAS,CAAC,YAAoB,CAAC;QAC3C,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;YACxC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;YACvE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS;YACtC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,SAAS;YACpD,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB;SACvC,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAiB,CAAC;QAEnG,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,OAAO,MAAM,aAAa,EAAE,CAAC;YAC/B,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,GAAG,CAAC,IAAI,uBAAuB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9F,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,SAAS,GAAQ,IAAI,CAAC;QAC1B,IAAI,MAAM,GAAwB,IAAI,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,gBAAgB,CACpB,KAAK,IAAI,EAAE;gBACT,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;oBAC/B,OAAO,IAAI,CAAC;gBACd,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,SAAS,GAAG,GAAG,CAAC;gBAClB,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,EACD;gBACE,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;aAChB,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CACZ,wCAAwC,SAAS,OAAO;gBACtD,kCAAkC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,sBAAsB,GAAG,CAAC,OAAO,GAAG,CACpG,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,wBAAwB,SAAS,MAAM,EAAE,EAAC,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,sBAAsB;QAClC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACrG,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,0BAA0B,CAAC,CAAC;YACvF,IAAI,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBACnC,yEAAyE;gBACzE,qEAAqE;gBACrE,qEAAqE;gBACrE,IAAI,CAAC;oBACH,OAAO,GAAG,MAAM,GAAG,CAAC,mBAAmB,CAAC,+BAA+B,EAAE,OAAO,CAAC,CAAC;gBACpF,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC7E,OAAO;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;gBACpG,IAAI,CAAC;oBACH,MAAM,GAAG,CAAC,mBAAmB,CAAC,+BAA+B,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;gBACtF,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/E,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,mBAAmB,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,mBAAmB,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,WAAW,CAAC,OAAO,6CAA6C,CAAC,CAAC;YACnG,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,6EAA6E;gBAC3E,IAAI,mBAAmB,OAAO,WAAW,CAAC,OAAO,GAAG,CACvD,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,+EAA+E;YAC7E,IAAI,mBAAmB,MAAM,WAAW,CAAC,OAAO,GAAG,CACtD,CAAC;QACF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YACrC,MAAM,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"webdriveragent.js","sourceRoot":"","sources":["../../lib/webdriveragent.ts"],"names":[],"mappings":"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"}
|
package/lib/constants.ts
CHANGED
|
@@ -13,6 +13,9 @@ export const PLATFORM_NAME_IOS = 'iOS';
|
|
|
13
13
|
|
|
14
14
|
export const SDK_DEVICE = 'iphoneos';
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* @deprecated The WDA upgrade timestamp path is no longer used.
|
|
18
|
+
*/
|
|
16
19
|
export const WDA_UPGRADE_TIMESTAMP_PATH = path.join('.appium', 'webdriveragent', 'upgrade.time');
|
|
17
20
|
|
|
18
21
|
/**
|
package/lib/webdriveragent.ts
CHANGED
|
@@ -7,12 +7,7 @@ import type {AppiumLogger, StringRecord} from '@appium/types';
|
|
|
7
7
|
import AsyncLock from 'async-lock';
|
|
8
8
|
import {waitForCondition} from 'asyncbox';
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
WDA_RUNNER_BUNDLE_ID,
|
|
12
|
-
WDA_BASE_URL,
|
|
13
|
-
WDA_UPGRADE_TIMESTAMP_PATH,
|
|
14
|
-
DEFAULT_TEST_BUNDLE_SUFFIX,
|
|
15
|
-
} from './constants.js';
|
|
10
|
+
import {WDA_RUNNER_BUNDLE_ID, WDA_BASE_URL, DEFAULT_TEST_BUNDLE_SUFFIX} from './constants.js';
|
|
16
11
|
import {log as defaultLogger} from './logger.js';
|
|
17
12
|
import {NoSessionProxy} from './no-session-proxy.js';
|
|
18
13
|
import type {
|
|
@@ -584,31 +579,19 @@ export class WebDriverAgent {
|
|
|
584
579
|
|
|
585
580
|
const packageInfo = JSON.parse(await fs.readFile(path.join(BOOTSTRAP_PATH, 'package.json'), 'utf8'));
|
|
586
581
|
const box = strongbox(packageInfo.name);
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
} catch (e: any) {
|
|
597
|
-
this.log.warn(`The actual module version cannot be persisted: ${e.message}`);
|
|
598
|
-
return;
|
|
599
|
-
}
|
|
600
|
-
} else {
|
|
601
|
-
this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');
|
|
602
|
-
try {
|
|
603
|
-
await box.createItemWithValue(RECENT_MODULE_VERSION_ITEM_NAME, packageInfo.version);
|
|
604
|
-
} catch (e: any) {
|
|
605
|
-
this.log.warn(`The actual module version cannot be persisted: ${e.message}`);
|
|
606
|
-
}
|
|
607
|
-
return;
|
|
582
|
+
// Each Strongbox instance starts with an empty item map. Load the persisted value from disk.
|
|
583
|
+
const boxItem = await box.createItem<string>(RECENT_MODULE_VERSION_ITEM_NAME);
|
|
584
|
+
let recentModuleVersion = boxItem.value;
|
|
585
|
+
if (recentModuleVersion === undefined) {
|
|
586
|
+
this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');
|
|
587
|
+
try {
|
|
588
|
+
await boxItem.write(packageInfo.version);
|
|
589
|
+
} catch (e: any) {
|
|
590
|
+
this.log.warn(`The actual module version cannot be persisted: ${e.message}`);
|
|
608
591
|
}
|
|
592
|
+
return;
|
|
609
593
|
}
|
|
610
594
|
|
|
611
|
-
let recentModuleVersion = await boxItem.read();
|
|
612
595
|
try {
|
|
613
596
|
recentModuleVersion = util.coerceVersion(recentModuleVersion, true);
|
|
614
597
|
} catch (e: any) {
|