NS_IMETHODIMP SelectionMoveCommands::DoCommand(const char* aCommandName, nsISupports* aCommandRefCon) { nsCOMPtr<nsIEditor> editor = do_QueryInterface(aCommandRefCon); if (NS_WARN_IF(!editor)) { return NS_ERROR_FAILURE; } TextEditor* textEditor = editor->AsTextEditor(); MOZ_ASSERT(textEditor); RefPtr<Document> doc = textEditor->GetDocument(); if (doc) { // Most of the commands below (possibly all of them) need layout to // be up to date. doc->FlushPendingNotifications(FlushType::Layout); } nsCOMPtr<nsISelectionController> selectionController = textEditor->GetSelectionController(); if (NS_WARN_IF(!selectionController)) { return NS_ERROR_FAILURE; } // scroll commands for (size_t i = 0; i < mozilla::ArrayLength(scrollCommands); i++) { const ScrollCommand& cmd = scrollCommands[i]; if (!nsCRT::strcmp(aCommandName, cmd.reverseScroll)) { return (selectionController->*(cmd.scroll))(false); } else if (!nsCRT::strcmp(aCommandName, cmd.forwardScroll)) { return (selectionController->*(cmd.scroll))(true); } } // caret movement/selection commands for (size_t i = 0; i < mozilla::ArrayLength(moveCommands); i++) { const MoveCommand& cmd = moveCommands[i]; if (!nsCRT::strcmp(aCommandName, cmd.reverseMove)) { return (selectionController->*(cmd.move))(false, false); } else if (!nsCRT::strcmp(aCommandName, cmd.forwardMove)) { return (selectionController->*(cmd.move))(true, false); } else if (!nsCRT::strcmp(aCommandName, cmd.reverseSelect)) { return (selectionController->*(cmd.move))(false, true); } else if (!nsCRT::strcmp(aCommandName, cmd.forwardSelect)) { return (selectionController->*(cmd.move))(true, true); } } // physical-direction movement/selection for (size_t i = 0; i < mozilla::ArrayLength(physicalCommands); i++) { const PhysicalCommand& cmd = physicalCommands[i]; if (!nsCRT::strcmp(aCommandName, cmd.move)) { return selectionController->PhysicalMove(cmd.direction, cmd.amount, false); } else if (!nsCRT::strcmp(aCommandName, cmd.select)) { return selectionController->PhysicalMove(cmd.direction, cmd.amount, true); } } return NS_ERROR_FAILURE; }