Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/contracts/src/navigation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export type OrientationCommandResult = {
* `fold` — `{ action: 'fold', pose, hingeAngleDegrees, screen?, message }`.
*
* Unlike `orientation`, there is no unconfirmed variant: the Apple owner reads the hinge angle
* back from CoreDevice after pressing the Device Hub pose control, and reports a pose only when
* back from CoreDevice after the simulator HID helper sends the pose, and reports a pose only when
* that reading agrees with the request. `screen` names the panel the device lights afterwards and
* that panel's native point size (ADR 0025); it is the panel's geometry, not the app viewport, so a
* caller must take a fresh snapshot before placing a tap.
Expand Down
3 changes: 2 additions & 1 deletion packages/platform-android/src/runtime.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,8 @@ test('Android refuses the fold fact on every kind', async () => {
createAndroidPlatformRuntime(androidNavigationHost()),
runtimeDevice,
);
// A foldable hinge is posed through Xcode Device Hub; no adb surface poses one.
// fold drives only foldable iPhone simulators; the Android emulator posture control is not
// driven yet.
expect(binding.facts.operations.setFoldPose).toEqual({
available: false,
reason: 'unsupported-platform-leaf',
Expand Down
3 changes: 2 additions & 1 deletion packages/platform-web/src/runtime.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,8 @@ test('clipboard, the app switcher, app events, settings and alerts carry no web
'appSwitcher',
// The Action Button is iPhone/iPad hardware with no web analogue at all.
'actionButton',
// A foldable hinge is posed through Xcode Device Hub; the web target has none.
// A foldable hinge is posed through the host's iOS simulator HID helper; the web target has
// none.
'setFoldPose',
'triggerAppEvent',
// R58/R59: the retired `settings` and `alert` descriptors declared no web leaf either.
Expand Down
7 changes: 5 additions & 2 deletions packages/provider-limrun/src/interaction-operations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -341,11 +341,14 @@ export function limrunSystemButtonOperationFacts(
});
}

/** A foldable hinge is posed through the host's Xcode Device Hub, which no Limrun session has. */
/**
* `fold` sends a HID hinge event through a helper the daemon host spawns inside one of its own iOS
* simulators with `simctl spawn`; a Limrun session's device is not a host simulator.
*/
export const LIMRUN_FOLD_UNAVAILABLE = Object.freeze({
available: false,
reason: 'unsupported-provider-mode',
hint: 'fold poses a foldable iPhone simulator through Xcode Device Hub on the host, which no Limrun session exposes.',
hint: 'fold runs a HID helper through simctl spawn inside a foldable iPhone simulator on the daemon host; a Limrun session has no such simulator.',
} as const);

/** The fold refusal both Limrun legs share. */
Expand Down
2 changes: 1 addition & 1 deletion packages/provider-webdriver/src/platform-runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ const systemButtonUnavailable = Object.freeze({
const foldUnavailable = Object.freeze({
available: false,
reason: 'unsupported-provider-mode',
hint: 'fold poses a foldable iPhone simulator through Xcode Device Hub, which no WebDriver backend exposes.',
hint: 'fold runs a HID helper through simctl spawn inside a foldable iPhone simulator on the daemon host; a WebDriver backend has no such simulator.',
} as const);

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,8 @@ function providerScenarioRuntimeFacts(
// hardware exists on the iPhone/iPad leaf only, so the fixture reads the same kernel rule the
// Apple owner's fact reads instead of restating it (#2699).
actionButton: hasAppleActionButton(device) ? fakeProviderAvailable : fakeProviderUnavailable,
// A provider session has no Device Hub on the host, so no fixture leg poses a hinge.
// A provider session has no host simulator for the fold HID helper, so no fixture leg poses
// a hinge.
setFoldPose: fakeProviderUnavailable,
// Provider-owned iOS keyboard actions ride the same runner transport the shared interactor
// does (#1297): a fixture scenario that can drive the interactor at all can drive these.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,9 @@ test('provider transport carries the Action Button press without an app activati
});
});

// A hinge pose is posed through Xcode Device Hub on the host, which a provider-owned device has no
// access to, so the provider fixture states the refusal cell and admission refuses before anything
// reaches the transport: no runner call, no local Device Hub press.
// A hinge pose is sent by a HID helper the host spawns inside a local iOS simulator, which a
// provider-owned device is not, so the provider fixture states the refusal cell and admission
// refuses before anything reaches the transport.
test('provider transport refuses a fold before any runner traffic', async () => {
await withProviderScenarioResource(createInteractorSeamWorld, async ({ daemon, calls }) => {
const lease = await allocateLease(daemon);
Expand Down
Loading