シーケンス

HackMD で任意のページを編集開始

  1. GROWI ユーザーが Start to edit with HackMD ボタンクリック
  2. GROWI クライアントがGROWIサーバーの /_api/hackmd.integrate を叩き、ドキュメントの更新等を行う
    • Page モデルの pageIdOnHackmd, revisionHackmdSynced, hasDraftOnHackmd が関連
  3. PageEditorByHackmd により、HackMD が iframe 内で起動
  4. HackMD 予め head 内に仕込まれていた script タグにより、GROWIサーバーの /_hackmd/load-agent を読み込んで実行
    • 参考ソース セクションの hackmad-agent.js
    • penpal を使って postMessage で GROWI と通信可能になる準備が整う
  5. GROWI HackmdEditor が penpal を通して hackmd-agent.js の setValueOnInit を叩き、Markdown string を渡す

iframe 間通信について

  • postMessage を使っている
  • セキュリティ対策のため、HackMD の head 内の script タグで読み込む /_hackmd/load-agent の準備段階で origin を設定している
    • 初期実装では req.get('host') を注入していたため、同一オリジンでないと通信できないような仕様になっていた
    • 5dc77d external_linkapp:url:fixed というサーバー側URLを保持するコンフィグが新規に導入され、それを注入するように変更されたことにより、初期実装時の「同一オリジンでないと通信できない仕様」はなくなった

Save

(TBD)

Resume to edit

(TBD)

Discard

(TBD)

Page モデルの関連フィールド

(TBD)

  • hasDraftOnHackmd
  • revisionHackmdSynced
  • hasDraftOnHackmd

参考ソース

HackMD head 内 script で読み込むもの

クライアント側エディタ