NS_IMETHODIMP nsHTMLSelectOptionAccessible::DoAction(PRUint8 index) { if (index == eAction_Select) { // default action nsCOMPtr<nsIDOMHTMLOptionElement> newHTMLOption(do_QueryInterface(mDOMNode)); if (!newHTMLOption) return NS_ERROR_FAILURE; // Clear old selection nsCOMPtr<nsIDOMNode> oldHTMLOptionNode, selectNode; nsCOMPtr<nsIAccessible> parent(GetParent()); nsCOMPtr<nsIAccessNode> accessNode(do_QueryInterface(parent)); NS_ASSERTION(accessNode, "Unable to QI to nsIAccessNode"); accessNode->GetDOMNode(getter_AddRefs(selectNode)); GetFocusedOptionNode(selectNode, getter_AddRefs(oldHTMLOptionNode)); nsCOMPtr<nsIDOMHTMLOptionElement> oldHTMLOption(do_QueryInterface(oldHTMLOptionNode)); if (oldHTMLOption) oldHTMLOption->SetSelected(PR_FALSE); // Set new selection newHTMLOption->SetSelected(PR_TRUE); // If combo box, and open, close it // First, get the <select> widgets list control frame nsCOMPtr<nsIDOMNode> testSelectNode; nsCOMPtr<nsIDOMNode> thisNode(do_QueryInterface(mDOMNode)); do { thisNode->GetParentNode(getter_AddRefs(testSelectNode)); nsCOMPtr<nsIDOMHTMLSelectElement> selectControl(do_QueryInterface(testSelectNode)); if (selectControl) break; thisNode = testSelectNode; } while (testSelectNode); nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mWeakShell)); nsCOMPtr<nsIContent> selectContent(do_QueryInterface(testSelectNode)); nsCOMPtr<nsIDOMHTMLOptionElement> option(do_QueryInterface(mDOMNode)); if (!testSelectNode || !selectContent || !presShell || !option) return NS_ERROR_FAILURE; nsIFrame *selectFrame = presShell->GetPrimaryFrameFor(selectContent); nsIComboboxControlFrame *comboBoxFrame = do_QueryFrame(selectFrame); if (comboBoxFrame) { nsIFrame *listFrame = comboBoxFrame->GetDropDown(); if (comboBoxFrame->IsDroppedDown() && listFrame) { // use this list control frame to roll up the list nsIListControlFrame *listControlFrame = do_QueryFrame(listFrame); if (listControlFrame) { PRInt32 newIndex = 0; option->GetIndex(&newIndex); listControlFrame->ComboboxFinish(newIndex); } } } return NS_OK; } return NS_ERROR_INVALID_ARG; }
NS_IMETHODIMP nsHTMLSelectOptionAccessible::DoAction(PRUint8 index) { if (index == eAction_Select) { // default action nsCOMPtr<nsIDOMHTMLOptionElement> newHTMLOption(do_QueryInterface(mContent)); if (!newHTMLOption) return NS_ERROR_FAILURE; // Clear old selection nsAccessible* parent = GetParent(); NS_ASSERTION(parent, "No parent!"); nsCOMPtr<nsIContent> oldHTMLOptionContent = GetFocusedOption(parent->GetContent()); nsCOMPtr<nsIDOMHTMLOptionElement> oldHTMLOption = do_QueryInterface(oldHTMLOptionContent); if (oldHTMLOption) oldHTMLOption->SetSelected(PR_FALSE); // Set new selection newHTMLOption->SetSelected(PR_TRUE); // If combo box, and open, close it // First, get the <select> widgets list control frame nsIContent *selectContent = mContent; do { selectContent = selectContent->GetParent(); nsCOMPtr<nsIDOMHTMLSelectElement> selectControl = do_QueryInterface(selectContent); if (selectControl) break; } while (selectContent); nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mWeakShell)); nsCOMPtr<nsIDOMHTMLOptionElement> option(do_QueryInterface(mContent)); if (!selectContent || !presShell || !option) return NS_ERROR_FAILURE; nsIFrame *selectFrame = selectContent->GetPrimaryFrame(); nsIComboboxControlFrame *comboBoxFrame = do_QueryFrame(selectFrame); if (comboBoxFrame) { nsIFrame *listFrame = comboBoxFrame->GetDropDown(); if (comboBoxFrame->IsDroppedDown() && listFrame) { // use this list control frame to roll up the list nsIListControlFrame *listControlFrame = do_QueryFrame(listFrame); if (listControlFrame) { PRInt32 newIndex = 0; option->GetIndex(&newIndex); listControlFrame->ComboboxFinish(newIndex); } } } return NS_OK; } return NS_ERROR_INVALID_ARG; }