// Get the nsITreeBoxObject interface from any levels DOMNode under the <tree> void nsXULTreeAccessible::GetTreeBoxObject(nsIDOMNode *aDOMNode, nsITreeBoxObject **aBoxObject) { nsAutoString name; nsCOMPtr<nsIDOMNode> parentNode, currentNode; // Find DOMNode's parents recursively until reach the <tree> tag currentNode = aDOMNode; while (currentNode) { currentNode->GetLocalName(name); if (name.EqualsLiteral("tree")) { // We will get the nsITreeBoxObject from the tree node nsCOMPtr<nsIDOMXULElement> xulElement(do_QueryInterface(currentNode)); if (xulElement) { nsCOMPtr<nsIBoxObject> box; xulElement->GetBoxObject(getter_AddRefs(box)); nsCOMPtr<nsITreeBoxObject> treeBox(do_QueryInterface(box)); if (treeBox) { *aBoxObject = treeBox; NS_ADDREF(*aBoxObject); return; } } } currentNode->GetParentNode(getter_AddRefs(parentNode)); currentNode = parentNode; } *aBoxObject = nsnull; }
NS_IMETHODIMP nsDOMMenuBar::AddSubmenu(const nsAString& aId, const nsAString& aLabel, nsINativeMenu** _retval) { nsresult rv; nsCOMPtr<nsIDOMDocument> chromeDocument; rv = GetChromeDocument(getter_AddRefs(chromeDocument)); NS_ENSURE_SUCCESS(rv, rv); if (!mMenuElement) { nsCOMPtr<nsIDOMNodeList> nodeList; rv = chromeDocument->GetElementsByTagName(NS_LITERAL_STRING("menubar"), getter_AddRefs(nodeList)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMNode> node; rv = nodeList->Item(0, getter_AddRefs(node)); NS_ENSURE_SUCCESS(rv, rv); mMenuElement = do_QueryInterface(node, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = mMenuElement->SetAttribute(NS_LITERAL_STRING("hidden"), NS_LITERAL_STRING("false")); NS_ENSURE_SUCCESS(rv, rv); } // Add the new menu nsCOMPtr<nsIDOMElement> menu; rv = chromeDocument->CreateElement(NS_LITERAL_STRING("menu"), getter_AddRefs(menu)); NS_ENSURE_SUCCESS(rv, rv); rv = menu->SetAttribute(NS_LITERAL_STRING("label"), aLabel); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMElement> menuPopup; rv = chromeDocument->CreateElement(NS_LITERAL_STRING("menupopup"), getter_AddRefs(menuPopup)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMXULElement> xulElement(do_QueryInterface(menuPopup, &rv)); NS_ENSURE_SUCCESS(rv, rv); rv = xulElement->SetId(aId); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMNode> node; rv = menu->AppendChild(menuPopup, getter_AddRefs(node)); NS_ENSURE_SUCCESS(rv, rv); rv = mMenuElement->AppendChild(menu, getter_AddRefs(node)); NS_ENSURE_SUCCESS(rv, rv); nsRefPtr<nsDOMMenuBar> nativeMenu = new nsDOMMenuBar(mWindow); NS_ENSURE_TRUE(nativeMenu, NS_ERROR_OUT_OF_MEMORY); nativeMenu->mMenuElement = menu; return nativeMenu->QueryInterface(NS_GET_IID(nsINativeMenu), (void **) _retval); }
NS_IMETHODIMP nsDOMMenuBar::AddMenuItem(const nsAString& aId, const nsAString& aLabel, nsIDOMEventListener* aListener) { NS_ENSURE_STATE(mWindow); NS_ENSURE_STATE(mMenuElement); nsresult rv; nsAutoString tagName; rv = mMenuElement->GetTagName(tagName); NS_ENSURE_SUCCESS(rv, rv); if (tagName != NS_LITERAL_STRING("menu")) { return NS_ERROR_FAILURE; } nsCOMPtr<nsIDOMDocument> document; rv = GetChromeDocument(getter_AddRefs(document)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMElement> element; rv = document->CreateElement(NS_LITERAL_STRING("menuitem"), getter_AddRefs(element)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMXULElement> xulElement(do_QueryInterface(element, &rv)); NS_ENSURE_SUCCESS(rv, rv); rv = xulElement->SetId(aId); NS_ENSURE_SUCCESS(rv, rv); rv = element->SetAttribute(NS_LITERAL_STRING("label"), aLabel); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMEventTarget> target(do_QueryInterface(element, &rv)); NS_ENSURE_SUCCESS(rv, rv); rv = target->AddEventListener(NS_LITERAL_STRING("command"), aListener, PR_TRUE); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDOMNode> node; rv = mMenuElement->AppendChild(element, getter_AddRefs(node)); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; }
already_AddRefed<nsIController> nsXBLPrototypeHandler::GetController(nsPIDOMEventTarget* aTarget) { // XXX Fix this so there's a generic interface that describes controllers, // This code should have no special knowledge of what objects might have controllers. nsCOMPtr<nsIControllers> controllers; nsCOMPtr<nsIDOMXULElement> xulElement(do_QueryInterface(aTarget)); if (xulElement) xulElement->GetControllers(getter_AddRefs(controllers)); if (!controllers) { nsCOMPtr<nsIDOMNSHTMLTextAreaElement> htmlTextArea(do_QueryInterface(aTarget)); if (htmlTextArea) htmlTextArea->GetControllers(getter_AddRefs(controllers)); } if (!controllers) { nsCOMPtr<nsIDOMNSHTMLInputElement> htmlInputElement(do_QueryInterface(aTarget)); if (htmlInputElement) htmlInputElement->GetControllers(getter_AddRefs(controllers)); } if (!controllers) { nsCOMPtr<nsIDOMWindowInternal> domWindow(do_QueryInterface(aTarget)); if (domWindow) domWindow->GetControllers(getter_AddRefs(controllers)); } // Return the first controller. // XXX This code should be checking the command name and using supportscommand and // iscommandenabled. nsIController* controller; if (controllers) { controllers->GetControllerAt(0, &controller); // return reference } else controller = nsnull; return controller; }
nsresult nsWindowRoot::GetControllers(nsIControllers** aResult) { *aResult = nsnull; // XXX: we should fix this so there's a generic interface that // describes controllers, so this code would have no special // knowledge of what object might have controllers. nsCOMPtr<nsPIDOMWindow> focusedWindow; nsIContent* focusedContent = nsFocusManager::GetFocusedDescendant(mWindow, PR_TRUE, getter_AddRefs(focusedWindow)); if (focusedContent) { #ifdef MOZ_XUL nsCOMPtr<nsIDOMXULElement> xulElement(do_QueryInterface(focusedContent)); if (xulElement) return xulElement->GetControllers(aResult); #endif nsCOMPtr<nsIDOMHTMLTextAreaElement> htmlTextArea = do_QueryInterface(focusedContent); if (htmlTextArea) return htmlTextArea->GetControllers(aResult); nsCOMPtr<nsIDOMHTMLInputElement> htmlInputElement = do_QueryInterface(focusedContent); if (htmlInputElement) return htmlInputElement->GetControllers(aResult); if (focusedContent->IsEditable() && focusedWindow) return focusedWindow->GetControllers(aResult); } else { nsCOMPtr<nsIDOMWindow> domWindow = do_QueryInterface(focusedWindow); if (domWindow) return domWindow->GetControllers(aResult); } return NS_OK; }
already_AddRefed<nsITreeBoxObject> nsCoreUtils::GetTreeBoxObject(nsIContent *aContent) { // Find DOMNode's parents recursively until reach the <tree> tag nsIContent* currentContent = aContent; while (currentContent) { if (currentContent->NodeInfo()->Equals(nsGkAtoms::tree, kNameSpaceID_XUL)) { // We will get the nsITreeBoxObject from the tree node nsCOMPtr<nsIDOMXULElement> xulElement(do_QueryInterface(currentContent)); if (xulElement) { nsCOMPtr<nsIBoxObject> box; xulElement->GetBoxObject(getter_AddRefs(box)); nsCOMPtr<nsITreeBoxObject> treeBox(do_QueryInterface(box)); if (treeBox) return treeBox.forget(); } } currentContent = currentContent->GetParent(); } return nullptr; }