@devicelab/maestro-runner-darwin-arm64 1.1.27 → 1.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -19
- package/bin/maestro-runner +0 -0
- package/drivers/LICENSE-BINARIES.md +38 -0
- package/drivers/android/devicelab-android-driver.apk +0 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunner.xcodeproj/project.pbxproj +38 -14
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/Bridging-Header.h +3 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerAXSnapshotBridge.h +51 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerAXSnapshotBridge.m +439 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerDefaults.h +12 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerDefaults.m +59 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+AXSnapshotFallback.swift +128 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+CommandExecution.swift +68 -14
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Interaction.swift +256 -48
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Lifecycle.swift +102 -6
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Models.swift +74 -1
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Settle.swift +89 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Snapshot.swift +279 -82
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+SystemModal.swift +1 -1
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Transport.swift +7 -2
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests.swift +44 -10
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerXCTestTimeouts.h +87 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerXCTestTimeouts.m +207 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/SnapshotParams.m +22 -6
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/SyntheticTyping.h +23 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/SyntheticTyping.m +77 -30
- package/drivers/ios/DevicelabIOSRunner/PROTOCOL.md +26 -3
- package/drivers/ios/WebDriverAgent/.editorconfig +11 -0
- package/drivers/ios/WebDriverAgent/.github/dependabot.yml +1 -1
- package/drivers/ios/WebDriverAgent/.github/workflows/functional-test.yml +65 -24
- package/drivers/ios/WebDriverAgent/.github/workflows/publish.js.yml +15 -8
- package/drivers/ios/WebDriverAgent/.github/workflows/unit-test.yml +4 -2
- package/drivers/ios/WebDriverAgent/.github/workflows/wda-package.yml +9 -2
- package/drivers/ios/WebDriverAgent/.github/workflows/wda-tests.yml +54 -29
- package/drivers/ios/WebDriverAgent/CHANGELOG.md +546 -0
- package/drivers/ios/WebDriverAgent/Fastlane/Fastfile +8 -1
- package/drivers/ios/WebDriverAgent/Gemfile +1 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/CDStructures.h +5 -26
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/NSFastEnumeration-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCAXClient_iOS.h +80 -44
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCApplicationQuery.h +18 -11
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCDebugLogDelegate-Protocol.h +17 -5
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCPointerEvent.h +52 -19
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCPointerEventPath.h +55 -33
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h +44 -21
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTAggregateSuiteRunStatistics.h +38 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTAttachmentManager.h +33 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTCapabilities.h +35 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTCapabilitiesProviding-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTElementSetTransformer-Protocol.h +30 -13
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTElementSnapshotAttributeDataSource-Protocol.h +33 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTElementSnapshotProvider-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTExpectedFailureContextManager.h +35 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTFuture.h +45 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTHarnessEventReporting-Protocol.h +29 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTIssue.h +49 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTIssueHandling-Protocol.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMacCatalystStatusProviding-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMeasureOptions.h +48 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMemoryChecker.h +50 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMemoryCheckerDelegate-Protocol.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingChannel_IDEToRunner-Protocol.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingChannel_RunnerToDaemon-Protocol.h +39 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingChannel_RunnerToIDE-Protocol.h +32 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_ActivityReporting-Protocol.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_AttachmentFutureResultStatusUpdating-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_BundleRequesting-Protocol.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_CapabilityExchange-Protocol.h +56 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_DebugLogging-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_EventSynthesis-Protocol.h +34 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_ForcePressureSupportQuerying-Protocol.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_HIDEventRecording-Protocol.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_MemoryTesting-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_PerformanceMeasurementReporting-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_ProcessMonitoring-Protocol.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_ProtectedResourceAuthorization-Protocol.h +22 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_ScreenRecording-Protocol.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_SelfDiagnosisIssueReporting-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_SignpostRequesting-Protocol.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_SiriAutomation-Protocol.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_SystemConfiguration-Protocol.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_TelemetrySending-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_TestExecution-Protocol.h +28 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_TestReporting-Protocol.h +40 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_UIAutomation-Protocol.h +29 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_UIAutomationRunnerEventReporting-Protocol.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMessagingRole_UserPresence-Protocol.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMetricDiagnosticHelper.h +49 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTNSPredicateExpectationObject-Protocol.h +15 -7
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTPromise.h +30 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRemoteSignpostListenerProxy-Protocol.h +29 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRepetitionPolicy.h +43 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTReportingSession.h +50 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTReportingSessionConfiguration-Protocol.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTReportingSessionIssueReporter-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTReportingSessionTestContainer-Protocol.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTReportingSessionTestReporter.h +51 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRunnerAutomationSession-Protocol.h +38 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRunnerDaemonSession.h +76 -78
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRunnerDaemonSessionUIAutomationDelegate-Protocol.h +33 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRunnerIDESession.h +87 -53
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRunnerIDESessionDelegate-Protocol.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRuntimeDiagnosticsPolicy.h +36 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRuntimeIssueDetectionPolicy.h +39 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTScreenCapturePolicy.h +35 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTSignpostListener-Protocol.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTSkippedTestContext.h +37 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTSourceCodeContext.h +39 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTSourceCodeLocation.h +31 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTTagSelection.h +41 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTTestIdentifier.h +81 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTTestIdentifierSet.h +54 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTTestSelection.h +35 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiter.h +45 -46
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiterManagement-Protocol.h +17 -6
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiterManager-Protocol.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiterWait.h +40 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTest.h +47 -28
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestCase.h +165 -87
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestCaseDiscoveryUIAutomationDelegate-Protocol.h +20 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestCaseRun.h +19 -9
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestCaseUIAutomationDelegate-Protocol.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestCastMethodNamesUIAutomationDelegate-Protocol.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestConfiguration.h +83 -55
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestDriver.h +54 -28
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestExpectation.h +37 -26
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestExpectationDelegate-Protocol.h +15 -6
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestObservationCenter.h +49 -25
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestRun.h +33 -28
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIAXNotificationHandling-Protocol.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIAccessibilityInterface-Protocol.h +58 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIAlertMonitoring-Protocol.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplication.h +87 -49
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationAutomationSessionProviding-Protocol.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationImpl.h +78 -26
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationImplReporter-Protocol.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationManaging-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationMonitor-Protocol.h +43 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationOpenRequest.h +34 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationPlatformServicesProviderDelegate-Protocol.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationProcess.h +89 -69
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationProcessDelegate-Protocol.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationProcessManaging-Protocol.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationProcessTracker-Protocol.h +28 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationRegistry.h +32 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIButtonConsole.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUICoordinate.h +37 -32
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIDevice.h +121 -17
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIDeviceAutomationModeInterface-Protocol.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIDeviceDelayedAttachmentTransferSupportInterface-Protocol.h +22 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIDeviceEventAndStateInterface-Protocol.h +40 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIElement.h +192 -59
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIElementAttributesPrivate-Protocol.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIElementEventTarget-Protocol.h +38 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIElementQuery.h +154 -58
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIElementTypeQueryProvider_Private-Protocol.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIEventRecording-Protocol.h +37 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIHitPointResult.h +16 -11
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIInterruptionMonitoring-Protocol.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIIssueDiagnosticsProviding-Protocol.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIKnobControl.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUILocation.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIPlatformApplicationServicesProviding-Protocol.h +33 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIRemoteAccessibilityInterface-Protocol.h +45 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIRemoteDeviceRunner-Protocol.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIRemoteSiriInterface-Protocol.h +30 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIResetAuthorizationStatusOfProtectedResourcesInterface-Protocol.h +22 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIScreen.h +45 -19
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIScreenDataSource-Protocol.h +28 -12
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUISiriService.h +39 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUISystem.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIXcodeApplicationManaging-Protocol.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_TtC10XCTestCore19XCTReportingContext.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTMessaging_VoidProtocol-Protocol.h +20 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestObservationInternal-Protocol.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestObservationPrivate-Protocol.h +27 -0
- package/drivers/ios/WebDriverAgent/README.md +0 -10
- package/drivers/ios/WebDriverAgent/Scripts/build-webdriveragent.mjs +30 -22
- package/drivers/ios/WebDriverAgent/Scripts/build.sh +14 -1
- package/drivers/ios/WebDriverAgent/Scripts/embed-runner-icon.sh +118 -0
- package/drivers/ios/WebDriverAgent/Scripts/fetch-prebuilt-wda.mjs +34 -22
- package/drivers/ios/WebDriverAgent/Scripts/update-wda-version.mjs +12 -10
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/project.pbxproj +2583 -659
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp.xcscheme +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp_tvOS.xcscheme +78 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp_watchOS.xcscheme +78 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_1.xcscheme +8 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_2.xcscheme +8 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_3.xcscheme +8 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_tvOS.xcscheme +93 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_watchOS.xcscheme +93 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib.xcscheme +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_watchOS.xcscheme +85 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner-nodebug.xcscheme +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner.xcscheme +20 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_tvOS.xcscheme +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_watchOS.xcscheme +128 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/NSDictionary+FBUtf8SafeDictionary.m +45 -27
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCAXClient_iOS+FBSnapshotReqParams.h +1 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCAXClient_iOS+FBSnapshotReqParams.m +91 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBAlert.h +27 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBAlert.m +125 -55
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.h +15 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +32 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBTouchAction.m +2 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplicationProcess+FBQuiescence.m +9 -16
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.h +47 -4
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m +173 -83
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h +9 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m +45 -5
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBVoiceOver.h +66 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBVoiceOver.m +218 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBClassChain.m +144 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBFind.m +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.m +5 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m +4 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.m +113 -50
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m +5 -5
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBTyping.h +33 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m +39 -5
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBUtilities.m +9 -7
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBVisibleFrame.m +12 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBWebDriverAttributes.m +6 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElementQuery+FBHelpers.m +1 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBAlertViewCommands.m +10 -36
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBCustomCommands.m +155 -8
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBElementCommands.m +45 -19
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBFindElementCommands.m +7 -7
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBOrientationCommands.m +9 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBScreenshotCommands.m +3 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBSessionCommands.m +220 -296
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/FBAlert.h +43 -30
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/FBAlert.m +273 -93
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Info.plist +2 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBElement.h +3 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBExceptionHandler.m +8 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBExceptions.h +9 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBExceptions.m +3 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBHTTPServer.h +97 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBHTTPServer.m +932 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBResponseJSONPayload.m +2 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBResponsePayload.m +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBRoute.h +9 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBRoute.m +9 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBScreenRecordingContainer.h +9 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBScreenRecordingContainer.m +28 -12
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBScreenRecordingRequest.m +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBSession.h +16 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBSession.m +252 -42
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBTCPSocket.h +57 -9
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBTCPSocket.m +183 -33
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBWebServer.h +18 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBWebServer.m +92 -37
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBXCElementSnapshot.h +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/RouteRequest.h +28 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/RouteRequest.m +25 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/RouteResponse.h +30 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/RouteResponse.m +54 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBActiveAppDetectionPoint.m +10 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBAlertsMonitor.m +21 -5
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.h +2 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.m +3 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBCapabilities.h +1 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBCapabilities.m +0 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBClassChainQueryParser.m +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBConfiguration.h +106 -136
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBConfiguration.m +150 -386
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBFailureProofTestCase.m +6 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBImageProcessor.m +54 -29
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBLogger.m +2 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBMacros.h +14 -5
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBMathUtils.h +54 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBMathUtils.m +48 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBMjpegServer.h +12 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBMjpegServer.m +119 -24
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBPasteboard.h +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBPasteboard.m +9 -5
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBScreen.h +10 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBScreen.m +32 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBScreenshot.m +3 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBSettings.h +3 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBSettings.m +3 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBSettingsHandler.h +35 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBSettingsHandler.m +374 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBTVNavigationTracker-Private.h +10 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBTVNavigationTracker.h +29 -4
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBTVNavigationTracker.m +62 -27
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.h +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.m +28 -10
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCAXClientProxy.h +124 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCAXClientProxy.m +142 -21
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCTestDaemonsProxy.h +2 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCTestDaemonsProxy.m +22 -19
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCodeCompatibility.h +1 -8
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCodeCompatibility.m +57 -27
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXPath-Private.h +5 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXPath.m +69 -14
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXPathExtensions.h +40 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXPathExtensions.m +418 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/XCTestPrivateSymbols.h +2 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/XCTestPrivateSymbols.m +54 -34
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/WebDriverAgentLib.h +1 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentRunner/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentRunner/Assets.xcassets/AppIcon.appiconset/icon-1024.png +0 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentRunner/Assets.xcassets/Contents.json +6 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentRunner/UITestingUITests.m +7 -7
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/COORDINATE_PROBE.md +50 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/FBCoordinateProbeViewController.h +4 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/FBCoordinateProbeViewController.m +176 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/FBScrollViewController.m +15 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/TouchViewController.h +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/TouchableView.h +2 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/TouchableView.m +14 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/ViewController.m +44 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Info.plist +2 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Resources/Base.lproj/Main.storyboard +52 -22
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp_tvOS/AppDelegate.h +13 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp_tvOS/AppDelegate.m +26 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp_tvOS/Info.plist +41 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp_tvOS/SceneDelegate.h +15 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp_tvOS/SceneDelegate.m +22 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp_tvOS/ViewController.h +13 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp_tvOS/ViewController.m +79 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp_tvOS/main.m +17 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp_watchOS/ContentView.swift +31 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp_watchOS/WatchSpikeApp.swift +18 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBAlertTests.m +37 -56
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBAutoAlertsHandlerTests.m +10 -4
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBConfigurationTests.m +41 -8
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBElementAttributeTests.m +10 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBElementSwipingTests.m +4 -4
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBElementVisibilityTests.m +14 -19
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBForceTouchTests.m +6 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBIntegrationAppTests.m +87 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.h +30 -5
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.m +51 -15
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBPasteboardTests.m +3 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBSafariAlertTests.m +6 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBScreenTests.m +28 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBScrollingTests.m +3 -6
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBTapTest.m +83 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBVideoRecordingTests.m +1 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBVoiceOverTests.m +103 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBW3CMultiTouchActionsIntegrationTests.m +35 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBW3CTouchActionsIntegrationTests.m +96 -13
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBW3CTypeActionsTests.m +3 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBXPathIntegrationTests.m +108 -5
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCElementSnapshotHelperTests.m +1 -7
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIApplicationHelperTests.m +1 -1
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIDeviceHelperTests.m +21 -5
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIDeviceRotationTests.m +21 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIElementAttributesTests.m +5 -5
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIElementFBFindTests.m +98 -10
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_tvOS/FBTVFocusIntegrationTests.m +84 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_tvOS/Info.plist +24 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_watchOS/IntegrationTests_watchOS-Bridging-Header.h +23 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_watchOS/WDAAlertIntegrationTests.swift +25 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_watchOS/WDAAppLifecycleIntegrationTests.swift +37 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_watchOS/WDAClickIntegrationTests.swift +25 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_watchOS/WDADeviceIntegrationTests.swift +92 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_watchOS/WDAElementAttributeIntegrationTests.swift +39 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_watchOS/WDAFindIntegrationTests.swift +101 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_watchOS/WDAMjpegStreamingIntegrationTests.swift +81 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_watchOS/WDAScreenshotAndSourceIntegrationTests.swift +54 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_watchOS/WDATypingIntegrationTests.swift +73 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests_watchOS/WDAWatchInProcessTestCase.swift +51 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/Doubles/XCUIElementDouble.h +4 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/Doubles/XCUIElementDouble.m +10 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBConfigurationTests.m +18 -6
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBCustomCommandsTests.m +83 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBHTTPServerSessionTests.m +133 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBHTTPServerTests.m +264 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBMathUtilsTests.m +38 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBResponseJSONPayloadTests.m +76 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBSessionTests.m +3 -3
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBTouchableViewTests.m +121 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBXCAXClientProxyTests.m +90 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBXPathTests.m +127 -2
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/NSDictionaryFBUtf8SafeTests.m +43 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests_tvOS/Doubles/FBXCAccessibilityElementDouble.h +27 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests_tvOS/Doubles/FBXCAccessibilityElementDouble.m +23 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests_tvOS/Doubles/FBXCElementSnapshotDouble.h +43 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests_tvOS/Doubles/FBXCElementSnapshotDouble.m +24 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests_tvOS/Doubles/XCUIElementDouble.h +1 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests_tvOS/Doubles/XCUIElementDouble.m +1 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests_tvOS/FBTVNavigationTrackerTests.m +48 -0
- package/drivers/ios/WebDriverAgent/lib/check-dependencies.ts +42 -21
- package/drivers/ios/WebDriverAgent/lib/constants.ts +12 -2
- package/drivers/ios/WebDriverAgent/lib/index.ts +7 -0
- package/drivers/ios/WebDriverAgent/lib/logger.ts +1 -1
- package/drivers/ios/WebDriverAgent/lib/no-session-proxy.ts +8 -14
- package/drivers/ios/WebDriverAgent/lib/types.ts +108 -8
- package/drivers/ios/WebDriverAgent/lib/utils/index.ts +15 -0
- package/drivers/ios/WebDriverAgent/lib/utils/module.ts +24 -0
- package/drivers/ios/WebDriverAgent/lib/utils/platform.ts +34 -0
- package/drivers/ios/WebDriverAgent/lib/utils/processes.ts +166 -0
- package/drivers/ios/WebDriverAgent/lib/utils/security.ts +13 -0
- package/drivers/ios/WebDriverAgent/lib/utils/xctestrun.ts +173 -0
- package/drivers/ios/WebDriverAgent/lib/wda-strategies.ts +333 -0
- package/drivers/ios/WebDriverAgent/lib/webdriveragent.ts +336 -428
- package/drivers/ios/WebDriverAgent/lib/xcodebuild.ts +232 -127
- package/drivers/ios/WebDriverAgent/oxfmt.config.mjs +6 -0
- package/drivers/ios/WebDriverAgent/oxlint.config.mjs +6 -0
- package/drivers/ios/WebDriverAgent/package.json +70 -79
- package/drivers/ios/WebDriverAgent/release.config.mjs +14 -0
- package/drivers/ios/WebDriverAgent/test/functional/desired.ts +10 -6
- package/drivers/ios/WebDriverAgent/test/functional/helpers/simulator.ts +39 -28
- package/drivers/ios/WebDriverAgent/test/functional/webdriveragent-e2e.spec.ts +100 -0
- package/drivers/ios/WebDriverAgent/test/unit/processes.spec.ts +99 -0
- package/drivers/ios/WebDriverAgent/test/unit/utils.spec.ts +235 -0
- package/drivers/ios/WebDriverAgent/test/unit/wda-cleanup.spec.ts +136 -0
- package/drivers/ios/WebDriverAgent/test/unit/webdriveragent.spec.ts +562 -0
- package/drivers/ios/WebDriverAgent/tsconfig.json +6 -8
- package/drivers/ios/devicelab-ios-agent/README.md +51 -0
- package/drivers/ios/devicelab-ios-agent/device/DevicelabIOSAgent.app/DevicelabIOSAgent +0 -0
- package/drivers/ios/devicelab-ios-agent/device/DevicelabIOSAgent.app/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/device/DevicelabIOSAgent.app/PkgInfo +1 -0
- package/drivers/ios/devicelab-ios-agent/device/DevicelabIOSAgentUITests-Runner.app/DevicelabIOSAgentUITests-Runner +0 -0
- package/drivers/ios/devicelab-ios-agent/device/DevicelabIOSAgentUITests-Runner.app/Info.plist +302 -0
- package/drivers/ios/devicelab-ios-agent/device/DevicelabIOSAgentUITests-Runner.app/PkgInfo +1 -0
- package/drivers/ios/devicelab-ios-agent/device/DevicelabIOSAgentUITests-Runner.app/PlugIns/DevicelabIOSAgentUITests.xctest/DevicelabIOSAgentUITests +0 -0
- package/drivers/ios/devicelab-ios-agent/device/DevicelabIOSAgentUITests-Runner.app/PlugIns/DevicelabIOSAgentUITests.xctest/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/device/agent.xctestrun +120 -0
- package/drivers/ios/devicelab-ios-agent/device/manifest.json +18 -0
- package/drivers/ios/devicelab-ios-agent/signing-stub/SigningStub/StubApp.swift +10 -0
- package/drivers/ios/devicelab-ios-agent/signing-stub/SigningStub.xcodeproj/project.pbxproj +394 -0
- package/drivers/ios/devicelab-ios-agent/signing-stub/SigningStub.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/drivers/ios/devicelab-ios-agent/signing-stub/SigningStub.xcodeproj/xcshareddata/xcschemes/SigningStubUITests.xcscheme +100 -0
- package/drivers/ios/devicelab-ios-agent/signing-stub/SigningStubUITests/StubUITests.swift +8 -0
- package/drivers/ios/devicelab-ios-agent/signing-stub/project.yml +64 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgent.app/DevicelabIOSAgent +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgent.app/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgent.app/PkgInfo +1 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/DevicelabIOSAgentUITests-Runner +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/Modules/Testing.swiftcrossimport/CoreGraphics.swiftoverlay +3 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/Modules/Testing.swiftcrossimport/CoreImage.swiftoverlay +3 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/Modules/Testing.swiftcrossimport/CoreTransferable.swiftoverlay +3 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/Modules/Testing.swiftcrossimport/Foundation.swiftoverlay +3 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/Modules/Testing.swiftcrossimport/UIKit.swiftoverlay +3 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/Modules/Testing.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/Modules/Testing.swiftmodule/arm64-apple-ios-simulator.swiftinterface +1431 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/Modules/Testing.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/Modules/Testing.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +1431 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/Testing +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/_CodeSignature/CodeResources +212 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/Testing.framework/version.plist +18 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTAutomationSupport.framework/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTAutomationSupport.framework/XCTAutomationSupport +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTAutomationSupport.framework/_CodeSignature/CodeResources +113 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTAutomationSupport.framework/version.plist +18 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCAbstractTest.h +140 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTActivity.h +33 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTAttachment+XCUIScreenshot.h +32 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTAttachment.h +219 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTAttachmentLifetime.h +28 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTContext.h +65 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTDarwinNotificationExpectation.h +60 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTExpectedFailure.h +134 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTIssue.h +143 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTKVOExpectation.h +110 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTMeasureOptions.h +57 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTMetric+UIAutomation.h +77 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTMetric.h +390 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTNSNotificationExpectation.h +92 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTNSPredicateExpectation.h +74 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTSourceCodeContext.h +109 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTWaiter.h +304 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTest.apinotes +182 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTest.h +41 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestAssertions.h +277 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestAssertionsImpl.h +503 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestCase+AsynchronousTesting.h +276 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestCase+XCUIApplicationLaunchTesting.h +36 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestCase+XCUIInterruptionMonitoring.h +95 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestCase.h +443 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestCaseRun.h +50 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestCore.h +42 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestDefines.h +135 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestErrors.h +33 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestExpectation.h +73 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestLog.h +56 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestObservation.h +195 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestObservationCenter.h +60 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestObserver.h +61 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestProbe.h +55 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestRun.h +223 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestSkipping.h +41 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestSkippingImpl.h +46 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestSuite.h +92 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCTestSuiteRun.h +50 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIAccessibilityAuditIssue.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIAccessibilityAuditTypes.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIApplication.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIAutomation.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIAutomationDefines.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUICoordinate.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIDevice.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIDeviceButton.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIDeviceHandGesture.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIElement.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIElementAttributes.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIElementQuery.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIElementTypeQueryProvider.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIElementTypes.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIKeyboardKeys.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUILocation.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIProtectedResource.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIRemote.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIScreen.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIScreenshot.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUIScreenshotProviding.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUISiriService.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Headers/XCUISystem.h +9 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/Modules/module.modulemap +30 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/XCTest +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/_CodeSignature/CodeResources +817 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTest.framework/version.plist +18 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTestCore.framework/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTestCore.framework/XCTestCore +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTestCore.framework/_CodeSignature/CodeResources +113 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTestCore.framework/version.plist +18 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTestSupport.framework/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTestSupport.framework/XCTestSupport +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTestSupport.framework/_CodeSignature/CodeResources +113 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCTestSupport.framework/version.plist +18 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIAccessibilityAuditIssue.h +33 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIAccessibilityAuditTypes.h +36 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIApplication.h +154 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIAutomation.apinotes +88 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIAutomation.h +30 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIAutomationDefines.h +62 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUICoordinate.h +99 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIDevice.h +133 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIDeviceButton.h +40 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIDeviceHandGesture.h +24 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIElement.h +366 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIElementAttributes.h +106 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIElementQuery.h +81 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIElementTypeQueryProvider.h +109 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIElementTypes.h +95 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIKeyboardKeys.h +68 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUILocation.h +35 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIProtectedResource.h +52 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIRemote.h +77 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIScreen.h +36 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIScreenshot.h +42 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIScreenshotProviding.h +26 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUISiriService.h +45 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUISystem.h +26 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIVoiceOverOutput.h +26 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIVoiceOverService.h +72 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Headers/XCUIVoiceOverServiceError.h +25 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Modules/XCUIAutomation.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Modules/XCUIAutomation.swiftmodule/arm64-apple-ios-simulator.swiftinterface +30 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Modules/XCUIAutomation.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Modules/XCUIAutomation.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +30 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/Modules/module.modulemap +4 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/XCUIAutomation +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/_CodeSignature/CodeResources +465 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUIAutomation.framework/version.plist +18 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUnit.framework/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUnit.framework/XCUnit +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUnit.framework/_CodeSignature/CodeResources +113 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/XCUnit.framework/version.plist +18 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/_Testing_Foundation.framework/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/_Testing_Foundation.framework/Modules/_Testing_Foundation.swiftmodule/arm64-apple-ios-simulator.swiftdoc +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/_Testing_Foundation.framework/Modules/_Testing_Foundation.swiftmodule/arm64-apple-ios-simulator.swiftinterface +41 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/_Testing_Foundation.framework/Modules/_Testing_Foundation.swiftmodule/x86_64-apple-ios-simulator.swiftdoc +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/_Testing_Foundation.framework/Modules/_Testing_Foundation.swiftmodule/x86_64-apple-ios-simulator.swiftinterface +41 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/_Testing_Foundation.framework/_CodeSignature/CodeResources +157 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/_Testing_Foundation.framework/_Testing_Foundation +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/_Testing_Foundation.framework/version.plist +18 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/libXCTestBundleInject.dylib +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/libXCTestSwiftSupport.dylib +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Frameworks/lib_TestingInterop.dylib +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/Info.plist +302 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/PkgInfo +1 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/PlugIns/DevicelabIOSAgentUITests.xctest/DevicelabIOSAgentUITests +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/DevicelabIOSAgentUITests-Runner.app/PlugIns/DevicelabIOSAgentUITests.xctest/Info.plist +0 -0
- package/drivers/ios/devicelab-ios-agent/simulator/agent.xctestrun +140 -0
- package/drivers/ios/devicelab-ios-agent/simulator/manifest.json +162 -0
- package/package.json +1 -1
- package/drivers/ios/WebDriverAgent/.mocharc.js +0 -4
- package/drivers/ios/WebDriverAgent/.releaserc +0 -45
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/NSString-XCTAdditions.h +0 -11
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/NSValue-XCTestAdditions.h +0 -11
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UIGestureRecognizer-RecordingAdditions.h +0 -11
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UILongPressGestureRecognizer-RecordingAdditions.h +0 -11
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UIPanGestureRecognizer-RecordingAdditions.h +0 -11
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UIPinchGestureRecognizer-RecordingAdditions.h +0 -11
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UISwipeGestureRecognizer-RecordingAdditions.h +0 -11
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UITapGestureRecognizer-RecordingAdditions.h +0 -11
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCActivityRecord.h +0 -39
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCApplicationMonitor.h +0 -44
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCApplicationMonitor_iOS.h +0 -18
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCDeviceEvent.h +0 -27
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCEventGenerator.h +0 -73
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCKeyMappingPath.h +0 -36
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCKeyboardInputSolver.h +0 -41
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCKeyboardKeyMap.h +0 -101
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCKeyboardLayout.h +0 -35
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSourceCodeRecording.h +0 -42
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSourceCodeTreeNode.h +0 -84
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSourceCodeTreeNodeEnumerator.h +0 -18
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSymbolicationRecord.h +0 -29
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSymbolicatorHolder.h +0 -14
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTAXClient-Protocol.h +0 -14
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTAsyncActivity-Protocol.h +0 -16
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTAsyncActivity.h +0 -23
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTAutomationTarget-Protocol.h +0 -12
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTDarwinNotificationExpectation.h +0 -23
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTKVOExpectation.h +0 -28
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMetric.h +0 -29
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTNSNotificationExpectation.h +0 -27
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTNSPredicateExpectation.h +0 -24
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRunnerAutomationSession.h +0 -21
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTTestRunSession.h +0 -25
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTTestRunSessionDelegate-Protocol.h +0 -17
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTUIApplicationMonitor-Protocol.h +0 -17
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiterDelegate-Protocol.h +0 -16
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiterDelegatePrivate-Protocol.h +0 -12
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiterManager.h +0 -28
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestCaseSuite.h +0 -19
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestContext.h +0 -26
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestContextScope.h +0 -19
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestDriverInterface-Protocol.h +0 -14
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestExpectationWaiter.h +0 -17
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestLog.h +0 -32
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestManager_IDEInterface-Protocol.h +0 -36
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestManager_ManagerInterface-Protocol.h +0 -54
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestManager_TestsInterface-Protocol.h +0 -12
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestMisuseObserver.h +0 -37
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestObservation-Protocol.h +0 -20
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestObserver.h +0 -20
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestProbe.h +0 -13
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestSuite.h +0 -48
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestSuiteRun.h +0 -28
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestWaiter.h +0 -14
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIElementAsynchronousHandlerWrapper.h +0 -19
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIElementHitPointCoordinate.h +0 -24
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIRecorderNodeFinder.h +0 -65
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIRecorderNodeFinderMatch.h +0 -25
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIRecorderTimingMessage.h +0 -20
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIRecorderUtilities.h +0 -45
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCInternalTestRun.h +0 -43
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCKVOExpectationImplementation.h +0 -32
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTDarwinNotificationExpectationImplementation.h +0 -27
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTNSNotificationExpectationImplementation.h +0 -30
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTNSPredicateExpectationImplementation.h +0 -29
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTWaiterImpl.h +0 -41
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestCaseImplementation.h +0 -70
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestCaseInterruptionException.h +0 -13
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestExpectationImplementation.h +0 -40
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestImplementation.h +0 -14
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestObservationCenterImplementation.h +0 -19
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestSuiteImplementation.h +0 -23
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h +0 -1220
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m +0 -8812
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncUdpSocket.h +0 -1036
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncUdpSocket.m +0 -5868
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDNumber.h +0 -12
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDNumber.m +0 -88
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDRange.h +0 -56
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDRange.m +0 -106
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPConnection.h +0 -107
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPConnection.m +0 -2238
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPLogging.h +0 -122
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPMessage.h +0 -53
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPMessage.m +0 -357
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPResponse.h +0 -149
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPServer.h +0 -126
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPServer.m +0 -372
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/LICENSE +0 -18
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPDataResponse.h +0 -13
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPDataResponse.m +0 -83
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPErrorResponse.h +0 -9
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPErrorResponse.m +0 -40
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/HTTPResponseProxy.h +0 -13
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/HTTPResponseProxy.m +0 -84
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/LICENSE +0 -19
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/Route.h +0 -18
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/Route.m +0 -11
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteRequest.h +0 -16
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteRequest.m +0 -50
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteResponse.h +0 -20
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteResponse.m +0 -66
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingConnection.h +0 -5
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingConnection.m +0 -142
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.h +0 -55
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.m +0 -303
- package/drivers/ios/WebDriverAgent/eslint.config.mjs +0 -13
- package/drivers/ios/WebDriverAgent/index.ts +0 -7
- package/drivers/ios/WebDriverAgent/lib/utils.ts +0 -342
- package/drivers/ios/WebDriverAgent/test/functional/webdriveragent-e2e-specs.ts +0 -119
- package/drivers/ios/WebDriverAgent/test/unit/utils-specs.ts +0 -157
- package/drivers/ios/WebDriverAgent/test/unit/webdriveragent-specs.ts +0 -446
|
@@ -0,0 +1,932 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2015-present, Facebook, Inc.
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#import "FBHTTPServer.h"
|
|
10
|
+
|
|
11
|
+
#import "FBCommandStatus.h"
|
|
12
|
+
#import "FBConfiguration.h"
|
|
13
|
+
#import "FBLogger.h"
|
|
14
|
+
#import "FBResponsePayload.h"
|
|
15
|
+
#import "FBTCPSocket.h"
|
|
16
|
+
|
|
17
|
+
static NSData *FBCRLFCRLFData(void)
|
|
18
|
+
{
|
|
19
|
+
static NSData *data;
|
|
20
|
+
static dispatch_once_t onceToken;
|
|
21
|
+
dispatch_once(&onceToken, ^{
|
|
22
|
+
data = [@"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding];
|
|
23
|
+
});
|
|
24
|
+
return data;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// -dataUsingEncoding:NSUTF8StringEncoding never actually returns nil; this just keeps the cast
|
|
28
|
+
// out of every call site below.
|
|
29
|
+
static NSData * _Nonnull FBUTF8Data(NSString *string)
|
|
30
|
+
{
|
|
31
|
+
return (NSData * _Nonnull)[string dataUsingEncoding:NSUTF8StringEncoding];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Caps a request's header block, so a connection that never completes one cannot grow its buffer
|
|
35
|
+
// without limit. Matches node's default --max-http-header-size.
|
|
36
|
+
static const NSUInteger FBMaxRequestHeaderSize = 16 * 1024;
|
|
37
|
+
|
|
38
|
+
// ASCII decimal digits only. -integerValue must not be used here: it maps garbage silently
|
|
39
|
+
// ("bogus" -> 0, "12abc" -> 12), desyncing the framing of every later request on the connection.
|
|
40
|
+
static BOOL FBParseContentLength(NSString *value, NSUInteger *outLength)
|
|
41
|
+
{
|
|
42
|
+
if (value.length < 1) {
|
|
43
|
+
return NO;
|
|
44
|
+
}
|
|
45
|
+
NSUInteger result = 0;
|
|
46
|
+
for (NSUInteger i = 0; i < value.length; i++) {
|
|
47
|
+
unichar c = [value characterAtIndex:i];
|
|
48
|
+
if (c < '0' || c > '9') {
|
|
49
|
+
return NO;
|
|
50
|
+
}
|
|
51
|
+
NSUInteger digit = (NSUInteger)(c - '0');
|
|
52
|
+
// NSUInteger is 32-bit on watchOS (arm64_32), so this bounds truncation as well as overflow.
|
|
53
|
+
// Anything smaller is left to the caller's httpRequestBodySizeLimit check.
|
|
54
|
+
if (result > (NSUIntegerMax - digit) / 10) {
|
|
55
|
+
return NO;
|
|
56
|
+
}
|
|
57
|
+
result = result * 10 + digit;
|
|
58
|
+
}
|
|
59
|
+
*outLength = result;
|
|
60
|
+
return YES;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@interface FBHTTPRoute : NSObject
|
|
64
|
+
@property (nonatomic, copy) NSString *verb;
|
|
65
|
+
@property (nonatomic, strong) NSRegularExpression *regex;
|
|
66
|
+
@property (nonatomic, copy, nullable) NSArray<NSString *> *keys;
|
|
67
|
+
@property (nonatomic, copy) void (^block)(RouteRequest *request, RouteResponse *response);
|
|
68
|
+
@property (nonatomic, assign) BOOL isStandalone;
|
|
69
|
+
@end
|
|
70
|
+
|
|
71
|
+
@implementation FBHTTPRoute
|
|
72
|
+
@end
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
// Cached result of parsing a connection's request line + headers, kept around while its body is
|
|
76
|
+
// still streaming in so a slow body doesn't cause the header block to be re-found and re-parsed
|
|
77
|
+
// on every single incoming TCP segment.
|
|
78
|
+
@interface FBPendingHTTPRequestHeader : NSObject
|
|
79
|
+
@property (nonatomic, copy) NSString *method;
|
|
80
|
+
@property (nonatomic, copy) NSString *pathAndQuery;
|
|
81
|
+
@property (nonatomic) NSUInteger bodyStart;
|
|
82
|
+
@property (nonatomic) NSUInteger contentLength;
|
|
83
|
+
@end
|
|
84
|
+
|
|
85
|
+
@implementation FBPendingHTTPRequestHeader
|
|
86
|
+
@end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
// One dispatched-but-not-yet-answered request. Default (pointer) identity, so two pipelined
|
|
90
|
+
// requests sharing a connection are never conflated into a single tracked entry.
|
|
91
|
+
@interface FBPendingRequest : NSObject
|
|
92
|
+
@property (nonatomic, strong, readonly) nw_connection_t client;
|
|
93
|
+
@end
|
|
94
|
+
|
|
95
|
+
@implementation FBPendingRequest
|
|
96
|
+
|
|
97
|
+
- (instancetype)initWithClient:(nw_connection_t)client
|
|
98
|
+
{
|
|
99
|
+
if ((self = [super init])) {
|
|
100
|
+
_client = client;
|
|
101
|
+
}
|
|
102
|
+
return self;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@end
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@interface FBHTTPServer () <FBTCPSocketDelegate>
|
|
109
|
+
|
|
110
|
+
@property (nonatomic, nullable, strong) FBTCPSocket *socket;
|
|
111
|
+
@property (nonatomic, strong) NSMutableArray<FBHTTPRoute *> *routes;
|
|
112
|
+
@property (nonatomic, strong) NSMutableDictionary<NSString *, NSString *> *defaultHeaders;
|
|
113
|
+
@property (nonatomic, nullable) dispatch_queue_t routeQueue;
|
|
114
|
+
@property (nonatomic, copy, nullable) NSString *interface;
|
|
115
|
+
// nw_connection_t isn't NSCopying, so it can't be an NSDictionary key - use NSMapTable instead.
|
|
116
|
+
@property (nonatomic, strong) NSMapTable<id, NSMutableData *> *connectionBuffers;
|
|
117
|
+
// Per-client cache of the already-parsed request line + headers while its body is still
|
|
118
|
+
// arriving; nil while a client's next unread bytes start with an unparsed header block.
|
|
119
|
+
@property (nonatomic, strong) NSMapTable<id, FBPendingHTTPRequestHeader *> *pendingRequestHeaders;
|
|
120
|
+
// All buffer access - appending new data and -processBufferForClient:'s unlocked parse - is
|
|
121
|
+
// funneled through this one serial queue, so appends can never race a parse.
|
|
122
|
+
@property (nonatomic, strong) dispatch_queue_t bufferProcessingQueue;
|
|
123
|
+
// Connections with a request parsed off the buffer but not yet answered. Blocks
|
|
124
|
+
// -processBufferForClient: from starting the next pipelined request, so responses on one
|
|
125
|
+
// connection can't be written out of order. Guarded by @synchronized(self.connectionBuffers).
|
|
126
|
+
@property (nonatomic, strong) NSMutableSet *connectionsAwaitingResponse;
|
|
127
|
+
// Keyed by "METHOD path" - requests waiting on an already in-flight standalone request for that
|
|
128
|
+
// endpoint. Guarded by @synchronized(self.standaloneWaiters).
|
|
129
|
+
@property (nonatomic, strong) NSMutableDictionary<NSString *, NSMutableArray<FBPendingRequest *> *> *standaloneWaiters;
|
|
130
|
+
// Keyed by the "sessionID" path param - requests currently queued or executing for that session,
|
|
131
|
+
// standalone or not (except DELETE /session itself - see -dispatchMethod:). See
|
|
132
|
+
// -abandonPendingRequestsForSessionID:. Guarded by @synchronized(self.pendingSessionRequests).
|
|
133
|
+
@property (nonatomic, strong) NSMutableDictionary<NSString *, NSMutableSet<FBPendingRequest *> *> *pendingSessionRequests;
|
|
134
|
+
// Already-abandoned sessions mapped to the response they were abandoned with, so a request parsed
|
|
135
|
+
// after that point is answered at once instead of queueing for a session that is gone. Kept for
|
|
136
|
+
// the server's lifetime; ids are UUIDs. Guarded by @synchronized(self.pendingSessionRequests).
|
|
137
|
+
@property (nonatomic, strong) NSMutableDictionary<NSString *, RouteResponse *> *abandonedSessionResponses;
|
|
138
|
+
// When each connection started waiting for its current request. The reaper closes connections
|
|
139
|
+
// whose entry outlives FBIncompleteRequestTimeout; idle keep-alive connections have no entry and
|
|
140
|
+
// are exempt. Guarded by @synchronized(self.connectionBuffers).
|
|
141
|
+
@property (nonatomic, strong) NSMapTable<id, NSDate *> *incompleteRequestStarts;
|
|
142
|
+
@property (nonatomic, nullable) dispatch_source_t staleConnectionReaper;
|
|
143
|
+
|
|
144
|
+
@end
|
|
145
|
+
|
|
146
|
+
// How long a connection may take to deliver a complete request, matching the header read timeout
|
|
147
|
+
// the previous CocoaHTTPServer stack enforced.
|
|
148
|
+
static const NSTimeInterval FBIncompleteRequestTimeout = 30.0;
|
|
149
|
+
static const int64_t FBStaleConnectionSweepIntervalSec = 10;
|
|
150
|
+
|
|
151
|
+
@implementation FBHTTPServer
|
|
152
|
+
|
|
153
|
+
- (instancetype)init
|
|
154
|
+
{
|
|
155
|
+
if ((self = [super init])) {
|
|
156
|
+
_routes = [NSMutableArray array];
|
|
157
|
+
_defaultHeaders = [NSMutableDictionary dictionary];
|
|
158
|
+
_connectionBuffers = [NSMapTable mapTableWithKeyOptions:(NSPointerFunctionsOptions)(NSMapTableObjectPointerPersonality | NSMapTableStrongMemory)
|
|
159
|
+
valueOptions:(NSPointerFunctionsOptions)NSMapTableStrongMemory];
|
|
160
|
+
_pendingRequestHeaders = [NSMapTable mapTableWithKeyOptions:(NSPointerFunctionsOptions)(NSMapTableObjectPointerPersonality | NSMapTableStrongMemory)
|
|
161
|
+
valueOptions:(NSPointerFunctionsOptions)NSMapTableStrongMemory];
|
|
162
|
+
_bufferProcessingQueue = dispatch_queue_create("com.facebook.wda.http.bufferProcessing", DISPATCH_QUEUE_SERIAL);
|
|
163
|
+
_connectionsAwaitingResponse = [NSMutableSet set];
|
|
164
|
+
_standaloneWaiters = [NSMutableDictionary dictionary];
|
|
165
|
+
_pendingSessionRequests = [NSMutableDictionary dictionary];
|
|
166
|
+
_abandonedSessionResponses = [NSMutableDictionary dictionary];
|
|
167
|
+
_incompleteRequestStarts = [NSMapTable mapTableWithKeyOptions:(NSPointerFunctionsOptions)(NSMapTableObjectPointerPersonality | NSMapTableStrongMemory)
|
|
168
|
+
valueOptions:(NSPointerFunctionsOptions)NSMapTableStrongMemory];
|
|
169
|
+
}
|
|
170
|
+
return self;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
- (void)setRouteQueue:(nullable dispatch_queue_t)queue
|
|
174
|
+
{
|
|
175
|
+
_routeQueue = queue;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
- (void)setDefaultHeader:(NSString *)field value:(NSString *)value
|
|
179
|
+
{
|
|
180
|
+
self.defaultHeaders[field] = value;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
- (void)setInterface:(nullable NSString *)interface
|
|
184
|
+
{
|
|
185
|
+
_interface = interface.copy;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
#pragma mark - Route registration
|
|
189
|
+
|
|
190
|
+
- (FBHTTPRoute *)compiledRouteWithPath:(NSString *)path
|
|
191
|
+
{
|
|
192
|
+
FBHTTPRoute *route = [FBHTTPRoute new];
|
|
193
|
+
NSMutableArray<NSString *> *keys = [NSMutableArray array];
|
|
194
|
+
|
|
195
|
+
// Escape regex-significant characters before substituting :param placeholders.
|
|
196
|
+
NSRegularExpression *escapeRegex = [NSRegularExpression regularExpressionWithPattern:@"[.+()]"
|
|
197
|
+
options:(NSRegularExpressionOptions)0
|
|
198
|
+
error:nil];
|
|
199
|
+
NSString *escapedPath = [escapeRegex stringByReplacingMatchesInString:path
|
|
200
|
+
options:(NSMatchingOptions)0
|
|
201
|
+
range:NSMakeRange(0, path.length)
|
|
202
|
+
withTemplate:@"\\\\$0"];
|
|
203
|
+
|
|
204
|
+
NSRegularExpression *paramRegex = [NSRegularExpression regularExpressionWithPattern:@"(:(\\w+)|\\*)"
|
|
205
|
+
options:(NSRegularExpressionOptions)0
|
|
206
|
+
error:nil];
|
|
207
|
+
NSMutableString *regexPath = [NSMutableString stringWithString:escapedPath];
|
|
208
|
+
__block NSInteger diff = 0;
|
|
209
|
+
__block NSUInteger wildcardIndex = 0;
|
|
210
|
+
[paramRegex enumerateMatchesInString:escapedPath
|
|
211
|
+
options:(NSMatchingOptions)0
|
|
212
|
+
range:NSMakeRange(0, escapedPath.length)
|
|
213
|
+
usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
|
|
214
|
+
NSRange replacementRange = NSMakeRange(diff + result.range.location, result.range.length);
|
|
215
|
+
NSString *capturedString = [escapedPath substringWithRange:result.range];
|
|
216
|
+
NSString *replacementString;
|
|
217
|
+
if ([capturedString isEqualToString:@"*"]) {
|
|
218
|
+
// Only the first wildcard keeps the plain "wildcards" name - later ones get an index
|
|
219
|
+
// suffix so multiple "*" segments in one path don't overwrite each other's capture.
|
|
220
|
+
NSString *wildcardKey = 0 == wildcardIndex ? @"wildcards" : [NSString stringWithFormat:@"wildcards%lu", (unsigned long)wildcardIndex];
|
|
221
|
+
wildcardIndex++;
|
|
222
|
+
[keys addObject:wildcardKey];
|
|
223
|
+
replacementString = @"(.*?)";
|
|
224
|
+
} else {
|
|
225
|
+
NSString *keyString = [escapedPath substringWithRange:[result rangeAtIndex:2]];
|
|
226
|
+
[keys addObject:keyString];
|
|
227
|
+
replacementString = @"([^/]+)";
|
|
228
|
+
}
|
|
229
|
+
[regexPath replaceCharactersInRange:replacementRange withString:replacementString];
|
|
230
|
+
diff += replacementString.length - result.range.length;
|
|
231
|
+
}];
|
|
232
|
+
|
|
233
|
+
NSString *anchoredPattern = [NSString stringWithFormat:@"^%@$", regexPath];
|
|
234
|
+
route.regex = [NSRegularExpression regularExpressionWithPattern:anchoredPattern
|
|
235
|
+
options:NSRegularExpressionCaseInsensitive
|
|
236
|
+
error:nil];
|
|
237
|
+
route.keys = keys.count > 0 ? keys.copy : nil;
|
|
238
|
+
return route;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
- (void)handleMethod:(NSString *)method
|
|
242
|
+
withPath:(NSString *)path
|
|
243
|
+
block:(void (^)(RouteRequest *request, RouteResponse *response))block
|
|
244
|
+
{
|
|
245
|
+
[self handleMethod:method withPath:path standalone:NO block:block];
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
- (void)handleMethod:(NSString *)method
|
|
249
|
+
withPath:(NSString *)path
|
|
250
|
+
standalone:(BOOL)standalone
|
|
251
|
+
block:(void (^)(RouteRequest *request, RouteResponse *response))block
|
|
252
|
+
{
|
|
253
|
+
FBHTTPRoute *route = [self compiledRouteWithPath:path];
|
|
254
|
+
route.verb = method.uppercaseString;
|
|
255
|
+
route.block = block;
|
|
256
|
+
route.isStandalone = standalone;
|
|
257
|
+
[self.routes addObject:route];
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
- (void)get:(NSString *)path withBlock:(void (^)(RouteRequest *request, RouteResponse *response))block
|
|
261
|
+
{
|
|
262
|
+
[self handleMethod:@"GET" withPath:path block:block];
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
#pragma mark - Lifecycle
|
|
266
|
+
|
|
267
|
+
- (BOOL)start:(NSError **)error
|
|
268
|
+
{
|
|
269
|
+
FBTCPSocket *socket = [[FBTCPSocket alloc] initWithPort:self.port];
|
|
270
|
+
socket.interface = self.interface;
|
|
271
|
+
socket.delegate = self;
|
|
272
|
+
if (![socket startWithError:error]) {
|
|
273
|
+
return NO;
|
|
274
|
+
}
|
|
275
|
+
self.socket = socket;
|
|
276
|
+
dispatch_source_t reaper = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.bufferProcessingQueue);
|
|
277
|
+
dispatch_source_set_timer(reaper,
|
|
278
|
+
dispatch_time(DISPATCH_TIME_NOW, FBStaleConnectionSweepIntervalSec * NSEC_PER_SEC),
|
|
279
|
+
(uint64_t)FBStaleConnectionSweepIntervalSec * NSEC_PER_SEC,
|
|
280
|
+
NSEC_PER_SEC);
|
|
281
|
+
__weak typeof(self) weakSelf = self;
|
|
282
|
+
dispatch_source_set_event_handler(reaper, ^{
|
|
283
|
+
[weakSelf reapStaleConnections];
|
|
284
|
+
});
|
|
285
|
+
dispatch_resume(reaper);
|
|
286
|
+
self.staleConnectionReaper = reaper;
|
|
287
|
+
_isRunning = YES;
|
|
288
|
+
return YES;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
- (void)reapStaleConnections
|
|
292
|
+
{
|
|
293
|
+
NSMutableArray *staleConnections = [NSMutableArray array];
|
|
294
|
+
@synchronized (self.connectionBuffers) {
|
|
295
|
+
for (id connection in self.incompleteRequestStarts) {
|
|
296
|
+
// Waiting on the handler, not the peer - never reap, however long the handler takes.
|
|
297
|
+
if ([self.connectionsAwaitingResponse containsObject:connection]) {
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
NSDate *start = [self.incompleteRequestStarts objectForKey:connection];
|
|
301
|
+
if (nil != start && -start.timeIntervalSinceNow > FBIncompleteRequestTimeout) {
|
|
302
|
+
[staleConnections addObject:connection];
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
for (id connection in staleConnections) {
|
|
307
|
+
[FBLogger logFmt:@"Closing a connection that did not deliver a complete request within %@ seconds", @(FBIncompleteRequestTimeout)];
|
|
308
|
+
[self closeClient:(nw_connection_t)connection];
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
- (void)stop:(BOOL)immediately
|
|
313
|
+
{
|
|
314
|
+
dispatch_source_t reaper = self.staleConnectionReaper;
|
|
315
|
+
if (nil != reaper) {
|
|
316
|
+
dispatch_source_cancel(reaper);
|
|
317
|
+
self.staleConnectionReaper = nil;
|
|
318
|
+
}
|
|
319
|
+
[self.socket stop];
|
|
320
|
+
self.socket = nil;
|
|
321
|
+
@synchronized (self.connectionBuffers) {
|
|
322
|
+
[self.connectionBuffers removeAllObjects];
|
|
323
|
+
[self.pendingRequestHeaders removeAllObjects];
|
|
324
|
+
[self.connectionsAwaitingResponse removeAllObjects];
|
|
325
|
+
[self.incompleteRequestStarts removeAllObjects];
|
|
326
|
+
}
|
|
327
|
+
_isRunning = NO;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
#pragma mark - FBTCPSocketDelegate
|
|
331
|
+
|
|
332
|
+
- (void)didClientConnect:(nw_connection_t)newClient
|
|
333
|
+
{
|
|
334
|
+
@synchronized (self.connectionBuffers) {
|
|
335
|
+
[self.connectionBuffers setObject:[NSMutableData data] forKey:newClient];
|
|
336
|
+
// Starts at connect, so a peer that connects and then sends nothing is reaped too.
|
|
337
|
+
[self.incompleteRequestStarts setObject:[NSDate date] forKey:newClient];
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
- (void)didClientDisconnect:(nw_connection_t)client
|
|
342
|
+
{
|
|
343
|
+
@synchronized (self.connectionBuffers) {
|
|
344
|
+
[self.connectionBuffers removeObjectForKey:client];
|
|
345
|
+
[self.pendingRequestHeaders removeObjectForKey:client];
|
|
346
|
+
[self.connectionsAwaitingResponse removeObject:client];
|
|
347
|
+
[self.incompleteRequestStarts removeObjectForKey:client];
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
- (void)client:(nw_connection_t)client didReceiveData:(NSData *)data
|
|
352
|
+
{
|
|
353
|
+
// The append itself, not just the parse, must run on bufferProcessingQueue: otherwise a receive
|
|
354
|
+
// callback here could still mutate the buffer while -processBufferForClient: is reading it
|
|
355
|
+
// unlocked on that queue.
|
|
356
|
+
__weak typeof(self) weakSelf = self;
|
|
357
|
+
dispatch_async(self.bufferProcessingQueue, ^{
|
|
358
|
+
__strong typeof(weakSelf) strongSelf = weakSelf;
|
|
359
|
+
if (nil == strongSelf) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
BOOL isOverBufferCap = NO;
|
|
363
|
+
@synchronized (strongSelf.connectionBuffers) {
|
|
364
|
+
NSMutableData *buffer = [strongSelf.connectionBuffers objectForKey:client];
|
|
365
|
+
if (nil == buffer) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
[buffer appendData:data];
|
|
369
|
+
// One maximal header block plus one maximal body, plus headroom for a pipelined follow-up.
|
|
370
|
+
// The per-request checks don't run while a request is executing, so without this cap a
|
|
371
|
+
// client could pump data unboundedly for as long as its previous request takes.
|
|
372
|
+
uint64_t bufferCap = FBConfiguration.sharedInstance.httpRequestBodySizeLimit + 2 * (uint64_t)FBMaxRequestHeaderSize;
|
|
373
|
+
if (bufferCap < FBConfiguration.sharedInstance.httpRequestBodySizeLimit) {
|
|
374
|
+
bufferCap = UINT64_MAX;
|
|
375
|
+
}
|
|
376
|
+
isOverBufferCap = buffer.length > bufferCap;
|
|
377
|
+
// In the body phase the timeout is an idle bound, refreshed on progress: a declared body
|
|
378
|
+
// may legitimately be slow and its size is already capped by Content-Length. In the header
|
|
379
|
+
// phase the clock is only started, never refreshed, so drip-fed headers cannot outlive it.
|
|
380
|
+
BOOL isBodyPhase = nil != [strongSelf.pendingRequestHeaders objectForKey:client];
|
|
381
|
+
if (isBodyPhase || nil == [strongSelf.incompleteRequestStarts objectForKey:client]) {
|
|
382
|
+
[strongSelf.incompleteRequestStarts setObject:[NSDate date] forKey:client];
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (isOverBufferCap) {
|
|
386
|
+
// No response owed: a peer this far past any legitimate size is not reading anyway.
|
|
387
|
+
[FBLogger log:@"Closing a connection that overflowed its request buffer"];
|
|
388
|
+
[strongSelf closeClient:client];
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
[strongSelf processBufferForClient:client];
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
#pragma mark - HTTP parsing
|
|
396
|
+
|
|
397
|
+
// Parses and dispatches at most one request per call; a connection with one already in flight is
|
|
398
|
+
// left alone (see -connectionsAwaitingResponse) until its response is written.
|
|
399
|
+
- (void)processBufferForClient:(nw_connection_t)client
|
|
400
|
+
{
|
|
401
|
+
NSMutableData *buffer;
|
|
402
|
+
FBPendingHTTPRequestHeader *pending;
|
|
403
|
+
@synchronized (self.connectionBuffers) {
|
|
404
|
+
if ([self.connectionsAwaitingResponse containsObject:client]) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
buffer = [self.connectionBuffers objectForKey:client];
|
|
408
|
+
if (nil == buffer) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
pending = [self.pendingRequestHeaders objectForKey:client];
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
if (nil == pending) {
|
|
415
|
+
pending = [self parsedRequestHeaderFromBuffer:buffer forClient:client];
|
|
416
|
+
if (nil == pending) {
|
|
417
|
+
// Either the header block is still incomplete, or it was rejected and answered already.
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
@synchronized (self.connectionBuffers) {
|
|
421
|
+
[self.pendingRequestHeaders setObject:pending forKey:client];
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
[self dispatchBufferedRequestWithHeader:pending fromBuffer:buffer forClient:client];
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// Locates the CRLFCRLF that ends the buffered header block and bounds the block's size. Returns
|
|
429
|
+
// NO when nothing can be parsed yet - either because more bytes are needed or because the block
|
|
430
|
+
// was rejected, in which case the 400 has already been written.
|
|
431
|
+
- (BOOL)findHeaderBlockEnd:(out NSRange *)outHeaderEndRange
|
|
432
|
+
inBuffer:(NSMutableData *)buffer
|
|
433
|
+
forClient:(nw_connection_t)client
|
|
434
|
+
{
|
|
435
|
+
NSRange headerEndRange = [buffer rangeOfData:FBCRLFCRLFData() options:(NSDataSearchOptions)0 range:NSMakeRange(0, buffer.length)];
|
|
436
|
+
if (NSNotFound == headerEndRange.location) {
|
|
437
|
+
if (buffer.length > FBMaxRequestHeaderSize) {
|
|
438
|
+
// Past any legitimate header block and still unterminated - stop buffering.
|
|
439
|
+
[self respondBadRequestToClient:client];
|
|
440
|
+
}
|
|
441
|
+
// Otherwise wait for the rest of the header block to arrive.
|
|
442
|
+
return NO;
|
|
443
|
+
}
|
|
444
|
+
if (headerEndRange.location > FBMaxRequestHeaderSize) {
|
|
445
|
+
// The check above only fires while the terminator is missing; one large receive can deliver
|
|
446
|
+
// an oversized block with it, so bound the completed block too before parsing it.
|
|
447
|
+
[self respondBadRequestToClient:client];
|
|
448
|
+
return NO;
|
|
449
|
+
}
|
|
450
|
+
*outHeaderEndRange = headerEndRange;
|
|
451
|
+
return YES;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Turns the header lines that follow the request line into a lowercase-keyed dictionary.
|
|
455
|
+
// Returns nil for the malformed and ambiguous shapes, having written the 400 already.
|
|
456
|
+
- (nullable NSDictionary<NSString *, NSString *> *)parsedHeaderFieldsFromLines:(NSArray<NSString *> *)lines
|
|
457
|
+
forClient:(nw_connection_t)client
|
|
458
|
+
{
|
|
459
|
+
NSMutableDictionary<NSString *, NSString *> *requestHeaders = [NSMutableDictionary dictionary];
|
|
460
|
+
for (NSUInteger i = 1; i < lines.count; i++) {
|
|
461
|
+
NSString *line = lines[i];
|
|
462
|
+
NSRange colonRange = [line rangeOfString:@":"];
|
|
463
|
+
if (0 == line.length) {
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
if (NSNotFound == colonRange.location) {
|
|
467
|
+
// Malformed. Skipping it would drop what it meant to say: "Content-Length 5" would
|
|
468
|
+
// dispatch with an empty body, leaving its bytes to be parsed as another request.
|
|
469
|
+
[self respondBadRequestToClient:client];
|
|
470
|
+
return nil;
|
|
471
|
+
}
|
|
472
|
+
NSString *name = [line substringToIndex:colonRange.location];
|
|
473
|
+
// RFC 7230 (3.2.4): whitespace before the colon MUST be rejected. Storing "content-length "
|
|
474
|
+
// as its own key would drop the real header and desync the framing.
|
|
475
|
+
if (0 == name.length
|
|
476
|
+
|| NSNotFound != [name rangeOfCharacterFromSet:NSCharacterSet.whitespaceAndNewlineCharacterSet].location) {
|
|
477
|
+
[self respondBadRequestToClient:client];
|
|
478
|
+
return nil;
|
|
479
|
+
}
|
|
480
|
+
NSString *value = [[line substringFromIndex:colonRange.location + 1]
|
|
481
|
+
stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceCharacterSet];
|
|
482
|
+
NSString *normalizedName = name.lowercaseString;
|
|
483
|
+
// RFC 7230 (3.3.3): repeated framing fields are unrecoverable. Last-wins would let an empty
|
|
484
|
+
// "Transfer-Encoding:" mask an earlier "chunked", and the last Content-Length drive parsing.
|
|
485
|
+
if (([normalizedName isEqualToString:@"content-length"] || [normalizedName isEqualToString:@"transfer-encoding"])
|
|
486
|
+
&& nil != requestHeaders[normalizedName]) {
|
|
487
|
+
[self respondBadRequestToClient:client];
|
|
488
|
+
return nil;
|
|
489
|
+
}
|
|
490
|
+
requestHeaders[normalizedName] = value;
|
|
491
|
+
}
|
|
492
|
+
return requestHeaders;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// Rejects framing this server cannot honour and resolves the declared body length from the
|
|
496
|
+
// remaining framing headers. Returns NO having written the closing error response already.
|
|
497
|
+
- (BOOL)resolveBodyLength:(out NSUInteger *)outBodyLength
|
|
498
|
+
fromHeaderFields:(NSDictionary<NSString *, NSString *> *)requestHeaders
|
|
499
|
+
forClient:(nw_connection_t)client
|
|
500
|
+
{
|
|
501
|
+
NSString *transferEncoding = requestHeaders[@"transfer-encoding"];
|
|
502
|
+
if (nil != transferEncoding) {
|
|
503
|
+
// No transfer decoder exists, so mere presence is rejected - including an empty value,
|
|
504
|
+
// which is not a valid encoding list and would let the body be misread as empty.
|
|
505
|
+
RouteResponse *notImplemented = [RouteResponse new];
|
|
506
|
+
id<FBResponsePayload> notImplementedPayload = FBResponseWithStatus([FBCommandStatus invalidArgumentErrorWithMessage:@"Transfer-Encoding is not supported"
|
|
507
|
+
traceback:nil]);
|
|
508
|
+
[notImplementedPayload dispatchWithResponse:notImplemented];
|
|
509
|
+
[self failClient:client withResponse:notImplemented];
|
|
510
|
+
return NO;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
NSString *contentLengthValue = requestHeaders[@"content-length"];
|
|
514
|
+
NSUInteger contentLength = 0;
|
|
515
|
+
if (nil != contentLengthValue && !FBParseContentLength(contentLengthValue, &contentLength)) {
|
|
516
|
+
// The body's extent is unknowable, so the connection cannot be resynced - reject and close.
|
|
517
|
+
[self respondBadRequestToClient:client];
|
|
518
|
+
return NO;
|
|
519
|
+
}
|
|
520
|
+
if (contentLength > FBConfiguration.sharedInstance.httpRequestBodySizeLimit) {
|
|
521
|
+
// Closes the connection after responding, since the rest of the oversized body is still incoming.
|
|
522
|
+
RouteResponse *tooLarge = [RouteResponse new];
|
|
523
|
+
id<FBResponsePayload> tooLargePayload = FBResponseWithStatus([FBCommandStatus invalidArgumentErrorWithMessage:@"The request body exceeds the configured size limit"
|
|
524
|
+
traceback:nil]);
|
|
525
|
+
[tooLargePayload dispatchWithResponse:tooLarge];
|
|
526
|
+
[self failClient:client withResponse:tooLarge];
|
|
527
|
+
return NO;
|
|
528
|
+
}
|
|
529
|
+
*outBodyLength = contentLength;
|
|
530
|
+
return YES;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// Parses the request line and headers of the request at the head of the buffer. Returns nil
|
|
534
|
+
// while the header block is still incomplete, and for a rejected one, which is answered here.
|
|
535
|
+
- (nullable FBPendingHTTPRequestHeader *)parsedRequestHeaderFromBuffer:(NSMutableData *)buffer
|
|
536
|
+
forClient:(nw_connection_t)client
|
|
537
|
+
{
|
|
538
|
+
NSRange headerEndRange;
|
|
539
|
+
if (![self findHeaderBlockEnd:&headerEndRange inBuffer:buffer forClient:client]) {
|
|
540
|
+
return nil;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
NSData *headerData = [buffer subdataWithRange:NSMakeRange(0, headerEndRange.location)];
|
|
544
|
+
NSString *headerString = [[NSString alloc] initWithData:headerData encoding:NSUTF8StringEncoding];
|
|
545
|
+
NSArray<NSString *> *lines = [headerString componentsSeparatedByString:@"\r\n"];
|
|
546
|
+
if (lines.count < 1) {
|
|
547
|
+
[self respondBadRequestToClient:client];
|
|
548
|
+
return nil;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
NSArray<NSString *> *requestLineParts = [lines.firstObject componentsSeparatedByString:@" "];
|
|
552
|
+
if (requestLineParts.count < 2) {
|
|
553
|
+
[self respondBadRequestToClient:client];
|
|
554
|
+
return nil;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
NSDictionary<NSString *, NSString *> *requestHeaders = [self parsedHeaderFieldsFromLines:lines forClient:client];
|
|
558
|
+
if (nil == requestHeaders) {
|
|
559
|
+
return nil;
|
|
560
|
+
}
|
|
561
|
+
NSUInteger contentLength = 0;
|
|
562
|
+
if (![self resolveBodyLength:&contentLength fromHeaderFields:requestHeaders forClient:client]) {
|
|
563
|
+
return nil;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
FBPendingHTTPRequestHeader *pending = [FBPendingHTTPRequestHeader new];
|
|
567
|
+
pending.method = requestLineParts[0].uppercaseString;
|
|
568
|
+
pending.pathAndQuery = requestLineParts[1];
|
|
569
|
+
pending.bodyStart = headerEndRange.location + headerEndRange.length;
|
|
570
|
+
pending.contentLength = contentLength;
|
|
571
|
+
return pending;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// Consumes the already-parsed request from the head of the buffer and dispatches it, once its
|
|
575
|
+
// whole body has arrived. Returns with the cached header left in place while it hasn't.
|
|
576
|
+
- (void)dispatchBufferedRequestWithHeader:(FBPendingHTTPRequestHeader *)pending
|
|
577
|
+
fromBuffer:(NSMutableData *)buffer
|
|
578
|
+
forClient:(nw_connection_t)client
|
|
579
|
+
{
|
|
580
|
+
NSUInteger totalRequestLength = pending.bodyStart + pending.contentLength;
|
|
581
|
+
if (buffer.length < totalRequestLength) {
|
|
582
|
+
// Wait for the rest of the body to arrive - the parsed header stays cached, so this
|
|
583
|
+
// doesn't re-scan/re-parse the header block on every subsequently arriving chunk.
|
|
584
|
+
@synchronized (self.connectionBuffers) {
|
|
585
|
+
// The request is now in its body phase, which is idle-bounded rather than hard-bounded.
|
|
586
|
+
// -client:didReceiveData: samples that phase before this parse runs, so the receive that
|
|
587
|
+
// completed a slowly-delivered header (and carried the first body bytes) would otherwise
|
|
588
|
+
// leave the connection on its header-phase timestamp and let the sweep close it despite
|
|
589
|
+
// the body having just made progress.
|
|
590
|
+
[self.incompleteRequestStarts setObject:[NSDate date] forKey:client];
|
|
591
|
+
}
|
|
592
|
+
return;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
NSData *body = pending.contentLength > 0 ? [buffer subdataWithRange:NSMakeRange(pending.bodyStart, pending.contentLength)] : [NSData data];
|
|
596
|
+
|
|
597
|
+
@synchronized (self.connectionBuffers) {
|
|
598
|
+
[buffer replaceBytesInRange:NSMakeRange(0, totalRequestLength) withBytes:NULL length:0];
|
|
599
|
+
[self.pendingRequestHeaders removeObjectForKey:client];
|
|
600
|
+
[self.connectionsAwaitingResponse addObject:client];
|
|
601
|
+
if (0 == buffer.length) {
|
|
602
|
+
// A complete request was delivered and nothing further is buffered: the connection is a
|
|
603
|
+
// healthy keep-alive and must not be reaped while idle.
|
|
604
|
+
[self.incompleteRequestStarts removeObjectForKey:client];
|
|
605
|
+
} else {
|
|
606
|
+
// Pipelined bytes of the next request are already buffered - restart its clock.
|
|
607
|
+
[self.incompleteRequestStarts setObject:[NSDate date] forKey:client];
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
[self dispatchMethod:pending.method pathAndQuery:pending.pathAndQuery body:body client:client];
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
// Removes the client's buffered state and responds with a closing error response. Removing the
|
|
615
|
+
// buffer synchronously ensures any request bytes still streaming in for this connection are
|
|
616
|
+
// dropped rather than being re-parsed and re-triggering this same response.
|
|
617
|
+
- (void)failClient:(nw_connection_t)client withResponse:(RouteResponse *)response
|
|
618
|
+
{
|
|
619
|
+
@synchronized (self.connectionBuffers) {
|
|
620
|
+
[self.connectionBuffers removeObjectForKey:client];
|
|
621
|
+
[self.pendingRequestHeaders removeObjectForKey:client];
|
|
622
|
+
}
|
|
623
|
+
[self applyDefaultHeadersToResponse:response];
|
|
624
|
+
[self writeResponse:response toClient:client thenCloseConnection:YES];
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
- (void)respondBadRequestToClient:(nw_connection_t)client
|
|
628
|
+
{
|
|
629
|
+
RouteResponse *badRequest = [RouteResponse new];
|
|
630
|
+
id<FBResponsePayload> payload = FBResponseWithStatus([FBCommandStatus invalidArgumentErrorWithMessage:@"The request could not be parsed as valid HTTP"
|
|
631
|
+
traceback:nil]);
|
|
632
|
+
[payload dispatchWithResponse:badRequest];
|
|
633
|
+
[self failClient:client withResponse:badRequest];
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
- (void)applyDefaultHeadersToResponse:(RouteResponse *)response
|
|
637
|
+
{
|
|
638
|
+
[self.defaultHeaders enumerateKeysAndObjectsUsingBlock:^(NSString *field, NSString *value, BOOL *stop) {
|
|
639
|
+
[response setHeader:field value:value];
|
|
640
|
+
}];
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
- (void)dispatchMethod:(NSString *)method pathAndQuery:(NSString *)pathAndQuery body:(NSData *)body client:(nw_connection_t)client
|
|
644
|
+
{
|
|
645
|
+
NSURLComponents *requestTarget = [NSURLComponents componentsWithString:pathAndQuery];
|
|
646
|
+
NSString *path = requestTarget.path ?: pathAndQuery;
|
|
647
|
+
|
|
648
|
+
for (FBHTTPRoute *route in self.routes) {
|
|
649
|
+
if (![route.verb isEqualToString:method]) {
|
|
650
|
+
continue;
|
|
651
|
+
}
|
|
652
|
+
NSTextCheckingResult *result = [route.regex firstMatchInString:path options:(NSMatchingOptions)0 range:NSMakeRange(0, path.length)];
|
|
653
|
+
if (nil == result) {
|
|
654
|
+
continue;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
NSMutableDictionary<NSString *, NSString *> *params = [NSMutableDictionary dictionary];
|
|
658
|
+
for (NSURLQueryItem *queryItem in requestTarget.queryItems) {
|
|
659
|
+
params[queryItem.name] = queryItem.value ?: @"";
|
|
660
|
+
}
|
|
661
|
+
if (route.keys.count > 0 && result.numberOfRanges == route.keys.count + 1) {
|
|
662
|
+
NSUInteger index = 1;
|
|
663
|
+
for (NSString *key in route.keys) {
|
|
664
|
+
params[key] = [path substringWithRange:[result rangeAtIndex:index]];
|
|
665
|
+
index++;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
NSURL *url = [NSURL URLWithString:path] ?: [NSURL URLWithString:@"/"];
|
|
670
|
+
RouteRequest *request = [[RouteRequest alloc] initWithURL:url params:params.copy body:body];
|
|
671
|
+
RouteResponse *response = [RouteResponse new];
|
|
672
|
+
[self applyDefaultHeadersToResponse:response];
|
|
673
|
+
|
|
674
|
+
NSString *sessionID = params[@"sessionID"];
|
|
675
|
+
if (route.isStandalone) {
|
|
676
|
+
// DELETE triggers -abandonPendingRequestsForSessionID: itself; tracking its own request
|
|
677
|
+
// would make it abandon itself and write a response twice.
|
|
678
|
+
NSString *trackedSessionID = [route.verb isEqualToString:@"DELETE"] ? nil : sessionID;
|
|
679
|
+
[self dispatchStandaloneRoute:route request:request response:response client:client method:method pathAndQuery:pathAndQuery sessionID:trackedSessionID];
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
FBPendingRequest *pendingRequest = nil;
|
|
684
|
+
if (nil != sessionID) {
|
|
685
|
+
pendingRequest = [[FBPendingRequest alloc] initWithClient:client];
|
|
686
|
+
RouteResponse *abandonedResponse = [self trackPendingRequest:pendingRequest forSessionID:sessionID];
|
|
687
|
+
if (nil != abandonedResponse) {
|
|
688
|
+
[self writeResponse:abandonedResponse toClient:client];
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
void (^invoke)(void) = ^{
|
|
694
|
+
route.block(request, response);
|
|
695
|
+
// Whoever untracks `pendingRequest` first "wins" and gets to respond - either this normal
|
|
696
|
+
// completion, or -abandonPendingRequestsForSessionID: on another thread.
|
|
697
|
+
BOOL shouldRespond = (nil == pendingRequest) || [self untrackPendingRequest:pendingRequest forSessionID:sessionID];
|
|
698
|
+
if (shouldRespond) {
|
|
699
|
+
[self writeResponse:response toClient:client];
|
|
700
|
+
}
|
|
701
|
+
};
|
|
702
|
+
dispatch_queue_t routeQueue = self.routeQueue;
|
|
703
|
+
if (routeQueue) {
|
|
704
|
+
dispatch_async((dispatch_queue_t _Nonnull)routeQueue, invoke);
|
|
705
|
+
} else {
|
|
706
|
+
invoke();
|
|
707
|
+
}
|
|
708
|
+
return;
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
RouteResponse *notFound = [RouteResponse new];
|
|
712
|
+
FBCommandStatus *status = [FBCommandStatus unknownCommandErrorWithMessage:nil
|
|
713
|
+
traceback:nil];
|
|
714
|
+
[FBResponseWithStatus(status) dispatchWithResponse:notFound];
|
|
715
|
+
[self applyDefaultHeadersToResponse:notFound];
|
|
716
|
+
[self writeResponse:notFound toClient:client];
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
#pragma mark - Session-scoped request cancellation
|
|
720
|
+
|
|
721
|
+
// Returns nil once `pendingRequest` is tracked, or the response an already-abandoned session was
|
|
722
|
+
// abandoned with, which the caller must deliver instead of dispatching.
|
|
723
|
+
- (nullable RouteResponse *)trackPendingRequest:(FBPendingRequest *)pendingRequest forSessionID:(NSString *)sessionID
|
|
724
|
+
{
|
|
725
|
+
@synchronized (self.pendingSessionRequests) {
|
|
726
|
+
RouteResponse *abandonedResponse = self.abandonedSessionResponses[sessionID];
|
|
727
|
+
if (nil != abandonedResponse) {
|
|
728
|
+
return abandonedResponse;
|
|
729
|
+
}
|
|
730
|
+
NSMutableSet<FBPendingRequest *> *pendingRequests = self.pendingSessionRequests[sessionID];
|
|
731
|
+
if (nil == pendingRequests) {
|
|
732
|
+
pendingRequests = [NSMutableSet set];
|
|
733
|
+
self.pendingSessionRequests[sessionID] = pendingRequests;
|
|
734
|
+
}
|
|
735
|
+
[pendingRequests addObject:pendingRequest];
|
|
736
|
+
return nil;
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
// Returns YES if this caller won the race to respond, vs. -abandonPendingRequestsForSessionID:
|
|
741
|
+
// already having claimed `pendingRequest` on another thread.
|
|
742
|
+
- (BOOL)untrackPendingRequest:(FBPendingRequest *)pendingRequest forSessionID:(NSString *)sessionID
|
|
743
|
+
{
|
|
744
|
+
@synchronized (self.pendingSessionRequests) {
|
|
745
|
+
NSMutableSet<FBPendingRequest *> *pendingRequests = self.pendingSessionRequests[sessionID];
|
|
746
|
+
BOOL wasPending = [pendingRequests containsObject:pendingRequest];
|
|
747
|
+
if (wasPending) {
|
|
748
|
+
[pendingRequests removeObject:pendingRequest];
|
|
749
|
+
if (0 == pendingRequests.count) {
|
|
750
|
+
[self.pendingSessionRequests removeObjectForKey:sessionID];
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
return wasPending;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
- (void)abandonPendingRequestsForSessionID:(NSString *)sessionID withResponse:(RouteResponse *)response
|
|
758
|
+
{
|
|
759
|
+
NSSet<FBPendingRequest *> *pendingRequests;
|
|
760
|
+
@synchronized (self.pendingSessionRequests) {
|
|
761
|
+
pendingRequests = [self.pendingSessionRequests[sessionID] copy];
|
|
762
|
+
[self.pendingSessionRequests removeObjectForKey:sessionID];
|
|
763
|
+
// Recorded before the lock is dropped, so requests admitted from here on are rejected.
|
|
764
|
+
self.abandonedSessionResponses[sessionID] = response;
|
|
765
|
+
}
|
|
766
|
+
for (FBPendingRequest *pendingRequest in pendingRequests) {
|
|
767
|
+
[self writeResponse:response toClient:pendingRequest.client];
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
#pragma mark - Standalone route dispatch
|
|
772
|
+
|
|
773
|
+
- (void)dispatchStandaloneRoute:(FBHTTPRoute *)route
|
|
774
|
+
request:(RouteRequest *)request
|
|
775
|
+
response:(RouteResponse *)response
|
|
776
|
+
client:(nw_connection_t)client
|
|
777
|
+
method:(NSString *)method
|
|
778
|
+
pathAndQuery:(NSString *)pathAndQuery
|
|
779
|
+
sessionID:(nullable NSString *)sessionID
|
|
780
|
+
{
|
|
781
|
+
// Includes the query string so requests with different params are never coalesced together.
|
|
782
|
+
NSString *key = [NSString stringWithFormat:@"%@ %@", method, pathAndQuery];
|
|
783
|
+
FBPendingRequest *waiter = [[FBPendingRequest alloc] initWithClient:client];
|
|
784
|
+
if (nil != sessionID) {
|
|
785
|
+
RouteResponse *abandonedResponse = [self trackPendingRequest:waiter forSessionID:sessionID];
|
|
786
|
+
if (nil != abandonedResponse) {
|
|
787
|
+
[self writeResponse:abandonedResponse toClient:client];
|
|
788
|
+
return;
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
BOOL isInFlight = NO;
|
|
793
|
+
@synchronized (self.standaloneWaiters) {
|
|
794
|
+
NSMutableArray<FBPendingRequest *> *waiters = self.standaloneWaiters[key];
|
|
795
|
+
if (nil != waiters) {
|
|
796
|
+
[waiters addObject:waiter];
|
|
797
|
+
isInFlight = YES;
|
|
798
|
+
} else {
|
|
799
|
+
self.standaloneWaiters[key] = [NSMutableArray array];
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
if (isInFlight) {
|
|
803
|
+
// An identical request is already executing; it will deliver this connection's response too.
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
dispatch_queue_t queue = dispatch_queue_create(key.UTF8String, DISPATCH_QUEUE_SERIAL);
|
|
808
|
+
__weak typeof(self) weakSelf = self;
|
|
809
|
+
dispatch_async(queue, ^{
|
|
810
|
+
route.block(request, response);
|
|
811
|
+
__strong typeof(weakSelf) strongSelf = weakSelf;
|
|
812
|
+
if (nil == strongSelf) {
|
|
813
|
+
return;
|
|
814
|
+
}
|
|
815
|
+
NSArray<FBPendingRequest *> *joinedWaiters;
|
|
816
|
+
@synchronized (strongSelf.standaloneWaiters) {
|
|
817
|
+
joinedWaiters = [strongSelf.standaloneWaiters[key] copy];
|
|
818
|
+
[strongSelf.standaloneWaiters removeObjectForKey:key];
|
|
819
|
+
}
|
|
820
|
+
for (FBPendingRequest *joinedWaiter in [@[waiter] arrayByAddingObjectsFromArray:joinedWaiters]) {
|
|
821
|
+
BOOL shouldRespond = (nil == sessionID) || [strongSelf untrackPendingRequest:joinedWaiter forSessionID:sessionID];
|
|
822
|
+
if (shouldRespond) {
|
|
823
|
+
[strongSelf writeResponse:response toClient:joinedWaiter.client];
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
});
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
- (void)writeResponse:(RouteResponse *)response toClient:(nw_connection_t)client
|
|
830
|
+
{
|
|
831
|
+
[self writeResponse:response toClient:client thenCloseConnection:NO];
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
- (void)writeResponse:(RouteResponse *)response toClient:(nw_connection_t)client thenCloseConnection:(BOOL)shouldClose
|
|
835
|
+
{
|
|
836
|
+
NSMutableData *payload = [NSMutableData data];
|
|
837
|
+
NSString *statusLine = [NSString stringWithFormat:@"HTTP/1.1 %ld %@\r\n",
|
|
838
|
+
(long)response.statusCode, [self reasonPhraseForStatusCode:response.statusCode]];
|
|
839
|
+
[payload appendData:FBUTF8Data(statusLine)];
|
|
840
|
+
|
|
841
|
+
NSData *body = response.responseData ?: [NSData data];
|
|
842
|
+
NSMutableDictionary<NSString *, NSString *> *headers = response.headers.mutableCopy;
|
|
843
|
+
if (nil == headers[@"Content-Length"]) {
|
|
844
|
+
headers[@"Content-Length"] = [NSString stringWithFormat:@"%lu", (unsigned long)body.length];
|
|
845
|
+
}
|
|
846
|
+
[headers enumerateKeysAndObjectsUsingBlock:^(NSString *field, NSString *value, BOOL *stop) {
|
|
847
|
+
NSString *headerLine = [NSString stringWithFormat:@"%@: %@\r\n", field, value];
|
|
848
|
+
[payload appendData:FBUTF8Data(headerLine)];
|
|
849
|
+
}];
|
|
850
|
+
[payload appendData:FBUTF8Data(@"\r\n")];
|
|
851
|
+
[payload appendData:body];
|
|
852
|
+
|
|
853
|
+
if (shouldClose) {
|
|
854
|
+
__weak typeof(self) weakSelf = self;
|
|
855
|
+
[self.socket writeData:payload toClient:client completion:^(BOOL didSucceed) {
|
|
856
|
+
[weakSelf closeClient:client];
|
|
857
|
+
}];
|
|
858
|
+
} else {
|
|
859
|
+
// Unblocked from the send's completion, not before it: ordering is preserved either way
|
|
860
|
+
// (nw_connection_send is FIFO per connection), but unblocking early lets a client that
|
|
861
|
+
// pipelines without reading responses pile up rendered responses inside Network.framework.
|
|
862
|
+
__weak typeof(self) weakSelf = self;
|
|
863
|
+
[self.socket writeData:payload toClient:client completion:^(BOOL didSucceed) {
|
|
864
|
+
__strong typeof(weakSelf) strongSelf = weakSelf;
|
|
865
|
+
if (nil == strongSelf) {
|
|
866
|
+
return;
|
|
867
|
+
}
|
|
868
|
+
if (!didSucceed) {
|
|
869
|
+
// The response never reached the peer, so running its next pipelined request - possibly
|
|
870
|
+
// a mutating one - would change device state for a client that can no longer be answered.
|
|
871
|
+
[FBLogger log:@"Failed to write a response; dropping the connection and its pending requests"];
|
|
872
|
+
[strongSelf closeClient:client];
|
|
873
|
+
return;
|
|
874
|
+
}
|
|
875
|
+
// Lifting the exemption and resuming parsing happen in one step on bufferProcessingQueue,
|
|
876
|
+
// the queue the reaper also runs on: doing it out here exposes the connection to a sweep
|
|
877
|
+
// queued ahead of the parse, which would judge a buffered request by the previous one's
|
|
878
|
+
// timestamp.
|
|
879
|
+
dispatch_async(strongSelf.bufferProcessingQueue, ^{
|
|
880
|
+
__strong typeof(weakSelf) queuedSelf = weakSelf;
|
|
881
|
+
if (nil == queuedSelf) {
|
|
882
|
+
return;
|
|
883
|
+
}
|
|
884
|
+
@synchronized (queuedSelf.connectionBuffers) {
|
|
885
|
+
[queuedSelf.connectionsAwaitingResponse removeObject:client];
|
|
886
|
+
// Mid-request connections get their window from when parsing could resume, not from the
|
|
887
|
+
// previous request. Absent entries stay absent, so idle keep-alives remain exempt.
|
|
888
|
+
if (nil != [queuedSelf.incompleteRequestStarts objectForKey:client]) {
|
|
889
|
+
[queuedSelf.incompleteRequestStarts setObject:[NSDate date] forKey:client];
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
[queuedSelf processBufferForClient:client];
|
|
893
|
+
});
|
|
894
|
+
}];
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
- (void)closeClient:(nw_connection_t)client
|
|
899
|
+
{
|
|
900
|
+
@synchronized (self.connectionBuffers) {
|
|
901
|
+
[self.connectionBuffers removeObjectForKey:client];
|
|
902
|
+
[self.pendingRequestHeaders removeObjectForKey:client];
|
|
903
|
+
[self.connectionsAwaitingResponse removeObject:client];
|
|
904
|
+
[self.incompleteRequestStarts removeObjectForKey:client];
|
|
905
|
+
}
|
|
906
|
+
nw_connection_cancel(client);
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
- (NSString *)reasonPhraseForStatusCode:(HTTPStatusCode)statusCode
|
|
910
|
+
{
|
|
911
|
+
// if/else, not switch, to avoid having to list all ~90 HTTPStatusCode cases for -Wswitch-enum.
|
|
912
|
+
if (kHTTPStatusCodeOK == statusCode) {
|
|
913
|
+
return @"OK";
|
|
914
|
+
} else if (kHTTPStatusCodeBadRequest == statusCode) {
|
|
915
|
+
return @"Bad Request";
|
|
916
|
+
} else if (kHTTPStatusCodeNotFound == statusCode) {
|
|
917
|
+
return @"Not Found";
|
|
918
|
+
} else if (kHTTPStatusCodeMethodNotAllowed == statusCode) {
|
|
919
|
+
return @"Method Not Allowed";
|
|
920
|
+
} else if (kHTTPStatusCodeRequestTimeout == statusCode) {
|
|
921
|
+
return @"Request Timeout";
|
|
922
|
+
} else if (kHTTPStatusCodeRequestEntityTooLarge == statusCode) {
|
|
923
|
+
return @"Request Entity Too Large";
|
|
924
|
+
} else if (kHTTPStatusCodeNotImplemented == statusCode) {
|
|
925
|
+
return @"Not Implemented";
|
|
926
|
+
} else if (kHTTPStatusCodeInternalServerError == statusCode) {
|
|
927
|
+
return @"Internal Server Error";
|
|
928
|
+
}
|
|
929
|
+
return @"Status";
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
@end
|