diff --git a/.travis.yml b/.travis.yml index 4c16107db..d0fd3ca63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: objective-c -osx_image: xcode9.2 +osx_image: xcode10.1 sudo: false cache: @@ -15,23 +15,32 @@ branches: env: # Builds -- ACTION=build TARGET=runner SDK=sim -- ACTION=build TARGET=runner SDK=device +- PLATFORM=ios ACTION=build TARGET=runner SDK=sim +- PLATFORM=ios ACTION=build TARGET=runner SDK=device +- PLATFORM=tvos ACTION=build TARGET=runner SDK=sim +- PLATFORM=tvos ACTION=build TARGET=runner SDK=device # Analyze -- ACTION=analyze TARGET=lib SDK=sim -- ACTION=analyze TARGET=runner SDK=sim +- PLATFORM=ios ACTION=analyze TARGET=lib SDK=sim +- PLATFORM=ios ACTION=analyze TARGET=runner SDK=sim +- PLATFORM=tvos ACTION=analyze TARGET=lib SDK=sim +- PLATFORM=tvos ACTION=analyze TARGET=runner SDK=sim # Unit tests -- ACTION=unit_test DEST=iphone TARGET=lib SDK=sim -- ACTION=unit_test DEST=ipad TARGET=lib SDK=sim +- PLATFORM=ios ACTION=unit_test DEST=iphone TARGET=lib SDK=sim +- PLATFORM=ios ACTION=unit_test DEST=ipad TARGET=lib SDK=sim +- PLATFORM=tvos ACTION=unit_test DEST=atv TARGET=lib SDK=sim # Integration tests iPhone -- ACTION=int_test_1 DEST=iphone TARGET=lib SDK=sim -- ACTION=int_test_2 DEST=iphone TARGET=lib SDK=sim -- ACTION=int_test_3 DEST=iphone TARGET=lib SDK=sim +- PLATFORM=ios ACTION=int_test_1 DEST=iphone TARGET=lib SDK=sim +- PLATFORM=ios ACTION=int_test_2 DEST=iphone TARGET=lib SDK=sim +- PLATFORM=ios ACTION=int_test_3 DEST=iphone TARGET=lib SDK=sim # Integration tests iPad -- ACTION=int_test_1 DEST=ipad TARGET=lib SDK=sim -- ACTION=int_test_2 DEST=ipad TARGET=lib SDK=sim -- ACTION=int_test_3 DEST=ipad TARGET=lib SDK=sim +- PLATFORM=ios ACTION=int_test_1 DEST=ipad TARGET=lib SDK=sim +- PLATFORM=ios ACTION=int_test_2 DEST=ipad TARGET=lib SDK=sim +- PLATFORM=ios ACTION=int_test_3 DEST=ipad TARGET=lib SDK=sim + +# Integration tests Apple TV +- PLATFORM=tvos ACTION=int_test_1 DEST=atv TARGET=lib SDK=sim +- PLATFORM=tvos ACTION=int_test_2 DEST=atv TARGET=lib SDK=sim \ No newline at end of file diff --git a/Cartfile b/Cartfile index 5bb940362..6888bafe0 100644 --- a/Cartfile +++ b/Cartfile @@ -1,2 +1,2 @@ # Used for HTTP routing -github "marekcirkos/RoutingHTTPServer" +github "shvul/RoutingHTTPServer" diff --git a/Cartfile.resolved b/Cartfile.resolved index 37f9d8e45..d77963a0c 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1 +1 @@ -github "marekcirkos/RoutingHTTPServer" "v1.0.1" +github "shvul/RoutingHTTPServer" "v1.0.2" diff --git a/Inspector/js/inspector.js b/Inspector/js/inspector.js index f07208820..39c9c6a21 100644 --- a/Inspector/js/inspector.js +++ b/Inspector/js/inspector.js @@ -56,6 +56,7 @@ class Inspector extends React.Component { {this.renderField('Rect', attributes.rect)} {this.renderField('isEnabled', boolToString(attributes.isEnabled))} {this.renderField('isVisible', boolToString(attributes.isVisible))} + {this.renderField('isFocused', attributes.isFocused === undefined ? null : boolToString(attributes.isFocused))} {this.renderField('Tap', tapButton, false)} ); diff --git a/Inspector/js/tree_node.js b/Inspector/js/tree_node.js index cb00ebec6..2469c5f11 100644 --- a/Inspector/js/tree_node.js +++ b/Inspector/js/tree_node.js @@ -60,6 +60,7 @@ class TreeNode { rect: node.frame, isEnabled: node.isEnabled, isVisible: node.isVisible, + isFocused: node.isFocused, }; } } diff --git a/IntegrationApp_tvOS/Classes/AppDelegate.h b/IntegrationApp_tvOS/Classes/AppDelegate.h new file mode 100644 index 000000000..bf20b2f35 --- /dev/null +++ b/IntegrationApp_tvOS/Classes/AppDelegate.h @@ -0,0 +1,15 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@interface AppDelegate : UIResponder +@property (strong, nonatomic) UIWindow *window; +@end + diff --git a/IntegrationApp_tvOS/Classes/AppDelegate.m b/IntegrationApp_tvOS/Classes/AppDelegate.m new file mode 100644 index 000000000..2082d38d4 --- /dev/null +++ b/IntegrationApp_tvOS/Classes/AppDelegate.m @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "AppDelegate.h" + +@interface AppDelegate () +@end + +@implementation AppDelegate +@end diff --git a/IntegrationApp_tvOS/Classes/FBAlertsViewController.h b/IntegrationApp_tvOS/Classes/FBAlertsViewController.h new file mode 100644 index 000000000..a6ce3f25a --- /dev/null +++ b/IntegrationApp_tvOS/Classes/FBAlertsViewController.h @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FBAlertsViewController : UIViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/IntegrationApp_tvOS/Classes/FBAlertsViewController.m b/IntegrationApp_tvOS/Classes/FBAlertsViewController.m new file mode 100644 index 000000000..f7cc19599 --- /dev/null +++ b/IntegrationApp_tvOS/Classes/FBAlertsViewController.m @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "FBAlertsViewController.h" +#import +#import + +@interface FBAlertsViewController () +@property (nonatomic, strong) CLLocationManager *locationManager; +@end + +@implementation FBAlertsViewController + +- (IBAction)createAppAlert:(UIButton *)sender +{ + [self presentAlertController]; +} + +- (IBAction)createAppSheet:(UIButton *)sender +{ + UIAlertController *alerController = + [UIAlertController alertControllerWithTitle:@"Magic Sheet" + message:@"Should read" + preferredStyle:UIAlertControllerStyleActionSheet]; + [self presentViewController:alerController animated:YES completion:nil]; + +} + +- (IBAction)createCameraRollAccessAlert:(UIButton *)sender +{ + [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { + }]; +} + +- (IBAction)createGPSAccessAlert:(UIButton *)sender +{ + self.locationManager = [CLLocationManager new]; + [self.locationManager requestWhenInUseAuthorization]; +} + +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event +{ + [super touchesMoved:touches withEvent:event]; + for (UITouch *touch in touches) { + if (fabs(touch.maximumPossibleForce - touch.force) < 0.0001) { + [self presentAlertController]; + } + } +} + +- (void)presentAlertController { + UIAlertController *alerController = + [UIAlertController alertControllerWithTitle:@"Magic" + message:@"Should read" + preferredStyle:UIAlertControllerStyleAlert]; + [alerController addAction:[UIAlertAction actionWithTitle:@"Will do" style:UIAlertActionStyleDefault handler:nil]]; + [self presentViewController:alerController animated:YES completion:nil]; +} + +@end diff --git a/IntegrationApp_tvOS/Classes/FBAttributesViewController.h b/IntegrationApp_tvOS/Classes/FBAttributesViewController.h new file mode 100644 index 000000000..c7100fc3d --- /dev/null +++ b/IntegrationApp_tvOS/Classes/FBAttributesViewController.h @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FBAttributesViewController : UIViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/IntegrationApp_tvOS/Classes/FBAttributesViewController.m b/IntegrationApp_tvOS/Classes/FBAttributesViewController.m new file mode 100644 index 000000000..82acae842 --- /dev/null +++ b/IntegrationApp_tvOS/Classes/FBAttributesViewController.m @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "FBAttributesViewController.h" + +@interface FBAttributesViewController () + +@end + +@implementation FBAttributesViewController + +- (IBAction)didSelectButton:(UIButton *)button +{ + button.selected = !button.selected; +} + +@end diff --git a/IntegrationApp_tvOS/Info.plist b/IntegrationApp_tvOS/Info.plist new file mode 100644 index 000000000..67be95910 --- /dev/null +++ b/IntegrationApp_tvOS/Info.plist @@ -0,0 +1,42 @@ + + + + + NSLocationAlwaysAndWhenInUseUsageDescription + Yo Yo + NSPhotoLibraryUsageDescription + Yo Yo + NSLocationWhenInUseUsageDescription + Yo Yo + NSLocationUsageDescription + Yo Yo + NSLocationAlwaysUsageDescription + Yo Yo + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + UIUserInterfaceStyle + Automatic + + diff --git a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard new file mode 100644 index 000000000..07e15fac8 --- /dev/null +++ b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard @@ -0,0 +1,512 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IntegrationApp_tvOS/Resources/Templates.storyboard b/IntegrationApp_tvOS/Resources/Templates.storyboard new file mode 100644 index 000000000..8679b9edf --- /dev/null +++ b/IntegrationApp_tvOS/Resources/Templates.storyboard @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IntegrationApp_tvOS/Resources/Templates~.storyboard b/IntegrationApp_tvOS/Resources/Templates~.storyboard new file mode 100644 index 000000000..74058b605 --- /dev/null +++ b/IntegrationApp_tvOS/Resources/Templates~.storyboard @@ -0,0 +1,394 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IntegrationApp_tvOS/main.m b/IntegrationApp_tvOS/main.m new file mode 100644 index 000000000..2b841fd81 --- /dev/null +++ b/IntegrationApp_tvOS/main.m @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/PrivateHeaders/XCTest/XCEventGenerator.h b/PrivateHeaders/XCTest/XCEventGenerator.h index ce28481fc..b73004959 100644 --- a/PrivateHeaders/XCTest/XCEventGenerator.h +++ b/PrivateHeaders/XCTest/XCEventGenerator.h @@ -25,7 +25,9 @@ typedef void (^XCEventGeneratorHandler)(XCSynthesizedEventRecord *record, NSErro @property unsigned long long generation; // @synthesize generation=_generation; //@property(readonly) NSObject *eventQueue; // @synthesize eventQueue=_eventQueue; -#if TARGET_OS_IPHONE +#if TARGET_OS_TV +// TODO add tv os +#elif TARGET_OS_IPHONE - (double)rotateInRect:(CGRect)arg1 withRotation:(double)arg2 velocity:(double)arg3 orientation:(UIInterfaceOrientation)arg4 handler:(XCEventGeneratorHandler)arg5; - (double)pinchInRect:(CGRect)arg1 withScale:(double)arg2 velocity:(double)arg3 orientation:(UIInterfaceOrientation)arg4 handler:(XCEventGeneratorHandler)arg5; - (double)pressAtPoint:(CGPoint)arg1 forDuration:(double)arg2 liftAtPoint:(CGPoint)arg3 velocity:(double)arg4 orientation:(UIInterfaceOrientation)arg5 name:(NSString *)arg6 handler:(XCEventGeneratorHandler)arg7; diff --git a/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h b/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h index 529ff95f3..597072e37 100644 --- a/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h +++ b/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h @@ -10,15 +10,21 @@ { NSMutableArray *_eventPaths; NSString *_name; +#if TARGET_OS_IOS UIInterfaceOrientation _interfaceOrientation; +#endif } +#if TARGET_OS_IOS @property(readonly) UIInterfaceOrientation interfaceOrientation; // @synthesize interfaceOrientation=_interfaceOrientation; +#endif @property(readonly, copy) NSString *name; // @synthesize name=_name; @property(readonly) double maximumOffset; @property(readonly) NSArray *eventPaths; - (void)addPointerEventPath:(XCPointerEventPath *)arg1; +#if TARGET_OS_IOS - (id)initWithName:(NSString *)arg1 interfaceOrientation:(UIInterfaceOrientation)arg2; +#endif - (id)init; - (BOOL)synthesizeWithError:(NSError **)arg1; diff --git a/PrivateHeaders/XCTest/XCUIApplication.h b/PrivateHeaders/XCTest/XCUIApplication.h index 8234f392c..2760117f1 100644 --- a/PrivateHeaders/XCTest/XCUIApplication.h +++ b/PrivateHeaders/XCTest/XCUIApplication.h @@ -31,7 +31,9 @@ @property(getter=isIdleAnimationWaitEnabled) BOOL idleAnimationWaitEnabled; // @synthesize idleAnimationWaitEnabled=_idleAnimationWaitEnabled; @property(nonatomic) BOOL doesNotHandleUIInterruptions; // @synthesize doesNotHandleUIInterruptions=_doesNotHandleUIInterruptions; @property(readonly) BOOL fauxCollectionViewCellsEnabled; +#if !TARGET_OS_TV @property(readonly, nonatomic) UIInterfaceOrientation interfaceOrientation; //TODO tvos +#endif @property(readonly, nonatomic) BOOL running; @property(nonatomic) pid_t processID; // @synthesize processID=_processID; @property(readonly) XCAccessibilityElement *accessibilityElement; diff --git a/PrivateHeaders/XCTest/XCUIElement.h b/PrivateHeaders/XCTest/XCUIElement.h index 1af8482a7..d4870ce65 100644 --- a/PrivateHeaders/XCTest/XCUIElement.h +++ b/PrivateHeaders/XCTest/XCUIElement.h @@ -18,7 +18,9 @@ @property BOOL safeQueryResolutionEnabled; // @synthesize safeQueryResolutionEnabled=_safeQueryResolutionEnabled; @property(retain) XCElementSnapshot *lastSnapshot; // @synthesize lastSnapshot=_lastSnapshot; @property(readonly) XCUIElementQuery *query; // @synthesize query=_query; +#if TARGET_OS_IOS @property(readonly, nonatomic) UIInterfaceOrientation interfaceOrientation; +#endif @property(readonly, copy) XCUICoordinate *hitPointCoordinate; @property(readonly) BOOL isTopLevelTouchBarElement; @property(readonly) BOOL isTouchBarElement; diff --git a/Scripts/build.sh b/Scripts/build.sh index ec0487b0e..26f7c9d5e 100755 --- a/Scripts/build.sh +++ b/Scripts/build.sh @@ -13,6 +13,15 @@ set -eu function define_xc_macros() { XC_MACROS="CODE_SIGN_IDENTITY=\"\" CODE_SIGNING_REQUIRED=NO" + case "$PLATFORM" in + "ios" ) define_xc_macros_ios;; + "tvos" ) define_xc_macros_tvos;; + *) echo "Unknown PLATFORM"; exit 1 ;; + esac + +} + +function define_xc_macros_ios() { case "$TARGET" in "lib" ) XC_TARGET="WebDriverAgentLib";; "runner" ) XC_TARGET="WebDriverAgentRunner";; @@ -20,8 +29,8 @@ function define_xc_macros() { esac case "${DEST:-}" in - "iphone" ) XC_DESTINATION="-destination \"name=iPhone SE,OS=11.2\"";; - "ipad" ) XC_DESTINATION="-destination \"name=iPad Air 2,OS=11.2\"";; + "iphone" ) XC_DESTINATION="-destination \"name=iPhone X,OS=12.1\"";; + "ipad" ) XC_DESTINATION="-destination \"name=iPad Air 2,OS=12.1\"";; esac case "$ACTION" in @@ -44,6 +53,34 @@ function define_xc_macros() { esac } +function define_xc_macros_tvos() { + case "$TARGET" in + "lib" ) XC_TARGET="WebDriverAgentLib_tvOS";; + "runner" ) XC_TARGET="WebDriverAgentRunner_tvOS";; + *) echo "Unknown TARGET"; exit 1 ;; + esac + + XC_DESTINATION="-destination \"name=Apple TV,OS=12.1\"" + + case "$ACTION" in + "build" ) XC_ACTION="build";; + "analyze" ) + XC_ACTION="analyze" + XC_MACROS="${XC_MACROS} CLANG_ANALYZER_OUTPUT=plist-html CLANG_ANALYZER_OUTPUT_DIR=\"$(pwd)/clang\"" + ;; + "unit_test" ) XC_ACTION="test -only-testing:UnitTests_tvOS";; + "int_test_1" ) XC_ACTION="test -only-testing:IntegrationTests_1_tvOS";; + "int_test_2" ) XC_ACTION="test -only-testing:IntegrationTests_2_tvOS";; + *) echo "Unknown ACTION"; exit 1 ;; + esac + + case "$SDK" in + "sim" ) XC_SDK="appletvsimulator";; + "device" ) XC_SDK="appletvos";; + *) echo "Unknown SDK"; exit 1 ;; + esac +} + function analyze() { xcbuild if [[ -z $(find clang -name "*.html") ]]; then diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 2e08880f1..f2ca6bcc1 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -8,6 +8,320 @@ /* Begin PBXBuildFile section */ 18033EFF208761FC00FED81D /* RoutingHTTPServer.framework in Copy frameworks */ = {isa = PBXBuildFile; fileRef = AD42DD2B1CF1238500806E5D /* RoutingHTTPServer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1C0EE1142111C4B3009EDBB1 /* WebDriverAgentLib_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; }; + 1C0EE1152111C4CD009EDBB1 /* WebDriverAgentLib_tvOS.framework in Copy frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1C1954642111CF0E00A99F21 /* RoutingHTTPServer.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954632111CF0E00A99F21 /* RoutingHTTPServer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1C1954662111D7FD00A99F21 /* RoutingHTTPServer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954632111CF0E00A99F21 /* RoutingHTTPServer.framework */; }; + 1C19546A2111DC1400A99F21 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954682111DC0800A99F21 /* libxml2.tbd */; }; + 1C1954732112EF9100A99F21 /* FBRemoteControlCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C1954712112EF9100A99F21 /* FBRemoteControlCommands.h */; }; + 1C1954742112EF9100A99F21 /* FBRemoteControlCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954722112EF9100A99F21 /* FBRemoteControlCommands.m */; }; + 1C1954B421133DDC00A99F21 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954B321133DDC00A99F21 /* AppDelegate.m */; }; + 1C1954BA21133DDC00A99F21 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1C1954B821133DDC00A99F21 /* Main.storyboard */; }; + 1C1954BF21133DDD00A99F21 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954BE21133DDD00A99F21 /* main.m */; }; + 1C1954D52113454F00A99F21 /* FBAlertsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D42113454F00A99F21 /* FBAlertsViewController.m */; }; + 1C26DB9D216A4BC600C1D250 /* FBTVElementAttributeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C26DB9C216A4BC600C1D250 /* FBTVElementAttributeTests.m */; }; + 1C26DB9F216AAAC300C1D250 /* FBTVElementSelectTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C26DB9E216AAAC300C1D250 /* FBTVElementSelectTests.m */; }; + 1C292F682164C399002E8D40 /* FBTVAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D92113554400A99F21 /* FBTVAlertTests.m */; }; + 1C3C6FA6211827D600FAFD69 /* XCUIApplication+FBFocused.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C3C6FA4211827D600FAFD69 /* XCUIApplication+FBFocused.h */; }; + 1C3C6FA7211827D600FAFD69 /* XCUIApplication+FBFocused.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C3C6FA5211827D600FAFD69 /* XCUIApplication+FBFocused.m */; }; + 1C44859F216B613800D2B2D8 /* Templates.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1C44859E216B613800D2B2D8 /* Templates.storyboard */; }; + 1C4485A5216BBD7300D2B2D8 /* FBAttributesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C4485A4216BBD7300D2B2D8 /* FBAttributesViewController.m */; }; + 1C604D242179CB05004F535F /* FBTableDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = EE55B3231D1D5388003AAAEC /* FBTableDataSource.m */; }; + 1C604D272179CC4B004F535F /* FBTVElementVisibilityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C604D262179CC4B004F535F /* FBTVElementVisibilityTests.m */; }; + 1C73658F219A1689009BC01A /* FBScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = ADDA07231D6BB2BF001700AC /* FBScrollViewController.m */; }; + 1C736592219A1FC5009BC01A /* FBTVIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C736591219A1FC5009BC01A /* FBTVIntegrationTestCase.m */; }; + 1C736593219A1FC5009BC01A /* FBTVIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C736591219A1FC5009BC01A /* FBTVIntegrationTestCase.m */; }; + 1C736595219A2114009BC01A /* TVXCElementSnapshotHitPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C736594219A2114009BC01A /* TVXCElementSnapshotHitPoint.m */; }; + 1C736597219AB7C5009BC01A /* TVXCUIApplicationHelperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C736596219AB7C4009BC01A /* TVXCUIApplicationHelperTests.m */; }; + 1C736599219ACF68009BC01A /* TVXCUIDeviceHealthCheckTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C736598219ACF68009BC01A /* TVXCUIDeviceHealthCheckTests.m */; }; + 1C73659B219ACFC6009BC01A /* TVXCUIDeviceHelperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C73659A219ACFC6009BC01A /* TVXCUIDeviceHelperTests.m */; }; + 1C73659D219AD052009BC01A /* TVXCUIElementAttributesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C73659C219AD052009BC01A /* TVXCUIElementAttributesTests.m */; }; + 1C73659F219AD224009BC01A /* TVXCUIElementFBFindTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C73659E219AD224009BC01A /* TVXCUIElementFBFindTests.m */; }; + 1C7365A1219AD4E2009BC01A /* TVXCUIElementHelperIntegrationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C7365A0219AD4E2009BC01A /* TVXCUIElementHelperIntegrationTests.m */; }; + 1C7365A6219C5943009BC01A /* FBTVNavigationTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C7365A4219C5942009BC01A /* FBTVNavigationTracker.h */; }; + 1C7365A7219C5943009BC01A /* FBTVNavigationTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C7365A5219C5942009BC01A /* FBTVNavigationTracker.m */; }; + 1C7365AE219C6660009BC01A /* FBRunLoopSpinnerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE3F8CFD1D08AA17006F02CE /* FBRunLoopSpinnerTests.m */; }; + 1C7365AF219C6660009BC01A /* FBSDKVersionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 714801D01FA9D9FA00DC5997 /* FBSDKVersionTests.m */; }; + 1C7365B0219C6660009BC01A /* FBElementTypeTransformerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE3F8CFF1D08B05F006F02CE /* FBElementTypeTransformerTests.m */; }; + 1C7365B1219C6660009BC01A /* FBApplicationProcessProxyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FC3B2E12121EC8C00B61EE0 /* FBApplicationProcessProxyTests.m */; }; + 1C7365B2219C6660009BC01A /* FBConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE16E961D33A25500172525 /* FBConfigurationTests.m */; }; + 1C7365B3219C6660009BC01A /* FBElementCacheTests.m in Sources */ = {isa = PBXBuildFile; fileRef = ADBC39931D0782CD00327304 /* FBElementCacheTests.m */; }; + 1C7365B4219C6660009BC01A /* XCUIApplicationFBHelpersTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE8DDD7820C565FB004D4925 /* XCUIApplicationFBHelpersTests.m */; }; + 1C7365B5219C6660009BC01A /* FBElementUtilitiesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 719FF5B81DAD21F5008E0099 /* FBElementUtilitiesTests.m */; }; + 1C7365B6219C6660009BC01A /* FBXMLSafeStringTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 716E0BD01E917F260087A825 /* FBXMLSafeStringTests.m */; }; + 1C7365B7219C6660009BC01A /* FBXPathCreatorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = ADEF63AC1D09DCCF0070A7E3 /* FBXPathCreatorTests.m */; }; + 1C7365B8219C6660009BC01A /* FBRuntimeUtilsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = ADEF63AE1D09DEBE0070A7E3 /* FBRuntimeUtilsTests.m */; }; + 1C7365B9219C6660009BC01A /* FBRouteTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9B76571CF7987300275851 /* FBRouteTests.m */; }; + 1C7365BA219C6660009BC01A /* NSExpressionFBFormatTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7139145B1DF01A12005896C2 /* NSExpressionFBFormatTests.m */; }; + 1C7365BB219C6660009BC01A /* NSPredicateFBFormatTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 71A224E71DE326C500844D55 /* NSPredicateFBFormatTests.m */; }; + 1C7365BC219C6660009BC01A /* FBApplicationDouble.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6A89281D0B257B0083E92B /* FBApplicationDouble.m */; }; + 1C7365BD219C6660009BC01A /* FBErrorBuilderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6A892C1D0B2AF40083E92B /* FBErrorBuilderTests.m */; }; + 1C7365BE219C6660009BC01A /* FBXPathTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 712A0C841DA3E459007D02E5 /* FBXPathTests.m */; }; + 1C7365BF219C6660009BC01A /* XCUIElementDouble.m in Sources */ = {isa = PBXBuildFile; fileRef = ADBC39971D07842800327304 /* XCUIElementDouble.m */; }; + 1C7365C0219C6660009BC01A /* XCUIElementHelpersTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 713914591DF01989005896C2 /* XCUIElementHelpersTests.m */; }; + 1C7365C1219C6660009BC01A /* FBSessionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6A89251D0B19E60083E92B /* FBSessionTests.m */; }; + 1C7365C3219C6660009BC01A /* FBClassChainTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 71A7EAFB1E229302001DA4F2 /* FBClassChainTests.m */; }; + 1C7365C4219C6660009BC01A /* FBMathUtilsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE18883C1DA663EB00307AA8 /* FBMathUtilsTests.m */; }; + 1C7365CF219C66B8009BC01A /* FBTVNavigationTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C7365A8219C5E33009BC01A /* FBTVNavigationTrackerTests.m */; }; + 1C7365D0219C6746009BC01A /* XCUICoordinateFix.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC9EED820077D8E00BC0D5B /* XCUICoordinateFix.m */; }; + 1C7365D1219C67C6009BC01A /* WebDriverAgentLib_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; }; + 1C7365D3219C67D3009BC01A /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C7365D2219C67D3009BC01A /* libxml2.tbd */; }; + 1C7365D5219C67DE009BC01A /* libAccessibility.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C7365D4219C67DE009BC01A /* libAccessibility.tbd */; }; + 1C88FDF4214AAD0700202D0D /* XCUIElement+FBTVFocuse.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVFocuse.h */; }; + 1C88FDF5214AAD0700202D0D /* XCUIElement+FBTVFocuse.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVFocuse.m */; }; + 1C8F1A322100B24400F6FEF4 /* FBScreenshotCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB75F1CAEDF0C008C271F /* FBScreenshotCommands.m */; }; + 1C8F1A332100B24400F6FEF4 /* FBPredicate.m in Sources */ = {isa = PBXBuildFile; fileRef = EEEC7C911F21F27A0053426C /* FBPredicate.m */; }; + 1C8F1A342100B24400F6FEF4 /* XCUIElement+FBPickerWheel.m in Sources */ = {isa = PBXBuildFile; fileRef = 7136A4781E8918E60024FC3D /* XCUIElement+FBPickerWheel.m */; }; + 1C8F1A352100B24400F6FEF4 /* FBXPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 711084431DA3AA7500F913D6 /* FBXPath.m */; }; + 1C8F1A362100B24400F6FEF4 /* FBWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB78D1CAEDF0C008C271F /* FBWebServer.m */; }; + 1C8F1A372100B24400F6FEF4 /* FBErrorBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = EE3A18611CDE618F00DE4205 /* FBErrorBuilder.m */; }; + 1C8F1A382100B24400F6FEF4 /* XCUIElement+FBClassChain.m in Sources */ = {isa = PBXBuildFile; fileRef = 71A7EAF41E20516B001DA4F2 /* XCUIElement+FBClassChain.m */; }; + 1C8F1A392100B24400F6FEF4 /* NSExpression+FBFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 71555A3C1DEC460A007D4A8B /* NSExpression+FBFormat.m */; }; + 1C8F1A3A2100B24400F6FEF4 /* FBXPathCreator.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7991CAEDF0C008C271F /* FBXPathCreator.m */; }; + 1C8F1A3B2100B24400F6FEF4 /* XCUIApplication+FBHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = AD6C269B1CF2494200F8B5FF /* XCUIApplication+FBHelpers.m */; }; + 1C8F1A3C2100B24400F6FEF4 /* FBKeyboard.m in Sources */ = {isa = PBXBuildFile; fileRef = EE3A18651CDE734B00DE4205 /* FBKeyboard.m */; }; + 1C8F1A3D2100B24400F6FEF4 /* FBElementUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 713C6DCE1DDC772A00285B92 /* FBElementUtils.m */; }; + 1C8F1A3E2100B24400F6FEF4 /* FBElementHitPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC1950620C6D0790094500B /* FBElementHitPoint.m */; }; + 1C8F1A3F2100B24400F6FEF4 /* FBApplicationProcessProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7691CAEDF0C008C271F /* FBApplicationProcessProxy.m */; }; + 1C8F1A402100B24400F6FEF4 /* FBFailureProofTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6A89391D0B38640083E92B /* FBFailureProofTestCase.m */; }; + 1C8F1A412100B24400F6FEF4 /* XCUIElement+FBIsVisible.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7481CAEDF0C008C271F /* XCUIElement+FBIsVisible.m */; }; + 1C8F1A422100B24400F6FEF4 /* XCUIElement+FBFind.m in Sources */ = {isa = PBXBuildFile; fileRef = EEBBD48A1D47746D00656A81 /* XCUIElement+FBFind.m */; }; + 1C8F1A432100B24400F6FEF4 /* FBResponsePayload.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7831CAEDF0C008C271F /* FBResponsePayload.m */; }; + 1C8F1A442100B24400F6FEF4 /* FBRoute.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7851CAEDF0C008C271F /* FBRoute.m */; }; + 1C8F1A452100B24400F6FEF4 /* NSString+FBVisualLength.m in Sources */ = {isa = PBXBuildFile; fileRef = EE0D1F601EBCDCF7006A3123 /* NSString+FBVisualLength.m */; }; + 1C8F1A462100B24400F6FEF4 /* FBRunLoopSpinner.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE9B4711CD02B88009D2030 /* FBRunLoopSpinner.m */; }; + 1C8F1A472100B24400F6FEF4 /* FBClassChainQueryParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 71A7EAF81E224648001DA4F2 /* FBClassChainQueryParser.m */; }; + 1C8F1A482100B24400F6FEF4 /* NSPredicate+FBFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 71A224E41DE2F56600844D55 /* NSPredicate+FBFormat.m */; }; + 1C8F1A4A2100B24400F6FEF4 /* XCUIElement+FBUID.m in Sources */ = {isa = PBXBuildFile; fileRef = 71B49EC61ED1A58100D51AD6 /* XCUIElement+FBUID.m */; }; + 1C8F1A4B2100B24400F6FEF4 /* FBRouteRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7881CAEDF0C008C271F /* FBRouteRequest.m */; }; + 1C8F1A4C2100B24400F6FEF4 /* FBResponseJSONPayload.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7811CAEDF0C008C271F /* FBResponseJSONPayload.m */; }; + 1C8F1A4D2100B24400F6FEF4 /* FBXCTestCaseImplementationFailureHoldingProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = EE7E271B1D06C69F001BEC7B /* FBXCTestCaseImplementationFailureHoldingProxy.m */; }; + 1C8F1A4E2100B24400F6FEF4 /* XCUIDevice+FBHealthCheck.m in Sources */ = {isa = PBXBuildFile; fileRef = EEDFE1201D9C06F800E6FFE5 /* XCUIDevice+FBHealthCheck.m */; }; + 1C8F1A4F2100B24400F6FEF4 /* FBHomeboardApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC088EB1CB5706D00B65968 /* FBHomeboardApplication.m */; }; + 1C8F1A502100B24400F6FEF4 /* FBResponseFilePayload.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB77F1CAEDF0C008C271F /* FBResponseFilePayload.m */; }; + 1C8F1A512100B24400F6FEF4 /* XCUIElement+FBWebDriverAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE376481D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.m */; }; + 1C8F1A522100B24400F6FEF4 /* XCUIElement+FBForceTouch.m in Sources */ = {isa = PBXBuildFile; fileRef = EE8DDD7C20C5733B004D4925 /* XCUIElement+FBForceTouch.m */; }; + 1C8F1A542100B24400F6FEF4 /* FBDebugCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7551CAEDF0C008C271F /* FBDebugCommands.m */; }; + 1C8F1A552100B24400F6FEF4 /* NSString+FBXMLSafeString.m in Sources */ = {isa = PBXBuildFile; fileRef = 716E0BCD1E917E810087A825 /* NSString+FBXMLSafeString.m */; }; + 1C8F1A562100B24400F6FEF4 /* FBUnknownCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7651CAEDF0C008C271F /* FBUnknownCommands.m */; }; + 1C8F1A592100B24400F6FEF4 /* FBRuntimeUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7921CAEDF0C008C271F /* FBRuntimeUtils.m */; }; + 1C8F1A5A2100B24400F6FEF4 /* XCUIElement+FBUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE376401D59F81400ED88DD /* XCUIElement+FBUtilities.m */; }; + 1C8F1A5B2100B24400F6FEF4 /* FBLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9B76A41CF7A43900275851 /* FBLogger.m */; }; + 1C8F1A5C2100B24400F6FEF4 /* FBCustomCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7531CAEDF0C008C271F /* FBCustomCommands.m */; }; + 1C8F1A5D2100B24400F6FEF4 /* XCUIDevice+FBHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = AD6C26971CF2481700F8B5FF /* XCUIDevice+FBHelpers.m */; }; + 1C8F1A5E2100B24400F6FEF4 /* XCTestPrivateSymbols.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6B64FC1D0F86EF00E85F5D /* XCTestPrivateSymbols.m */; }; + 1C8F1A5F2100B24400F6FEF4 /* XCUIElement+FBTyping.m in Sources */ = {isa = PBXBuildFile; fileRef = AD76723C1D6B7CC000610457 /* XCUIElement+FBTyping.m */; }; + 1C8F1A602100B24400F6FEF4 /* XCUIElement+FBAccessibility.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7461CAEDF0C008C271F /* XCUIElement+FBAccessibility.m */; }; + 1C8F1A612100B24400F6FEF4 /* FBSession.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB78B1CAEDF0C008C271F /* FBSession.m */; }; + 1C8F1A622100B24400F6FEF4 /* FBFindElementCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7591CAEDF0C008C271F /* FBFindElementCommands.m */; }; + 1C8F1A632100B24400F6FEF4 /* FBDebugLogDelegateDecorator.m in Sources */ = {isa = PBXBuildFile; fileRef = EE7E27191D06C69F001BEC7B /* FBDebugLogDelegateDecorator.m */; }; + 1C8F1A652100B24400F6FEF4 /* XCUIElement+FBScrolling.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB74A1CAEDF0C008C271F /* XCUIElement+FBScrolling.m */; }; + 1C8F1A662100B24400F6FEF4 /* FBSessionCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7611CAEDF0C008C271F /* FBSessionCommands.m */; }; + 1C8F1A672100B24400F6FEF4 /* FBInspectorCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB75B1CAEDF0C008C271F /* FBInspectorCommands.m */; }; + 1C8F1A682100B24400F6FEF4 /* XCElementSnapshot+FBHitPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = EE006EAF1EBA1AA9006900A4 /* XCElementSnapshot+FBHitPoint.m */; }; + 1C8F1A692100B24400F6FEF4 /* FBConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9B76A21CF7A43900275851 /* FBConfiguration.m */; }; + 1C8F1A6A2100B24400F6FEF4 /* FBElementCache.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC088E41CB56AC000B65968 /* FBElementCache.m */; }; + 1C8F1A6B2100B24400F6FEF4 /* FBAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = AD6C26931CF2379700F8B5FF /* FBAlert.m */; }; + 1C8F1A6C2100B24400F6FEF4 /* FBElementCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7571CAEDF0C008C271F /* FBElementCommands.m */; }; + 1C8F1A6D2100B24400F6FEF4 /* FBExceptionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC088E71CB56DA400B65968 /* FBExceptionHandler.m */; }; + 1C8F1A6E2100B24400F6FEF4 /* FBXCodeCompatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = EE5A24411F136C8D0078B1D9 /* FBXCodeCompatibility.m */; }; + 1C8F1A6F2100B24400F6FEF4 /* XCElementSnapshot+FBHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE3763C1D59F81400ED88DD /* XCElementSnapshot+FBHelpers.m */; }; + 1C8F1A702100B24400F6FEF4 /* FBElementTypeTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7901CAEDF0C008C271F /* FBElementTypeTransformer.m */; }; + 1C8F1A712100B24400F6FEF4 /* FBApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7671CAEDF0C008C271F /* FBApplication.m */; }; + 1C8F1A722100B24400F6FEF4 /* FBXCTestDaemonsProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = EE35AD7A1E3B80C000A02D78 /* FBXCTestDaemonsProxy.m */; }; + 1C8F1A732100B24400F6FEF4 /* XCUIElement+FBTap.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB74C1CAEDF0C008C271F /* XCUIElement+FBTap.m */; }; + 1C8F1A742100B24400F6FEF4 /* FBMathUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = EE1888391DA661C400307AA8 /* FBMathUtils.m */; }; + 1C8F1A792100B24400F6FEF4 /* XCUIElement+FBWebDriverAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = EEE376471D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A7A2100B24400F6FEF4 /* XCTestPrivateSymbols.h in Headers */ = {isa = PBXBuildFile; fileRef = EE6B64FB1D0F86EF00E85F5D /* XCTestPrivateSymbols.h */; }; + 1C8F1A7B2100B24400F6FEF4 /* XCUIElement+FBTyping.h in Headers */ = {isa = PBXBuildFile; fileRef = AD76723B1D6B7CC000610457 /* XCUIElement+FBTyping.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A7C2100B24400F6FEF4 /* XCUIElement+FBUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = EEE3763F1D59F81400ED88DD /* XCUIElement+FBUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A7D2100B24400F6FEF4 /* XCUIElement+FBScrolling.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7491CAEDF0C008C271F /* XCUIElement+FBScrolling.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A7E2100B24400F6FEF4 /* XCSourceCodeTreeNode.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACC51E3B77D600A02D78 /* XCSourceCodeTreeNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A7F2100B24400F6FEF4 /* XCPointerEventPath.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACC31E3B77D600A02D78 /* XCPointerEventPath.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A802100B24400F6FEF4 /* FBRouteRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7871CAEDF0C008C271F /* FBRouteRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A812100B24400F6FEF4 /* XCTest.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACCF1E3B77D600A02D78 /* XCTest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A822100B24400F6FEF4 /* FBElementHitPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = EEC1950520C6D0790094500B /* FBElementHitPoint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A832100B24400F6FEF4 /* XCAccessibilityElement.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACB31E3B77D600A02D78 /* XCAccessibilityElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A842100B24400F6FEF4 /* FBSession.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB78A1CAEDF0C008C271F /* FBSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A852100B24400F6FEF4 /* _XCTestImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AC9E1E3B77D600A02D78 /* _XCTestImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A872100B24400F6FEF4 /* XCUIApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACF91E3B77D600A02D78 /* XCUIApplication.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A882100B24400F6FEF4 /* FBCustomCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7521CAEDF0C008C271F /* FBCustomCommands.h */; }; + 1C8F1A892100B24400F6FEF4 /* _XCTestCaseInterruptionException.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AC9C1E3B77D600A02D78 /* _XCTestCaseInterruptionException.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A8B2100B24400F6FEF4 /* XCTRunnerIDESession.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACF01E3B77D600A02D78 /* XCTRunnerIDESession.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A8C2100B24400F6FEF4 /* FBRouteRequest-Private.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7861CAEDF0C008C271F /* FBRouteRequest-Private.h */; }; + 1C8F1A8D2100B24400F6FEF4 /* XCTTestRunSession.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACF11E3B77D600A02D78 /* XCTTestRunSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A8E2100B24400F6FEF4 /* XCTestProbe.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACE31E3B77D600A02D78 /* XCTestProbe.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A8F2100B24400F6FEF4 /* XCApplicationQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACB71E3B77D600A02D78 /* XCApplicationQuery.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A902100B24400F6FEF4 /* XCTAsyncActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACCB1E3B77D600A02D78 /* XCTAsyncActivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A912100B24400F6FEF4 /* XCTestMisuseObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACDF1E3B77D600A02D78 /* XCTestMisuseObserver.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A922100B24400F6FEF4 /* XCTRunnerDaemonSession.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACEF1E3B77D600A02D78 /* XCTRunnerDaemonSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A932100B24400F6FEF4 /* FBApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7661CAEDF0C008C271F /* FBApplication.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A942100B24400F6FEF4 /* XCTestExpectationWaiter.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACDA1E3B77D600A02D78 /* XCTestExpectationWaiter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A952100B24400F6FEF4 /* UIGestureRecognizer-RecordingAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACAD1E3B77D600A02D78 /* UIGestureRecognizer-RecordingAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A962100B24400F6FEF4 /* XCKeyboardKeyMap.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACBF1E3B77D600A02D78 /* XCKeyboardKeyMap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A972100B24400F6FEF4 /* XCTNSPredicateExpectationObject-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACEC1E3B77D600A02D78 /* XCTNSPredicateExpectationObject-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A982100B24400F6FEF4 /* WebDriverAgentLib.h in Headers */ = {isa = PBXBuildFile; fileRef = EE158B5E1CBD47A000A3E3F0 /* WebDriverAgentLib.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A992100B24400F6FEF4 /* FBFindElementCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7581CAEDF0C008C271F /* FBFindElementCommands.h */; }; + 1C8F1A9A2100B24400F6FEF4 /* XCTestRun.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACE41E3B77D600A02D78 /* XCTestRun.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A9B2100B24400F6FEF4 /* FBWebServer.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB78C1CAEDF0C008C271F /* FBWebServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A9C2100B24400F6FEF4 /* FBScreenshotCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB75E1CAEDF0C008C271F /* FBScreenshotCommands.h */; }; + 1C8F1A9D2100B24400F6FEF4 /* _XCKVOExpectationImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AC991E3B77D600A02D78 /* _XCKVOExpectationImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1A9E2100B24400F6FEF4 /* NSString+FBVisualLength.h in Headers */ = {isa = PBXBuildFile; fileRef = EE0D1F5F1EBCDCF7006A3123 /* NSString+FBVisualLength.h */; }; + 1C8F1A9F2100B24400F6FEF4 /* FBXCTestDaemonsProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AD791E3B80C000A02D78 /* FBXCTestDaemonsProxy.h */; }; + 1C8F1AA02100B24400F6FEF4 /* XCUIElementHitPointCoordinate.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AD011E3B77D600A02D78 /* XCUIElementHitPointCoordinate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AA12100B24400F6FEF4 /* XCTDarwinNotificationExpectation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACCE1E3B77D600A02D78 /* XCTDarwinNotificationExpectation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AA22100B24400F6FEF4 /* XCTRunnerAutomationSession.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACEE1E3B77D600A02D78 /* XCTRunnerAutomationSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AA42100B24400F6FEF4 /* XCSourceCodeTreeNodeEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACC61E3B77D600A02D78 /* XCSourceCodeTreeNodeEnumerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AA52100B24400F6FEF4 /* XCUIElement+FBIsVisible.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7471CAEDF0C008C271F /* XCUIElement+FBIsVisible.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AA62100B24400F6FEF4 /* FBXPathCreator.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7981CAEDF0C008C271F /* FBXPathCreator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AA72100B24400F6FEF4 /* XCUIElement+FBTap.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB74B1CAEDF0C008C271F /* XCUIElement+FBTap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AA82100B24400F6FEF4 /* FBResponsePayload.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7821CAEDF0C008C271F /* FBResponsePayload.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AA92100B24400F6FEF4 /* FBUnknownCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7641CAEDF0C008C271F /* FBUnknownCommands.h */; }; + 1C8F1AAA2100B24400F6FEF4 /* NSPredicate+FBFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 71A224E31DE2F56600844D55 /* NSPredicate+FBFormat.h */; }; + 1C8F1AAB2100B24400F6FEF4 /* UILongPressGestureRecognizer-RecordingAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACAE1E3B77D600A02D78 /* UILongPressGestureRecognizer-RecordingAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AAC2100B24400F6FEF4 /* XCTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACD01E3B77D600A02D78 /* XCTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AAD2100B24400F6FEF4 /* XCSymbolicatorHolder.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACC81E3B77D600A02D78 /* XCSymbolicatorHolder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AAE2100B24400F6FEF4 /* XCUIApplicationImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACFA1E3B77D600A02D78 /* XCUIApplicationImpl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AAF2100B24400F6FEF4 /* UIPanGestureRecognizer-RecordingAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACAF1E3B77D600A02D78 /* UIPanGestureRecognizer-RecordingAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AB02100B24400F6FEF4 /* NSExpression+FBFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 71555A3B1DEC460A007D4A8B /* NSExpression+FBFormat.h */; }; + 1C8F1AB12100B24400F6FEF4 /* _XCTestCaseImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AC9B1E3B77D600A02D78 /* _XCTestCaseImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AB22100B24400F6FEF4 /* UIPinchGestureRecognizer-RecordingAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACB01E3B77D600A02D78 /* UIPinchGestureRecognizer-RecordingAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AB32100B24400F6FEF4 /* XCTestManager_TestsInterface-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACDE1E3B77D600A02D78 /* XCTestManager_TestsInterface-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AB42100B24400F6FEF4 /* XCDeviceEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACBA1E3B77D600A02D78 /* XCDeviceEvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AB52100B24400F6FEF4 /* FBMathUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = EE1888381DA661C400307AA8 /* FBMathUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AB62100B24400F6FEF4 /* UISwipeGestureRecognizer-RecordingAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACB11E3B77D600A02D78 /* UISwipeGestureRecognizer-RecordingAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AB72100B24400F6FEF4 /* FBElementUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 713C6DCD1DDC772A00285B92 /* FBElementUtils.h */; }; + 1C8F1AB82100B24400F6FEF4 /* FBDebugCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7541CAEDF0C008C271F /* FBDebugCommands.h */; }; + 1C8F1AB92100B24400F6FEF4 /* XCTestSuite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACE51E3B77D600A02D78 /* XCTestSuite.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ABA2100B24400F6FEF4 /* XCUICoordinate.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACFC1E3B77D600A02D78 /* XCUICoordinate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ABB2100B24400F6FEF4 /* XCTNSPredicateExpectation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACEB1E3B77D600A02D78 /* XCTNSPredicateExpectation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ABC2100B24400F6FEF4 /* XCTestObservationCenter.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACE11E3B77D600A02D78 /* XCTestObservationCenter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ABD2100B24400F6FEF4 /* XCTNSNotificationExpectation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACEA1E3B77D600A02D78 /* XCTNSNotificationExpectation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ABE2100B24400F6FEF4 /* XCUIRecorderNodeFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AD041E3B77D600A02D78 /* XCUIRecorderNodeFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ABF2100B24400F6FEF4 /* XCUIElement+FBAccessibility.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7451CAEDF0C008C271F /* XCUIElement+FBAccessibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AC02100B24400F6FEF4 /* XCUIRecorderUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AD071E3B77D600A02D78 /* XCUIRecorderUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AC12100B24400F6FEF4 /* XCTestCaseRun.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACD11E3B77D600A02D78 /* XCTestCaseRun.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AC22100B24400F6FEF4 /* XCTestConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACD31E3B77D600A02D78 /* XCTestConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AC32100B24400F6FEF4 /* _XCTDarwinNotificationExpectationImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AC9A1E3B77D600A02D78 /* _XCTDarwinNotificationExpectationImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AC42100B24400F6FEF4 /* XCTestExpectation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACD81E3B77D600A02D78 /* XCTestExpectation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AC52100B24400F6FEF4 /* FBElementTypeTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB78F1CAEDF0C008C271F /* FBElementTypeTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AC62100B24400F6FEF4 /* FBElementCache.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB77B1CAEDF0C008C271F /* FBElementCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AC72100B24400F6FEF4 /* XCTMetric.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACE91E3B77D600A02D78 /* XCTMetric.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AC82100B24400F6FEF4 /* XCTestContextScope.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACD51E3B77D600A02D78 /* XCTestContextScope.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AC92100B24400F6FEF4 /* XCUIElement+FBClassChain.h in Headers */ = {isa = PBXBuildFile; fileRef = 71A7EAF31E20516B001DA4F2 /* XCUIElement+FBClassChain.h */; }; + 1C8F1ACA2100B24400F6FEF4 /* FBResponseJSONPayload.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7801CAEDF0C008C271F /* FBResponseJSONPayload.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ACB2100B24400F6FEF4 /* XCTAutomationTarget-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACCC1E3B77D600A02D78 /* XCTAutomationTarget-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ACC2100B24400F6FEF4 /* FBElement.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7791CAEDF0C008C271F /* FBElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ACD2100B24400F6FEF4 /* XCTAXClient-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACCD1E3B77D600A02D78 /* XCTAXClient-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ACE2100B24400F6FEF4 /* FBPredicate.h in Headers */ = {isa = PBXBuildFile; fileRef = EEEC7C901F21F27A0053426C /* FBPredicate.h */; }; + 1C8F1ACF2100B24400F6FEF4 /* FBExceptionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = EEC088E61CB56DA400B65968 /* FBExceptionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AD02100B24400F6FEF4 /* FBRoute.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7841CAEDF0C008C271F /* FBRoute.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AD12100B24400F6FEF4 /* XCTestDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACD61E3B77D600A02D78 /* XCTestDriver.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AD22100B24400F6FEF4 /* _XCTNSNotificationExpectationImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACA11E3B77D600A02D78 /* _XCTNSNotificationExpectationImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AD32100B24400F6FEF4 /* XCSynthesizedEventRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACC91E3B77D600A02D78 /* XCSynthesizedEventRecord.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AD42100B24400F6FEF4 /* FBInspectorCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB75A1CAEDF0C008C271F /* FBInspectorCommands.h */; }; + 1C8F1AD52100B24400F6FEF4 /* FBApplicationProcessProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7681CAEDF0C008C271F /* FBApplicationProcessProxy.h */; }; + 1C8F1AD62100B24400F6FEF4 /* XCTWaiterDelegatePrivate-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACF61E3B77D600A02D78 /* XCTWaiterDelegatePrivate-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AD72100B24400F6FEF4 /* XCTestManager_IDEInterface-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACDC1E3B77D600A02D78 /* XCTestManager_IDEInterface-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AD82100B24400F6FEF4 /* FBXPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 711084421DA3AA7500F913D6 /* FBXPath.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AD92100B24400F6FEF4 /* XCUIRecorderTimingMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AD061E3B77D600A02D78 /* XCUIRecorderTimingMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ADA2100B24400F6FEF4 /* XCApplicationMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACB61E3B77D600A02D78 /* XCApplicationMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ADB2100B24400F6FEF4 /* XCUIElement+FBForceTouch.h in Headers */ = {isa = PBXBuildFile; fileRef = EE8DDD7D20C5733C004D4925 /* XCUIElement+FBForceTouch.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ADC2100B24400F6FEF4 /* FBRuntimeUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7911CAEDF0C008C271F /* FBRuntimeUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ADD2100B24400F6FEF4 /* XCUIElement+FBPickerWheel.h in Headers */ = {isa = PBXBuildFile; fileRef = 7136A4771E8918E60024FC3D /* XCUIElement+FBPickerWheel.h */; }; + 1C8F1ADE2100B24400F6FEF4 /* XCTestObservation-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACE01E3B77D600A02D78 /* XCTestObservation-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1ADF2100B24400F6FEF4 /* _XCTNSPredicateExpectationImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACA21E3B77D600A02D78 /* _XCTNSPredicateExpectationImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AE02100B24400F6FEF4 /* FBElementCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7561CAEDF0C008C271F /* FBElementCommands.h */; }; + 1C8F1AE12100B24400F6FEF4 /* FBResponseFilePayload.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB77E1CAEDF0C008C271F /* FBResponseFilePayload.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AE22100B24400F6FEF4 /* FBHomeboardApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = EEC088EA1CB5706D00B65968 /* FBHomeboardApplication.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AE32100B24400F6FEF4 /* XCUIElement+FBUID.h in Headers */ = {isa = PBXBuildFile; fileRef = 71B49EC51ED1A58100D51AD6 /* XCUIElement+FBUID.h */; }; + 1C8F1AE42100B24400F6FEF4 /* XCSymbolicationRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACC71E3B77D600A02D78 /* XCSymbolicationRecord.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AE52100B24400F6FEF4 /* XCUIDevice.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACFD1E3B77D600A02D78 /* XCUIDevice.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AE62100B24400F6FEF4 /* FBCommandHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7751CAEDF0C008C271F /* FBCommandHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AE72100B24400F6FEF4 /* FBSessionCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7601CAEDF0C008C271F /* FBSessionCommands.h */; }; + 1C8F1AE82100B24400F6FEF4 /* FBSession-Private.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7891CAEDF0C008C271F /* FBSession-Private.h */; }; + 1C8F1AE92100B24400F6FEF4 /* NSString+FBXMLSafeString.h in Headers */ = {isa = PBXBuildFile; fileRef = 716E0BCC1E917E810087A825 /* NSString+FBXMLSafeString.h */; }; + 1C8F1AEA2100B24400F6FEF4 /* FBCommandStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7761CAEDF0C008C271F /* FBCommandStatus.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AEB2100B24400F6FEF4 /* XCElementSnapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACBC1E3B77D600A02D78 /* XCElementSnapshot.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AED2100B24400F6FEF4 /* XCTWaiter.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACF41E3B77D600A02D78 /* XCTWaiter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AEE2100B24400F6FEF4 /* XCTWaiterManagement-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACF71E3B77D600A02D78 /* XCTWaiterManagement-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AEF2100B24400F6FEF4 /* XCElementSnapshot+FBHitPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = EE006EAE1EBA1AA9006900A4 /* XCElementSnapshot+FBHitPoint.h */; }; + 1C8F1AF02100B24400F6FEF4 /* XCTestContext.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACD41E3B77D600A02D78 /* XCTestContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AF12100B24400F6FEF4 /* XCTWaiterDelegate-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACF51E3B77D600A02D78 /* XCTWaiterDelegate-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AF22100B24400F6FEF4 /* _XCTestExpectationImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AC9D1E3B77D600A02D78 /* _XCTestExpectationImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AF32100B24400F6FEF4 /* XCAXClient_iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACB81E3B77D600A02D78 /* XCAXClient_iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AF42100B24400F6FEF4 /* XCTWaiterManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACF81E3B77D600A02D78 /* XCTWaiterManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AF52100B24400F6FEF4 /* XCTestDriverInterface-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACD71E3B77D600A02D78 /* XCTestDriverInterface-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AF62100B24400F6FEF4 /* _XCTestSuiteImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACA01E3B77D600A02D78 /* _XCTestSuiteImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AF72100B24400F6FEF4 /* FBAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = AD6C26921CF2379700F8B5FF /* FBAlert.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AF82100B24400F6FEF4 /* XCUIElementQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AD021E3B77D600A02D78 /* XCUIElementQuery.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AF92100B24400F6FEF4 /* XCPointerEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACC21E3B77D600A02D78 /* XCPointerEvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AFA2100B24400F6FEF4 /* XCSourceCodeRecording.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACC41E3B77D600A02D78 /* XCSourceCodeRecording.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AFB2100B24400F6FEF4 /* FBRunLoopSpinner.h in Headers */ = {isa = PBXBuildFile; fileRef = EEE9B4701CD02B88009D2030 /* FBRunLoopSpinner.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AFC2100B24400F6FEF4 /* FBErrorBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = EE3A18601CDE618F00DE4205 /* FBErrorBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AFD2100B24400F6FEF4 /* XCApplicationMonitor_iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACB51E3B77D600A02D78 /* XCApplicationMonitor_iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AFE2100B24400F6FEF4 /* FBKeyboard.h in Headers */ = {isa = PBXBuildFile; fileRef = EE3A18641CDE734B00DE4205 /* FBKeyboard.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1AFF2100B24400F6FEF4 /* XCUIApplication+FBHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = AD6C269A1CF2494200F8B5FF /* XCUIApplication+FBHelpers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B002100B24400F6FEF4 /* _XCTestObservationCenterImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AC9F1E3B77D600A02D78 /* _XCTestObservationCenterImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B012100B24400F6FEF4 /* XCUIDevice+FBHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = AD6C26961CF2481700F8B5FF /* XCUIDevice+FBHelpers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B022100B24400F6FEF4 /* FBClassChainQueryParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 71A7EAF71E224648001DA4F2 /* FBClassChainQueryParser.h */; }; + 1C8F1B032100B24400F6FEF4 /* FBMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9B76A51CF7A43900275851 /* FBMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B042100B24400F6FEF4 /* XCTestExpectationDelegate-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACD91E3B77D600A02D78 /* XCTestExpectationDelegate-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B052100B24400F6FEF4 /* XCTUIApplicationMonitor-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACF31E3B77D600A02D78 /* XCTUIApplicationMonitor-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B062100B24400F6FEF4 /* XCElementSnapshot+FBHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = EEE3763B1D59F81400ED88DD /* XCElementSnapshot+FBHelpers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B072100B24400F6FEF4 /* XCTKVOExpectation.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACE81E3B77D600A02D78 /* XCTKVOExpectation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B092100B24400F6FEF4 /* XCEventGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACBD1E3B77D600A02D78 /* XCEventGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B0A2100B24400F6FEF4 /* FBConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9B76A11CF7A43900275851 /* FBConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B0B2100B24400F6FEF4 /* XCTestSuiteRun.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACE61E3B77D600A02D78 /* XCTestSuiteRun.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B0C2100B24400F6FEF4 /* XCUIElementAsynchronousHandlerWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACFF1E3B77D600A02D78 /* XCUIElementAsynchronousHandlerWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B0D2100B24400F6FEF4 /* XCTestLog.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACDB1E3B77D600A02D78 /* XCTestLog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B0E2100B24400F6FEF4 /* XCUIHitPointResult.h in Headers */ = {isa = PBXBuildFile; fileRef = EEC1950320C6CEA10094500B /* XCUIHitPointResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B0F2100B24400F6FEF4 /* UITapGestureRecognizer-RecordingAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACB21E3B77D600A02D78 /* UITapGestureRecognizer-RecordingAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B102100B24400F6FEF4 /* XCDebugLogDelegate-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACB91E3B77D600A02D78 /* XCDebugLogDelegate-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B112100B24400F6FEF4 /* NSString-XCTAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACAB1E3B77D600A02D78 /* NSString-XCTAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B122100B24400F6FEF4 /* XCTestWaiter.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACE71E3B77D600A02D78 /* XCTestWaiter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B132100B24400F6FEF4 /* NSValue-XCTestAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACAC1E3B77D600A02D78 /* NSValue-XCTestAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B142100B24400F6FEF4 /* _XCTWaiterImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACA31E3B77D600A02D78 /* _XCTWaiterImpl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B152100B24400F6FEF4 /* FBLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9B76A31CF7A43900275851 /* FBLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B162100B24400F6FEF4 /* XCTestObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACE21E3B77D600A02D78 /* XCTestObserver.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B172100B24400F6FEF4 /* XCUIElement.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACFE1E3B77D600A02D78 /* XCUIElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B182100B24400F6FEF4 /* XCKeyboardInputSolver.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACBE1E3B77D600A02D78 /* XCKeyboardInputSolver.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B192100B24400F6FEF4 /* FBXCTestCaseImplementationFailureHoldingProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = EE7E271A1D06C69F001BEC7B /* FBXCTestCaseImplementationFailureHoldingProxy.h */; }; + 1C8F1B1A2100B24400F6FEF4 /* FBDebugLogDelegateDecorator.h in Headers */ = {isa = PBXBuildFile; fileRef = EE7E27181D06C69F001BEC7B /* FBDebugLogDelegateDecorator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B1B2100B24400F6FEF4 /* XCUIDevice+FBHealthCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = EEDFE11F1D9C06F800E6FFE5 /* XCUIDevice+FBHealthCheck.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B1C2100B24400F6FEF4 /* XCUIRecorderNodeFinderMatch.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AD051E3B77D600A02D78 /* XCUIRecorderNodeFinderMatch.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B1D2100B24400F6FEF4 /* XCUIApplicationProcess.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACFB1E3B77D600A02D78 /* XCUIApplicationProcess.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B1E2100B24400F6FEF4 /* CDStructures.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACA41E3B77D600A02D78 /* CDStructures.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B1F2100B24400F6FEF4 /* XCKeyboardLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACC01E3B77D600A02D78 /* XCKeyboardLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B202100B24400F6FEF4 /* XCTAsyncActivity-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACCA1E3B77D600A02D78 /* XCTAsyncActivity-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B212100B24400F6FEF4 /* XCActivityRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACB41E3B77D600A02D78 /* XCActivityRecord.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B222100B24400F6FEF4 /* XCUIElement+FBFind.h in Headers */ = {isa = PBXBuildFile; fileRef = EEBBD4891D47746D00656A81 /* XCUIElement+FBFind.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B232100B24400F6FEF4 /* XCTestManager_ManagerInterface-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACDD1E3B77D600A02D78 /* XCTestManager_ManagerInterface-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B242100B24400F6FEF4 /* FBFailureProofTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = EE6A89381D0B38640083E92B /* FBFailureProofTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B252100B24400F6FEF4 /* XCTTestRunSessionDelegate-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACF21E3B77D600A02D78 /* XCTTestRunSessionDelegate-Protocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B262100B24400F6FEF4 /* XCTestCaseSuite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACD21E3B77D600A02D78 /* XCTestCaseSuite.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B272100B24400F6FEF4 /* _XCInternalTestRun.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35AC981E3B77D600A02D78 /* _XCInternalTestRun.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B282100B24400F6FEF4 /* FBXPath-Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 712A0C861DA3E55D007D02E5 /* FBXPath-Private.h */; }; + 1C8F1B292100B24400F6FEF4 /* XCKeyMappingPath.h in Headers */ = {isa = PBXBuildFile; fileRef = EE35ACC11E3B77D600A02D78 /* XCKeyMappingPath.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8F1B2B2100B24400F6FEF4 /* WebDriverAgent.bundle in Resources */ = {isa = PBXBuildFile; fileRef = EEDBEBBA1CB2681900A790A2 /* WebDriverAgent.bundle */; }; + 1C936535216378B800926F2C /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE8980D321105B49001789EE /* XCTest.framework */; }; + 1C9365362163794600926F2C /* XCTAutomationSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE8980D321105B49001789ED /* XCTAutomationSupport.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 1C9365392163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C9365372163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h */; }; + 1C93653A2163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C9365372163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h */; }; + 1C93653B2163BA8A00926F2C /* XCAccessibilityElement+FBComparison.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C9365382163BA8A00926F2C /* XCAccessibilityElement+FBComparison.m */; }; + 1C93653C2163BA8A00926F2C /* XCAccessibilityElement+FBComparison.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C9365382163BA8A00926F2C /* XCAccessibilityElement+FBComparison.m */; }; + 1C93653D2163DBB800926F2C /* FBFailureProofTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6A89391D0B38640083E92B /* FBFailureProofTestCase.m */; }; + 1CD0FBE2211850B80092C929 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954682111DC0800A99F21 /* libxml2.tbd */; }; + 1CD0FBE3211850BD0092C929 /* WebDriverAgentLib_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; }; + 1CDC56622111C26F00868007 /* UITestingUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7FD1CAEE048008C271F /* UITestingUITests.m */; }; + 1CEC817E2199A0990071306F /* FBTVFailureProofTestCaseTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CEC817D2199A0990071306F /* FBTVFailureProofTestCaseTests.m */; }; + 1CEC81802199A8170071306F /* FBTVKeyboardTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CEC817F2199A8170071306F /* FBTVKeyboardTests.m */; }; + 1CEC81902199B6630071306F /* WebDriverAgentLib_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; }; + 1CEC81912199B6630071306F /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954682111DC0800A99F21 /* libxml2.tbd */; }; + 1CEC81992199B79F0071306F /* FBTVTypingTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CEC81982199B79F0071306F /* FBTVTypingTest.m */; }; + 1CEC819B2199BA400071306F /* FBTVXPathIntegrationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CEC819A2199BA400071306F /* FBTVXPathIntegrationTests.m */; }; + 1CEC819C2199C2030071306F /* FBTVElementScreenshotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C4485A6216BF07B00D2B2D8 /* FBTVElementScreenshotTests.m */; }; + 1CEC819E2199CC460071306F /* TVXCElementSnapshotHelperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CEC819D2199CC460071306F /* TVXCElementSnapshotHelperTests.m */; }; 1FC3B2E32121ECF600B61EE0 /* FBApplicationProcessProxyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FC3B2E12121EC8C00B61EE0 /* FBApplicationProcessProxyTests.m */; }; 711084441DA3AA7500F913D6 /* FBXPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 711084421DA3AA7500F913D6 /* FBXPath.h */; settings = {ATTRIBUTES = (Public, ); }; }; 711084451DA3AA7500F913D6 /* FBXPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 711084431DA3AA7500F913D6 /* FBXPath.m */; }; @@ -125,8 +439,8 @@ EE158AF21CBD456F00A3E3F0 /* FBXPathCreator.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7991CAEDF0C008C271F /* FBXPathCreator.m */; }; EE158AF51CBD456F00A3E3F0 /* FBApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7661CAEDF0C008C271F /* FBApplication.h */; settings = {ATTRIBUTES = (Public, ); }; }; EE158AF61CBD456F00A3E3F0 /* FBApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7671CAEDF0C008C271F /* FBApplication.m */; }; - EE158AF71CBD456F00A3E3F0 /* FBSpringboardApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = EEC088EA1CB5706D00B65968 /* FBSpringboardApplication.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE158AF81CBD456F00A3E3F0 /* FBSpringboardApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC088EB1CB5706D00B65968 /* FBSpringboardApplication.m */; }; + EE158AF71CBD456F00A3E3F0 /* FBHomeboardApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = EEC088EA1CB5706D00B65968 /* FBHomeboardApplication.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE158AF81CBD456F00A3E3F0 /* FBHomeboardApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC088EB1CB5706D00B65968 /* FBHomeboardApplication.m */; }; EE158AF91CBD456F00A3E3F0 /* FBApplicationProcessProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7681CAEDF0C008C271F /* FBApplicationProcessProxy.h */; }; EE158AFA1CBD456F00A3E3F0 /* FBApplicationProcessProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7691CAEDF0C008C271F /* FBApplicationProcessProxy.m */; }; EE158B5A1CBD462100A3E3F0 /* WebDriverAgentLib.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE158A991CBD452B00A3E3F0 /* WebDriverAgentLib.framework */; }; @@ -274,7 +588,6 @@ EE6A892D1D0B2AF40083E92B /* FBErrorBuilderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6A892C1D0B2AF40083E92B /* FBErrorBuilderTests.m */; }; EE6A89371D0B35920083E92B /* FBFailureProofTestCaseTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6A89361D0B35920083E92B /* FBFailureProofTestCaseTests.m */; }; EE6A893A1D0B38640083E92B /* FBFailureProofTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = EE6A89381D0B38640083E92B /* FBFailureProofTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE6A893B1D0B38640083E92B /* FBFailureProofTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6A89391D0B38640083E92B /* FBFailureProofTestCase.m */; }; EE6B64FD1D0F86EF00E85F5D /* XCTestPrivateSymbols.h in Headers */ = {isa = PBXBuildFile; fileRef = EE6B64FB1D0F86EF00E85F5D /* XCTestPrivateSymbols.h */; }; EE6B64FE1D0F86EF00E85F5D /* XCTestPrivateSymbols.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6B64FC1D0F86EF00E85F5D /* XCTestPrivateSymbols.m */; }; EE7E271C1D06C69F001BEC7B /* FBDebugLogDelegateDecorator.h in Headers */ = {isa = PBXBuildFile; fileRef = EE7E27181D06C69F001BEC7B /* FBDebugLogDelegateDecorator.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -306,7 +619,6 @@ EEC1950820C6D0790094500B /* FBElementHitPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC1950620C6D0790094500B /* FBElementHitPoint.m */; }; EEC9EED620064FAA00BC0D5B /* XCUICoordinate+FBFix.h in Headers */ = {isa = PBXBuildFile; fileRef = EEC9EED420064FAA00BC0D5B /* XCUICoordinate+FBFix.h */; }; EEC9EED720064FAA00BC0D5B /* XCUICoordinate+FBFix.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC9EED520064FAA00BC0D5B /* XCUICoordinate+FBFix.m */; }; - EEC9EED920077D8E00BC0D5B /* XCUICoordinateFix.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC9EED820077D8E00BC0D5B /* XCUICoordinateFix.m */; }; EEDFE1211D9C06F800E6FFE5 /* XCUIDevice+FBHealthCheck.h in Headers */ = {isa = PBXBuildFile; fileRef = EEDFE11F1D9C06F800E6FFE5 /* XCUIDevice+FBHealthCheck.h */; settings = {ATTRIBUTES = (Public, ); }; }; EEDFE1221D9C06F800E6FFE5 /* XCUIDevice+FBHealthCheck.m in Sources */ = {isa = PBXBuildFile; fileRef = EEDFE1201D9C06F800E6FFE5 /* XCUIDevice+FBHealthCheck.m */; }; EEE16E971D33A25500172525 /* FBConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE16E961D33A25500172525 /* FBConfigurationTests.m */; }; @@ -321,13 +633,55 @@ EEE3764A1D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE376481D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.m */; }; EEE9B4721CD02B88009D2030 /* FBRunLoopSpinner.h in Headers */ = {isa = PBXBuildFile; fileRef = EEE9B4701CD02B88009D2030 /* FBRunLoopSpinner.h */; settings = {ATTRIBUTES = (Public, ); }; }; EEE9B4731CD02B88009D2030 /* FBRunLoopSpinner.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE9B4711CD02B88009D2030 /* FBRunLoopSpinner.m */; }; - EEEA70152110605600C8ADE3 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE8980D321105B49001789EE /* XCTest.framework */; }; EEEA70152110605600C8ADE2 /* XCTAutomationSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE8980D321105B49001789ED /* XCTAutomationSupport.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + EEEA70152110605600C8ADE3 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE8980D321105B49001789EE /* XCTest.framework */; }; EEEC7C921F21F27A0053426C /* FBPredicate.h in Headers */ = {isa = PBXBuildFile; fileRef = EEEC7C901F21F27A0053426C /* FBPredicate.h */; }; EEEC7C931F21F27A0053426C /* FBPredicate.m in Sources */ = {isa = PBXBuildFile; fileRef = EEEC7C911F21F27A0053426C /* FBPredicate.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 1C0EE1122111C4A9009EDBB1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; + remoteInfo = WebDriverAgentLib_tvOS; + }; + 1C3C6FBF21184F8400FAFD69 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C1954AF21133DDC00A99F21; + remoteInfo = IntegrationApp_tvOS; + }; + 1C7365D6219C67EB009BC01A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; + remoteInfo = WebDriverAgentLib_tvOS; + }; + 1CD0FBE0211850A90092C929 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; + remoteInfo = WebDriverAgentLib_tvOS; + }; + 1CEC81832199B6630071306F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; + remoteInfo = WebDriverAgentLib_tvOS; + }; + 1CEC81852199B6630071306F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C1954AF21133DDC00A99F21; + remoteInfo = IntegrationApp_tvOS; + }; AD8D96F01D3C12960061268E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; @@ -387,6 +741,28 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + 1C8F1B2C2100B24400F6FEF4 /* Copy Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 1C1954642111CF0E00A99F21 /* RoutingHTTPServer.framework in Copy Frameworks */, + ); + name = "Copy Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 1CDC56662111C26F00868007 /* Copy frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 1C0EE1152111C4CD009EDBB1 /* WebDriverAgentLib_tvOS.framework in Copy frameworks */, + ); + name = "Copy frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; EE93CFF41CCA501300708122 /* Copy frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -413,6 +789,57 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 1C1954632111CF0E00A99F21 /* RoutingHTTPServer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RoutingHTTPServer.framework; path = Carthage/Build/tvOS/RoutingHTTPServer.framework; sourceTree = ""; }; + 1C1954682111DC0800A99F21 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/usr/lib/libxml2.tbd; sourceTree = DEVELOPER_DIR; }; + 1C1954712112EF9100A99F21 /* FBRemoteControlCommands.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBRemoteControlCommands.h; sourceTree = ""; }; + 1C1954722112EF9100A99F21 /* FBRemoteControlCommands.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBRemoteControlCommands.m; sourceTree = ""; }; + 1C19549321133B9000A99F21 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1C1954B021133DDC00A99F21 /* IntegrationApp_tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IntegrationApp_tvOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1C1954B221133DDC00A99F21 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 1C1954B321133DDC00A99F21 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 1C1954B921133DDC00A99F21 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 1C1954BD21133DDD00A99F21 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1C1954BE21133DDD00A99F21 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 1C1954D32113454F00A99F21 /* FBAlertsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBAlertsViewController.h; sourceTree = ""; }; + 1C1954D42113454F00A99F21 /* FBAlertsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBAlertsViewController.m; sourceTree = ""; }; + 1C1954D92113554400A99F21 /* FBTVAlertTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVAlertTests.m; sourceTree = ""; }; + 1C26DB9C216A4BC600C1D250 /* FBTVElementAttributeTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVElementAttributeTests.m; sourceTree = ""; }; + 1C26DB9E216AAAC300C1D250 /* FBTVElementSelectTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVElementSelectTests.m; sourceTree = ""; }; + 1C3C6FA4211827D600FAFD69 /* XCUIApplication+FBFocused.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XCUIApplication+FBFocused.h"; sourceTree = ""; }; + 1C3C6FA5211827D600FAFD69 /* XCUIApplication+FBFocused.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "XCUIApplication+FBFocused.m"; sourceTree = ""; }; + 1C3C6FBD21184F2D00FAFD69 /* IntegrationTests_1_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IntegrationTests_1_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1C44859E216B613800D2B2D8 /* Templates.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Templates.storyboard; sourceTree = ""; }; + 1C4485A3216BBD7300D2B2D8 /* FBAttributesViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBAttributesViewController.h; sourceTree = ""; }; + 1C4485A4216BBD7300D2B2D8 /* FBAttributesViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBAttributesViewController.m; sourceTree = ""; }; + 1C4485A6216BF07B00D2B2D8 /* FBTVElementScreenshotTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVElementScreenshotTests.m; sourceTree = ""; }; + 1C604D262179CC4B004F535F /* FBTVElementVisibilityTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVElementVisibilityTests.m; sourceTree = ""; }; + 1C736590219A1FC5009BC01A /* FBTVIntegrationTestCase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBTVIntegrationTestCase.h; sourceTree = ""; }; + 1C736591219A1FC5009BC01A /* FBTVIntegrationTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVIntegrationTestCase.m; sourceTree = ""; }; + 1C736594219A2114009BC01A /* TVXCElementSnapshotHitPoint.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TVXCElementSnapshotHitPoint.m; sourceTree = ""; }; + 1C736596219AB7C4009BC01A /* TVXCUIApplicationHelperTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TVXCUIApplicationHelperTests.m; sourceTree = ""; }; + 1C736598219ACF68009BC01A /* TVXCUIDeviceHealthCheckTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TVXCUIDeviceHealthCheckTests.m; sourceTree = ""; }; + 1C73659A219ACFC6009BC01A /* TVXCUIDeviceHelperTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TVXCUIDeviceHelperTests.m; sourceTree = ""; }; + 1C73659C219AD052009BC01A /* TVXCUIElementAttributesTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TVXCUIElementAttributesTests.m; sourceTree = ""; }; + 1C73659E219AD224009BC01A /* TVXCUIElementFBFindTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TVXCUIElementFBFindTests.m; sourceTree = ""; }; + 1C7365A0219AD4E2009BC01A /* TVXCUIElementHelperIntegrationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TVXCUIElementHelperIntegrationTests.m; sourceTree = ""; }; + 1C7365A4219C5942009BC01A /* FBTVNavigationTracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBTVNavigationTracker.h; sourceTree = ""; }; + 1C7365A5219C5942009BC01A /* FBTVNavigationTracker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVNavigationTracker.m; sourceTree = ""; }; + 1C7365A8219C5E33009BC01A /* FBTVNavigationTrackerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVNavigationTrackerTests.m; sourceTree = ""; }; + 1C7365CD219C6660009BC01A /* UnitTests_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1C7365D2219C67D3009BC01A /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.1.sdk/usr/lib/libxml2.tbd; sourceTree = DEVELOPER_DIR; }; + 1C7365D4219C67DE009BC01A /* libAccessibility.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libAccessibility.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.1.sdk/usr/lib/libAccessibility.tbd; sourceTree = DEVELOPER_DIR; }; + 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVFocuse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XCUIElement+FBTVFocuse.h"; sourceTree = ""; }; + 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVFocuse.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "XCUIElement+FBTVFocuse.m"; sourceTree = ""; }; + 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebDriverAgentLib_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1C9365372163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XCAccessibilityElement+FBComparison.h"; sourceTree = ""; }; + 1C9365382163BA8A00926F2C /* XCAccessibilityElement+FBComparison.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "XCAccessibilityElement+FBComparison.m"; sourceTree = ""; }; + 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebDriverAgentRunner_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1CEC817D2199A0990071306F /* FBTVFailureProofTestCaseTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVFailureProofTestCaseTests.m; sourceTree = ""; }; + 1CEC817F2199A8170071306F /* FBTVKeyboardTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVKeyboardTests.m; sourceTree = ""; }; + 1CEC81962199B6630071306F /* IntegrationTests_2_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IntegrationTests_2_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1CEC81982199B79F0071306F /* FBTVTypingTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVTypingTest.m; sourceTree = ""; }; + 1CEC819A2199BA400071306F /* FBTVXPathIntegrationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVXPathIntegrationTests.m; sourceTree = ""; }; + 1CEC819D2199CC460071306F /* TVXCElementSnapshotHelperTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TVXCElementSnapshotHelperTests.m; sourceTree = ""; }; 1FC3B2E12121EC8C00B61EE0 /* FBApplicationProcessProxyTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBApplicationProcessProxyTests.m; sourceTree = ""; }; 44757A831D42CE8300ECF35E /* XCUIDeviceRotationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XCUIDeviceRotationTests.m; sourceTree = ""; }; 711084421DA3AA7500F913D6 /* FBXPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBXPath.h; sourceTree = ""; }; @@ -620,8 +1047,8 @@ EE7E271B1D06C69F001BEC7B /* FBXCTestCaseImplementationFailureHoldingProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBXCTestCaseImplementationFailureHoldingProxy.m; sourceTree = ""; }; EE7E27211D06CA91001BEC7B /* libAccessibility.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libAccessibility.tbd; path = usr/lib/libAccessibility.tbd; sourceTree = SDKROOT; }; EE836C021C0F118600D87246 /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - EE8980D321105B49001789EE /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; EE8980D321105B49001789ED /* XCTAutomationSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTAutomationSupport.framework; path = Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/XCTAutomationSupport.framework; sourceTree = DEVELOPER_DIR; }; + EE8980D321105B49001789EE /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; EE8BA9781DCCED9A00A9DEF8 /* FBNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBNavigationController.h; sourceTree = ""; }; EE8BA9791DCCED9A00A9DEF8 /* FBNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBNavigationController.m; sourceTree = ""; }; EE8DDD7820C565FB004D4925 /* XCUIApplicationFBHelpersTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XCUIApplicationFBHelpersTests.m; sourceTree = ""; }; @@ -716,8 +1143,8 @@ EEC088E41CB56AC000B65968 /* FBElementCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBElementCache.m; sourceTree = ""; }; EEC088E61CB56DA400B65968 /* FBExceptionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBExceptionHandler.h; sourceTree = ""; }; EEC088E71CB56DA400B65968 /* FBExceptionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBExceptionHandler.m; sourceTree = ""; }; - EEC088EA1CB5706D00B65968 /* FBSpringboardApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FBSpringboardApplication.h; path = WebDriverAgentLib/FBSpringboardApplication.h; sourceTree = SOURCE_ROOT; }; - EEC088EB1CB5706D00B65968 /* FBSpringboardApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FBSpringboardApplication.m; path = WebDriverAgentLib/FBSpringboardApplication.m; sourceTree = SOURCE_ROOT; }; + EEC088EA1CB5706D00B65968 /* FBHomeboardApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FBHomeboardApplication.h; path = WebDriverAgentLib/FBHomeboardApplication.h; sourceTree = SOURCE_ROOT; }; + EEC088EB1CB5706D00B65968 /* FBHomeboardApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FBHomeboardApplication.m; path = WebDriverAgentLib/FBHomeboardApplication.m; sourceTree = SOURCE_ROOT; }; EEC1950320C6CEA10094500B /* XCUIHitPointResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XCUIHitPointResult.h; sourceTree = ""; }; EEC1950520C6D0790094500B /* FBElementHitPoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBElementHitPoint.h; sourceTree = ""; }; EEC1950620C6D0790094500B /* FBElementHitPoint.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBElementHitPoint.m; sourceTree = ""; }; @@ -748,6 +1175,60 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 1C1954AD21133DDC00A99F21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C3C6FB621184F2D00FAFD69 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CD0FBE3211850BD0092C929 /* WebDriverAgentLib_tvOS.framework in Frameworks */, + 1CD0FBE2211850B80092C929 /* libxml2.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C7365C5219C6660009BC01A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C7365D5219C67DE009BC01A /* libAccessibility.tbd in Frameworks */, + 1C7365D3219C67D3009BC01A /* libxml2.tbd in Frameworks */, + 1C7365D1219C67C6009BC01A /* WebDriverAgentLib_tvOS.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C8F1A752100B24400F6FEF4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C19546A2111DC1400A99F21 /* libxml2.tbd in Frameworks */, + 1C1954662111D7FD00A99F21 /* RoutingHTTPServer.framework in Frameworks */, + 1C936535216378B800926F2C /* XCTest.framework in Frameworks */, + 1C9365362163794600926F2C /* XCTAutomationSupport.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CDC56632111C26F00868007 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C0EE1142111C4B3009EDBB1 /* WebDriverAgentLib_tvOS.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CEC818F2199B6630071306F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CEC81902199B6630071306F /* WebDriverAgentLib_tvOS.framework in Frameworks */, + 1CEC81912199B6630071306F /* libxml2.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EE158A951CBD452B00A3E3F0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -814,6 +1295,67 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1C19549021133B9000A99F21 /* IntegrationTests_tvOS */ = { + isa = PBXGroup; + children = ( + 1C1954D92113554400A99F21 /* FBTVAlertTests.m */, + 1C26DB9C216A4BC600C1D250 /* FBTVElementAttributeTests.m */, + 1C26DB9E216AAAC300C1D250 /* FBTVElementSelectTests.m */, + 1C4485A6216BF07B00D2B2D8 /* FBTVElementScreenshotTests.m */, + 1C19549321133B9000A99F21 /* Info.plist */, + 1C604D262179CC4B004F535F /* FBTVElementVisibilityTests.m */, + 1CEC817D2199A0990071306F /* FBTVFailureProofTestCaseTests.m */, + 1CEC817F2199A8170071306F /* FBTVKeyboardTests.m */, + 1CEC81982199B79F0071306F /* FBTVTypingTest.m */, + 1CEC819A2199BA400071306F /* FBTVXPathIntegrationTests.m */, + 1CEC819D2199CC460071306F /* TVXCElementSnapshotHelperTests.m */, + 1C736590219A1FC5009BC01A /* FBTVIntegrationTestCase.h */, + 1C736591219A1FC5009BC01A /* FBTVIntegrationTestCase.m */, + 1C736594219A2114009BC01A /* TVXCElementSnapshotHitPoint.m */, + 1C736596219AB7C4009BC01A /* TVXCUIApplicationHelperTests.m */, + 1C736598219ACF68009BC01A /* TVXCUIDeviceHealthCheckTests.m */, + 1C73659A219ACFC6009BC01A /* TVXCUIDeviceHelperTests.m */, + 1C73659C219AD052009BC01A /* TVXCUIElementAttributesTests.m */, + 1C73659E219AD224009BC01A /* TVXCUIElementFBFindTests.m */, + 1C7365A0219AD4E2009BC01A /* TVXCUIElementHelperIntegrationTests.m */, + ); + path = IntegrationTests_tvOS; + sourceTree = ""; + }; + 1C1954B121133DDC00A99F21 /* IntegrationApp_tvOS */ = { + isa = PBXGroup; + children = ( + 1C1954D121133E7500A99F21 /* Classes */, + 1C1954D221133E7C00A99F21 /* Resources */, + 1C1954BD21133DDD00A99F21 /* Info.plist */, + 1C1954BE21133DDD00A99F21 /* main.m */, + ); + name = IntegrationApp_tvOS; + path = ../IntegrationApp_tvOS; + sourceTree = ""; + }; + 1C1954D121133E7500A99F21 /* Classes */ = { + isa = PBXGroup; + children = ( + 1C1954B221133DDC00A99F21 /* AppDelegate.h */, + 1C1954B321133DDC00A99F21 /* AppDelegate.m */, + 1C1954D32113454F00A99F21 /* FBAlertsViewController.h */, + 1C1954D42113454F00A99F21 /* FBAlertsViewController.m */, + 1C4485A3216BBD7300D2B2D8 /* FBAttributesViewController.h */, + 1C4485A4216BBD7300D2B2D8 /* FBAttributesViewController.m */, + ); + path = Classes; + sourceTree = ""; + }; + 1C1954D221133E7C00A99F21 /* Resources */ = { + isa = PBXGroup; + children = ( + 1C44859E216B613800D2B2D8 /* Templates.storyboard */, + 1C1954B821133DDC00A99F21 /* Main.storyboard */, + ); + path = Resources; + sourceTree = ""; + }; 498495C81BB2E6FA009CC848 /* Resources */ = { isa = PBXGroup; children = ( @@ -825,6 +1367,7 @@ 91F9DAE01B99DBC2001349B2 = { isa = PBXGroup; children = ( + 1C1954632111CF0E00A99F21 /* RoutingHTTPServer.framework */, EEE5CABE1C80361500CBBDD9 /* Configurations */, 91F9DB731B99DDD8001349B2 /* PrivateHeaders */, 498495C81BB2E6FA009CC848 /* Resources */, @@ -851,6 +1394,12 @@ EE9B75EC1CF7956C00275851 /* IntegrationTests_1.xctest */, EE5095FE1EBCC9090028E2FE /* IntegrationTests_2.xctest */, EE22021C1ECC612200A29571 /* IntegrationTests_3.xctest */, + 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */, + 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */, + 1C1954B021133DDC00A99F21 /* IntegrationApp_tvOS.app */, + 1C3C6FBD21184F2D00FAFD69 /* IntegrationTests_1_tvOS.xctest */, + 1CEC81962199B6630071306F /* IntegrationTests_2_tvOS.xctest */, + 1C7365CD219C6660009BC01A /* UnitTests_tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -894,9 +1443,12 @@ B6E83A410C45944B036B6B0F /* Frameworks */ = { isa = PBXGroup; children = ( + 1C7365D4219C67DE009BC01A /* libAccessibility.tbd */, + 1C7365D2219C67D3009BC01A /* libxml2.tbd */, EE8980D321105B49001789EE /* XCTest.framework */, EE8980D321105B49001789ED /* XCTAutomationSupport.framework */, 7174AF031D9D39AF008C8AD5 /* libxml2.tbd */, + 1C1954682111DC0800A99F21 /* libxml2.tbd */, AD35D0671CF1C2DA00870A75 /* iOS */, ); name = Frameworks; @@ -919,6 +1471,8 @@ EE006EAF1EBA1AA9006900A4 /* XCElementSnapshot+FBHitPoint.m */, AD6C269A1CF2494200F8B5FF /* XCUIApplication+FBHelpers.h */, AD6C269B1CF2494200F8B5FF /* XCUIApplication+FBHelpers.m */, + 1C3C6FA4211827D600FAFD69 /* XCUIApplication+FBFocused.h */, + 1C3C6FA5211827D600FAFD69 /* XCUIApplication+FBFocused.m */, EEC9EED420064FAA00BC0D5B /* XCUICoordinate+FBFix.h */, EEC9EED520064FAA00BC0D5B /* XCUICoordinate+FBFix.m */, EEDFE11F1D9C06F800E6FFE5 /* XCUIDevice+FBHealthCheck.h */, @@ -951,6 +1505,10 @@ EEE376401D59F81400ED88DD /* XCUIElement+FBUtilities.m */, EEE376471D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.h */, EEE376481D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.m */, + 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVFocuse.h */, + 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVFocuse.m */, + 1C9365372163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h */, + 1C9365382163BA8A00926F2C /* XCAccessibilityElement+FBComparison.m */, ); name = Categories; path = WebDriverAgentLib/Categories; @@ -981,6 +1539,8 @@ EE9AB7631CAEDF0C008C271F /* FBTouchIDCommands.m */, EE9AB7641CAEDF0C008C271F /* FBUnknownCommands.h */, EE9AB7651CAEDF0C008C271F /* FBUnknownCommands.m */, + 1C1954712112EF9100A99F21 /* FBRemoteControlCommands.h */, + 1C1954722112EF9100A99F21 /* FBRemoteControlCommands.m */, ); name = Commands; path = WebDriverAgentLib/Commands; @@ -1069,6 +1629,8 @@ EE9AB7991CAEDF0C008C271F /* FBXPathCreator.m */, EE6B64FB1D0F86EF00E85F5D /* XCTestPrivateSymbols.h */, EE6B64FC1D0F86EF00E85F5D /* XCTestPrivateSymbols.m */, + 1C7365A4219C5942009BC01A /* FBTVNavigationTracker.h */, + 1C7365A5219C5942009BC01A /* FBTVNavigationTracker.m */, ); name = Utilities; path = WebDriverAgentLib/Utilities; @@ -1086,8 +1648,10 @@ EE9B75F91CF7964100275851 /* WebDriverAgentTests */ = { isa = PBXGroup; children = ( + 1C1954B121133DDC00A99F21 /* IntegrationApp_tvOS */, EE9B76801CF7997600275851 /* IntegrationApp */, EE9B76541CF7987300275851 /* IntegrationTests */, + 1C19549021133B9000A99F21 /* IntegrationTests_tvOS */, EE9B76561CF7987300275851 /* UnitTests */, ); path = WebDriverAgentTests; @@ -1150,6 +1714,7 @@ EE8DDD7820C565FB004D4925 /* XCUIApplicationFBHelpersTests.m */, EEC9EED820077D8E00BC0D5B /* XCUICoordinateFix.m */, 713914591DF01989005896C2 /* XCUIElementHelpersTests.m */, + 1C7365A8219C5E33009BC01A /* FBTVNavigationTrackerTests.m */, ); path = UnitTests; sourceTree = ""; @@ -1207,8 +1772,8 @@ EE9AB7671CAEDF0C008C271F /* FBApplication.m */, EE3A18641CDE734B00DE4205 /* FBKeyboard.h */, EE3A18651CDE734B00DE4205 /* FBKeyboard.m */, - EEC088EA1CB5706D00B65968 /* FBSpringboardApplication.h */, - EEC088EB1CB5706D00B65968 /* FBSpringboardApplication.m */, + EEC088EA1CB5706D00B65968 /* FBHomeboardApplication.h */, + EEC088EB1CB5706D00B65968 /* FBHomeboardApplication.m */, EE9AB7681CAEDF0C008C271F /* FBApplicationProcessProxy.h */, EE9AB7691CAEDF0C008C271F /* FBApplicationProcessProxy.m */, EE158B5D1CBD479000A3E3F0 /* Info.plist */, @@ -1349,6 +1914,190 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 1C8F1A782100B24400F6FEF4 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C8F1A792100B24400F6FEF4 /* XCUIElement+FBWebDriverAttributes.h in Headers */, + 1C8F1A7A2100B24400F6FEF4 /* XCTestPrivateSymbols.h in Headers */, + 1C8F1A7B2100B24400F6FEF4 /* XCUIElement+FBTyping.h in Headers */, + 1C8F1A7C2100B24400F6FEF4 /* XCUIElement+FBUtilities.h in Headers */, + 1C8F1A7D2100B24400F6FEF4 /* XCUIElement+FBScrolling.h in Headers */, + 1C8F1A7E2100B24400F6FEF4 /* XCSourceCodeTreeNode.h in Headers */, + 1C8F1A7F2100B24400F6FEF4 /* XCPointerEventPath.h in Headers */, + 1C8F1A802100B24400F6FEF4 /* FBRouteRequest.h in Headers */, + 1C8F1A812100B24400F6FEF4 /* XCTest.h in Headers */, + 1C8F1A822100B24400F6FEF4 /* FBElementHitPoint.h in Headers */, + 1C8F1A832100B24400F6FEF4 /* XCAccessibilityElement.h in Headers */, + 1C8F1A842100B24400F6FEF4 /* FBSession.h in Headers */, + 1C8F1A852100B24400F6FEF4 /* _XCTestImplementation.h in Headers */, + 1C8F1A872100B24400F6FEF4 /* XCUIApplication.h in Headers */, + 1C7365A6219C5943009BC01A /* FBTVNavigationTracker.h in Headers */, + 1C8F1A882100B24400F6FEF4 /* FBCustomCommands.h in Headers */, + 1C8F1A892100B24400F6FEF4 /* _XCTestCaseInterruptionException.h in Headers */, + 1C8F1A8B2100B24400F6FEF4 /* XCTRunnerIDESession.h in Headers */, + 1C8F1A8C2100B24400F6FEF4 /* FBRouteRequest-Private.h in Headers */, + 1C8F1A8D2100B24400F6FEF4 /* XCTTestRunSession.h in Headers */, + 1C8F1A8E2100B24400F6FEF4 /* XCTestProbe.h in Headers */, + 1C8F1A8F2100B24400F6FEF4 /* XCApplicationQuery.h in Headers */, + 1C8F1A902100B24400F6FEF4 /* XCTAsyncActivity.h in Headers */, + 1C1954732112EF9100A99F21 /* FBRemoteControlCommands.h in Headers */, + 1C88FDF4214AAD0700202D0D /* XCUIElement+FBTVFocuse.h in Headers */, + 1C8F1A912100B24400F6FEF4 /* XCTestMisuseObserver.h in Headers */, + 1C8F1A922100B24400F6FEF4 /* XCTRunnerDaemonSession.h in Headers */, + 1C8F1A932100B24400F6FEF4 /* FBApplication.h in Headers */, + 1C8F1A942100B24400F6FEF4 /* XCTestExpectationWaiter.h in Headers */, + 1C8F1A952100B24400F6FEF4 /* UIGestureRecognizer-RecordingAdditions.h in Headers */, + 1C8F1A962100B24400F6FEF4 /* XCKeyboardKeyMap.h in Headers */, + 1C8F1A972100B24400F6FEF4 /* XCTNSPredicateExpectationObject-Protocol.h in Headers */, + 1C8F1A982100B24400F6FEF4 /* WebDriverAgentLib.h in Headers */, + 1C8F1A992100B24400F6FEF4 /* FBFindElementCommands.h in Headers */, + 1C8F1A9A2100B24400F6FEF4 /* XCTestRun.h in Headers */, + 1C8F1A9B2100B24400F6FEF4 /* FBWebServer.h in Headers */, + 1C8F1A9C2100B24400F6FEF4 /* FBScreenshotCommands.h in Headers */, + 1C8F1A9D2100B24400F6FEF4 /* _XCKVOExpectationImplementation.h in Headers */, + 1C8F1A9E2100B24400F6FEF4 /* NSString+FBVisualLength.h in Headers */, + 1C8F1A9F2100B24400F6FEF4 /* FBXCTestDaemonsProxy.h in Headers */, + 1C93653A2163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h in Headers */, + 1C8F1AA02100B24400F6FEF4 /* XCUIElementHitPointCoordinate.h in Headers */, + 1C8F1AA12100B24400F6FEF4 /* XCTDarwinNotificationExpectation.h in Headers */, + 1C8F1AA22100B24400F6FEF4 /* XCTRunnerAutomationSession.h in Headers */, + 1C8F1AA42100B24400F6FEF4 /* XCSourceCodeTreeNodeEnumerator.h in Headers */, + 1C8F1AA52100B24400F6FEF4 /* XCUIElement+FBIsVisible.h in Headers */, + 1C8F1AA62100B24400F6FEF4 /* FBXPathCreator.h in Headers */, + 1C8F1AA72100B24400F6FEF4 /* XCUIElement+FBTap.h in Headers */, + 1C8F1AA82100B24400F6FEF4 /* FBResponsePayload.h in Headers */, + 1C8F1AA92100B24400F6FEF4 /* FBUnknownCommands.h in Headers */, + 1C8F1AAA2100B24400F6FEF4 /* NSPredicate+FBFormat.h in Headers */, + 1C8F1AAB2100B24400F6FEF4 /* UILongPressGestureRecognizer-RecordingAdditions.h in Headers */, + 1C8F1AAC2100B24400F6FEF4 /* XCTestCase.h in Headers */, + 1C8F1AAD2100B24400F6FEF4 /* XCSymbolicatorHolder.h in Headers */, + 1C8F1AAE2100B24400F6FEF4 /* XCUIApplicationImpl.h in Headers */, + 1C8F1AAF2100B24400F6FEF4 /* UIPanGestureRecognizer-RecordingAdditions.h in Headers */, + 1C8F1AB02100B24400F6FEF4 /* NSExpression+FBFormat.h in Headers */, + 1C8F1AB12100B24400F6FEF4 /* _XCTestCaseImplementation.h in Headers */, + 1C8F1AB22100B24400F6FEF4 /* UIPinchGestureRecognizer-RecordingAdditions.h in Headers */, + 1C8F1AB32100B24400F6FEF4 /* XCTestManager_TestsInterface-Protocol.h in Headers */, + 1C8F1AB42100B24400F6FEF4 /* XCDeviceEvent.h in Headers */, + 1C8F1AB52100B24400F6FEF4 /* FBMathUtils.h in Headers */, + 1C8F1AB62100B24400F6FEF4 /* UISwipeGestureRecognizer-RecordingAdditions.h in Headers */, + 1C8F1AB72100B24400F6FEF4 /* FBElementUtils.h in Headers */, + 1C8F1AB82100B24400F6FEF4 /* FBDebugCommands.h in Headers */, + 1C8F1AB92100B24400F6FEF4 /* XCTestSuite.h in Headers */, + 1C8F1ABA2100B24400F6FEF4 /* XCUICoordinate.h in Headers */, + 1C8F1ABB2100B24400F6FEF4 /* XCTNSPredicateExpectation.h in Headers */, + 1C8F1ABC2100B24400F6FEF4 /* XCTestObservationCenter.h in Headers */, + 1C8F1ABD2100B24400F6FEF4 /* XCTNSNotificationExpectation.h in Headers */, + 1C8F1ABE2100B24400F6FEF4 /* XCUIRecorderNodeFinder.h in Headers */, + 1C8F1ABF2100B24400F6FEF4 /* XCUIElement+FBAccessibility.h in Headers */, + 1C8F1AC02100B24400F6FEF4 /* XCUIRecorderUtilities.h in Headers */, + 1C8F1AC12100B24400F6FEF4 /* XCTestCaseRun.h in Headers */, + 1C8F1AC22100B24400F6FEF4 /* XCTestConfiguration.h in Headers */, + 1C8F1AC32100B24400F6FEF4 /* _XCTDarwinNotificationExpectationImplementation.h in Headers */, + 1C3C6FA6211827D600FAFD69 /* XCUIApplication+FBFocused.h in Headers */, + 1C8F1AC42100B24400F6FEF4 /* XCTestExpectation.h in Headers */, + 1C8F1AC52100B24400F6FEF4 /* FBElementTypeTransformer.h in Headers */, + 1C8F1AC62100B24400F6FEF4 /* FBElementCache.h in Headers */, + 1C8F1AC72100B24400F6FEF4 /* XCTMetric.h in Headers */, + 1C8F1AC82100B24400F6FEF4 /* XCTestContextScope.h in Headers */, + 1C8F1AC92100B24400F6FEF4 /* XCUIElement+FBClassChain.h in Headers */, + 1C8F1ACA2100B24400F6FEF4 /* FBResponseJSONPayload.h in Headers */, + 1C8F1ACB2100B24400F6FEF4 /* XCTAutomationTarget-Protocol.h in Headers */, + 1C8F1ACC2100B24400F6FEF4 /* FBElement.h in Headers */, + 1C8F1ACD2100B24400F6FEF4 /* XCTAXClient-Protocol.h in Headers */, + 1C8F1ACE2100B24400F6FEF4 /* FBPredicate.h in Headers */, + 1C8F1ACF2100B24400F6FEF4 /* FBExceptionHandler.h in Headers */, + 1C8F1AD02100B24400F6FEF4 /* FBRoute.h in Headers */, + 1C8F1AD12100B24400F6FEF4 /* XCTestDriver.h in Headers */, + 1C8F1AD22100B24400F6FEF4 /* _XCTNSNotificationExpectationImplementation.h in Headers */, + 1C8F1AD32100B24400F6FEF4 /* XCSynthesizedEventRecord.h in Headers */, + 1C8F1AD42100B24400F6FEF4 /* FBInspectorCommands.h in Headers */, + 1C8F1AD52100B24400F6FEF4 /* FBApplicationProcessProxy.h in Headers */, + 1C8F1AD62100B24400F6FEF4 /* XCTWaiterDelegatePrivate-Protocol.h in Headers */, + 1C8F1AD72100B24400F6FEF4 /* XCTestManager_IDEInterface-Protocol.h in Headers */, + 1C8F1AD82100B24400F6FEF4 /* FBXPath.h in Headers */, + 1C8F1AD92100B24400F6FEF4 /* XCUIRecorderTimingMessage.h in Headers */, + 1C8F1ADA2100B24400F6FEF4 /* XCApplicationMonitor.h in Headers */, + 1C8F1ADB2100B24400F6FEF4 /* XCUIElement+FBForceTouch.h in Headers */, + 1C8F1ADC2100B24400F6FEF4 /* FBRuntimeUtils.h in Headers */, + 1C8F1ADD2100B24400F6FEF4 /* XCUIElement+FBPickerWheel.h in Headers */, + 1C8F1ADE2100B24400F6FEF4 /* XCTestObservation-Protocol.h in Headers */, + 1C8F1ADF2100B24400F6FEF4 /* _XCTNSPredicateExpectationImplementation.h in Headers */, + 1C8F1AE02100B24400F6FEF4 /* FBElementCommands.h in Headers */, + 1C8F1AE12100B24400F6FEF4 /* FBResponseFilePayload.h in Headers */, + 1C8F1AE22100B24400F6FEF4 /* FBHomeboardApplication.h in Headers */, + 1C8F1AE32100B24400F6FEF4 /* XCUIElement+FBUID.h in Headers */, + 1C8F1AE42100B24400F6FEF4 /* XCSymbolicationRecord.h in Headers */, + 1C8F1AE52100B24400F6FEF4 /* XCUIDevice.h in Headers */, + 1C8F1AE62100B24400F6FEF4 /* FBCommandHandler.h in Headers */, + 1C8F1AE72100B24400F6FEF4 /* FBSessionCommands.h in Headers */, + 1C8F1AE82100B24400F6FEF4 /* FBSession-Private.h in Headers */, + 1C8F1AE92100B24400F6FEF4 /* NSString+FBXMLSafeString.h in Headers */, + 1C8F1AEA2100B24400F6FEF4 /* FBCommandStatus.h in Headers */, + 1C8F1AEB2100B24400F6FEF4 /* XCElementSnapshot.h in Headers */, + 1C8F1AED2100B24400F6FEF4 /* XCTWaiter.h in Headers */, + 1C8F1AEE2100B24400F6FEF4 /* XCTWaiterManagement-Protocol.h in Headers */, + 1C8F1AEF2100B24400F6FEF4 /* XCElementSnapshot+FBHitPoint.h in Headers */, + 1C8F1AF02100B24400F6FEF4 /* XCTestContext.h in Headers */, + 1C8F1AF12100B24400F6FEF4 /* XCTWaiterDelegate-Protocol.h in Headers */, + 1C8F1AF22100B24400F6FEF4 /* _XCTestExpectationImplementation.h in Headers */, + 1C8F1AF32100B24400F6FEF4 /* XCAXClient_iOS.h in Headers */, + 1C8F1AF42100B24400F6FEF4 /* XCTWaiterManager.h in Headers */, + 1C8F1AF52100B24400F6FEF4 /* XCTestDriverInterface-Protocol.h in Headers */, + 1C8F1AF62100B24400F6FEF4 /* _XCTestSuiteImplementation.h in Headers */, + 1C8F1AF72100B24400F6FEF4 /* FBAlert.h in Headers */, + 1C8F1AF82100B24400F6FEF4 /* XCUIElementQuery.h in Headers */, + 1C8F1AF92100B24400F6FEF4 /* XCPointerEvent.h in Headers */, + 1C8F1AFA2100B24400F6FEF4 /* XCSourceCodeRecording.h in Headers */, + 1C8F1AFB2100B24400F6FEF4 /* FBRunLoopSpinner.h in Headers */, + 1C8F1AFC2100B24400F6FEF4 /* FBErrorBuilder.h in Headers */, + 1C8F1AFD2100B24400F6FEF4 /* XCApplicationMonitor_iOS.h in Headers */, + 1C8F1AFE2100B24400F6FEF4 /* FBKeyboard.h in Headers */, + 1C8F1AFF2100B24400F6FEF4 /* XCUIApplication+FBHelpers.h in Headers */, + 1C8F1B002100B24400F6FEF4 /* _XCTestObservationCenterImplementation.h in Headers */, + 1C8F1B012100B24400F6FEF4 /* XCUIDevice+FBHelpers.h in Headers */, + 1C8F1B022100B24400F6FEF4 /* FBClassChainQueryParser.h in Headers */, + 1C8F1B032100B24400F6FEF4 /* FBMacros.h in Headers */, + 1C8F1B042100B24400F6FEF4 /* XCTestExpectationDelegate-Protocol.h in Headers */, + 1C8F1B052100B24400F6FEF4 /* XCTUIApplicationMonitor-Protocol.h in Headers */, + 1C8F1B062100B24400F6FEF4 /* XCElementSnapshot+FBHelpers.h in Headers */, + 1C8F1B072100B24400F6FEF4 /* XCTKVOExpectation.h in Headers */, + 1C8F1B092100B24400F6FEF4 /* XCEventGenerator.h in Headers */, + 1C8F1B0A2100B24400F6FEF4 /* FBConfiguration.h in Headers */, + 1C8F1B0B2100B24400F6FEF4 /* XCTestSuiteRun.h in Headers */, + 1C8F1B0C2100B24400F6FEF4 /* XCUIElementAsynchronousHandlerWrapper.h in Headers */, + 1C8F1B0D2100B24400F6FEF4 /* XCTestLog.h in Headers */, + 1C8F1B0E2100B24400F6FEF4 /* XCUIHitPointResult.h in Headers */, + 1C8F1B0F2100B24400F6FEF4 /* UITapGestureRecognizer-RecordingAdditions.h in Headers */, + 1C8F1B102100B24400F6FEF4 /* XCDebugLogDelegate-Protocol.h in Headers */, + 1C8F1B112100B24400F6FEF4 /* NSString-XCTAdditions.h in Headers */, + 1C8F1B122100B24400F6FEF4 /* XCTestWaiter.h in Headers */, + 1C8F1B132100B24400F6FEF4 /* NSValue-XCTestAdditions.h in Headers */, + 1C8F1B142100B24400F6FEF4 /* _XCTWaiterImpl.h in Headers */, + 1C8F1B152100B24400F6FEF4 /* FBLogger.h in Headers */, + 1C8F1B162100B24400F6FEF4 /* XCTestObserver.h in Headers */, + 1C8F1B172100B24400F6FEF4 /* XCUIElement.h in Headers */, + 1C8F1B182100B24400F6FEF4 /* XCKeyboardInputSolver.h in Headers */, + 1C8F1B192100B24400F6FEF4 /* FBXCTestCaseImplementationFailureHoldingProxy.h in Headers */, + 1C8F1B1A2100B24400F6FEF4 /* FBDebugLogDelegateDecorator.h in Headers */, + 1C8F1B1B2100B24400F6FEF4 /* XCUIDevice+FBHealthCheck.h in Headers */, + 1C8F1B1C2100B24400F6FEF4 /* XCUIRecorderNodeFinderMatch.h in Headers */, + 1C8F1B1D2100B24400F6FEF4 /* XCUIApplicationProcess.h in Headers */, + 1C8F1B1E2100B24400F6FEF4 /* CDStructures.h in Headers */, + 1C8F1B1F2100B24400F6FEF4 /* XCKeyboardLayout.h in Headers */, + 1C8F1B202100B24400F6FEF4 /* XCTAsyncActivity-Protocol.h in Headers */, + 1C8F1B212100B24400F6FEF4 /* XCActivityRecord.h in Headers */, + 1C8F1B222100B24400F6FEF4 /* XCUIElement+FBFind.h in Headers */, + 1C8F1B232100B24400F6FEF4 /* XCTestManager_ManagerInterface-Protocol.h in Headers */, + 1C8F1B242100B24400F6FEF4 /* FBFailureProofTestCase.h in Headers */, + 1C8F1B252100B24400F6FEF4 /* XCTTestRunSessionDelegate-Protocol.h in Headers */, + 1C8F1B262100B24400F6FEF4 /* XCTestCaseSuite.h in Headers */, + 1C8F1B272100B24400F6FEF4 /* _XCInternalTestRun.h in Headers */, + 1C8F1B282100B24400F6FEF4 /* FBXPath-Private.h in Headers */, + 1C8F1B292100B24400F6FEF4 /* XCKeyMappingPath.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EE158A961CBD452B00A3E3F0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -1401,6 +2150,7 @@ EE158AF11CBD456F00A3E3F0 /* FBXPathCreator.h in Headers */, EE158AB41CBD456F00A3E3F0 /* XCUIElement+FBTap.h in Headers */, EE158ADC1CBD456F00A3E3F0 /* FBResponsePayload.h in Headers */, + 1C9365392163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h in Headers */, EE158ACC1CBD456F00A3E3F0 /* FBUnknownCommands.h in Headers */, 71A224E51DE2F56600844D55 /* NSPredicate+FBFormat.h in Headers */, EE35AD1F1E3B77D600A02D78 /* UILongPressGestureRecognizer-RecordingAdditions.h in Headers */, @@ -1458,7 +2208,7 @@ EE35AD131E3B77D600A02D78 /* _XCTNSPredicateExpectationImplementation.h in Headers */, EE158ABE1CBD456F00A3E3F0 /* FBElementCommands.h in Headers */, EE158AD81CBD456F00A3E3F0 /* FBResponseFilePayload.h in Headers */, - EE158AF71CBD456F00A3E3F0 /* FBSpringboardApplication.h in Headers */, + EE158AF71CBD456F00A3E3F0 /* FBHomeboardApplication.h in Headers */, 71B49EC71ED1A58100D51AD6 /* XCUIElement+FBUID.h in Headers */, EE35AD381E3B77D600A02D78 /* XCSymbolicationRecord.h in Headers */, EE35AD6E1E3B77D600A02D78 /* XCUIDevice.h in Headers */, @@ -1536,6 +2286,117 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 1C1954AF21133DDC00A99F21 /* IntegrationApp_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1C1954CB21133DDE00A99F21 /* Build configuration list for PBXNativeTarget "IntegrationApp_tvOS" */; + buildPhases = ( + 1C1954AC21133DDC00A99F21 /* Sources */, + 1C1954AD21133DDC00A99F21 /* Frameworks */, + 1C1954AE21133DDC00A99F21 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = IntegrationApp_tvOS; + productName = IntegrationApp_tvOS; + productReference = 1C1954B021133DDC00A99F21 /* IntegrationApp_tvOS.app */; + productType = "com.apple.product-type.application"; + }; + 1C3C6FA821184F2D00FAFD69 /* IntegrationTests_1_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1C3C6FBA21184F2D00FAFD69 /* Build configuration list for PBXNativeTarget "IntegrationTests_1_tvOS" */; + buildPhases = ( + 1C3C6FAD21184F2D00FAFD69 /* Sources */, + 1C3C6FB621184F2D00FAFD69 /* Frameworks */, + 1C3C6FB921184F2D00FAFD69 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1CD0FBE1211850A90092C929 /* PBXTargetDependency */, + 1C3C6FC021184F8400FAFD69 /* PBXTargetDependency */, + ); + name = IntegrationTests_1_tvOS; + productName = EvalUITests; + productReference = 1C3C6FBD21184F2D00FAFD69 /* IntegrationTests_1_tvOS.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + 1C7365AA219C6660009BC01A /* UnitTests_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1C7365CA219C6660009BC01A /* Build configuration list for PBXNativeTarget "UnitTests_tvOS" */; + buildPhases = ( + 1C7365AD219C6660009BC01A /* Sources */, + 1C7365C5219C6660009BC01A /* Frameworks */, + 1C7365C9219C6660009BC01A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1C7365D7219C67EB009BC01A /* PBXTargetDependency */, + ); + name = UnitTests_tvOS; + productName = WebDriverAgentCoreTests; + productReference = 1C7365CD219C6660009BC01A /* UnitTests_tvOS.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1C8F1B2E2100B24400F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib_tvOS" */; + buildPhases = ( + 1C8F1A312100B24400F6FEF4 /* Sources */, + 1C8F1A752100B24400F6FEF4 /* Frameworks */, + 1C8F1A782100B24400F6FEF4 /* Headers */, + 1C8F1B2A2100B24400F6FEF4 /* Resources */, + 1C8F1B2C2100B24400F6FEF4 /* Copy Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WebDriverAgentLib_tvOS; + productName = WebDriverAgentLib_; + productReference = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; + productType = "com.apple.product-type.framework"; + }; + 1CDC565E2111C26F00868007 /* WebDriverAgentRunner_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1CDC56692111C26F00868007 /* Build configuration list for PBXNativeTarget "WebDriverAgentRunner_tvOS" */; + buildPhases = ( + 1CDC56612111C26F00868007 /* Sources */, + 1CDC56632111C26F00868007 /* Frameworks */, + 1CDC56652111C26F00868007 /* Resources */, + 1CDC56662111C26F00868007 /* Copy frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 1C0EE1132111C4A9009EDBB1 /* PBXTargetDependency */, + ); + name = WebDriverAgentRunner_tvOS; + productName = XCTUITestRunner; + productReference = 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + 1CEC81812199B6630071306F /* IntegrationTests_2_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1CEC81932199B6630071306F /* Build configuration list for PBXNativeTarget "IntegrationTests_2_tvOS" */; + buildPhases = ( + 1CEC81862199B6630071306F /* Sources */, + 1CEC818F2199B6630071306F /* Frameworks */, + 1CEC81922199B6630071306F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1CEC81822199B6630071306F /* PBXTargetDependency */, + 1CEC81842199B6630071306F /* PBXTargetDependency */, + ); + name = IntegrationTests_2_tvOS; + productName = EvalUITests; + productReference = 1CEC81962199B6630071306F /* IntegrationTests_2_tvOS.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */ = { isa = PBXNativeTarget; buildConfigurationList = EE158AA01CBD452B00A3E3F0 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib" */; @@ -1673,11 +2534,29 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 1000; ORGANIZATIONNAME = Facebook; TargetAttributes = { + 1C1954AF21133DDC00A99F21 = { + CreatedOnToolsVersion = 10.0; + DevelopmentTeam = U9WLLAC7UL; + ProvisioningStyle = Automatic; + }; + 1C3C6FA821184F2D00FAFD69 = { + TestTargetID = 1C1954AF21133DDC00A99F21; + }; + 1C8F1A302100B24400F6FEF4 = { + DevelopmentTeam = U9WLLAC7UL; + }; + 1CDC565E2111C26F00868007 = { + DevelopmentTeam = U9WLLAC7UL; + }; + 1CEC81812199B6630071306F = { + TestTargetID = 1C1954AF21133DDC00A99F21; + }; EE158A981CBD452B00A3E3F0 = { CreatedOnToolsVersion = 7.3; + DevelopmentTeam = U9WLLAC7UL; }; EE836C011C0F118600D87246 = { CreatedOnToolsVersion = 7.1.1; @@ -1691,6 +2570,7 @@ }; EEF988291C486603005CA669 = { CreatedOnToolsVersion = 7.2; + DevelopmentTeam = U9WLLAC7UL; }; }; }; @@ -1709,17 +2589,68 @@ projectRoot = ""; targets = ( EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */, + 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */, EEF988291C486603005CA669 /* WebDriverAgentRunner */, + 1CDC565E2111C26F00868007 /* WebDriverAgentRunner_tvOS */, EE836C011C0F118600D87246 /* UnitTests */, + 1C7365AA219C6660009BC01A /* UnitTests_tvOS */, EE9B75EB1CF7956C00275851 /* IntegrationTests_1 */, EE5095DD1EBCC9090028E2FE /* IntegrationTests_2 */, EE2202031ECC612200A29571 /* IntegrationTests_3 */, + 1C3C6FA821184F2D00FAFD69 /* IntegrationTests_1_tvOS */, + 1CEC81812199B6630071306F /* IntegrationTests_2_tvOS */, EE9B75D31CF7956C00275851 /* IntegrationApp */, + 1C1954AF21133DDC00A99F21 /* IntegrationApp_tvOS */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 1C1954AE21133DDC00A99F21 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C44859F216B613800D2B2D8 /* Templates.storyboard in Resources */, + 1C1954BA21133DDC00A99F21 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C3C6FB921184F2D00FAFD69 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C7365C9219C6660009BC01A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C8F1B2A2100B24400F6FEF4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C8F1B2B2100B24400F6FEF4 /* WebDriverAgent.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CDC56652111C26F00868007 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CEC81922199B6630071306F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; EE158A971CBD452B00A3E3F0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1774,6 +2705,164 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 1C1954AC21133DDC00A99F21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C1954D52113454F00A99F21 /* FBAlertsViewController.m in Sources */, + 1C4485A5216BBD7300D2B2D8 /* FBAttributesViewController.m in Sources */, + 1C1954BF21133DDD00A99F21 /* main.m in Sources */, + 1C604D242179CB05004F535F /* FBTableDataSource.m in Sources */, + 1C1954B421133DDC00A99F21 /* AppDelegate.m in Sources */, + 1C73658F219A1689009BC01A /* FBScrollViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C3C6FAD21184F2D00FAFD69 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C736592219A1FC5009BC01A /* FBTVIntegrationTestCase.m in Sources */, + 1CEC817E2199A0990071306F /* FBTVFailureProofTestCaseTests.m in Sources */, + 1C604D272179CC4B004F535F /* FBTVElementVisibilityTests.m in Sources */, + 1C26DB9D216A4BC600C1D250 /* FBTVElementAttributeTests.m in Sources */, + 1CEC81802199A8170071306F /* FBTVKeyboardTests.m in Sources */, + 1C26DB9F216AAAC300C1D250 /* FBTVElementSelectTests.m in Sources */, + 1C292F682164C399002E8D40 /* FBTVAlertTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C7365AD219C6660009BC01A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C7365AE219C6660009BC01A /* FBRunLoopSpinnerTests.m in Sources */, + 1C7365AF219C6660009BC01A /* FBSDKVersionTests.m in Sources */, + 1C7365B0219C6660009BC01A /* FBElementTypeTransformerTests.m in Sources */, + 1C7365B1219C6660009BC01A /* FBApplicationProcessProxyTests.m in Sources */, + 1C7365B2219C6660009BC01A /* FBConfigurationTests.m in Sources */, + 1C7365B3219C6660009BC01A /* FBElementCacheTests.m in Sources */, + 1C7365B4219C6660009BC01A /* XCUIApplicationFBHelpersTests.m in Sources */, + 1C7365B5219C6660009BC01A /* FBElementUtilitiesTests.m in Sources */, + 1C7365B6219C6660009BC01A /* FBXMLSafeStringTests.m in Sources */, + 1C7365B7219C6660009BC01A /* FBXPathCreatorTests.m in Sources */, + 1C7365B8219C6660009BC01A /* FBRuntimeUtilsTests.m in Sources */, + 1C7365B9219C6660009BC01A /* FBRouteTests.m in Sources */, + 1C7365BA219C6660009BC01A /* NSExpressionFBFormatTests.m in Sources */, + 1C7365BB219C6660009BC01A /* NSPredicateFBFormatTests.m in Sources */, + 1C7365BC219C6660009BC01A /* FBApplicationDouble.m in Sources */, + 1C7365BD219C6660009BC01A /* FBErrorBuilderTests.m in Sources */, + 1C7365CF219C66B8009BC01A /* FBTVNavigationTrackerTests.m in Sources */, + 1C7365BE219C6660009BC01A /* FBXPathTests.m in Sources */, + 1C7365BF219C6660009BC01A /* XCUIElementDouble.m in Sources */, + 1C7365C0219C6660009BC01A /* XCUIElementHelpersTests.m in Sources */, + 1C7365C1219C6660009BC01A /* FBSessionTests.m in Sources */, + 1C7365C3219C6660009BC01A /* FBClassChainTests.m in Sources */, + 1C7365C4219C6660009BC01A /* FBMathUtilsTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C8F1A312100B24400F6FEF4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C8F1A322100B24400F6FEF4 /* FBScreenshotCommands.m in Sources */, + 1C8F1A332100B24400F6FEF4 /* FBPredicate.m in Sources */, + 1C8F1A342100B24400F6FEF4 /* XCUIElement+FBPickerWheel.m in Sources */, + 1C88FDF5214AAD0700202D0D /* XCUIElement+FBTVFocuse.m in Sources */, + 1C7365A7219C5943009BC01A /* FBTVNavigationTracker.m in Sources */, + 1C8F1A352100B24400F6FEF4 /* FBXPath.m in Sources */, + 1C8F1A362100B24400F6FEF4 /* FBWebServer.m in Sources */, + 1C8F1A372100B24400F6FEF4 /* FBErrorBuilder.m in Sources */, + 1C8F1A382100B24400F6FEF4 /* XCUIElement+FBClassChain.m in Sources */, + 1C8F1A392100B24400F6FEF4 /* NSExpression+FBFormat.m in Sources */, + 1C8F1A3A2100B24400F6FEF4 /* FBXPathCreator.m in Sources */, + 1C8F1A3B2100B24400F6FEF4 /* XCUIApplication+FBHelpers.m in Sources */, + 1C8F1A3C2100B24400F6FEF4 /* FBKeyboard.m in Sources */, + 1C8F1A3D2100B24400F6FEF4 /* FBElementUtils.m in Sources */, + 1C8F1A3E2100B24400F6FEF4 /* FBElementHitPoint.m in Sources */, + 1C8F1A3F2100B24400F6FEF4 /* FBApplicationProcessProxy.m in Sources */, + 1C8F1A402100B24400F6FEF4 /* FBFailureProofTestCase.m in Sources */, + 1C8F1A412100B24400F6FEF4 /* XCUIElement+FBIsVisible.m in Sources */, + 1C8F1A422100B24400F6FEF4 /* XCUIElement+FBFind.m in Sources */, + 1C8F1A432100B24400F6FEF4 /* FBResponsePayload.m in Sources */, + 1C8F1A442100B24400F6FEF4 /* FBRoute.m in Sources */, + 1C8F1A452100B24400F6FEF4 /* NSString+FBVisualLength.m in Sources */, + 1C8F1A462100B24400F6FEF4 /* FBRunLoopSpinner.m in Sources */, + 1C8F1A472100B24400F6FEF4 /* FBClassChainQueryParser.m in Sources */, + 1C8F1A482100B24400F6FEF4 /* NSPredicate+FBFormat.m in Sources */, + 1C8F1A4A2100B24400F6FEF4 /* XCUIElement+FBUID.m in Sources */, + 1C8F1A4B2100B24400F6FEF4 /* FBRouteRequest.m in Sources */, + 1C8F1A4C2100B24400F6FEF4 /* FBResponseJSONPayload.m in Sources */, + 1C8F1A4D2100B24400F6FEF4 /* FBXCTestCaseImplementationFailureHoldingProxy.m in Sources */, + 1C8F1A4E2100B24400F6FEF4 /* XCUIDevice+FBHealthCheck.m in Sources */, + 1C8F1A4F2100B24400F6FEF4 /* FBHomeboardApplication.m in Sources */, + 1C8F1A502100B24400F6FEF4 /* FBResponseFilePayload.m in Sources */, + 1C8F1A512100B24400F6FEF4 /* XCUIElement+FBWebDriverAttributes.m in Sources */, + 1C8F1A522100B24400F6FEF4 /* XCUIElement+FBForceTouch.m in Sources */, + 1C8F1A542100B24400F6FEF4 /* FBDebugCommands.m in Sources */, + 1C93653C2163BA8A00926F2C /* XCAccessibilityElement+FBComparison.m in Sources */, + 1C8F1A552100B24400F6FEF4 /* NSString+FBXMLSafeString.m in Sources */, + 1C8F1A562100B24400F6FEF4 /* FBUnknownCommands.m in Sources */, + 1C8F1A592100B24400F6FEF4 /* FBRuntimeUtils.m in Sources */, + 1C8F1A5A2100B24400F6FEF4 /* XCUIElement+FBUtilities.m in Sources */, + 1C8F1A5B2100B24400F6FEF4 /* FBLogger.m in Sources */, + 1C8F1A5C2100B24400F6FEF4 /* FBCustomCommands.m in Sources */, + 1C8F1A5D2100B24400F6FEF4 /* XCUIDevice+FBHelpers.m in Sources */, + 1C8F1A5E2100B24400F6FEF4 /* XCTestPrivateSymbols.m in Sources */, + 1C8F1A5F2100B24400F6FEF4 /* XCUIElement+FBTyping.m in Sources */, + 1C8F1A602100B24400F6FEF4 /* XCUIElement+FBAccessibility.m in Sources */, + 1C8F1A612100B24400F6FEF4 /* FBSession.m in Sources */, + 1C8F1A622100B24400F6FEF4 /* FBFindElementCommands.m in Sources */, + 1C8F1A632100B24400F6FEF4 /* FBDebugLogDelegateDecorator.m in Sources */, + 1C8F1A652100B24400F6FEF4 /* XCUIElement+FBScrolling.m in Sources */, + 1C8F1A662100B24400F6FEF4 /* FBSessionCommands.m in Sources */, + 1C8F1A672100B24400F6FEF4 /* FBInspectorCommands.m in Sources */, + 1C8F1A682100B24400F6FEF4 /* XCElementSnapshot+FBHitPoint.m in Sources */, + 1C1954742112EF9100A99F21 /* FBRemoteControlCommands.m in Sources */, + 1C8F1A692100B24400F6FEF4 /* FBConfiguration.m in Sources */, + 1C8F1A6A2100B24400F6FEF4 /* FBElementCache.m in Sources */, + 1C8F1A6B2100B24400F6FEF4 /* FBAlert.m in Sources */, + 1C8F1A6C2100B24400F6FEF4 /* FBElementCommands.m in Sources */, + 1C8F1A6D2100B24400F6FEF4 /* FBExceptionHandler.m in Sources */, + 1C8F1A6E2100B24400F6FEF4 /* FBXCodeCompatibility.m in Sources */, + 1C3C6FA7211827D600FAFD69 /* XCUIApplication+FBFocused.m in Sources */, + 1C8F1A6F2100B24400F6FEF4 /* XCElementSnapshot+FBHelpers.m in Sources */, + 1C8F1A702100B24400F6FEF4 /* FBElementTypeTransformer.m in Sources */, + 1C8F1A712100B24400F6FEF4 /* FBApplication.m in Sources */, + 1C8F1A722100B24400F6FEF4 /* FBXCTestDaemonsProxy.m in Sources */, + 1C8F1A732100B24400F6FEF4 /* XCUIElement+FBTap.m in Sources */, + 1C8F1A742100B24400F6FEF4 /* FBMathUtils.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CDC56612111C26F00868007 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CDC56622111C26F00868007 /* UITestingUITests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1CEC81862199B6630071306F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C7365A1219AD4E2009BC01A /* TVXCUIElementHelperIntegrationTests.m in Sources */, + 1C73659B219ACFC6009BC01A /* TVXCUIDeviceHelperTests.m in Sources */, + 1C736593219A1FC5009BC01A /* FBTVIntegrationTestCase.m in Sources */, + 1CEC819C2199C2030071306F /* FBTVElementScreenshotTests.m in Sources */, + 1CEC81992199B79F0071306F /* FBTVTypingTest.m in Sources */, + 1C736599219ACF68009BC01A /* TVXCUIDeviceHealthCheckTests.m in Sources */, + 1CEC819B2199BA400071306F /* FBTVXPathIntegrationTests.m in Sources */, + 1C73659F219AD224009BC01A /* TVXCUIElementFBFindTests.m in Sources */, + 1C73659D219AD052009BC01A /* TVXCUIElementAttributesTests.m in Sources */, + 1C736595219A2114009BC01A /* TVXCElementSnapshotHitPoint.m in Sources */, + 1C736597219AB7C5009BC01A /* TVXCUIApplicationHelperTests.m in Sources */, + 1CEC819E2199CC460071306F /* TVXCElementSnapshotHelperTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EE158A941CBD452B00A3E3F0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1792,7 +2881,6 @@ 713C6DD01DDC772A00285B92 /* FBElementUtils.m in Sources */, EEC1950820C6D0790094500B /* FBElementHitPoint.m in Sources */, EE158AFA1CBD456F00A3E3F0 /* FBApplicationProcessProxy.m in Sources */, - EE6A893B1D0B38640083E92B /* FBFailureProofTestCase.m in Sources */, EE158AB11CBD456F00A3E3F0 /* XCUIElement+FBIsVisible.m in Sources */, EEBBD48C1D47746D00656A81 /* XCUIElement+FBFind.m in Sources */, EE158ADD1CBD456F00A3E3F0 /* FBResponsePayload.m in Sources */, @@ -1807,7 +2895,7 @@ EE158ADB1CBD456F00A3E3F0 /* FBResponseJSONPayload.m in Sources */, EE7E271F1D06C69F001BEC7B /* FBXCTestCaseImplementationFailureHoldingProxy.m in Sources */, EEDFE1221D9C06F800E6FFE5 /* XCUIDevice+FBHealthCheck.m in Sources */, - EE158AF81CBD456F00A3E3F0 /* FBSpringboardApplication.m in Sources */, + EE158AF81CBD456F00A3E3F0 /* FBHomeboardApplication.m in Sources */, EE158AD91CBD456F00A3E3F0 /* FBResponseFilePayload.m in Sources */, EEE3764A1D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.m in Sources */, EE8DDD7E20C5733C004D4925 /* XCUIElement+FBForceTouch.m in Sources */, @@ -1817,6 +2905,7 @@ EE158ACD1CBD456F00A3E3F0 /* FBUnknownCommands.m in Sources */, EE158AC51CBD456F00A3E3F0 /* FBOrientationCommands.m in Sources */, EEC9EED720064FAA00BC0D5B /* XCUICoordinate+FBFix.m in Sources */, + 1C93653B2163BA8A00926F2C /* XCAccessibilityElement+FBComparison.m in Sources */, EE158AEB1CBD456F00A3E3F0 /* FBRuntimeUtils.m in Sources */, EEE376461D59F81400ED88DD /* XCUIElement+FBUtilities.m in Sources */, EE9B76A91CF7A43900275851 /* FBLogger.m in Sources */, @@ -1835,6 +2924,7 @@ EE006EB11EBA1AA9006900A4 /* XCElementSnapshot+FBHitPoint.m in Sources */, EE9B76A71CF7A43900275851 /* FBConfiguration.m in Sources */, EE158AD31CBD456F00A3E3F0 /* FBElementCache.m in Sources */, + 1C93653D2163DBB800926F2C /* FBFailureProofTestCase.m in Sources */, AD6C26951CF2379700F8B5FF /* FBAlert.m in Sources */, EE158ABF1CBD456F00A3E3F0 /* FBElementCommands.m in Sources */, EE158AD51CBD456F00A3E3F0 /* FBExceptionHandler.m in Sources */, @@ -1898,11 +2988,11 @@ 71A224E81DE326C500844D55 /* NSPredicateFBFormatTests.m in Sources */, EE6A892B1D0B25820083E92B /* FBApplicationDouble.m in Sources */, EE6A892D1D0B2AF40083E92B /* FBErrorBuilderTests.m in Sources */, + 1C7365D0219C6746009BC01A /* XCUICoordinateFix.m in Sources */, 712A0C851DA3E459007D02E5 /* FBXPathTests.m in Sources */, ADBC39981D07842800327304 /* XCUIElementDouble.m in Sources */, 7139145A1DF01989005896C2 /* XCUIElementHelpersTests.m in Sources */, EE6A89261D0B19E60083E92B /* FBSessionTests.m in Sources */, - EEC9EED920077D8E00BC0D5B /* XCUICoordinateFix.m in Sources */, 71A7EAFC1E229302001DA4F2 /* FBClassChainTests.m in Sources */, EE18883D1DA663EB00307AA8 /* FBMathUtilsTests.m in Sources */, ); @@ -1948,6 +3038,36 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 1C0EE1132111C4A9009EDBB1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; + targetProxy = 1C0EE1122111C4A9009EDBB1 /* PBXContainerItemProxy */; + }; + 1C3C6FC021184F8400FAFD69 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C1954AF21133DDC00A99F21 /* IntegrationApp_tvOS */; + targetProxy = 1C3C6FBF21184F8400FAFD69 /* PBXContainerItemProxy */; + }; + 1C7365D7219C67EB009BC01A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; + targetProxy = 1C7365D6219C67EB009BC01A /* PBXContainerItemProxy */; + }; + 1CD0FBE1211850A90092C929 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; + targetProxy = 1CD0FBE0211850A90092C929 /* PBXContainerItemProxy */; + }; + 1CEC81822199B6630071306F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; + targetProxy = 1CEC81832199B6630071306F /* PBXContainerItemProxy */; + }; + 1CEC81842199B6630071306F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C1954AF21133DDC00A99F21 /* IntegrationApp_tvOS */; + targetProxy = 1CEC81852199B6630071306F /* PBXContainerItemProxy */; + }; AD8D96F11D3C12960061268E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */; @@ -1991,6 +3111,14 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + 1C1954B821133DDC00A99F21 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 1C1954B921133DDC00A99F21 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; EE9B768C1CF7997600275851 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -2002,6 +3130,282 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 1C1954CC21133DDE00A99F21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = U9WLLAC7UL; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = IntegrationApp_tvOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.wda.integrationApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Debug; + }; + 1C1954CD21133DDE00A99F21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = U9WLLAC7UL; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = IntegrationApp_tvOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.wda.integrationApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Release; + }; + 1C3C6FBB21184F2D00FAFD69 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = WebDriverAgentTests/IntegrationTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.IntegrationTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TEST_TARGET_NAME = IntegrationApp_tvOS; + }; + name = Debug; + }; + 1C3C6FBC21184F2D00FAFD69 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = WebDriverAgentTests/IntegrationTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.IntegrationTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TEST_TARGET_NAME = IntegrationApp_tvOS; + }; + name = Release; + }; + 1C7365CB219C6660009BC01A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUG_INFORMATION_FORMAT = dwarf; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = WebDriverAgentTests/UnitTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentCoreTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; + TARGETED_DEVICE_FAMILY = 3; + }; + name = Debug; + }; + 1C7365CC219C6660009BC01A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = WebDriverAgentTests/UnitTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentCoreTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; + TARGETED_DEVICE_FAMILY = 3; + }; + name = Release; + }; + 1C8F1B2F2100B24400F6FEF4 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EEE5CABF1C80361500CBBDD9 /* ProjectSettings.xcconfig */; + buildSettings = { + CLANG_STATIC_ANALYZER_MODE = deep; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = NO; + DEVELOPMENT_TEAM = U9WLLAC7UL; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + "$(PLATFORM_DIR)/Developer/Library/PrivateFrameworks", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + "$(PROJECT_DIR)/Carthage/Build/iOS", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = WebDriverAgentLib/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentLib; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1C8F1B302100B24400F6FEF4 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EEE5CABF1C80361500CBBDD9 /* ProjectSettings.xcconfig */; + buildSettings = { + CLANG_STATIC_ANALYZER_MODE = deep; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = NO; + DEVELOPMENT_TEAM = U9WLLAC7UL; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + "$(PROJECT_DIR)/Carthage/Build/iOS", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = WebDriverAgentLib/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentLib; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 1CDC566A2111C26F00868007 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EEE5CABF1C80361500CBBDD9 /* ProjectSettings.xcconfig */; + buildSettings = { + CLANG_STATIC_ANALYZER_MODE = deep; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Developer"; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = U9WLLAC7UL; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = WebDriverAgentRunner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-all_load", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentRunner; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + USES_XCTRUNNER = YES; + }; + name = Debug; + }; + 1CDC566B2111C26F00868007 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EEE5CABF1C80361500CBBDD9 /* ProjectSettings.xcconfig */; + buildSettings = { + CLANG_STATIC_ANALYZER_MODE = deep; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = U9WLLAC7UL; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + INFOPLIST_FILE = WebDriverAgentRunner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-all_load", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentRunner; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + USES_XCTRUNNER = YES; + }; + name = Release; + }; + 1CEC81942199B6630071306F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = WebDriverAgentTests/IntegrationTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.IntegrationTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TEST_TARGET_NAME = IntegrationApp_tvOS; + }; + name = Debug; + }; + 1CEC81952199B6630071306F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = WebDriverAgentTests/IntegrationTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.IntegrationTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TEST_TARGET_NAME = IntegrationApp_tvOS; + }; + name = Release; + }; 91F9DB0A1B99DBC2001349B2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2016,12 +3420,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -2076,12 +3482,14 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -2121,10 +3529,12 @@ baseConfigurationReference = EEE5CABF1C80361500CBBDD9 /* ProjectSettings.xcconfig */; buildSettings = { CLANG_STATIC_ANALYZER_MODE = deep; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = NO; + DEVELOPMENT_TEAM = U9WLLAC7UL; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -2141,6 +3551,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentLib; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -2151,9 +3562,11 @@ baseConfigurationReference = EEE5CABF1C80361500CBBDD9 /* ProjectSettings.xcconfig */; buildSettings = { CLANG_STATIC_ANALYZER_MODE = deep; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = NO; + DEVELOPMENT_TEAM = U9WLLAC7UL; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -2169,6 +3582,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentLib; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; SKIP_INSTALL = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -2319,7 +3733,9 @@ baseConfigurationReference = EEE5CABF1C80361500CBBDD9 /* ProjectSettings.xcconfig */; buildSettings = { CLANG_STATIC_ANALYZER_MODE = deep; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Developer"; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = U9WLLAC7UL; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", @@ -2333,6 +3749,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentRunner; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; USES_XCTRUNNER = YES; }; name = Debug; @@ -2342,6 +3759,8 @@ baseConfigurationReference = EEE5CABF1C80361500CBBDD9 /* ProjectSettings.xcconfig */; buildSettings = { CLANG_STATIC_ANALYZER_MODE = deep; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = U9WLLAC7UL; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", @@ -2362,6 +3781,60 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 1C1954CB21133DDE00A99F21 /* Build configuration list for PBXNativeTarget "IntegrationApp_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1C1954CC21133DDE00A99F21 /* Debug */, + 1C1954CD21133DDE00A99F21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1C3C6FBA21184F2D00FAFD69 /* Build configuration list for PBXNativeTarget "IntegrationTests_1_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1C3C6FBB21184F2D00FAFD69 /* Debug */, + 1C3C6FBC21184F2D00FAFD69 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1C7365CA219C6660009BC01A /* Build configuration list for PBXNativeTarget "UnitTests_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1C7365CB219C6660009BC01A /* Debug */, + 1C7365CC219C6660009BC01A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1C8F1B2E2100B24400F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1C8F1B2F2100B24400F6FEF4 /* Debug */, + 1C8F1B302100B24400F6FEF4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1CDC56692111C26F00868007 /* Build configuration list for PBXNativeTarget "WebDriverAgentRunner_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1CDC566A2111C26F00868007 /* Debug */, + 1CDC566B2111C26F00868007 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1CEC81932199B6630071306F /* Build configuration list for PBXNativeTarget "IntegrationTests_2_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1CEC81942199B6630071306F /* Debug */, + 1CEC81952199B6630071306F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 91F9DAE41B99DBC2001349B2 /* Build configuration list for PBXProject "WebDriverAgent" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/WebDriverAgent.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/WebDriverAgent.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/WebDriverAgent.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp.xcscheme new file mode 100644 index 000000000..a5c56cc54 --- /dev/null +++ b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp_tvOS.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp_tvOS.xcscheme new file mode 100644 index 000000000..feb8e04c5 --- /dev/null +++ b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp_tvOS.xcscheme @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib.xcscheme index a46c97e3d..8dccf4e37 100644 --- a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib.xcscheme +++ b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib.xcscheme @@ -1,6 +1,6 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner.xcscheme index 2c368d69b..48d181e9f 100644 --- a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner.xcscheme +++ b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner.xcscheme @@ -1,6 +1,6 @@ @@ -48,7 +47,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner-nodebug.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_tvOS.xcscheme similarity index 66% rename from WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner-nodebug.xcscheme rename to WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_tvOS.xcscheme index c1714a533..7a1821809 100644 --- a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner-nodebug.xcscheme +++ b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_tvOS.xcscheme @@ -1,6 +1,6 @@ @@ -24,19 +24,17 @@ @@ -48,7 +46,6 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" @@ -58,9 +55,9 @@ @@ -73,15 +70,6 @@ savedToolIdentifier = "" useCustomWorkingDirectory = "NO" debugDocumentVersioning = "YES"> - - - - diff --git a/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.h b/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.h new file mode 100644 index 000000000..2d504d14f --- /dev/null +++ b/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.h @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import "XCAccessibilityElement.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface XCAccessibilityElement (FBComparison) + +/** + Compares two XCAccessibilityElement instances + + @param other the other element instance + @return YES if both elements are equal + */ +- (BOOL)isEqualToElement:(nullable XCAccessibilityElement *)other; + +@end + +NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.m b/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.m new file mode 100644 index 000000000..49f030b6d --- /dev/null +++ b/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.m @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "XCAccessibilityElement+FBComparison.h" +#import "FBElementUtils.h" + +@implementation XCAccessibilityElement (FBComparison) + +- (BOOL)isEqualToElement:(XCAccessibilityElement *)other +{ + return nil == other ? NO : [[FBElementUtils uidWithAccessibilityElement:self] isEqualToString:[FBElementUtils uidWithAccessibilityElement:other]]; +} + +@end diff --git a/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.h b/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.h index 7ebbadd6d..8753a8f9f 100644 --- a/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.h +++ b/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.h @@ -57,6 +57,13 @@ NS_ASSUME_NONNULL_BEGIN */ - (nullable XCElementSnapshot *)fb_parentMatchingOneOfTypes:(NSArray *)types filter:(BOOL(^)(XCElementSnapshot *snapshot))filter; +/** + Retrieves the list of all element ancestors in the snapshot hierarchy. + + @return the list of element ancestors or an empty list if the snapshot has no parent. + */ +- (NSArray *)fb_ancestors; + /** Returns value for given accessibility property identifier. diff --git a/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.m b/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.m index 3374a2156..ea93b41a5 100644 --- a/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.m +++ b/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.m @@ -57,6 +57,17 @@ - (XCElementSnapshot *)fb_parentMatchingOneOfTypes:(NSArray *)types return snapshot; } +- (NSArray *)fb_ancestors +{ + NSMutableArray *ancestors = [NSMutableArray array]; + XCElementSnapshot *parent = self.parent; + while (parent) { + [ancestors addObject:parent]; + parent = parent.parent; + } + return ancestors.copy; +} + - (id)fb_attributeValue:(NSNumber *)attribute { NSDictionary *attributesResult = [[XCAXClient_iOS sharedClient] attributesForElementSnapshot:self attributeList:@[attribute]]; diff --git a/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h b/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h new file mode 100644 index 000000000..733659aad --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import "FBElement.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface XCUIApplication (FBFocused) + +/** + Return current focused element + */ +- (id) fb_focusedElement; + +@end + +NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.m b/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.m new file mode 100644 index 000000000..a8fd1f6b7 --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.m @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "XCUIApplication+FBFocused.h" +#import "XCUIElement+FBWebDriverAttributes.h" + +@implementation XCUIApplication (FBFocused) + +- (id) fb_focusedElement +{ + XCUIElementQuery *query = [self descendantsMatchingType:XCUIElementTypeAny]; + return [query elementMatchingPredicate: [NSPredicate predicateWithFormat:@"hasFocus == true"]]; +} + +@end diff --git a/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m b/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m index 3e34136f0..741f6388c 100644 --- a/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +++ b/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m @@ -9,7 +9,7 @@ #import "XCUIApplication+FBHelpers.h" -#import "FBSpringboardApplication.h" +#import "FBHomeboardApplication.h" #import "XCElementSnapshot.h" #import "FBElementTypeTransformer.h" #import "FBMacros.h" @@ -35,7 +35,8 @@ - (BOOL)fb_deactivateWithDuration:(NSTimeInterval)duration error:(NSError **)err [self fb_activate]; return YES; } - return [[FBSpringboardApplication fb_springboard] fb_tapApplicationWithIdentifier:applicationIdentifier error:error]; + return [[FBHomeboardApplication fb_homeboard] fb_openApplicationWithIdentifier:applicationIdentifier + error:error]; } - (NSDictionary *)fb_tree @@ -63,6 +64,9 @@ + (NSDictionary *)dictionaryForElement:(XCElementSnapshot *)snapshot info[@"frame"] = NSStringFromCGRect(snapshot.wdFrame); info[@"isEnabled"] = [@([snapshot isWDEnabled]) stringValue]; info[@"isVisible"] = [@([snapshot isWDVisible]) stringValue]; +#if TARGET_OS_TV + info[@"isFocused"] = [@([snapshot isWDFocused]) stringValue]; +#endif NSArray *childElements = snapshot.children; if ([childElements count]) { diff --git a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h index 55742a95c..695713462 100644 --- a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h +++ b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h @@ -9,8 +9,13 @@ #import +#if !TARGET_OS_TV + @interface XCUICoordinate (FBFix) - (CGPoint)fb_screenPoint; @end + +#endif + diff --git a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.m b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.m index 6b6aa62c3..1e42fd081 100644 --- a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.m +++ b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.m @@ -13,6 +13,8 @@ #import "XCUIElement+FBUtilities.h" #import "XCElementSnapshot+FBHitPoint.h" +#if !TARGET_OS_TV + @implementation XCUICoordinate (FBFix) - (CGPoint)fb_screenPoint @@ -37,3 +39,5 @@ - (CGPoint)fb_screenPoint } @end + +#endif diff --git a/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m b/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m index fab9c9176..a9c278478 100644 --- a/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m +++ b/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m @@ -14,7 +14,7 @@ #include #import -#import "FBSpringboardApplication.h" +#import "FBHomeboardApplication.h" #import "FBErrorBuilder.h" #import "FBMathUtils.h" #import "FBXCodeCompatibility.h" @@ -36,7 +36,7 @@ - (BOOL)fb_goToHomescreenWithError:(NSError **)error // On 9.3 pressButton:XCUIDeviceButtonHome can be slightly delayed. // Causing waitUntilApplicationBoardIsVisible not to work properly in some edge cases e.g. like starting session right after this call, while being on home screen [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:FBHomeButtonCoolOffTime]]; - if (![[FBSpringboardApplication fb_springboard] fb_waitUntilApplicationBoardIsVisible:error]) { + if (![[FBHomeboardApplication fb_homeboard] fb_waitUntilApplicationBoardIsVisible:error]) { return NO; } return YES; @@ -55,21 +55,25 @@ - (NSData *)fb_screenshotWithError:(NSError*__autoreleasing*)error } return result; } - + XCUIApplication *app = FBApplication.fb_activeApplication; +#if TARGET_OS_IOS CGSize screenSize = FBAdjustDimensionsForApplication(app.frame.size, app.interfaceOrientation); +#else + CGSize screenSize = app.frame.size; +#endif // https://developer.apple.com/documentation/xctest/xctimagequality?language=objc // Select lower quality, since XCTest crashes randomly if the maximum quality (zero value) is selected // and the resulting screenshot does not fit the memory buffer preallocated for it by the operating system NSUInteger quality = 1; CGRect screenRect = CGRectMake(0, 0, screenSize.width, screenSize.height); - + XCUIScreen *mainScreen = (XCUIScreen *)[xcScreenClass mainScreen]; NSData *result = [mainScreen screenshotDataForQuality:quality rect:screenRect error:error]; if (nil == result) { return nil; } - + // The resulting data is a JPEG image, so we need to convert it to PNG representation UIImage *image = [UIImage imageWithData:result]; return (NSData *)UIImagePNGRepresentation(image); @@ -95,7 +99,7 @@ - (NSString *)fb_wifiIPAddress freeifaddrs(interfaces); return nil; } - + NSString *address = nil; temp_addr = interfaces; while(temp_addr != NULL) { diff --git a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h index f94877971..9804096b9 100644 --- a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h +++ b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h @@ -12,11 +12,13 @@ NS_ASSUME_NONNULL_BEGIN +#if TARGET_OS_IOS + @interface XCUIDevice (FBRotation) /** Sets requested device interface orientation. - + @param orientation The interface orientation. @return YES if the operation succeeds, otherwise NO. */ @@ -35,4 +37,6 @@ NS_ASSUME_NONNULL_BEGIN @end +#endif + NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m index c25e0f1f7..5b0146eb8 100644 --- a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m +++ b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m @@ -9,6 +9,8 @@ #import "XCUIDevice+FBRotation.h" +#if TARGET_OS_IOS + static const NSTimeInterval kFBWebDriverOrientationChangeDelay = 5.0; static const CGFloat FBRotationCoolOffTime = 1.f; @@ -49,21 +51,23 @@ - (BOOL)waitUntilInterfaceIsAtOrientation:(NSInteger)orientation application:(FB - (NSDictionary *)fb_rotationMapping { - static NSDictionary *rotationMap; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - rotationMap = - @{ - @(UIDeviceOrientationUnknown) : @{@"x" : @(-1), @"y" : @(-1), @"z" : @(-1)}, - @(UIDeviceOrientationPortrait) : @{@"x" : @(0), @"y" : @(0), @"z" : @(0)}, - @(UIDeviceOrientationPortraitUpsideDown) : @{@"x" : @(0), @"y" : @(0), @"z" : @(180)}, - @(UIDeviceOrientationLandscapeLeft) : @{@"x" : @(0), @"y" : @(0), @"z" : @(270)}, - @(UIDeviceOrientationLandscapeRight) : @{@"x" : @(0), @"y" : @(0), @"z" : @(90)}, - @(UIDeviceOrientationFaceUp) : @{@"x" : @(90), @"y" : @(0), @"z" : @(0)}, - @(UIDeviceOrientationFaceDown) : @{@"x" : @(270), @"y" : @(0), @"z" : @(0)}, - }; - }); - return rotationMap; + static NSDictionary *rotationMap; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + rotationMap = + @{ + @(UIDeviceOrientationUnknown) : @{@"x" : @(-1), @"y" : @(-1), @"z" : @(-1)}, + @(UIDeviceOrientationPortrait) : @{@"x" : @(0), @"y" : @(0), @"z" : @(0)}, + @(UIDeviceOrientationPortraitUpsideDown) : @{@"x" : @(0), @"y" : @(0), @"z" : @(180)}, + @(UIDeviceOrientationLandscapeLeft) : @{@"x" : @(0), @"y" : @(0), @"z" : @(270)}, + @(UIDeviceOrientationLandscapeRight) : @{@"x" : @(0), @"y" : @(0), @"z" : @(90)}, + @(UIDeviceOrientationFaceUp) : @{@"x" : @(90), @"y" : @(0), @"z" : @(0)}, + @(UIDeviceOrientationFaceDown) : @{@"x" : @(270), @"y" : @(0), @"z" : @(0)}, + }; + }); + return rotationMap; } @end + +#endif diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.h b/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.h index 76a3ed2db..23ec68a60 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.h +++ b/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.h @@ -11,6 +11,7 @@ NS_ASSUME_NONNULL_BEGIN +#if !TARGET_OS_TV @interface XCUIElement (FBForceTouch) /** @@ -35,5 +36,5 @@ NS_ASSUME_NONNULL_BEGIN - (BOOL)fb_forceTouchCoordinate:(CGPoint)relativeCoordinate pressure:(double)pressure duration:(double)duration error:(NSError **)error; @end - +#endif NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.m b/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.m index cb58efa4b..10216fa55 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.m @@ -21,6 +21,7 @@ #import "XCPointerEventPath.h" #import "XCTRunnerDaemonSession.h" +#if !TARGET_OS_TV @implementation XCUIElement (FBForceTouch) - (BOOL)fb_forceTouchWithPressure:(double)pressure duration:(double)duration error:(NSError **)error @@ -87,3 +88,5 @@ - (XCSynthesizedEventRecord *)fb_generateForceTouchEvent:(CGPoint)hitPoint press } @end +#endif + diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m b/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m index e86a021de..f261fef17 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m @@ -13,12 +13,18 @@ #import "FBConfiguration.h" #import "FBElementHitPoint.h" #import "FBMathUtils.h" +#import "FBXCTestDaemonsProxy.h" +#import "XCAccessibilityElement+FBComparison.h" #import "FBXCodeCompatibility.h" #import "XCElementSnapshot+FBHelpers.h" #import "XCUIElement+FBUtilities.h" +#import "XCTestManager_ManagerInterface-Protocol.h" #import "XCTestPrivateSymbols.h" #import #import "XCElementSnapshot+FBHitPoint.h" +#import "XCTRunnerDaemonSession.h" + +static const NSTimeInterval AX_TIMEOUT = 1.0; @implementation XCUIElement (FBIsVisible) @@ -31,6 +37,31 @@ - (BOOL)fb_isVisible @implementation XCElementSnapshot (FBIsVisible) + +- (XCAccessibilityElement *)elementAtPoint:(CGPoint)point +{ + __block XCAccessibilityElement *result = nil; + __block NSError *innerError = nil; + id proxy = [FBXCTestDaemonsProxy testRunnerProxy]; + dispatch_semaphore_t sem = dispatch_semaphore_create(0); + [proxy _XCT_setAXTimeout:AX_TIMEOUT reply:^(int res) { + [proxy _XCT_requestElementAtPoint:point + reply:^(XCAccessibilityElement *element, NSError *error) { + if (nil == error) { + result = element; + } else { + innerError = error; + } + dispatch_semaphore_signal(sem); + }]; + }]; + dispatch_semaphore_wait(sem, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(AX_TIMEOUT * NSEC_PER_SEC))); + if (nil != innerError) { + [FBLogger logFmt:@"Cannot get the accessibility element for the point where %@ snapshot is located. Original error: '%@'", innerError.description, self.description]; + } + return result; +} + - (BOOL)fb_isVisible { CGRect frame = self.frame; @@ -41,15 +72,28 @@ - (BOOL)fb_isVisible return [(NSNumber *)[self fb_attributeValue:FB_XCAXAIsVisibleAttribute] boolValue]; } CGRect appFrame = [self fb_rootElement].frame; + NSArray *ancestors = self.fb_ancestors; +#if TARGET_OS_IOS CGSize screenSize = FBAdjustDimensionsForApplication(appFrame.size, self.application.interfaceOrientation); +#else + CGSize screenSize = appFrame.size; +#endif CGRect screenFrame = CGRectMake(0, 0, screenSize.width, screenSize.height); if (!CGRectIntersectsRect(frame, screenFrame)) { return NO; } + CGPoint midPoint = [self.suggestedHitpoints.lastObject CGPointValue]; - XCElementSnapshot *hitElement = [self hitTest:midPoint]; - if (self == hitElement || [self._allDescendants.copy containsObject:hitElement]) { - return YES; + XCAccessibilityElement *hitElement = [self elementAtPoint:midPoint]; + if (nil != hitElement) { + if ([self.accessibilityElement isEqualToElement:hitElement]) { + return YES; + } + for (XCElementSnapshot *ancestor in ancestors) { + if ([hitElement isEqualToElement:ancestor.accessibilityElement]) { + return YES; + } + } } FBElementHitPoint *hitPoint = [self fb_hitPoint:nil]; if (hitPoint != nil && CGRectContainsPoint(appFrame, hitPoint.point)) { diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.h b/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.h index a63cf934e..dc6ee00b9 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.h +++ b/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.h @@ -10,19 +10,19 @@ #import NS_ASSUME_NONNULL_BEGIN - +#if !TARGET_OS_TV @interface XCUIElement (FBPickerWheel) /** Selects the next available option in Picker Wheel @param offset the value in range [0.01, 0.5]. It defines how far from picker - wheel's center the click should happen. The actual distance is culculated by - multiplying this value to the actual picker wheel height. Too small offset value - may not change the picker wheel value and too high value may cause the wheel to switch - two or more values at once. Usually the optimal value is located in range [0.15, 0.3] + wheel's center the click should happen. The actual distance is culculated by + multiplying this value to the actual picker wheel height. Too small offset value + may not change the picker wheel value and too high value may cause the wheel to switch + two or more values at once. Usually the optimal value is located in range [0.15, 0.3] @param error returns error object if there was an error while selecting the - next picker value + next picker value @return YES if the current option has been successfully switched. Otherwise NO */ - (BOOL)fb_selectNextOptionWithOffset:(CGFloat)offset error:(NSError **)error; @@ -31,16 +31,17 @@ NS_ASSUME_NONNULL_BEGIN Selects the previous available option in Picker Wheel @param offset the value in range [0.01, 0.5]. It defines how far from picker - wheel's center the click should happen. The actual distance is culculated by - multiplying this value to the actual picker wheel height. Too small offset value - may not change the picker wheel value and too high value may cause the wheel to switch - two or more values at once. Usually the optimal value is located in range [0.15, 0.3] + wheel's center the click should happen. The actual distance is culculated by + multiplying this value to the actual picker wheel height. Too small offset value + may not change the picker wheel value and too high value may cause the wheel to switch + two or more values at once. Usually the optimal value is located in range [0.15, 0.3] @param error returns error object if there was an error while selecting the - previous picker value + previous picker value @return YES if the current option has been successfully switched. Otherwise NO */ - (BOOL)fb_selectPreviousOptionWithOffset:(CGFloat)offset error:(NSError **)error; @end +#endif NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m b/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m index 4b2e9d3ee..0c1e9dbac 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m @@ -12,6 +12,7 @@ #import "FBRunLoopSpinner.h" #import "XCUICoordinate.h" +#if !TARGET_OS_TV @implementation XCUIElement (FBPickerWheel) static const NSTimeInterval VALUE_CHANGE_TIMEOUT = 2; @@ -23,13 +24,13 @@ - (BOOL)fb_scrollWithOffset:(CGFloat)relativeHeightOffset error:(NSError **)erro XCUICoordinate *endCoord = [startCoord coordinateWithOffset:CGVectorMake(0.0, relativeHeightOffset * self.frame.size.height)]; [endCoord tap]; return [[[[FBRunLoopSpinner new] - timeout:VALUE_CHANGE_TIMEOUT] - timeoutErrorMessage:[NSString stringWithFormat:@"Picker wheel value has not been changed after %@ seconds timeout", @(VALUE_CHANGE_TIMEOUT)]] - spinUntilTrue:^BOOL{ - [self resolve]; - return ![self.value isEqualToString:previousValue]; - } - error:error]; + timeout:VALUE_CHANGE_TIMEOUT] + timeoutErrorMessage:[NSString stringWithFormat:@"Picker wheel value has not been changed after %@ seconds timeout", @(VALUE_CHANGE_TIMEOUT)]] + spinUntilTrue:^BOOL{ + [self resolve]; + return ![self.value isEqualToString:previousValue]; + } + error:error]; } - (BOOL)fb_selectNextOptionWithOffset:(CGFloat)offset error:(NSError **)error @@ -43,3 +44,4 @@ - (BOOL)fb_selectPreviousOptionWithOffset:(CGFloat)offset error:(NSError **)erro } @end +#endif diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.h b/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.h index 3aceb3988..0af840c45 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.h +++ b/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.h @@ -10,7 +10,7 @@ #import NS_ASSUME_NONNULL_BEGIN - +#if !TARGET_OS_TV /** Defines directions in which scrolling is possible. */ @@ -24,35 +24,35 @@ typedef NS_ENUM(NSUInteger, FBXCUIElementScrollDirection) { /** Scrolls receiver up by one screen height - + @param distance Normalized <0.0 - 1.0> scroll distance distance */ - (void)fb_scrollUpByNormalizedDistance:(CGFloat)distance; /** Scrolls receiver down by one screen height - + @param distance Normalized <0.0 - 1.0> scroll distance distance */ - (void)fb_scrollDownByNormalizedDistance:(CGFloat)distance; /** Scrolls receiver left by one screen width - + @param distance Normalized <0.0 - 1.0> scroll distance distance */ - (void)fb_scrollLeftByNormalizedDistance:(CGFloat)distance; /** Scrolls receiver right by one screen width - + @param distance Normalized <0.0 - 1.0> scroll distance distance */ - (void)fb_scrollRightByNormalizedDistance:(CGFloat)distance; /** Scrolls parent scroll view till receiver is visible. - + @param error If there is an error, upon return contains an NSError object that describes the problem. @return YES if the operation succeeds, otherwise NO. */ @@ -61,7 +61,7 @@ typedef NS_ENUM(NSUInteger, FBXCUIElementScrollDirection) { /** Scrolls parent scroll view till receiver is visible. Whenever element is invisible it scrolls by normalizedScrollDistance in its direction. E.g. if normalizedScrollDistance is equal to 0.5, each step will scroll by half of scroll view's size. - + @param normalizedScrollDistance single scroll step normalized (0.0 - 1.0) distance @param error If there is an error, upon return contains an NSError object that describes the problem. @return YES if the operation succeeds, otherwise NO. @@ -71,9 +71,9 @@ typedef NS_ENUM(NSUInteger, FBXCUIElementScrollDirection) { /** Scrolls parent scroll view till receiver is visible. Whenever element is invisible it scrolls by normalizedScrollDistance in its direction. E.g. if normalizedScrollDistance is equal to 0.5, each step will scroll by half of scroll view's size. - + @param normalizedScrollDistance single scroll step normalized (0.0 - 1.0) distance - @param scrollDirection the direction in which the scroll view should be scrolled, or FBXCUIElementScrollDirectionUnknown + @param scrollDirection the direction in which the scroll view should be scrolled, or FBXCUIElementScrollDirectionUnknown to attempt to determine it automatically @param error If there is an error, upon return contains an NSError object that describes the problem. @return YES if the operation succeeds, otherwise NO. @@ -82,4 +82,5 @@ typedef NS_ENUM(NSUInteger, FBXCUIElementScrollDirection) { @end +#endif NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.m b/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.m index 55623955d..08b6c6e47 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.m @@ -30,6 +30,7 @@ #import "XCUIElement+FBUtilities.h" #import "XCUIElement+FBWebDriverAttributes.h" +#if !TARGET_OS_TV const CGFloat FBFuzzyPointThreshold = 20.f; //Smallest determined value that is not interpreted as touch const CGFloat FBScrollToVisibleNormalizedDistance = .5f; const CGFloat FBScrollVelocity = 200.f; @@ -90,7 +91,7 @@ - (BOOL)fb_scrollToVisibleWithNormalizedScrollDistance:(CGFloat)normalizedScroll return YES; } __block NSArray *cellSnapshots, *visibleCellSnapshots; - + NSArray *acceptedParents = @[ @(XCUIElementTypeScrollView), @(XCUIElementTypeCollectionView), @@ -99,31 +100,27 @@ - (BOOL)fb_scrollToVisibleWithNormalizedScrollDistance:(CGFloat)normalizedScroll ]; XCElementSnapshot *elementSnapshot = self.fb_lastSnapshot; XCElementSnapshot *scrollView = [elementSnapshot fb_parentMatchingOneOfTypes:acceptedParents - filter:^(XCElementSnapshot *snapshot) { - - if (![snapshot isWDVisible]) { - return NO; - } - - cellSnapshots = [snapshot fb_descendantsCellSnapshots]; - - visibleCellSnapshots = [cellSnapshots filteredArrayUsingPredicate:[FBPredicate predicateWithFormat:@"%K == YES", FBStringify(XCUIElement, fb_isVisible)]]; - - if (visibleCellSnapshots.count > 1) { - return YES; - } - return NO; - }]; - + filter:^(XCElementSnapshot *snapshot) { + if (![snapshot isWDVisible]) { + return NO; + } + cellSnapshots = [snapshot fb_descendantsCellSnapshots]; + visibleCellSnapshots = [cellSnapshots filteredArrayUsingPredicate:[FBPredicate predicateWithFormat:@"%K == YES", FBStringify(XCUIElement, fb_isVisible)]]; + if (visibleCellSnapshots.count > 1) { + return YES; + } + return NO; + }]; + if (scrollView == nil) { return [[[FBErrorBuilder builder] withDescriptionFormat:@"Failed to find scrollable visible parent with 2 visible children"] buildError:error]; } - + XCElementSnapshot *targetCellSnapshot = [elementSnapshot fb_parentCellSnapshot]; - + XCElementSnapshot *lastSnapshot = visibleCellSnapshots.lastObject; // Can't just do indexOfObject, because targetCellSnapshot may represent the same object represented by a member of cellSnapshots, yet be a different object // than that member. This reflects the fact that targetCellSnapshot came out of self.fb_parentCellSnapshot, not out of cellSnapshots directly. @@ -132,7 +129,7 @@ - (BOOL)fb_scrollToVisibleWithNormalizedScrollDistance:(CGFloat)normalizedScroll return [obj _matchesElement:targetCellSnapshot]; }]; NSUInteger visibleCellIndex = [cellSnapshots indexOfObject:lastSnapshot]; - + if (scrollDirection == FBXCUIElementScrollDirectionUnknown) { // Try to determine the scroll direction by determining the vector between the first and last visible cells XCElementSnapshot *firstVisibleCell = visibleCellSnapshots.firstObject; @@ -146,34 +143,34 @@ - (BOOL)fb_scrollToVisibleWithNormalizedScrollDistance:(CGFloat)normalizedScroll scrollDirection = FBXCUIElementScrollDirectionHorizontal; } } - + const NSUInteger maxScrollCount = 25; NSUInteger scrollCount = 0; - + XCElementSnapshot *prescrollSnapshot = self.fb_lastSnapshot; // Scrolling till cell is visible and get current value of frames while (![self fb_isEquivalentElementSnapshotVisible:prescrollSnapshot] && scrollCount < maxScrollCount) { if (targetCellIndex < visibleCellIndex) { scrollDirection == FBXCUIElementScrollDirectionVertical ? - [scrollView fb_scrollUpByNormalizedDistance:normalizedScrollDistance inApplication:self.application] : - [scrollView fb_scrollLeftByNormalizedDistance:normalizedScrollDistance inApplication:self.application]; + [scrollView fb_scrollUpByNormalizedDistance:normalizedScrollDistance inApplication:self.application] : + [scrollView fb_scrollLeftByNormalizedDistance:normalizedScrollDistance inApplication:self.application]; } else { scrollDirection == FBXCUIElementScrollDirectionVertical ? - [scrollView fb_scrollDownByNormalizedDistance:normalizedScrollDistance inApplication:self.application] : - [scrollView fb_scrollRightByNormalizedDistance:normalizedScrollDistance inApplication:self.application]; + [scrollView fb_scrollDownByNormalizedDistance:normalizedScrollDistance inApplication:self.application] : + [scrollView fb_scrollRightByNormalizedDistance:normalizedScrollDistance inApplication:self.application]; } [self resolve]; // Resolve is needed for correct visibility scrollCount++; } - + if (scrollCount >= maxScrollCount) { return [[[FBErrorBuilder builder] withDescriptionFormat:@"Failed to perform scroll with visible cell due to max scroll count reached"] buildError:error]; } - + // Cell is now visible, but it might be only partialy visible, scrolling till whole frame is visible targetCellSnapshot = [self.fb_lastSnapshot fb_parentCellSnapshot]; CGVector scrollVector = CGVectorMake(targetCellSnapshot.visibleFrame.size.width - targetCellSnapshot.frame.size.width, @@ -244,7 +241,7 @@ - (BOOL)fb_scrollByVector:(CGVector)vector inApplication:(XCUIApplication *)appl ); scrollBoundingVector.dx = (CGFloat)floor(copysign(scrollBoundingVector.dx, vector.dx)); scrollBoundingVector.dy = (CGFloat)floor(copysign(scrollBoundingVector.dy, vector.dy)); - + NSUInteger scrollLimit = 100; BOOL shouldFinishScrolling = NO; while (!shouldFinishScrolling) { @@ -270,15 +267,15 @@ - (CGVector)fb_hitPointOffsetForScrollingVector:(CGVector)scrollingVector - (BOOL)fb_scrollAncestorScrollViewByVectorWithinScrollViewFrame:(CGVector)vector inApplication:(XCUIApplication *)application error:(NSError **)error { CGVector hitpointOffset = [self fb_hitPointOffsetForScrollingVector:vector]; - + XCUICoordinate *appCoordinate = [[XCUICoordinate alloc] initWithElement:application normalizedOffset:CGVectorMake(0.0, 0.0)]; XCUICoordinate *startCoordinate = [[XCUICoordinate alloc] initWithCoordinate:appCoordinate pointsOffset:hitpointOffset]; XCUICoordinate *endCoordinate = [[XCUICoordinate alloc] initWithCoordinate:startCoordinate pointsOffset:vector]; - + if (FBPointFuzzyEqualToPoint(startCoordinate.fb_screenPoint, endCoordinate.fb_screenPoint, FBFuzzyPointThreshold)) { return YES; } - + CGFloat offset = 0.3f; // Waiting before scrolling helps to make it more stable double scrollingTime = MAX(fabs(vector.dx), fabs(vector.dy))/FBScrollVelocity; XCPointerEventPath *touchPath = [[XCPointerEventPath alloc] initForTouchAtPoint:startCoordinate.fb_screenPoint offset:offset]; @@ -286,10 +283,10 @@ - (BOOL)fb_scrollAncestorScrollViewByVectorWithinScrollViewFrame:(CGVector)vecto [touchPath moveToPoint:endCoordinate.fb_screenPoint atOffset:offset]; offset += FBMinimumTouchEventDelay; [touchPath liftUpAtOffset:offset]; - + XCSynthesizedEventRecord *event = [[XCSynthesizedEventRecord alloc] initWithName:@"FBScroll" interfaceOrientation:application.interfaceOrientation]; [event addPointerEventPath:touchPath]; - + __block BOOL didSucceed = NO; __block NSError *innerError; [FBRunLoopSpinner spinUntilCompletion:^(void(^completion)(void)){ @@ -309,3 +306,4 @@ - (BOOL)fb_scrollAncestorScrollViewByVectorWithinScrollViewFrame:(CGVector)vecto } @end +#endif diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h new file mode 100644 index 000000000..9aaa9d621 --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XCUIElement (FBTVFocuse) + +-(BOOL)fb_focuseWithError:(NSError**) error; + +-(BOOL)fb_selectWithError:(NSError**) error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m new file mode 100644 index 000000000..a07bd6ce5 --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "XCUIElement+FBTVFocuse.h" + +#import +#import "FBApplication.h" +#import "FBErrorBuilder.h" +#import +#import "XCUIElement+FBUtilities.h" +#import "XCUIElement+FBWebDriverAttributes.h" + +int const MAX_ITERATIONS_COUNT = 100; + +@implementation XCUIElement (FBTVFocuse) + +-(BOOL)fb_focuseWithError:(NSError**) error +{ + [[FBApplication fb_activeApplication] fb_waitUntilSnapshotIsStable]; + if (self.wdEnabled) { + FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:self]; + for (int i = 0; i < MAX_ITERATIONS_COUNT; i++) { + if (self.hasFocus) { + return YES; + } + if (self.exists) { + FBTVDirection direction = tracker.directionToMoveFocuse; + if(direction != FBTVDirectionNone) { + [[XCUIRemote sharedRemote] pressButton: (XCUIRemoteButton)direction]; + continue; + } + } + [[[FBErrorBuilder builder] withDescription:@"Unable to reach element. Try to use XCUIRemote commands."] + buildError:error]; + return NO; + } + } + [[[FBErrorBuilder builder] withDescription:@"Element could not be focused."] + buildError:error]; + return NO; +} + +-(BOOL)fb_selectWithError:(NSError**) error +{ + BOOL result = [self fb_focuseWithError: error]; + if (result) { + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; + } + return result; +} +@end diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTap.m b/WebDriverAgentLib/Categories/XCUIElement+FBTap.m index f71ed5d5e..168a61430 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTap.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTap.m @@ -20,6 +20,7 @@ #import "XCPointerEventPath.h" #import "XCTRunnerDaemonSession.h" +#if !TARGET_OS_TV const CGFloat FBTapDuration = 0.01f; @implementation XCUIElement (FBTap) @@ -62,7 +63,7 @@ - (BOOL)fb_performTapAtPoint:(CGPoint)hitPoint error:(NSError *__autoreleasing*) didSucceed = (commandError == nil); completion(); }; - + XCSynthesizedEventRecord *event = [self fb_generateTapEvent:hitPoint orientation:self.interfaceOrientation]; [[XCTRunnerDaemonSession sharedSession] synthesizeEvent:event completion:^(NSError *invokeError){ handlerBlock(event, invokeError); @@ -87,3 +88,5 @@ - (XCSynthesizedEventRecord *)fb_generateTapEvent:(CGPoint)hitPoint orientation: } @end + +#endif diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m b/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m index 2c0a801dd..fff060473 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m @@ -24,9 +24,17 @@ - (BOOL)fb_typeText:(NSString *)text error:(NSError **)error - (BOOL)fb_typeText:(NSString *)text frequency:(NSUInteger)frequency error:(NSError **)error { +// There is no ability to open text field via tap +#if TARGET_OS_TV + if (!self.hasKeyboardFocus) { + [[[FBErrorBuilder builder] withDescription:@"Keyboard is not opened."] buildError:error]; + return NO; + } +#else if (!self.hasKeyboardFocus && ![self fb_tapWithError:error]) { return NO; } +#endif if (![FBKeyboard typeText:text frequency:frequency error:error]) { return NO; } diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBUtilities.m b/WebDriverAgentLib/Categories/XCUIElement+FBUtilities.m index 868dfb687..99cc81e5b 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBUtilities.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBUtilities.m @@ -34,7 +34,7 @@ - (BOOL)fb_waitUntilFrameIsStable [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; return [[[FBRunLoopSpinner new] - timeout:10.] + timeout:10.] spinUntilTrue:^BOOL{ [self resolve]; const BOOL isSameFrame = FBRectFuzzyEqualToRect(self.wdFrame, frame, FBDefaultFrameFuzzyThreshold); @@ -135,7 +135,7 @@ - (NSData *)fb_screenshotWithError:(NSError **)error } return nil; } - + Class xcScreenClass = objc_lookUpClass("XCUIScreen"); if (nil == xcScreenClass) { if (error) { @@ -143,16 +143,17 @@ - (NSData *)fb_screenshotWithError:(NSError **)error } return nil; } - + XCUIScreen *mainScreen = (XCUIScreen *)[xcScreenClass mainScreen]; NSData *result = [mainScreen screenshotDataForQuality:1 rect:self.frame error:error]; if (nil == result) { return nil; } - + UIImage *image = [UIImage imageWithData:result]; - UIInterfaceOrientation orientation = self.application.interfaceOrientation; UIImageOrientation imageOrientation = UIImageOrientationUp; +#if !TARGET_OS_TV + UIInterfaceOrientation orientation = self.application.interfaceOrientation; // The received element screenshot will be rotated, if the current interface orientation differs from portrait, so we need to fix that first if (orientation == UIInterfaceOrientationLandscapeRight) { imageOrientation = UIImageOrientationLeft; @@ -161,12 +162,14 @@ - (NSData *)fb_screenshotWithError:(NSError **)error } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { imageOrientation = UIImageOrientationDown; } +#endif + CGSize size = image.size; UIGraphicsBeginImageContext(CGSizeMake(size.width, size.height)); [[UIImage imageWithCGImage:(CGImageRef)[image CGImage] scale:1.0 orientation:imageOrientation] drawInRect:CGRectMake(0, 0, size.width, size.height)]; UIImage *fixedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); - + // The resulting data is a JPEG image, so we need to convert it to PNG representation return (NSData *)UIImagePNGRepresentation(fixedImage); } diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBWebDriverAttributes.m b/WebDriverAgentLib/Categories/XCUIElement+FBWebDriverAttributes.m index 95d31f1e7..4a3e2d571 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBWebDriverAttributes.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBWebDriverAttributes.m @@ -105,6 +105,15 @@ - (BOOL)isWDVisible return self.fb_isVisible; } +#if TARGET_OS_TV + +- (BOOL)isWDFocused +{ + return self.hasFocus; +} + +#endif + - (BOOL)isWDAccessible { // Special cases: diff --git a/WebDriverAgentLib/Commands/FBCustomCommands.m b/WebDriverAgentLib/Commands/FBCustomCommands.m index c562f8e83..8db4ab6ad 100644 --- a/WebDriverAgentLib/Commands/FBCustomCommands.m +++ b/WebDriverAgentLib/Commands/FBCustomCommands.m @@ -21,7 +21,7 @@ #import "FBRunLoopSpinner.h" #import "FBSession.h" #import "FBXCodeCompatibility.h" -#import "FBSpringboardApplication.h" +#import "FBHomeboardApplication.h" #import "XCUIApplication+FBHelpers.h" #import "XCUIDevice+FBHelpers.h" #import "XCUIElement.h" @@ -74,7 +74,13 @@ + (NSArray *)routes + (id)handleDismissKeyboardCommand:(FBRouteRequest *)request { +#if TARGET_OS_IOS [request.session.application dismissKeyboard]; +#elif TARGET_OS_TV + if ([self isKeyboardPresent]) { + [[XCUIRemote sharedRemote] pressButton: XCUIRemoteButtonMenu]; + } +#endif NSError *error; NSString *errorDescription = @"The keyboard cannot be dismissed. Try to dismiss it in the way supported by your application under test."; if ([UIDevice.currentDevice userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { @@ -85,8 +91,7 @@ + (NSArray *)routes timeout:5] timeoutErrorMessage:errorDescription] spinUntilTrue:^BOOL{ - XCUIElement *foundKeyboard = [[FBApplication fb_activeApplication].query descendantsMatchingType:XCUIElementTypeKeyboard].fb_firstMatch; - return !(foundKeyboard && foundKeyboard.fb_isVisible); + return ![self isKeyboardPresent]; } error:&error]; if (!isKeyboardNotPresent) { @@ -107,4 +112,10 @@ + (NSArray *)routes [elementCache clear]; return FBResponseWithOK(); } + +#pragma mark - Helpers ++ (BOOL) isKeyboardPresent { + XCUIElement *foundKeyboard = [[FBApplication fb_activeApplication].query descendantsMatchingType:XCUIElementTypeKeyboard].fb_firstMatch; + return foundKeyboard && foundKeyboard.fb_isVisible; +} @end diff --git a/WebDriverAgentLib/Commands/FBElementCommands.m b/WebDriverAgentLib/Commands/FBElementCommands.m index b8a7ae887..c22a64a09 100644 --- a/WebDriverAgentLib/Commands/FBElementCommands.m +++ b/WebDriverAgentLib/Commands/FBElementCommands.m @@ -35,6 +35,7 @@ #import "XCUIElement+FBTyping.h" #import "XCUIElement+FBUtilities.h" #import "XCUIElement+FBWebDriverAttributes.h" +#import "XCUIElement+FBTVFocuse.h" #import "FBElementTypeTransformer.h" #import "XCUIElement.h" #import "XCUIElementQuery.h" @@ -59,27 +60,35 @@ + (NSArray *)routes [[FBRoute GET:@"/element/:uuid/displayed"] respondWithTarget:self action:@selector(handleGetDisplayed:)], [[FBRoute GET:@"/element/:uuid/name"] respondWithTarget:self action:@selector(handleGetName:)], [[FBRoute POST:@"/element/:uuid/value"] respondWithTarget:self action:@selector(handleSetValue:)], - [[FBRoute POST:@"/element/:uuid/click"] respondWithTarget:self action:@selector(handleClick:)], [[FBRoute POST:@"/element/:uuid/clear"] respondWithTarget:self action:@selector(handleClear:)], [[FBRoute GET:@"/element/:uuid/screenshot"] respondWithTarget:self action:@selector(handleElementScreenshot:)], [[FBRoute GET:@"/wda/element/:uuid/accessible"] respondWithTarget:self action:@selector(handleGetAccessible:)], [[FBRoute GET:@"/wda/element/:uuid/accessibilityContainer"] respondWithTarget:self action:@selector(handleGetIsAccessibilityContainer:)], + [[FBRoute POST:@"/wda/keys"] respondWithTarget:self action:@selector(handleKeys:)], + [[FBRoute POST:@"/element/:uuid/click"] respondWithTarget:self action:@selector(handleClick:)], +#if TARGET_OS_TV + [[FBRoute POST:@"/element/:uuid/focuse"] respondWithTarget:self action:@selector(handleFocuse:)], + [[FBRoute GET:@"/element/:uuid/focused"] respondWithTarget:self action:@selector(handleGetFocused:)], +#endif +#if TARGET_OS_IOS [[FBRoute POST:@"/wda/element/:uuid/swipe"] respondWithTarget:self action:@selector(handleSwipe:)], - [[FBRoute POST:@"/wda/element/:uuid/pinch"] respondWithTarget:self action:@selector(handlePinch:)], - [[FBRoute POST:@"/wda/element/:uuid/doubleTap"] respondWithTarget:self action:@selector(handleDoubleTap:)], - [[FBRoute POST:@"/wda/element/:uuid/twoFingerTap"] respondWithTarget:self action:@selector(handleTwoFingerTap:)], [[FBRoute POST:@"/wda/element/:uuid/touchAndHold"] respondWithTarget:self action:@selector(handleTouchAndHold:)], [[FBRoute POST:@"/wda/element/:uuid/scroll"] respondWithTarget:self action:@selector(handleScroll:)], - [[FBRoute POST:@"/wda/element/:uuid/dragfromtoforduration"] respondWithTarget:self action:@selector(handleDrag:)], - [[FBRoute POST:@"/wda/dragfromtoforduration"] respondWithTarget:self action:@selector(handleDragCoordinate:)], [[FBRoute POST:@"/wda/tap/:uuid"] respondWithTarget:self action:@selector(handleTap:)], [[FBRoute POST:@"/wda/touchAndHold"] respondWithTarget:self action:@selector(handleTouchAndHoldCoordinate:)], + [[FBRoute POST:@"/wda/element/:uuid/dragfromtoforduration"] respondWithTarget:self action:@selector(handleDrag:)], + [[FBRoute POST:@"/wda/dragfromtoforduration"] respondWithTarget:self action:@selector(handleDragCoordinate:)], + [[FBRoute POST:@"/wda/element/:uuid/pinch"] respondWithTarget:self action:@selector(handlePinch:)], + + [[FBRoute POST:@"/wda/element/:uuid/doubleTap"] respondWithTarget:self action:@selector(handleDoubleTap:)], + [[FBRoute POST:@"/wda/element/:uuid/twoFingerTap"] respondWithTarget:self action:@selector(handleTwoFingerTap:)], [[FBRoute POST:@"/wda/doubleTap"] respondWithTarget:self action:@selector(handleDoubleTapCoordinate:)], - [[FBRoute POST:@"/wda/keys"] respondWithTarget:self action:@selector(handleKeys:)], + [[FBRoute POST:@"/wda/pickerwheel/:uuid/select"] respondWithTarget:self action:@selector(handleWheelSelect:)], [[FBRoute POST:@"/wda/element/forceTouch/:uuid"] respondWithTarget:self action:@selector(handleForceTouch:)], [[FBRoute POST:@"/wda/element/forceTouchByCoordinate/:uuid"] respondWithTarget:self action:@selector(handleForceTouchByCoordinateOnElement:)] - ]; +#endif + ]; } @@ -148,6 +157,28 @@ + (NSArray *)routes return FBResponseWithStatus(FBCommandStatusNoError, type); } +#if TARGET_OS_TV ++ (id)handleGetFocused:(FBRouteRequest *)request +{ + FBElementCache *elementCache = request.session.elementCache; + XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; + BOOL isFocused = element.hasFocus; + return FBResponseWithStatus(FBCommandStatusNoError, isFocused ? @YES : @NO); +} + ++ (id)handleFocuse:(FBRouteRequest *)request +{ + NSString *elementUUID = request.parameters[@"uuid"]; + FBElementCache *elementCache = request.session.elementCache; + XCUIElement *element = [elementCache elementForUUID:elementUUID]; + NSError *error; + if (![element fb_focuseWithError:&error]) { + return FBResponseWithError(error); + } + return FBResponseWithElementUUID(elementUUID); +} +#endif + + (id)handleSetValue:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -161,6 +192,7 @@ + (NSArray *)routes if ([value isKindOfClass:[NSArray class]]) { textToType = [value componentsJoinedByString:@""]; } +#if TARGET_OS_IOS if (element.elementType == XCUIElementTypePickerWheel) { [element adjustToPickerWheelValue:textToType]; return FBResponseWithOK(); @@ -173,6 +205,7 @@ + (NSArray *)routes [element adjustToNormalizedSliderPosition:sliderValue]; return FBResponseWithOK(); } +#endif NSUInteger frequency = (NSUInteger)[request.arguments[@"frequency"] longLongValue] ?: [FBConfiguration maxTypingFrequency]; NSError *error = nil; if (![element fb_typeText:textToType frequency:frequency error:&error]) { @@ -181,30 +214,37 @@ + (NSArray *)routes return FBResponseWithElementUUID(elementUUID); } -+ (id)handleClick:(FBRouteRequest *)request ++ (id)handleClear:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; NSString *elementUUID = request.parameters[@"uuid"]; XCUIElement *element = [elementCache elementForUUID:elementUUID]; - NSError *error = nil; - if (![element fb_tapWithError:&error]) { + NSError *error; + if (![element fb_clearTextWithError:&error]) { return FBResponseWithError(error); } return FBResponseWithElementUUID(elementUUID); } -+ (id)handleClear:(FBRouteRequest *)request + ++ (id)handleClick:(FBRouteRequest *)request { - FBElementCache *elementCache = request.session.elementCache; NSString *elementUUID = request.parameters[@"uuid"]; + FBElementCache *elementCache = request.session.elementCache; XCUIElement *element = [elementCache elementForUUID:elementUUID]; - NSError *error; - if (![element fb_clearTextWithError:&error]) { + NSError *error = nil; +#if TARGET_OS_IOS + if (![element fb_tapWithError:&error]) { +#elif TARGET_OS_TV + if (![element fb_selectWithError:&error]) { +#endif return FBResponseWithError(error); } return FBResponseWithElementUUID(elementUUID); } - + +#if TARGET_OS_IOS + + (id)handleDoubleTap:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -223,10 +263,10 @@ + (NSArray *)routes + (id)handleTwoFingerTap:(FBRouteRequest *)request { - FBElementCache *elementCache = request.session.elementCache; - XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; - [element twoFingerTap]; - return FBResponseWithOK(); + FBElementCache *elementCache = request.session.elementCache; + XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; + [element twoFingerTap]; + return FBResponseWithOK(); } + (id)handleTouchAndHold:(FBRouteRequest *)request @@ -276,7 +316,7 @@ + (NSArray *)routes { FBElementCache *elementCache = request.session.elementCache; XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; - + // Using presence of arguments as a way to convey control flow seems like a pretty bad idea but it's // what ios-driver did and sadly, we must copy them. NSString *const name = request.arguments[@"name"]; @@ -287,7 +327,7 @@ + (NSArray *)routes } return [self.class handleScrollElementToVisible:childElement withRequest:request]; } - + NSString *const direction = request.arguments[@"direction"]; if (direction) { NSString *const distanceString = request.arguments[@"distance"] ?: @"1.0"; @@ -303,7 +343,7 @@ + (NSArray *)routes } return FBResponseWithOK(); } - + NSString *const predicateString = request.arguments[@"predicateString"]; if (predicateString) { NSPredicate *formattedPredicate = [NSPredicate fb_formatSearchPredicate:[FBPredicate predicateWithFormat:predicateString]]; @@ -313,7 +353,7 @@ + (NSArray *)routes } return [self.class handleScrollElementToVisible:childElement withRequest:request]; } - + if (request.arguments[@"toVisible"]) { return [self.class handleScrollElementToVisible:element withRequest:request]; } @@ -332,6 +372,7 @@ + (NSArray *)routes return FBResponseWithOK(); } + + (id)handleDrag:(FBRouteRequest *)request { FBSession *session = request.session; @@ -349,30 +390,31 @@ + (NSArray *)routes + (id)handleSwipe:(FBRouteRequest *)request { - FBElementCache *elementCache = request.session.elementCache; - XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; - NSString *const direction = request.arguments[@"direction"]; - if (!direction) { - return FBResponseWithErrorFormat(@"Missing 'direction' parameter"); - } - if ([direction isEqualToString:@"up"]) { - [element swipeUp]; - } else if ([direction isEqualToString:@"down"]) { - [element swipeDown]; - } else if ([direction isEqualToString:@"left"]) { - [element swipeLeft]; - } else if ([direction isEqualToString:@"right"]) { - [element swipeRight]; - } else { - return FBResponseWithErrorFormat(@"Unsupported swipe type"); - } - return FBResponseWithOK(); + FBElementCache *elementCache = request.session.elementCache; + XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; + NSString *const direction = request.arguments[@"direction"]; + if (!direction) { + return FBResponseWithErrorFormat(@"Missing 'direction' parameter"); + } + if ([direction isEqualToString:@"up"]) { + [element swipeUp]; + } else if ([direction isEqualToString:@"down"]) { + [element swipeDown]; + } else if ([direction isEqualToString:@"left"]) { + [element swipeLeft]; + } else if ([direction isEqualToString:@"right"]) { + [element swipeRight]; + } else { + return FBResponseWithErrorFormat(@"Unsupported swipe type"); + } + return FBResponseWithOK(); } + + (id)handleTap:(FBRouteRequest *)request { - FBElementCache *elementCache = request.session.elementCache; CGPoint tapPoint = CGPointMake((CGFloat)[request.arguments[@"x"] doubleValue], (CGFloat)[request.arguments[@"y"] doubleValue]); + FBElementCache *elementCache = request.session.elementCache; XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; if (nil == element) { XCUICoordinate *tapCoordinate = [self.class gestureCoordinateWithCoordinate:tapPoint application:request.session.application shouldApplyOrientationWorkaround:isSDKVersionLessThan(@"11.0")]; @@ -395,6 +437,7 @@ + (NSArray *)routes [element pinchWithScale:scale velocity:velocity]; return FBResponseWithOK(); } +#endif // TARGET_OS_IOS + (id)handleKeys:(FBRouteRequest *)request { @@ -410,11 +453,15 @@ + (NSArray *)routes + (id)handleGetWindowSize:(FBRouteRequest *)request { CGRect frame = request.session.application.wdFrame; +#if TARGET_OS_IOS CGSize screenSize = FBAdjustDimensionsForApplication(frame.size, request.session.application.interfaceOrientation); +#else + CGSize screenSize = frame.size; +#endif return FBResponseWithStatus(FBCommandStatusNoError, @{ - @"width": @(screenSize.width), - @"height": @(screenSize.height), - }); + @"width": @(screenSize.width), + @"height": @(screenSize.height), + }); } + (id)handleElementScreenshot:(FBRouteRequest *)request @@ -430,6 +477,7 @@ + (NSArray *)routes return FBResponseWithObject(screenshot); } +#if TARGET_OS_IOS static const CGFloat DEFAULT_OFFSET = (CGFloat)0.2; + (id)handleWheelSelect:(FBRouteRequest *)request @@ -447,7 +495,7 @@ + (NSArray *)routes return FBResponseWithErrorFormat(@"'offset' value is expected to be in range (0.0, 0.5]. '%@' was given instead", request.arguments[@"offset"]); } } - BOOL isSuccessful = false; + BOOL isSuccessful = NO; NSError *error; if ([order isEqualToString:@"next"]) { isSuccessful = [element fb_selectNextOptionWithOffset:offset error:&error]; @@ -466,10 +514,10 @@ + (NSArray *)routes + (id)handleScrollElementToVisible:(XCUIElement *)element withRequest:(FBRouteRequest *)request { - NSError *error; if (!element.exists) { return FBResponseWithErrorFormat(@"Can't scroll to element that does not exist"); } + NSError *error; if (![element fb_scrollToVisibleWithError:&error]) { return FBResponseWithError(error); } @@ -478,7 +526,7 @@ + (NSArray *)routes /** Returns gesture coordinate for the application based on absolute coordinate - + @param coordinate absolute screen coordinates @param application the instance of current application under test @shouldApplyOrientationWorkaround whether to apply orientation workaround. This is to @@ -533,5 +581,6 @@ + (XCUICoordinate *)gestureCoordinateWithCoordinate:(CGPoint)coordinate element: XCUICoordinate *appCoordinate = [[XCUICoordinate alloc] initWithElement:element normalizedOffset:CGVectorMake(0, 0)]; return [[XCUICoordinate alloc] initWithCoordinate:appCoordinate pointsOffset:CGVectorMake(coordinate.x, coordinate.y)]; } +#endif // TARGET_OS_IOS @end diff --git a/WebDriverAgentLib/Commands/FBFindElementCommands.m b/WebDriverAgentLib/Commands/FBFindElementCommands.m index 6dd976d97..3c6b96bc7 100644 --- a/WebDriverAgentLib/Commands/FBFindElementCommands.m +++ b/WebDriverAgentLib/Commands/FBFindElementCommands.m @@ -22,14 +22,16 @@ #import "XCUIElement+FBFind.h" #import "XCUIElement+FBIsVisible.h" #import "XCUIElement+FBClassChain.h" +#import "XCUIElement+FBWebDriverAttributes.h" +#import "XCUIApplication+FBFocused.h" static id FBNoSuchElementErrorResponseForRequest(FBRouteRequest *request) { NSDictionary *errorDetails = @{ - @"description": @"unable to find an element", - @"using": request.arguments[@"using"] ?: @"", - @"value": request.arguments[@"value"] ?: @"", - }; + @"description": @"unable to find an element", + @"using": request.arguments[@"using"] ?: @"", + @"value": request.arguments[@"value"] ?: @"", + }; return FBResponseWithStatus(FBCommandStatusNoSuchElement, errorDetails); } @@ -46,7 +48,10 @@ + (NSArray *)routes [[FBRoute POST:@"/element/:uuid/element"] respondWithTarget:self action:@selector(handleFindSubElement:)], [[FBRoute POST:@"/element/:uuid/elements"] respondWithTarget:self action:@selector(handleFindSubElements:)], [[FBRoute GET:@"/wda/element/:uuid/getVisibleCells"] respondWithTarget:self action:@selector(handleFindVisibleCells:)], - ]; +#if TARGET_OS_TV + [[FBRoute GET:@"/wda/element/focused"] respondWithTarget:self action:@selector(handleFindFocusedElement:)], +#endif + ]; } @@ -96,10 +101,19 @@ + (NSArray *)routes XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; NSArray *foundElements = [self.class elementsUsing:request.arguments[@"using"] withValue:request.arguments[@"value"] under:element shouldReturnAfterFirstMatch:NO]; - + return FBResponseWithCachedElements(foundElements, request.session.elementCache, FBConfiguration.shouldUseCompactResponses); } +#if TARGET_OS_TV ++ (id)handleFindFocusedElement:(FBRouteRequest *)request +{ + FBElementCache *elementCache = request.session.elementCache; + id element = [[FBApplication fb_activeApplication] fb_focusedElement]; + return FBResponseWithElementUUID([elementCache storeElement:(XCUIElement *)element]); +} +#endif + #pragma mark - Helpers diff --git a/WebDriverAgentLib/Commands/FBOrientationCommands.m b/WebDriverAgentLib/Commands/FBOrientationCommands.m index dc5a3428b..933885bf2 100644 --- a/WebDriverAgentLib/Commands/FBOrientationCommands.m +++ b/WebDriverAgentLib/Commands/FBOrientationCommands.m @@ -41,7 +41,7 @@ + (NSArray *)routes [[FBRoute POST:@"/orientation"] respondWithTarget:self action:@selector(handleSetOrientation:)], [[FBRoute GET:@"/rotation"] respondWithTarget:self action:@selector(handleGetRotation:)], [[FBRoute POST:@"/rotation"] respondWithTarget:self action:@selector(handleSetRotation:)], - ]; + ]; } @@ -64,18 +64,18 @@ + (NSArray *)routes + (id)handleGetRotation:(FBRouteRequest *)request { - XCUIDevice *device = [XCUIDevice sharedDevice]; - UIDeviceOrientation orientation = device.orientation; - return FBResponseWithStatus(FBCommandStatusNoError, device.fb_rotationMapping[@(orientation)]); + XCUIDevice *device = [XCUIDevice sharedDevice]; + UIDeviceOrientation orientation = device.orientation; + return FBResponseWithStatus(FBCommandStatusNoError, device.fb_rotationMapping[@(orientation)]); } + (id)handleSetRotation:(FBRouteRequest *)request { - FBSession *session = request.session; - if ([self.class setDeviceRotation:request.arguments forApplication:session.application]) { - return FBResponseWithOK(); - } - return FBResponseWithStatus(FBCommandStatusRotationNotAllowed, [NSString stringWithFormat:@"Rotation not supported: %@", request.arguments[@"rotation"]]); + FBSession *session = request.session; + if ([self.class setDeviceRotation:request.arguments forApplication:session.application]) { + return FBResponseWithOK(); + } + return FBResponseWithStatus(FBCommandStatusRotationNotAllowed, [NSString stringWithFormat:@"Rotation not supported: %@", request.arguments[@"rotation"]]); } diff --git a/WebDriverAgentLib/Commands/FBRemoteControlCommands.h b/WebDriverAgentLib/Commands/FBRemoteControlCommands.h new file mode 100644 index 000000000..4ed081478 --- /dev/null +++ b/WebDriverAgentLib/Commands/FBRemoteControlCommands.h @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FBRemoteControlCommands : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Commands/FBRemoteControlCommands.m b/WebDriverAgentLib/Commands/FBRemoteControlCommands.m new file mode 100644 index 000000000..c096fcb58 --- /dev/null +++ b/WebDriverAgentLib/Commands/FBRemoteControlCommands.m @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "FBRemoteControlCommands.h" + +#import + +#import "FBRoute.h" +#import "FBRouteRequest.h" + +@implementation FBRemoteControlCommands + +#pragma mark - + ++ (nonnull NSArray *)routes +{ + return + @[ + [[FBRoute POST:@"/remote/press/:button"].withoutSession respondWithTarget:self action:@selector(handlePress:)], + ]; +} + +#pragma mark - Commands + ++ (id)handlePress:(FBRouteRequest *)request +{ + NSNumber *buttonId = request.parameters[@"button"]; + if([self isValid:buttonId]) { + NSNumber *pressDuration = request.arguments[@"duration"] ?: @0; + [[XCUIRemote sharedRemote] pressButton:buttonId.intValue forDuration: pressDuration.intValue]; + return FBResponseWithOK(); + } else { + return FBResponseWithErrorFormat(@"Incorrect button id. Expected: 0-8."); + } +} + ++ (BOOL) isValid: (NSNumber *) buttonId +{ + if (buttonId) { + return buttonId.intValue >= 0 && buttonId.intValue <= 8; + } else { + return NO; + } +} + +@end diff --git a/WebDriverAgentLib/FBAlert.m b/WebDriverAgentLib/FBAlert.m index 7003852da..1e99a362a 100644 --- a/WebDriverAgentLib/FBAlert.m +++ b/WebDriverAgentLib/FBAlert.m @@ -14,7 +14,7 @@ #import "FBApplication.h" #import "FBErrorBuilder.h" #import "FBFindElementCommands.h" -#import "FBSpringboardApplication.h" +#import "FBHomeboardApplication.h" #import "FBLogger.h" #import "FBXCodeCompatibility.h" #import "XCAXClient_iOS.h" @@ -27,8 +27,11 @@ #import "XCUIElement+FBWebDriverAttributes.h" #import "XCUIElement.h" #import "XCUIElementQuery.h" +#import "XCUIApplication+FBFocused.h" +#import "XCUIElement+FBTVFocuse.h" NSString *const FBAlertObstructingElementException = @"FBAlertObstructingElementException"; +NSString *const FBAlertWindowIdentifier = @"dialogWindow"; @interface XCUIApplication (FBAlert) @@ -58,6 +61,16 @@ - (XCUIElement *)fb_alertElement return alert; } } + +#if TARGET_OS_TV + + alert = self.windows[FBAlertWindowIdentifier]; + if (alert.exists) { + return alert; + } + +#endif + return nil; } @@ -99,6 +112,27 @@ - (NSString *)text [resultText addObject:[NSString stringWithFormat:@"%@", staticText.wdLabel]]; } } +#if TARGET_OS_TV + // System alerts has description text in the text views + NSArray *textList = [alert descendantsMatchingType:XCUIElementTypeTextView].allElementsBoundByIndex; + for (XCUIElement *textView in textList) { + if (textView.wdValue && textView.isWDVisible) { + [resultText addObject:[NSString stringWithFormat:@"%@", textView.wdValue]]; + } + } + + // Application and sheet alerts have text in the other elements, not in the the static text + if (!resultText.count) { + NSArray *otherElements = [alert descendantsMatchingType:XCUIElementTypeOther].allElementsBoundByIndex; + for (XCUIElement *otherElement in otherElements) { + // element should be visible, with text and no children + if (otherElement.wdLabel && otherElement.isWDVisible && ![otherElement descendantsMatchingType:XCUIElementTypeAny].count) { + [resultText addObject:[NSString stringWithFormat:@"%@", otherElement.wdLabel]]; + } + } + } +#endif + if (resultText.count) { return [resultText componentsJoinedByString:@"\n"]; } @@ -113,7 +147,7 @@ - (NSArray *)buttonLabels if (!alertElement) { return nil; } - NSArray *buttons = [alertElement descendantsMatchingType:XCUIElementTypeButton].allElementsBoundByIndex; + NSArray *buttons = [self alertButtons]; for(XCUIElement *button in buttons) { [value addObject:[button wdLabel]]; } @@ -123,7 +157,7 @@ - (NSArray *)buttonLabels - (BOOL)acceptWithError:(NSError **)error { XCUIElement *alertElement = self.alertElement; - NSArray *buttons = [alertElement descendantsMatchingType:XCUIElementTypeButton].allElementsBoundByIndex; + NSArray *buttons = [self alertButtons]; XCUIElement *defaultButton; if (alertElement.elementType == XCUIElementTypeAlert) { @@ -137,14 +171,14 @@ - (BOOL)acceptWithError:(NSError **)error withDescriptionFormat:@"Failed to find accept button for alert: %@", alertElement] buildError:error]; } - return [defaultButton fb_tapWithError:error]; + return [self submitAlertButton:defaultButton withError:error]; } - (BOOL)dismissWithError:(NSError **)error { XCUIElement *cancelButton; XCUIElement *alertElement = self.alertElement; - NSArray *buttons = [alertElement descendantsMatchingType:XCUIElementTypeButton].allElementsBoundByIndex; + NSArray *buttons = [self alertButtons]; if (alertElement.elementType == XCUIElementTypeAlert) { cancelButton = buttons.firstObject; @@ -158,13 +192,14 @@ - (BOOL)dismissWithError:(NSError **)error buildError:error]; return NO; } - return [cancelButton fb_tapWithError:error]; + return [self submitAlertButton:cancelButton withError:error]; } -- (BOOL)clickAlertButton:(NSString *)label error:(NSError **)error { +- (BOOL)clickAlertButton:(NSString *)label error:(NSError **)error +{ XCUIElement *alertElement = self.alertElement; - NSArray *buttons = [alertElement descendantsMatchingType:XCUIElementTypeButton].allElementsBoundByIndex; + NSArray *buttons = [self alertButtons]; XCUIElement *requestedButton; for(XCUIElement *button in buttons) { @@ -180,8 +215,7 @@ - (BOOL)clickAlertButton:(NSString *)label error:(NSError **)error { withDescriptionFormat:@"Failed to find button with label %@ for alert: %@", label, alertElement] buildError:error]; } - - return [requestedButton fb_tapWithError:error]; + return [self submitAlertButton:requestedButton withError:error]; } + (BOOL)isElementObstructedByAlertView:(XCUIElement *)element alert:(XCUIElement *)alert @@ -220,9 +254,40 @@ + (BOOL)isElementObstructedByAlertView:(XCUIElement *)element alert:(XCUIElement return elementBox.copy; } +- (NSArray *)alertButtons +{ + XCUIElement *alertElement = self.alertElement; + NSArray *buttons = [alertElement descendantsMatchingType:XCUIElementTypeButton].allElementsBoundByIndex; +#if TARGET_OS_IOS + return buttons; +#elif TARGET_OS_TV + if ([self isAnyFocused:buttons]) { + return buttons; + } + + // Focusable button elements on some alerts has type XCUIElementTypeOther + NSMutableArray *buttonsName = [NSMutableArray array]; + [buttons enumerateObjectsUsingBlock:^(XCUIElement *element, NSUInteger idx, BOOL *stop) { + NSString *name = element.wdName; + [buttonsName addObject:name]; + }]; + + NSMutableArray *buttonsAlt = [NSMutableArray array]; + [buttonsName enumerateObjectsUsingBlock:^(NSString *name, NSUInteger idx, BOOL *stop) { + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"type == 'XCUIElementTypeOther' AND name == %@", name]; + NSArray *matchedElements = [alertElement fb_descendantsMatchingPredicate:predicate shouldReturnAfterFirstMatch:YES]; + [buttonsAlt addObjectsFromArray:matchedElements]; + }]; + if (![self isAnyFocused:buttonsAlt]) { + NSLog(@"FAIL"); + } + return buttonsAlt; +#endif +} + - (XCUIElement *)alertElement { - XCUIElement *alert = self.application.fb_alertElement ?: [FBSpringboardApplication fb_springboard].fb_alertElement; + XCUIElement *alert = self.application.fb_alertElement ?: [FBApplication fb_activeApplication].fb_alertElement; if (!alert.exists) { return nil; } @@ -230,4 +295,28 @@ - (XCUIElement *)alertElement return alert; } +- (BOOL) submitAlertButton: (XCUIElement *) button withError:(NSError **) error +{ +#if TARGET_OS_IOS + return [button fb_tapWithError:error]; +#elif TARGET_OS_TV + return [button fb_selectWithError:error]; +#endif +} + +#pragma mark - Utilities + +#if TARGET_OS_TV + +- (BOOL) isAnyFocused:(NSArray *) elements { + for(XCUIElement *element in elements) { + if(element.hasFocus == YES) { + return YES; + } + } + return NO; +} + +#endif + @end diff --git a/WebDriverAgentLib/FBHomeboardApplication.h b/WebDriverAgentLib/FBHomeboardApplication.h new file mode 100644 index 000000000..d5d1048be --- /dev/null +++ b/WebDriverAgentLib/FBHomeboardApplication.h @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! Bundle identifier of Springboard app on iOS and Headeboard on tvOS */ +extern NSString *const HOMEBOARD_BUNDLE_ID; + +@interface FBHomeboardApplication : FBApplication + +/** + @return FBApplication that is attached to SpringBoard(HeadBoard) + */ ++ (instancetype)fb_homeboard; + +/** + Opens application on SpringBoard(HeadBoard) app with given identifier + + @param identifier identifier of the application to tap + @param error If there is an error, upon return contains an NSError object that describes the problem. + @return YES if the operation succeeds, otherwise NO. + */ +- (BOOL)fb_openApplicationWithIdentifier:(NSString *)identifier error:(NSError **)error; + +/** + Waits until application board is visible with timeout + + @param error If there is an error, upon return contains an NSError object that describes the problem. + @return YES if the operation succeeds, otherwise NO. + */ +- (BOOL)fb_waitUntilApplicationBoardIsVisible:(NSError **)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/FBSpringboardApplication.m b/WebDriverAgentLib/FBHomeboardApplication.m similarity index 51% rename from WebDriverAgentLib/FBSpringboardApplication.m rename to WebDriverAgentLib/FBHomeboardApplication.m index 3541f0639..0e20cd59f 100644 --- a/WebDriverAgentLib/FBSpringboardApplication.m +++ b/WebDriverAgentLib/FBHomeboardApplication.m @@ -7,7 +7,7 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import "FBSpringboardApplication.h" +#import "FBHomeboardApplication.h" #import "FBErrorBuilder.h" #import "FBMathUtils.h" @@ -19,54 +19,73 @@ #import "XCUIElement+FBUtilities.h" #import "XCUIElement+FBTap.h" #import "XCUIElement+FBScrolling.h" +#import "XCUIElement+FBTVFocuse.h" #import "XCUIElement.h" #import "XCUIElementQuery.h" +#import "FBLogger.h" -NSString *const SPRINGBOARD_BUNDLE_ID = @"com.apple.springboard"; +#if TARGET_OS_IOS +NSString *const HOMEBOARD_BUNDLE_ID = @"com.apple.springboard"; +#elif TARGET_OS_TV +NSString *const HOMEBOARD_BUNDLE_ID = @"com.apple.HeadBoard"; +#endif -@implementation FBSpringboardApplication +@implementation FBHomeboardApplication -+ (instancetype)fb_springboard ++ (instancetype)fb_homeboard { - static FBSpringboardApplication *_springboardApp; + static FBHomeboardApplication *_homeboardApp; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - _springboardApp = [[FBSpringboardApplication alloc] initPrivateWithPath:nil bundleID:SPRINGBOARD_BUNDLE_ID]; + _homeboardApp = [[FBHomeboardApplication alloc] initPrivateWithPath:nil bundleID:HOMEBOARD_BUNDLE_ID]; }); - [_springboardApp query]; - [_springboardApp resolve]; - return _springboardApp; + [_homeboardApp query]; + _homeboardApp.safeQueryResolutionEnabled = YES; + [_homeboardApp resolve]; + return _homeboardApp; } +- (BOOL)fb_openApplicationWithIdentifier:(NSString *)identifier error:(NSError **)error +{ +#if TARGET_OS_IOS + return [self fb_tapApplicationWithIdentifier:identifier error:error]; +#else + return [self fb_selectApplicationWithIdentifier:identifier error:error]; +#endif +} + +#if TARGET_OS_IOS + - (BOOL)fb_tapApplicationWithIdentifier:(NSString *)identifier error:(NSError **)error { XCUIElementQuery *appElementsQuery = [[self descendantsMatchingType:XCUIElementTypeIcon] matchingIdentifier:identifier]; NSArray *matchedAppElements = [appElementsQuery allElementsBoundByIndex]; if (0 == matchedAppElements.count) { return [[[FBErrorBuilder builder] - withDescriptionFormat:@"Cannot locate Springboard icon for '%@' application", identifier] - buildError:error]; + withDescriptionFormat:@"Cannot locate Springboard icon for '%@' application", identifier] + buildError:error]; } // Select the most recent installed application if there are multiple matches XCUIElement *appElement = [matchedAppElements lastObject]; if (!appElement.fb_isVisible) { CGRect startFrame = appElement.frame; - BOOL shouldSwipeToTheRight = startFrame.origin.x < 0; NSString *errorDescription = [NSString stringWithFormat:@"Cannot scroll to Springboard icon for '%@' application", identifier]; + BOOL shouldSwipeToTheRight = startFrame.origin.x < 0; do { if (shouldSwipeToTheRight) { [self swipeRight]; } else { [self swipeLeft]; } + BOOL isSwipeSuccessful = [appElement fb_waitUntilFrameIsStable] && - [[[[FBRunLoopSpinner new] - timeout:1] - timeoutErrorMessage:errorDescription] - spinUntilTrue:^BOOL{ - return !FBRectFuzzyEqualToRect(startFrame, appElement.frame, FBDefaultFrameFuzzyThreshold); - } - error:error]; + [[[[FBRunLoopSpinner new] + timeout:1] + timeoutErrorMessage:errorDescription] + spinUntilTrue:^BOOL{ + return !FBRectFuzzyEqualToRect(startFrame, appElement.frame, FBDefaultFrameFuzzyThreshold); + } + error:error]; if (!isSwipeSuccessful) { return NO; } @@ -82,10 +101,40 @@ - (BOOL)fb_tapApplicationWithIdentifier:(NSString *)identifier error:(NSError ** spinUntilTrue:^BOOL{ FBApplication *activeApp = [FBApplication fb_activeApplication]; return activeApp && - activeApp.processID != self.processID && + activeApp.processID != self.processID && + activeApp.fb_isVisible; + } error:error]; +} + +#elif TARGET_OS_TV + +- (BOOL)fb_selectApplicationWithIdentifier:(NSString *)identifier error:(NSError **)error +{ + XCUIElementQuery *appElementsQuery = [[self descendantsMatchingType:XCUIElementTypeIcon] matchingIdentifier:identifier]; + NSArray *matchedAppElements = [appElementsQuery allElementsBoundByIndex]; + if (0 == matchedAppElements.count) { + return [[[FBErrorBuilder builder] + withDescriptionFormat:@"Cannot locate Headboard icon for '%@' application", identifier] + buildError:error]; + } + // Select the most recent installed application if there are multiple matches + XCUIElement *appElement = [matchedAppElements lastObject]; + if (![appElement fb_selectWithError:error]) { + return NO; + } + [[XCUIRemote sharedRemote] pressButton: XCUIRemoteButtonSelect]; + return + [[[[FBRunLoopSpinner new] + interval:0.3] + timeoutErrorMessage:@"Timeout waiting for application to activate"] + spinUntilTrue:^BOOL{ + FBApplication *activeApp = [FBApplication fb_activeApplication]; + return activeApp && + activeApp.processID != self.processID && activeApp.fb_isVisible; } error:error]; } +#endif - (BOOL)fb_waitUntilApplicationBoardIsVisible:(NSError **)error { @@ -101,9 +150,13 @@ - (BOOL)fb_waitUntilApplicationBoardIsVisible:(NSError **)error - (BOOL)fb_isApplicationBoardVisible { [self resolve]; +#if TARGET_OS_IOS // the dock (and other icons) don't seem to be consistently reported as // visible. esp on iOS 11 but also on 10.3.3 return self.otherElements[@"Dock"].isEnabled; +#elif TARGET_OS_TV + return self.collectionViews[@"GridCollectionView"].isEnabled; +#endif } @end diff --git a/WebDriverAgentLib/FBSpringboardApplication.h b/WebDriverAgentLib/FBSpringboardApplication.h index 7de642a5b..8ac8dc36b 100644 --- a/WebDriverAgentLib/FBSpringboardApplication.h +++ b/WebDriverAgentLib/FBSpringboardApplication.h @@ -14,12 +14,14 @@ NS_ASSUME_NONNULL_BEGIN /*! Bundle identifier of Springboard app */ extern NSString *const SPRINGBOARD_BUNDLE_ID; -@interface FBSpringboardApplication : FBApplication +@interface FBHomeboardApplication : FBApplication /** @return FBApplication that is attached to SpringBoard */ -+ (instancetype)fb_springboard; ++ (instancetype)fb_homeboard; + +#if TARGET_OS_IOS /** Taps application on SpringBoard app with given identifier @@ -30,6 +32,19 @@ extern NSString *const SPRINGBOARD_BUNDLE_ID; */ - (BOOL)fb_tapApplicationWithIdentifier:(NSString *)identifier error:(NSError **)error; +#elif TARGET_OS_TV + +/** + Taps application on SpringBoard app with given identifier + + @param identifier identifier of the application to tap + @param error If there is an error, upon return contains an NSError object that describes the problem. + @return YES if the operation succeeds, otherwise NO. + */ +- (BOOL)fb_selectApplicationWithIdentifier:(NSString *)identifier error:(NSError **)error; + +#endif + /** Waits until application board is visible with timeout diff --git a/WebDriverAgentLib/Routing/FBElement.h b/WebDriverAgentLib/Routing/FBElement.h index 64662e1d5..40f4695db 100644 --- a/WebDriverAgentLib/Routing/FBElement.h +++ b/WebDriverAgentLib/Routing/FBElement.h @@ -50,6 +50,13 @@ NS_ASSUME_NONNULL_BEGIN /*! Whether element is an accessibility container (contains children of any depth that are accessible) */ @property (nonatomic, readonly, getter = isWDAccessibilityContainer) BOOL wdAccessibilityContainer; +#if TARGET_OS_TV + +/*! Whether element is focused */ +@property (nonatomic, readonly, getter = isWDFocused) BOOL wdFocused; + +#endif + /** Returns value of given property specified in WebDriver Spec Check the FBElement protocol to get list of supported attributes. diff --git a/WebDriverAgentLib/Routing/FBElementUtils.h b/WebDriverAgentLib/Routing/FBElementUtils.h index cc06a9e3b..8689e89a1 100644 --- a/WebDriverAgentLib/Routing/FBElementUtils.h +++ b/WebDriverAgentLib/Routing/FBElementUtils.h @@ -9,6 +9,7 @@ #import #import +#import "XCAccessibilityElement.h" NS_ASSUME_NONNULL_BEGIN @@ -46,6 +47,13 @@ extern NSString *const FBUnknownAttributeException; */ + (NSDictionary *)wdAttributeNamesMapping; +/** + Gets the unique identifier of the particular XCAccessibilityElement instance. + + @param element accessiblity element instance + @return the unique element identifier + */ ++ (NSString *)uidWithAccessibilityElement:(XCAccessibilityElement *)element; @end NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Routing/FBElementUtils.m b/WebDriverAgentLib/Routing/FBElementUtils.m index 41f3fc600..059cf60c0 100644 --- a/WebDriverAgentLib/Routing/FBElementUtils.m +++ b/WebDriverAgentLib/Routing/FBElementUtils.m @@ -109,4 +109,25 @@ + (NSString *)wdAttributeNameForAttributeName:(NSString *)name return attributeNamesMapping.copy; } +static BOOL FBShouldUsePayloadForUIDExtraction = YES; +static dispatch_once_t oncePayloadToken; ++ (NSString *)uidWithAccessibilityElement:(XCAccessibilityElement *)element +{ + dispatch_once(&oncePayloadToken, ^{ + FBShouldUsePayloadForUIDExtraction = [element respondsToSelector:@selector(payload)]; + }); + unsigned long long elementId; + if (FBShouldUsePayloadForUIDExtraction) { + elementId = [[element.payload objectForKey:@"uid.elementID"] longLongValue]; + } else { + elementId = [[element valueForKey:@"_elementID"] longLongValue]; + } + int processId = element.processIdentifier; + uint8_t b[16] = {0}; + memcpy(b, &elementId, sizeof(long long)); + memcpy(b + sizeof(long long), &processId, sizeof(int)); + NSUUID *uuidValue = [[NSUUID alloc] initWithUUIDBytes:b]; + return uuidValue.UUIDString; +} + @end diff --git a/WebDriverAgentLib/Routing/FBSession.m b/WebDriverAgentLib/Routing/FBSession.m index cc8006c89..7314ece70 100644 --- a/WebDriverAgentLib/Routing/FBSession.m +++ b/WebDriverAgentLib/Routing/FBSession.m @@ -15,7 +15,7 @@ #import "FBApplication.h" #import "FBElementCache.h" #import "FBMacros.h" -#import "FBSpringboardApplication.h" +#import "FBHomeboardApplication.h" #import "XCAccessibilityElement.h" #import "XCAXClient_iOS.h" #import "XCUIElement.h" diff --git a/WebDriverAgentLib/Utilities/FBKeyboard.m b/WebDriverAgentLib/Utilities/FBKeyboard.m index f26dcb5ad..c7f13c72a 100644 --- a/WebDriverAgentLib/Utilities/FBKeyboard.m +++ b/WebDriverAgentLib/Utilities/FBKeyboard.m @@ -33,7 +33,7 @@ + (BOOL)typeText:(NSString *)text error:(NSError **)error + (BOOL)typeText:(NSString *)text frequency:(NSUInteger)frequency error:(NSError **)error { - if (![FBKeyboard waitUntilVisibleWithError:error]) { + if (![FBKeyboard waitUntilStableWithError:error]) { return NO; } __block BOOL didSucceed = NO; @@ -54,11 +54,15 @@ + (BOOL)typeText:(NSString *)text frequency:(NSUInteger)frequency error:(NSError return didSucceed; } -+ (BOOL)waitUntilVisibleWithError:(NSError **)error ++ (BOOL)waitUntilStableWithError:(NSError **)error { - FBApplication *application = [FBApplication fb_activeApplication]; + FBApplication *app = [FBApplication fb_activeApplication]; - if (![application fb_waitUntilFrameIsStable]) { + if (![FBKeyboard waitUntilVisibleForApplication:app timeout:3 error:error]) { + return NO; + } + + if (![app fb_waitUntilFrameIsStable]) { return [[[FBErrorBuilder builder] withDescription:@"Timeout waiting for keybord to stop animating"] @@ -67,4 +71,21 @@ + (BOOL)waitUntilVisibleWithError:(NSError **)error return YES; } ++ (BOOL)waitUntilVisibleForApplication:(XCUIApplication *)app timeout:(NSTimeInterval)timeout error:(NSError **)error +{ + BOOL (^keyboardIsVisible)(void) = ^BOOL(void) { + XCUIElement *keyboard = [app descendantsMatchingType:XCUIElementTypeKeyboard].fb_firstMatch; + return keyboard && keyboard.fb_isVisible; + }; + if (timeout <= 0) { + return keyboardIsVisible(); + } + return + [[[[FBRunLoopSpinner new] + timeout:timeout] + timeoutErrorMessage:@"Keyboard is not present"] + spinUntilTrue:keyboardIsVisible + error:error]; +} + @end diff --git a/WebDriverAgentLib/Utilities/FBMathUtils.h b/WebDriverAgentLib/Utilities/FBMathUtils.h index d820c836a..886449af1 100644 --- a/WebDriverAgentLib/Utilities/FBMathUtils.h +++ b/WebDriverAgentLib/Utilities/FBMathUtils.h @@ -28,8 +28,10 @@ BOOL FBSizeFuzzyEqualToSize(CGSize size1, CGSize size2, CGFloat threshold); /*! Returns whether rect are equal within given threshold */ BOOL FBRectFuzzyEqualToRect(CGRect rect1, CGRect rect2, CGFloat threshold); +#if !TARGET_OS_TV /*! Inverts point if necessary to match location on screen */ CGPoint FBInvertPointForApplication(CGPoint point, CGSize screenSize, UIInterfaceOrientation orientation); /*! Inverts size if necessary to match current screen orientation */ CGSize FBAdjustDimensionsForApplication(CGSize actualSize, UIInterfaceOrientation orientation); +#endif diff --git a/WebDriverAgentLib/Utilities/FBMathUtils.m b/WebDriverAgentLib/Utilities/FBMathUtils.m index 9080ee8c7..ecf26b44d 100644 --- a/WebDriverAgentLib/Utilities/FBMathUtils.m +++ b/WebDriverAgentLib/Utilities/FBMathUtils.m @@ -38,6 +38,7 @@ BOOL FBRectFuzzyEqualToRect(CGRect rect1, CGRect rect2, CGFloat threshold) FBSizeFuzzyEqualToSize(rect1.size, rect2.size, threshold); } +#if !TARGET_OS_TV CGPoint FBInvertPointForApplication(CGPoint point, CGSize screenSize, UIInterfaceOrientation orientation) { switch (orientation) { @@ -58,7 +59,7 @@ CGSize FBAdjustDimensionsForApplication(CGSize actualSize, UIInterfaceOrientatio if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { /* There is an XCTest bug that application.frame property returns exchanged dimensions for landscape mode. - This verification is just to make sure the bug is still there (since height is never greater than width in landscape) + This verification is just to make sure the bug is still there (since height is never greater than width in landscape) and to make it still working properly after XCTest itself starts to respect landscape mode. */ if (actualSize.height > actualSize.width) { @@ -67,3 +68,4 @@ This verification is just to make sure the bug is still there (since height is n } return actualSize; } +#endif diff --git a/WebDriverAgentLib/Utilities/FBTVNavigationTracker.h b/WebDriverAgentLib/Utilities/FBTVNavigationTracker.h new file mode 100644 index 000000000..0e8fabf59 --- /dev/null +++ b/WebDriverAgentLib/Utilities/FBTVNavigationTracker.h @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import +#import "FBElement.h" + +typedef NS_ENUM(NSUInteger, FBTVDirection) { + FBTVDirectionUp = 0, + FBTVDirectionDown = 1, + FBTVDirectionLeft = 2, + FBTVDirectionRight = 3, + FBTVDirectionNone = 4 +}; + +NS_ASSUME_NONNULL_BEGIN + +@interface FBTVNavigationTracker : NSObject + ++(instancetype)trackerWithTargetElement: (id) targetElement; + +-(FBTVDirection)directionToMoveFocuse; + +@end + +NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Utilities/FBTVNavigationTracker.m b/WebDriverAgentLib/Utilities/FBTVNavigationTracker.m new file mode 100644 index 000000000..10dc4c67d --- /dev/null +++ b/WebDriverAgentLib/Utilities/FBTVNavigationTracker.m @@ -0,0 +1,144 @@ +/** + * Copyright (c) 2018-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "FBTVNavigationTracker.h" + +#import "FBApplication.h" +#import "FBMathUtils.h" +#import "XCUIApplication+FBFocused.h" +#import "XCUIElement+FBUtilities.h" +#import "XCUIElement+FBWebDriverAttributes.h" + +@interface FBTVNavigationItem : NSObject +@property (nonatomic, assign) NSUInteger uid; +@property (nonatomic, strong) NSMutableSet* directions; + ++ (instancetype)itemWithUid:(NSUInteger) uid; +@end + +@implementation FBTVNavigationItem + ++ (instancetype)itemWithUid:(NSUInteger) uid +{ + return [[FBTVNavigationItem alloc] initWithUid:uid]; +} + +- (instancetype)initWithUid:(NSUInteger) uid +{ + self = [super init]; + if(self) { + _uid = uid; + _directions = [NSMutableSet set]; + } + return self; +} + +@end + +@interface FBTVNavigationTracker () +@property (nonatomic, strong) id targetElement; +@property (nonatomic, assign) CGPoint targetCenter; +@property (nonatomic, strong) NSMutableDictionary* navigationItems; +@end + +@implementation FBTVNavigationTracker + ++ (instancetype)trackerWithTargetElement:(id)targetElement +{ + FBTVNavigationTracker *tracker = [[FBTVNavigationTracker alloc] initWithTargetElement:targetElement]; + tracker.targetElement = targetElement; + return tracker; +} + +- (instancetype)initWithTargetElement:(id)targetElement +{ + self = [super init]; + if(self) { + _targetElement = targetElement; + _targetCenter = FBRectGetCenter(targetElement.wdFrame); + _navigationItems = [NSMutableDictionary dictionary]; + } + return self; +} + +- (FBTVDirection)directionToMoveFocuse +{ + id focused = self.focusedElement; + CGPoint focusedCenter = FBRectGetCenter(focused.wdFrame); + FBTVNavigationItem *item = [self navigationItemFromElement:focused]; + CGFloat yDelta = self.targetCenter.y - focusedCenter.y; + CGFloat xDelta = self.targetCenter.x - focusedCenter.x; + FBTVDirection direction; + if(fabs(yDelta) > fabs(xDelta)) { + direction = [self getVerticalDirectionForItem:item withDelta:yDelta]; + if (direction == FBTVDirectionNone) { + direction = [self getHorizontalDirectionForItem:item withDelta:xDelta]; + } + } else { + direction = [self getHorizontalDirectionForItem:item withDelta:xDelta]; + if (direction == FBTVDirectionNone) { + direction = [self getVerticalDirectionForItem:item withDelta:yDelta]; + } + } + + return direction; +} + +#pragma mark - Utilities +- (id)focusedElement +{ + return [FBApplication fb_activeApplication].fb_focusedElement; +} + +-(FBTVNavigationItem*) navigationItemFromElement:(id)element + +{ + NSNumber *key = [NSNumber numberWithUnsignedInteger:element.wdUID]; + FBTVNavigationItem* item = [self.navigationItems objectForKey: key]; + if(item) { + return item; + } + item = [FBTVNavigationItem itemWithUid:element.wdUID]; + [self.navigationItems setObject:item forKey:key]; + return item; +} + +- (FBTVDirection)getHorizontalDirectionForItem:(FBTVNavigationItem *)item withDelta:(CGFloat)delta { + if (delta > 0) { + if(![item.directions containsObject: [NSNumber numberWithInteger: FBTVDirectionRight]]) { + [item.directions addObject: [NSNumber numberWithInteger: FBTVDirectionRight]]; + return FBTVDirectionRight; + } + } + if (delta < 0) { + if(![item.directions containsObject: [NSNumber numberWithInteger: FBTVDirectionLeft]]) { + [item.directions addObject: [NSNumber numberWithInteger: FBTVDirectionLeft]]; + return FBTVDirectionLeft; + } + } + return FBTVDirectionNone; +} + +- (FBTVDirection)getVerticalDirectionForItem:(FBTVNavigationItem *)item withDelta:(CGFloat)delta { + if (delta > 0) { + if(![item.directions containsObject: [NSNumber numberWithInteger: FBTVDirectionDown]]) { + [item.directions addObject: [NSNumber numberWithInteger: FBTVDirectionDown]]; + return FBTVDirectionDown; + } + } + if (delta < 0) { + if(![item.directions containsObject: [NSNumber numberWithInteger: FBTVDirectionUp]]) { + [item.directions addObject: [NSNumber numberWithInteger: FBTVDirectionUp]]; + return FBTVDirectionUp; + } + } + return FBTVDirectionNone; +} + +@end diff --git a/WebDriverAgentLib/Utilities/FBXPath.m b/WebDriverAgentLib/Utilities/FBXPath.m index 31428b059..ba77907b3 100644 --- a/WebDriverAgentLib/Utilities/FBXPath.m +++ b/WebDriverAgentLib/Utilities/FBXPath.m @@ -55,6 +55,14 @@ @interface FBVisibleAttribute : FBElementAttribute @end +#if TARGET_OS_TV + +@interface FBFocusedAttribute : FBElementAttribute + +@end + +#endif + @interface FBDimensionAttribute : FBElementAttribute @end @@ -386,6 +394,9 @@ + (int)recordWithWriter:(xmlTextWriterPtr)writer forElement:(id)eleme FBLabelAttribute.class, FBEnabledAttribute.class, FBVisibleAttribute.class, +#if TARGET_OS_TV + FBFocusedAttribute.class, +#endif FBXAttribute.class, FBYAttribute.class, FBWidthAttribute.class, @@ -484,6 +495,24 @@ + (NSString *)valueForElement:(id)element @end +#if TARGET_OS_TV + +@implementation FBFocusedAttribute + ++ (NSString *)name +{ + return @"focused"; +} + ++ (NSString *)valueForElement:(id)element +{ + return element.wdFocused ? @"true" : @"false"; +} + +@end + +#endif + @implementation FBDimensionAttribute + (NSString *)valueForElement:(id)element diff --git a/WebDriverAgentLib/WebDriverAgentLib.h b/WebDriverAgentLib/WebDriverAgentLib.h index 1c0fee077..aca8dc794 100644 --- a/WebDriverAgentLib/WebDriverAgentLib.h +++ b/WebDriverAgentLib/WebDriverAgentLib.h @@ -39,8 +39,7 @@ FOUNDATION_EXPORT const unsigned char WebDriverAgentLib_VersionString[]; #import #import #import -#import -#import +#import #import #import #import diff --git a/WebDriverAgentTests/IntegrationApp/Resources/Base.lproj/Main.storyboard b/WebDriverAgentTests/IntegrationApp/Resources/Base.lproj/Main.storyboard index 71b1fea07..994b7e2fb 100644 --- a/WebDriverAgentTests/IntegrationApp/Resources/Base.lproj/Main.storyboard +++ b/WebDriverAgentTests/IntegrationApp/Resources/Base.lproj/Main.storyboard @@ -1,12 +1,11 @@ - + - - + @@ -64,7 +63,7 @@