Skip to content

bug: ルビータブで表示していたプログラムがコードタブ(ブロック)で消えることがある #710

Description

@takaokouji

概要

ルビータブで表示・編集していたプログラムが、コードタブ(ブロック)側で消えてしまうことがある、という不具合報告。間欠的に発生し、安定再現には至っていないが、ユーザー報告に加えてメンテナ側でも 1 度発生を確認したため、本格的に調査する。

特徴的なのは、ルビータブにはプログラムが残っているのに、コードタブのブロックだけが消えるという非対称な症状。報告者の手元でもルビータブにはプログラムが残っていた。

ユーザー報告

再現状況

  • 複数のユーザーから類似の報告あり
  • メンテナの手元でも 1 回だけ 発生を確認。その後の再現確認では再発していない
  • 現時点で安定した再現手順は未確立(間欠的に発生

再現手順(仮説・現状まだ再現できていない)

tools/playwright-verify/ の調査スクリプトに、現時点で最有力と考えている再現シナリオをエンコードしてある。いずれもこの手順では手元でまだ再現できていない(= 仮説段階)。

repro-costume-clears-blocks.mjs(VM 注入でブロックを用意)

workspaceUpdate の発火回数・XML 内のトップブロック数・deleteBlock 呼び出しを計測しながら、以下を実行する:

  1. スプライト 1 つにプログラム(event_whenflagclickedmotion_movesteps(10))を用意し、コスチュームを 2 枚にする
  2. コードタブを開く(baseline)
  3. ルビータブ を開く(プログラムが Ruby として生成され、ルビータブ側に保持される状態を作る = 報告者の状況に合わせる)
  4. コードタブへ戻る
  5. コスチュームタブ を開く
  6. 2 枚目のコスチュームを選択setCostume(1)
  7. コードタブへ戻り、ブロックが消えていないか確認

仮説: コスチューム切り替えに伴うタブ再構築・workspaceUpdate の過程で、ルビータブには残るのにブロックワークスペースが空で上書きされる経路があるのではないか。

repro-costume-realdrag.mjs(パレットからの実ドラッグ)

上記が VM 注入でブロックを作るのに対し、こちらはパレットからの実ドラッグでネイティブな Blockly ワークスペース状態を作ってから、「コスチュームタブ → 別コスチューム選択 → コードタブ」を行う。実ユーザーの操作に近い状態で再現するかを確認する目的。

現状

  • 上記 2 シナリオを実行しても、手元ではブロック消失を再現できていない
  • そのため、抜けている条件(特定のブロック構成 / ルビータブでの編集有無 / タイミング / 端末・ブラウザ差)を引き続き探る必要がある

想定される発生箇所・調査の出発点

ルビータブ ↔ コードタブ(Blockly ワークスペース)間の同期処理周辺が疑わしい。特にタブ切り替え時にワークスペースが再構築される過程でブロックが失われるパターンを重点的に調べる。

調査対象の候補:

  • packages/scratch-gui/src/containers/ruby-tab.jsx — ルビータブ ↔ ブロック変換、タブ切り替えロジック
  • packages/scratch-gui/src/lib/ruby-to-blocks-converter/ — Ruby → ブロック変換
  • packages/scratch-gui/src/lib/ruby-generator/ — ブロック → Ruby 生成
  • タブ切り替え時の workspaceUpdate / Blockly ワークスペース再構築タイミング(コスチューム/音タブからコードタブへ戻った際の getBBox() 問題など、既知の Playwright 固有挙動とは別に、実機での消失を確認する)

調査方針

  1. 上記 repro スクリプトを足がかりに、ブロックが消失する具体的な操作シーケンス(抜けている条件)を特定する
  2. ルビータブ ↔ コードタブの相互変換・タブ切り替え時に、空のプログラムでブロックワークスペースが上書きされる経路がないか確認する
  3. 再現手順が確立できたら RED テスト(integration test)を追加し、TDD で修正する

関連

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions