From 6286898a5fee6439cd1b5fd069d4944e1a351471 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Thu, 19 Jul 2018 19:00:32 +0300 Subject: [PATCH 01/81] added new schemes for tvOS --- WebDriverAgent.xcodeproj/project.pbxproj | 790 +++++++++++++++++- .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/WebDriverAgentLib.xcscheme | 4 +- .../WebDriverAgentRunner-nodebug.xcscheme | 4 +- .../xcschemes/WebDriverAgentRunner.xcscheme | 4 +- 5 files changed, 800 insertions(+), 10 deletions(-) create mode 100644 WebDriverAgent.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index e0b534a86..4c88e5303 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -8,6 +8,258 @@ /* Begin PBXBuildFile section */ 18033EFF208761FC00FED81D /* RoutingHTTPServer.framework in Copy frameworks */ = {isa = PBXBuildFile; fileRef = AD42DD2B1CF1238500806E5D /* RoutingHTTPServer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1C8F1A242100A3F900F6FEF4 /* UITestingUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7FD1CAEE048008C271F /* UITestingUITests.m */; }; + 1C8F1A292100A3F900F6FEF4 /* RoutingHTTPServer.framework in Copy frameworks */ = {isa = PBXBuildFile; fileRef = AD42DD2B1CF1238500806E5D /* RoutingHTTPServer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 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 */; }; + 1C8F1A492100B24400F6FEF4 /* XCUIDevice+FBRotation.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE3763E1D59F81400ED88DD /* XCUIDevice+FBRotation.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 /* FBSpringboardApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC088EB1CB5706D00B65968 /* FBSpringboardApplication.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 */; }; + 1C8F1A532100B24400F6FEF4 /* FBTouchIDCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7631CAEDF0C008C271F /* FBTouchIDCommands.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 */; }; + 1C8F1A572100B24400F6FEF4 /* FBOrientationCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB75D1CAEDF0C008C271F /* FBOrientationCommands.m */; }; + 1C8F1A582100B24400F6FEF4 /* XCUICoordinate+FBFix.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC9EED520064FAA00BC0D5B /* XCUICoordinate+FBFix.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 */; }; + 1C8F1A642100B24400F6FEF4 /* FBAlertViewCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7511CAEDF0C008C271F /* FBAlertViewCommands.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 */; }; + 1C8F1A762100B24400F6FEF4 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7174AF031D9D39AF008C8AD5 /* libxml2.tbd */; }; + 1C8F1A772100B24400F6FEF4 /* RoutingHTTPServer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD42DD2B1CF1238500806E5D /* RoutingHTTPServer.framework */; }; + 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, ); }; }; + 1C8F1A862100B24400F6FEF4 /* FBTouchIDCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7621CAEDF0C008C271F /* FBTouchIDCommands.h */; }; + 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, ); }; }; + 1C8F1A8A2100B24400F6FEF4 /* FBOrientationCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB75C1CAEDF0C008C271F /* FBOrientationCommands.h */; }; + 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, ); }; }; + 1C8F1AA32100B24400F6FEF4 /* XCUICoordinate+FBFix.h in Headers */ = {isa = PBXBuildFile; fileRef = EEC9EED420064FAA00BC0D5B /* XCUICoordinate+FBFix.h */; }; + 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 /* FBSpringboardApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = EEC088EA1CB5706D00B65968 /* FBSpringboardApplication.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, ); }; }; + 1C8F1AEC2100B24400F6FEF4 /* FBAlertViewCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7501CAEDF0C008C271F /* FBAlertViewCommands.h */; }; + 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, ); }; }; + 1C8F1B082100B24400F6FEF4 /* XCUIDevice+FBRotation.h in Headers */ = {isa = PBXBuildFile; fileRef = EEE3763D1D59F81400ED88DD /* XCUIDevice+FBRotation.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 */; }; + 1C8F1B2D2100B24400F6FEF4 /* RoutingHTTPServer.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = AD42DD2B1CF1238500806E5D /* RoutingHTTPServer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1C8F1B352100B3FF00F6FEF4 /* WebDriverAgentLib_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; }; + 1C8F1B362100B42A00F6FEF4 /* WebDriverAgentLib_tvOS.framework in Copy frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 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 */; }; 7119E1EC1E891F8600D0B125 /* FBPickerWheelSelectTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7119E1EB1E891F8600D0B125 /* FBPickerWheelSelectTests.m */; }; @@ -325,6 +577,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 1C8F1B332100B3EE00F6FEF4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; + remoteInfo = WebDriverAgentLib_tvOS; + }; AD8D96F01D3C12960061268E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; @@ -384,6 +643,29 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + 1C8F1A282100A3F900F6FEF4 /* Copy frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 1C8F1B362100B42A00F6FEF4 /* WebDriverAgentLib_tvOS.framework in Copy frameworks */, + 1C8F1A292100A3F900F6FEF4 /* RoutingHTTPServer.framework in Copy frameworks */, + ); + name = "Copy frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 1C8F1B2C2100B24400F6FEF4 /* Copy Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 1C8F1B2D2100B24400F6FEF4 /* RoutingHTTPServer.framework in Copy Frameworks */, + ); + name = "Copy Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; EE93CFF41CCA501300708122 /* Copy frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -410,6 +692,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 1C8F1A2E2100A3F900F6FEF4 /* WebDriverAgentRunner_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebDriverAgentRunner_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebDriverAgentLib_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; 711084431DA3AA7500F913D6 /* FBXPath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBXPath.m; sourceTree = ""; }; @@ -742,6 +1026,23 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 1C8F1A252100A3F900F6FEF4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C8F1B352100B3FF00F6FEF4 /* WebDriverAgentLib_tvOS.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C8F1A752100B24400F6FEF4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C8F1A762100B24400F6FEF4 /* libxml2.tbd in Frameworks */, + 1C8F1A772100B24400F6FEF4 /* RoutingHTTPServer.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EE158A951CBD452B00A3E3F0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -843,6 +1144,8 @@ EE9B75EC1CF7956C00275851 /* IntegrationTests_1.xctest */, EE5095FE1EBCC9090028E2FE /* IntegrationTests_2.xctest */, EE22021C1ECC612200A29571 /* IntegrationTests_3.xctest */, + 1C8F1A2E2100A3F900F6FEF4 /* WebDriverAgentRunner_tvOS.xctest */, + 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */, ); name = Products; sourceTree = ""; @@ -1338,6 +1641,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 */, + 1C8F1A862100B24400F6FEF4 /* FBTouchIDCommands.h in Headers */, + 1C8F1A872100B24400F6FEF4 /* XCUIApplication.h in Headers */, + 1C8F1A882100B24400F6FEF4 /* FBCustomCommands.h in Headers */, + 1C8F1A892100B24400F6FEF4 /* _XCTestCaseInterruptionException.h in Headers */, + 1C8F1A8A2100B24400F6FEF4 /* FBOrientationCommands.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 */, + 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 */, + 1C8F1AA02100B24400F6FEF4 /* XCUIElementHitPointCoordinate.h in Headers */, + 1C8F1AA12100B24400F6FEF4 /* XCTDarwinNotificationExpectation.h in Headers */, + 1C8F1AA22100B24400F6FEF4 /* XCTRunnerAutomationSession.h in Headers */, + 1C8F1AA32100B24400F6FEF4 /* XCUICoordinate+FBFix.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 */, + 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 /* FBSpringboardApplication.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 */, + 1C8F1AEC2100B24400F6FEF4 /* FBAlertViewCommands.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 */, + 1C8F1B082100B24400F6FEF4 /* XCUIDevice+FBRotation.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; @@ -1525,6 +2012,44 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 1C8F1A202100A3F900F6FEF4 /* WebDriverAgentRunner_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1C8F1A2B2100A3F900F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentRunner_tvOS" */; + buildPhases = ( + 1C8F1A232100A3F900F6FEF4 /* Sources */, + 1C8F1A252100A3F900F6FEF4 /* Frameworks */, + 1C8F1A272100A3F900F6FEF4 /* Resources */, + 1C8F1A282100A3F900F6FEF4 /* Copy frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 1C8F1B342100B3EE00F6FEF4 /* PBXTargetDependency */, + ); + name = WebDriverAgentRunner_tvOS; + productName = XCTUITestRunner; + productReference = 1C8F1A2E2100A3F900F6FEF4 /* WebDriverAgentRunner_tvOS.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + 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"; + }; EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */ = { isa = PBXNativeTarget; buildConfigurationList = EE158AA01CBD452B00A3E3F0 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib" */; @@ -1662,11 +2187,18 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 1000; ORGANIZATIONNAME = Facebook; TargetAttributes = { + 1C8F1A202100A3F900F6FEF4 = { + DevelopmentTeam = U9WLLAC7UL; + }; + 1C8F1A302100B24400F6FEF4 = { + DevelopmentTeam = U9WLLAC7UL; + }; EE158A981CBD452B00A3E3F0 = { CreatedOnToolsVersion = 7.3; + DevelopmentTeam = U9WLLAC7UL; }; EE836C011C0F118600D87246 = { CreatedOnToolsVersion = 7.1.1; @@ -1680,6 +2212,7 @@ }; EEF988291C486603005CA669 = { CreatedOnToolsVersion = 7.2; + DevelopmentTeam = U9WLLAC7UL; }; }; }; @@ -1698,7 +2231,9 @@ projectRoot = ""; targets = ( EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */, + 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */, EEF988291C486603005CA669 /* WebDriverAgentRunner */, + 1C8F1A202100A3F900F6FEF4 /* WebDriverAgentRunner_tvOS */, EE836C011C0F118600D87246 /* UnitTests */, EE9B75EB1CF7956C00275851 /* IntegrationTests_1 */, EE5095DD1EBCC9090028E2FE /* IntegrationTests_2 */, @@ -1709,6 +2244,21 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 1C8F1A272100A3F900F6FEF4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C8F1B2A2100B24400F6FEF4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C8F1B2B2100B24400F6FEF4 /* WebDriverAgent.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EE158A971CBD452B00A3E3F0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1763,6 +2313,88 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 1C8F1A232100A3F900F6FEF4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C8F1A242100A3F900F6FEF4 /* UITestingUITests.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 */, + 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 */, + 1C8F1A492100B24400F6FEF4 /* XCUIDevice+FBRotation.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 /* FBSpringboardApplication.m in Sources */, + 1C8F1A502100B24400F6FEF4 /* FBResponseFilePayload.m in Sources */, + 1C8F1A512100B24400F6FEF4 /* XCUIElement+FBWebDriverAttributes.m in Sources */, + 1C8F1A522100B24400F6FEF4 /* XCUIElement+FBForceTouch.m in Sources */, + 1C8F1A532100B24400F6FEF4 /* FBTouchIDCommands.m in Sources */, + 1C8F1A542100B24400F6FEF4 /* FBDebugCommands.m in Sources */, + 1C8F1A552100B24400F6FEF4 /* NSString+FBXMLSafeString.m in Sources */, + 1C8F1A562100B24400F6FEF4 /* FBUnknownCommands.m in Sources */, + 1C8F1A572100B24400F6FEF4 /* FBOrientationCommands.m in Sources */, + 1C8F1A582100B24400F6FEF4 /* XCUICoordinate+FBFix.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 */, + 1C8F1A642100B24400F6FEF4 /* FBAlertViewCommands.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 */, + 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 */, + 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; + }; EE158A941CBD452B00A3E3F0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1936,6 +2568,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 1C8F1B342100B3EE00F6FEF4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; + targetProxy = 1C8F1B332100B3EE00F6FEF4 /* PBXContainerItemProxy */; + }; AD8D96F11D3C12960061268E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */; @@ -1990,6 +2627,124 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 1C8F1A2C2100A3F900F6FEF4 /* 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/iOS", + ); + INFOPLIST_FILE = WebDriverAgentRunner/Info.plist; + 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; + }; + 1C8F1A2D2100A3F900F6FEF4 /* 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/iOS", + ); + INFOPLIST_FILE = WebDriverAgentRunner/Info.plist; + 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; + }; + 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", + "$(PROJECT_DIR)/Carthage/Build/iOS", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = WebDriverAgentLib/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + 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; + 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/iOS", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + INFOPLIST_FILE = WebDriverAgentLib/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + 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; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; 91F9DB0A1B99DBC2001349B2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2004,12 +2759,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; @@ -2064,12 +2821,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; @@ -2109,10 +2868,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"; @@ -2128,6 +2889,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 = ""; }; @@ -2138,9 +2900,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"; @@ -2155,6 +2919,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 = ""; @@ -2305,7 +3070,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", @@ -2319,6 +3086,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentRunner; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; USES_XCTRUNNER = YES; }; name = Debug; @@ -2328,6 +3096,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", @@ -2348,6 +3118,24 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 1C8F1A2B2100A3F900F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentRunner_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1C8F1A2C2100A3F900F6FEF4 /* Debug */, + 1C8F1A2D2100A3F900F6FEF4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1C8F1B2E2100B24400F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1C8F1B2F2100B24400F6FEF4 /* Debug */, + 1C8F1B302100B24400F6FEF4 /* 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/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 @@ @@ -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.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" From 05976ac125860ce0ad19a3b1c51f049eb1d25143 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Mon, 23 Jul 2018 18:39:02 +0300 Subject: [PATCH 02/81] updated some XCTest private headers --- PrivateHeaders/XCTest/XCEventGenerator.h | 4 +++- PrivateHeaders/XCTest/XCSynthesizedEventRecord.h | 6 ++++++ PrivateHeaders/XCTest/XCUIApplication.h | 2 ++ PrivateHeaders/XCTest/XCUIElement.h | 2 ++ 4 files changed, 13 insertions(+), 1 deletion(-) 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..279eee3f0 100644 --- a/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h +++ b/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h @@ -10,15 +10,21 @@ { NSMutableArray *_eventPaths; NSString *_name; +#if !TARGET_OS_TV UIInterfaceOrientation _interfaceOrientation; +#endif } +#if !TARGET_OS_TV @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_TV - (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..1db8c6cfa 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_TV @property(readonly, nonatomic) UIInterfaceOrientation interfaceOrientation; +#endif @property(readonly, copy) XCUICoordinate *hitPointCoordinate; @property(readonly) BOOL isTopLevelTouchBarElement; @property(readonly) BOOL isTouchBarElement; From e58b97364b319d84bf4ad977dc14d2b5a94f1345 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Tue, 31 Jul 2018 17:08:32 +0300 Subject: [PATCH 03/81] updated Carthage config --- Cartfile | 2 +- Cartfile.resolved | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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..e6978c2df 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1 +1 @@ -github "marekcirkos/RoutingHTTPServer" "v1.0.1" +github "shvul/RoutingHTTPServer" "v1.0.4" From 4c1d8f102be0e2efd4208d4ac494e2d0ad26cb89 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Wed, 1 Aug 2018 12:51:27 +0300 Subject: [PATCH 04/81] updated some wad categories and commands for tv os (debug purpose) --- .../Categories/XCUICoordinate+FBFix.h | 3 +- .../Categories/XCUICoordinate+FBFix.m | 15 +- .../Categories/XCUIDevice+FBHelpers.m | 12 +- .../Categories/XCUIDevice+FBRotation.h | 5 +- .../Categories/XCUIDevice+FBRotation.m | 34 +++-- .../Categories/XCUIElement+FBForceTouch.h | 3 +- .../Categories/XCUIElement+FBForceTouch.m | 3 + .../Categories/XCUIElement+FBIsVisible.m | 4 + .../Categories/XCUIElement+FBPickerWheel.h | 23 +-- .../Categories/XCUIElement+FBPickerWheel.m | 16 +- .../Categories/XCUIElement+FBScrolling.h | 19 +-- .../Categories/XCUIElement+FBScrolling.m | 70 ++++----- .../Categories/XCUIElement+FBTap.m | 5 +- .../Categories/XCUIElement+FBUtilities.m | 15 +- .../Commands/FBElementCommands.m | 141 +++++++++++++----- .../Commands/FBFindElementCommands.m | 12 +- .../Commands/FBOrientationCommands.h | 2 + .../Commands/FBOrientationCommands.m | 21 +-- WebDriverAgentLib/FBSpringboardApplication.m | 26 ++-- WebDriverAgentLib/Utilities/FBMathUtils.h | 2 + WebDriverAgentLib/Utilities/FBMathUtils.m | 4 +- 21 files changed, 272 insertions(+), 163 deletions(-) diff --git a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h index 55742a95c..ccbe1ce88 100644 --- a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h +++ b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h @@ -8,9 +8,10 @@ */ #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..a2de74ce0 100644 --- a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.m +++ b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.m @@ -12,7 +12,7 @@ #import "XCUICoordinate.h" #import "XCUIElement+FBUtilities.h" #import "XCElementSnapshot+FBHitPoint.h" - +#if !TARGET_OS_TV @implementation XCUICoordinate (FBFix) - (CGPoint)fb_screenPoint @@ -21,19 +21,20 @@ - (CGPoint)fb_screenPoint if (self.element) { CGRect frame = self.element.frame; referencePoint = CGPointMake( - CGRectGetMinX(frame) + CGRectGetWidth(frame) * self.normalizedOffset.dx, - CGRectGetMinY(frame) + CGRectGetHeight(frame) * self.normalizedOffset.dy); + CGRectGetMinX(frame) + CGRectGetWidth(frame) * self.normalizedOffset.dx, + CGRectGetMinY(frame) + CGRectGetHeight(frame) * self.normalizedOffset.dy); } else if (self.coordinate) { referencePoint = self.coordinate.fb_screenPoint; } CGPoint screenPoint = CGPointMake( - referencePoint.x + self.pointsOffset.dx, - referencePoint.y + self.pointsOffset.dy); + referencePoint.x + self.pointsOffset.dx, + referencePoint.y + self.pointsOffset.dy); CGRect rect = self.referencedElement.frame; return CGPointMake( - MIN(CGRectGetMaxX(rect), screenPoint.x), - MIN(CGRectGetMaxY(rect), screenPoint.y)); + MIN(CGRectGetMaxX(rect), screenPoint.x), + MIN(CGRectGetMaxY(rect), screenPoint.y)); } @end +#endif diff --git a/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m b/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m index fab9c9176..e6d3bbad0 100644 --- a/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m +++ b/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m @@ -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..d23164627 100644 --- a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h +++ b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h @@ -11,12 +11,12 @@ #import NS_ASSUME_NONNULL_BEGIN - +#if !TARGET_OS_TV @interface XCUIDevice (FBRotation) /** Sets requested device interface orientation. - + @param orientation The interface orientation. @return YES if the operation succeeds, otherwise NO. */ @@ -34,5 +34,6 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic, readonly) NSDictionary *fb_rotationMapping; @end +#endif NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m index c25e0f1f7..f17773025 100644 --- a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m +++ b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m @@ -9,11 +9,13 @@ #import "XCUIDevice+FBRotation.h" +#if !TARGET_OS_TV static const NSTimeInterval kFBWebDriverOrientationChangeDelay = 5.0; static const CGFloat FBRotationCoolOffTime = 1.f; @implementation XCUIDevice (FBRotation) + - (BOOL)fb_setDeviceInterfaceOrientation:(UIDeviceOrientation)orientation { FBApplication *application = FBApplication.fb_activeApplication; @@ -21,6 +23,7 @@ - (BOOL)fb_setDeviceInterfaceOrientation:(UIDeviceOrientation)orientation return [self waitUntilInterfaceIsAtOrientation:orientation application:application]; } + - (BOOL)fb_setDeviceRotation:(NSDictionary *)rotationObj { NSArray *keysForRotationObj = [self.fb_rotationMapping allKeysForObject:rotationObj]; @@ -49,21 +52,22 @@ - (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..9ef9b243b 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m @@ -41,7 +41,11 @@ - (BOOL)fb_isVisible return [(NSNumber *)[self fb_attributeValue:FB_XCAXAIsVisibleAttribute] boolValue]; } CGRect appFrame = [self fb_rootElement].frame; +#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; 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..2bef709a9 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,31 @@ - (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 +133,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 +147,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 +245,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 +271,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 +287,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 +310,4 @@ - (BOOL)fb_scrollAncestorScrollViewByVectorWithinScrollViewFrame:(CGVector)vecto } @end +#endif 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+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/Commands/FBElementCommands.m b/WebDriverAgentLib/Commands/FBElementCommands.m index b8a7ae887..09ad3423c 100644 --- a/WebDriverAgentLib/Commands/FBElementCommands.m +++ b/WebDriverAgentLib/Commands/FBElementCommands.m @@ -65,21 +65,25 @@ + (NSArray *)routes [[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/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:)], +#if TARGET_OS_IOS + [[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 + ]; } @@ -161,6 +165,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 +178,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]) { @@ -183,13 +189,17 @@ + (NSArray *)routes + (id)handleClick:(FBRouteRequest *)request { - FBElementCache *elementCache = request.session.elementCache; NSString *elementUUID = request.parameters[@"uuid"]; +#if TARGET_OS_IOS + FBElementCache *elementCache = request.session.elementCache; XCUIElement *element = [elementCache elementForUUID:elementUUID]; NSError *error = nil; if (![element fb_tapWithError:&error]) { return FBResponseWithError(error); } +#else + [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; +#endif return FBResponseWithElementUUID(elementUUID); } @@ -205,6 +215,7 @@ + (NSArray *)routes return FBResponseWithElementUUID(elementUUID); } +#if TARGET_OS_IOS + (id)handleDoubleTap:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -212,7 +223,9 @@ + (NSArray *)routes [element doubleTap]; return FBResponseWithOK(); } +#endif +#if TARGET_OS_IOS + (id)handleDoubleTapCoordinate:(FBRouteRequest *)request { CGPoint doubleTapPoint = CGPointMake((CGFloat)[request.arguments[@"x"] doubleValue], (CGFloat)[request.arguments[@"y"] doubleValue]); @@ -220,31 +233,43 @@ + (NSArray *)routes [doubleTapCoordinate doubleTap]; return FBResponseWithOK(); } +#endif +#if TARGET_OS_IOS + (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(); } +#endif + (id)handleTouchAndHold:(FBRouteRequest *)request { +#if TARGET_OS_IOS FBElementCache *elementCache = request.session.elementCache; XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; [element pressForDuration:[request.arguments[@"duration"] doubleValue]]; +#else + [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; +#endif return FBResponseWithOK(); } + (id)handleTouchAndHoldCoordinate:(FBRouteRequest *)request { +#if TARGET_OS_IOS CGPoint touchPoint = CGPointMake((CGFloat)[request.arguments[@"x"] doubleValue], (CGFloat)[request.arguments[@"y"] doubleValue]); XCUICoordinate *pressCoordinate = [self.class gestureCoordinateWithCoordinate:touchPoint application:request.session.application shouldApplyOrientationWorkaround:isSDKVersionLessThan(@"11.0")]; [pressCoordinate pressForDuration:[request.arguments[@"duration"] doubleValue]]; +#else + [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; +#endif return FBResponseWithOK(); } +#if TARGET_OS_IOS + (id)handleForceTouch:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -257,7 +282,9 @@ + (NSArray *)routes } return FBResponseWithOK(); } +#endif +#if TARGET_OS_IOS + (id)handleForceTouchByCoordinateOnElement:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -271,12 +298,13 @@ + (NSArray *)routes } return FBResponseWithOK(); } +#endif + (id)handleScroll:(FBRouteRequest *)request { 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,9 +315,10 @@ + (NSArray *)routes } return [self.class handleScrollElementToVisible:childElement withRequest:request]; } - + NSString *const direction = request.arguments[@"direction"]; if (direction) { +#if TARGET_OS_IOS NSString *const distanceString = request.arguments[@"distance"] ?: @"1.0"; CGFloat distance = (CGFloat)distanceString.doubleValue; if ([direction isEqualToString:@"up"]) { @@ -301,9 +330,12 @@ + (NSArray *)routes } else if ([direction isEqualToString:@"right"]) { [element fb_scrollRightByNormalizedDistance:distance]; } +#else + [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; +#endif return FBResponseWithOK(); } - + NSString *const predicateString = request.arguments[@"predicateString"]; if (predicateString) { NSPredicate *formattedPredicate = [NSPredicate fb_formatSearchPredicate:[FBPredicate predicateWithFormat:predicateString]]; @@ -313,13 +345,14 @@ + (NSArray *)routes } return [self.class handleScrollElementToVisible:childElement withRequest:request]; } - + if (request.arguments[@"toVisible"]) { return [self.class handleScrollElementToVisible:element withRequest:request]; } return FBResponseWithErrorFormat(@"Unsupported scroll type"); } +#if TARGET_OS_IOS + (id)handleDragCoordinate:(FBRouteRequest *)request { FBSession *session = request.session; @@ -332,6 +365,7 @@ + (NSArray *)routes return FBResponseWithOK(); } + + (id)handleDrag:(FBRouteRequest *)request { FBSession *session = request.session; @@ -346,46 +380,62 @@ + (NSArray *)routes [startCoordinate pressForDuration:duration thenDragToCoordinate:endCoordinate]; return FBResponseWithOK(); } +#endif + (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(); +#if TARGET_OS_IOS + 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"); + } +#else + [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; +#endif + return FBResponseWithOK(); } + (id)handleTap:(FBRouteRequest *)request { - FBElementCache *elementCache = request.session.elementCache; +#if TARGET_OS_IOS CGPoint tapPoint = CGPointMake((CGFloat)[request.arguments[@"x"] doubleValue], (CGFloat)[request.arguments[@"y"] doubleValue]); +#endif + FBElementCache *elementCache = request.session.elementCache; XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; if (nil == element) { +#if TARGET_OS_IOS XCUICoordinate *tapCoordinate = [self.class gestureCoordinateWithCoordinate:tapPoint application:request.session.application shouldApplyOrientationWorkaround:isSDKVersionLessThan(@"11.0")]; [tapCoordinate tap]; +#else + [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; +#endif } else { +#if TARGET_OS_IOS NSError *error; if (![element fb_tapCoordinate:tapPoint error:&error]) { return FBResponseWithError(error); } +#else + [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; +#endif } return FBResponseWithOK(); } +#if TARGET_OS_IOS + (id)handlePinch:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -395,6 +445,7 @@ + (NSArray *)routes [element pinchWithScale:scale velocity:velocity]; return FBResponseWithOK(); } +#endif + (id)handleKeys:(FBRouteRequest *)request { @@ -410,11 +461,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 +485,7 @@ + (NSArray *)routes return FBResponseWithObject(screenshot); } +#if TARGET_OS_IOS static const CGFloat DEFAULT_OFFSET = (CGFloat)0.2; + (id)handleWheelSelect:(FBRouteRequest *)request @@ -461,24 +517,29 @@ + (NSArray *)routes } return FBResponseWithOK(); } +#endif #pragma mark - Helpers + (id)handleScrollElementToVisible:(XCUIElement *)element withRequest:(FBRouteRequest *)request { - NSError *error; if (!element.exists) { return FBResponseWithErrorFormat(@"Can't scroll to element that does not exist"); } +#if TARGET_OS_IOS + NSError *error; if (![element fb_scrollToVisibleWithError:&error]) { return FBResponseWithError(error); } +#else + [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; +#endif return FBResponseWithOK(); } /** 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 @@ -489,6 +550,7 @@ screen orientation is different from the default one (which is portrait). the current screen orientation would be portrait. @return translated gesture coordinates ready to be passed to XCUICoordinate methods */ +#if TARGET_OS_IOS + (XCUICoordinate *)gestureCoordinateWithCoordinate:(CGPoint)coordinate application:(XCUIApplication *)application shouldApplyOrientationWorkaround:(BOOL)shouldApplyOrientationWorkaround { CGPoint point = coordinate; @@ -520,6 +582,7 @@ + (XCUICoordinate *)gestureCoordinateWithCoordinate:(CGPoint)coordinate applicat } return [self gestureCoordinateWithCoordinate:point element:element]; } +#endif /** Returns gesture coordinate based on the specified element. diff --git a/WebDriverAgentLib/Commands/FBFindElementCommands.m b/WebDriverAgentLib/Commands/FBFindElementCommands.m index 6dd976d97..9ef994b07 100644 --- a/WebDriverAgentLib/Commands/FBFindElementCommands.m +++ b/WebDriverAgentLib/Commands/FBFindElementCommands.m @@ -26,10 +26,10 @@ 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 +46,7 @@ + (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:)], - ]; + ]; } @@ -96,7 +96,7 @@ + (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); } diff --git a/WebDriverAgentLib/Commands/FBOrientationCommands.h b/WebDriverAgentLib/Commands/FBOrientationCommands.h index 50bd5b6b1..e0892b474 100644 --- a/WebDriverAgentLib/Commands/FBOrientationCommands.h +++ b/WebDriverAgentLib/Commands/FBOrientationCommands.h @@ -12,9 +12,11 @@ #import NS_ASSUME_NONNULL_BEGIN +#if TARGET_OS_IOS @interface FBOrientationCommands : NSObject @end +#endif NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Commands/FBOrientationCommands.m b/WebDriverAgentLib/Commands/FBOrientationCommands.m index dc5a3428b..e4f2c5dda 100644 --- a/WebDriverAgentLib/Commands/FBOrientationCommands.m +++ b/WebDriverAgentLib/Commands/FBOrientationCommands.m @@ -15,6 +15,7 @@ #import "FBApplication.h" #import "XCUIDevice.h" +#if TARGET_OS_IOS extern const struct FBWDOrientationValues { FBLiteralString portrait; FBLiteralString landscapeLeft; @@ -41,7 +42,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 +65,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"]]); } @@ -124,3 +125,5 @@ + (NSDictionary *)_orientationsMapping } @end + +#endif diff --git a/WebDriverAgentLib/FBSpringboardApplication.m b/WebDriverAgentLib/FBSpringboardApplication.m index 3541f0639..d3986fedf 100644 --- a/WebDriverAgentLib/FBSpringboardApplication.m +++ b/WebDriverAgentLib/FBSpringboardApplication.m @@ -44,37 +44,43 @@ - (BOOL)fb_tapApplicationWithIdentifier:(NSString *)identifier error:(NSError ** 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; +#if !TARGET_OS_TV BOOL shouldSwipeToTheRight = startFrame.origin.x < 0; +#endif NSString *errorDescription = [NSString stringWithFormat:@"Cannot scroll to Springboard icon for '%@' application", identifier]; do { +#if !TARGET_OS_TV if (shouldSwipeToTheRight) { [self swipeRight]; } else { [self swipeLeft]; } +#endif 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; } } while (!appElement.fb_isVisible); } +#if TARGET_OS_IOS if (![appElement fb_tapWithError:error]) { return NO; } +#endif return [[[[FBRunLoopSpinner new] interval:0.3] @@ -82,7 +88,7 @@ - (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]; } 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 From 4c85133d181eba22a71ee93f13608f48e4c595e6 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Wed, 1 Aug 2018 13:08:48 +0300 Subject: [PATCH 05/81] updated FBElementCommnds to exclude XCUICoordinate for tv os --- WebDriverAgentLib/Commands/FBElementCommands.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WebDriverAgentLib/Commands/FBElementCommands.m b/WebDriverAgentLib/Commands/FBElementCommands.m index 09ad3423c..525a0fce7 100644 --- a/WebDriverAgentLib/Commands/FBElementCommands.m +++ b/WebDriverAgentLib/Commands/FBElementCommands.m @@ -584,6 +584,7 @@ + (XCUICoordinate *)gestureCoordinateWithCoordinate:(CGPoint)coordinate applicat } #endif +#if !TARGET_OS_TV /** Returns gesture coordinate based on the specified element. @@ -596,5 +597,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 @end From 98078f80aefc126e01dc4f2e8ad9ad111a077f7d Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Wed, 1 Aug 2018 14:26:00 +0300 Subject: [PATCH 06/81] added tv os schemes --- WebDriverAgent.xcodeproj/project.pbxproj | 234 +++++++++--------- .../WebDriverAgentRunner-nodebug.xcscheme | 91 ------- .../WebDriverAgentRunner_tvOS.xcscheme | 56 +++++ 3 files changed, 175 insertions(+), 206 deletions(-) delete mode 100644 WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner-nodebug.xcscheme create mode 100644 WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_tvOS.xcscheme diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 4c88e5303..fe06d4502 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -8,8 +8,10 @@ /* Begin PBXBuildFile section */ 18033EFF208761FC00FED81D /* RoutingHTTPServer.framework in Copy frameworks */ = {isa = PBXBuildFile; fileRef = AD42DD2B1CF1238500806E5D /* RoutingHTTPServer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 1C8F1A242100A3F900F6FEF4 /* UITestingUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7FD1CAEE048008C271F /* UITestingUITests.m */; }; - 1C8F1A292100A3F900F6FEF4 /* 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, ); }; }; + 1C1954652111CF3C00A99F21 /* RoutingHTTPServer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954632111CF0E00A99F21 /* RoutingHTTPServer.framework */; }; 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 */; }; @@ -78,7 +80,6 @@ 1C8F1A732100B24400F6FEF4 /* XCUIElement+FBTap.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB74C1CAEDF0C008C271F /* XCUIElement+FBTap.m */; }; 1C8F1A742100B24400F6FEF4 /* FBMathUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = EE1888391DA661C400307AA8 /* FBMathUtils.m */; }; 1C8F1A762100B24400F6FEF4 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7174AF031D9D39AF008C8AD5 /* libxml2.tbd */; }; - 1C8F1A772100B24400F6FEF4 /* RoutingHTTPServer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD42DD2B1CF1238500806E5D /* RoutingHTTPServer.framework */; }; 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, ); }; }; @@ -257,9 +258,7 @@ 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 */; }; - 1C8F1B2D2100B24400F6FEF4 /* RoutingHTTPServer.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = AD42DD2B1CF1238500806E5D /* RoutingHTTPServer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 1C8F1B352100B3FF00F6FEF4 /* WebDriverAgentLib_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; }; - 1C8F1B362100B42A00F6FEF4 /* WebDriverAgentLib_tvOS.framework in Copy frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1CDC56622111C26F00868007 /* UITestingUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7FD1CAEE048008C271F /* UITestingUITests.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 */; }; 7119E1EC1E891F8600D0B125 /* FBPickerWheelSelectTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7119E1EB1E891F8600D0B125 /* FBPickerWheelSelectTests.m */; }; @@ -577,7 +576,7 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 1C8F1B332100B3EE00F6FEF4 /* PBXContainerItemProxy */ = { + 1C0EE1122111C4A9009EDBB1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; proxyType = 1; @@ -643,27 +642,26 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 1C8F1A282100A3F900F6FEF4 /* Copy frameworks */ = { + 1C8F1B2C2100B24400F6FEF4 /* Copy Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - 1C8F1B362100B42A00F6FEF4 /* WebDriverAgentLib_tvOS.framework in Copy frameworks */, - 1C8F1A292100A3F900F6FEF4 /* RoutingHTTPServer.framework in Copy frameworks */, + 1C1954642111CF0E00A99F21 /* RoutingHTTPServer.framework in Copy Frameworks */, ); - name = "Copy frameworks"; + name = "Copy Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - 1C8F1B2C2100B24400F6FEF4 /* Copy Frameworks */ = { + 1CDC56662111C26F00868007 /* Copy frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - 1C8F1B2D2100B24400F6FEF4 /* RoutingHTTPServer.framework in Copy Frameworks */, + 1C0EE1152111C4CD009EDBB1 /* WebDriverAgentLib_tvOS.framework in Copy frameworks */, ); - name = "Copy Frameworks"; + name = "Copy frameworks"; runOnlyForDeploymentPostprocessing = 0; }; EE93CFF41CCA501300708122 /* Copy frameworks */ = { @@ -692,8 +690,9 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 1C8F1A2E2100A3F900F6FEF4 /* WebDriverAgentRunner_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebDriverAgentRunner_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1C1954632111CF0E00A99F21 /* RoutingHTTPServer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RoutingHTTPServer.framework; path = Carthage/Build/tvOS/RoutingHTTPServer.framework; sourceTree = ""; }; 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebDriverAgentLib_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebDriverAgentRunner_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; 711084431DA3AA7500F913D6 /* FBXPath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBXPath.m; sourceTree = ""; }; @@ -1026,20 +1025,20 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 1C8F1A252100A3F900F6FEF4 /* Frameworks */ = { + 1C8F1A752100B24400F6FEF4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1C8F1B352100B3FF00F6FEF4 /* WebDriverAgentLib_tvOS.framework in Frameworks */, + 1C8F1A762100B24400F6FEF4 /* libxml2.tbd in Frameworks */, + 1C1954652111CF3C00A99F21 /* RoutingHTTPServer.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1C8F1A752100B24400F6FEF4 /* Frameworks */ = { + 1CDC56632111C26F00868007 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1C8F1A762100B24400F6FEF4 /* libxml2.tbd in Frameworks */, - 1C8F1A772100B24400F6FEF4 /* RoutingHTTPServer.framework in Frameworks */, + 1C0EE1142111C4B3009EDBB1 /* WebDriverAgentLib_tvOS.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1118,6 +1117,7 @@ 91F9DAE01B99DBC2001349B2 = { isa = PBXGroup; children = ( + 1C1954632111CF0E00A99F21 /* RoutingHTTPServer.framework */, EEE5CABE1C80361500CBBDD9 /* Configurations */, 91F9DB731B99DDD8001349B2 /* PrivateHeaders */, 498495C81BB2E6FA009CC848 /* Resources */, @@ -1144,8 +1144,8 @@ EE9B75EC1CF7956C00275851 /* IntegrationTests_1.xctest */, EE5095FE1EBCC9090028E2FE /* IntegrationTests_2.xctest */, EE22021C1ECC612200A29571 /* IntegrationTests_3.xctest */, - 1C8F1A2E2100A3F900F6FEF4 /* WebDriverAgentRunner_tvOS.xctest */, 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */, + 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -2012,25 +2012,6 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 1C8F1A202100A3F900F6FEF4 /* WebDriverAgentRunner_tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1C8F1A2B2100A3F900F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentRunner_tvOS" */; - buildPhases = ( - 1C8F1A232100A3F900F6FEF4 /* Sources */, - 1C8F1A252100A3F900F6FEF4 /* Frameworks */, - 1C8F1A272100A3F900F6FEF4 /* Resources */, - 1C8F1A282100A3F900F6FEF4 /* Copy frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 1C8F1B342100B3EE00F6FEF4 /* PBXTargetDependency */, - ); - name = WebDriverAgentRunner_tvOS; - productName = XCTUITestRunner; - productReference = 1C8F1A2E2100A3F900F6FEF4 /* WebDriverAgentRunner_tvOS.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */ = { isa = PBXNativeTarget; buildConfigurationList = 1C8F1B2E2100B24400F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib_tvOS" */; @@ -2050,6 +2031,25 @@ 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"; + }; EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */ = { isa = PBXNativeTarget; buildConfigurationList = EE158AA01CBD452B00A3E3F0 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib" */; @@ -2190,10 +2190,10 @@ LastUpgradeCheck = 1000; ORGANIZATIONNAME = Facebook; TargetAttributes = { - 1C8F1A202100A3F900F6FEF4 = { + 1C8F1A302100B24400F6FEF4 = { DevelopmentTeam = U9WLLAC7UL; }; - 1C8F1A302100B24400F6FEF4 = { + 1CDC565E2111C26F00868007 = { DevelopmentTeam = U9WLLAC7UL; }; EE158A981CBD452B00A3E3F0 = { @@ -2233,7 +2233,7 @@ EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */, 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */, EEF988291C486603005CA669 /* WebDriverAgentRunner */, - 1C8F1A202100A3F900F6FEF4 /* WebDriverAgentRunner_tvOS */, + 1CDC565E2111C26F00868007 /* WebDriverAgentRunner_tvOS */, EE836C011C0F118600D87246 /* UnitTests */, EE9B75EB1CF7956C00275851 /* IntegrationTests_1 */, EE5095DD1EBCC9090028E2FE /* IntegrationTests_2 */, @@ -2244,18 +2244,18 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 1C8F1A272100A3F900F6FEF4 /* Resources */ = { + 1C8F1B2A2100B24400F6FEF4 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1C8F1B2B2100B24400F6FEF4 /* WebDriverAgent.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1C8F1B2A2100B24400F6FEF4 /* Resources */ = { + 1CDC56652111C26F00868007 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1C8F1B2B2100B24400F6FEF4 /* WebDriverAgent.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2313,14 +2313,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 1C8F1A232100A3F900F6FEF4 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1C8F1A242100A3F900F6FEF4 /* UITestingUITests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 1C8F1A312100B24400F6FEF4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2395,6 +2387,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1CDC56612111C26F00868007 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CDC56622111C26F00868007 /* UITestingUITests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EE158A941CBD452B00A3E3F0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2568,10 +2568,10 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 1C8F1B342100B3EE00F6FEF4 /* PBXTargetDependency */ = { + 1C0EE1132111C4A9009EDBB1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; - targetProxy = 1C8F1B332100B3EE00F6FEF4 /* PBXContainerItemProxy */; + targetProxy = 1C0EE1122111C4A9009EDBB1 /* PBXContainerItemProxy */; }; AD8D96F11D3C12960061268E /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -2627,57 +2627,6 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 1C8F1A2C2100A3F900F6FEF4 /* 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/iOS", - ); - INFOPLIST_FILE = WebDriverAgentRunner/Info.plist; - 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; - }; - 1C8F1A2D2100A3F900F6FEF4 /* 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/iOS", - ); - INFOPLIST_FILE = WebDriverAgentRunner/Info.plist; - 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; - }; 1C8F1B2F2100B24400F6FEF4 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = EEE5CABF1C80361500CBBDD9 /* ProjectSettings.xcconfig */; @@ -2696,10 +2645,11 @@ "$(PLATFORM_DIR)/Developer/Library/Frameworks", "$(PROJECT_DIR)/Carthage/Build/iOS", "$(PROJECT_DIR)/Carthage/Build/Mac", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", ); INFOPLIST_FILE = WebDriverAgentLib/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentLib; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2729,10 +2679,11 @@ "$(PLATFORM_DIR)/Developer/Library/Frameworks", "$(PROJECT_DIR)/Carthage/Build/iOS", "$(PROJECT_DIR)/Carthage/Build/Mac", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", ); INFOPLIST_FILE = WebDriverAgentLib/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.facebook.WebDriverAgentLib; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2745,6 +2696,59 @@ }; 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; + }; 91F9DB0A1B99DBC2001349B2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3118,20 +3122,20 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 1C8F1A2B2100A3F900F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentRunner_tvOS" */ = { + 1C8F1B2E2100B24400F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib_tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1C8F1A2C2100A3F900F6FEF4 /* Debug */, - 1C8F1A2D2100A3F900F6FEF4 /* Release */, + 1C8F1B2F2100B24400F6FEF4 /* Debug */, + 1C8F1B302100B24400F6FEF4 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1C8F1B2E2100B24400F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib_tvOS" */ = { + 1CDC56692111C26F00868007 /* Build configuration list for PBXNativeTarget "WebDriverAgentRunner_tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1C8F1B2F2100B24400F6FEF4 /* Debug */, - 1C8F1B302100B24400F6FEF4 /* Release */, + 1CDC566A2111C26F00868007 /* Debug */, + 1CDC566B2111C26F00868007 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner-nodebug.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner-nodebug.xcscheme deleted file mode 100644 index e4bf73215..000000000 --- a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner-nodebug.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_tvOS.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_tvOS.xcscheme new file mode 100644 index 000000000..d37f13adc --- /dev/null +++ b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_tvOS.xcscheme @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From 79c6a7027796d6e6158a016204ed82b27c123c23 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Wed, 1 Aug 2018 15:23:57 +0300 Subject: [PATCH 07/81] added libxml2 for tvOS --- WebDriverAgent.xcodeproj/project.pbxproj | 16 +-- .../xcschemes/WebDriverAgentLib_tvOS.xcscheme | 99 +++++++++++++++++++ 2 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index fe06d4502..8c67faef8 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -11,7 +11,8 @@ 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, ); }; }; - 1C1954652111CF3C00A99F21 /* RoutingHTTPServer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954632111CF0E00A99F21 /* RoutingHTTPServer.framework */; }; + 1C1954662111D7FD00A99F21 /* RoutingHTTPServer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954632111CF0E00A99F21 /* RoutingHTTPServer.framework */; }; + 1C19546A2111DC1400A99F21 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954682111DC0800A99F21 /* libxml2.tbd */; }; 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 */; }; @@ -79,7 +80,6 @@ 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 */; }; - 1C8F1A762100B24400F6FEF4 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7174AF031D9D39AF008C8AD5 /* libxml2.tbd */; }; 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, ); }; }; @@ -691,6 +691,7 @@ /* 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; }; 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebDriverAgentLib_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebDriverAgentRunner_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 44757A831D42CE8300ECF35E /* XCUIDeviceRotationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XCUIDeviceRotationTests.m; sourceTree = ""; }; @@ -1029,8 +1030,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1C8F1A762100B24400F6FEF4 /* libxml2.tbd in Frameworks */, - 1C1954652111CF3C00A99F21 /* RoutingHTTPServer.framework in Frameworks */, + 1C19546A2111DC1400A99F21 /* libxml2.tbd in Frameworks */, + 1C1954662111D7FD00A99F21 /* RoutingHTTPServer.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1190,6 +1191,7 @@ isa = PBXGroup; children = ( 7174AF031D9D39AF008C8AD5 /* libxml2.tbd */, + 1C1954682111DC0800A99F21 /* libxml2.tbd */, AD35D0671CF1C2DA00870A75 /* iOS */, ); name = Frameworks; @@ -2643,10 +2645,9 @@ 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", - "$(PROJECT_DIR)", - "$(PROJECT_DIR)/Carthage/Build/tvOS", ); INFOPLIST_FILE = WebDriverAgentLib/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -2677,10 +2678,9 @@ 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", - "$(PROJECT_DIR)", - "$(PROJECT_DIR)/Carthage/Build/tvOS", ); INFOPLIST_FILE = WebDriverAgentLib/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme new file mode 100644 index 000000000..5ccfd7de7 --- /dev/null +++ b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From aaa37589923dbc6ab9e11e8358a92aab10833926 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Thu, 2 Aug 2018 13:00:13 +0300 Subject: [PATCH 08/81] Added Apple TV Remote commands --- WebDriverAgent.xcodeproj/project.pbxproj | 8 +++ .../Commands/FBTvRemoteCommands.h | 20 ++++++++ .../Commands/FBTvRemoteCommands.m | 50 +++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 WebDriverAgentLib/Commands/FBTvRemoteCommands.h create mode 100644 WebDriverAgentLib/Commands/FBTvRemoteCommands.m diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 8c67faef8..77a4055d9 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ 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 /* FBTvRemoteCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C1954712112EF9100A99F21 /* FBTvRemoteCommands.h */; }; + 1C1954742112EF9100A99F21 /* FBTvRemoteCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954722112EF9100A99F21 /* FBTvRemoteCommands.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 */; }; @@ -692,6 +694,8 @@ /* 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 /* FBTvRemoteCommands.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBTvRemoteCommands.h; sourceTree = ""; }; + 1C1954722112EF9100A99F21 /* FBTvRemoteCommands.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTvRemoteCommands.m; sourceTree = ""; }; 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebDriverAgentLib_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebDriverAgentRunner_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 44757A831D42CE8300ECF35E /* XCUIDeviceRotationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XCUIDeviceRotationTests.m; sourceTree = ""; }; @@ -1276,6 +1280,8 @@ EE9AB7631CAEDF0C008C271F /* FBTouchIDCommands.m */, EE9AB7641CAEDF0C008C271F /* FBUnknownCommands.h */, EE9AB7651CAEDF0C008C271F /* FBUnknownCommands.m */, + 1C1954712112EF9100A99F21 /* FBTvRemoteCommands.h */, + 1C1954722112EF9100A99F21 /* FBTvRemoteCommands.m */, ); name = Commands; path = WebDriverAgentLib/Commands; @@ -1671,6 +1677,7 @@ 1C8F1A8E2100B24400F6FEF4 /* XCTestProbe.h in Headers */, 1C8F1A8F2100B24400F6FEF4 /* XCApplicationQuery.h in Headers */, 1C8F1A902100B24400F6FEF4 /* XCTAsyncActivity.h in Headers */, + 1C1954732112EF9100A99F21 /* FBTvRemoteCommands.h in Headers */, 1C8F1A912100B24400F6FEF4 /* XCTestMisuseObserver.h in Headers */, 1C8F1A922100B24400F6FEF4 /* XCTRunnerDaemonSession.h in Headers */, 1C8F1A932100B24400F6FEF4 /* FBApplication.h in Headers */, @@ -2374,6 +2381,7 @@ 1C8F1A662100B24400F6FEF4 /* FBSessionCommands.m in Sources */, 1C8F1A672100B24400F6FEF4 /* FBInspectorCommands.m in Sources */, 1C8F1A682100B24400F6FEF4 /* XCElementSnapshot+FBHitPoint.m in Sources */, + 1C1954742112EF9100A99F21 /* FBTvRemoteCommands.m in Sources */, 1C8F1A692100B24400F6FEF4 /* FBConfiguration.m in Sources */, 1C8F1A6A2100B24400F6FEF4 /* FBElementCache.m in Sources */, 1C8F1A6B2100B24400F6FEF4 /* FBAlert.m in Sources */, diff --git a/WebDriverAgentLib/Commands/FBTvRemoteCommands.h b/WebDriverAgentLib/Commands/FBTvRemoteCommands.h new file mode 100644 index 000000000..aa594076b --- /dev/null +++ b/WebDriverAgentLib/Commands/FBTvRemoteCommands.h @@ -0,0 +1,20 @@ +/** + * 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 + +NS_ASSUME_NONNULL_BEGIN + +@interface FBTvRemoteCommands : NSObject + +@end + +NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Commands/FBTvRemoteCommands.m b/WebDriverAgentLib/Commands/FBTvRemoteCommands.m new file mode 100644 index 000000000..7a6b54020 --- /dev/null +++ b/WebDriverAgentLib/Commands/FBTvRemoteCommands.m @@ -0,0 +1,50 @@ +/** + * 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 "FBTvRemoteCommands.h" + +#import + +#import "FBRoute.h" +#import "FBRouteRequest.h" + +@implementation FBTvRemoteCommands + +#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 false; + } +} + +@end From 0e67c3279e67f862987a3c43d1bfed208f165f39 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Thu, 2 Aug 2018 16:04:26 +0300 Subject: [PATCH 09/81] add command to return focused element --- WebDriverAgentLib/Commands/FBElementCommands.m | 17 +++++++++++++++-- .../Commands/FBFindElementCommands.m | 11 +++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/WebDriverAgentLib/Commands/FBElementCommands.m b/WebDriverAgentLib/Commands/FBElementCommands.m index 525a0fce7..bd69d6bad 100644 --- a/WebDriverAgentLib/Commands/FBElementCommands.m +++ b/WebDriverAgentLib/Commands/FBElementCommands.m @@ -59,17 +59,20 @@ + (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:)], +#if TARGET_OS_TV + [[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/touchAndHold"] respondWithTarget:self action:@selector(handleTouchAndHold:)], [[FBRoute POST:@"/wda/element/:uuid/scroll"] respondWithTarget:self action:@selector(handleScroll:)], [[FBRoute POST:@"/wda/tap/:uuid"] respondWithTarget:self action:@selector(handleTap:)], [[FBRoute POST:@"/wda/touchAndHold"] respondWithTarget:self action:@selector(handleTouchAndHoldCoordinate:)], -#if TARGET_OS_IOS + [[FBRoute POST:@"/element/:uuid/click"] respondWithTarget:self action:@selector(handleClick:)], [[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:)], @@ -519,6 +522,16 @@ + (NSArray *)routes } #endif +#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); +} +#endif + #pragma mark - Helpers + (id)handleScrollElementToVisible:(XCUIElement *)element withRequest:(FBRouteRequest *)request diff --git a/WebDriverAgentLib/Commands/FBFindElementCommands.m b/WebDriverAgentLib/Commands/FBFindElementCommands.m index 9ef994b07..63d5ba3f5 100644 --- a/WebDriverAgentLib/Commands/FBFindElementCommands.m +++ b/WebDriverAgentLib/Commands/FBFindElementCommands.m @@ -46,6 +46,9 @@ + (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 ]; } @@ -100,6 +103,14 @@ + (NSArray *)routes return FBResponseWithCachedElements(foundElements, request.session.elementCache, FBConfiguration.shouldUseCompactResponses); } ++ (id)handleFindFocusedElement:(FBRouteRequest *)request +{ + FBElementCache *elementCache = request.session.elementCache; + XCUIElementQuery *query = [[FBApplication fb_activeApplication] descendantsMatchingType:XCUIElementTypeAny]; + XCUIElement *element = [query elementMatchingPredicate: [NSPredicate predicateWithFormat:@"hasFocus == true"]]; + return FBResponseWithElementUUID([elementCache storeElement:element]); +} + #pragma mark - Helpers From e40a4e6f19a552c90582bbb5f8b6bab035241872 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Thu, 2 Aug 2018 21:47:05 +0300 Subject: [PATCH 10/81] add tv os integration app --- IntegrationApp_tvOS/Classes/AppDelegate.h | 18 + IntegrationApp_tvOS/Classes/AppDelegate.m | 52 +++ .../Classes/FBAlertsViewController.h | 17 + .../Classes/FBAlertsViewController.m | 65 ++++ IntegrationApp_tvOS/Classes/ViewController.h | 16 + IntegrationApp_tvOS/Classes/ViewController.m | 24 ++ IntegrationApp_tvOS/Info.plist | 42 +++ .../Resources/Base.lproj/Main.storyboard | 308 ++++++++++++++++++ IntegrationApp_tvOS/main.m | 17 + WebDriverAgent.xcodeproj/project.pbxproj | 297 +++++++++++++++++ 10 files changed, 856 insertions(+) create mode 100644 IntegrationApp_tvOS/Classes/AppDelegate.h create mode 100644 IntegrationApp_tvOS/Classes/AppDelegate.m create mode 100644 IntegrationApp_tvOS/Classes/FBAlertsViewController.h create mode 100644 IntegrationApp_tvOS/Classes/FBAlertsViewController.m create mode 100644 IntegrationApp_tvOS/Classes/ViewController.h create mode 100644 IntegrationApp_tvOS/Classes/ViewController.m create mode 100644 IntegrationApp_tvOS/Info.plist create mode 100644 IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard create mode 100644 IntegrationApp_tvOS/main.m diff --git a/IntegrationApp_tvOS/Classes/AppDelegate.h b/IntegrationApp_tvOS/Classes/AppDelegate.h new file mode 100644 index 000000000..9534eb9dd --- /dev/null +++ b/IntegrationApp_tvOS/Classes/AppDelegate.h @@ -0,0 +1,18 @@ +/** + * 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 + +@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..f61c5440a --- /dev/null +++ b/IntegrationApp_tvOS/Classes/AppDelegate.m @@ -0,0 +1,52 @@ +/** + * 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 "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + return YES; +} + + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. +} + + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + + +@end diff --git a/IntegrationApp_tvOS/Classes/FBAlertsViewController.h b/IntegrationApp_tvOS/Classes/FBAlertsViewController.h new file mode 100644 index 000000000..59a37c4c7 --- /dev/null +++ b/IntegrationApp_tvOS/Classes/FBAlertsViewController.h @@ -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 + +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..03cc25875 --- /dev/null +++ b/IntegrationApp_tvOS/Classes/FBAlertsViewController.m @@ -0,0 +1,65 @@ +/** + * 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 "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/ViewController.h b/IntegrationApp_tvOS/Classes/ViewController.h new file mode 100644 index 000000000..4a61d2a7f --- /dev/null +++ b/IntegrationApp_tvOS/Classes/ViewController.h @@ -0,0 +1,16 @@ +/** + * 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 + +@interface ViewController : UIViewController + + +@end + diff --git a/IntegrationApp_tvOS/Classes/ViewController.m b/IntegrationApp_tvOS/Classes/ViewController.m new file mode 100644 index 000000000..e29603859 --- /dev/null +++ b/IntegrationApp_tvOS/Classes/ViewController.m @@ -0,0 +1,24 @@ +/** + * 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 "ViewController.h" + +@interface ViewController () + +@end + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. +} + + +@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..a10a360b8 --- /dev/null +++ b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 77a4055d9..6b9975d8c 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -15,6 +15,13 @@ 1C19546A2111DC1400A99F21 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954682111DC0800A99F21 /* libxml2.tbd */; }; 1C1954732112EF9100A99F21 /* FBTvRemoteCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C1954712112EF9100A99F21 /* FBTvRemoteCommands.h */; }; 1C1954742112EF9100A99F21 /* FBTvRemoteCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954722112EF9100A99F21 /* FBTvRemoteCommands.m */; }; + 1C1954B421133DDC00A99F21 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954B321133DDC00A99F21 /* AppDelegate.m */; }; + 1C1954B721133DDC00A99F21 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954B621133DDC00A99F21 /* ViewController.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 */; }; + 1C1954D82113540000A99F21 /* FBIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D72113540000A99F21 /* FBIntegrationTestCase.m */; }; + 1C1954DA2113554400A99F21 /* FBRAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D92113554400A99F21 /* FBRAlertTests.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 */; }; @@ -585,6 +592,13 @@ remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; remoteInfo = WebDriverAgentLib_tvOS; }; + 1C1954C521133DDD00A99F21 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C1954AF21133DDC00A99F21; + remoteInfo = IntegrationApp_tvOS; + }; AD8D96F01D3C12960061268E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; @@ -696,6 +710,21 @@ 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 /* FBTvRemoteCommands.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBTvRemoteCommands.h; sourceTree = ""; }; 1C1954722112EF9100A99F21 /* FBTvRemoteCommands.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTvRemoteCommands.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 = ""; }; + 1C1954B521133DDC00A99F21 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 1C1954B621133DDC00A99F21 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.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 = ""; }; + 1C1954C421133DDD00A99F21 /* IntegrationTests_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IntegrationTests_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 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 = ""; }; + 1C1954D62113540000A99F21 /* FBIntegrationTestCase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBIntegrationTestCase.h; sourceTree = ""; }; + 1C1954D72113540000A99F21 /* FBIntegrationTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBIntegrationTestCase.m; sourceTree = ""; }; + 1C1954D92113554400A99F21 /* FBRAlertTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBRAlertTests.m; sourceTree = ""; }; 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebDriverAgentLib_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebDriverAgentRunner_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 44757A831D42CE8300ECF35E /* XCUIDeviceRotationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XCUIDeviceRotationTests.m; sourceTree = ""; }; @@ -1030,6 +1059,20 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 1C1954AD21133DDC00A99F21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C1954C121133DDD00A99F21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1C8F1A752100B24400F6FEF4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1111,6 +1154,50 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1C19549021133B9000A99F21 /* IntegrationTests_tvOS */ = { + isa = PBXGroup; + children = ( + 1C1954D62113540000A99F21 /* FBIntegrationTestCase.h */, + 1C1954D72113540000A99F21 /* FBIntegrationTestCase.m */, + 1C1954D92113554400A99F21 /* FBRAlertTests.m */, + 1C19549321133B9000A99F21 /* Info.plist */, + ); + 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 */, + 1C1954B521133DDC00A99F21 /* ViewController.h */, + 1C1954B621133DDC00A99F21 /* ViewController.m */, + ); + path = Classes; + sourceTree = ""; + }; + 1C1954D221133E7C00A99F21 /* Resources */ = { + isa = PBXGroup; + children = ( + 1C1954B821133DDC00A99F21 /* Main.storyboard */, + ); + path = Resources; + sourceTree = ""; + }; 498495C81BB2E6FA009CC848 /* Resources */ = { isa = PBXGroup; children = ( @@ -1151,6 +1238,8 @@ EE22021C1ECC612200A29571 /* IntegrationTests_3.xctest */, 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */, 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */, + 1C1954B021133DDC00A99F21 /* IntegrationApp_tvOS.app */, + 1C1954C421133DDD00A99F21 /* IntegrationTests_tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -1387,8 +1476,10 @@ EE9B75F91CF7964100275851 /* WebDriverAgentTests */ = { isa = PBXGroup; children = ( + 1C1954B121133DDC00A99F21 /* IntegrationApp_tvOS */, EE9B76801CF7997600275851 /* IntegrationApp */, EE9B76541CF7987300275851 /* IntegrationTests */, + 1C19549021133B9000A99F21 /* IntegrationTests_tvOS */, EE9B76561CF7987300275851 /* UnitTests */, ); path = WebDriverAgentTests; @@ -2021,6 +2112,41 @@ /* 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"; + }; + 1C1954C321133DDD00A99F21 /* IntegrationTests_tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1C1954CE21133DDE00A99F21 /* Build configuration list for PBXNativeTarget "IntegrationTests_tvOS" */; + buildPhases = ( + 1C1954C021133DDD00A99F21 /* Sources */, + 1C1954C121133DDD00A99F21 /* Frameworks */, + 1C1954C221133DDD00A99F21 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1C1954C621133DDD00A99F21 /* PBXTargetDependency */, + ); + name = IntegrationTests_tvOS; + productName = IntegrationApp_tvOSUITests; + productReference = 1C1954C421133DDD00A99F21 /* IntegrationTests_tvOS.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */ = { isa = PBXNativeTarget; buildConfigurationList = 1C8F1B2E2100B24400F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib_tvOS" */; @@ -2199,6 +2325,15 @@ LastUpgradeCheck = 1000; ORGANIZATIONNAME = Facebook; TargetAttributes = { + 1C1954AF21133DDC00A99F21 = { + CreatedOnToolsVersion = 10.0; + ProvisioningStyle = Automatic; + }; + 1C1954C321133DDD00A99F21 = { + CreatedOnToolsVersion = 10.0; + ProvisioningStyle = Automatic; + TestTargetID = 1C1954AF21133DDC00A99F21; + }; 1C8F1A302100B24400F6FEF4 = { DevelopmentTeam = U9WLLAC7UL; }; @@ -2248,11 +2383,28 @@ EE5095DD1EBCC9090028E2FE /* IntegrationTests_2 */, EE2202031ECC612200A29571 /* IntegrationTests_3 */, EE9B75D31CF7956C00275851 /* IntegrationApp */, + 1C1954AF21133DDC00A99F21 /* IntegrationApp_tvOS */, + 1C1954C321133DDD00A99F21 /* IntegrationTests_tvOS */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 1C1954AE21133DDC00A99F21 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C1954BA21133DDC00A99F21 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C1954C221133DDD00A99F21 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1C8F1B2A2100B24400F6FEF4 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2322,6 +2474,26 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 1C1954AC21133DDC00A99F21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C1954B721133DDC00A99F21 /* ViewController.m in Sources */, + 1C1954D52113454F00A99F21 /* FBAlertsViewController.m in Sources */, + 1C1954BF21133DDD00A99F21 /* main.m in Sources */, + 1C1954B421133DDC00A99F21 /* AppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1C1954C021133DDD00A99F21 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C1954DA2113554400A99F21 /* FBRAlertTests.m in Sources */, + 1C1954D82113540000A99F21 /* FBIntegrationTestCase.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1C8F1A312100B24400F6FEF4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2583,6 +2755,11 @@ target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; targetProxy = 1C0EE1122111C4A9009EDBB1 /* PBXContainerItemProxy */; }; + 1C1954C621133DDD00A99F21 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C1954AF21133DDC00A99F21 /* IntegrationApp_tvOS */; + targetProxy = 1C1954C521133DDD00A99F21 /* PBXContainerItemProxy */; + }; AD8D96F11D3C12960061268E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */; @@ -2626,6 +2803,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 = ( @@ -2637,6 +2822,100 @@ /* 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; + 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 = 12.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; + 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 = 12.0; + }; + name = Release; + }; + 1C1954CF21133DDE00A99F21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = WebDriverAgentTests/IntegrationTests_tvOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.wda.IntegrationApp-tvOSUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TEST_TARGET_NAME = IntegrationApp_tvOS; + TVOS_DEPLOYMENT_TARGET = 12.0; + }; + name = Debug; + }; + 1C1954D021133DDE00A99F21 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = WebDriverAgentTests/IntegrationTests_tvOS/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.wda.IntegrationApp-tvOSUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TEST_TARGET_NAME = IntegrationApp_tvOS; + TVOS_DEPLOYMENT_TARGET = 12.0; + }; + name = Release; + }; 1C8F1B2F2100B24400F6FEF4 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = EEE5CABF1C80361500CBBDD9 /* ProjectSettings.xcconfig */; @@ -3130,6 +3409,24 @@ /* 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; + }; + 1C1954CE21133DDE00A99F21 /* Build configuration list for PBXNativeTarget "IntegrationTests_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1C1954CF21133DDE00A99F21 /* Debug */, + 1C1954D021133DDE00A99F21 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 1C8F1B2E2100B24400F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib_tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( From ae04980b6b25e49a502b89273de6df2a38f5cb46 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Sat, 4 Aug 2018 22:26:43 +0300 Subject: [PATCH 11/81] update tvOS integration app --- IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard | 2 ++ 1 file changed, 2 insertions(+) diff --git a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard index a10a360b8..2425d1cbb 100644 --- a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard +++ b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard @@ -147,6 +147,7 @@ + @@ -164,6 +165,7 @@ + From 5cfb6a82e41fc2a96494fa1913f4c395dd83bdc0 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Sat, 4 Aug 2018 22:28:56 +0300 Subject: [PATCH 12/81] update wda commands --- WebDriverAgent.xcodeproj/project.pbxproj | 63 ++++++------ .../Categories/XCUIElement+FBTyping.m | 9 ++ .../Commands/FBElementCommands.m | 95 +++++-------------- .../Commands/FBOrientationCommands.h | 2 - .../Commands/FBOrientationCommands.m | 3 - ...teCommands.h => FBRemoteControlCommands.h} | 2 +- ...teCommands.m => FBRemoteControlCommands.m} | 4 +- WebDriverAgentLib/FBSpringboardApplication.m | 13 ++- 8 files changed, 81 insertions(+), 110 deletions(-) rename WebDriverAgentLib/Commands/{FBTvRemoteCommands.h => FBRemoteControlCommands.h} (87%) rename WebDriverAgentLib/Commands/{FBTvRemoteCommands.m => FBRemoteControlCommands.m} (94%) diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 6b9975d8c..0cae021ca 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -13,15 +13,17 @@ 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 /* FBTvRemoteCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C1954712112EF9100A99F21 /* FBTvRemoteCommands.h */; }; - 1C1954742112EF9100A99F21 /* FBTvRemoteCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954722112EF9100A99F21 /* FBTvRemoteCommands.m */; }; + 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 */; }; 1C1954B721133DDC00A99F21 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954B621133DDC00A99F21 /* ViewController.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 */; }; - 1C1954D82113540000A99F21 /* FBIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D72113540000A99F21 /* FBIntegrationTestCase.m */; }; - 1C1954DA2113554400A99F21 /* FBRAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D92113554400A99F21 /* FBRAlertTests.m */; }; + 1C1954D82113540000A99F21 /* FBTvIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D72113540000A99F21 /* FBTvIntegrationTestCase.m */; }; + 1C3C6FA121145D7700FAFD69 /* WebDriverAgentLib_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; }; + 1C3C6FA221145D7E00FAFD69 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954682111DC0800A99F21 /* libxml2.tbd */; }; + 1C3C6FA321145D8A00FAFD69 /* FBRAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D92113554400A99F21 /* FBRAlertTests.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 */; }; @@ -55,11 +57,9 @@ 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 */; }; - 1C8F1A532100B24400F6FEF4 /* FBTouchIDCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7631CAEDF0C008C271F /* FBTouchIDCommands.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 */; }; - 1C8F1A572100B24400F6FEF4 /* FBOrientationCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB75D1CAEDF0C008C271F /* FBOrientationCommands.m */; }; 1C8F1A582100B24400F6FEF4 /* XCUICoordinate+FBFix.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC9EED520064FAA00BC0D5B /* XCUICoordinate+FBFix.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 */; }; @@ -72,7 +72,6 @@ 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 */; }; - 1C8F1A642100B24400F6FEF4 /* FBAlertViewCommands.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7511CAEDF0C008C271F /* FBAlertViewCommands.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 */; }; @@ -102,11 +101,9 @@ 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, ); }; }; - 1C8F1A862100B24400F6FEF4 /* FBTouchIDCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7621CAEDF0C008C271F /* FBTouchIDCommands.h */; }; 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, ); }; }; - 1C8F1A8A2100B24400F6FEF4 /* FBOrientationCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB75C1CAEDF0C008C271F /* FBOrientationCommands.h */; }; 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, ); }; }; @@ -204,7 +201,6 @@ 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, ); }; }; - 1C8F1AEC2100B24400F6FEF4 /* FBAlertViewCommands.h in Headers */ = {isa = PBXBuildFile; fileRef = EE9AB7501CAEDF0C008C271F /* FBAlertViewCommands.h */; }; 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 */; }; @@ -599,6 +595,13 @@ remoteGlobalIDString = 1C1954AF21133DDC00A99F21; remoteInfo = IntegrationApp_tvOS; }; + 1C3C6F9F21145D6700FAFD69 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; + remoteInfo = WebDriverAgentLib_tvOS; + }; AD8D96F01D3C12960061268E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; @@ -708,8 +711,8 @@ /* 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 /* FBTvRemoteCommands.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBTvRemoteCommands.h; sourceTree = ""; }; - 1C1954722112EF9100A99F21 /* FBTvRemoteCommands.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTvRemoteCommands.m; sourceTree = ""; }; + 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 = ""; }; @@ -722,8 +725,8 @@ 1C1954C421133DDD00A99F21 /* IntegrationTests_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IntegrationTests_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; - 1C1954D62113540000A99F21 /* FBIntegrationTestCase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBIntegrationTestCase.h; sourceTree = ""; }; - 1C1954D72113540000A99F21 /* FBIntegrationTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBIntegrationTestCase.m; sourceTree = ""; }; + 1C1954D62113540000A99F21 /* FBTvIntegrationTestCase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBTvIntegrationTestCase.h; sourceTree = ""; }; + 1C1954D72113540000A99F21 /* FBTvIntegrationTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTvIntegrationTestCase.m; sourceTree = ""; }; 1C1954D92113554400A99F21 /* FBRAlertTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBRAlertTests.m; sourceTree = ""; }; 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebDriverAgentLib_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebDriverAgentRunner_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1070,6 +1073,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1C3C6FA221145D7E00FAFD69 /* libxml2.tbd in Frameworks */, + 1C3C6FA121145D7700FAFD69 /* WebDriverAgentLib_tvOS.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1157,8 +1162,8 @@ 1C19549021133B9000A99F21 /* IntegrationTests_tvOS */ = { isa = PBXGroup; children = ( - 1C1954D62113540000A99F21 /* FBIntegrationTestCase.h */, - 1C1954D72113540000A99F21 /* FBIntegrationTestCase.m */, + 1C1954D62113540000A99F21 /* FBTvIntegrationTestCase.h */, + 1C1954D72113540000A99F21 /* FBTvIntegrationTestCase.m */, 1C1954D92113554400A99F21 /* FBRAlertTests.m */, 1C19549321133B9000A99F21 /* Info.plist */, ); @@ -1369,8 +1374,8 @@ EE9AB7631CAEDF0C008C271F /* FBTouchIDCommands.m */, EE9AB7641CAEDF0C008C271F /* FBUnknownCommands.h */, EE9AB7651CAEDF0C008C271F /* FBUnknownCommands.m */, - 1C1954712112EF9100A99F21 /* FBTvRemoteCommands.h */, - 1C1954722112EF9100A99F21 /* FBTvRemoteCommands.m */, + 1C1954712112EF9100A99F21 /* FBRemoteControlCommands.h */, + 1C1954722112EF9100A99F21 /* FBRemoteControlCommands.m */, ); name = Commands; path = WebDriverAgentLib/Commands; @@ -1757,18 +1762,16 @@ 1C8F1A832100B24400F6FEF4 /* XCAccessibilityElement.h in Headers */, 1C8F1A842100B24400F6FEF4 /* FBSession.h in Headers */, 1C8F1A852100B24400F6FEF4 /* _XCTestImplementation.h in Headers */, - 1C8F1A862100B24400F6FEF4 /* FBTouchIDCommands.h in Headers */, 1C8F1A872100B24400F6FEF4 /* XCUIApplication.h in Headers */, 1C8F1A882100B24400F6FEF4 /* FBCustomCommands.h in Headers */, 1C8F1A892100B24400F6FEF4 /* _XCTestCaseInterruptionException.h in Headers */, - 1C8F1A8A2100B24400F6FEF4 /* FBOrientationCommands.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 /* FBTvRemoteCommands.h in Headers */, + 1C1954732112EF9100A99F21 /* FBRemoteControlCommands.h in Headers */, 1C8F1A912100B24400F6FEF4 /* XCTestMisuseObserver.h in Headers */, 1C8F1A922100B24400F6FEF4 /* XCTRunnerDaemonSession.h in Headers */, 1C8F1A932100B24400F6FEF4 /* FBApplication.h in Headers */, @@ -1860,7 +1863,6 @@ 1C8F1AE92100B24400F6FEF4 /* NSString+FBXMLSafeString.h in Headers */, 1C8F1AEA2100B24400F6FEF4 /* FBCommandStatus.h in Headers */, 1C8F1AEB2100B24400F6FEF4 /* XCElementSnapshot.h in Headers */, - 1C8F1AEC2100B24400F6FEF4 /* FBAlertViewCommands.h in Headers */, 1C8F1AED2100B24400F6FEF4 /* XCTWaiter.h in Headers */, 1C8F1AEE2100B24400F6FEF4 /* XCTWaiterManagement-Protocol.h in Headers */, 1C8F1AEF2100B24400F6FEF4 /* XCElementSnapshot+FBHitPoint.h in Headers */, @@ -2140,6 +2142,7 @@ buildRules = ( ); dependencies = ( + 1C3C6FA021145D6700FAFD69 /* PBXTargetDependency */, 1C1954C621133DDD00A99F21 /* PBXTargetDependency */, ); name = IntegrationTests_tvOS; @@ -2382,9 +2385,9 @@ EE9B75EB1CF7956C00275851 /* IntegrationTests_1 */, EE5095DD1EBCC9090028E2FE /* IntegrationTests_2 */, EE2202031ECC612200A29571 /* IntegrationTests_3 */, + 1C1954C321133DDD00A99F21 /* IntegrationTests_tvOS */, EE9B75D31CF7956C00275851 /* IntegrationApp */, 1C1954AF21133DDC00A99F21 /* IntegrationApp_tvOS */, - 1C1954C321133DDD00A99F21 /* IntegrationTests_tvOS */, ); }; /* End PBXProject section */ @@ -2489,8 +2492,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1C1954DA2113554400A99F21 /* FBRAlertTests.m in Sources */, - 1C1954D82113540000A99F21 /* FBIntegrationTestCase.m in Sources */, + 1C1954D82113540000A99F21 /* FBTvIntegrationTestCase.m in Sources */, + 1C3C6FA321145D8A00FAFD69 /* FBRAlertTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2531,11 +2534,9 @@ 1C8F1A502100B24400F6FEF4 /* FBResponseFilePayload.m in Sources */, 1C8F1A512100B24400F6FEF4 /* XCUIElement+FBWebDriverAttributes.m in Sources */, 1C8F1A522100B24400F6FEF4 /* XCUIElement+FBForceTouch.m in Sources */, - 1C8F1A532100B24400F6FEF4 /* FBTouchIDCommands.m in Sources */, 1C8F1A542100B24400F6FEF4 /* FBDebugCommands.m in Sources */, 1C8F1A552100B24400F6FEF4 /* NSString+FBXMLSafeString.m in Sources */, 1C8F1A562100B24400F6FEF4 /* FBUnknownCommands.m in Sources */, - 1C8F1A572100B24400F6FEF4 /* FBOrientationCommands.m in Sources */, 1C8F1A582100B24400F6FEF4 /* XCUICoordinate+FBFix.m in Sources */, 1C8F1A592100B24400F6FEF4 /* FBRuntimeUtils.m in Sources */, 1C8F1A5A2100B24400F6FEF4 /* XCUIElement+FBUtilities.m in Sources */, @@ -2548,12 +2549,11 @@ 1C8F1A612100B24400F6FEF4 /* FBSession.m in Sources */, 1C8F1A622100B24400F6FEF4 /* FBFindElementCommands.m in Sources */, 1C8F1A632100B24400F6FEF4 /* FBDebugLogDelegateDecorator.m in Sources */, - 1C8F1A642100B24400F6FEF4 /* FBAlertViewCommands.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 /* FBTvRemoteCommands.m in Sources */, + 1C1954742112EF9100A99F21 /* FBRemoteControlCommands.m in Sources */, 1C8F1A692100B24400F6FEF4 /* FBConfiguration.m in Sources */, 1C8F1A6A2100B24400F6FEF4 /* FBElementCache.m in Sources */, 1C8F1A6B2100B24400F6FEF4 /* FBAlert.m in Sources */, @@ -2760,6 +2760,11 @@ target = 1C1954AF21133DDC00A99F21 /* IntegrationApp_tvOS */; targetProxy = 1C1954C521133DDD00A99F21 /* PBXContainerItemProxy */; }; + 1C3C6FA021145D6700FAFD69 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; + targetProxy = 1C3C6F9F21145D6700FAFD69 /* PBXContainerItemProxy */; + }; AD8D96F11D3C12960061268E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */; diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m b/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m index 2c0a801dd..0ae834bc3 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; } @@ -38,6 +46,7 @@ - (BOOL)fb_clearTextWithError:(NSError **)error NSUInteger preClearTextLength = 0; NSData *encodedSequence = [@"\\u0008\\u007F" dataUsingEncoding:NSASCIIStringEncoding]; NSString *backspaceDeleteSequence = [[NSString alloc] initWithData:encodedSequence encoding:NSNonLossyASCIIStringEncoding]; + NSLog(@"DEBUG: length=%lu", [self.value fb_visualLength]); while ([self.value fb_visualLength] != preClearTextLength) { NSMutableString *textToType = @"".mutableCopy; preClearTextLength = [self.value fb_visualLength]; diff --git a/WebDriverAgentLib/Commands/FBElementCommands.m b/WebDriverAgentLib/Commands/FBElementCommands.m index bd69d6bad..56e35ba8f 100644 --- a/WebDriverAgentLib/Commands/FBElementCommands.m +++ b/WebDriverAgentLib/Commands/FBElementCommands.m @@ -63,6 +63,7 @@ + (NSArray *)routes [[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:)], #if TARGET_OS_TV [[FBRoute GET:@"/element/:uuid/focused"] respondWithTarget:self action:@selector(handleGetFocused:)], #endif @@ -81,7 +82,6 @@ + (NSArray *)routes [[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:)] @@ -155,6 +155,16 @@ + (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); +} +#endif + + (id)handleSetValue:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -190,35 +200,31 @@ + (NSArray *)routes return FBResponseWithElementUUID(elementUUID); } -+ (id)handleClick:(FBRouteRequest *)request ++ (id)handleClear:(FBRouteRequest *)request { - NSString *elementUUID = request.parameters[@"uuid"]; -#if TARGET_OS_IOS 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); } -#else - [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; -#endif return FBResponseWithElementUUID(elementUUID); } -+ (id)handleClear:(FBRouteRequest *)request +#if TARGET_OS_IOS ++ (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 (![element fb_tapWithError:&error]) { return FBResponseWithError(error); } return FBResponseWithElementUUID(elementUUID); } -#if TARGET_OS_IOS + (id)handleDoubleTap:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -226,9 +232,7 @@ + (NSArray *)routes [element doubleTap]; return FBResponseWithOK(); } -#endif -#if TARGET_OS_IOS + (id)handleDoubleTapCoordinate:(FBRouteRequest *)request { CGPoint doubleTapPoint = CGPointMake((CGFloat)[request.arguments[@"x"] doubleValue], (CGFloat)[request.arguments[@"y"] doubleValue]); @@ -236,9 +240,7 @@ + (NSArray *)routes [doubleTapCoordinate doubleTap]; return FBResponseWithOK(); } -#endif -#if TARGET_OS_IOS + (id)handleTwoFingerTap:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -246,33 +248,23 @@ + (NSArray *)routes [element twoFingerTap]; return FBResponseWithOK(); } -#endif + (id)handleTouchAndHold:(FBRouteRequest *)request { -#if TARGET_OS_IOS FBElementCache *elementCache = request.session.elementCache; XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; [element pressForDuration:[request.arguments[@"duration"] doubleValue]]; -#else - [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; -#endif return FBResponseWithOK(); } + (id)handleTouchAndHoldCoordinate:(FBRouteRequest *)request { -#if TARGET_OS_IOS CGPoint touchPoint = CGPointMake((CGFloat)[request.arguments[@"x"] doubleValue], (CGFloat)[request.arguments[@"y"] doubleValue]); XCUICoordinate *pressCoordinate = [self.class gestureCoordinateWithCoordinate:touchPoint application:request.session.application shouldApplyOrientationWorkaround:isSDKVersionLessThan(@"11.0")]; [pressCoordinate pressForDuration:[request.arguments[@"duration"] doubleValue]]; -#else - [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; -#endif return FBResponseWithOK(); } -#if TARGET_OS_IOS + (id)handleForceTouch:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -285,9 +277,7 @@ + (NSArray *)routes } return FBResponseWithOK(); } -#endif -#if TARGET_OS_IOS + (id)handleForceTouchByCoordinateOnElement:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -301,7 +291,6 @@ + (NSArray *)routes } return FBResponseWithOK(); } -#endif + (id)handleScroll:(FBRouteRequest *)request { @@ -321,7 +310,6 @@ + (NSArray *)routes NSString *const direction = request.arguments[@"direction"]; if (direction) { -#if TARGET_OS_IOS NSString *const distanceString = request.arguments[@"distance"] ?: @"1.0"; CGFloat distance = (CGFloat)distanceString.doubleValue; if ([direction isEqualToString:@"up"]) { @@ -333,9 +321,6 @@ + (NSArray *)routes } else if ([direction isEqualToString:@"right"]) { [element fb_scrollRightByNormalizedDistance:distance]; } -#else - [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; -#endif return FBResponseWithOK(); } @@ -355,7 +340,6 @@ + (NSArray *)routes return FBResponseWithErrorFormat(@"Unsupported scroll type"); } -#if TARGET_OS_IOS + (id)handleDragCoordinate:(FBRouteRequest *)request { FBSession *session = request.session; @@ -383,11 +367,9 @@ + (NSArray *)routes [startCoordinate pressForDuration:duration thenDragToCoordinate:endCoordinate]; return FBResponseWithOK(); } -#endif + (id)handleSwipe:(FBRouteRequest *)request { -#if TARGET_OS_IOS FBElementCache *elementCache = request.session.elementCache; XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; NSString *const direction = request.arguments[@"direction"]; @@ -405,40 +387,27 @@ + (NSArray *)routes } else { return FBResponseWithErrorFormat(@"Unsupported swipe type"); } -#else - [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; -#endif return FBResponseWithOK(); } + + (id)handleTap:(FBRouteRequest *)request { -#if TARGET_OS_IOS CGPoint tapPoint = CGPointMake((CGFloat)[request.arguments[@"x"] doubleValue], (CGFloat)[request.arguments[@"y"] doubleValue]); -#endif FBElementCache *elementCache = request.session.elementCache; XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; if (nil == element) { -#if TARGET_OS_IOS XCUICoordinate *tapCoordinate = [self.class gestureCoordinateWithCoordinate:tapPoint application:request.session.application shouldApplyOrientationWorkaround:isSDKVersionLessThan(@"11.0")]; [tapCoordinate tap]; -#else - [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; -#endif } else { -#if TARGET_OS_IOS NSError *error; if (![element fb_tapCoordinate:tapPoint error:&error]) { return FBResponseWithError(error); } -#else - [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; -#endif } return FBResponseWithOK(); } -#if TARGET_OS_IOS + (id)handlePinch:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -448,7 +417,7 @@ + (NSArray *)routes [element pinchWithScale:scale velocity:velocity]; return FBResponseWithOK(); } -#endif +#endif // TARGET_OS_IOS + (id)handleKeys:(FBRouteRequest *)request { @@ -520,17 +489,6 @@ + (NSArray *)routes } return FBResponseWithOK(); } -#endif - -#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); -} -#endif #pragma mark - Helpers @@ -539,14 +497,10 @@ + (NSArray *)routes if (!element.exists) { return FBResponseWithErrorFormat(@"Can't scroll to element that does not exist"); } -#if TARGET_OS_IOS NSError *error; if (![element fb_scrollToVisibleWithError:&error]) { return FBResponseWithError(error); } -#else - [NSException raise:@"NotImplemented" format:@"tvOS logic is not implemented."]; -#endif return FBResponseWithOK(); } @@ -563,7 +517,6 @@ screen orientation is different from the default one (which is portrait). the current screen orientation would be portrait. @return translated gesture coordinates ready to be passed to XCUICoordinate methods */ -#if TARGET_OS_IOS + (XCUICoordinate *)gestureCoordinateWithCoordinate:(CGPoint)coordinate application:(XCUIApplication *)application shouldApplyOrientationWorkaround:(BOOL)shouldApplyOrientationWorkaround { CGPoint point = coordinate; @@ -595,9 +548,7 @@ + (XCUICoordinate *)gestureCoordinateWithCoordinate:(CGPoint)coordinate applicat } return [self gestureCoordinateWithCoordinate:point element:element]; } -#endif -#if !TARGET_OS_TV /** Returns gesture coordinate based on the specified element. @@ -610,6 +561,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 +#endif // TARGET_OS_IOS @end diff --git a/WebDriverAgentLib/Commands/FBOrientationCommands.h b/WebDriverAgentLib/Commands/FBOrientationCommands.h index e0892b474..50bd5b6b1 100644 --- a/WebDriverAgentLib/Commands/FBOrientationCommands.h +++ b/WebDriverAgentLib/Commands/FBOrientationCommands.h @@ -12,11 +12,9 @@ #import NS_ASSUME_NONNULL_BEGIN -#if TARGET_OS_IOS @interface FBOrientationCommands : NSObject @end -#endif NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Commands/FBOrientationCommands.m b/WebDriverAgentLib/Commands/FBOrientationCommands.m index e4f2c5dda..933885bf2 100644 --- a/WebDriverAgentLib/Commands/FBOrientationCommands.m +++ b/WebDriverAgentLib/Commands/FBOrientationCommands.m @@ -15,7 +15,6 @@ #import "FBApplication.h" #import "XCUIDevice.h" -#if TARGET_OS_IOS extern const struct FBWDOrientationValues { FBLiteralString portrait; FBLiteralString landscapeLeft; @@ -125,5 +124,3 @@ + (NSDictionary *)_orientationsMapping } @end - -#endif diff --git a/WebDriverAgentLib/Commands/FBTvRemoteCommands.h b/WebDriverAgentLib/Commands/FBRemoteControlCommands.h similarity index 87% rename from WebDriverAgentLib/Commands/FBTvRemoteCommands.h rename to WebDriverAgentLib/Commands/FBRemoteControlCommands.h index aa594076b..237e6f332 100644 --- a/WebDriverAgentLib/Commands/FBTvRemoteCommands.h +++ b/WebDriverAgentLib/Commands/FBRemoteControlCommands.h @@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN -@interface FBTvRemoteCommands : NSObject +@interface FBRemoteControlCommands : NSObject @end diff --git a/WebDriverAgentLib/Commands/FBTvRemoteCommands.m b/WebDriverAgentLib/Commands/FBRemoteControlCommands.m similarity index 94% rename from WebDriverAgentLib/Commands/FBTvRemoteCommands.m rename to WebDriverAgentLib/Commands/FBRemoteControlCommands.m index 7a6b54020..26a099b1e 100644 --- a/WebDriverAgentLib/Commands/FBTvRemoteCommands.m +++ b/WebDriverAgentLib/Commands/FBRemoteControlCommands.m @@ -7,14 +7,14 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import "FBTvRemoteCommands.h" +#import "FBRemoteControlCommands.h" #import #import "FBRoute.h" #import "FBRouteRequest.h" -@implementation FBTvRemoteCommands +@implementation FBRemoteControlCommands #pragma mark - diff --git a/WebDriverAgentLib/FBSpringboardApplication.m b/WebDriverAgentLib/FBSpringboardApplication.m index d3986fedf..ec0e681d3 100644 --- a/WebDriverAgentLib/FBSpringboardApplication.m +++ b/WebDriverAgentLib/FBSpringboardApplication.m @@ -23,6 +23,7 @@ #import "XCUIElementQuery.h" NSString *const SPRINGBOARD_BUNDLE_ID = @"com.apple.springboard"; +NSString *const HEADBOARD_BUNDLE_ID = @"com.apple.HeadBoard"; @implementation FBSpringboardApplication @@ -31,7 +32,12 @@ + (instancetype)fb_springboard static FBSpringboardApplication *_springboardApp; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ +#if TARGET_OS_IOS _springboardApp = [[FBSpringboardApplication alloc] initPrivateWithPath:nil bundleID:SPRINGBOARD_BUNDLE_ID]; +#elif TARGET_OS_TV + _springboardApp = [[FBSpringboardApplication alloc] initPrivateWithPath:nil bundleID:HEADBOARD_BUNDLE_ID]; +#endif + }); [_springboardApp query]; [_springboardApp resolve]; @@ -51,10 +57,10 @@ - (BOOL)fb_tapApplicationWithIdentifier:(NSString *)identifier error:(NSError ** XCUIElement *appElement = [matchedAppElements lastObject]; if (!appElement.fb_isVisible) { CGRect startFrame = appElement.frame; + NSString *errorDescription = [NSString stringWithFormat:@"Cannot scroll to Springboard icon for '%@' application", identifier]; #if !TARGET_OS_TV BOOL shouldSwipeToTheRight = startFrame.origin.x < 0; #endif - NSString *errorDescription = [NSString stringWithFormat:@"Cannot scroll to Springboard icon for '%@' application", identifier]; do { #if !TARGET_OS_TV if (shouldSwipeToTheRight) { @@ -107,9 +113,14 @@ - (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; +#endif +#if TARGET_OS_TV + return self.collectionViews[@"GridCollectionView"].isEnabled; +#endif } @end From 784ced8cdd6636f01b1001d0c9176049b0461c8a Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Mon, 6 Aug 2018 12:27:22 +0300 Subject: [PATCH 13/81] add new category for XCUIApplication --- WebDriverAgent.xcodeproj/project.pbxproj | 17 ++++++++++++-- .../Categories/XCUIApplication+FBFocused.h | 22 +++++++++++++++++++ .../Categories/XCUIApplication+FBFocused.m | 18 +++++++++++++++ .../Commands/FBFindElementCommands.m | 6 +++-- 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h create mode 100644 WebDriverAgentLib/Categories/XCUIApplication+FBFocused.m diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 0cae021ca..2d95c10d9 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -24,6 +24,8 @@ 1C3C6FA121145D7700FAFD69 /* WebDriverAgentLib_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; }; 1C3C6FA221145D7E00FAFD69 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954682111DC0800A99F21 /* libxml2.tbd */; }; 1C3C6FA321145D8A00FAFD69 /* FBRAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D92113554400A99F21 /* FBRAlertTests.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 */; }; 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 */; }; @@ -728,6 +730,8 @@ 1C1954D62113540000A99F21 /* FBTvIntegrationTestCase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBTvIntegrationTestCase.h; sourceTree = ""; }; 1C1954D72113540000A99F21 /* FBTvIntegrationTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTvIntegrationTestCase.m; sourceTree = ""; }; 1C1954D92113554400A99F21 /* FBRAlertTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBRAlertTests.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 = ""; }; 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebDriverAgentLib_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebDriverAgentRunner_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 44757A831D42CE8300ECF35E /* XCUIDeviceRotationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XCUIDeviceRotationTests.m; sourceTree = ""; }; @@ -1312,6 +1316,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 */, @@ -1823,6 +1829,7 @@ 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 */, @@ -2330,6 +2337,7 @@ TargetAttributes = { 1C1954AF21133DDC00A99F21 = { CreatedOnToolsVersion = 10.0; + DevelopmentTeam = U9WLLAC7UL; ProvisioningStyle = Automatic; }; 1C1954C321133DDD00A99F21 = { @@ -2560,6 +2568,7 @@ 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 */, @@ -2840,6 +2849,7 @@ 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"; @@ -2848,7 +2858,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 12.0; + TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; @@ -2864,6 +2874,7 @@ 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"; @@ -2871,7 +2882,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 12.0; + TVOS_DEPLOYMENT_TARGET = 9.0; }; name = Release; }; @@ -2950,6 +2961,7 @@ SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -2983,6 +2995,7 @@ SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; diff --git a/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h b/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h new file mode 100644 index 000000000..3ed9ca0d5 --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h @@ -0,0 +1,22 @@ +// +// XCUIApplication+FBFocused.h +// WebDriverAgentLib_tvOS +// +// Created by Pavel Serdiukov on 8/6/18. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XCUIApplication (FBFocused) + +/** + Return current focused element + */ +- (XCUIElement*) 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..f8c4babe9 --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.m @@ -0,0 +1,18 @@ +// +// XCUIApplication+FBFocused.m +// WebDriverAgentLib_tvOS +// +// Created by Pavel Serdiukov on 8/6/18. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import "XCUIApplication+FBFocused.h" + +@implementation XCUIApplication (FBFocused) + +- (XCUIElement*) fb_focusedElement { + XCUIElementQuery *query = [self descendantsMatchingType:XCUIElementTypeAny]; + return [query elementMatchingPredicate: [NSPredicate predicateWithFormat:@"hasFocus == true"]]; +} + +@end diff --git a/WebDriverAgentLib/Commands/FBFindElementCommands.m b/WebDriverAgentLib/Commands/FBFindElementCommands.m index 63d5ba3f5..29d8697e5 100644 --- a/WebDriverAgentLib/Commands/FBFindElementCommands.m +++ b/WebDriverAgentLib/Commands/FBFindElementCommands.m @@ -22,6 +22,7 @@ #import "XCUIElement+FBFind.h" #import "XCUIElement+FBIsVisible.h" #import "XCUIElement+FBClassChain.h" +#import "XCUIApplication+FBFocused.h" static id FBNoSuchElementErrorResponseForRequest(FBRouteRequest *request) { @@ -103,13 +104,14 @@ + (NSArray *)routes return FBResponseWithCachedElements(foundElements, request.session.elementCache, FBConfiguration.shouldUseCompactResponses); } +#if TARGET_OS_TV + (id)handleFindFocusedElement:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; - XCUIElementQuery *query = [[FBApplication fb_activeApplication] descendantsMatchingType:XCUIElementTypeAny]; - XCUIElement *element = [query elementMatchingPredicate: [NSPredicate predicateWithFormat:@"hasFocus == true"]]; + XCUIElement *element = [[FBApplication fb_activeApplication] fb_focusedElement]; return FBResponseWithElementUUID([elementCache storeElement:element]); } +#endif #pragma mark - Helpers From edef34cdd1dfe3571d139a622541702c8daf88f4 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Mon, 6 Aug 2018 12:28:22 +0300 Subject: [PATCH 14/81] update springboard app for tvOS --- .../Categories/XCUIApplication+FBHelpers.m | 9 ++- WebDriverAgentLib/Commands/FBCustomCommands.m | 15 +++- WebDriverAgentLib/FBSpringboardApplication.h | 15 ++++ WebDriverAgentLib/FBSpringboardApplication.m | 78 +++++++++++++++++-- 4 files changed, 106 insertions(+), 11 deletions(-) diff --git a/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m b/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m index 3e34136f0..d8e001319 100644 --- a/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +++ b/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m @@ -35,7 +35,14 @@ - (BOOL)fb_deactivateWithDuration:(NSTimeInterval)duration error:(NSError **)err [self fb_activate]; return YES; } - return [[FBSpringboardApplication fb_springboard] fb_tapApplicationWithIdentifier:applicationIdentifier error:error]; +#if TARGET_OS_IOS + return [[FBSpringboardApplication fb_springboard] fb_tapApplicationWithIdentifier:applicationIdentifier + error:error]; +#elif TARGET_OS_TV + return [[FBSpringboardApplication fb_springboard] fb_selectApplicationWithIdentifier:applicationIdentifier + error:error]; +#endif + } - (NSDictionary *)fb_tree diff --git a/WebDriverAgentLib/Commands/FBCustomCommands.m b/WebDriverAgentLib/Commands/FBCustomCommands.m index c562f8e83..a5ba00195 100644 --- a/WebDriverAgentLib/Commands/FBCustomCommands.m +++ b/WebDriverAgentLib/Commands/FBCustomCommands.m @@ -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/FBSpringboardApplication.h b/WebDriverAgentLib/FBSpringboardApplication.h index 7de642a5b..c60f2b7f9 100644 --- a/WebDriverAgentLib/FBSpringboardApplication.h +++ b/WebDriverAgentLib/FBSpringboardApplication.h @@ -21,6 +21,8 @@ extern NSString *const SPRINGBOARD_BUNDLE_ID; */ + (instancetype)fb_springboard; +#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/FBSpringboardApplication.m b/WebDriverAgentLib/FBSpringboardApplication.m index ec0e681d3..e47bea824 100644 --- a/WebDriverAgentLib/FBSpringboardApplication.m +++ b/WebDriverAgentLib/FBSpringboardApplication.m @@ -21,6 +21,7 @@ #import "XCUIElement+FBScrolling.h" #import "XCUIElement.h" #import "XCUIElementQuery.h" +#import "XCUIApplication+FBFocused.h" NSString *const SPRINGBOARD_BUNDLE_ID = @"com.apple.springboard"; NSString *const HEADBOARD_BUNDLE_ID = @"com.apple.HeadBoard"; @@ -44,6 +45,8 @@ + (instancetype)fb_springboard return _springboardApp; } +#if TARGET_OS_IOS + - (BOOL)fb_tapApplicationWithIdentifier:(NSString *)identifier error:(NSError **)error { XCUIElementQuery *appElementsQuery = [[self descendantsMatchingType:XCUIElementTypeIcon] matchingIdentifier:identifier]; @@ -58,17 +61,14 @@ - (BOOL)fb_tapApplicationWithIdentifier:(NSString *)identifier error:(NSError ** if (!appElement.fb_isVisible) { CGRect startFrame = appElement.frame; NSString *errorDescription = [NSString stringWithFormat:@"Cannot scroll to Springboard icon for '%@' application", identifier]; -#if !TARGET_OS_TV BOOL shouldSwipeToTheRight = startFrame.origin.x < 0; -#endif do { -#if !TARGET_OS_TV if (shouldSwipeToTheRight) { [self swipeRight]; } else { [self swipeLeft]; } -#endif + BOOL isSwipeSuccessful = [appElement fb_waitUntilFrameIsStable] && [[[[FBRunLoopSpinner new] timeout:1] @@ -82,11 +82,9 @@ - (BOOL)fb_tapApplicationWithIdentifier:(NSString *)identifier error:(NSError ** } } while (!appElement.fb_isVisible); } -#if TARGET_OS_IOS if (![appElement fb_tapWithError:error]) { return NO; } -#endif return [[[[FBRunLoopSpinner new] interval:0.3] @@ -99,6 +97,36 @@ - (BOOL)fb_tapApplicationWithIdentifier:(NSString *)identifier error:(NSError ** } 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 (![self findElementOnGrid: appElement withError: 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 { return @@ -117,10 +145,44 @@ - (BOOL)fb_isApplicationBoardVisible // 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; -#endif -#if TARGET_OS_TV +#elif TARGET_OS_TV return self.collectionViews[@"GridCollectionView"].isEnabled; #endif } +#pragma mark - Helpers + +#if TARGET_OS_TV +- (BOOL) findElementOnGrid:(XCUIElement*) element withError:(NSError **)error { + BOOL isMovingRight = YES; + XCUIElement *current; + XCUIElement *previous; + BOOL isEndReached = NO; + + while (!element.exists || !element.hasFocus) { + XCUIRemoteButton button = isMovingRight ? XCUIRemoteButtonRight : XCUIRemoteButtonLeft; + [[XCUIRemote sharedRemote] pressButton: button]; + current = [self fb_focusedElement]; + + if (previous && [current isEqual:previous]) { + // line end reached + [[XCUIRemote sharedRemote] pressButton: XCUIRemoteButtonDown]; + isMovingRight = !isMovingRight; + current = [self fb_focusedElement]; + if ([current isEqual: previous]) { + if (isEndReached) { + return [[[FBErrorBuilder builder] + withDescription:@"Cannot navigate to Headboard icon for application"] + buildError:error]; + } else { + isEndReached = YES; + } + } + } + previous = current; + } + return YES; +} +#endif + @end From 7848265e46294e948a1544ba40bdec7362ab6a52 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Thu, 20 Sep 2018 11:27:36 +0300 Subject: [PATCH 15/81] minor bugfix --- WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h | 4 ++++ WebDriverAgentLib/Categories/XCUICoordinate+FBFix.m | 3 +++ WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h | 5 ++++- WebDriverAgentLib/Categories/XCUIElement+FBTyping.m | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h index ccbe1ce88..695713462 100644 --- a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h +++ b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h @@ -8,10 +8,14 @@ */ #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 a2de74ce0..30c454088 100644 --- a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.m +++ b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.m @@ -12,7 +12,9 @@ #import "XCUICoordinate.h" #import "XCUIElement+FBUtilities.h" #import "XCElementSnapshot+FBHitPoint.h" + #if !TARGET_OS_TV + @implementation XCUICoordinate (FBFix) - (CGPoint)fb_screenPoint @@ -37,4 +39,5 @@ - (CGPoint)fb_screenPoint } @end + #endif diff --git a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h index d23164627..9804096b9 100644 --- a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h +++ b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h @@ -11,7 +11,9 @@ #import NS_ASSUME_NONNULL_BEGIN -#if !TARGET_OS_TV + +#if TARGET_OS_IOS + @interface XCUIDevice (FBRotation) /** @@ -34,6 +36,7 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic, readonly) NSDictionary *fb_rotationMapping; @end + #endif NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m b/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m index 0ae834bc3..1cb4a0064 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m @@ -27,7 +27,7 @@ - (BOOL)fb_typeText:(NSString *)text frequency:(NSUInteger)frequency error:(NSEr // 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];; + [[[FBErrorBuilder builder] withDescription:@"Keyboard is not opened."] buildError:error]; return NO; } #else From 68eada8e2f3214d34f1c1c04d79875909d93a555 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Tue, 2 Oct 2018 12:40:47 +0300 Subject: [PATCH 16/81] remove package-lock --- Inspector/package-lock.json | 6081 ----------------------------------- 1 file changed, 6081 deletions(-) delete mode 100644 Inspector/package-lock.json diff --git a/Inspector/package-lock.json b/Inspector/package-lock.json deleted file mode 100644 index 732b9d5e6..000000000 --- a/Inspector/package-lock.json +++ /dev/null @@ -1,6081 +0,0 @@ -{ - "name": "web-driver-inspector", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, - "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "alter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", - "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", - "requires": { - "stable": "~0.1.3" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "array.prototype.find": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", - "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-traverse": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", - "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=" - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=" - }, - "async": { - "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer-core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/autoprefixer-core/-/autoprefixer-core-5.2.1.tgz", - "integrity": "sha1-5kDEFK5Bmq4hwa1DyOoPPbgqVm0=", - "requires": { - "browserslist": "~0.4.0", - "caniuse-db": "^1.0.30000214", - "num2fraction": "^1.1.0", - "postcss": "~4.1.12" - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, - "babel-core": { - "version": "5.8.38", - "resolved": "http://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", - "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", - "requires": { - "babel-plugin-constant-folding": "^1.0.1", - "babel-plugin-dead-code-elimination": "^1.0.2", - "babel-plugin-eval": "^1.0.1", - "babel-plugin-inline-environment-variables": "^1.0.1", - "babel-plugin-jscript": "^1.0.4", - "babel-plugin-member-expression-literals": "^1.0.1", - "babel-plugin-property-literals": "^1.0.1", - "babel-plugin-proto-to-assign": "^1.0.3", - "babel-plugin-react-constant-elements": "^1.0.3", - "babel-plugin-react-display-name": "^1.0.3", - "babel-plugin-remove-console": "^1.0.1", - "babel-plugin-remove-debugger": "^1.0.1", - "babel-plugin-runtime": "^1.0.7", - "babel-plugin-undeclared-variables-check": "^1.0.2", - "babel-plugin-undefined-to-void": "^1.1.6", - "babylon": "^5.8.38", - "bluebird": "^2.9.33", - "chalk": "^1.0.0", - "convert-source-map": "^1.1.0", - "core-js": "^1.0.0", - "debug": "^2.1.1", - "detect-indent": "^3.0.0", - "esutils": "^2.0.0", - "fs-readdir-recursive": "^0.1.0", - "globals": "^6.4.0", - "home-or-tmp": "^1.0.0", - "is-integer": "^1.0.4", - "js-tokens": "1.0.1", - "json5": "^0.4.0", - "lodash": "^3.10.0", - "minimatch": "^2.0.3", - "output-file-sync": "^1.1.0", - "path-exists": "^1.0.0", - "path-is-absolute": "^1.0.0", - "private": "^0.1.6", - "regenerator": "0.8.40", - "regexpu": "^1.3.0", - "repeating": "^1.1.2", - "resolve": "^1.1.6", - "shebang-regex": "^1.0.0", - "slash": "^1.0.0", - "source-map": "^0.5.0", - "source-map-support": "^0.2.10", - "to-fast-properties": "^1.0.0", - "trim-right": "^1.0.0", - "try-resolve": "^1.0.0" - } - }, - "babel-eslint": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", - "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "babel-traverse": "^6.23.1", - "babel-types": "^6.23.0", - "babylon": "^6.17.0" - }, - "dependencies": { - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - } - } - }, - "babel-loader": { - "version": "5.4.2", - "resolved": "http://registry.npmjs.org/babel-loader/-/babel-loader-5.4.2.tgz", - "integrity": "sha1-d/4o2OYNDwVrHBvKJbhJTNqrnHY=", - "requires": { - "babel-core": "^5.4.0", - "loader-utils": "^0.2.9", - "object-assign": "^3.0.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - } - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-constant-folding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", - "integrity": "sha1-g2HTZMmORJw2kr26Ue/whEKQqo4=" - }, - "babel-plugin-dead-code-elimination": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", - "integrity": "sha1-X3xFEnTc18zNv7s+C4XdKBIfD2U=" - }, - "babel-plugin-eval": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", - "integrity": "sha1-ovrtJc5r5preS/7CY/cBaRlZUNo=" - }, - "babel-plugin-inline-environment-variables": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", - "integrity": "sha1-H1jOkSB61qgmqL9kX6/mj/X+P/4=" - }, - "babel-plugin-jscript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", - "integrity": "sha1-jzQsOCduh6R9X6CovT1etsytj8w=" - }, - "babel-plugin-member-expression-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", - "integrity": "sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM=" - }, - "babel-plugin-property-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", - "integrity": "sha1-AlIwGQAZKYCxwRjv6kjOk6q4MzY=" - }, - "babel-plugin-proto-to-assign": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", - "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", - "requires": { - "lodash": "^3.9.3" - } - }, - "babel-plugin-react-constant-elements": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", - "integrity": "sha1-lGc26DeEKcvDSdz/YvUcFDs041o=" - }, - "babel-plugin-react-display-name": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", - "integrity": "sha1-dU/jiSboQkpOexWrbqYTne4FFPw=" - }, - "babel-plugin-remove-console": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", - "integrity": "sha1-2PJFVsOgUAXUKqqv0neH9T/wE6c=" - }, - "babel-plugin-remove-debugger": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", - "integrity": "sha1-/S6jzWGkKK0fO5yJiC/0KT6MFMc=" - }, - "babel-plugin-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", - "integrity": "sha1-v3x9lm3Vbs1cF/ocslPJrLflSq8=" - }, - "babel-plugin-undeclared-variables-check": { - "version": "1.0.2", - "resolved": "http://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", - "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", - "requires": { - "leven": "^1.0.2" - } - }, - "babel-plugin-undefined-to-void": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", - "integrity": "sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E=" - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", - "dev": true - } - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "babylon": { - "version": "5.8.38", - "resolved": "http://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", - "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "binary-extensions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==" - }, - "bluebird": { - "version": "2.11.0", - "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" - }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "breakable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", - "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=" - }, - "browserify-aes": { - "version": "0.4.0", - "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", - "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", - "requires": { - "inherits": "^2.0.1" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "requires": { - "pako": "~0.2.0" - } - }, - "browserslist": { - "version": "0.4.0", - "resolved": "http://registry.npmjs.org/browserslist/-/browserslist-0.4.0.tgz", - "integrity": "sha1-O9SrkZncG5FQ1NbbpNnTqrvIbdQ=", - "requires": { - "caniuse-db": "^1.0.30000153" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "caniuse-db": { - "version": "1.0.30000888", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000888.tgz", - "integrity": "sha512-bp7cHptv4AQZFtkyzYk2bJN5E8CSYklm6K3bJ/fGUa52oxydzBKK4uYlZ+A0lNIiThRFJMoXU2TacG9ve2KpXw==" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/color/-/color-0.10.1.tgz", - "integrity": "sha1-wEGI34KiCd3rzOzazT7DIPGTc58=", - "requires": { - "color-convert": "^0.5.3", - "color-string": "^0.3.0" - } - }, - "color-convert": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", - "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=" - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "requires": { - "color-name": "^1.0.0" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "requires": { - "color": "^0.11.0", - "css-color-names": "0.0.4", - "has": "^1.0.1" - }, - "dependencies": { - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - } - } - }, - "commander": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", - "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==" - }, - "commoner": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", - "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", - "requires": { - "commander": "^2.5.0", - "detective": "^4.3.1", - "glob": "^5.0.15", - "graceful-fs": "^4.1.2", - "iconv-lite": "^0.4.5", - "mkdirp": "^0.5.0", - "private": "^0.1.6", - "q": "^1.1.2", - "recast": "^0.11.17" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - } - } - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "compressible": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", - "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", - "dev": true, - "requires": { - "mime-db": ">= 1.36.0 < 2" - } - }, - "compression": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", - "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.14", - "debug": "2.6.9", - "on-headers": "~1.0.1", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "create-react-class": { - "version": "15.6.3", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", - "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", - "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "crypto-browserify": { - "version": "3.3.0", - "resolved": "http://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", - "integrity": "sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw=", - "requires": { - "browserify-aes": "0.4.0", - "pbkdf2-compat": "2.0.1", - "ripemd160": "0.2.0", - "sha.js": "2.2.6" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-list": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/css-list/-/css-list-0.1.3.tgz", - "integrity": "sha1-p7M7RBn4PUEjIN3pEzoNEASUjXA=" - }, - "css-loader": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.16.0.tgz", - "integrity": "sha1-lpBoRAWYgswbO1ValxLNrFXoXy4=", - "requires": { - "css-selector-tokenizer": "^0.5.1", - "cssnano": "^2.1.0", - "loader-utils": "~0.2.2", - "postcss": "^4.1.11", - "postcss-modules-extract-imports": "0.0.5", - "postcss-modules-local-by-default": "0.0.11", - "postcss-modules-scope": "0.0.8", - "source-list-map": "^0.1.4" - } - }, - "css-selector-tokenizer": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.5.4.tgz", - "integrity": "sha1-E5uv00o1/QwUKEhwSeBpnm9qLCE=", - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1" - } - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "2.6.1", - "resolved": "http://registry.npmjs.org/cssnano/-/cssnano-2.6.1.tgz", - "integrity": "sha1-f7NyEsz/RNPpNuAmxvZ14xR9gCQ=", - "requires": { - "autoprefixer-core": "^5.2.1", - "balanced-match": "^0.2.0", - "css-list": "^0.1.2", - "decamelize": "^1.0.0", - "defined": "^1.0.0", - "indexes-of": "^1.0.1", - "minimist": "^1.1.3", - "postcss": "^4.1.16", - "postcss-calc": "^4.1.0", - "postcss-colormin": "^1.2.5", - "postcss-convert-values": "^1.2.4", - "postcss-discard-comments": "^1.2.1", - "postcss-discard-duplicates": "^1.1.5", - "postcss-discard-empty": "^1.1.2", - "postcss-discard-unused": "^1.0.3", - "postcss-filter-plugins": "^1.0.0", - "postcss-font-family": "^1.2.1", - "postcss-merge-idents": "^1.0.1", - "postcss-merge-longhand": "^1.0.1", - "postcss-merge-rules": "^1.3.5", - "postcss-minify-font-weight": "^1.0.1", - "postcss-minify-selectors": "^1.5.0", - "postcss-normalize-url": "^2.1.1", - "postcss-ordered-values": "^1.0.1", - "postcss-reduce-idents": "^1.0.2", - "postcss-single-charset": "^0.3.0", - "postcss-unique-selectors": "^1.0.0", - "postcss-zindex": "^1.1.3", - "read-file-stdin": "^0.2.0", - "write-file-stdout": "0.0.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", - "integrity": "sha1-e8ZYtL7WHu5CStdPdfXD4sTfPMc=" - } - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "defs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", - "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", - "requires": { - "alter": "~0.2.0", - "ast-traverse": "~0.1.1", - "breakable": "~1.0.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "simple-fmt": "~0.1.0", - "simple-is": "~0.2.0", - "stringmap": "~0.2.2", - "stringset": "~0.2.1", - "tryor": "~0.1.2", - "yargs": "~3.27.0" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", - "requires": { - "get-stdin": "^4.0.1", - "minimist": "^1.1.0", - "repeating": "^1.1.0" - } - }, - "detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "requires": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "enhanced-resolve": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", - "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" - }, - "dependencies": { - "memory-fs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", - "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=" - } - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "~1.0.1" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.46", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", - "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-promise": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", - "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=" - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", - "dev": true, - "requires": { - "babel-code-frame": "^6.16.0", - "chalk": "^1.1.3", - "concat-stream": "^1.5.2", - "debug": "^2.1.1", - "doctrine": "^2.0.0", - "escope": "^3.6.0", - "espree": "^3.4.0", - "esquery": "^1.0.0", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.14.0", - "ignore": "^3.2.0", - "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", - "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.7.5", - "strip-bom": "^3.0.0", - "strip-json-comments": "~2.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - } - } - } - }, - "eslint-plugin-babel": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-4.1.2.tgz", - "integrity": "sha1-eSAqDjV1fdkngJGbIzbx+i/lPB4=", - "dev": true - }, - "eslint-plugin-flowtype": { - "version": "2.50.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz", - "integrity": "sha512-X+AoKVOr7Re0ko/yEXyM5SSZ0tazc6ffdIOocp2fFUlWoDt7DV0Bz99mngOkAFLOAWjqRA5jPwqUCbrx13XoxQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "eslint-plugin-react": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", - "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", - "dev": true, - "requires": { - "array.prototype.find": "^2.0.1", - "doctrine": "^1.2.2", - "has": "^1.0.1", - "jsx-ast-utils": "^1.3.4", - "object.assign": "^4.0.4" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - } - } - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=" - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "requires": { - "fill-range": "^2.1.0" - } - }, - "express": { - "version": "4.16.3", - "resolved": "http://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", - "qs": "6.5.1", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" - } - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" - } - }, - "flatten": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-0.0.1.tgz", - "integrity": "sha1-VURAdm2goNYDmZ9DNFP2wvxqdcE=" - }, - "follow-redirects": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.8.tgz", - "integrity": "sha512-sy1mXPmv7kLAMKW/8XofG7o9T+6gAjzdZK4AJF6ryqQYUa/hnzgiypoeUecZ53x7XiqKNEpNqLtS97MshW2nxg==", - "dev": true, - "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "^1.0.1" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "fs-extra": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.14.0.tgz", - "integrity": "sha1-RmCWxroticIAA4DaskULeFn/Z0M=", - "requires": { - "jsonfile": "^2.0.0", - "ncp": "^1.0.1", - "rimraf": "^2.2.8" - } - }, - "fs-readdir-recursive": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", - "integrity": "sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk=" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gather-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gather-stream/-/gather-stream-1.0.0.tgz", - "integrity": "sha1-szmUr0V6gRVwDUEPMXczy+egkEs=" - }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "dev": true, - "requires": { - "is-property": "^1.0.2" - } - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - } - }, - "globals": { - "version": "6.4.1", - "resolved": "http://registry.npmjs.org/globals/-/globals-6.4.1.tgz", - "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=" - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "home-or-tmp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", - "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", - "requires": { - "os-tmpdir": "^1.0.1", - "user-home": "^1.1.1" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", - "dev": true - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "dev": true, - "requires": { - "eventemitter3": "^3.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", - "dev": true, - "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^3.1.0", - "lodash": "^4.17.2", - "micromatch": "^2.3.11" - }, - "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "inquirer": { - "version": "0.12.0", - "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true, - "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^2.0.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - } - } - }, - "interpret": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", - "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-integer": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", - "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true - }, - "is-my-json-valid": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", - "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } - }, - "javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=" - }, - "js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=" - }, - "js-tokens": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", - "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=" - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.4.0", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.4.0.tgz", - "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=" - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsx-ast-utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", - "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "leven": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", - "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=" - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - }, - "dependencies": { - "json5": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - } - } - }, - "lodash": { - "version": "3.10.1", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memory-fs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", - "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true - }, - "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, - "requires": { - "mime-db": "~1.36.0" - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", - "dev": true - }, - "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "ncp": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz", - "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=" - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "node-balanced": { - "version": "0.0.14", - "resolved": "https://registry.npmjs.org/node-balanced/-/node-balanced-0.0.14.tgz", - "integrity": "sha1-ozxyeFfTBE8eiL5y3X2anQtPwh8=" - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "node-libs-browser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", - "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.1.4", - "buffer": "^4.9.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "3.3.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "0.0.1", - "os-browserify": "^0.2.0", - "path-browserify": "0.0.0", - "process": "^0.11.0", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.0.5", - "stream-browserify": "^2.0.1", - "stream-http": "^2.3.1", - "string_decoder": "^0.10.25", - "timers-browserify": "^2.0.2", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-selector": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", - "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=" - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "open": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", - "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", - "dev": true - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" - } - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "path-exists": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", - "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "pbkdf2-compat": { - "version": "2.0.1", - "resolved": "http://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", - "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "4.1.16", - "resolved": "http://registry.npmjs.org/postcss/-/postcss-4.1.16.tgz", - "integrity": "sha1-TESbTIr53zyvbTf44eV10DYXWNw=", - "requires": { - "es6-promise": "~2.3.0", - "js-base64": "~2.1.8", - "source-map": "~0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "postcss-calc": { - "version": "4.1.0", - "resolved": "http://registry.npmjs.org/postcss-calc/-/postcss-calc-4.1.0.tgz", - "integrity": "sha1-vuf/ySjHmGmZ7vF7LdiXDIk31HI=", - "requires": { - "postcss": "^4.1.11", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.0" - } - }, - "postcss-colormin": { - "version": "1.2.7", - "resolved": "http://registry.npmjs.org/postcss-colormin/-/postcss-colormin-1.2.7.tgz", - "integrity": "sha1-63Pb6DgE6pGYNWsTL2+Z9GAP1lQ=", - "requires": { - "color": "^0.10.1", - "colormin": "^1.0.3", - "postcss": "^4.1.16", - "reduce-function-call": "^1.0.1" - } - }, - "postcss-convert-values": { - "version": "1.3.1", - "resolved": "http://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-1.3.1.tgz", - "integrity": "sha1-I/GHxhP6d7Y3p4BblIteCJlpDkY=", - "requires": { - "postcss": "^4.1.16", - "postcss-value-parser": "^1.1.0" - } - }, - "postcss-discard-comments": { - "version": "1.2.1", - "resolved": "http://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-1.2.1.tgz", - "integrity": "sha1-hR3Ka5NUwPtjFssaEEj29eOWCtA=", - "requires": { - "node-balanced": "0.0.14", - "postcss": "^4.1.16" - } - }, - "postcss-discard-duplicates": { - "version": "1.2.1", - "resolved": "http://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-1.2.1.tgz", - "integrity": "sha1-SbsztNNHcQWwDQSDlfc6KQK8miU=", - "requires": { - "postcss": "^4.1.16" - } - }, - "postcss-discard-empty": { - "version": "1.1.2", - "resolved": "http://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-1.1.2.tgz", - "integrity": "sha1-KsVayPy4HCMEPmMQaTT9Y0cNXA0=", - "requires": { - "postcss": "^4.1.13" - } - }, - "postcss-discard-unused": { - "version": "1.0.3", - "resolved": "http://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-1.0.3.tgz", - "integrity": "sha1-Xsy5v6xGXqa+VjQpepx3gczQmIY=", - "requires": { - "flatten": "0.0.1", - "postcss": "^4.1.16", - "uniqs": "^2.0.0" - } - }, - "postcss-filter-plugins": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-1.0.1.tgz", - "integrity": "sha1-J/gnnV76t6o8FwmIE5hrS50dUOI=", - "requires": { - "postcss": "^4.1.11", - "uniqid": "^1.0.0" - } - }, - "postcss-font-family": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-font-family/-/postcss-font-family-1.2.1.tgz", - "integrity": "sha1-dQJSSzmDox5q9k5LqhA07W7YQYw=", - "requires": { - "object-assign": "^3.0.0", - "postcss": "^4.1.16", - "uniqs": "^2.0.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - } - } - }, - "postcss-merge-idents": { - "version": "1.0.2", - "resolved": "http://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-1.0.2.tgz", - "integrity": "sha1-qToNrXj2UugjfZrew0LkHSwd01s=", - "requires": { - "css-list": "^0.1.0", - "postcss": "^4.1.9" - } - }, - "postcss-merge-longhand": { - "version": "1.0.2", - "resolved": "http://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-1.0.2.tgz", - "integrity": "sha1-QxcgZfz4We4RztMUH1ZkFMZzBX4=", - "requires": { - "postcss": "^4.1.16" - } - }, - "postcss-merge-rules": { - "version": "1.3.6", - "resolved": "http://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-1.3.6.tgz", - "integrity": "sha1-sUrRf31AEqMYut032r1ZuT8TUy8=", - "requires": { - "postcss": "^4.1.16" - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" - }, - "postcss-minify-font-weight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-font-weight/-/postcss-minify-font-weight-1.0.1.tgz", - "integrity": "sha1-aI5CzfI27Osb1WOojPHSTQOgWIg=", - "requires": { - "postcss": "^4.1.11" - } - }, - "postcss-minify-selectors": { - "version": "1.5.0", - "resolved": "http://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-1.5.0.tgz", - "integrity": "sha1-5ZxWxtSVXaFXz30iv4Bptur1Jic=", - "requires": { - "javascript-natural-sort": "^0.7.1", - "normalize-selector": "^0.2.0", - "postcss": "^4.1.16", - "postcss-selector-parser": "^1.1.2", - "uniqs": "^2.0.0" - } - }, - "postcss-modules-extract-imports": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-0.0.5.tgz", - "integrity": "sha1-zMy0Cz3SmFmZOEodumDGLJYKbaA=", - "requires": { - "postcss": "^4.1.11" - } - }, - "postcss-modules-local-by-default": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-0.0.11.tgz", - "integrity": "sha1-qACvQyHDpOCFLRrlKeb8mRrTlec=", - "requires": { - "css-selector-tokenizer": "^0.5.1", - "postcss": "^4.1.5" - } - }, - "postcss-modules-scope": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-0.0.8.tgz", - "integrity": "sha1-gck1+/KJJyOIyLoulqEcohugmgQ=", - "requires": { - "css-selector-tokenizer": "^0.5.0", - "postcss": "^4.1.11" - } - }, - "postcss-normalize-url": { - "version": "2.1.3", - "resolved": "http://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-2.1.3.tgz", - "integrity": "sha1-8StfShFDyV6gJfx/jgBQkFmPNgI=", - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.3.0", - "object-assign": "^4.0.1", - "postcss": "^4.1.16", - "postcss-value-parser": "^1.4.2" - } - }, - "postcss-ordered-values": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-1.1.1.tgz", - "integrity": "sha1-nu1PrS55Kr/D0EAs93O6+G/ne4E=", - "requires": { - "postcss": "^4.1.16", - "postcss-value-parser": "^1.1.0" - } - }, - "postcss-reduce-idents": { - "version": "1.0.3", - "resolved": "http://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-1.0.3.tgz", - "integrity": "sha1-p58bJIXiPZs8x6gfXsY6XCvewg0=", - "requires": { - "postcss": "^4.1.2", - "reduce-function-call": "^1.0.1" - } - }, - "postcss-selector-parser": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-1.3.3.tgz", - "integrity": "sha1-0u4Z33pk+O8hwacchvfUg1yIwoE=", - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "dependencies": { - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" - } - } - }, - "postcss-single-charset": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/postcss-single-charset/-/postcss-single-charset-0.3.0.tgz", - "integrity": "sha1-2n/Q3szPYy8bdMei7j41vilFZXM=", - "requires": { - "fs-extra": "^0.14.0", - "postcss": "^4.1.0" - } - }, - "postcss-unique-selectors": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-1.0.1.tgz", - "integrity": "sha1-SBfnTHtPmZzgTI5mRRoZaRT12zw=", - "requires": { - "javascript-natural-sort": "^0.7.1", - "postcss": "^4.1.10", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-1.4.2.tgz", - "integrity": "sha1-GGVjPhNwH4pyHng02tGFyxRKrQw=" - }, - "postcss-zindex": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/postcss-zindex/-/postcss-zindex-1.1.3.tgz", - "integrity": "sha1-SVZKtJ092hcGf42sHIM11/LQDOE=", - "requires": { - "postcss": "^4.1.2" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" - } - }, - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", - "dev": true - }, - "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } - } - }, - "react": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/react/-/react-15.6.1.tgz", - "integrity": "sha1-uqhDTsZ4C96ZfNw4C3nNM7ljk98=", - "requires": { - "create-react-class": "^15.6.0", - "fbjs": "^0.8.9", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.0", - "prop-types": "^15.5.10" - } - }, - "react-button": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-button/-/react-button-1.2.1.tgz", - "integrity": "sha1-xDHRWzuF5FDK7WmwBlh96DtploI=", - "requires": { - "object-assign": "^2.0.0", - "react-style-normalizer": "^1.1.5" - }, - "dependencies": { - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" - } - } - }, - "react-dom": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", - "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", - "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.0", - "prop-types": "^15.5.10" - } - }, - "react-style-normalizer": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/react-style-normalizer/-/react-style-normalizer-1.2.8.tgz", - "integrity": "sha1-foSz0lzqYiVUXFr2iWOyJYhTRKI=" - }, - "react-treeview": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/react-treeview/-/react-treeview-0.4.7.tgz", - "integrity": "sha1-9kfgT3BJbrEfsJEsNRh+gOtg1Fg=", - "requires": { - "prop-types": "^15.5.8" - } - }, - "read-file-stdin": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/read-file-stdin/-/read-file-stdin-0.2.1.tgz", - "integrity": "sha1-JezP86FTtoCa+ssj7hU4fbng7mE=", - "requires": { - "gather-stream": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "mute-stream": "0.0.5" - } - }, - "recast": { - "version": "0.10.33", - "resolved": "http://registry.npmjs.org/recast/-/recast-0.10.33.tgz", - "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", - "requires": { - "ast-types": "0.8.12", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "dependencies": { - "ast-types": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", - "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=" - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "http://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "requires": { - "balanced-match": "^0.4.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerator": { - "version": "0.8.40", - "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", - "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", - "requires": { - "commoner": "~0.10.3", - "defs": "~1.1.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "recast": "0.10.33", - "through": "~2.3.8" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpu": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", - "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", - "requires": { - "esprima": "^2.6.0", - "recast": "^0.10.10", - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" - } - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "requires": { - "path-parse": "^1.0.5" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "^7.0.5" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "ripemd160": { - "version": "0.2.0", - "resolved": "http://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", - "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=" - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "dev": true, - "requires": { - "once": "^1.3.0" - } - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "sha.js": { - "version": "2.2.6", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", - "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=" - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "simple-ajax": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/simple-ajax/-/simple-ajax-2.6.0.tgz", - "integrity": "sha1-ApSdYbXZqqk4KdflwPCmMnkp4UQ=", - "requires": { - "query-string": "^1.0.0" - }, - "dependencies": { - "query-string": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/query-string/-/query-string-1.0.1.tgz", - "integrity": "sha1-Y6yVM1JJmtZwqWgadWgPa/PdH68=" - } - } - }, - "simple-fmt": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", - "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=" - }, - "simple-is": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", - "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=" - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", - "requires": { - "source-map": "0.1.32" - }, - "dependencies": { - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-cache": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stream-cache/-/stream-cache-0.0.2.tgz", - "integrity": "sha1-GsWtaDJCjKVWZ9ve45Xa1ObbEY8=", - "dev": true - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringmap": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", - "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=" - }, - "stringset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", - "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "style-loader": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.12.4.tgz", - "integrity": "sha1-rn0GZdxNxlPaov6Xu5CRS8HSLZs=", - "requires": { - "loader-utils": "^0.2.7" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "table": { - "version": "3.8.3", - "resolved": "http://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", - "dev": true, - "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", - "slice-ansi": "0.0.4", - "string-width": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "tapable": { - "version": "0.1.10", - "resolved": "http://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", - "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "time-stamp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.1.0.tgz", - "integrity": "sha512-lJbq6KsFhZJtN3fPUVje1tq/hHsJOKUUcUj/MGCiQR6qWBDcyi5kxL9J7/RnaEChCn0+L/DUN2WvemDrkk4i3Q==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "requires": { - "setimmediate": "^1.0.4" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - } - } - } - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "try-resolve": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", - "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=" - }, - "tryor": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", - "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=" - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.18", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", - "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==" - }, - "uglify-js": { - "version": "2.7.5", - "resolved": "http://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", - "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "http://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "uniqid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-1.0.0.tgz", - "integrity": "sha1-JYJSTgdASESkLelPviv1SeG3RVU=" - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "url-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", - "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", - "dev": true, - "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", - "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", - "requires": { - "async": "^0.9.0", - "chokidar": "^1.0.0", - "graceful-fs": "^4.1.2" - }, - "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "http://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - } - } - }, - "webpack": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.15.0.tgz", - "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=", - "requires": { - "acorn": "^3.0.0", - "async": "^1.3.0", - "clone": "^1.0.2", - "enhanced-resolve": "~0.9.0", - "interpret": "^0.6.4", - "loader-utils": "^0.2.11", - "memory-fs": "~0.3.0", - "mkdirp": "~0.5.0", - "node-libs-browser": "^0.7.0", - "optimist": "~0.6.0", - "supports-color": "^3.1.0", - "tapable": "~0.1.8", - "uglify-js": "~2.7.3", - "watchpack": "^0.2.1", - "webpack-core": "~0.6.9" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "requires": { - "source-list-map": "~0.1.7", - "source-map": "~0.4.1" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", - "dev": true, - "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } - } - }, - "webpack-dev-server": { - "version": "1.16.5", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-1.16.5.tgz", - "integrity": "sha1-DL1fLSrI1OWTqs1clwLnu9XlmJI=", - "dev": true, - "requires": { - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", - "express": "^4.13.3", - "http-proxy-middleware": "~0.17.1", - "open": "0.0.5", - "optimist": "~0.6.1", - "serve-index": "^1.7.2", - "sockjs": "^0.3.15", - "sockjs-client": "^1.0.3", - "stream-cache": "~0.0.1", - "strip-ansi": "^3.0.0", - "supports-color": "^3.1.1", - "webpack-dev-middleware": "^1.10.2" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-stdout": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/write-file-stdout/-/write-file-stdout-0.0.2.tgz", - "integrity": "sha1-wlLXx8WxtAKJdjDjRTx7/mkNnKE=" - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yargs": { - "version": "3.27.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", - "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", - "requires": { - "camelcase": "^1.2.1", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" - } - } - } -} From b110ade90d1dc15304da07ef559f1e2c70a8a677 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Tue, 2 Oct 2018 16:52:55 +0300 Subject: [PATCH 17/81] setup integration tests --- WebDriverAgent.xcodeproj/project.pbxproj | 163 +++++++++++++++-- .../xcschemes/IntegrationApp.xcscheme | 91 ++++++++++ .../xcschemes/IntegrationTests_1.xcscheme | 56 ++++++ .../xcschemes/IntegrationTests_tvOS.xcscheme | 56 ++++++ .../IntegrationTests_tvOS/FBRAlertTests.m | 168 ++++++++++++++++++ .../FBTvIntegrationTestCase.h | 58 ++++++ .../FBTvIntegrationTestCase.m | 106 +++++++++++ .../IntegrationTests_tvOS/Info.plist | 22 +++ 8 files changed, 710 insertions(+), 10 deletions(-) create mode 100644 WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp.xcscheme create mode 100644 WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_1.xcscheme create mode 100644 WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_tvOS.xcscheme create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBRAlertTests.m create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/Info.plist diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index e8dc5991d..a7bddd871 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -26,6 +26,17 @@ 1C3C6FA321145D8A00FAFD69 /* FBRAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D92113554400A99F21 /* FBRAlertTests.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 */; }; + 1C3C6FAE21184F2D00FAFD69 /* FBElementAttributeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE26409C1D0EBA25009BE6B0 /* FBElementAttributeTests.m */; }; + 1C3C6FB021184F2D00FAFD69 /* FBIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = EE1E06D91D1808C2007CF043 /* FBIntegrationTestCase.m */; }; + 1C3C6FB121184F2D00FAFD69 /* FBKeyboardTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE05BAF91D13003C00A3EB00 /* FBKeyboardTests.m */; }; + 1C3C6FB321184F2D00FAFD69 /* FBFailureProofTestCaseTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6A89361D0B35920083E92B /* FBFailureProofTestCaseTests.m */; }; + 1C3C6FB421184F2D00FAFD69 /* FBElementVisibilityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE006EAC1EB99B15006900A4 /* FBElementVisibilityTests.m */; }; + 1C3C6FB521184F2D00FAFD69 /* FBAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9B76991CF799F400275851 /* FBAlertTests.m */; }; + 1C88FDF4214AAD0700202D0D /* XCUIElement+FBTVInteract.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVInteract.h */; }; + 1C88FDF5214AAD0700202D0D /* XCUIElement+FBTVInteract.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVInteract.m */; }; + 1C88FDFB214ACCC400202D0D /* XCUIElement+FBFocuse.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C88FDF9214ACCC400202D0D /* XCUIElement+FBFocuse.h */; }; + 1C88FDFC214ACCC400202D0D /* XCUIElement+FBFocuse.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C88FDFA214ACCC400202D0D /* XCUIElement+FBFocuse.m */; }; + 1C88FDFD214ACDC200202D0D /* XCUIElement+FBFocuse.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C88FDF9214ACCC400202D0D /* XCUIElement+FBFocuse.h */; }; 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 */; }; @@ -49,7 +60,6 @@ 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 */; }; - 1C8F1A492100B24400F6FEF4 /* XCUIDevice+FBRotation.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE3763E1D59F81400ED88DD /* XCUIDevice+FBRotation.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 */; }; @@ -62,7 +72,6 @@ 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 */; }; - 1C8F1A582100B24400F6FEF4 /* XCUICoordinate+FBFix.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC9EED520064FAA00BC0D5B /* XCUICoordinate+FBFix.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 */; }; @@ -130,7 +139,6 @@ 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, ); }; }; - 1C8F1AA32100B24400F6FEF4 /* XCUICoordinate+FBFix.h in Headers */ = {isa = PBXBuildFile; fileRef = EEC9EED420064FAA00BC0D5B /* XCUICoordinate+FBFix.h */; }; 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, ); }; }; @@ -230,7 +238,6 @@ 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, ); }; }; - 1C8F1B082100B24400F6FEF4 /* XCUIDevice+FBRotation.h in Headers */ = {isa = PBXBuildFile; fileRef = EEE3763D1D59F81400ED88DD /* XCUIDevice+FBRotation.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, ); }; }; @@ -265,6 +272,10 @@ 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, ); }; }; + 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 */; }; 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, ); }; }; @@ -579,8 +590,8 @@ 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 */ @@ -607,6 +618,20 @@ remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; remoteInfo = WebDriverAgentLib_tvOS; }; + 1C3C6FBF21184F8400FAFD69 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C1954AF21133DDC00A99F21; + remoteInfo = IntegrationApp_tvOS; + }; + 1CD0FBE0211850A90092C929 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; + remoteInfo = WebDriverAgentLib_tvOS; + }; AD8D96F01D3C12960061268E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; @@ -735,6 +760,11 @@ 1C1954D92113554400A99F21 /* FBRAlertTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBRAlertTests.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; }; + 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVInteract.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XCUIElement+FBTVInteract.h"; sourceTree = ""; }; + 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVInteract.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "XCUIElement+FBTVInteract.m"; sourceTree = ""; }; + 1C88FDF9214ACCC400202D0D /* XCUIElement+FBFocuse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XCUIElement+FBFocuse.h"; sourceTree = ""; }; + 1C88FDFA214ACCC400202D0D /* XCUIElement+FBFocuse.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "XCUIElement+FBFocuse.m"; sourceTree = ""; }; 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WebDriverAgentLib_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WebDriverAgentRunner_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 1FC3B2E12121EC8C00B61EE0 /* FBApplicationProcessProxyTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBApplicationProcessProxyTests.m; sourceTree = ""; }; @@ -944,8 +974,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 = ""; }; @@ -1088,12 +1118,23 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1C3C6FB621184F2D00FAFD69 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1CD0FBE3211850BD0092C929 /* WebDriverAgentLib_tvOS.framework in Frameworks */, + 1CD0FBE2211850B80092C929 /* libxml2.tbd 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; }; @@ -1257,6 +1298,7 @@ 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */, 1C1954B021133DDC00A99F21 /* IntegrationApp_tvOS.app */, 1C1954C421133DDD00A99F21 /* IntegrationTests_tvOS.xctest */, + 1C3C6FBD21184F2D00FAFD69 /* IntegrationTests_1_tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -1360,6 +1402,10 @@ EEE376401D59F81400ED88DD /* XCUIElement+FBUtilities.m */, EEE376471D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.h */, EEE376481D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.m */, + 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVInteract.h */, + 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVInteract.m */, + 1C88FDF9214ACCC400202D0D /* XCUIElement+FBFocuse.h */, + 1C88FDFA214ACCC400202D0D /* XCUIElement+FBFocuse.m */, ); name = Categories; path = WebDriverAgentLib/Categories; @@ -1789,6 +1835,7 @@ 1C8F1A8F2100B24400F6FEF4 /* XCApplicationQuery.h in Headers */, 1C8F1A902100B24400F6FEF4 /* XCTAsyncActivity.h in Headers */, 1C1954732112EF9100A99F21 /* FBRemoteControlCommands.h in Headers */, + 1C88FDF4214AAD0700202D0D /* XCUIElement+FBTVInteract.h in Headers */, 1C8F1A912100B24400F6FEF4 /* XCTestMisuseObserver.h in Headers */, 1C8F1A922100B24400F6FEF4 /* XCTRunnerDaemonSession.h in Headers */, 1C8F1A932100B24400F6FEF4 /* FBApplication.h in Headers */, @@ -1804,10 +1851,10 @@ 1C8F1A9D2100B24400F6FEF4 /* _XCKVOExpectationImplementation.h in Headers */, 1C8F1A9E2100B24400F6FEF4 /* NSString+FBVisualLength.h in Headers */, 1C8F1A9F2100B24400F6FEF4 /* FBXCTestDaemonsProxy.h in Headers */, + 1C88FDFB214ACCC400202D0D /* XCUIElement+FBFocuse.h in Headers */, 1C8F1AA02100B24400F6FEF4 /* XCUIElementHitPointCoordinate.h in Headers */, 1C8F1AA12100B24400F6FEF4 /* XCTDarwinNotificationExpectation.h in Headers */, 1C8F1AA22100B24400F6FEF4 /* XCTRunnerAutomationSession.h in Headers */, - 1C8F1AA32100B24400F6FEF4 /* XCUICoordinate+FBFix.h in Headers */, 1C8F1AA42100B24400F6FEF4 /* XCSourceCodeTreeNodeEnumerator.h in Headers */, 1C8F1AA52100B24400F6FEF4 /* XCUIElement+FBIsVisible.h in Headers */, 1C8F1AA62100B24400F6FEF4 /* FBXPathCreator.h in Headers */, @@ -1908,7 +1955,6 @@ 1C8F1B052100B24400F6FEF4 /* XCTUIApplicationMonitor-Protocol.h in Headers */, 1C8F1B062100B24400F6FEF4 /* XCElementSnapshot+FBHelpers.h in Headers */, 1C8F1B072100B24400F6FEF4 /* XCTKVOExpectation.h in Headers */, - 1C8F1B082100B24400F6FEF4 /* XCUIDevice+FBRotation.h in Headers */, 1C8F1B092100B24400F6FEF4 /* XCEventGenerator.h in Headers */, 1C8F1B0A2100B24400F6FEF4 /* FBConfiguration.h in Headers */, 1C8F1B0B2100B24400F6FEF4 /* XCTestSuiteRun.h in Headers */, @@ -2062,6 +2108,7 @@ EE158AC81CBD456F00A3E3F0 /* FBSessionCommands.h in Headers */, EE158AE31CBD456F00A3E3F0 /* FBSession-Private.h in Headers */, 716E0BCE1E917E810087A825 /* NSString+FBXMLSafeString.h in Headers */, + 1C88FDFD214ACDC200202D0D /* XCUIElement+FBFocuse.h in Headers */, EE158ACF1CBD456F00A3E3F0 /* FBCommandStatus.h in Headers */, EE35AD2D1E3B77D600A02D78 /* XCElementSnapshot.h in Headers */, EE158AB81CBD456F00A3E3F0 /* FBAlertViewCommands.h in Headers */, @@ -2168,6 +2215,25 @@ productReference = 1C1954C421133DDD00A99F21 /* IntegrationTests_tvOS.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; + 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"; + }; 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */ = { isa = PBXNativeTarget; buildConfigurationList = 1C8F1B2E2100B24400F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib_tvOS" */; @@ -2356,6 +2422,9 @@ ProvisioningStyle = Automatic; TestTargetID = 1C1954AF21133DDC00A99F21; }; + 1C3C6FA821184F2D00FAFD69 = { + TestTargetID = 1C1954AF21133DDC00A99F21; + }; 1C8F1A302100B24400F6FEF4 = { DevelopmentTeam = U9WLLAC7UL; }; @@ -2407,6 +2476,7 @@ 1C1954C321133DDD00A99F21 /* IntegrationTests_tvOS */, EE9B75D31CF7956C00275851 /* IntegrationApp */, 1C1954AF21133DDC00A99F21 /* IntegrationApp_tvOS */, + 1C3C6FA821184F2D00FAFD69 /* IntegrationTests_1_tvOS */, ); }; /* End PBXProject section */ @@ -2427,6 +2497,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1C3C6FB921184F2D00FAFD69 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1C8F1B2A2100B24400F6FEF4 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2516,6 +2593,19 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1C3C6FAD21184F2D00FAFD69 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C3C6FAE21184F2D00FAFD69 /* FBElementAttributeTests.m in Sources */, + 1C3C6FB021184F2D00FAFD69 /* FBIntegrationTestCase.m in Sources */, + 1C3C6FB121184F2D00FAFD69 /* FBKeyboardTests.m in Sources */, + 1C3C6FB321184F2D00FAFD69 /* FBFailureProofTestCaseTests.m in Sources */, + 1C3C6FB421184F2D00FAFD69 /* FBElementVisibilityTests.m in Sources */, + 1C3C6FB521184F2D00FAFD69 /* FBAlertTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1C8F1A312100B24400F6FEF4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2523,6 +2613,7 @@ 1C8F1A322100B24400F6FEF4 /* FBScreenshotCommands.m in Sources */, 1C8F1A332100B24400F6FEF4 /* FBPredicate.m in Sources */, 1C8F1A342100B24400F6FEF4 /* XCUIElement+FBPickerWheel.m in Sources */, + 1C88FDF5214AAD0700202D0D /* XCUIElement+FBTVInteract.m in Sources */, 1C8F1A352100B24400F6FEF4 /* FBXPath.m in Sources */, 1C8F1A362100B24400F6FEF4 /* FBWebServer.m in Sources */, 1C8F1A372100B24400F6FEF4 /* FBErrorBuilder.m in Sources */, @@ -2543,7 +2634,6 @@ 1C8F1A462100B24400F6FEF4 /* FBRunLoopSpinner.m in Sources */, 1C8F1A472100B24400F6FEF4 /* FBClassChainQueryParser.m in Sources */, 1C8F1A482100B24400F6FEF4 /* NSPredicate+FBFormat.m in Sources */, - 1C8F1A492100B24400F6FEF4 /* XCUIDevice+FBRotation.m in Sources */, 1C8F1A4A2100B24400F6FEF4 /* XCUIElement+FBUID.m in Sources */, 1C8F1A4B2100B24400F6FEF4 /* FBRouteRequest.m in Sources */, 1C8F1A4C2100B24400F6FEF4 /* FBResponseJSONPayload.m in Sources */, @@ -2556,7 +2646,6 @@ 1C8F1A542100B24400F6FEF4 /* FBDebugCommands.m in Sources */, 1C8F1A552100B24400F6FEF4 /* NSString+FBXMLSafeString.m in Sources */, 1C8F1A562100B24400F6FEF4 /* FBUnknownCommands.m in Sources */, - 1C8F1A582100B24400F6FEF4 /* XCUICoordinate+FBFix.m in Sources */, 1C8F1A592100B24400F6FEF4 /* FBRuntimeUtils.m in Sources */, 1C8F1A5A2100B24400F6FEF4 /* XCUIElement+FBUtilities.m in Sources */, 1C8F1A5B2100B24400F6FEF4 /* FBLogger.m in Sources */, @@ -2585,6 +2674,7 @@ 1C8F1A712100B24400F6FEF4 /* FBApplication.m in Sources */, 1C8F1A722100B24400F6FEF4 /* FBXCTestDaemonsProxy.m in Sources */, 1C8F1A732100B24400F6FEF4 /* XCUIElement+FBTap.m in Sources */, + 1C88FDFC214ACCC400202D0D /* XCUIElement+FBFocuse.m in Sources */, 1C8F1A742100B24400F6FEF4 /* FBMathUtils.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2786,6 +2876,16 @@ target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; targetProxy = 1C3C6F9F21145D6700FAFD69 /* PBXContainerItemProxy */; }; + 1C3C6FC021184F8400FAFD69 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C1954AF21133DDC00A99F21 /* IntegrationApp_tvOS */; + targetProxy = 1C3C6FBF21184F8400FAFD69 /* PBXContainerItemProxy */; + }; + 1CD0FBE1211850A90092C929 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; + targetProxy = 1CD0FBE0211850A90092C929 /* PBXContainerItemProxy */; + }; AD8D96F11D3C12960061268E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */; @@ -2944,6 +3044,39 @@ }; 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; + }; 1C8F1B2F2100B24400F6FEF4 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = EEE5CABF1C80361500CBBDD9 /* ProjectSettings.xcconfig */; @@ -2960,6 +3093,7 @@ 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", @@ -3459,6 +3593,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 1C3C6FBA21184F2D00FAFD69 /* Build configuration list for PBXNativeTarget "IntegrationTests_1_tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1C3C6FBB21184F2D00FAFD69 /* Debug */, + 1C3C6FBC21184F2D00FAFD69 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 1C8F1B2E2100B24400F6FEF4 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib_tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( 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/IntegrationTests_1.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_1.xcscheme new file mode 100644 index 000000000..7ae175928 --- /dev/null +++ b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_1.xcscheme @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_tvOS.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_tvOS.xcscheme new file mode 100644 index 000000000..fb49cd740 --- /dev/null +++ b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_tvOS.xcscheme @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBRAlertTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBRAlertTests.m new file mode 100644 index 000000000..c1e702860 --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBRAlertTests.m @@ -0,0 +1,168 @@ +/** + * 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 + +#import "FBTvIntegrationTestCase.h" +#import "FBTestMacros.h" +#import "XCUIElement+FBTap.h" + + +@interface FBRAlertTests : FBTvIntegrationTestCase +@end + +@implementation FBRAlertTests + +- (void)setUp +{ + [super setUp]; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self launchApplication]; + [self goToAlertsPage]; + }); +} + +- (void)tearDown +{ + [super tearDown]; + [[FBAlert alertWithApplication:self.testedApplication] dismissWithError:nil]; +} + +- (void)showApplicationAlert +{ + [self selectElement: self.testedApplication.buttons[FBShowAlertButtonName]]; + XCUIElementQuery* query = self.testedApplication.alerts; + FBAssertWaitTillBecomesTrue(query.count != 0); +} + +- (void)showApplicationSheet +{ + [self selectElement: self.testedApplication.buttons[FBShowSheetAlertButtonName]]; + FBAssertWaitTillBecomesTrue(self.testedApplication.sheets.count != 0); +} + +- (void)testAlertException +{ + XCTAssertThrowsSpecificNamed([FBAlert throwRequestedItemObstructedByAlertException], NSException, FBAlertObstructingElementException); +} + +- (void)testAlertPresence +{ + FBAlert *alert = [FBAlert alertWithApplication:self.testedApplication]; + XCTAssertFalse(alert.isPresent); + [self showApplicationAlert]; + XCTAssertTrue(alert.isPresent); +} + +- (void)testAlertText +{ + FBAlert *alert = [FBAlert alertWithApplication:self.testedApplication]; + XCTAssertNil(alert.text); + [self showApplicationAlert]; + XCTAssertTrue([alert.text containsString:@"Magic"]); + XCTAssertTrue([alert.text containsString:@"Should read"]); +} + +- (void)testAlertLabels +{ + FBAlert* alert = [FBAlert alertWithApplication:self.testedApplication]; + XCTAssertNil(alert.buttonLabels); + [self showApplicationAlert]; + XCTAssertNotNil(alert.buttonLabels); + XCTAssertEqual(1, alert.buttonLabels.count); + XCTAssertEqualObjects(@"Will do", alert.buttonLabels[0]); +} + +- (void)testSelectAlertButton +{ + FBAlert* alert = [FBAlert alertWithApplication:self.testedApplication]; + XCTAssertFalse([alert clickAlertButton:@"Invalid" error:nil]); + [self showApplicationAlert]; + XCTAssertFalse([alert clickAlertButton:@"Invalid" error:nil]); + XCTAssertTrue([alert clickAlertButton:@"Will do" error:nil]); +} + +- (void)testAcceptingAlert +{ + NSError *error; + [self showApplicationAlert]; + XCTAssertTrue([[FBAlert alertWithApplication:self.testedApplication] acceptWithError:&error]); + FBAssertWaitTillBecomesTrue(self.testedApplication.alerts.count == 0); + XCTAssertNil(error); +} + +- (void)testDismissingAlert +{ + NSError *error; + [self showApplicationAlert]; + XCTAssertTrue([[FBAlert alertWithApplication:self.testedApplication] dismissWithError:&error]); + FBAssertWaitTillBecomesTrue(self.testedApplication.alerts.count == 0); + XCTAssertNil(error); +} + +- (void)testAlertElement +{ + [self showApplicationAlert]; + XCUIElement *alertElement = [FBAlert alertWithApplication:self.testedApplication].alertElement; + XCTAssertTrue(alertElement.exists); + XCTAssertTrue(alertElement.elementType == XCUIElementTypeAlert); +} + +- (void)testFilteringObstructedElements +{ + FBAlert *alert = [FBAlert alertWithApplication:self.testedApplication]; + XCUIElement *showAlertButton = self.testedApplication.buttons[FBShowAlertButtonName]; + XCUIElement *acceptAlertButton = self.testedApplication.buttons[@"Will do"]; + [self showApplicationAlert]; + + NSArray *filteredElements = [alert filterObstructedElements:@[showAlertButton, acceptAlertButton]]; + XCTAssertEqualObjects(filteredElements, @[acceptAlertButton]); +} + +- (void)testCameraRollAlert +{ + FBAlert *alert = [FBAlert alertWithApplication:self.testedApplication]; + XCTAssertNil(alert.text); + [self selectElement: self.testedApplication.buttons[@"Create Camera Roll Alert"]]; + FBAssertWaitTillBecomesTrue(alert.isPresent); + + XCTAssertTrue([alert.text containsString:@"Would Like to Access Your Photos"]); +} + +- (void)testGPSAccessAlert +{ + FBAlert *alert = [FBAlert alertWithApplication:self.testedApplication]; + XCTAssertNil(alert.text); + + [self selectElement: self.testedApplication.buttons[@"Create GPS access Alert"]]; + FBAssertWaitTillBecomesTrue(alert.isPresent); + + XCTAssertTrue([alert.text containsString:@"to access your location"]); + XCTAssertTrue([alert.text containsString:@"Yo Yo"]); +} + +- (void)testSheetAlert +{ + FBAlert *alert = [FBAlert alertWithApplication:self.testedApplication]; + BOOL isIpad = [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad; + [self showApplicationSheet]; + XCUIElement *showSheetButton = self.testedApplication.buttons[FBShowSheetAlertButtonName]; + //On iphone this filterObstructedElements will throw an exception. + if (isIpad) { + NSArray *filteredElements = [alert filterObstructedElements:@[showSheetButton]]; + XCTAssertEqualObjects(filteredElements, @[showSheetButton]); + } else { + XCTAssertThrowsSpecificNamed([alert filterObstructedElements:@[showSheetButton]], NSException, FBAlertObstructingElementException, @"should throw FBAlertObstructingElementException"); + } +} + +@end diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h new file mode 100644 index 000000000..877890032 --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h @@ -0,0 +1,58 @@ +/** + * 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 "FBSpringboardApplication.h" + +NS_ASSUME_NONNULL_BEGIN + +extern NSString *const FBShowAlertButtonName; +extern NSString *const FBShowSheetAlertButtonName; +extern NSString *const FBShowAlertForceTouchButtonName; + +/** + XCTestCase helper class used for integration tests + */ +@interface FBTvIntegrationTestCase : XCTestCase +@property (nonatomic, strong, readonly) XCUIApplication *testedApplication; +@property (nonatomic, strong, readonly) FBSpringboardApplication *springboard; + +/** + Launches application and resets side effects of testing like orientation etc. + */ +- (void)launchApplication; + +/** + Navigates integration app to attributes page + */ +- (void)goToAttributesPage; + +/** + Navigates integration app to alerts page + */ +- (void)goToAlertsPage; + +/** + Navigates to SpringBoard first page + */ +- (void)goToSpringBoardFirstPage; + +///** +// Navigates to SpringBoard path with Extras folder +// */ +//- (void)goToSpringBoardExtras; +// +///** +// Navigates to SpringBoard's dashboard +// */ +//- (void)goToSpringBoardDashboard; +@end + +NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m new file mode 100644 index 000000000..3f41926b7 --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m @@ -0,0 +1,106 @@ +/** + * 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 "FBTvIntegrationTestCase.h" + +#import "FBSpringboardApplication.h" +#import "FBTestMacros.h" +#import "FBTvIntegrationTestCase.h" +#import "FBConfiguration.h" +#import "FBMacros.h" +#import "FBRunLoopSpinner.h" +#import "XCUIDevice+FBRotation.h" +#import "XCUIElement.h" +#import "XCUIElement+FBIsVisible.h" +#import "XCUIApplication+FBFocused.h" +//#import "XCUIElement+FBTVInteract.h" +//#import "XCUIElement+FBFocuse.h" + + +NSString *const FBShowAlertButtonName = @"Create App Alert"; +NSString *const FBShowSheetAlertButtonName = @"Create Sheet Alert"; +NSString *const FBShowAlertForceTouchButtonName = @"Create Alert (Force Touch)"; + +@interface FBTvIntegrationTestCase () +@property (nonatomic, strong) XCUIApplication *testedApplication; +@property (nonatomic, strong) FBSpringboardApplication *springboard; +@end + +@implementation FBTvIntegrationTestCase + +- (void)setUp +{ + [super setUp]; + [FBConfiguration disableRemoteQueryEvaluation]; + [FBConfiguration disableAttributeKeyPathAnalysis]; + self.continueAfterFailure = NO; + self.springboard = [FBSpringboardApplication fb_springboard]; + self.testedApplication = [XCUIApplication new]; +} + +- (void)launchApplication +{ + [self.testedApplication launch]; + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"Alerts"].fb_isVisible); + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; + + // Force resolving XCUIApplication + [self.testedApplication query]; + [self.testedApplication resolve]; +} + +- (void)goToAttributesPage +{ + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonDown]; + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"Button"].fb_isVisible); +} + +- (void)goToAlertsPage +{ + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[FBShowAlertButtonName].fb_isVisible); + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[FBShowSheetAlertButtonName].fb_isVisible); +} + +- (void)goToSpringBoardFirstPage +{ + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonHome]; + FBAssertWaitTillBecomesTrue([FBSpringboardApplication fb_springboard].icons[@"Settings"].exists); +// [[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonHome]; +// FBAssertWaitTillBecomesTrue([FBSpringboardApplication fb_springboard].icons[@"Calendar"].fb_isVisible); +} + +//- (void)goToSpringBoardExtras +//{ +// [self goToSpringBoardFirstPage]; +// [self.springboard swipeLeft]; +// FBAssertWaitTillBecomesTrue(self.springboard.icons[@"Extras"].fb_isVisible); +//} + +//- (void)goToSpringBoardDashboard +//{ +// [self goToSpringBoardFirstPage]; +// [self.springboard swipeRight]; +// NSPredicate *predicate = +// [NSPredicate predicateWithFormat: +// @"%K IN %@", +// FBStringify(XCUIElement, identifier), +// @[@"SBSearchEtceteraIsolatedView", @"SpotlightSearchField"] +// ]; +// FBAssertWaitTillBecomesTrue([[self.springboard descendantsMatchingType:XCUIElementTypeAny] elementMatchingPredicate:predicate].fb_isVisible); +// FBAssertWaitTillBecomesTrue(!self.springboard.icons[@"Calendar"].fb_isVisible); +//} + +- (void) selectElement: (XCUIElement*) element { + + [[XCUIRemote sharedRemote] pressButton: XCUIRemoteButtonSelect]; +} + +@end diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/Info.plist b/WebDriverAgentTests/IntegrationTests_tvOS/Info.plist new file mode 100644 index 000000000..6c40a6cd0 --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + From 4f941461725bea1c094e25fb4073accc6c0f7361 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Tue, 2 Oct 2018 16:54:26 +0300 Subject: [PATCH 18/81] update FBAlert to support Apple TV commands --- .../Categories/XCUIDevice+FBRotation.m | 4 +- .../Categories/XCUIElement+FBFocuse.h | 19 ++++++++++ .../Categories/XCUIElement+FBFocuse.m | 37 +++++++++++++++++++ .../Categories/XCUIElement+FBTVInteract.h | 19 ++++++++++ .../Categories/XCUIElement+FBTVInteract.m | 37 +++++++++++++++++++ WebDriverAgentLib/FBAlert.m | 32 ++++++++++++++-- WebDriverAgentLib/FBSpringboardApplication.m | 2 + 7 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBFocuse.h create mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBFocuse.m create mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.h create mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m diff --git a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m index f17773025..e3653b401 100644 --- a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m +++ b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m @@ -9,7 +9,8 @@ #import "XCUIDevice+FBRotation.h" -#if !TARGET_OS_TV +#if TARGET_OS_IOS + static const NSTimeInterval kFBWebDriverOrientationChangeDelay = 5.0; static const CGFloat FBRotationCoolOffTime = 1.f; @@ -70,4 +71,5 @@ - (NSDictionary *)fb_rotationMapping } @end + #endif diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.h b/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.h new file mode 100644 index 000000000..b6c0d00ba --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.h @@ -0,0 +1,19 @@ +// +// XCUIElement+FBFocuse.h +// WebDriverAgentLib_tvOS +// +// Created by Pavel Serdiukov on 9/13/18. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XCUIElement (FBFocuse) + +-(BOOL) fb_focuseInRowWithError:(NSError**) error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.m b/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.m new file mode 100644 index 000000000..a6de17a92 --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.m @@ -0,0 +1,37 @@ +// +// XCUIElement+FBFocuse.m +// WebDriverAgentLib_tvOS +// +// Created by Pavel Serdiukov on 9/13/18. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import "XCUIElement+FBFocuse.h" + +#import "XCUIApplication+FBFocused.h" +#import "FBApplication.h" +#import "FBErrorBuilder.h" + +@implementation XCUIElement (FBFocuse) + +-(BOOL) fb_focuseInRowWithError:(NSError**) error { + + BOOL isEndReached = NO; + FBApplication *app = [FBApplication fb_activeApplication]; + while (!self.exists || !self.hasFocus) { + NSString *previous = [[app fb_focusedElement] description]; + [[XCUIRemote sharedRemote] pressButton: isEndReached ? XCUIRemoteButtonUp: XCUIRemoteButtonDown]; + NSString *current = [[app fb_focusedElement] description]; + if (previous == current) { + if (isEndReached) { + [[[FBErrorBuilder builder] withDescription:@"Element was not found in column or could not be focused."] + buildError:error]; + return NO; + isEndReached = YES; + } + } + } + return YES; +} + +@end diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.h b/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.h new file mode 100644 index 000000000..f3f1c4e9d --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.h @@ -0,0 +1,19 @@ +// +// XCUIElement+FBFocuse.h +// WebDriverAgentLib_tvOS +// +// Created by Pavel Serdiukov on 9/13/18. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XCUIElement (FBTVInteract) + +-(BOOL) fb_focuseInRowWithError:(NSError**) error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m b/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m new file mode 100644 index 000000000..153168522 --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m @@ -0,0 +1,37 @@ +// +// XCUIElement+FBTVInteract.m +// WebDriverAgentLib_tvOS +// +// Created by Pavel Serdiukov on 9/13/18. +// Copyright © 2018 Facebook. All rights reserved. +// + +#import "XCUIElement+FBTVInteract.h" + +#import "XCUIApplication+FBFocused.h" +#import "FBApplication.h" +#import "FBErrorBuilder.h" + + +@implementation XCUIElement (FBTVInteract) + +-(BOOL) fb_focuseInRowWithError:(NSError**) error { + + BOOL isEndReached = NO; + FBApplication *app = [FBApplication fb_activeApplication]; + while (!self.exists || !self.hasFocus) { + NSString *previous = [[app fb_focusedElement] description]; + [[XCUIRemote sharedRemote] pressButton: isEndReached ? XCUIRemoteButtonUp: XCUIRemoteButtonDown]; + NSString *current = [[app fb_focusedElement] description]; + if (previous == current) { + if (isEndReached) { + [[[FBErrorBuilder builder] withDescription:@"Element was not found in column or could not be focused."] + buildError:error]; + return NO; + isEndReached = YES; + } + } + } + return YES; +} +@end diff --git a/WebDriverAgentLib/FBAlert.m b/WebDriverAgentLib/FBAlert.m index 7003852da..475b29565 100644 --- a/WebDriverAgentLib/FBAlert.m +++ b/WebDriverAgentLib/FBAlert.m @@ -27,6 +27,8 @@ #import "XCUIElement+FBWebDriverAttributes.h" #import "XCUIElement.h" #import "XCUIElementQuery.h" +#import "XCUIApplication+FBFocused.h" +#import "XCUIElement+FBTVInteract.h" NSString *const FBAlertObstructingElementException = @"FBAlertObstructingElementException"; @@ -99,6 +101,19 @@ - (NSString *)text [resultText addObject:[NSString stringWithFormat:@"%@", staticText.wdLabel]]; } } +#if TARGET_OS_TV + // 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"]; } @@ -137,7 +152,7 @@ - (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 @@ -158,7 +173,7 @@ - (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 { @@ -180,8 +195,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 @@ -230,4 +244,14 @@ - (XCUIElement *)alertElement return alert; } +- (BOOL) submitAlertButton: (XCUIElement *) button withError:(NSError **) error { +#if TARGET_OS_IOS + return [button fb_tapWithError:error]; +#elif TARGET_OS_TV + if ([button fb_focuseInRowWithError:error]) { + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; + } + return NO; +#endif +} @end diff --git a/WebDriverAgentLib/FBSpringboardApplication.m b/WebDriverAgentLib/FBSpringboardApplication.m index e47bea824..08785b7c5 100644 --- a/WebDriverAgentLib/FBSpringboardApplication.m +++ b/WebDriverAgentLib/FBSpringboardApplication.m @@ -41,7 +41,9 @@ + (instancetype)fb_springboard }); [_springboardApp query]; +#if TARGET_OS_IOS [_springboardApp resolve]; +#endif return _springboardApp; } From 478631bf614af17ff73869d3d90f3c507f7845fb Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Tue, 2 Oct 2018 18:48:44 +0300 Subject: [PATCH 19/81] update element visibility verification to the low level api --- WebDriverAgent.xcodeproj/project.pbxproj | 12 +++++ .../XCAccessibilityElement+FBComparison.h | 27 +++++++++++ .../XCAccessibilityElement+FBComparison.m | 20 ++++++++ .../Categories/XCElementSnapshot+FBHelpers.h | 7 +++ .../Categories/XCElementSnapshot+FBHelpers.m | 11 +++++ .../Categories/XCUIElement+FBIsVisible.m | 46 +++++++++++++++++-- WebDriverAgentLib/Routing/FBElementUtils.h | 9 ++++ WebDriverAgentLib/Routing/FBElementUtils.m | 21 +++++++++ 8 files changed, 150 insertions(+), 3 deletions(-) create mode 100644 WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.h create mode 100644 WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.m diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index a7bddd871..274d0aab8 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -274,6 +274,10 @@ 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 */; }; 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 */; }; @@ -766,6 +770,8 @@ 1C88FDF9214ACCC400202D0D /* XCUIElement+FBFocuse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XCUIElement+FBFocuse.h"; sourceTree = ""; }; 1C88FDFA214ACCC400202D0D /* XCUIElement+FBFocuse.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "XCUIElement+FBFocuse.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; }; 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 = ""; }; @@ -1406,6 +1412,8 @@ 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVInteract.m */, 1C88FDF9214ACCC400202D0D /* XCUIElement+FBFocuse.h */, 1C88FDFA214ACCC400202D0D /* XCUIElement+FBFocuse.m */, + 1C9365372163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h */, + 1C9365382163BA8A00926F2C /* XCAccessibilityElement+FBComparison.m */, ); name = Categories; path = WebDriverAgentLib/Categories; @@ -1852,6 +1860,7 @@ 1C8F1A9E2100B24400F6FEF4 /* NSString+FBVisualLength.h in Headers */, 1C8F1A9F2100B24400F6FEF4 /* FBXCTestDaemonsProxy.h in Headers */, 1C88FDFB214ACCC400202D0D /* XCUIElement+FBFocuse.h in Headers */, + 1C93653A2163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h in Headers */, 1C8F1AA02100B24400F6FEF4 /* XCUIElementHitPointCoordinate.h in Headers */, 1C8F1AA12100B24400F6FEF4 /* XCTDarwinNotificationExpectation.h in Headers */, 1C8F1AA22100B24400F6FEF4 /* XCTRunnerAutomationSession.h in Headers */, @@ -2043,6 +2052,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 */, @@ -2644,6 +2654,7 @@ 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 */, @@ -2730,6 +2741,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 */, diff --git a/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.h b/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.h new file mode 100644 index 000000000..00e2ece01 --- /dev/null +++ b/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.h @@ -0,0 +1,27 @@ +/** + * 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 "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..7f6361f49 --- /dev/null +++ b/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.m @@ -0,0 +1,20 @@ +/** + * 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 "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/XCUIElement+FBIsVisible.m b/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m index 9ef9b243b..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,6 +72,7 @@ - (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 @@ -50,10 +82,18 @@ - (BOOL)fb_isVisible 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/Routing/FBElementUtils.h b/WebDriverAgentLib/Routing/FBElementUtils.h index cc06a9e3b..808bfec33 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,14 @@ 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 From 038fc3b26a437fe35bc57d95d4b44d49a10282d9 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Wed, 3 Oct 2018 16:50:05 +0300 Subject: [PATCH 20/81] add focuse element attribute to pagesource --- .../XCUIElement+FBWebDriverAttributes.m | 9 ++++++ WebDriverAgentLib/Routing/FBElement.h | 7 +++++ WebDriverAgentLib/Utilities/FBXPath.m | 29 +++++++++++++++++++ 3 files changed, 45 insertions(+) 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/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/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 From d3f31952e5cbbcdf15b5f06472efaec33ee09f80 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Wed, 3 Oct 2018 17:45:26 +0300 Subject: [PATCH 21/81] Update inspector to support "isFocused" attribute --- Inspector/js/inspector.js | 1 + Inspector/js/tree_node.js | 1 + 2 files changed, 2 insertions(+) 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, }; } } From 61cfaa68ecdb52181d7de3fe86254b5e9324b3a1 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Wed, 3 Oct 2018 17:46:32 +0300 Subject: [PATCH 22/81] update fb_tree method to support isFocused property --- WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m b/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m index d8e001319..ad9143315 100644 --- a/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +++ b/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m @@ -70,6 +70,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]) { From e9ac62f1c589f115543ea5e10064499cc070f424 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Thu, 4 Oct 2018 12:59:47 +0300 Subject: [PATCH 23/81] update FBTVInteract --- .../Categories/XCUIElement+FBFocuse.h | 19 ---------- .../Categories/XCUIElement+FBFocuse.m | 37 ------------------- .../Categories/XCUIElement+FBTVInteract.h | 2 + .../Categories/XCUIElement+FBTVInteract.m | 21 ++++++++--- 4 files changed, 18 insertions(+), 61 deletions(-) delete mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBFocuse.h delete mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBFocuse.m diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.h b/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.h deleted file mode 100644 index b6c0d00ba..000000000 --- a/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// XCUIElement+FBFocuse.h -// WebDriverAgentLib_tvOS -// -// Created by Pavel Serdiukov on 9/13/18. -// Copyright © 2018 Facebook. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface XCUIElement (FBFocuse) - --(BOOL) fb_focuseInRowWithError:(NSError**) error; - -@end - -NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.m b/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.m deleted file mode 100644 index a6de17a92..000000000 --- a/WebDriverAgentLib/Categories/XCUIElement+FBFocuse.m +++ /dev/null @@ -1,37 +0,0 @@ -// -// XCUIElement+FBFocuse.m -// WebDriverAgentLib_tvOS -// -// Created by Pavel Serdiukov on 9/13/18. -// Copyright © 2018 Facebook. All rights reserved. -// - -#import "XCUIElement+FBFocuse.h" - -#import "XCUIApplication+FBFocused.h" -#import "FBApplication.h" -#import "FBErrorBuilder.h" - -@implementation XCUIElement (FBFocuse) - --(BOOL) fb_focuseInRowWithError:(NSError**) error { - - BOOL isEndReached = NO; - FBApplication *app = [FBApplication fb_activeApplication]; - while (!self.exists || !self.hasFocus) { - NSString *previous = [[app fb_focusedElement] description]; - [[XCUIRemote sharedRemote] pressButton: isEndReached ? XCUIRemoteButtonUp: XCUIRemoteButtonDown]; - NSString *current = [[app fb_focusedElement] description]; - if (previous == current) { - if (isEndReached) { - [[[FBErrorBuilder builder] withDescription:@"Element was not found in column or could not be focused."] - buildError:error]; - return NO; - isEndReached = YES; - } - } - } - return YES; -} - -@end diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.h b/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.h index f3f1c4e9d..d055a004b 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.h +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.h @@ -14,6 +14,8 @@ NS_ASSUME_NONNULL_BEGIN -(BOOL) fb_focuseInRowWithError:(NSError**) error; +-(BOOL) fb_selectInRowWithError:(NSError**) error; + @end NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m b/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m index 153168522..b7263ada6 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m @@ -11,27 +11,38 @@ #import "XCUIApplication+FBFocused.h" #import "FBApplication.h" #import "FBErrorBuilder.h" +#import +#import "XCUIElement+FBWebDriverAttributes.h" @implementation XCUIElement (FBTVInteract) --(BOOL) fb_focuseInRowWithError:(NSError**) error { - +-(BOOL) fb_focuseInRowWithError:(NSError**) error +{ BOOL isEndReached = NO; FBApplication *app = [FBApplication fb_activeApplication]; while (!self.exists || !self.hasFocus) { - NSString *previous = [[app fb_focusedElement] description]; + NSUInteger previous = [app fb_focusedElement].wdUID; [[XCUIRemote sharedRemote] pressButton: isEndReached ? XCUIRemoteButtonUp: XCUIRemoteButtonDown]; - NSString *current = [[app fb_focusedElement] description]; + NSUInteger current = [app fb_focusedElement].wdUID; if (previous == current) { if (isEndReached) { [[[FBErrorBuilder builder] withDescription:@"Element was not found in column or could not be focused."] buildError:error]; return NO; - isEndReached = YES; } + isEndReached = YES; } } return YES; } + +-(BOOL) fb_selectInRowWithError:(NSError**) error +{ + BOOL result = [self fb_focuseInRowWithError: error]; + if (result) { + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; + } + return result; +} @end From 1668d6dbdf52a17bf1ed9ae2c19ac179349dd616 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Sun, 7 Oct 2018 16:34:41 +0300 Subject: [PATCH 24/81] update tvOS integration app --- .../Resources/Base.lproj/Main.storyboard | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard index 2425d1cbb..99f02d6f8 100644 --- a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard +++ b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard @@ -1,10 +1,11 @@ - + - + + @@ -134,7 +135,7 @@ - + @@ -214,7 +215,7 @@ - + - - + + - + - + - + + + + + + + #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; diff --git a/WebDriverAgentLib/Commands/FBCustomCommands.m b/WebDriverAgentLib/Commands/FBCustomCommands.m index a5ba00195..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" diff --git a/WebDriverAgentLib/FBHomeboardApplication.h b/WebDriverAgentLib/FBHomeboardApplication.h new file mode 100644 index 000000000..eaa960217 --- /dev/null +++ b/WebDriverAgentLib/FBHomeboardApplication.h @@ -0,0 +1,58 @@ +/** + * 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; + +#if TARGET_OS_IOS + +/** + 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_tapApplicationWithIdentifier:(NSString *)identifier error:(NSError **)error; + +#elif TARGET_OS_TV + +/** + Taps application on 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_selectApplicationWithIdentifier:(NSString *)identifier error:(NSError **)error; + +#endif + +/** + 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 90% rename from WebDriverAgentLib/FBSpringboardApplication.m rename to WebDriverAgentLib/FBHomeboardApplication.m index 08785b7c5..7ea37b542 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" @@ -22,29 +22,27 @@ #import "XCUIElement.h" #import "XCUIElementQuery.h" #import "XCUIApplication+FBFocused.h" +#import "FBLogger.h" -NSString *const SPRINGBOARD_BUNDLE_ID = @"com.apple.springboard"; -NSString *const HEADBOARD_BUNDLE_ID = @"com.apple.HeadBoard"; +#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, ^{ -#if TARGET_OS_IOS - _springboardApp = [[FBSpringboardApplication alloc] initPrivateWithPath:nil bundleID:SPRINGBOARD_BUNDLE_ID]; -#elif TARGET_OS_TV - _springboardApp = [[FBSpringboardApplication alloc] initPrivateWithPath:nil bundleID:HEADBOARD_BUNDLE_ID]; -#endif - + _homeboardApp = [[FBHomeboardApplication alloc] initPrivateWithPath:nil bundleID:HOMEBOARD_BUNDLE_ID]; }); - [_springboardApp query]; -#if TARGET_OS_IOS - [_springboardApp resolve]; -#endif - return _springboardApp; + [_homeboardApp query]; + _homeboardApp.safeQueryResolutionEnabled = YES; + [_homeboardApp resolve]; + return _homeboardApp; } #if TARGET_OS_IOS diff --git a/WebDriverAgentLib/FBSpringboardApplication.h b/WebDriverAgentLib/FBSpringboardApplication.h index c60f2b7f9..8ac8dc36b 100644 --- a/WebDriverAgentLib/FBSpringboardApplication.h +++ b/WebDriverAgentLib/FBSpringboardApplication.h @@ -14,12 +14,12 @@ 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 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/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/IntegrationTests/FBElementVisibilityTests.m b/WebDriverAgentTests/IntegrationTests/FBElementVisibilityTests.m index b81e7ae59..3dd0aa875 100644 --- a/WebDriverAgentTests/IntegrationTests/FBElementVisibilityTests.m +++ b/WebDriverAgentTests/IntegrationTests/FBElementVisibilityTests.m @@ -11,7 +11,7 @@ #import "FBApplication.h" #import "FBIntegrationTestCase.h" -#import "FBSpringboardApplication.h" +#import "FBHomeboardApplication.h" #import "FBTestMacros.h" #import "FBXCodeCompatibility.h" #import "XCUIElement+FBIsVisible.h" diff --git a/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.h b/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.h index 4fc2239e0..2a576c9ca 100644 --- a/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.h +++ b/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.h @@ -9,7 +9,7 @@ #import -#import "FBSpringboardApplication.h" +#import "FBHomeboardApplication.h" extern NSString *const FBShowAlertButtonName; extern NSString *const FBShowSheetAlertButtonName; @@ -20,7 +20,7 @@ extern NSString *const FBShowAlertForceTouchButtonName; */ @interface FBIntegrationTestCase : XCTestCase @property (nonatomic, strong, readonly) XCUIApplication *testedApplication; -@property (nonatomic, strong, readonly) FBSpringboardApplication *springboard; +@property (nonatomic, strong, readonly) FBHomeboardApplication *springboard; /** Launches application and resets side effects of testing like orientation etc. diff --git a/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.m b/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.m index cfc827246..13a76e5ca 100644 --- a/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.m +++ b/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.m @@ -9,7 +9,7 @@ #import -#import "FBSpringboardApplication.h" +#import "FBHomeboardApplication.h" #import "FBTestMacros.h" #import "FBIntegrationTestCase.h" #import "FBConfiguration.h" @@ -25,7 +25,7 @@ @interface FBIntegrationTestCase () @property (nonatomic, strong) XCUIApplication *testedApplication; -@property (nonatomic, strong) FBSpringboardApplication *springboard; +@property (nonatomic, strong) FBHomeboardApplication *springboard; @end @implementation FBIntegrationTestCase @@ -36,7 +36,7 @@ - (void)setUp [FBConfiguration disableRemoteQueryEvaluation]; [FBConfiguration disableAttributeKeyPathAnalysis]; self.continueAfterFailure = NO; - self.springboard = [FBSpringboardApplication fb_springboard]; + self.springboard = [FBHomeboardApplication fb_springboard]; self.testedApplication = [XCUIApplication new]; } @@ -70,9 +70,9 @@ - (void)goToAlertsPage - (void)goToSpringBoardFirstPage { [[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonHome]; - FBAssertWaitTillBecomesTrue([FBSpringboardApplication fb_springboard].icons[@"Safari"].exists); + FBAssertWaitTillBecomesTrue([FBHomeboardApplication fb_springboard].icons[@"Safari"].exists); [[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonHome]; - FBAssertWaitTillBecomesTrue([FBSpringboardApplication fb_springboard].icons[@"Calendar"].fb_isVisible); + FBAssertWaitTillBecomesTrue([FBHomeboardApplication fb_springboard].icons[@"Calendar"].fb_isVisible); } - (void)goToSpringBoardExtras diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBRAlertTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBRAlertTests.m index c1e702860..6d18e2225 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBRAlertTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBRAlertTests.m @@ -11,12 +11,10 @@ #import -#import "FBTvIntegrationTestCase.h" +#import "FBTVIntegrationTestCase.h" #import "FBTestMacros.h" -#import "XCUIElement+FBTap.h" - -@interface FBRAlertTests : FBTvIntegrationTestCase +@interface FBRAlertTests : FBTVIntegrationTestCase @end @implementation FBRAlertTests @@ -39,14 +37,14 @@ - (void)tearDown - (void)showApplicationAlert { - [self selectElement: self.testedApplication.buttons[FBShowAlertButtonName]]; + [self select: self.testedApplication.buttons[FBShowAlertButtonName]]; XCUIElementQuery* query = self.testedApplication.alerts; FBAssertWaitTillBecomesTrue(query.count != 0); } - (void)showApplicationSheet { - [self selectElement: self.testedApplication.buttons[FBShowSheetAlertButtonName]]; + [self select: self.testedApplication.buttons[FBShowSheetAlertButtonName]]; FBAssertWaitTillBecomesTrue(self.testedApplication.sheets.count != 0); } @@ -132,7 +130,7 @@ - (void)testCameraRollAlert { FBAlert *alert = [FBAlert alertWithApplication:self.testedApplication]; XCTAssertNil(alert.text); - [self selectElement: self.testedApplication.buttons[@"Create Camera Roll Alert"]]; + [self select: self.testedApplication.buttons[@"Create Photo Lib access Alert"]]; FBAssertWaitTillBecomesTrue(alert.isPresent); XCTAssertTrue([alert.text containsString:@"Would Like to Access Your Photos"]); @@ -143,7 +141,7 @@ - (void)testGPSAccessAlert FBAlert *alert = [FBAlert alertWithApplication:self.testedApplication]; XCTAssertNil(alert.text); - [self selectElement: self.testedApplication.buttons[@"Create GPS access Alert"]]; + [self select: self.testedApplication.buttons[@"Create GPS access Alert"]]; FBAssertWaitTillBecomesTrue(alert.isPresent); XCTAssertTrue([alert.text containsString:@"to access your location"]); diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m index 3f41926b7..b9dbad3b5 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m @@ -7,11 +7,10 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import "FBTvIntegrationTestCase.h" +#import "FBTVIntegrationTestCase.h" -#import "FBSpringboardApplication.h" +#import "FBHomeboardApplication.h" #import "FBTestMacros.h" -#import "FBTvIntegrationTestCase.h" #import "FBConfiguration.h" #import "FBMacros.h" #import "FBRunLoopSpinner.h" @@ -19,20 +18,19 @@ #import "XCUIElement.h" #import "XCUIElement+FBIsVisible.h" #import "XCUIApplication+FBFocused.h" -//#import "XCUIElement+FBTVInteract.h" -//#import "XCUIElement+FBFocuse.h" - +#import "XCUIElement+FBTVInteract.h" +#import "XCUIElement+FBUtilities.h" NSString *const FBShowAlertButtonName = @"Create App Alert"; NSString *const FBShowSheetAlertButtonName = @"Create Sheet Alert"; NSString *const FBShowAlertForceTouchButtonName = @"Create Alert (Force Touch)"; -@interface FBTvIntegrationTestCase () +@interface FBTVIntegrationTestCase () @property (nonatomic, strong) XCUIApplication *testedApplication; -@property (nonatomic, strong) FBSpringboardApplication *springboard; +@property (nonatomic, strong) FBHomeboardApplication *homeboard; @end -@implementation FBTvIntegrationTestCase +@implementation FBTVIntegrationTestCase - (void)setUp { @@ -40,7 +38,7 @@ - (void)setUp [FBConfiguration disableRemoteQueryEvaluation]; [FBConfiguration disableAttributeKeyPathAnalysis]; self.continueAfterFailure = NO; - self.springboard = [FBSpringboardApplication fb_springboard]; + self.homeboard = [FBHomeboardApplication fb_homeboard]; self.testedApplication = [XCUIApplication new]; } @@ -69,14 +67,22 @@ - (void)goToAlertsPage FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[FBShowSheetAlertButtonName].fb_isVisible); } -- (void)goToSpringBoardFirstPage +- (void)goToHeadBoardFirstPage { [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonHome]; - FBAssertWaitTillBecomesTrue([FBSpringboardApplication fb_springboard].icons[@"Settings"].exists); + FBAssertWaitTillBecomesTrue([FBHomeboardApplication fb_homeboard].icons[@"Settings"].exists); // [[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonHome]; // FBAssertWaitTillBecomesTrue([FBSpringboardApplication fb_springboard].icons[@"Calendar"].fb_isVisible); } +- (void)select:(XCUIElement*) element +{ + [self.testedApplication fb_waitUntilSnapshotIsStable]; + NSError *error; + [element fb_selectInRowWithError:&error]; + XCTAssertNil(error); +} + //- (void)goToSpringBoardExtras //{ // [self goToSpringBoardFirstPage]; @@ -98,9 +104,4 @@ - (void)goToSpringBoardFirstPage // FBAssertWaitTillBecomesTrue(!self.springboard.icons[@"Calendar"].fb_isVisible); //} -- (void) selectElement: (XCUIElement*) element { - - [[XCUIRemote sharedRemote] pressButton: XCUIRemoteButtonSelect]; -} - @end From 27c3baaa395e55710ba075af0e21af7c449d2546 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Sun, 7 Oct 2018 16:44:19 +0300 Subject: [PATCH 26/81] update FBAlert for full tvOS support --- WebDriverAgentLib/FBAlert.m | 80 +++++++++++++++++++--- WebDriverAgentLib/Routing/FBElementUtils.h | 1 - 2 files changed, 71 insertions(+), 10 deletions(-) diff --git a/WebDriverAgentLib/FBAlert.m b/WebDriverAgentLib/FBAlert.m index 475b29565..2233c93ad 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" @@ -31,6 +31,7 @@ #import "XCUIElement+FBTVInteract.h" NSString *const FBAlertObstructingElementException = @"FBAlertObstructingElementException"; +NSString *const FBAlertWindowIdentifier = @"dialogWindow"; @interface XCUIApplication (FBAlert) @@ -60,6 +61,16 @@ - (XCUIElement *)fb_alertElement return alert; } } + +#if TARGET_OS_TV + + alert = self.windows[FBAlertWindowIdentifier]; + if (alert.exists) { + return alert; + } + +#endif + return nil; } @@ -102,6 +113,14 @@ - (NSString *)text } } #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; @@ -128,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]]; } @@ -138,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) { @@ -159,7 +178,7 @@ - (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; @@ -179,7 +198,7 @@ - (BOOL)dismissWithError:(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) { @@ -234,9 +253,39 @@ + (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; } @@ -248,10 +297,23 @@ - (BOOL) submitAlertButton: (XCUIElement *) button withError:(NSError **) error #if TARGET_OS_IOS return [button fb_tapWithError:error]; #elif TARGET_OS_TV - if ([button fb_focuseInRowWithError:error]) { - [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; + return [button fb_selectInRowWithError: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 } + +#endif + @end diff --git a/WebDriverAgentLib/Routing/FBElementUtils.h b/WebDriverAgentLib/Routing/FBElementUtils.h index 808bfec33..8689e89a1 100644 --- a/WebDriverAgentLib/Routing/FBElementUtils.h +++ b/WebDriverAgentLib/Routing/FBElementUtils.h @@ -54,7 +54,6 @@ extern NSString *const FBUnknownAttributeException; @return the unique element identifier */ + (NSString *)uidWithAccessibilityElement:(XCAccessibilityElement *)element; - @end NS_ASSUME_NONNULL_END From e76eb59f11941fe9743984b61c384489309e74bb Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Sun, 7 Oct 2018 16:45:50 +0300 Subject: [PATCH 27/81] update tvOS integration tests --- WebDriverAgent.xcodeproj/project.pbxproj | 66 +++++++------------ .../FBTvIntegrationTestCase.h | 24 +++---- .../FBTvIntegrationTestCase.m | 21 ------ 3 files changed, 32 insertions(+), 79 deletions(-) diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 274d0aab8..0924ab9d5 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -20,23 +20,14 @@ 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 */; }; - 1C1954D82113540000A99F21 /* FBTvIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D72113540000A99F21 /* FBTvIntegrationTestCase.m */; }; + 1C292F672164C377002E8D40 /* FBTVIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D72113540000A99F21 /* FBTVIntegrationTestCase.m */; }; + 1C292F682164C399002E8D40 /* FBRAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D92113554400A99F21 /* FBRAlertTests.m */; }; 1C3C6FA121145D7700FAFD69 /* WebDriverAgentLib_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; }; 1C3C6FA221145D7E00FAFD69 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954682111DC0800A99F21 /* libxml2.tbd */; }; - 1C3C6FA321145D8A00FAFD69 /* FBRAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D92113554400A99F21 /* FBRAlertTests.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 */; }; - 1C3C6FAE21184F2D00FAFD69 /* FBElementAttributeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE26409C1D0EBA25009BE6B0 /* FBElementAttributeTests.m */; }; - 1C3C6FB021184F2D00FAFD69 /* FBIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = EE1E06D91D1808C2007CF043 /* FBIntegrationTestCase.m */; }; - 1C3C6FB121184F2D00FAFD69 /* FBKeyboardTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE05BAF91D13003C00A3EB00 /* FBKeyboardTests.m */; }; - 1C3C6FB321184F2D00FAFD69 /* FBFailureProofTestCaseTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE6A89361D0B35920083E92B /* FBFailureProofTestCaseTests.m */; }; - 1C3C6FB421184F2D00FAFD69 /* FBElementVisibilityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE006EAC1EB99B15006900A4 /* FBElementVisibilityTests.m */; }; - 1C3C6FB521184F2D00FAFD69 /* FBAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9B76991CF799F400275851 /* FBAlertTests.m */; }; 1C88FDF4214AAD0700202D0D /* XCUIElement+FBTVInteract.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVInteract.h */; }; 1C88FDF5214AAD0700202D0D /* XCUIElement+FBTVInteract.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVInteract.m */; }; - 1C88FDFB214ACCC400202D0D /* XCUIElement+FBFocuse.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C88FDF9214ACCC400202D0D /* XCUIElement+FBFocuse.h */; }; - 1C88FDFC214ACCC400202D0D /* XCUIElement+FBFocuse.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C88FDFA214ACCC400202D0D /* XCUIElement+FBFocuse.m */; }; - 1C88FDFD214ACDC200202D0D /* XCUIElement+FBFocuse.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C88FDF9214ACCC400202D0D /* XCUIElement+FBFocuse.h */; }; 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 */; }; @@ -65,7 +56,7 @@ 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 /* FBSpringboardApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC088EB1CB5706D00B65968 /* FBSpringboardApplication.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 */; }; @@ -201,7 +192,7 @@ 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 /* FBSpringboardApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = EEC088EA1CB5706D00B65968 /* FBSpringboardApplication.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, ); }; }; @@ -278,6 +269,7 @@ 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 */; }; @@ -398,8 +390,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 */; }; @@ -547,7 +539,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, ); }; }; @@ -759,16 +750,14 @@ 1C1954C421133DDD00A99F21 /* IntegrationTests_tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IntegrationTests_tvOS.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = ""; }; - 1C1954D62113540000A99F21 /* FBTvIntegrationTestCase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBTvIntegrationTestCase.h; sourceTree = ""; }; - 1C1954D72113540000A99F21 /* FBTvIntegrationTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTvIntegrationTestCase.m; sourceTree = ""; }; + 1C1954D62113540000A99F21 /* FBTVIntegrationTestCase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBTVIntegrationTestCase.h; sourceTree = ""; }; + 1C1954D72113540000A99F21 /* FBTVIntegrationTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVIntegrationTestCase.m; sourceTree = ""; }; 1C1954D92113554400A99F21 /* FBRAlertTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBRAlertTests.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; }; 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVInteract.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XCUIElement+FBTVInteract.h"; sourceTree = ""; }; 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVInteract.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "XCUIElement+FBTVInteract.m"; sourceTree = ""; }; - 1C88FDF9214ACCC400202D0D /* XCUIElement+FBFocuse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XCUIElement+FBFocuse.h"; sourceTree = ""; }; - 1C88FDFA214ACCC400202D0D /* XCUIElement+FBFocuse.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "XCUIElement+FBFocuse.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 = ""; }; @@ -1076,8 +1065,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 = ""; }; @@ -1221,8 +1210,8 @@ 1C19549021133B9000A99F21 /* IntegrationTests_tvOS */ = { isa = PBXGroup; children = ( - 1C1954D62113540000A99F21 /* FBTvIntegrationTestCase.h */, - 1C1954D72113540000A99F21 /* FBTvIntegrationTestCase.m */, + 1C1954D62113540000A99F21 /* FBTVIntegrationTestCase.h */, + 1C1954D72113540000A99F21 /* FBTVIntegrationTestCase.m */, 1C1954D92113554400A99F21 /* FBRAlertTests.m */, 1C19549321133B9000A99F21 /* Info.plist */, ); @@ -1410,8 +1399,6 @@ EEE376481D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.m */, 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVInteract.h */, 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVInteract.m */, - 1C88FDF9214ACCC400202D0D /* XCUIElement+FBFocuse.h */, - 1C88FDFA214ACCC400202D0D /* XCUIElement+FBFocuse.m */, 1C9365372163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h */, 1C9365382163BA8A00926F2C /* XCAccessibilityElement+FBComparison.m */, ); @@ -1674,8 +1661,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 */, @@ -1859,7 +1846,6 @@ 1C8F1A9D2100B24400F6FEF4 /* _XCKVOExpectationImplementation.h in Headers */, 1C8F1A9E2100B24400F6FEF4 /* NSString+FBVisualLength.h in Headers */, 1C8F1A9F2100B24400F6FEF4 /* FBXCTestDaemonsProxy.h in Headers */, - 1C88FDFB214ACCC400202D0D /* XCUIElement+FBFocuse.h in Headers */, 1C93653A2163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h in Headers */, 1C8F1AA02100B24400F6FEF4 /* XCUIElementHitPointCoordinate.h in Headers */, 1C8F1AA12100B24400F6FEF4 /* XCTDarwinNotificationExpectation.h in Headers */, @@ -1927,7 +1913,7 @@ 1C8F1ADF2100B24400F6FEF4 /* _XCTNSPredicateExpectationImplementation.h in Headers */, 1C8F1AE02100B24400F6FEF4 /* FBElementCommands.h in Headers */, 1C8F1AE12100B24400F6FEF4 /* FBResponseFilePayload.h in Headers */, - 1C8F1AE22100B24400F6FEF4 /* FBSpringboardApplication.h in Headers */, + 1C8F1AE22100B24400F6FEF4 /* FBHomeboardApplication.h in Headers */, 1C8F1AE32100B24400F6FEF4 /* XCUIElement+FBUID.h in Headers */, 1C8F1AE42100B24400F6FEF4 /* XCSymbolicationRecord.h in Headers */, 1C8F1AE52100B24400F6FEF4 /* XCUIDevice.h in Headers */, @@ -2110,7 +2096,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 */, @@ -2118,7 +2104,6 @@ EE158AC81CBD456F00A3E3F0 /* FBSessionCommands.h in Headers */, EE158AE31CBD456F00A3E3F0 /* FBSession-Private.h in Headers */, 716E0BCE1E917E810087A825 /* NSString+FBXMLSafeString.h in Headers */, - 1C88FDFD214ACDC200202D0D /* XCUIElement+FBFocuse.h in Headers */, EE158ACF1CBD456F00A3E3F0 /* FBCommandStatus.h in Headers */, EE35AD2D1E3B77D600A02D78 /* XCElementSnapshot.h in Headers */, EE158AB81CBD456F00A3E3F0 /* FBAlertViewCommands.h in Headers */, @@ -2598,8 +2583,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1C1954D82113540000A99F21 /* FBTvIntegrationTestCase.m in Sources */, - 1C3C6FA321145D8A00FAFD69 /* FBRAlertTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2607,12 +2590,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1C3C6FAE21184F2D00FAFD69 /* FBElementAttributeTests.m in Sources */, - 1C3C6FB021184F2D00FAFD69 /* FBIntegrationTestCase.m in Sources */, - 1C3C6FB121184F2D00FAFD69 /* FBKeyboardTests.m in Sources */, - 1C3C6FB321184F2D00FAFD69 /* FBFailureProofTestCaseTests.m in Sources */, - 1C3C6FB421184F2D00FAFD69 /* FBElementVisibilityTests.m in Sources */, - 1C3C6FB521184F2D00FAFD69 /* FBAlertTests.m in Sources */, + 1C292F672164C377002E8D40 /* FBTVIntegrationTestCase.m in Sources */, + 1C292F682164C399002E8D40 /* FBRAlertTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2649,7 +2628,7 @@ 1C8F1A4C2100B24400F6FEF4 /* FBResponseJSONPayload.m in Sources */, 1C8F1A4D2100B24400F6FEF4 /* FBXCTestCaseImplementationFailureHoldingProxy.m in Sources */, 1C8F1A4E2100B24400F6FEF4 /* XCUIDevice+FBHealthCheck.m in Sources */, - 1C8F1A4F2100B24400F6FEF4 /* FBSpringboardApplication.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 */, @@ -2685,7 +2664,6 @@ 1C8F1A712100B24400F6FEF4 /* FBApplication.m in Sources */, 1C8F1A722100B24400F6FEF4 /* FBXCTestDaemonsProxy.m in Sources */, 1C8F1A732100B24400F6FEF4 /* XCUIElement+FBTap.m in Sources */, - 1C88FDFC214ACCC400202D0D /* XCUIElement+FBFocuse.m in Sources */, 1C8F1A742100B24400F6FEF4 /* FBMathUtils.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2716,7 +2694,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 */, @@ -2731,7 +2708,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 */, @@ -2760,6 +2737,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 */, diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h index 877890032..425aebfc9 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h @@ -9,7 +9,7 @@ #import -#import "FBSpringboardApplication.h" +#import "FBHomeboardApplication.h" NS_ASSUME_NONNULL_BEGIN @@ -20,9 +20,9 @@ extern NSString *const FBShowAlertForceTouchButtonName; /** XCTestCase helper class used for integration tests */ -@interface FBTvIntegrationTestCase : XCTestCase +@interface FBTVIntegrationTestCase : XCTestCase @property (nonatomic, strong, readonly) XCUIApplication *testedApplication; -@property (nonatomic, strong, readonly) FBSpringboardApplication *springboard; +@property (nonatomic, strong, readonly) FBHomeboardApplication *homeboard; /** Launches application and resets side effects of testing like orientation etc. @@ -42,17 +42,13 @@ extern NSString *const FBShowAlertForceTouchButtonName; /** Navigates to SpringBoard first page */ -- (void)goToSpringBoardFirstPage; - -///** -// Navigates to SpringBoard path with Extras folder -// */ -//- (void)goToSpringBoardExtras; -// -///** -// Navigates to SpringBoard's dashboard -// */ -//- (void)goToSpringBoardDashboard; +- (void)goToHeadBoardFirstPage; + +/** + Select tv element in vertical row + */ +- (void)select:(XCUIElement*) element; + @end NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m index b9dbad3b5..8bc39670d 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m @@ -83,25 +83,4 @@ - (void)select:(XCUIElement*) element XCTAssertNil(error); } -//- (void)goToSpringBoardExtras -//{ -// [self goToSpringBoardFirstPage]; -// [self.springboard swipeLeft]; -// FBAssertWaitTillBecomesTrue(self.springboard.icons[@"Extras"].fb_isVisible); -//} - -//- (void)goToSpringBoardDashboard -//{ -// [self goToSpringBoardFirstPage]; -// [self.springboard swipeRight]; -// NSPredicate *predicate = -// [NSPredicate predicateWithFormat: -// @"%K IN %@", -// FBStringify(XCUIElement, identifier), -// @[@"SBSearchEtceteraIsolatedView", @"SpotlightSearchField"] -// ]; -// FBAssertWaitTillBecomesTrue([[self.springboard descendantsMatchingType:XCUIElementTypeAny] elementMatchingPredicate:predicate].fb_isVisible); -// FBAssertWaitTillBecomesTrue(!self.springboard.icons[@"Calendar"].fb_isVisible); -//} - @end From 6aaad6883c6b4fe6642b8f18321586cb1fca5389 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Mon, 8 Oct 2018 17:56:05 +0300 Subject: [PATCH 28/81] add functionality to automatically focuse element --- WebDriverAgent.xcodeproj/project.pbxproj | 36 ++-- .../Categories/XCUIElement+FBTVFocuse.h | 22 ++ .../Categories/XCUIElement+FBTVFocuse.m | 197 ++++++++++++++++++ .../Categories/XCUIElement+FBTVInteract.h | 21 -- .../Categories/XCUIElement+FBTVInteract.m | 48 ----- WebDriverAgentLib/FBAlert.m | 4 +- .../{FBRAlertTests.m => FBTVAlertTests.m} | 4 +- .../FBTVElementAttributeTests.m | 176 ++++++++++++++++ .../FBTVElementSelectTests.m | 118 +++++++++++ .../FBTvIntegrationTestCase.m | 12 +- 10 files changed, 551 insertions(+), 87 deletions(-) create mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h create mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m delete mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.h delete mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m rename WebDriverAgentTests/IntegrationTests_tvOS/{FBRAlertTests.m => FBTVAlertTests.m} (98%) create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementSelectTests.m diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 0924ab9d5..f00504095 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -20,14 +20,17 @@ 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 */; }; 1C292F672164C377002E8D40 /* FBTVIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D72113540000A99F21 /* FBTVIntegrationTestCase.m */; }; - 1C292F682164C399002E8D40 /* FBRAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D92113554400A99F21 /* FBRAlertTests.m */; }; + 1C292F682164C399002E8D40 /* FBTVAlertTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D92113554400A99F21 /* FBTVAlertTests.m */; }; 1C3C6FA121145D7700FAFD69 /* WebDriverAgentLib_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */; }; 1C3C6FA221145D7E00FAFD69 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C1954682111DC0800A99F21 /* libxml2.tbd */; }; 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 */; }; - 1C88FDF4214AAD0700202D0D /* XCUIElement+FBTVInteract.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVInteract.h */; }; - 1C88FDF5214AAD0700202D0D /* XCUIElement+FBTVInteract.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVInteract.m */; }; + 1C44859F216B613800D2B2D8 /* Templates.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1C44859E216B613800D2B2D8 /* Templates.storyboard */; }; + 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 */; }; @@ -752,12 +755,15 @@ 1C1954D42113454F00A99F21 /* FBAlertsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBAlertsViewController.m; sourceTree = ""; }; 1C1954D62113540000A99F21 /* FBTVIntegrationTestCase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBTVIntegrationTestCase.h; sourceTree = ""; }; 1C1954D72113540000A99F21 /* FBTVIntegrationTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVIntegrationTestCase.m; sourceTree = ""; }; - 1C1954D92113554400A99F21 /* FBRAlertTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBRAlertTests.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; }; - 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVInteract.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XCUIElement+FBTVInteract.h"; sourceTree = ""; }; - 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVInteract.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "XCUIElement+FBTVInteract.m"; sourceTree = ""; }; + 1C44859E216B613800D2B2D8 /* Templates.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Templates.storyboard; sourceTree = ""; }; + 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 = ""; }; @@ -1212,7 +1218,9 @@ children = ( 1C1954D62113540000A99F21 /* FBTVIntegrationTestCase.h */, 1C1954D72113540000A99F21 /* FBTVIntegrationTestCase.m */, - 1C1954D92113554400A99F21 /* FBRAlertTests.m */, + 1C1954D92113554400A99F21 /* FBTVAlertTests.m */, + 1C26DB9C216A4BC600C1D250 /* FBTVElementAttributeTests.m */, + 1C26DB9E216AAAC300C1D250 /* FBTVElementSelectTests.m */, 1C19549321133B9000A99F21 /* Info.plist */, ); path = IntegrationTests_tvOS; @@ -1246,6 +1254,7 @@ 1C1954D221133E7C00A99F21 /* Resources */ = { isa = PBXGroup; children = ( + 1C44859E216B613800D2B2D8 /* Templates.storyboard */, 1C1954B821133DDC00A99F21 /* Main.storyboard */, ); path = Resources; @@ -1397,8 +1406,8 @@ EEE376401D59F81400ED88DD /* XCUIElement+FBUtilities.m */, EEE376471D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.h */, EEE376481D59FAE900ED88DD /* XCUIElement+FBWebDriverAttributes.m */, - 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVInteract.h */, - 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVInteract.m */, + 1C88FDF2214AAD0700202D0D /* XCUIElement+FBTVFocuse.h */, + 1C88FDF3214AAD0700202D0D /* XCUIElement+FBTVFocuse.m */, 1C9365372163BA8A00926F2C /* XCAccessibilityElement+FBComparison.h */, 1C9365382163BA8A00926F2C /* XCAccessibilityElement+FBComparison.m */, ); @@ -1830,7 +1839,7 @@ 1C8F1A8F2100B24400F6FEF4 /* XCApplicationQuery.h in Headers */, 1C8F1A902100B24400F6FEF4 /* XCTAsyncActivity.h in Headers */, 1C1954732112EF9100A99F21 /* FBRemoteControlCommands.h in Headers */, - 1C88FDF4214AAD0700202D0D /* XCUIElement+FBTVInteract.h in Headers */, + 1C88FDF4214AAD0700202D0D /* XCUIElement+FBTVFocuse.h in Headers */, 1C8F1A912100B24400F6FEF4 /* XCTestMisuseObserver.h in Headers */, 1C8F1A922100B24400F6FEF4 /* XCTRunnerDaemonSession.h in Headers */, 1C8F1A932100B24400F6FEF4 /* FBApplication.h in Headers */, @@ -2481,6 +2490,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1C44859F216B613800D2B2D8 /* Templates.storyboard in Resources */, 1C1954BA21133DDC00A99F21 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2590,8 +2600,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1C26DB9D216A4BC600C1D250 /* FBTVElementAttributeTests.m in Sources */, 1C292F672164C377002E8D40 /* FBTVIntegrationTestCase.m in Sources */, - 1C292F682164C399002E8D40 /* FBRAlertTests.m in Sources */, + 1C26DB9F216AAAC300C1D250 /* FBTVElementSelectTests.m in Sources */, + 1C292F682164C399002E8D40 /* FBTVAlertTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2602,7 +2614,7 @@ 1C8F1A322100B24400F6FEF4 /* FBScreenshotCommands.m in Sources */, 1C8F1A332100B24400F6FEF4 /* FBPredicate.m in Sources */, 1C8F1A342100B24400F6FEF4 /* XCUIElement+FBPickerWheel.m in Sources */, - 1C88FDF5214AAD0700202D0D /* XCUIElement+FBTVInteract.m in Sources */, + 1C88FDF5214AAD0700202D0D /* XCUIElement+FBTVFocuse.m in Sources */, 1C8F1A352100B24400F6FEF4 /* FBXPath.m in Sources */, 1C8F1A362100B24400F6FEF4 /* FBWebServer.m in Sources */, 1C8F1A372100B24400F6FEF4 /* FBErrorBuilder.m in Sources */, diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h new file mode 100644 index 000000000..3011e71c6 --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h @@ -0,0 +1,22 @@ +/** + * 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 + +@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..ae8d243f9 --- /dev/null +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m @@ -0,0 +1,197 @@ +/** + * 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 "XCUIElement+FBTVFocuse.h" + +#import +#import "XCUIApplication+FBFocused.h" +#import "FBApplication.h" +#import "FBErrorBuilder.h" +#import "XCUIElement+FBWebDriverAttributes.h" +#import "XCUIElement+FBUtilities.h" +#import "FBMathUtils.h" + +int const MAX_ITERATIONS_COUNT = 100; + +typedef NS_ENUM(NSUInteger, FBTVDirection) { + FBTVDirectionUp = 0, + FBTVDirectionDown = 1, + FBTVDirectionLeft = 2, + FBTVDirectionRight = 3, + FBTVDirectionNone = 4 +}; + +@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 : NSObject + ++(instancetype)trackerWithTargetElement: (XCUIElement*) targetElement; + +-(FBTVDirection)directionToMoveFocuse; + +@end + +@interface FBTVNavigationTracker () +@property (nonatomic, strong) XCUIElement *targetElement; +@property (nonatomic, assign) CGPoint targetCenter; +@property (nonatomic, strong) NSMutableDictionary* navigationItems; +@end + +@implementation FBTVNavigationTracker + ++(instancetype)trackerWithTargetElement: (XCUIElement*) targetElement +{ + FBTVNavigationTracker *tracker = [[FBTVNavigationTracker alloc] initWithTargetElement:targetElement]; + tracker.targetElement = targetElement; + return tracker; +} + +-(instancetype)initWithTargetElement: (XCUIElement*) targetElement +{ + self = [super init]; + if(self) { + _targetElement = targetElement; + _targetCenter = FBRectGetCenter(targetElement.frame); + _navigationItems = [NSMutableDictionary dictionary]; + } + return self; +} + +-(FBTVDirection)directionToMoveFocuse +{ + XCUIElement *focused = [FBApplication fb_activeApplication].fb_focusedElement; + CGPoint focusedCenter = FBRectGetCenter(focused.frame); + 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 +-(FBTVNavigationItem*) navigationItemFromElement:(XCUIElement*) 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 + +@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+FBTVInteract.h b/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.h deleted file mode 100644 index d055a004b..000000000 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// XCUIElement+FBFocuse.h -// WebDriverAgentLib_tvOS -// -// Created by Pavel Serdiukov on 9/13/18. -// Copyright © 2018 Facebook. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface XCUIElement (FBTVInteract) - --(BOOL) fb_focuseInRowWithError:(NSError**) error; - --(BOOL) fb_selectInRowWithError:(NSError**) error; - -@end - -NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m b/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m deleted file mode 100644 index b7263ada6..000000000 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTVInteract.m +++ /dev/null @@ -1,48 +0,0 @@ -// -// XCUIElement+FBTVInteract.m -// WebDriverAgentLib_tvOS -// -// Created by Pavel Serdiukov on 9/13/18. -// Copyright © 2018 Facebook. All rights reserved. -// - -#import "XCUIElement+FBTVInteract.h" - -#import "XCUIApplication+FBFocused.h" -#import "FBApplication.h" -#import "FBErrorBuilder.h" -#import -#import "XCUIElement+FBWebDriverAttributes.h" - - -@implementation XCUIElement (FBTVInteract) - --(BOOL) fb_focuseInRowWithError:(NSError**) error -{ - BOOL isEndReached = NO; - FBApplication *app = [FBApplication fb_activeApplication]; - while (!self.exists || !self.hasFocus) { - NSUInteger previous = [app fb_focusedElement].wdUID; - [[XCUIRemote sharedRemote] pressButton: isEndReached ? XCUIRemoteButtonUp: XCUIRemoteButtonDown]; - NSUInteger current = [app fb_focusedElement].wdUID; - if (previous == current) { - if (isEndReached) { - [[[FBErrorBuilder builder] withDescription:@"Element was not found in column or could not be focused."] - buildError:error]; - return NO; - } - isEndReached = YES; - } - } - return YES; -} - --(BOOL) fb_selectInRowWithError:(NSError**) error -{ - BOOL result = [self fb_focuseInRowWithError: error]; - if (result) { - [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; - } - return result; -} -@end diff --git a/WebDriverAgentLib/FBAlert.m b/WebDriverAgentLib/FBAlert.m index 2233c93ad..33719ba60 100644 --- a/WebDriverAgentLib/FBAlert.m +++ b/WebDriverAgentLib/FBAlert.m @@ -28,7 +28,7 @@ #import "XCUIElement.h" #import "XCUIElementQuery.h" #import "XCUIApplication+FBFocused.h" -#import "XCUIElement+FBTVInteract.h" +#import "XCUIElement+FBTVFocuse.h" NSString *const FBAlertObstructingElementException = @"FBAlertObstructingElementException"; NSString *const FBAlertWindowIdentifier = @"dialogWindow"; @@ -297,7 +297,7 @@ - (BOOL) submitAlertButton: (XCUIElement *) button withError:(NSError **) error #if TARGET_OS_IOS return [button fb_tapWithError:error]; #elif TARGET_OS_TV - return [button fb_selectInRowWithError:error]; + return [button fb_selectWithError:error]; #endif } diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBRAlertTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVAlertTests.m similarity index 98% rename from WebDriverAgentTests/IntegrationTests_tvOS/FBRAlertTests.m rename to WebDriverAgentTests/IntegrationTests_tvOS/FBTVAlertTests.m index 6d18e2225..60797785c 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBRAlertTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVAlertTests.m @@ -14,10 +14,10 @@ #import "FBTVIntegrationTestCase.h" #import "FBTestMacros.h" -@interface FBRAlertTests : FBTVIntegrationTestCase +@interface FBTVAlertTests : FBTVIntegrationTestCase @end -@implementation FBRAlertTests +@implementation FBTVAlertTests - (void)setUp { diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m new file mode 100644 index 000000000..285d5341b --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m @@ -0,0 +1,176 @@ +/** + * 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 "FBTVIntegrationTestCase.h" +#import "FBFindElementCommands.h" +#import "XCUIElement+FBAccessibility.h" +#import "XCUIElement+FBIsVisible.h" +#import "XCUIElement+FBWebDriverAttributes.h" + +@interface FBTVElementAttributeTests : FBTVIntegrationTestCase +@end + +@implementation FBTVElementAttributeTests + +- (void)setUp +{ + [super setUp]; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self launchApplication]; + [self goToAttributesPage]; + }); +} + +- (void)testElementAccessibilityAttributes +{ + // "Button" is accessibility element, and therefore isn't accessibility container + XCUIElement *buttonElement = self.testedApplication.buttons[@"Button"]; + XCTAssertTrue(buttonElement.exists); + XCTAssertTrue(buttonElement.fb_isAccessibilityElement); + XCTAssertFalse(buttonElement.isWDAccessibilityContainer); +} + +- (void)testContainerAccessibilityAttributes +{ + // "not_accessible" isn't accessibility element, but contains accessibility elements, so it is accessibility container + XCUIElement *inaccessibleButtonElement = self.testedApplication.buttons[@"not_accessible"]; + XCTAssertTrue(inaccessibleButtonElement.exists); + XCTAssertFalse(inaccessibleButtonElement.fb_isAccessibilityElement); + XCTAssertTrue(inaccessibleButtonElement.isWDAccessibilityContainer); +} + +- (void)testIgnoredAccessibilityAttributes +{ + // Images are neither accessibility elements nor contain them, so both checks should fail + XCUIElement *imageElement = [self.testedApplication.images elementBoundByIndex:0]; + XCTAssertTrue(imageElement.exists); + XCTAssertFalse(imageElement.fb_isAccessibilityElement); + XCTAssertFalse(imageElement.isWDAccessibilityContainer); +} + +- (void)testButtonAttributes +{ + XCUIElement *element = self.testedApplication.buttons[@"Button"]; + XCTAssertTrue(element.exists); + XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeButton"); + XCTAssertEqualObjects(element.wdName, @"Button"); + XCTAssertEqualObjects(element.wdLabel, @"Button"); + XCTAssertNil(element.wdValue); + [self select:element]; + [element resolve]; + XCTAssertEqual(element.wdValue.boolValue, YES); +} + +- (void)testLabelAttributes +{ + XCUIElement *element = self.testedApplication.staticTexts[@"Label"]; + XCTAssertTrue(element.exists); + XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeStaticText"); + XCTAssertEqualObjects(element.wdName, @"Label"); + XCTAssertEqualObjects(element.wdLabel, @"Label"); + XCTAssertEqualObjects(element.wdValue, @"Label"); +} + +- (void)testTextFieldAttributes +{ + XCUIElement *element = self.testedApplication.textFields[@"Value"]; + XCTAssertTrue(element.exists); + XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeTextField"); + XCTAssertNil(element.wdName); + XCTAssertEqualObjects(element.wdLabel, @""); + XCTAssertEqualObjects(element.wdValue, @"Value"); +} + +- (void)testTextFieldWithAccessibilityIdentifiersAttributes +{ + XCUIElement *element = self.testedApplication.textFields[@"aIdentifier"]; + XCTAssertTrue(element.exists); + XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeTextField"); + XCTAssertEqualObjects(element.wdName, @"aIdentifier"); + XCTAssertEqualObjects(element.wdLabel, @"aLabel"); + XCTAssertEqualObjects(element.wdValue, @"Value2"); +} + +- (void)testSegmentedControlAttributes +{ + XCUIElement *element = self.testedApplication.segmentedControls.element; + XCTAssertTrue(element.exists); + XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeSegmentedControl"); + XCTAssertNil(element.wdName); + XCTAssertNil(element.wdLabel); + XCTAssertNil(element.wdValue); +} + +- (void)testSliderAttributes +{ + XCUIElement *element = self.testedApplication.sliders.element; + XCTAssertTrue(element.exists); + XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeSlider"); + XCTAssertNil(element.wdName); + XCTAssertNil(element.wdLabel); + XCTAssertEqualObjects(element.wdValue, @"50%"); +} + +- (void)testActivityIndicatorAttributes +{ + XCUIElement *element = self.testedApplication.activityIndicators.element; + XCTAssertTrue(element.exists); + XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeActivityIndicator"); + XCTAssertEqualObjects(element.wdName, @"Progress halted"); + XCTAssertEqualObjects(element.wdLabel, @"Progress halted"); + XCTAssertEqualObjects(element.wdValue, @"0"); +} + +- (void)testSwitchAttributes +{ + XCUIElement *element = self.testedApplication.switches.element; + XCTAssertTrue(element.exists); + XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeSwitch"); + XCTAssertNil(element.wdName); + XCTAssertNil(element.wdLabel); + XCTAssertEqualObjects(element.wdValue, @"1"); + [self select:element]; + [element resolve]; + XCTAssertEqualObjects(element.wdValue, @"0"); +} + +- (void)testPickerWheelAttributes +{ + XCUIElement *element = self.testedApplication.pickerWheels[@"Today"]; + XCTAssertTrue(element.exists); + XCTAssertEqualObjects(element.wdType, @"XCUIElementTypePickerWheel"); + XCTAssertNil(element.wdName); + XCTAssertNil(element.wdLabel); + XCTAssertEqualObjects(element.wdValue, @"Today"); +} + +- (void)testPageIndicatorAttributes +{ + XCUIElement *element = self.testedApplication.pageIndicators.element; + XCTAssertTrue(element.exists); + XCTAssertEqualObjects(element.wdType, @"XCUIElementTypePageIndicator"); + XCTAssertNil(element.wdName); + XCTAssertNil(element.wdLabel); + XCTAssertEqualObjects(element.wdValue, @"page 1 of 3"); +} + +- (void)testTextViewAttributes +{ + XCUIElement *element = self.testedApplication.textViews.element; + XCTAssertTrue(element.exists); + XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeTextView"); + XCTAssertNil(element.wdName); + XCTAssertNil(element.wdLabel); + XCTAssertEqualObjects(element.wdValue, @"Text Field long text"); +} + +@end diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementSelectTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementSelectTests.m new file mode 100644 index 000000000..bc1990057 --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementSelectTests.m @@ -0,0 +1,118 @@ +/** + * 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 + +#import "FBTVIntegrationTestCase.h" +#import "FBTestMacros.h" +#import "XCUIElement+FBTVFocuse.h" + +@interface FBTVElementSelectTests : FBTVIntegrationTestCase +@end + +@implementation FBTVElementSelectTests + +- (void)setUp +{ + [super setUp]; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self launchApplication]; + [self goToNavigationPage]; + }); +} + +- (void)showHorizontalLayout +{ + XCUIElement *category = self.testedApplication.cells[@"horizontal_layout"]; + NSError *error; + XCTAssertTrue([category fb_selectWithError: &error]); + XCTAssertNil(error); + XCUIElement * right = self.testedApplication.buttons[@"right"]; + XCUIElement * topLeft = self.testedApplication.buttons[@"top left"]; + FBAssertWaitTillBecomesTrue(right.exists && !topLeft.exists); +} + +- (void)showGridLayout +{ + XCUIElement *category = self.testedApplication.cells[@"grid_layout"]; + NSError *error; + XCTAssertTrue([category fb_selectWithError: &error]); + XCTAssertNil(error); + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"top left"].exists); +} + +- (void)showCustomLayout +{ + XCUIElement *category = self.testedApplication.cells[@"custom_layout"]; + NSError *error; + XCTAssertTrue([category fb_selectWithError: &error]); + XCTAssertNil(error); + XCUIElement * topRight = self.testedApplication.buttons[@"top right"]; + XCUIElement * topLeft = self.testedApplication.buttons[@"top left"]; + FBAssertWaitTillBecomesTrue(topRight.exists && !topLeft.exists); +} + +- (void)testVerticalNavigation +{ + XCUIElement *lastElement = self.testedApplication.cells[@"custom_layout"]; + NSError *error; + XCTAssertTrue([lastElement fb_focuseWithError: &error]); + XCTAssertNil(error); + XCTAssertTrue(lastElement.hasFocus); +} + +- (void)testErrorNavigation +{ + XCUIElement *disabledElement = self.testedApplication.cells[@"disabled_layout"]; + NSError *error; + XCTAssertFalse([disabledElement fb_focuseWithError: &error]); + XCTAssertNotNil(error); + XCTAssertFalse(disabledElement.hasFocus); +} + +- (void)testHorizontalNavigation +{ + [self showHorizontalLayout]; + XCUIElement *rightElement = self.testedApplication.buttons[@"right"]; + NSError *error; + XCTAssertTrue([rightElement fb_focuseWithError: &error]); + XCTAssertNil(error); + XCTAssertTrue(rightElement.hasFocus); +} + +- (void)testGridNavigation +{ + [self showGridLayout]; + XCUIElement *rightElement = self.testedApplication.buttons[@"bottom right"]; + NSError *firstNavError; + XCTAssertTrue([rightElement fb_focuseWithError: &firstNavError]); + XCTAssertNil(firstNavError); + XCTAssertTrue(rightElement.hasFocus); + + XCUIElement *leftElement = self.testedApplication.cells[@"grid_layout"]; + NSError *secondNavError; + XCTAssertTrue([leftElement fb_focuseWithError: &secondNavError]); + XCTAssertNil(secondNavError); + XCTAssertTrue(leftElement.hasFocus); +} + +- (void)testCustomNavigation +{ + [self showCustomLayout]; + XCUIElement *rightElement = self.testedApplication.buttons[@"bottom right"]; + NSError *error; + XCTAssertTrue([rightElement fb_focuseWithError: &error]); + XCTAssertNil(error); + XCTAssertTrue(rightElement.hasFocus); +} + +@end diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m index 8bc39670d..93d1252b6 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m @@ -18,7 +18,7 @@ #import "XCUIElement.h" #import "XCUIElement+FBIsVisible.h" #import "XCUIApplication+FBFocused.h" -#import "XCUIElement+FBTVInteract.h" +#import "XCUIElement+FBTVFocuse.h" #import "XCUIElement+FBUtilities.h" NSString *const FBShowAlertButtonName = @"Create App Alert"; @@ -60,6 +60,14 @@ - (void)goToAttributesPage FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"Button"].fb_isVisible); } +- (void)goToNavigationPage +{ + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonDown]; + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonDown]; + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; + FBAssertWaitTillBecomesTrue(self.testedApplication.staticTexts[@"Select template"].fb_isVisible); +} + - (void)goToAlertsPage { [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; @@ -79,7 +87,7 @@ - (void)select:(XCUIElement*) element { [self.testedApplication fb_waitUntilSnapshotIsStable]; NSError *error; - [element fb_selectInRowWithError:&error]; + [element fb_selectWithError:&error]; XCTAssertNil(error); } From 6fd1a0914bcd4af4772ed52502225b7071e19122 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Mon, 8 Oct 2018 17:57:53 +0300 Subject: [PATCH 29/81] update tv integration app for selection testing --- .../Resources/Base.lproj/Main.storyboard | 22 +- .../Resources/Templates.storyboard | 376 +++++++++++++++++ .../Resources/Templates~.storyboard | 394 ++++++++++++++++++ .../FBTvIntegrationTestCase.h | 5 + 4 files changed, 794 insertions(+), 3 deletions(-) create mode 100644 IntegrationApp_tvOS/Resources/Templates.storyboard create mode 100644 IntegrationApp_tvOS/Resources/Templates~.storyboard diff --git a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard index 99f02d6f8..4ae7aa660 100644 --- a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard +++ b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard @@ -73,7 +73,7 @@ - + @@ -88,7 +88,7 @@ - + + @@ -305,7 +313,15 @@ - + + + + + + + + + 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/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h index 425aebfc9..42458515e 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h @@ -39,6 +39,11 @@ extern NSString *const FBShowAlertForceTouchButtonName; */ - (void)goToAlertsPage; +/** + Navigates integration app to navigation page + */ +- (void)goToNavigationPage; + /** Navigates to SpringBoard first page */ From a4b4302250565a434a3a82c0b670f5cbba239cc7 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Mon, 8 Oct 2018 19:15:13 +0300 Subject: [PATCH 30/81] update FBElementCommands to support element selection fucntionality --- WebDriverAgentLib/Commands/FBElementCommands.m | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/WebDriverAgentLib/Commands/FBElementCommands.m b/WebDriverAgentLib/Commands/FBElementCommands.m index 56e35ba8f..d82c9688b 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" @@ -64,6 +65,7 @@ + (NSArray *)routes [[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 GET:@"/element/:uuid/focused"] respondWithTarget:self action:@selector(handleGetFocused:)], #endif @@ -73,7 +75,6 @@ + (NSArray *)routes [[FBRoute POST:@"/wda/element/:uuid/scroll"] respondWithTarget:self action:@selector(handleScroll:)], [[FBRoute POST:@"/wda/tap/:uuid"] respondWithTarget:self action:@selector(handleTap:)], [[FBRoute POST:@"/wda/touchAndHold"] respondWithTarget:self action:@selector(handleTouchAndHoldCoordinate:)], - [[FBRoute POST:@"/element/:uuid/click"] respondWithTarget:self action:@selector(handleClick:)], [[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:)], @@ -212,19 +213,25 @@ + (NSArray *)routes return FBResponseWithElementUUID(elementUUID); } -#if TARGET_OS_IOS + + (id)handleClick:(FBRouteRequest *)request { NSString *elementUUID = request.parameters[@"uuid"]; FBElementCache *elementCache = request.session.elementCache; XCUIElement *element = [elementCache elementForUUID:elementUUID]; 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; From 58b46e0ae9fd6b2d11d690fe442108a76acb3bef Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Mon, 8 Oct 2018 21:08:28 +0300 Subject: [PATCH 31/81] update tv integration app for attributes testing --- ...troller.h => FBAttributesViewController.h} | 4 +- ...troller.m => FBAttributesViewController.m} | 13 +- .../Resources/Base.lproj/Main.storyboard | 314 ++++++++++-------- WebDriverAgent.xcodeproj/project.pbxproj | 12 +- 4 files changed, 197 insertions(+), 146 deletions(-) rename IntegrationApp_tvOS/Classes/{ViewController.h => FBAttributesViewController.h} (76%) rename IntegrationApp_tvOS/Classes/{ViewController.m => FBAttributesViewController.m} (60%) diff --git a/IntegrationApp_tvOS/Classes/ViewController.h b/IntegrationApp_tvOS/Classes/FBAttributesViewController.h similarity index 76% rename from IntegrationApp_tvOS/Classes/ViewController.h rename to IntegrationApp_tvOS/Classes/FBAttributesViewController.h index 4a61d2a7f..11f4d45fc 100644 --- a/IntegrationApp_tvOS/Classes/ViewController.h +++ b/IntegrationApp_tvOS/Classes/FBAttributesViewController.h @@ -9,8 +9,10 @@ #import -@interface ViewController : UIViewController +NS_ASSUME_NONNULL_BEGIN +@interface FBAttributesViewController : UIViewController @end +NS_ASSUME_NONNULL_END diff --git a/IntegrationApp_tvOS/Classes/ViewController.m b/IntegrationApp_tvOS/Classes/FBAttributesViewController.m similarity index 60% rename from IntegrationApp_tvOS/Classes/ViewController.m rename to IntegrationApp_tvOS/Classes/FBAttributesViewController.m index e29603859..59571b913 100644 --- a/IntegrationApp_tvOS/Classes/ViewController.m +++ b/IntegrationApp_tvOS/Classes/FBAttributesViewController.m @@ -7,18 +7,17 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import "ViewController.h" +#import "FBAttributesViewController.h" -@interface ViewController () +@interface FBAttributesViewController () @end -@implementation ViewController +@implementation FBAttributesViewController -- (void)viewDidLoad { - [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. +- (IBAction)didTapButton:(UIButton *)button +{ + button.selected = !button.selected; } - @end diff --git a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard index 4ae7aa660..ed86f4ac9 100644 --- a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard +++ b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard @@ -130,10 +130,10 @@ - + - + @@ -142,171 +142,221 @@ - - + + - - + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - + + + + + + + + + + + + + + + + + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + + + + + - - - + + + + diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index f00504095..3d674d0f8 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -16,7 +16,6 @@ 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 */; }; - 1C1954B721133DDC00A99F21 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954B621133DDC00A99F21 /* ViewController.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 */; }; @@ -29,6 +28,7 @@ 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 */; }; 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 */; }; @@ -745,8 +745,6 @@ 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 = ""; }; - 1C1954B521133DDC00A99F21 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 1C1954B621133DDC00A99F21 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.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 = ""; }; @@ -762,6 +760,8 @@ 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 = ""; }; 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; }; @@ -1245,8 +1245,8 @@ 1C1954B321133DDC00A99F21 /* AppDelegate.m */, 1C1954D32113454F00A99F21 /* FBAlertsViewController.h */, 1C1954D42113454F00A99F21 /* FBAlertsViewController.m */, - 1C1954B521133DDC00A99F21 /* ViewController.h */, - 1C1954B621133DDC00A99F21 /* ViewController.m */, + 1C4485A3216BBD7300D2B2D8 /* FBAttributesViewController.h */, + 1C4485A4216BBD7300D2B2D8 /* FBAttributesViewController.m */, ); path = Classes; sourceTree = ""; @@ -2582,8 +2582,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1C1954B721133DDC00A99F21 /* ViewController.m in Sources */, 1C1954D52113454F00A99F21 /* FBAlertsViewController.m in Sources */, + 1C4485A5216BBD7300D2B2D8 /* FBAttributesViewController.m in Sources */, 1C1954BF21133DDD00A99F21 /* main.m in Sources */, 1C1954B421133DDC00A99F21 /* AppDelegate.m in Sources */, ); From cf9fa52afd3d8cf2aa4972396ce3381025f801fa Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Mon, 8 Oct 2018 21:10:52 +0300 Subject: [PATCH 32/81] update attributes tests for tvOS --- .../FBTVElementAttributeTests.m | 51 ++++--------------- 1 file changed, 9 insertions(+), 42 deletions(-) diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m index 285d5341b..d5263b964 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m @@ -33,7 +33,7 @@ - (void)setUp - (void)testElementAccessibilityAttributes { // "Button" is accessibility element, and therefore isn't accessibility container - XCUIElement *buttonElement = self.testedApplication.buttons[@"Button"]; + XCUIElement *buttonElement = self.testedApplication.buttons[@"Select me"]; XCTAssertTrue(buttonElement.exists); XCTAssertTrue(buttonElement.fb_isAccessibilityElement); XCTAssertFalse(buttonElement.isWDAccessibilityContainer); @@ -42,7 +42,7 @@ - (void)testElementAccessibilityAttributes - (void)testContainerAccessibilityAttributes { // "not_accessible" isn't accessibility element, but contains accessibility elements, so it is accessibility container - XCUIElement *inaccessibleButtonElement = self.testedApplication.buttons[@"not_accessible"]; + XCUIElement *inaccessibleButtonElement = self.testedApplication.buttons[@"Not accessible"]; XCTAssertTrue(inaccessibleButtonElement.exists); XCTAssertFalse(inaccessibleButtonElement.fb_isAccessibilityElement); XCTAssertTrue(inaccessibleButtonElement.isWDAccessibilityContainer); @@ -59,11 +59,11 @@ - (void)testIgnoredAccessibilityAttributes - (void)testButtonAttributes { - XCUIElement *element = self.testedApplication.buttons[@"Button"]; + XCUIElement *element = self.testedApplication.buttons[@"Select me"]; XCTAssertTrue(element.exists); XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeButton"); - XCTAssertEqualObjects(element.wdName, @"Button"); - XCTAssertEqualObjects(element.wdLabel, @"Button"); + XCTAssertEqualObjects(element.wdName, @"Select me"); + XCTAssertEqualObjects(element.wdLabel, @"Select me"); XCTAssertNil(element.wdValue); [self select:element]; [element resolve]; @@ -72,12 +72,12 @@ - (void)testButtonAttributes - (void)testLabelAttributes { - XCUIElement *element = self.testedApplication.staticTexts[@"Label"]; + XCUIElement *element = self.testedApplication.staticTexts[@"Text Field"]; XCTAssertTrue(element.exists); XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeStaticText"); - XCTAssertEqualObjects(element.wdName, @"Label"); - XCTAssertEqualObjects(element.wdLabel, @"Label"); - XCTAssertEqualObjects(element.wdValue, @"Label"); + XCTAssertEqualObjects(element.wdName, @"Text Field"); + XCTAssertEqualObjects(element.wdLabel, @"Text Field"); + XCTAssertEqualObjects(element.wdValue, @"Text Field"); } - (void)testTextFieldAttributes @@ -110,16 +110,6 @@ - (void)testSegmentedControlAttributes XCTAssertNil(element.wdValue); } -- (void)testSliderAttributes -{ - XCUIElement *element = self.testedApplication.sliders.element; - XCTAssertTrue(element.exists); - XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeSlider"); - XCTAssertNil(element.wdName); - XCTAssertNil(element.wdLabel); - XCTAssertEqualObjects(element.wdValue, @"50%"); -} - - (void)testActivityIndicatorAttributes { XCUIElement *element = self.testedApplication.activityIndicators.element; @@ -130,29 +120,6 @@ - (void)testActivityIndicatorAttributes XCTAssertEqualObjects(element.wdValue, @"0"); } -- (void)testSwitchAttributes -{ - XCUIElement *element = self.testedApplication.switches.element; - XCTAssertTrue(element.exists); - XCTAssertEqualObjects(element.wdType, @"XCUIElementTypeSwitch"); - XCTAssertNil(element.wdName); - XCTAssertNil(element.wdLabel); - XCTAssertEqualObjects(element.wdValue, @"1"); - [self select:element]; - [element resolve]; - XCTAssertEqualObjects(element.wdValue, @"0"); -} - -- (void)testPickerWheelAttributes -{ - XCUIElement *element = self.testedApplication.pickerWheels[@"Today"]; - XCTAssertTrue(element.exists); - XCTAssertEqualObjects(element.wdType, @"XCUIElementTypePickerWheel"); - XCTAssertNil(element.wdName); - XCTAssertNil(element.wdLabel); - XCTAssertEqualObjects(element.wdValue, @"Today"); -} - - (void)testPageIndicatorAttributes { XCUIElement *element = self.testedApplication.pageIndicators.element; From 409631198607c5bcd7937324adc1383076be6d3b Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Mon, 8 Oct 2018 21:11:52 +0300 Subject: [PATCH 33/81] update goToAttributesPage method --- .../IntegrationTests_tvOS/FBTvIntegrationTestCase.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m index 93d1252b6..dae9044fa 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m @@ -57,7 +57,7 @@ - (void)goToAttributesPage { [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonDown]; [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; - FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"Button"].fb_isVisible); + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"Select me"].fb_isVisible); } - (void)goToNavigationPage From f053da0344baa22bcbbf20d97ccf89b6d8ca6f27 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Mon, 8 Oct 2018 23:09:51 +0300 Subject: [PATCH 34/81] add tv element screenshot tests --- WebDriverAgent.xcodeproj/project.pbxproj | 4 ++ .../FBTVElementScreenshotTests.m | 46 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementScreenshotTests.m diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 3d674d0f8..b95d67b3e 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -29,6 +29,7 @@ 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 */; }; + 1C4485A7216BF07B00D2B2D8 /* FBTVElementScreenshotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C4485A6216BF07B00D2B2D8 /* FBTVElementScreenshotTests.m */; }; 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 */; }; @@ -762,6 +763,7 @@ 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 = ""; }; 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; }; @@ -1221,6 +1223,7 @@ 1C1954D92113554400A99F21 /* FBTVAlertTests.m */, 1C26DB9C216A4BC600C1D250 /* FBTVElementAttributeTests.m */, 1C26DB9E216AAAC300C1D250 /* FBTVElementSelectTests.m */, + 1C4485A6216BF07B00D2B2D8 /* FBTVElementScreenshotTests.m */, 1C19549321133B9000A99F21 /* Info.plist */, ); path = IntegrationTests_tvOS; @@ -2604,6 +2607,7 @@ 1C292F672164C377002E8D40 /* FBTVIntegrationTestCase.m in Sources */, 1C26DB9F216AAAC300C1D250 /* FBTVElementSelectTests.m in Sources */, 1C292F682164C399002E8D40 /* FBTVAlertTests.m in Sources */, + 1C4485A7216BF07B00D2B2D8 /* FBTVElementScreenshotTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementScreenshotTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementScreenshotTests.m new file mode 100644 index 000000000..f9a280a78 --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementScreenshotTests.m @@ -0,0 +1,46 @@ +/** + * 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 "FBTVIntegrationTestCase.h" +#import "XCUIDevice+FBRotation.h" +#import "XCUIElement+FBUtilities.h" + +@interface FBTVElementScreenshotTests : FBTVIntegrationTestCase +@end + +@implementation FBTVElementScreenshotTests + +- (void)setUp +{ + [super setUp]; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self launchApplication]; + [self goToAlertsPage]; + }); +} + +- (void)testElementScreenshot +{ + XCUIElement *button = self.testedApplication.buttons[FBShowAlertButtonName]; + NSError *error = nil; + NSData *screenshotData = [button fb_screenshotWithError:&error]; + if (nil == screenshotData && [error.description containsString:@"available since Xcode9"]) { + return; + } + XCTAssertNotNil(screenshotData); + XCTAssertNil(error); + UIImage *image = [UIImage imageWithData:screenshotData]; + XCTAssertNotNil(image); + XCTAssertTrue(image.size.width > image.size.height); +} + +@end From bfc7c0df4db4eb3ba6e14c9f459085cb9acc7e81 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Mon, 15 Oct 2018 16:44:26 +0300 Subject: [PATCH 35/81] add focus element route --- WebDriverAgentLib/Commands/FBElementCommands.m | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/WebDriverAgentLib/Commands/FBElementCommands.m b/WebDriverAgentLib/Commands/FBElementCommands.m index d82c9688b..4a7ba35ea 100644 --- a/WebDriverAgentLib/Commands/FBElementCommands.m +++ b/WebDriverAgentLib/Commands/FBElementCommands.m @@ -67,6 +67,7 @@ + (NSArray *)routes [[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 @@ -164,6 +165,18 @@ + (NSArray *)routes 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 From b402fae215465d22b84c729b55afa15cfe03a2fb Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Wed, 17 Oct 2018 16:12:23 +0300 Subject: [PATCH 36/81] update carthage dependencies --- Cartfile.resolved | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cartfile.resolved b/Cartfile.resolved index e6978c2df..d77963a0c 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1 +1 @@ -github "shvul/RoutingHTTPServer" "v1.0.4" +github "shvul/RoutingHTTPServer" "v1.0.2" From 663edf674d3cf49633a6dd7d35446c2f366a3c0e Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Fri, 19 Oct 2018 10:40:00 +0300 Subject: [PATCH 37/81] rename tv integration test case --- .../FBTVIntegrationTestCase.h | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h new file mode 100644 index 000000000..42458515e --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h @@ -0,0 +1,59 @@ +/** + * 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 "FBHomeboardApplication.h" + +NS_ASSUME_NONNULL_BEGIN + +extern NSString *const FBShowAlertButtonName; +extern NSString *const FBShowSheetAlertButtonName; +extern NSString *const FBShowAlertForceTouchButtonName; + +/** + XCTestCase helper class used for integration tests + */ +@interface FBTVIntegrationTestCase : XCTestCase +@property (nonatomic, strong, readonly) XCUIApplication *testedApplication; +@property (nonatomic, strong, readonly) FBHomeboardApplication *homeboard; + +/** + Launches application and resets side effects of testing like orientation etc. + */ +- (void)launchApplication; + +/** + Navigates integration app to attributes page + */ +- (void)goToAttributesPage; + +/** + Navigates integration app to alerts page + */ +- (void)goToAlertsPage; + +/** + Navigates integration app to navigation page + */ +- (void)goToNavigationPage; + +/** + Navigates to SpringBoard first page + */ +- (void)goToHeadBoardFirstPage; + +/** + Select tv element in vertical row + */ +- (void)select:(XCUIElement*) element; + +@end + +NS_ASSUME_NONNULL_END From cb041245d88559e8ed3d7cb895a8fc60687081b0 Mon Sep 17 00:00:00 2001 From: Pavel Serdiukov Date: Fri, 19 Oct 2018 11:22:08 +0300 Subject: [PATCH 38/81] update tv integration app main storyboard --- .../Classes/FBAttributesViewController.m | 2 +- .../Resources/Base.lproj/Main.storyboard | 40 ++++++++++++++++++- WebDriverAgent.xcodeproj/project.pbxproj | 2 + 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/IntegrationApp_tvOS/Classes/FBAttributesViewController.m b/IntegrationApp_tvOS/Classes/FBAttributesViewController.m index 59571b913..40a502682 100644 --- a/IntegrationApp_tvOS/Classes/FBAttributesViewController.m +++ b/IntegrationApp_tvOS/Classes/FBAttributesViewController.m @@ -15,7 +15,7 @@ @interface FBAttributesViewController () @implementation FBAttributesViewController -- (IBAction)didTapButton:(UIButton *)button +- (IBAction)didSelectButton:(UIButton *)button { button.selected = !button.selected; } diff --git a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard index ed86f4ac9..acb473a04 100644 --- a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard +++ b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard @@ -88,7 +88,7 @@ - + + @@ -252,7 +260,7 @@ - + @@ -139,6 +139,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -400,7 +448,44 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -408,7 +493,7 @@ - + diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 9e1c3be8b..1e62291f1 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -27,9 +27,9 @@ 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 */; }; - 1C4485A7216BF07B00D2B2D8 /* FBTVElementScreenshotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C4485A6216BF07B00D2B2D8 /* FBTVElementScreenshotTests.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 */; }; 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 */; }; @@ -284,6 +284,8 @@ 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 */; }; @@ -782,6 +784,7 @@ 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 = ""; }; @@ -1242,6 +1245,7 @@ 1CEC817F2199A8170071306F /* FBTVKeyboardTests.m */, 1CEC81982199B79F0071306F /* FBTVTypingTest.m */, 1CEC819A2199BA400071306F /* FBTVXPathIntegrationTests.m */, + 1CEC819D2199CC460071306F /* TVXCElementSnapshotHelperTests.m */, ); path = IntegrationTests_tvOS; sourceTree = ""; @@ -2605,6 +2609,7 @@ 1C1954BF21133DDD00A99F21 /* main.m in Sources */, 1C604D242179CB05004F535F /* FBTableDataSource.m in Sources */, 1C1954B421133DDC00A99F21 /* AppDelegate.m in Sources */, + 1C73658F219A1689009BC01A /* FBScrollViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2619,7 +2624,6 @@ 1CEC81802199A8170071306F /* FBTVKeyboardTests.m in Sources */, 1C26DB9F216AAAC300C1D250 /* FBTVElementSelectTests.m in Sources */, 1C292F682164C399002E8D40 /* FBTVAlertTests.m in Sources */, - 1C4485A7216BF07B00D2B2D8 /* FBTVElementScreenshotTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2708,8 +2712,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1CEC819C2199C2030071306F /* FBTVElementScreenshotTests.m in Sources */, 1CEC81992199B79F0071306F /* FBTVTypingTest.m in Sources */, 1CEC819B2199BA400071306F /* FBTVXPathIntegrationTests.m in Sources */, + 1CEC819E2199CC460071306F /* TVXCElementSnapshotHelperTests.m in Sources */, 1CEC818A2199B6630071306F /* FBTVIntegrationTestCase.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementVisibilityTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementVisibilityTests.m index cacee0aa2..d67675c25 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementVisibilityTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementVisibilityTests.m @@ -33,7 +33,7 @@ - (void)testHeadBoardIcons - (void)testTableViewCells { [self launchApplication]; - [self goToScrollPage]; + [self goToScrollPageWithCells:true]; XCUIElement *table = self.testedApplication.tables.allElementsBoundByIndex.firstObject; for (int i = 0 ; i < 10 ; i++) { FBAssertWaitTillBecomesTrue(table.cells.allElementsBoundByIndex[i].fb_isVisible); diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h index 5aecd37b4..408613f02 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h @@ -56,8 +56,9 @@ extern NSString *const FBShowAlertForceTouchButtonName; /** Navigates integration app to scrolling page + @param showCells whether should navigate to view with cell or plain scrollview */ -- (void)goToScrollPage; +- (void)goToScrollPageWithCells:(BOOL)showCells; @end diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h index 5aecd37b4..408613f02 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h @@ -56,8 +56,9 @@ extern NSString *const FBShowAlertForceTouchButtonName; /** Navigates integration app to scrolling page + @param showCells whether should navigate to view with cell or plain scrollview */ -- (void)goToScrollPage; +- (void)goToScrollPageWithCells:(BOOL)showCells; @end diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m index 7d485be43..b2d768a53 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m @@ -84,9 +84,11 @@ - (void)goToHeadBoardPage FBAssertWaitTillBecomesTrue([FBHomeboardApplication fb_homeboard].icons[@"Settings"].exists); } -- (void)goToScrollPage +- (void)goToScrollPageWithCells:(BOOL)showCells { [self select:self.testedApplication.buttons[@"Scrolling"]]; + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"TableView"].fb_isVisible); + [self select:self.testedApplication.buttons[showCells ? @"TableView": @"ScrollView"]]; FBAssertWaitTillBecomesTrue(self.testedApplication.staticTexts[@"3"].fb_isVisible); } diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/TVXCElementSnapshotHelperTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/TVXCElementSnapshotHelperTests.m new file mode 100644 index 000000000..22fbc0d37 --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/TVXCElementSnapshotHelperTests.m @@ -0,0 +1,206 @@ +/** + * 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 "FBTVIntegrationTestCase.h" +#import "FBTestMacros.h" +#import "XCElementSnapshot+FBHelpers.h" +#import "XCUIElement.h" +#import "XCUIElement+FBIsVisible.h" +#import "XCUIElement+FBUtilities.h" +#import "XCUIElement+FBWebDriverAttributes.h" + +@interface TVXCElementSnapshotHelperTests : FBTVIntegrationTestCase +@property (nonatomic, strong) XCUIElement *testedView; +@end + +@implementation TVXCElementSnapshotHelperTests + +- (void)setUp +{ + [super setUp]; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self launchApplication]; + }); + self.testedView = self.testedApplication.otherElements[@"MainView"]; + XCTAssertTrue(self.testedView.exists); + [self.testedView resolve]; +} + +- (void)testDescendantsMatchingType +{ + NSSet *expectedLabels = [NSSet setWithArray:@[ + @"Alerts", + @"Attributes", + @"Navigation", + @"Scrolling", + ]]; + NSArray *matchingSnapshots = [self.testedView.fb_lastSnapshot fb_descendantsMatchingType:XCUIElementTypeButton]; + XCTAssertEqual(matchingSnapshots.count, expectedLabels.count); + NSArray *labels = [matchingSnapshots valueForKeyPath:@"@distinctUnionOfObjects.label"]; + XCTAssertEqualObjects([NSSet setWithArray:labels], expectedLabels); + + NSArray *types = [matchingSnapshots valueForKeyPath:@"@distinctUnionOfObjects.elementType"]; + XCTAssertEqual(types.count, 1, @"matchingSnapshots should contain only one type"); + XCTAssertEqualObjects(types.lastObject, @(XCUIElementTypeButton), @"matchingSnapshots should contain only one type"); +} + +- (void)testDescendantsMatchingXPath +{ + NSArray *matchingSnapshots = [self.testedView.fb_lastSnapshot fb_descendantsMatchingXPathQuery:@"//XCUIElementTypeButton[@label='Alerts']"]; + XCTAssertEqual(matchingSnapshots.count, 1); + XCTAssertEqual(matchingSnapshots.lastObject.elementType, XCUIElementTypeButton); + XCTAssertEqualObjects(matchingSnapshots.lastObject.label, @"Alerts"); +} + +- (void)testParentMatchingType +{ + XCUIElement *button = self.testedApplication.buttons[@"Alerts"]; + XCTAssertTrue(button.exists); + [button resolve]; + XCElementSnapshot *windowSnapshot = [button.fb_lastSnapshot fb_parentMatchingType:XCUIElementTypeWindow]; + XCTAssertNotNil(windowSnapshot); + XCTAssertEqual(windowSnapshot.elementType, XCUIElementTypeWindow); +} + +@end + +@interface TVXCElementSnapshotHelperTests_AttributePage : FBTVIntegrationTestCase +@end + +@implementation TVXCElementSnapshotHelperTests_AttributePage + +- (void)setUp +{ + [super setUp]; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self launchApplication]; + [self goToAttributesPage]; + }); +} + +- (void)testParentMatchingOneOfTypes +{ + XCUIElement *todayPickerWheel = self.testedApplication.staticTexts[@"Text view"]; + XCTAssertTrue(todayPickerWheel.exists); + [todayPickerWheel resolve]; + XCElementSnapshot *window = [todayPickerWheel.fb_lastSnapshot fb_parentMatchingOneOfTypes:@[@(XCUIElementTypeApplication), @(XCUIElementTypeWindow)]]; + XCTAssertNotNil(window); + XCTAssertEqual(window.elementType, XCUIElementTypeWindow); +} + +- (void)testParentMatchingOneOfTypesWithXCUIElementTypeAny +{ + XCUIElement *todayPickerWheel = self.testedApplication.staticTexts[@"Text view"]; + XCTAssertTrue(todayPickerWheel.exists); + [todayPickerWheel resolve]; + XCElementSnapshot *otherSnapshot = [todayPickerWheel.fb_lastSnapshot fb_parentMatchingOneOfTypes:@[@(XCUIElementTypeAny), @(XCUIElementTypeWindow)]]; + XCTAssertNotNil(otherSnapshot); + XCTAssertEqual(otherSnapshot.elementType, XCUIElementTypeOther); +} + +- (void)testParentMatchingOneOfTypesWithAbsentParents +{ + XCUIElement *todayPickerWheel = self.testedApplication.staticTexts[@"Text view"]; + XCTAssertTrue(todayPickerWheel.exists); + [todayPickerWheel resolve]; + XCElementSnapshot *otherSnapshot = [todayPickerWheel.fb_lastSnapshot fb_parentMatchingOneOfTypes:@[@(XCUIElementTypeTab), @(XCUIElementTypeLink)]]; + XCTAssertNil(otherSnapshot); +} + +@end + +@interface TVXCElementSnapshotHelperTests_ScrollView : FBTVIntegrationTestCase +@end + +@implementation TVXCElementSnapshotHelperTests_ScrollView + +- (void)setUp +{ + [super setUp]; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self launchApplication]; + [self goToScrollPageWithCells:false]; + }); +} + +- (void)testParentMatchingOneOfTypesWithFilter +{ + XCUIElement *threeStaticText = self.testedApplication.staticTexts[@"3"]; + [threeStaticText resolve]; + NSArray *acceptedParents = @[ + @(XCUIElementTypeScrollView), + @(XCUIElementTypeCollectionView), + @(XCUIElementTypeTable), + ]; + XCElementSnapshot *scrollView = [threeStaticText.fb_lastSnapshot fb_parentMatchingOneOfTypes:acceptedParents + filter:^(XCElementSnapshot *snapshot) { + return [snapshot isWDVisible]; + }]; + XCTAssertEqualObjects(scrollView.identifier, @"scrollView"); +} + +- (void)testParentMatchingOneOfTypesWithFilterRetruningNo +{ + XCUIElement *threeStaticText = self.testedApplication.staticTexts[@"3"]; + [threeStaticText resolve]; + NSArray *acceptedParents = @[ + @(XCUIElementTypeScrollView), + @(XCUIElementTypeCollectionView), + @(XCUIElementTypeTable), + ]; + XCElementSnapshot *scrollView = [threeStaticText.fb_lastSnapshot fb_parentMatchingOneOfTypes:acceptedParents + filter:^(XCElementSnapshot *snapshot) { + return NO; + }]; + XCTAssertNil(scrollView); +} + +- (void)testDescendantsCellSnapshots +{ + XCUIElement *scrollView = self.testedApplication.scrollViews[@"scrollView"]; + [scrollView resolve]; + FBAssertWaitTillBecomesTrue(self.testedApplication.staticTexts[@"3"].fb_isVisible); + NSArray *cells = [scrollView.fb_lastSnapshot fb_descendantsCellSnapshots]; + XCTAssertGreaterThanOrEqual(cells.count, 10); + XCElementSnapshot *element = cells.firstObject; + XCTAssertEqualObjects(element.label, @"0"); +} + +@end + +@interface TVXCElementSnapshotHelperTests_ScrollViewCells : FBTVIntegrationTestCase +@end + +@implementation TVXCElementSnapshotHelperTests_ScrollViewCells + +- (void)setUp +{ + [super setUp]; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self launchApplication]; + [self goToScrollPageWithCells:true]; + }); +} + +- (void)testParentCellSnapshot +{ + FBAssertWaitTillBecomesTrue(self.testedApplication.staticTexts[@"3"].fb_isVisible); + XCUIElement *threeStaticText = self.testedApplication.staticTexts[@"3"]; + [threeStaticText resolve]; + XCElementSnapshot *xcuiElementCell = [threeStaticText.fb_lastSnapshot fb_parentCellSnapshot]; + XCTAssertEqual(xcuiElementCell.elementType, 75); +} + +@end From 0c5c5e27a507fa62d1a554c1a835c4e077b11694 Mon Sep 17 00:00:00 2001 From: Pavel Serdziukou Date: Mon, 12 Nov 2018 23:49:12 +0300 Subject: [PATCH 47/81] update copyrights --- IntegrationApp_tvOS/Classes/AppDelegate.h | 2 +- IntegrationApp_tvOS/Classes/AppDelegate.m | 2 +- .../Classes/FBAlertsViewController.h | 2 +- .../Classes/FBAlertsViewController.m | 2 +- .../Classes/FBAttributesViewController.h | 2 +- .../Classes/FBAttributesViewController.m | 2 +- .../Categories/XCUIApplication+FBFocused.h | 15 ++++++++------- .../Categories/XCUIApplication+FBFocused.m | 15 ++++++++------- .../Categories/XCUIElement+FBTVFocuse.h | 2 +- .../Categories/XCUIElement+FBTVFocuse.m | 2 +- .../Commands/FBRemoteControlCommands.h | 2 +- .../Commands/FBRemoteControlCommands.m | 2 +- .../IntegrationTests_tvOS/FBTVAlertTests.m | 2 +- .../FBTVElementAttributeTests.m | 2 +- .../FBTVElementScreenshotTests.m | 2 +- .../FBTVElementSelectTests.m | 2 +- .../FBTVElementVisibilityTests.m | 2 +- .../FBTVFailureProofTestCaseTests.m | 2 +- .../IntegrationTests_tvOS/FBTVKeyboardTests.m | 2 +- .../IntegrationTests_tvOS/FBTVTypingTest.m | 2 +- .../FBTVXPathIntegrationTests.m | 2 +- .../TVXCElementSnapshotHelperTests.m | 2 +- 22 files changed, 36 insertions(+), 34 deletions(-) diff --git a/IntegrationApp_tvOS/Classes/AppDelegate.h b/IntegrationApp_tvOS/Classes/AppDelegate.h index 9534eb9dd..5ad88b142 100644 --- a/IntegrationApp_tvOS/Classes/AppDelegate.h +++ b/IntegrationApp_tvOS/Classes/AppDelegate.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/IntegrationApp_tvOS/Classes/AppDelegate.m b/IntegrationApp_tvOS/Classes/AppDelegate.m index f61c5440a..d33d29b00 100644 --- a/IntegrationApp_tvOS/Classes/AppDelegate.m +++ b/IntegrationApp_tvOS/Classes/AppDelegate.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/IntegrationApp_tvOS/Classes/FBAlertsViewController.h b/IntegrationApp_tvOS/Classes/FBAlertsViewController.h index 59a37c4c7..a6ce3f25a 100644 --- a/IntegrationApp_tvOS/Classes/FBAlertsViewController.h +++ b/IntegrationApp_tvOS/Classes/FBAlertsViewController.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/IntegrationApp_tvOS/Classes/FBAlertsViewController.m b/IntegrationApp_tvOS/Classes/FBAlertsViewController.m index 03cc25875..452586abd 100644 --- a/IntegrationApp_tvOS/Classes/FBAlertsViewController.m +++ b/IntegrationApp_tvOS/Classes/FBAlertsViewController.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/IntegrationApp_tvOS/Classes/FBAttributesViewController.h b/IntegrationApp_tvOS/Classes/FBAttributesViewController.h index 11f4d45fc..c7100fc3d 100644 --- a/IntegrationApp_tvOS/Classes/FBAttributesViewController.h +++ b/IntegrationApp_tvOS/Classes/FBAttributesViewController.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/IntegrationApp_tvOS/Classes/FBAttributesViewController.m b/IntegrationApp_tvOS/Classes/FBAttributesViewController.m index 40a502682..82acae842 100644 --- a/IntegrationApp_tvOS/Classes/FBAttributesViewController.m +++ b/IntegrationApp_tvOS/Classes/FBAttributesViewController.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h b/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h index 3ed9ca0d5..666acb55b 100644 --- a/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h +++ b/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h @@ -1,10 +1,11 @@ -// -// XCUIApplication+FBFocused.h -// WebDriverAgentLib_tvOS -// -// Created by Pavel Serdiukov on 8/6/18. -// Copyright © 2018 Facebook. All rights reserved. -// +/** + * 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 diff --git a/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.m b/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.m index f8c4babe9..4214b632b 100644 --- a/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.m +++ b/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.m @@ -1,10 +1,11 @@ -// -// XCUIApplication+FBFocused.m -// WebDriverAgentLib_tvOS -// -// Created by Pavel Serdiukov on 8/6/18. -// Copyright © 2018 Facebook. All rights reserved. -// +/** + * 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" diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h index 3011e71c6..9aaa9d621 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m index ae8d243f9..4e4ab7e64 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentLib/Commands/FBRemoteControlCommands.h b/WebDriverAgentLib/Commands/FBRemoteControlCommands.h index 237e6f332..4ed081478 100644 --- a/WebDriverAgentLib/Commands/FBRemoteControlCommands.h +++ b/WebDriverAgentLib/Commands/FBRemoteControlCommands.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentLib/Commands/FBRemoteControlCommands.m b/WebDriverAgentLib/Commands/FBRemoteControlCommands.m index 26a099b1e..31d734110 100644 --- a/WebDriverAgentLib/Commands/FBRemoteControlCommands.m +++ b/WebDriverAgentLib/Commands/FBRemoteControlCommands.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVAlertTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVAlertTests.m index 60797785c..0b68535d2 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVAlertTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVAlertTests.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m index d5263b964..b17b95691 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementScreenshotTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementScreenshotTests.m index f9a280a78..486c8c1ed 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementScreenshotTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementScreenshotTests.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementSelectTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementSelectTests.m index bc1990057..10e69dc47 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementSelectTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementSelectTests.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementVisibilityTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementVisibilityTests.m index d67675c25..c28edff44 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementVisibilityTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementVisibilityTests.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVFailureProofTestCaseTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVFailureProofTestCaseTests.m index 950729507..192340c85 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVFailureProofTestCaseTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVFailureProofTestCaseTests.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVKeyboardTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVKeyboardTests.m index 86881fd68..2fb718314 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVKeyboardTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVKeyboardTests.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVTypingTest.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVTypingTest.m index 4ce666331..83dd0ba7c 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVTypingTest.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVTypingTest.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVXPathIntegrationTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVXPathIntegrationTests.m index 7418ef3ff..d228ab3fc 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVXPathIntegrationTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVXPathIntegrationTests.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/TVXCElementSnapshotHelperTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/TVXCElementSnapshotHelperTests.m index 22fbc0d37..85a997e4a 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/TVXCElementSnapshotHelperTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/TVXCElementSnapshotHelperTests.m @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015-present, Facebook, Inc. + * Copyright (c) 2018-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the From 382d46ee0bf09242c4e73c119848f9a7e234b71b Mon Sep 17 00:00:00 2001 From: Pavel Serdziukou Date: Mon, 12 Nov 2018 23:52:07 +0300 Subject: [PATCH 48/81] rename tests --- WebDriverAgent.xcodeproj/project.pbxproj | 8 -- .../FBTVIntegrationTestCase.h | 65 ----------- .../FBTvIntegrationTestCase.h | 65 ----------- .../FBTvIntegrationTestCase.m | 103 ------------------ 4 files changed, 241 deletions(-) delete mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h delete mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h delete mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 1e62291f1..27df3be64 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -21,7 +21,6 @@ 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 */; }; - 1C292F672164C377002E8D40 /* FBTVIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D72113540000A99F21 /* FBTVIntegrationTestCase.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 */; }; @@ -279,7 +278,6 @@ 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 */; }; - 1CEC818A2199B6630071306F /* FBTVIntegrationTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1954D72113540000A99F21 /* FBTVIntegrationTestCase.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 */; }; @@ -760,8 +758,6 @@ 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 = ""; }; - 1C1954D62113540000A99F21 /* FBTVIntegrationTestCase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBTVIntegrationTestCase.h; sourceTree = ""; }; - 1C1954D72113540000A99F21 /* FBTVIntegrationTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBTVIntegrationTestCase.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 = ""; }; @@ -1233,8 +1229,6 @@ 1C19549021133B9000A99F21 /* IntegrationTests_tvOS */ = { isa = PBXGroup; children = ( - 1C1954D62113540000A99F21 /* FBTVIntegrationTestCase.h */, - 1C1954D72113540000A99F21 /* FBTVIntegrationTestCase.m */, 1C1954D92113554400A99F21 /* FBTVAlertTests.m */, 1C26DB9C216A4BC600C1D250 /* FBTVElementAttributeTests.m */, 1C26DB9E216AAAC300C1D250 /* FBTVElementSelectTests.m */, @@ -2620,7 +2614,6 @@ 1CEC817E2199A0990071306F /* FBTVFailureProofTestCaseTests.m in Sources */, 1C604D272179CC4B004F535F /* FBTVElementVisibilityTests.m in Sources */, 1C26DB9D216A4BC600C1D250 /* FBTVElementAttributeTests.m in Sources */, - 1C292F672164C377002E8D40 /* FBTVIntegrationTestCase.m in Sources */, 1CEC81802199A8170071306F /* FBTVKeyboardTests.m in Sources */, 1C26DB9F216AAAC300C1D250 /* FBTVElementSelectTests.m in Sources */, 1C292F682164C399002E8D40 /* FBTVAlertTests.m in Sources */, @@ -2716,7 +2709,6 @@ 1CEC81992199B79F0071306F /* FBTVTypingTest.m in Sources */, 1CEC819B2199BA400071306F /* FBTVXPathIntegrationTests.m in Sources */, 1CEC819E2199CC460071306F /* TVXCElementSnapshotHelperTests.m in Sources */, - 1CEC818A2199B6630071306F /* FBTVIntegrationTestCase.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h deleted file mode 100644 index 408613f02..000000000 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * 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 "FBHomeboardApplication.h" - -NS_ASSUME_NONNULL_BEGIN - -extern NSString *const FBShowAlertButtonName; -extern NSString *const FBShowSheetAlertButtonName; -extern NSString *const FBShowAlertForceTouchButtonName; - -/** - XCTestCase helper class used for integration tests - */ -@interface FBTVIntegrationTestCase : XCTestCase -@property (nonatomic, strong, readonly) XCUIApplication *testedApplication; -@property (nonatomic, strong, readonly, getter = homeboard) FBHomeboardApplication *homeboard; - -/** - Launches application and resets side effects of testing like orientation etc. - */ -- (void)launchApplication; - -/** - Navigates integration app to attributes page - */ -- (void)goToAttributesPage; - -/** - Navigates integration app to alerts page - */ -- (void)goToAlertsPage; - -/** - Navigates integration app to navigation page - */ -- (void)goToNavigationPage; - -/** - Navigates to HeadBoard first page - */ -- (void)goToHeadBoardPage; - -/** - Select tv element in vertical row - */ -- (void)select:(XCUIElement*) element; - -/** - Navigates integration app to scrolling page - @param showCells whether should navigate to view with cell or plain scrollview - */ -- (void)goToScrollPageWithCells:(BOOL)showCells; - -@end - -NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h deleted file mode 100644 index 408613f02..000000000 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * 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 "FBHomeboardApplication.h" - -NS_ASSUME_NONNULL_BEGIN - -extern NSString *const FBShowAlertButtonName; -extern NSString *const FBShowSheetAlertButtonName; -extern NSString *const FBShowAlertForceTouchButtonName; - -/** - XCTestCase helper class used for integration tests - */ -@interface FBTVIntegrationTestCase : XCTestCase -@property (nonatomic, strong, readonly) XCUIApplication *testedApplication; -@property (nonatomic, strong, readonly, getter = homeboard) FBHomeboardApplication *homeboard; - -/** - Launches application and resets side effects of testing like orientation etc. - */ -- (void)launchApplication; - -/** - Navigates integration app to attributes page - */ -- (void)goToAttributesPage; - -/** - Navigates integration app to alerts page - */ -- (void)goToAlertsPage; - -/** - Navigates integration app to navigation page - */ -- (void)goToNavigationPage; - -/** - Navigates to HeadBoard first page - */ -- (void)goToHeadBoardPage; - -/** - Select tv element in vertical row - */ -- (void)select:(XCUIElement*) element; - -/** - Navigates integration app to scrolling page - @param showCells whether should navigate to view with cell or plain scrollview - */ -- (void)goToScrollPageWithCells:(BOOL)showCells; - -@end - -NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m deleted file mode 100644 index b2d768a53..000000000 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTvIntegrationTestCase.m +++ /dev/null @@ -1,103 +0,0 @@ -/** - * 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 "FBTVIntegrationTestCase.h" - -#import "FBHomeboardApplication.h" -#import "FBTestMacros.h" -#import "FBConfiguration.h" -#import "FBMacros.h" -#import "FBRunLoopSpinner.h" -#import "XCUIDevice+FBRotation.h" -#import "XCUIElement.h" -#import "XCUIElement+FBIsVisible.h" -#import "XCUIApplication+FBFocused.h" -#import "XCUIElement+FBTVFocuse.h" -#import "XCUIElement+FBUtilities.h" - -NSString *const FBShowAlertButtonName = @"Create App Alert"; -NSString *const FBShowSheetAlertButtonName = @"Create Sheet Alert"; -NSString *const FBShowAlertForceTouchButtonName = @"Create Alert (Force Touch)"; - -@interface FBTVIntegrationTestCase () -@property (nonatomic, strong) XCUIApplication *testedApplication; -@property (nonatomic, strong, getter = homeboard) FBHomeboardApplication *homeboard; -@end - -@implementation FBTVIntegrationTestCase - -- (void)setUp -{ - [super setUp]; - [FBConfiguration disableRemoteQueryEvaluation]; - [FBConfiguration disableAttributeKeyPathAnalysis]; - self.continueAfterFailure = NO; - self.testedApplication = [XCUIApplication new]; -} - -- (FBHomeboardApplication*) homeboard { - return [FBHomeboardApplication fb_homeboard]; -} - -- (void)launchApplication -{ - [self.testedApplication launch]; - FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"Alerts"].fb_isVisible); - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; - - // Force resolving XCUIApplication - [self.testedApplication query]; - [self.testedApplication resolve]; -} - -- (void)goToAttributesPage -{ - [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonDown]; - [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; - FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"Select me"].fb_isVisible); -} - -- (void)goToNavigationPage -{ - [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonDown]; - [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonDown]; - [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; - FBAssertWaitTillBecomesTrue(self.testedApplication.staticTexts[@"Select template"].fb_isVisible); -} - -- (void)goToAlertsPage -{ - [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; - FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[FBShowAlertButtonName].fb_isVisible); - FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[FBShowSheetAlertButtonName].fb_isVisible); -} - -- (void)goToHeadBoardPage -{ - [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonHome]; - FBAssertWaitTillBecomesTrue([FBHomeboardApplication fb_homeboard].icons[@"Settings"].exists); -} - -- (void)goToScrollPageWithCells:(BOOL)showCells -{ - [self select:self.testedApplication.buttons[@"Scrolling"]]; - FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"TableView"].fb_isVisible); - [self select:self.testedApplication.buttons[showCells ? @"TableView": @"ScrollView"]]; - FBAssertWaitTillBecomesTrue(self.testedApplication.staticTexts[@"3"].fb_isVisible); -} - -- (void)select:(XCUIElement*) element -{ - [self.testedApplication fb_waitUntilSnapshotIsStable]; - NSError *error; - [element fb_selectWithError:&error]; - XCTAssertNil(error); -} - -@end From a13df338cbd701051513ff8f640d2159049db87b Mon Sep 17 00:00:00 2001 From: Pavel Serdziukou Date: Mon, 12 Nov 2018 23:54:32 +0300 Subject: [PATCH 49/81] rename fix --- WebDriverAgent.xcodeproj/project.pbxproj | 8 ++ .../FBTVIntegrationTestCase.h | 65 +++++++++++ .../FBTVIntegrationTestCase.m | 103 ++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.m diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 27df3be64..00ef21f10 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -29,6 +29,8 @@ 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 */; }; 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 */; }; @@ -769,6 +771,8 @@ 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 = ""; }; 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; }; @@ -1240,6 +1244,8 @@ 1CEC81982199B79F0071306F /* FBTVTypingTest.m */, 1CEC819A2199BA400071306F /* FBTVXPathIntegrationTests.m */, 1CEC819D2199CC460071306F /* TVXCElementSnapshotHelperTests.m */, + 1C736590219A1FC5009BC01A /* FBTVIntegrationTestCase.h */, + 1C736591219A1FC5009BC01A /* FBTVIntegrationTestCase.m */, ); path = IntegrationTests_tvOS; sourceTree = ""; @@ -2611,6 +2617,7 @@ 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 */, @@ -2705,6 +2712,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1C736593219A1FC5009BC01A /* FBTVIntegrationTestCase.m in Sources */, 1CEC819C2199C2030071306F /* FBTVElementScreenshotTests.m in Sources */, 1CEC81992199B79F0071306F /* FBTVTypingTest.m in Sources */, 1CEC819B2199BA400071306F /* FBTVXPathIntegrationTests.m in Sources */, diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h new file mode 100644 index 000000000..9d4cf38af --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.h @@ -0,0 +1,65 @@ +/** + * 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 "FBHomeboardApplication.h" + +NS_ASSUME_NONNULL_BEGIN + +extern NSString *const FBShowAlertButtonName; +extern NSString *const FBShowSheetAlertButtonName; +extern NSString *const FBShowAlertForceTouchButtonName; + +/** + XCTestCase helper class used for integration tests + */ +@interface FBTVIntegrationTestCase : XCTestCase +@property (nonatomic, strong, readonly) XCUIApplication *testedApplication; +@property (nonatomic, strong, readonly, getter = homeboard) FBHomeboardApplication *homeboard; + +/** + Launches application and resets side effects of testing like orientation etc. + */ +- (void)launchApplication; + +/** + Navigates integration app to attributes page + */ +- (void)goToAttributesPage; + +/** + Navigates integration app to alerts page + */ +- (void)goToAlertsPage; + +/** + Navigates integration app to navigation page + */ +- (void)goToNavigationPage; + +/** + Navigates to HeadBoard first page + */ +- (void)goToHeadBoardPage; + +/** + Select tv element in vertical row + */ +- (void)select:(XCUIElement*) element; + +/** + Navigates integration app to scrolling page + @param showCells whether should navigate to view with cell or plain scrollview + */ +- (void)goToScrollPageWithCells:(BOOL)showCells; + +@end + +NS_ASSUME_NONNULL_END diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.m new file mode 100644 index 000000000..211715628 --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVIntegrationTestCase.m @@ -0,0 +1,103 @@ +/** + * 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 "FBTVIntegrationTestCase.h" + +#import "FBHomeboardApplication.h" +#import "FBTestMacros.h" +#import "FBConfiguration.h" +#import "FBMacros.h" +#import "FBRunLoopSpinner.h" +#import "XCUIDevice+FBRotation.h" +#import "XCUIElement.h" +#import "XCUIElement+FBIsVisible.h" +#import "XCUIApplication+FBFocused.h" +#import "XCUIElement+FBTVFocuse.h" +#import "XCUIElement+FBUtilities.h" + +NSString *const FBShowAlertButtonName = @"Create App Alert"; +NSString *const FBShowSheetAlertButtonName = @"Create Sheet Alert"; +NSString *const FBShowAlertForceTouchButtonName = @"Create Alert (Force Touch)"; + +@interface FBTVIntegrationTestCase () +@property (nonatomic, strong) XCUIApplication *testedApplication; +@property (nonatomic, strong, getter = homeboard) FBHomeboardApplication *homeboard; +@end + +@implementation FBTVIntegrationTestCase + +- (void)setUp +{ + [super setUp]; + [FBConfiguration disableRemoteQueryEvaluation]; + [FBConfiguration disableAttributeKeyPathAnalysis]; + self.continueAfterFailure = NO; + self.testedApplication = [XCUIApplication new]; +} + +- (FBHomeboardApplication*) homeboard { + return [FBHomeboardApplication fb_homeboard]; +} + +- (void)launchApplication +{ + [self.testedApplication launch]; + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"Alerts"].fb_isVisible); + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; + + // Force resolving XCUIApplication + [self.testedApplication query]; + [self.testedApplication resolve]; +} + +- (void)goToAttributesPage +{ + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonDown]; + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"Select me"].fb_isVisible); +} + +- (void)goToNavigationPage +{ + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonDown]; + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonDown]; + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; + FBAssertWaitTillBecomesTrue(self.testedApplication.staticTexts[@"Select template"].fb_isVisible); +} + +- (void)goToAlertsPage +{ + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonSelect]; + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[FBShowAlertButtonName].fb_isVisible); + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[FBShowSheetAlertButtonName].fb_isVisible); +} + +- (void)goToHeadBoardPage +{ + [[XCUIRemote sharedRemote] pressButton:XCUIRemoteButtonHome]; + FBAssertWaitTillBecomesTrue([FBHomeboardApplication fb_homeboard].icons[@"Settings"].exists); +} + +- (void)goToScrollPageWithCells:(BOOL)showCells +{ + [self select:self.testedApplication.buttons[@"Scrolling"]]; + FBAssertWaitTillBecomesTrue(self.testedApplication.buttons[@"TableView"].fb_isVisible); + [self select:self.testedApplication.buttons[showCells ? @"TableView": @"ScrollView"]]; + FBAssertWaitTillBecomesTrue(self.testedApplication.staticTexts[@"3"].fb_isVisible); +} + +- (void)select:(XCUIElement*) element +{ + [self.testedApplication fb_waitUntilSnapshotIsStable]; + NSError *error; + [element fb_selectWithError:&error]; + XCTAssertNil(error); +} + +@end From 8284317bf3f2e10653e30a1c118a2c7f6172d3be Mon Sep 17 00:00:00 2001 From: Pavel Serdziukou Date: Tue, 13 Nov 2018 10:28:56 +0300 Subject: [PATCH 50/81] add hitpoint tv test --- .../Resources/Base.lproj/Main.storyboard | 13 ++++++++ WebDriverAgent.xcodeproj/project.pbxproj | 4 +++ .../FBTVElementAttributeTests.m | 4 +-- .../TVXCElementSnapshotHitPoint.m | 32 +++++++++++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/TVXCElementSnapshotHitPoint.m diff --git a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard index 94834c7ca..32a74d123 100644 --- a/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard +++ b/IntegrationApp_tvOS/Resources/Base.lproj/Main.storyboard @@ -199,6 +199,17 @@ + + + + + + + + + + + @@ -414,6 +425,8 @@ + + diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 00ef21f10..4946b0f21 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -31,6 +31,7 @@ 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 */; }; 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 */; }; @@ -773,6 +774,7 @@ 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 = ""; }; 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; }; @@ -1246,6 +1248,7 @@ 1CEC819D2199CC460071306F /* TVXCElementSnapshotHelperTests.m */, 1C736590219A1FC5009BC01A /* FBTVIntegrationTestCase.h */, 1C736591219A1FC5009BC01A /* FBTVIntegrationTestCase.m */, + 1C736594219A2114009BC01A /* TVXCElementSnapshotHitPoint.m */, ); path = IntegrationTests_tvOS; sourceTree = ""; @@ -2716,6 +2719,7 @@ 1CEC819C2199C2030071306F /* FBTVElementScreenshotTests.m in Sources */, 1CEC81992199B79F0071306F /* FBTVTypingTest.m in Sources */, 1CEC819B2199BA400071306F /* FBTVXPathIntegrationTests.m in Sources */, + 1C736595219A2114009BC01A /* TVXCElementSnapshotHitPoint.m in Sources */, 1CEC819E2199CC460071306F /* TVXCElementSnapshotHelperTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m index b17b95691..f482231ae 100644 --- a/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m +++ b/WebDriverAgentTests/IntegrationTests_tvOS/FBTVElementAttributeTests.m @@ -32,7 +32,7 @@ - (void)setUp - (void)testElementAccessibilityAttributes { - // "Button" is accessibility element, and therefore isn't accessibility container + // "Select me" is accessibility element, and therefore isn't accessibility container XCUIElement *buttonElement = self.testedApplication.buttons[@"Select me"]; XCTAssertTrue(buttonElement.exists); XCTAssertTrue(buttonElement.fb_isAccessibilityElement); @@ -41,7 +41,7 @@ - (void)testElementAccessibilityAttributes - (void)testContainerAccessibilityAttributes { - // "not_accessible" isn't accessibility element, but contains accessibility elements, so it is accessibility container + // "Not accessible" isn't accessibility element, but contains accessibility elements, so it is accessibility container XCUIElement *inaccessibleButtonElement = self.testedApplication.buttons[@"Not accessible"]; XCTAssertTrue(inaccessibleButtonElement.exists); XCTAssertFalse(inaccessibleButtonElement.fb_isAccessibilityElement); diff --git a/WebDriverAgentTests/IntegrationTests_tvOS/TVXCElementSnapshotHitPoint.m b/WebDriverAgentTests/IntegrationTests_tvOS/TVXCElementSnapshotHitPoint.m new file mode 100644 index 000000000..a887c2e19 --- /dev/null +++ b/WebDriverAgentTests/IntegrationTests_tvOS/TVXCElementSnapshotHitPoint.m @@ -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 "FBTVIntegrationTestCase.h" +#import "FBMathUtils.h" +#import "XCElementSnapshot+FBHitpoint.h" +#import "XCUIElement.h" +#import "XCUIElement+FBUtilities.h" + +@interface TVXCElementSnapshotHitPoint : FBTVIntegrationTestCase +@end + +@implementation TVXCElementSnapshotHitPoint + +- (void)testAccessibilityActivationPoint +{ + [self launchApplication]; + [self goToAttributesPage]; + XCUIElement *element = self.testedApplication.otherElements[@"testView"]; + NSError *error; + FBElementHitPoint *hitpoint = [element.fb_lastSnapshot fb_hitPoint:&error]; + XCTAssertNotNil(hitpoint); + XCTAssertTrue(FBPointFuzzyEqualToPoint(hitpoint.point, CGPointMake(25, 25), 0.1)); +} + +@end From 7556b54a0fedff91015f8f495da349a6e17da767 Mon Sep 17 00:00:00 2001 From: Pavel Serdziukou Date: Tue, 13 Nov 2018 12:22:05 +0300 Subject: [PATCH 51/81] add app helpers tests for tvOS --- WebDriverAgent.xcodeproj/project.pbxproj | 4 + .../Resources/Base.lproj/Main.storyboard | 14 ++-- .../XCUIApplicationHelperTests.m | 12 +-- .../TVXCUIApplicationHelperTests.m | 80 +++++++++++++++++++ 4 files changed, 96 insertions(+), 14 deletions(-) create mode 100644 WebDriverAgentTests/IntegrationTests_tvOS/TVXCUIApplicationHelperTests.m diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 4946b0f21..0b74a4b0b 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -32,6 +32,7 @@ 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 */; }; 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 */; }; @@ -775,6 +776,7 @@ 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 = ""; }; 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; }; @@ -1249,6 +1251,7 @@ 1C736590219A1FC5009BC01A /* FBTVIntegrationTestCase.h */, 1C736591219A1FC5009BC01A /* FBTVIntegrationTestCase.m */, 1C736594219A2114009BC01A /* TVXCElementSnapshotHitPoint.m */, + 1C736596219AB7C4009BC01A /* TVXCUIApplicationHelperTests.m */, ); path = IntegrationTests_tvOS; sourceTree = ""; @@ -2720,6 +2723,7 @@ 1CEC81992199B79F0071306F /* FBTVTypingTest.m in Sources */, 1CEC819B2199BA400071306F /* FBTVXPathIntegrationTests.m in Sources */, 1C736595219A2114009BC01A /* TVXCElementSnapshotHitPoint.m in Sources */, + 1C736597219AB7C5009BC01A /* TVXCUIApplicationHelperTests.m in Sources */, 1CEC819E2199CC460071306F /* TVXCElementSnapshotHelperTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; 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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/IntegrationApp_tvOS/Resources/Templates.storyboard b/IntegrationApp_tvOS/Resources/Templates.storyboard deleted file mode 100644 index 8679b9edf..000000000 --- a/IntegrationApp_tvOS/Resources/Templates.storyboard +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/IntegrationApp_tvOS/main.m b/IntegrationApp_tvOS/main.m deleted file mode 100644 index 2b841fd81..000000000 --- a/IntegrationApp_tvOS/main.m +++ /dev/null @@ -1,17 +0,0 @@ -/** - * 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/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 5b501d795..91617d46e 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -15,16 +15,8 @@ 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 */; }; 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 */; }; - 1C73658F219A1689009BC01A /* FBScrollViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = ADDA07231D6BB2BF001700AC /* FBScrollViewController.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 */; }; @@ -742,19 +734,8 @@ 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 = ""; }; - 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 = ""; }; 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 = ""; }; - 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 = ""; }; 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 = ""; }; @@ -1102,13 +1083,6 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 1C1954AD21133DDC00A99F21 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 1C7365C5219C6660009BC01A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1204,40 +1178,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 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 = ( @@ -1278,7 +1218,6 @@ EE22021C1ECC612200A29571 /* IntegrationTests_3.xctest */, 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */, 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */, - 1C1954B021133DDC00A99F21 /* IntegrationApp_tvOS.app */, 1C7365CD219C6660009BC01A /* UnitTests_tvOS.xctest */, ); name = Products; @@ -1528,7 +1467,6 @@ EE9B75F91CF7964100275851 /* WebDriverAgentTests */ = { isa = PBXGroup; children = ( - 1C1954B121133DDC00A99F21 /* IntegrationApp_tvOS */, EE9B76801CF7997600275851 /* IntegrationApp */, EE9B76541CF7987300275851 /* IntegrationTests */, EE9B76561CF7987300275851 /* UnitTests */, @@ -2165,23 +2103,6 @@ /* 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"; - }; 1C7365AA219C6660009BC01A /* UnitTests_tvOS */ = { isa = PBXNativeTarget; buildConfigurationList = 1C7365CA219C6660009BC01A /* Build configuration list for PBXNativeTarget "UnitTests_tvOS" */; @@ -2378,11 +2299,6 @@ LastUpgradeCheck = 1000; ORGANIZATIONNAME = Facebook; TargetAttributes = { - 1C1954AF21133DDC00A99F21 = { - CreatedOnToolsVersion = 10.0; - DevelopmentTeam = U9WLLAC7UL; - ProvisioningStyle = Automatic; - }; 1C8F1A302100B24400F6FEF4 = { DevelopmentTeam = U9WLLAC7UL; }; @@ -2433,21 +2349,11 @@ EE5095DD1EBCC9090028E2FE /* IntegrationTests_2 */, EE2202031ECC612200A29571 /* IntegrationTests_3 */, 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; - }; 1C7365C9219C6660009BC01A /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2524,19 +2430,6 @@ /* 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; - }; 1C7365AD219C6660009BC01A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2877,14 +2770,6 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - 1C1954B821133DDC00A99F21 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 1C1954B921133DDC00A99F21 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; EE9B768C1CF7997600275851 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -2896,56 +2781,6 @@ /* 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; - }; 1C7365CB219C6660009BC01A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3481,15 +3316,6 @@ /* 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; - }; 1C7365CA219C6660009BC01A /* Build configuration list for PBXNativeTarget "UnitTests_tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp_tvOS.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp_tvOS.xcscheme deleted file mode 100644 index feb8e04c5..000000000 --- a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp_tvOS.xcscheme +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 3f84caeba9a419f665acf7417f5166c07d963768 Mon Sep 17 00:00:00 2001 From: Pavel Serdziukou Date: Fri, 16 Nov 2018 10:53:21 +0300 Subject: [PATCH 68/81] revert integration schemes --- .../xcschemes/WebDriverAgentLib_tvOS.xcscheme | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme index aae4f9067..e992c0c5a 100644 --- a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme +++ b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme @@ -29,26 +29,6 @@ codeCoverageEnabled = "YES" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - - - - - Date: Fri, 16 Nov 2018 11:02:34 +0300 Subject: [PATCH 69/81] revert unit tests --- WebDriverAgent.xcodeproj/project.pbxproj | 154 ------------------ .../xcschemes/WebDriverAgentLib_tvOS.xcscheme | 10 -- .../UnitTests/Doubles/XCUIElementDouble.h | 3 - .../UnitTests/Doubles/XCUIElementDouble.m | 3 - .../UnitTests/FBMathUtilsTests.m | 3 +- .../UnitTests/FBTVNavigationTrackerTests.m | 153 ----------------- WebDriverAgentTests/UnitTests/FBXPathTests.m | 8 - 7 files changed, 1 insertion(+), 333 deletions(-) delete mode 100644 WebDriverAgentTests/UnitTests/FBTVNavigationTrackerTests.m diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 91617d46e..5f6ea2184 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -19,33 +19,7 @@ 1C3C6FA7211827D600FAFD69 /* XCUIApplication+FBFocused.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C3C6FA5211827D600FAFD69 /* XCUIApplication+FBFocused.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 */; }; @@ -616,13 +590,6 @@ remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; remoteInfo = WebDriverAgentLib_tvOS; }; - 1C7365D6219C67EB009BC01A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; - remoteInfo = WebDriverAgentLib_tvOS; - }; AD8D96F01D3C12960061268E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; @@ -738,8 +705,6 @@ 1C3C6FA5211827D600FAFD69 /* XCUIApplication+FBFocused.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "XCUIApplication+FBFocused.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 = ""; }; @@ -1083,16 +1048,6 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 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; @@ -1218,7 +1173,6 @@ EE22021C1ECC612200A29571 /* IntegrationTests_3.xctest */, 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */, 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */, - 1C7365CD219C6660009BC01A /* UnitTests_tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -1531,7 +1485,6 @@ EE8DDD7820C565FB004D4925 /* XCUIApplicationFBHelpersTests.m */, EEC9EED820077D8E00BC0D5B /* XCUICoordinateFix.m */, 713914591DF01989005896C2 /* XCUIElementHelpersTests.m */, - 1C7365A8219C5E33009BC01A /* FBTVNavigationTrackerTests.m */, ); path = UnitTests; sourceTree = ""; @@ -2103,24 +2056,6 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 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" */; @@ -2344,7 +2279,6 @@ EEF988291C486603005CA669 /* WebDriverAgentRunner */, 1CDC565E2111C26F00868007 /* WebDriverAgentRunner_tvOS */, EE836C011C0F118600D87246 /* UnitTests */, - 1C7365AA219C6660009BC01A /* UnitTests_tvOS */, EE9B75EB1CF7956C00275851 /* IntegrationTests_1 */, EE5095DD1EBCC9090028E2FE /* IntegrationTests_2 */, EE2202031ECC612200A29571 /* IntegrationTests_3 */, @@ -2354,13 +2288,6 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 1C7365C9219C6660009BC01A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 1C8F1B2A2100B24400F6FEF4 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2430,36 +2357,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 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; @@ -2722,11 +2619,6 @@ target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; targetProxy = 1C0EE1122111C4A9009EDBB1 /* PBXContainerItemProxy */; }; - 1C7365D7219C67EB009BC01A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; - targetProxy = 1C7365D6219C67EB009BC01A /* PBXContainerItemProxy */; - }; AD8D96F11D3C12960061268E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */; @@ -2781,43 +2673,6 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 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 */; @@ -3316,15 +3171,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 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 = ( diff --git a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme index e992c0c5a..00e3eb649 100644 --- a/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme +++ b/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme @@ -29,16 +29,6 @@ codeCoverageEnabled = "YES" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - -#import "XCUIElementDouble.h" -#import "FBTVNavigationTracker.h" -#import - -@implementation FBTVNavigationTracker (FBTVNavigationTrackerTests) - -+ (void)load -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - Class class = [self class]; - - SEL originalSelector = @selector(focusedElement); - SEL swizzledSelector = @selector(testFocusedElement); - - Method originalMethod = class_getInstanceMethod(class, originalSelector); - Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); - - BOOL didAddMethod = class_addMethod(class, originalSelector, - method_getImplementation(swizzledMethod), - method_getTypeEncoding(swizzledMethod)); - - if (didAddMethod) { - class_replaceMethod(class, swizzledSelector, - method_getImplementation(originalMethod), - method_getTypeEncoding(originalMethod)); - } else { - method_exchangeImplementations(originalMethod, swizzledMethod); - } - }); -} - -#pragma mark - Method Swizzling - -- (id)testFocusedElement -{ - XCUIElementDouble *focused = XCUIElementDouble.new; - focused.wdFrame = CGRectMake(100, 100, 100, 100);; - return focused; -} - -@end - -@interface FBTVNavigationTrackerTests : XCTestCase -@end - -@implementation FBTVNavigationTrackerTests - -- (void)testSimpleLeftNavigation -{ - XCUIElementDouble *targetElement = XCUIElementDouble.new; - targetElement.wdFrame = CGRectMake(0, 100, 100, 100); - FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:targetElement]; - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionLeft); -} - -- (void)testSimpleRightNavigation -{ - XCUIElementDouble *targetElement = XCUIElementDouble.new; - targetElement.wdFrame = CGRectMake(200, 100, 100, 100); - FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:targetElement]; - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionRight); -} - -- (void)testSimpleUpNavigation -{ - XCUIElementDouble *targetElement = XCUIElementDouble.new; - targetElement.wdFrame = CGRectMake(100, 0, 100, 100); - FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:targetElement]; - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionUp); -} - -- (void)testSimpleDownNavigation -{ - XCUIElementDouble *targetElement = XCUIElementDouble.new; - targetElement.wdFrame = CGRectMake(100, 200, 100, 100); - FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:targetElement]; - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionDown); -} - -- (void)testComplexLeftNavigation -{ - XCUIElementDouble *targetElement = XCUIElementDouble.new; - targetElement.wdFrame = CGRectMake(0, 50, 100, 100); - FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:targetElement]; - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionLeft); -} - -- (void)testComplexRightNavigation -{ - XCUIElementDouble *targetElement = XCUIElementDouble.new; - targetElement.wdFrame = CGRectMake(200, 50, 100, 100); - FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:targetElement]; - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionRight); -} - -- (void)testComplexUpNavigation -{ - XCUIElementDouble *targetElement = XCUIElementDouble.new; - targetElement.wdFrame = CGRectMake(50, 0, 100, 100); - FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:targetElement]; - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionUp); -} - -- (void)testComplexDownNavigation -{ - XCUIElementDouble *targetElement = XCUIElementDouble.new; - targetElement.wdFrame = CGRectMake(50, 200, 100, 100); - FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:targetElement]; - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionDown); -} - -- (void)testOneDirectionSimpleNavigation -{ - XCUIElementDouble *targetElement = XCUIElementDouble.new; - targetElement.wdFrame = CGRectMake(0, 100, 100, 100); - FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:targetElement]; - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionLeft); - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionNone); -} - -- (void)testOneDirectionComplexWhereXGraterNavigation -{ - XCUIElementDouble *targetElement = XCUIElementDouble.new; - targetElement.wdFrame = CGRectMake(0, 50, 100, 100); - FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:targetElement]; - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionLeft); - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionUp); - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionNone); -} - -- (void)testOneDirectionComplexWhereYGraterNavigation -{ - XCUIElementDouble *targetElement = XCUIElementDouble.new; - targetElement.wdFrame = CGRectMake(50, 0, 100, 100); - FBTVNavigationTracker *tracker = [FBTVNavigationTracker trackerWithTargetElement:targetElement]; - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionUp); - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionLeft); - XCTAssertEqual(tracker.directionToMoveFocuse, FBTVDirectionNone); -} - - -@end diff --git a/WebDriverAgentTests/UnitTests/FBXPathTests.m b/WebDriverAgentTests/UnitTests/FBXPathTests.m index 32af6d0cc..c4e06b5ea 100644 --- a/WebDriverAgentTests/UnitTests/FBXPathTests.m +++ b/WebDriverAgentTests/UnitTests/FBXPathTests.m @@ -43,11 +43,7 @@ - (void)testDefaultXPathPresentation { XCUIElementDouble *element = [XCUIElementDouble new]; NSString *resultXml = [self xmlStringWithElement:element xpathQuery:nil]; -#if TARGET_OS_TV - NSString *expectedXml = [NSString stringWithFormat:@"\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" focused=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" private_indexPath=\"top\"/>\n", element.wdType, element.wdType, element.wdValue, element.wdName, element.wdLabel, element.wdEnabled ? @"true" : @"false", element.wdVisible ? @"true" : @"false", element.wdFocused ? @"true" : @"false", element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"]]; -#else NSString *expectedXml = [NSString stringWithFormat:@"\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" private_indexPath=\"top\"/>\n", element.wdType, element.wdType, element.wdValue, element.wdName, element.wdLabel, element.wdEnabled ? @"true" : @"false", element.wdVisible ? @"true" : @"false", element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"]]; -#endif XCTAssertTrue([resultXml isEqualToString: expectedXml]); } @@ -55,11 +51,7 @@ - (void)testXPathPresentationBasedOnQueryMatchingAllAttributes { XCUIElementDouble *element = [XCUIElementDouble new]; NSString *resultXml = [self xmlStringWithElement:element xpathQuery:[NSString stringWithFormat:@"//%@[@*]", element.wdType]]; -#if TARGET_OS_TV - NSString *expectedXml = [NSString stringWithFormat:@"\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" focused=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" private_indexPath=\"top\"/>\n", element.wdType, element.wdType, element.wdValue, element.wdName, element.wdLabel, element.wdEnabled ? @"true" : @"false", element.wdVisible ? @"true" : @"false", element.wdFocused ? @"true" : @"false", element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"]]; -#else NSString *expectedXml = [NSString stringWithFormat:@"\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" private_indexPath=\"top\"/>\n", element.wdType, element.wdType, element.wdValue, element.wdName, element.wdLabel, element.wdEnabled ? @"true" : @"false", element.wdVisible ? @"true" : @"false", element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"]]; -#endif XCTAssertTrue([resultXml isEqualToString: expectedXml]); } From 8e3df7a52c7f7c24cfb469ca4293bb6b9218815d Mon Sep 17 00:00:00 2001 From: Pavel Serdziukou Date: Fri, 16 Nov 2018 11:43:47 +0300 Subject: [PATCH 70/81] revert integration app templates --- .../Resources/Templates~.storyboard | 394 ------------------ 1 file changed, 394 deletions(-) delete mode 100644 IntegrationApp_tvOS/Resources/Templates~.storyboard diff --git a/IntegrationApp_tvOS/Resources/Templates~.storyboard b/IntegrationApp_tvOS/Resources/Templates~.storyboard deleted file mode 100644 index 74058b605..000000000 --- a/IntegrationApp_tvOS/Resources/Templates~.storyboard +++ /dev/null @@ -1,394 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From db7afab862ec2b2b2097730ebc8516c12c65c4c4 Mon Sep 17 00:00:00 2001 From: Pavel Serdziukou Date: Fri, 16 Nov 2018 12:00:26 +0300 Subject: [PATCH 71/81] revert lib update --- WebDriverAgent.xcodeproj/project.pbxproj | 818 +----------------- .../XCAccessibilityElement+FBComparison.h | 27 - .../XCAccessibilityElement+FBComparison.m | 20 - .../Categories/XCElementSnapshot+FBHelpers.h | 7 - .../Categories/XCElementSnapshot+FBHelpers.m | 11 - .../Categories/XCUIApplication+FBFocused.h | 24 - .../Categories/XCUIApplication+FBFocused.m | 21 - .../Categories/XCUIApplication+FBHelpers.m | 8 +- .../Categories/XCUICoordinate+FBFix.h | 5 - .../Categories/XCUICoordinate+FBFix.m | 4 - .../Categories/XCUIDevice+FBHelpers.m | 16 +- .../Categories/XCUIDevice+FBRotation.h | 6 +- .../Categories/XCUIDevice+FBRotation.m | 34 +- .../Categories/XCUIElement+FBForceTouch.h | 3 +- .../Categories/XCUIElement+FBForceTouch.m | 3 - .../Categories/XCUIElement+FBIsVisible.m | 50 +- .../Categories/XCUIElement+FBPickerWheel.h | 23 +- .../Categories/XCUIElement+FBPickerWheel.m | 16 +- .../Categories/XCUIElement+FBScrolling.h | 19 +- .../Categories/XCUIElement+FBScrolling.m | 66 +- .../Categories/XCUIElement+FBTVFocuse.h | 22 - .../Categories/XCUIElement+FBTVFocuse.m | 57 -- .../Categories/XCUIElement+FBTap.m | 5 +- .../Categories/XCUIElement+FBTyping.m | 8 - .../Categories/XCUIElement+FBUtilities.m | 15 +- .../XCUIElement+FBWebDriverAttributes.m | 9 - WebDriverAgentLib/Commands/FBCustomCommands.m | 17 +- .../Commands/FBElementCommands.m | 147 ++-- .../Commands/FBFindElementCommands.m | 26 +- .../Commands/FBOrientationCommands.m | 18 +- .../Commands/FBRemoteControlCommands.h | 20 - .../Commands/FBRemoteControlCommands.m | 52 -- WebDriverAgentLib/FBAlert.m | 111 +-- WebDriverAgentLib/FBHomeboardApplication.h | 43 - WebDriverAgentLib/FBSpringboardApplication.h | 19 +- ...plication.m => FBSpringboardApplication.m} | 93 +- WebDriverAgentLib/Routing/FBElement.h | 7 - WebDriverAgentLib/Routing/FBElementUtils.h | 8 - WebDriverAgentLib/Routing/FBElementUtils.m | 21 - WebDriverAgentLib/Routing/FBSession.m | 2 +- WebDriverAgentLib/Utilities/FBKeyboard.m | 29 +- WebDriverAgentLib/Utilities/FBMathUtils.h | 2 - WebDriverAgentLib/Utilities/FBMathUtils.m | 4 +- .../Utilities/FBTVNavigationTracker.h | 32 - .../Utilities/FBTVNavigationTracker.m | 144 --- WebDriverAgentLib/Utilities/FBXPath.m | 29 - WebDriverAgentLib/WebDriverAgentLib.h | 3 +- .../Resources/Base.lproj/Main.storyboard | 14 +- .../FBElementVisibilityTests.m | 21 +- .../IntegrationTests/FBIntegrationTestCase.h | 4 +- .../IntegrationTests/FBIntegrationTestCase.m | 10 +- .../XCElementSnapshotHelperTests.m | 2 +- .../XCUIApplicationHelperTests.m | 14 +- 53 files changed, 250 insertions(+), 1939 deletions(-) delete mode 100644 WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.h delete mode 100644 WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.m delete mode 100644 WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h delete mode 100644 WebDriverAgentLib/Categories/XCUIApplication+FBFocused.m delete mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h delete mode 100644 WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m delete mode 100644 WebDriverAgentLib/Commands/FBRemoteControlCommands.h delete mode 100644 WebDriverAgentLib/Commands/FBRemoteControlCommands.m delete mode 100644 WebDriverAgentLib/FBHomeboardApplication.h rename WebDriverAgentLib/{FBHomeboardApplication.m => FBSpringboardApplication.m} (51%) delete mode 100644 WebDriverAgentLib/Utilities/FBTVNavigationTracker.h delete mode 100644 WebDriverAgentLib/Utilities/FBTVNavigationTracker.m diff --git a/WebDriverAgent.xcodeproj/project.pbxproj b/WebDriverAgent.xcodeproj/project.pbxproj index 5f6ea2184..cdaa5eecf 100644 --- a/WebDriverAgent.xcodeproj/project.pbxproj +++ b/WebDriverAgent.xcodeproj/project.pbxproj @@ -8,263 +8,10 @@ /* 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 */; }; - 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 */; }; - 1C7365A6219C5943009BC01A /* FBTVNavigationTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C7365A4219C5942009BC01A /* FBTVNavigationTracker.h */; }; - 1C7365A7219C5943009BC01A /* FBTVNavigationTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C7365A5219C5942009BC01A /* FBTVNavigationTracker.m */; }; 1C7365D0219C6746009BC01A /* XCUICoordinateFix.m in Sources */ = {isa = PBXBuildFile; fileRef = EEC9EED820077D8E00BC0D5B /* XCUICoordinateFix.m */; }; - 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 */; }; - 1CDC56622111C26F00868007 /* UITestingUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB7FD1CAEE048008C271F /* UITestingUITests.m */; }; + 1CCB1DCF219EBE2E001BF660 /* FBSpringboardApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CCB1DCD219EBE2E001BF660 /* FBSpringboardApplication.h */; }; + 1CCB1DD0219EBE2E001BF660 /* FBSpringboardApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CCB1DCE219EBE2E001BF660 /* FBSpringboardApplication.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 */; }; @@ -382,8 +129,6 @@ 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 /* 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 */; }; @@ -583,13 +328,6 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 1C0EE1122111C4A9009EDBB1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1C8F1A302100B24400F6FEF4; - remoteInfo = WebDriverAgentLib_tvOS; - }; AD8D96F01D3C12960061268E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 91F9DAE11B99DBC2001349B2 /* Project object */; @@ -649,28 +387,6 @@ /* 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; @@ -699,20 +415,10 @@ /* 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 = ""; }; - 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 = ""; }; - 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 = ""; }; 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; }; + 1CCB1DCD219EBE2E001BF660 /* FBSpringboardApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FBSpringboardApplication.h; path = WebDriverAgentLib/FBSpringboardApplication.h; sourceTree = SOURCE_ROOT; }; + 1CCB1DCE219EBE2E001BF660 /* FBSpringboardApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FBSpringboardApplication.m; path = WebDriverAgentLib/FBSpringboardApplication.m; sourceTree = SOURCE_ROOT; }; 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 = ""; }; @@ -1016,8 +722,6 @@ 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 /* 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 = ""; }; @@ -1048,25 +752,6 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 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; - }; EE158A951CBD452B00A3E3F0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1171,8 +856,6 @@ EE9B75EC1CF7956C00275851 /* IntegrationTests_1.xctest */, EE5095FE1EBCC9090028E2FE /* IntegrationTests_2.xctest */, EE22021C1ECC612200A29571 /* IntegrationTests_3.xctest */, - 1C8F1B312100B24400F6FEF4 /* WebDriverAgentLib_tvOS.framework */, - 1CDC566C2111C26F00868007 /* WebDriverAgentRunner_tvOS.xctest */, ); name = Products; sourceTree = ""; @@ -1244,8 +927,6 @@ 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 */, @@ -1278,10 +959,6 @@ 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; @@ -1312,8 +989,6 @@ EE9AB7631CAEDF0C008C271F /* FBTouchIDCommands.m */, EE9AB7641CAEDF0C008C271F /* FBUnknownCommands.h */, EE9AB7651CAEDF0C008C271F /* FBUnknownCommands.m */, - 1C1954712112EF9100A99F21 /* FBRemoteControlCommands.h */, - 1C1954722112EF9100A99F21 /* FBRemoteControlCommands.m */, ); name = Commands; path = WebDriverAgentLib/Commands; @@ -1402,8 +1077,6 @@ EE9AB7991CAEDF0C008C271F /* FBXPathCreator.m */, EE6B64FB1D0F86EF00E85F5D /* XCTestPrivateSymbols.h */, EE6B64FC1D0F86EF00E85F5D /* XCTestPrivateSymbols.m */, - 1C7365A4219C5942009BC01A /* FBTVNavigationTracker.h */, - 1C7365A5219C5942009BC01A /* FBTVNavigationTracker.m */, ); name = Utilities; path = WebDriverAgentLib/Utilities; @@ -1542,8 +1215,8 @@ EE9AB7671CAEDF0C008C271F /* FBApplication.m */, EE3A18641CDE734B00DE4205 /* FBKeyboard.h */, EE3A18651CDE734B00DE4205 /* FBKeyboard.m */, - EEC088EA1CB5706D00B65968 /* FBHomeboardApplication.h */, - EEC088EB1CB5706D00B65968 /* FBHomeboardApplication.m */, + 1CCB1DCD219EBE2E001BF660 /* FBSpringboardApplication.h */, + 1CCB1DCE219EBE2E001BF660 /* FBSpringboardApplication.m */, EE9AB7681CAEDF0C008C271F /* FBApplicationProcessProxy.h */, EE9AB7691CAEDF0C008C271F /* FBApplicationProcessProxy.m */, EE158B5D1CBD479000A3E3F0 /* Info.plist */, @@ -1684,190 +1357,6 @@ /* 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; @@ -1920,7 +1409,6 @@ 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 */, @@ -1953,6 +1441,7 @@ EE158AD21CBD456F00A3E3F0 /* FBElementCache.h in Headers */, EE35AD5A1E3B77D600A02D78 /* XCTMetric.h in Headers */, EE35AD461E3B77D600A02D78 /* XCTestContextScope.h in Headers */, + 1CCB1DCF219EBE2E001BF660 /* FBSpringboardApplication.h in Headers */, 71A7EAF51E20516B001DA4F2 /* XCUIElement+FBClassChain.h in Headers */, EE158ADA1CBD456F00A3E3F0 /* FBResponseJSONPayload.h in Headers */, EE35AD3D1E3B77D600A02D78 /* XCTAutomationTarget-Protocol.h in Headers */, @@ -1978,7 +1467,6 @@ EE35AD131E3B77D600A02D78 /* _XCTNSPredicateExpectationImplementation.h in Headers */, EE158ABE1CBD456F00A3E3F0 /* FBElementCommands.h in Headers */, EE158AD81CBD456F00A3E3F0 /* FBResponseFilePayload.h in Headers */, - EE158AF71CBD456F00A3E3F0 /* FBHomeboardApplication.h in Headers */, 71B49EC71ED1A58100D51AD6 /* XCUIElement+FBUID.h in Headers */, EE35AD381E3B77D600A02D78 /* XCSymbolicationRecord.h in Headers */, EE35AD6E1E3B77D600A02D78 /* XCUIDevice.h in Headers */, @@ -2056,44 +1544,6 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 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"; - }; EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */ = { isa = PBXNativeTarget; buildConfigurationList = EE158AA01CBD452B00A3E3F0 /* Build configuration list for PBXNativeTarget "WebDriverAgentLib" */; @@ -2234,12 +1684,6 @@ LastUpgradeCheck = 1000; ORGANIZATIONNAME = Facebook; TargetAttributes = { - 1C8F1A302100B24400F6FEF4 = { - DevelopmentTeam = U9WLLAC7UL; - }; - 1CDC565E2111C26F00868007 = { - DevelopmentTeam = U9WLLAC7UL; - }; EE158A981CBD452B00A3E3F0 = { CreatedOnToolsVersion = 7.3; DevelopmentTeam = U9WLLAC7UL; @@ -2275,9 +1719,7 @@ projectRoot = ""; targets = ( EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */, - 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */, EEF988291C486603005CA669 /* WebDriverAgentRunner */, - 1CDC565E2111C26F00868007 /* WebDriverAgentRunner_tvOS */, EE836C011C0F118600D87246 /* UnitTests */, EE9B75EB1CF7956C00275851 /* IntegrationTests_1 */, EE5095DD1EBCC9090028E2FE /* IntegrationTests_2 */, @@ -2288,21 +1730,6 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 1C8F1B2A2100B24400F6FEF4 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1C8F1B2B2100B24400F6FEF4 /* WebDriverAgent.bundle in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 1CDC56652111C26F00868007 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; EE158A971CBD452B00A3E3F0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2357,88 +1784,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 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; - }; EE158A941CBD452B00A3E3F0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2455,6 +1800,7 @@ AD6C269D1CF2494200F8B5FF /* XCUIApplication+FBHelpers.m in Sources */, EE3A18671CDE734B00DE4205 /* FBKeyboard.m in Sources */, 713C6DD01DDC772A00285B92 /* FBElementUtils.m in Sources */, + 1CCB1DD0219EBE2E001BF660 /* FBSpringboardApplication.m in Sources */, EEC1950820C6D0790094500B /* FBElementHitPoint.m in Sources */, EE158AFA1CBD456F00A3E3F0 /* FBApplicationProcessProxy.m in Sources */, EE158AB11CBD456F00A3E3F0 /* XCUIElement+FBIsVisible.m in Sources */, @@ -2471,7 +1817,6 @@ EE158ADB1CBD456F00A3E3F0 /* FBResponseJSONPayload.m in Sources */, EE7E271F1D06C69F001BEC7B /* FBXCTestCaseImplementationFailureHoldingProxy.m in Sources */, EEDFE1221D9C06F800E6FFE5 /* XCUIDevice+FBHealthCheck.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 */, @@ -2481,7 +1826,6 @@ 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 */, @@ -2614,11 +1958,6 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 1C0EE1132111C4A9009EDBB1 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1C8F1A302100B24400F6FEF4 /* WebDriverAgentLib_tvOS */; - targetProxy = 1C0EE1122111C4A9009EDBB1 /* PBXContainerItemProxy */; - }; AD8D96F11D3C12960061268E /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = EE158A981CBD452B00A3E3F0 /* WebDriverAgentLib */; @@ -2673,129 +2012,6 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 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; - }; 91F9DB0A1B99DBC2001349B2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3171,24 +2387,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 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; - }; 91F9DAE41B99DBC2001349B2 /* Build configuration list for PBXProject "WebDriverAgent" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.h b/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.h deleted file mode 100644 index 2d504d14f..000000000 --- a/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.h +++ /dev/null @@ -1,27 +0,0 @@ -/** - * 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 deleted file mode 100644 index 49f030b6d..000000000 --- a/WebDriverAgentLib/Categories/XCAccessibilityElement+FBComparison.m +++ /dev/null @@ -1,20 +0,0 @@ -/** - * 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 8753a8f9f..7ebbadd6d 100644 --- a/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.h +++ b/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.h @@ -57,13 +57,6 @@ 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 ea93b41a5..3374a2156 100644 --- a/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.m +++ b/WebDriverAgentLib/Categories/XCElementSnapshot+FBHelpers.m @@ -57,17 +57,6 @@ - (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 deleted file mode 100644 index 733659aad..000000000 --- a/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - * 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 deleted file mode 100644 index a8fd1f6b7..000000000 --- a/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.m +++ /dev/null @@ -1,21 +0,0 @@ -/** - * 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 741f6388c..3e34136f0 100644 --- a/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +++ b/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m @@ -9,7 +9,7 @@ #import "XCUIApplication+FBHelpers.h" -#import "FBHomeboardApplication.h" +#import "FBSpringboardApplication.h" #import "XCElementSnapshot.h" #import "FBElementTypeTransformer.h" #import "FBMacros.h" @@ -35,8 +35,7 @@ - (BOOL)fb_deactivateWithDuration:(NSTimeInterval)duration error:(NSError **)err [self fb_activate]; return YES; } - return [[FBHomeboardApplication fb_homeboard] fb_openApplicationWithIdentifier:applicationIdentifier - error:error]; + return [[FBSpringboardApplication fb_springboard] fb_tapApplicationWithIdentifier:applicationIdentifier error:error]; } - (NSDictionary *)fb_tree @@ -64,9 +63,6 @@ + (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 695713462..55742a95c 100644 --- a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h +++ b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.h @@ -9,13 +9,8 @@ #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 1e42fd081..6b6aa62c3 100644 --- a/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.m +++ b/WebDriverAgentLib/Categories/XCUICoordinate+FBFix.m @@ -13,8 +13,6 @@ #import "XCUIElement+FBUtilities.h" #import "XCElementSnapshot+FBHitPoint.h" -#if !TARGET_OS_TV - @implementation XCUICoordinate (FBFix) - (CGPoint)fb_screenPoint @@ -39,5 +37,3 @@ - (CGPoint)fb_screenPoint } @end - -#endif diff --git a/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m b/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m index a9c278478..fab9c9176 100644 --- a/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m +++ b/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m @@ -14,7 +14,7 @@ #include #import -#import "FBHomeboardApplication.h" +#import "FBSpringboardApplication.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 (![[FBHomeboardApplication fb_homeboard] fb_waitUntilApplicationBoardIsVisible:error]) { + if (![[FBSpringboardApplication fb_springboard] fb_waitUntilApplicationBoardIsVisible:error]) { return NO; } return YES; @@ -55,25 +55,21 @@ - (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); @@ -99,7 +95,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 9804096b9..f94877971 100644 --- a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h +++ b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h @@ -12,13 +12,11 @@ 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. */ @@ -37,6 +35,4 @@ 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 5b0146eb8..c25e0f1f7 100644 --- a/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m +++ b/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m @@ -9,8 +9,6 @@ #import "XCUIDevice+FBRotation.h" -#if TARGET_OS_IOS - static const NSTimeInterval kFBWebDriverOrientationChangeDelay = 5.0; static const CGFloat FBRotationCoolOffTime = 1.f; @@ -51,23 +49,21 @@ - (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 23ec68a60..76a3ed2db 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.h +++ b/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.h @@ -11,7 +11,6 @@ NS_ASSUME_NONNULL_BEGIN -#if !TARGET_OS_TV @interface XCUIElement (FBForceTouch) /** @@ -36,5 +35,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 10216fa55..cb58efa4b 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.m @@ -21,7 +21,6 @@ #import "XCPointerEventPath.h" #import "XCTRunnerDaemonSession.h" -#if !TARGET_OS_TV @implementation XCUIElement (FBForceTouch) - (BOOL)fb_forceTouchWithPressure:(double)pressure duration:(double)duration error:(NSError **)error @@ -88,5 +87,3 @@ - (XCSynthesizedEventRecord *)fb_generateForceTouchEvent:(CGPoint)hitPoint press } @end -#endif - diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m b/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m index f261fef17..e86a021de 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m @@ -13,18 +13,12 @@ #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) @@ -37,31 +31,6 @@ - (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; @@ -72,28 +41,15 @@ - (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]; - 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; - } - } + XCElementSnapshot *hitElement = [self hitTest:midPoint]; + if (self == hitElement || [self._allDescendants.copy containsObject:hitElement]) { + 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 dc6ee00b9..a63cf934e 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,17 +31,16 @@ 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 0c1e9dbac..4b2e9d3ee 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m @@ -12,7 +12,6 @@ #import "FBRunLoopSpinner.h" #import "XCUICoordinate.h" -#if !TARGET_OS_TV @implementation XCUIElement (FBPickerWheel) static const NSTimeInterval VALUE_CHANGE_TIMEOUT = 2; @@ -24,13 +23,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 @@ -44,4 +43,3 @@ - (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 0af840c45..3aceb3988 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,5 +82,4 @@ 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 08b6c6e47..55623955d 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.m @@ -30,7 +30,6 @@ #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; @@ -91,7 +90,7 @@ - (BOOL)fb_scrollToVisibleWithNormalizedScrollDistance:(CGFloat)normalizedScroll return YES; } __block NSArray *cellSnapshots, *visibleCellSnapshots; - + NSArray *acceptedParents = @[ @(XCUIElementTypeScrollView), @(XCUIElementTypeCollectionView), @@ -100,27 +99,31 @@ - (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. @@ -129,7 +132,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; @@ -143,34 +146,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, @@ -241,7 +244,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) { @@ -267,15 +270,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]; @@ -283,10 +286,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)){ @@ -306,4 +309,3 @@ - (BOOL)fb_scrollAncestorScrollViewByVectorWithinScrollViewFrame:(CGVector)vecto } @end -#endif diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h b/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h deleted file mode 100644 index 9aaa9d621..000000000 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * 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 deleted file mode 100644 index a07bd6ce5..000000000 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m +++ /dev/null @@ -1,57 +0,0 @@ -/** - * 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 168a61430..f71ed5d5e 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTap.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTap.m @@ -20,7 +20,6 @@ #import "XCPointerEventPath.h" #import "XCTRunnerDaemonSession.h" -#if !TARGET_OS_TV const CGFloat FBTapDuration = 0.01f; @implementation XCUIElement (FBTap) @@ -63,7 +62,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); @@ -88,5 +87,3 @@ - (XCSynthesizedEventRecord *)fb_generateTapEvent:(CGPoint)hitPoint orientation: } @end - -#endif diff --git a/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m b/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m index fff060473..2c0a801dd 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m @@ -24,17 +24,9 @@ - (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 99cc81e5b..868dfb687 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,17 +143,16 @@ - (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]; - UIImageOrientation imageOrientation = UIImageOrientationUp; -#if !TARGET_OS_TV UIInterfaceOrientation orientation = self.application.interfaceOrientation; + UIImageOrientation imageOrientation = UIImageOrientationUp; // 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; @@ -162,14 +161,12 @@ - (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 4a3e2d571..95d31f1e7 100644 --- a/WebDriverAgentLib/Categories/XCUIElement+FBWebDriverAttributes.m +++ b/WebDriverAgentLib/Categories/XCUIElement+FBWebDriverAttributes.m @@ -105,15 +105,6 @@ - (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 8db4ab6ad..c562f8e83 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 "FBHomeboardApplication.h" +#import "FBSpringboardApplication.h" #import "XCUIApplication+FBHelpers.h" #import "XCUIDevice+FBHelpers.h" #import "XCUIElement.h" @@ -74,13 +74,7 @@ + (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) { @@ -91,7 +85,8 @@ + (NSArray *)routes timeout:5] timeoutErrorMessage:errorDescription] spinUntilTrue:^BOOL{ - return ![self isKeyboardPresent]; + XCUIElement *foundKeyboard = [[FBApplication fb_activeApplication].query descendantsMatchingType:XCUIElementTypeKeyboard].fb_firstMatch; + return !(foundKeyboard && foundKeyboard.fb_isVisible); } error:&error]; if (!isKeyboardNotPresent) { @@ -112,10 +107,4 @@ + (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 c22a64a09..b8a7ae887 100644 --- a/WebDriverAgentLib/Commands/FBElementCommands.m +++ b/WebDriverAgentLib/Commands/FBElementCommands.m @@ -35,7 +35,6 @@ #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" @@ -60,35 +59,27 @@ + (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/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/tap/:uuid"] respondWithTarget:self action:@selector(handleTap:)], + [[FBRoute POST:@"/wda/touchAndHold"] respondWithTarget:self action:@selector(handleTouchAndHoldCoordinate:)], [[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 - ]; + ]; } @@ -157,28 +148,6 @@ + (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; @@ -192,7 +161,6 @@ + (NSArray *)routes if ([value isKindOfClass:[NSArray class]]) { textToType = [value componentsJoinedByString:@""]; } -#if TARGET_OS_IOS if (element.elementType == XCUIElementTypePickerWheel) { [element adjustToPickerWheelValue:textToType]; return FBResponseWithOK(); @@ -205,7 +173,6 @@ + (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]) { @@ -214,37 +181,30 @@ + (NSArray *)routes return FBResponseWithElementUUID(elementUUID); } -+ (id)handleClear:(FBRouteRequest *)request ++ (id)handleClick:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; NSString *elementUUID = request.parameters[@"uuid"]; XCUIElement *element = [elementCache elementForUUID:elementUUID]; - NSError *error; - if (![element fb_clearTextWithError:&error]) { + NSError *error = nil; + if (![element fb_tapWithError:&error]) { return FBResponseWithError(error); } return FBResponseWithElementUUID(elementUUID); } - -+ (id)handleClick:(FBRouteRequest *)request ++ (id)handleClear:(FBRouteRequest *)request { - NSString *elementUUID = request.parameters[@"uuid"]; FBElementCache *elementCache = request.session.elementCache; + NSString *elementUUID = request.parameters[@"uuid"]; XCUIElement *element = [elementCache elementForUUID:elementUUID]; - NSError *error = nil; -#if TARGET_OS_IOS - if (![element fb_tapWithError:&error]) { -#elif TARGET_OS_TV - if (![element fb_selectWithError:&error]) { -#endif + NSError *error; + if (![element fb_clearTextWithError:&error]) { return FBResponseWithError(error); } return FBResponseWithElementUUID(elementUUID); } - -#if TARGET_OS_IOS - + + (id)handleDoubleTap:(FBRouteRequest *)request { FBElementCache *elementCache = request.session.elementCache; @@ -263,10 +223,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 @@ -316,7 +276,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"]; @@ -327,7 +287,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"; @@ -343,7 +303,7 @@ + (NSArray *)routes } return FBResponseWithOK(); } - + NSString *const predicateString = request.arguments[@"predicateString"]; if (predicateString) { NSPredicate *formattedPredicate = [NSPredicate fb_formatSearchPredicate:[FBPredicate predicateWithFormat:predicateString]]; @@ -353,7 +313,7 @@ + (NSArray *)routes } return [self.class handleScrollElementToVisible:childElement withRequest:request]; } - + if (request.arguments[@"toVisible"]) { return [self.class handleScrollElementToVisible:element withRequest:request]; } @@ -372,7 +332,6 @@ + (NSArray *)routes return FBResponseWithOK(); } - + (id)handleDrag:(FBRouteRequest *)request { FBSession *session = request.session; @@ -390,31 +349,30 @@ + (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 { - CGPoint tapPoint = CGPointMake((CGFloat)[request.arguments[@"x"] doubleValue], (CGFloat)[request.arguments[@"y"] doubleValue]); FBElementCache *elementCache = request.session.elementCache; + CGPoint tapPoint = CGPointMake((CGFloat)[request.arguments[@"x"] doubleValue], (CGFloat)[request.arguments[@"y"] doubleValue]); XCUIElement *element = [elementCache elementForUUID:request.parameters[@"uuid"]]; if (nil == element) { XCUICoordinate *tapCoordinate = [self.class gestureCoordinateWithCoordinate:tapPoint application:request.session.application shouldApplyOrientationWorkaround:isSDKVersionLessThan(@"11.0")]; @@ -437,7 +395,6 @@ + (NSArray *)routes [element pinchWithScale:scale velocity:velocity]; return FBResponseWithOK(); } -#endif // TARGET_OS_IOS + (id)handleKeys:(FBRouteRequest *)request { @@ -453,15 +410,11 @@ + (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 @@ -477,7 +430,6 @@ + (NSArray *)routes return FBResponseWithObject(screenshot); } -#if TARGET_OS_IOS static const CGFloat DEFAULT_OFFSET = (CGFloat)0.2; + (id)handleWheelSelect:(FBRouteRequest *)request @@ -495,7 +447,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 = NO; + BOOL isSuccessful = false; NSError *error; if ([order isEqualToString:@"next"]) { isSuccessful = [element fb_selectNextOptionWithOffset:offset error:&error]; @@ -514,10 +466,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); } @@ -526,7 +478,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 @@ -581,6 +533,5 @@ + (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 3c6b96bc7..6dd976d97 100644 --- a/WebDriverAgentLib/Commands/FBFindElementCommands.m +++ b/WebDriverAgentLib/Commands/FBFindElementCommands.m @@ -22,16 +22,14 @@ #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); } @@ -48,10 +46,7 @@ + (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 - ]; + ]; } @@ -101,18 +96,9 @@ + (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]); + return FBResponseWithCachedElements(foundElements, request.session.elementCache, FBConfiguration.shouldUseCompactResponses); } -#endif #pragma mark - Helpers diff --git a/WebDriverAgentLib/Commands/FBOrientationCommands.m b/WebDriverAgentLib/Commands/FBOrientationCommands.m index 933885bf2..dc5a3428b 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 deleted file mode 100644 index 4ed081478..000000000 --- a/WebDriverAgentLib/Commands/FBRemoteControlCommands.h +++ /dev/null @@ -1,20 +0,0 @@ -/** - * 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 deleted file mode 100644 index c096fcb58..000000000 --- a/WebDriverAgentLib/Commands/FBRemoteControlCommands.m +++ /dev/null @@ -1,52 +0,0 @@ -/** - * 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 1e99a362a..7003852da 100644 --- a/WebDriverAgentLib/FBAlert.m +++ b/WebDriverAgentLib/FBAlert.m @@ -14,7 +14,7 @@ #import "FBApplication.h" #import "FBErrorBuilder.h" #import "FBFindElementCommands.h" -#import "FBHomeboardApplication.h" +#import "FBSpringboardApplication.h" #import "FBLogger.h" #import "FBXCodeCompatibility.h" #import "XCAXClient_iOS.h" @@ -27,11 +27,8 @@ #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) @@ -61,16 +58,6 @@ - (XCUIElement *)fb_alertElement return alert; } } - -#if TARGET_OS_TV - - alert = self.windows[FBAlertWindowIdentifier]; - if (alert.exists) { - return alert; - } - -#endif - return nil; } @@ -112,27 +99,6 @@ - (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"]; } @@ -147,7 +113,7 @@ - (NSArray *)buttonLabels if (!alertElement) { return nil; } - NSArray *buttons = [self alertButtons]; + NSArray *buttons = [alertElement descendantsMatchingType:XCUIElementTypeButton].allElementsBoundByIndex; for(XCUIElement *button in buttons) { [value addObject:[button wdLabel]]; } @@ -157,7 +123,7 @@ - (NSArray *)buttonLabels - (BOOL)acceptWithError:(NSError **)error { XCUIElement *alertElement = self.alertElement; - NSArray *buttons = [self alertButtons]; + NSArray *buttons = [alertElement descendantsMatchingType:XCUIElementTypeButton].allElementsBoundByIndex; XCUIElement *defaultButton; if (alertElement.elementType == XCUIElementTypeAlert) { @@ -171,14 +137,14 @@ - (BOOL)acceptWithError:(NSError **)error withDescriptionFormat:@"Failed to find accept button for alert: %@", alertElement] buildError:error]; } - return [self submitAlertButton:defaultButton withError:error]; + return [defaultButton fb_tapWithError:error]; } - (BOOL)dismissWithError:(NSError **)error { XCUIElement *cancelButton; XCUIElement *alertElement = self.alertElement; - NSArray *buttons = [self alertButtons]; + NSArray *buttons = [alertElement descendantsMatchingType:XCUIElementTypeButton].allElementsBoundByIndex; if (alertElement.elementType == XCUIElementTypeAlert) { cancelButton = buttons.firstObject; @@ -192,14 +158,13 @@ - (BOOL)dismissWithError:(NSError **)error buildError:error]; return NO; } - return [self submitAlertButton:cancelButton withError:error]; + return [cancelButton fb_tapWithError:error]; } -- (BOOL)clickAlertButton:(NSString *)label error:(NSError **)error -{ +- (BOOL)clickAlertButton:(NSString *)label error:(NSError **)error { XCUIElement *alertElement = self.alertElement; - NSArray *buttons = [self alertButtons]; + NSArray *buttons = [alertElement descendantsMatchingType:XCUIElementTypeButton].allElementsBoundByIndex; XCUIElement *requestedButton; for(XCUIElement *button in buttons) { @@ -215,7 +180,8 @@ - (BOOL)clickAlertButton:(NSString *)label error:(NSError **)error withDescriptionFormat:@"Failed to find button with label %@ for alert: %@", label, alertElement] buildError:error]; } - return [self submitAlertButton:requestedButton withError:error]; + + return [requestedButton fb_tapWithError:error]; } + (BOOL)isElementObstructedByAlertView:(XCUIElement *)element alert:(XCUIElement *)alert @@ -254,40 +220,9 @@ + (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 ?: [FBApplication fb_activeApplication].fb_alertElement; + XCUIElement *alert = self.application.fb_alertElement ?: [FBSpringboardApplication fb_springboard].fb_alertElement; if (!alert.exists) { return nil; } @@ -295,28 +230,4 @@ - (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 deleted file mode 100644 index d5d1048be..000000000 --- a/WebDriverAgentLib/FBHomeboardApplication.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * 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.h b/WebDriverAgentLib/FBSpringboardApplication.h index 8ac8dc36b..7de642a5b 100644 --- a/WebDriverAgentLib/FBSpringboardApplication.h +++ b/WebDriverAgentLib/FBSpringboardApplication.h @@ -14,14 +14,12 @@ NS_ASSUME_NONNULL_BEGIN /*! Bundle identifier of Springboard app */ extern NSString *const SPRINGBOARD_BUNDLE_ID; -@interface FBHomeboardApplication : FBApplication +@interface FBSpringboardApplication : FBApplication /** @return FBApplication that is attached to SpringBoard */ -+ (instancetype)fb_homeboard; - -#if TARGET_OS_IOS ++ (instancetype)fb_springboard; /** Taps application on SpringBoard app with given identifier @@ -32,19 +30,6 @@ 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/FBHomeboardApplication.m b/WebDriverAgentLib/FBSpringboardApplication.m similarity index 51% rename from WebDriverAgentLib/FBHomeboardApplication.m rename to WebDriverAgentLib/FBSpringboardApplication.m index 0e20cd59f..3541f0639 100644 --- a/WebDriverAgentLib/FBHomeboardApplication.m +++ b/WebDriverAgentLib/FBSpringboardApplication.m @@ -7,7 +7,7 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import "FBHomeboardApplication.h" +#import "FBSpringboardApplication.h" #import "FBErrorBuilder.h" #import "FBMathUtils.h" @@ -19,73 +19,54 @@ #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" -#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 +NSString *const SPRINGBOARD_BUNDLE_ID = @"com.apple.springboard"; -@implementation FBHomeboardApplication +@implementation FBSpringboardApplication -+ (instancetype)fb_homeboard ++ (instancetype)fb_springboard { - static FBHomeboardApplication *_homeboardApp; + static FBSpringboardApplication *_springboardApp; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - _homeboardApp = [[FBHomeboardApplication alloc] initPrivateWithPath:nil bundleID:HOMEBOARD_BUNDLE_ID]; + _springboardApp = [[FBSpringboardApplication alloc] initPrivateWithPath:nil bundleID:SPRINGBOARD_BUNDLE_ID]; }); - [_homeboardApp query]; - _homeboardApp.safeQueryResolutionEnabled = YES; - [_homeboardApp resolve]; - return _homeboardApp; + [_springboardApp query]; + [_springboardApp resolve]; + return _springboardApp; } -- (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; - NSString *errorDescription = [NSString stringWithFormat:@"Cannot scroll to Springboard icon for '%@' application", identifier]; BOOL shouldSwipeToTheRight = startFrame.origin.x < 0; + NSString *errorDescription = [NSString stringWithFormat:@"Cannot scroll to Springboard icon for '%@' application", identifier]; 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; } @@ -101,40 +82,10 @@ - (BOOL)fb_tapApplicationWithIdentifier:(NSString *)identifier error:(NSError ** spinUntilTrue:^BOOL{ FBApplication *activeApp = [FBApplication fb_activeApplication]; return activeApp && - 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.processID != self.processID && activeApp.fb_isVisible; } error:error]; } -#endif - (BOOL)fb_waitUntilApplicationBoardIsVisible:(NSError **)error { @@ -150,13 +101,9 @@ - (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/Routing/FBElement.h b/WebDriverAgentLib/Routing/FBElement.h index 40f4695db..64662e1d5 100644 --- a/WebDriverAgentLib/Routing/FBElement.h +++ b/WebDriverAgentLib/Routing/FBElement.h @@ -50,13 +50,6 @@ 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 8689e89a1..cc06a9e3b 100644 --- a/WebDriverAgentLib/Routing/FBElementUtils.h +++ b/WebDriverAgentLib/Routing/FBElementUtils.h @@ -9,7 +9,6 @@ #import #import -#import "XCAccessibilityElement.h" NS_ASSUME_NONNULL_BEGIN @@ -47,13 +46,6 @@ 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 059cf60c0..41f3fc600 100644 --- a/WebDriverAgentLib/Routing/FBElementUtils.m +++ b/WebDriverAgentLib/Routing/FBElementUtils.m @@ -109,25 +109,4 @@ + (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 7314ece70..cc8006c89 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 "FBHomeboardApplication.h" +#import "FBSpringboardApplication.h" #import "XCAccessibilityElement.h" #import "XCAXClient_iOS.h" #import "XCUIElement.h" diff --git a/WebDriverAgentLib/Utilities/FBKeyboard.m b/WebDriverAgentLib/Utilities/FBKeyboard.m index c7f13c72a..f26dcb5ad 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 waitUntilStableWithError:error]) { + if (![FBKeyboard waitUntilVisibleWithError:error]) { return NO; } __block BOOL didSucceed = NO; @@ -54,15 +54,11 @@ + (BOOL)typeText:(NSString *)text frequency:(NSUInteger)frequency error:(NSError return didSucceed; } -+ (BOOL)waitUntilStableWithError:(NSError **)error ++ (BOOL)waitUntilVisibleWithError:(NSError **)error { - FBApplication *app = [FBApplication fb_activeApplication]; + FBApplication *application = [FBApplication fb_activeApplication]; - if (![FBKeyboard waitUntilVisibleForApplication:app timeout:3 error:error]) { - return NO; - } - - if (![app fb_waitUntilFrameIsStable]) { + if (![application fb_waitUntilFrameIsStable]) { return [[[FBErrorBuilder builder] withDescription:@"Timeout waiting for keybord to stop animating"] @@ -71,21 +67,4 @@ + (BOOL)waitUntilStableWithError:(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 886449af1..d820c836a 100644 --- a/WebDriverAgentLib/Utilities/FBMathUtils.h +++ b/WebDriverAgentLib/Utilities/FBMathUtils.h @@ -28,10 +28,8 @@ 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 ecf26b44d..9080ee8c7 100644 --- a/WebDriverAgentLib/Utilities/FBMathUtils.m +++ b/WebDriverAgentLib/Utilities/FBMathUtils.m @@ -38,7 +38,6 @@ 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) { @@ -59,7 +58,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) { @@ -68,4 +67,3 @@ 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 deleted file mode 100644 index 0e8fabf59..000000000 --- a/WebDriverAgentLib/Utilities/FBTVNavigationTracker.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * 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 deleted file mode 100644 index 10dc4c67d..000000000 --- a/WebDriverAgentLib/Utilities/FBTVNavigationTracker.m +++ /dev/null @@ -1,144 +0,0 @@ -/** - * 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 ba77907b3..31428b059 100644 --- a/WebDriverAgentLib/Utilities/FBXPath.m +++ b/WebDriverAgentLib/Utilities/FBXPath.m @@ -55,14 +55,6 @@ @interface FBVisibleAttribute : FBElementAttribute @end -#if TARGET_OS_TV - -@interface FBFocusedAttribute : FBElementAttribute - -@end - -#endif - @interface FBDimensionAttribute : FBElementAttribute @end @@ -394,9 +386,6 @@ + (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, @@ -495,24 +484,6 @@ + (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 aca8dc794..1c0fee077 100644 --- a/WebDriverAgentLib/WebDriverAgentLib.h +++ b/WebDriverAgentLib/WebDriverAgentLib.h @@ -39,7 +39,8 @@ 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 994b7e2fb..71b1fea07 100644 --- a/WebDriverAgentTests/IntegrationApp/Resources/Base.lproj/Main.storyboard +++ b/WebDriverAgentTests/IntegrationApp/Resources/Base.lproj/Main.storyboard @@ -1,11 +1,12 @@ - + - + + @@ -63,7 +64,7 @@