goDoCommand

goDoCommandの実体を調査。

global/resources/content/globalOverlay.js

function goDoCommand(command)
{
  try {
    var controller = top.document.commandDispatcher.getControllerForCommand(command);
    if ( controller && controller.isCommandEnabled(command))
      controller.doCommand(command);
  }
  catch (e) {
    dump("An error occurred executing the " + command + " command\n" + e + "\n");
  }
}

というのがdoCommandで実行してる。

キー定義は拡張勉強会で教えてもらったとおり
www.mozilla.gr.jp/addon_study/archive/20070901/firemacs.pdf

mozilla/content/xbl/builtin/win/platformHTMLBindings.xml

      <handler event="keypress" keycode="VK_RIGHT" modifiers="control"
        command="cmd_wordNext"/>
      <handler event="keypress" keycode="VK_LEFT" modifiers="shift,control"
        command="cmd_selectWordPrevious"/>
      <handler event="keypress" keycode="VK_RIGHT" modifiers="shift,control"
        command="cmd_selectWordNext"/>
      <handler event="keypress" key="y" modifiers="accel"
        command="cmd_redo"/>

こんなかんじ。

何をするかは

mozilla/dom/src/base/nsGlobalWindowCommands.cpp

const char * const sSelectAllString = "cmd_selectAll";
const char * const sSelectNoneString = "cmd_selectNone";
const char * const sCopyImageLocationString = "cmd_copyImageLocation";
const char * const sCopyImageContentsString = "cmd_copyImageContents";
const char * const sCopyImageString = "cmd_copyImage";

const char * const sScrollTopString = "cmd_scrollTop";
const char * const sScrollBottomString = "cmd_scrollBottom";
const char * const sScrollPageUpString = "cmd_scrollPageUp";
const char * const sScrollPageDownString = "cmd_scrollPageDown";
const char * const sMovePageUpString = "cmd_movePageUp";
const char * const sMovePageDownString = "cmd_movePageDown";
const char * const sScrollLineUpString = "cmd_scrollLineUp";
const char * const sScrollLineDownString = "cmd_scrollLineDown";
const char * const sScrollLeftString = "cmd_scrollLeft";
const char * const sScrollRightString = "cmd_scrollRight";

// These are so the browser can use editor navigation key bindings
// helps with accessibility (boolean pref accessibility.browsewithcaret)

const char * const sSelectCharPreviousString = "cmd_selectCharPrevious";
const char * const sSelectCharNextString = "cmd_selectCharNext";

const char * const sWordPreviousString = "cmd_wordPrevious";
const char * const sWordNextString = "cmd_wordNext";
const char * const sSelectWordPreviousString = "cmd_selectWordPrevious";
const char * const sSelectWordNextString = "cmd_selectWordNext";

const char * const sBeginLineString = "cmd_beginLine";
const char * const sEndLineString = "cmd_endLine";
const char * const sSelectBeginLineString = "cmd_selectBeginLine";
const char * const sSelectEndLineString = "cmd_selectEndLine";

const char * const sSelectLinePreviousString = "cmd_selectLinePrevious";
const char * const sSelectLineNextString = "cmd_selectLineNext";

const char * const sSelectPagePreviousString = "cmd_selectPagePrevious";
const char * const sSelectPageNextString = "cmd_selectPageNext";

const char * const sSelectTopString = "cmd_selectTop";
const char * const sSelectBottomString = "cmd_selectBottom";

こんな感じで書いてある。そんなにないのでぜんぶはっとく。

実際処理をする部分は

 else if (!nsCRT::strcmp(aCommandName, sBeginLineString))
    rv = aSelectionController->IntraLineMove(PR_FALSE, PR_FALSE);

これ。
イベントキュー経由で実行してもらったりはしない。直接実行。

あー難しい。