static nsresult createTextNode(txIEvalContext *aContext, nsString& aValue, txXPathNode* *aResult) { txExecutionState* es = static_cast<txExecutionState*>(aContext->getPrivateContext()); if (!es) { NS_ERROR("Need txExecutionState!"); return NS_ERROR_UNEXPECTED; } const txXPathNode& document = es->getSourceDocument(); nsIDocument *doc = txXPathNativeNode::getDocument(document); nsCOMPtr<nsIContent> text; nsresult rv = NS_NewTextNode(getter_AddRefs(text), doc->NodeInfoManager()); NS_ENSURE_SUCCESS(rv, rv); rv = text->SetText(aValue, PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); *aResult = txXPathNativeNode::createXPathNode(text, PR_TRUE); NS_ENSURE_TRUE(*aResult, NS_ERROR_OUT_OF_MEMORY); return NS_OK; }
nsresult txMozillaXMLOutput::closePrevious(PRBool aFlushText) { TX_ENSURE_CURRENTNODE; nsresult rv; if (mOpenedElement) { PRBool currentIsDoc = mCurrentNode == mDocument; if (currentIsDoc && mRootContentCreated) { // We already have a document element, but the XSLT spec allows this. // As a workaround, create a wrapper object and use that as the // document element. rv = createTxWrapper(); NS_ENSURE_SUCCESS(rv, rv); } rv = mCurrentNode->AppendChildTo(mOpenedElement, PR_TRUE); NS_ENSURE_SUCCESS(rv, rv); if (currentIsDoc) { mRootContentCreated = PR_TRUE; nsContentSink::NotifyDocElementCreated(mDocument); } mCurrentNode = mOpenedElement; mOpenedElement = nsnull; } else if (aFlushText && !mText.IsEmpty()) { // Text can't appear in the root of a document if (mDocument == mCurrentNode) { if (XMLUtils::isWhitespace(mText)) { mText.Truncate(); return NS_OK; } rv = createTxWrapper(); NS_ENSURE_SUCCESS(rv, rv); } nsCOMPtr<nsIContent> text; rv = NS_NewTextNode(getter_AddRefs(text), mNodeInfoManager); NS_ENSURE_SUCCESS(rv, rv); rv = text->SetText(mText, PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); rv = mCurrentNode->AppendChildTo(text, PR_TRUE); NS_ENSURE_SUCCESS(rv, rv); mText.Truncate(); } return NS_OK; }
nsresult nsIsIndexFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements) { // Get the node info manager (used to create hr's and input's) nsCOMPtr<nsIDocument> doc = mContent->GetDocument(); nsNodeInfoManager *nimgr = doc->NodeInfoManager(); // Create an hr nsCOMPtr<nsINodeInfo> hrInfo; hrInfo = nimgr->GetNodeInfo(nsGkAtoms::hr, nsnull, kNameSpaceID_XHTML); NS_NewHTMLElement(getter_AddRefs(mPreHr), hrInfo.forget(), dom::NOT_FROM_PARSER); if (!mPreHr || !aElements.AppendElement(mPreHr)) return NS_ERROR_OUT_OF_MEMORY; // Add a child text content node for the label NS_NewTextNode(getter_AddRefs(mTextContent), nimgr); if (!mTextContent) return NS_ERROR_OUT_OF_MEMORY; // set the value of the text node and add it to the child list UpdatePromptLabel(PR_FALSE); if (!aElements.AppendElement(mTextContent)) return NS_ERROR_OUT_OF_MEMORY; // Create text input field nsCOMPtr<nsINodeInfo> inputInfo; inputInfo = nimgr->GetNodeInfo(nsGkAtoms::input, nsnull, kNameSpaceID_XHTML); NS_NewHTMLElement(getter_AddRefs(mInputContent), inputInfo.forget(), dom::NOT_FROM_PARSER); if (!mInputContent) return NS_ERROR_OUT_OF_MEMORY; mInputContent->SetAttr(kNameSpaceID_None, nsGkAtoms::type, NS_LITERAL_STRING("text"), PR_FALSE); if (!aElements.AppendElement(mInputContent)) return NS_ERROR_OUT_OF_MEMORY; // Register as an event listener to submit on Enter press mListener = new nsIsIndexFrame::KeyListener(this); mInputContent->AddEventListenerByIID(mListener, NS_GET_IID(nsIDOMKeyListener)); // Create an hr hrInfo = nimgr->GetNodeInfo(nsGkAtoms::hr, nsnull, kNameSpaceID_XHTML); NS_NewHTMLElement(getter_AddRefs(mPostHr), hrInfo.forget(), dom::NOT_FROM_PARSER); if (!mPostHr || !aElements.AppendElement(mPostHr)) return NS_ERROR_OUT_OF_MEMORY; return NS_OK; }
// Create the text content used as label for the button. // The frame will be generated by the frame constructor. nsresult nsGfxButtonControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements) { nsXPIDLString label; GetLabel(label); // Add a child text content node for the label NS_NewTextNode(getter_AddRefs(mTextContent), mContent->NodeInfo()->NodeInfoManager()); if (!mTextContent) return NS_ERROR_OUT_OF_MEMORY; // set the value of the text node and add it to the child list mTextContent->SetText(label, false); if (!aElements.AppendElement(mTextContent)) return NS_ERROR_OUT_OF_MEMORY; return NS_OK; }
static nsresult createAndAddToResult(nsIAtom* aName, const nsSubstring& aValue, txNodeSet* aResultSet, nsIContent* aResultHolder) { NS_ASSERTION(aResultHolder->IsNodeOfType(nsINode::eDOCUMENT_FRAGMENT) && aResultHolder->GetOwnerDoc(), "invalid result-holder"); nsIDocument* doc = aResultHolder->GetOwnerDoc(); nsCOMPtr<nsIContent> elem; nsresult rv = doc->CreateElem(nsDependentAtomString(aName), nsnull, kNameSpaceID_None, PR_FALSE, getter_AddRefs(elem)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIContent> text; rv = NS_NewTextNode(getter_AddRefs(text), doc->NodeInfoManager()); NS_ENSURE_SUCCESS(rv, rv); rv = text->SetText(aValue, PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); rv = elem->AppendChildTo(text, PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); rv = aResultHolder->AppendChildTo(elem, PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); nsAutoPtr<txXPathNode> xpathNode( txXPathNativeNode::createXPathNode(elem, PR_TRUE)); NS_ENSURE_TRUE(xpathNode, NS_ERROR_OUT_OF_MEMORY); aResultSet->append(*xpathNode); return NS_OK; }
nsresult nsTextControlFrame::UpdateValueDisplay(PRBool aNotify, PRBool aBeforeEditorInit, const nsAString *aValue) { if (!IsSingleLineTextControl()) // textareas don't use this return NS_OK; nsCOMPtr<nsITextControlElement> txtCtrl = do_QueryInterface(GetContent()); NS_ASSERTION(txtCtrl, "Content not a text control element"); nsIContent* rootNode = txtCtrl->GetRootEditorNode(); NS_PRECONDITION(rootNode, "Must have a div content\n"); NS_PRECONDITION(!mUseEditor, "Do not call this after editor has been initialized"); NS_ASSERTION(!mUsePlaceholder || txtCtrl->GetPlaceholderNode(), "A placeholder div must exist"); nsIContent *textContent = rootNode->GetChildAt(0); if (!textContent) { // Set up a textnode with our value nsCOMPtr<nsIContent> textNode; nsresult rv = NS_NewTextNode(getter_AddRefs(textNode), mContent->NodeInfo()->NodeInfoManager()); NS_ENSURE_SUCCESS(rv, rv); NS_ASSERTION(textNode, "Must have textcontent!\n"); rootNode->AppendChildTo(textNode, aNotify); textContent = textNode; } NS_ENSURE_TRUE(textContent, NS_ERROR_UNEXPECTED); // Get the current value of the textfield from the content. nsAutoString value; if (aValue) { value = *aValue; } else { txtCtrl->GetTextEditorValue(value, PR_TRUE); } // Update the display of the placeholder value if needed. // We don't need to do this if we're about to initialize the // editor, since EnsureEditorInitialized takes care of this. if (mUsePlaceholder && !aBeforeEditorInit) { nsWeakFrame weakFrame(this); txtCtrl->SetPlaceholderClass(value.IsEmpty(), aNotify); NS_ENSURE_STATE(weakFrame.IsAlive()); } if (aBeforeEditorInit && value.IsEmpty()) { rootNode->RemoveChildAt(0, PR_TRUE); return NS_OK; } if (!value.IsEmpty() && IsPasswordTextControl()) { nsTextEditRules::FillBufWithPWChars(&value, value.Length()); } return textContent->SetText(value, aNotify); }
nsresult nsComboboxControlFrame::CreateAnonymousContent(nsTArray<nsIContent*>& aElements) { // The frames used to display the combo box and the button used to popup the dropdown list // are created through anonymous content. The dropdown list is not created through anonymous // content because it's frame is initialized specifically for the drop-down case and it is placed // a special list referenced through NS_COMBO_FRAME_POPUP_LIST_INDEX to keep separate from the // layout of the display and button. // // Note: The value attribute of the display content is set when an item is selected in the dropdown list. // If the content specified below does not honor the value attribute than nothing will be displayed. // For now the content that is created corresponds to two input buttons. It would be better to create the // tag as something other than input, but then there isn't any way to create a button frame since it // isn't possible to set the display type in CSS2 to create a button frame. // create content used for display //nsIAtom* tag = NS_NewAtom("mozcombodisplay"); // Add a child text content node for the label nsNodeInfoManager *nimgr = mContent->NodeInfo()->NodeInfoManager(); NS_NewTextNode(getter_AddRefs(mDisplayContent), nimgr); if (!mDisplayContent) return NS_ERROR_OUT_OF_MEMORY; // set the value of the text node mDisplayedIndex = mListControlFrame->GetSelectedIndex(); if (mDisplayedIndex != -1) { mListControlFrame->GetOptionText(mDisplayedIndex, mDisplayedOptionText); } ActuallyDisplayText(PR_FALSE); if (!aElements.AppendElement(mDisplayContent)) return NS_ERROR_OUT_OF_MEMORY; nsCOMPtr<nsINodeInfo> nodeInfo; nodeInfo = nimgr->GetNodeInfo(nsGkAtoms::input, nsnull, kNameSpaceID_XHTML); // create button which drops the list down NS_NewHTMLElement(getter_AddRefs(mButtonContent), nodeInfo, PR_FALSE); if (!mButtonContent) return NS_ERROR_OUT_OF_MEMORY; // make someone to listen to the button. If its pressed by someone like Accessibility // then open or close the combo box. mButtonListener = new nsComboButtonListener(this); if (!mButtonListener) return NS_ERROR_OUT_OF_MEMORY; mButtonContent->AddEventListenerByIID(mButtonListener, NS_GET_IID(nsIDOMMouseListener)); mButtonContent->SetAttr(kNameSpaceID_None, nsGkAtoms::type, NS_LITERAL_STRING("button"), PR_FALSE); // Set tabindex="-1" so that the button is not tabbable mButtonContent->SetAttr(kNameSpaceID_None, nsGkAtoms::tabindex, NS_LITERAL_STRING("-1"), PR_FALSE); if (!aElements.AppendElement(mButtonContent)) return NS_ERROR_OUT_OF_MEMORY; return NS_OK; }