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; }
nsresult nsProgressFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements) { // Get the NodeInfoManager and tag necessary to create the progress bar div. nsCOMPtr<nsIDocument> doc = mContent->GetDocument(); nsCOMPtr<nsINodeInfo> nodeInfo; nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::div, nsnull, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); // Create the div. nsresult rv = NS_NewHTMLElement(getter_AddRefs(mBarDiv), nodeInfo.forget(), mozilla::dom::NOT_FROM_PARSER); NS_ENSURE_SUCCESS(rv, rv); // Associate ::-moz-progress-bar pseudo-element to the anonymous child. nsCSSPseudoElements::Type pseudoType = nsCSSPseudoElements::ePseudo_mozProgressBar; nsRefPtr<nsStyleContext> newStyleContext = PresContext()->StyleSet()-> ResolvePseudoElementStyle(mContent->AsElement(), pseudoType, GetStyleContext()); if (!aElements.AppendElement(ContentInfo(mBarDiv, newStyleContext))) { return NS_ERROR_OUT_OF_MEMORY; } return NS_OK; }
// Create the color area for the button. // The frame will be generated by the frame constructor. nsresult nsColorControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements) { nsCOMPtr<nsIDocument> doc = mContent->GetCurrentDoc(); nsCOMPtr<nsINodeInfo> nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::div, nullptr, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); nsresult rv = NS_NewHTMLElement(getter_AddRefs(mColorContent), nodeInfo.forget(), mozilla::dom::NOT_FROM_PARSER); NS_ENSURE_SUCCESS(rv, rv); // Mark the element to be native anonymous before setting any attributes. mColorContent->SetIsNativeAnonymousRoot(); rv = UpdateColor(); NS_ENSURE_SUCCESS(rv, rv); nsCSSPseudoElements::Type pseudoType = nsCSSPseudoElements::ePseudo_mozColorSwatch; nsRefPtr<nsStyleContext> newStyleContext = PresContext()->StyleSet()-> ResolvePseudoElementStyle(mContent->AsElement(), pseudoType, StyleContext(), mColorContent->AsElement()); if (!aElements.AppendElement(ContentInfo(mColorContent, newStyleContext))) { return NS_ERROR_OUT_OF_MEMORY; } return NS_OK; }
/** * When creating a isindex element, we should create a nsHTMLElement if the html5 * parser is enabled. Otherwise, a nsHTMLSharedElement should be created. */ nsGenericHTMLElement* NS_NewHTMLIsIndexElement(already_AddRefed<nsINodeInfo> aNodeInfo, mozilla::dom::FromParser aFromParser) { if (nsHtml5Module::sEnabled) { return NS_NewHTMLElement(aNodeInfo, aFromParser); } else { return NS_NewHTMLSharedElement(aNodeInfo, aFromParser); } }
nsresult txMozillaXMLOutput::createHTMLElement(nsIAtom* aName, nsIContent** aResult) { NS_ASSERTION(mOutputFormat.mMethod == eHTMLOutput, "need to adjust createHTMLElement"); *aResult = nsnull; nsCOMPtr<nsINodeInfo> ni; ni = mNodeInfoManager->GetNodeInfo(aName, nsnull, kNameSpaceID_XHTML); NS_ENSURE_TRUE(ni, NS_ERROR_OUT_OF_MEMORY); return NS_NewHTMLElement(aResult, ni.forget(), PR_FALSE); }
nsresult NS_NewElement(nsIContent** aResult, PRInt32 aElementType, already_AddRefed<nsINodeInfo> aNodeInfo, PRUint32 aFromParser) { if (aElementType == kNameSpaceID_XHTML) { return NS_NewHTMLElement(aResult, aNodeInfo, aFromParser); } #ifdef MOZ_XUL if (aElementType == kNameSpaceID_XUL) { return NS_NewXULElement(aResult, aNodeInfo); } #endif #ifdef MOZ_MATHML if (aElementType == kNameSpaceID_MathML) { return NS_NewMathMLElement(aResult, aNodeInfo); } #endif #ifdef MOZ_SVG if (aElementType == kNameSpaceID_SVG && NS_SVGEnabled()) { return NS_NewSVGElement(aResult, aNodeInfo, aFromParser); } #endif if (aElementType == kNameSpaceID_XMLEvents) { return NS_NewXMLEventsElement(aResult, aNodeInfo); } #ifdef MOZ_XTF if (aElementType > kNameSpaceID_LastBuiltin) { nsIXTFService* xtfService = nsContentUtils::GetXTFService(); NS_ASSERTION(xtfService, "could not get xtf service"); if (xtfService && NS_SUCCEEDED(xtfService->CreateElement(aResult, aNodeInfo))) return NS_OK; } #endif return NS_NewXMLElement(aResult, aNodeInfo); }
nsresult nsFileControlFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements) { // Get the NodeInfoManager and tag necessary to create input elements nsCOMPtr<nsIDocument> doc = mContent->GetDocument(); nsCOMPtr<nsINodeInfo> nodeInfo; nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::input, nullptr, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); // Create the text content NS_NewHTMLElement(getter_AddRefs(mTextContent), nodeInfo.forget(), dom::NOT_FROM_PARSER); if (!mTextContent) return NS_ERROR_OUT_OF_MEMORY; // Mark the element to be native anonymous before setting any attributes. mTextContent->SetNativeAnonymous(); mTextContent->SetAttr(kNameSpaceID_None, nsGkAtoms::type, NS_LITERAL_STRING("text"), false); nsHTMLInputElement* inputElement = nsHTMLInputElement::FromContent(mContent); NS_ASSERTION(inputElement, "Why is our content not a <input>?"); // Initialize value when we create the content in case the value was set // before we got here nsAutoString value; inputElement->GetDisplayFileName(value); nsCOMPtr<nsIDOMHTMLInputElement> textControl = do_QueryInterface(mTextContent); NS_ASSERTION(textControl, "Why is the <input> we created not a <input>?"); textControl->SetValue(value); textControl->SetTabIndex(-1); textControl->SetReadOnly(true); if (!aElements.AppendElement(mTextContent)) return NS_ERROR_OUT_OF_MEMORY; // Register the whole frame as an event listener of drag events mContent->AddSystemEventListener(NS_LITERAL_STRING("drop"), mMouseListener, false); mContent->AddSystemEventListener(NS_LITERAL_STRING("dragover"), mMouseListener, false); // Register as an event listener of the textbox // to open file dialog on mouse click mTextContent->AddSystemEventListener(NS_LITERAL_STRING("click"), mMouseListener, false); // Create the browse button nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::input, nullptr, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); NS_NewHTMLElement(getter_AddRefs(mBrowse), nodeInfo.forget(), dom::NOT_FROM_PARSER); if (!mBrowse) return NS_ERROR_OUT_OF_MEMORY; // Mark the element to be native anonymous before setting any attributes. mBrowse->SetNativeAnonymous(); mBrowse->SetAttr(kNameSpaceID_None, nsGkAtoms::type, NS_LITERAL_STRING("button"), false); // Create the capture button nsCOMPtr<nsICapturePicker> capturePicker; capturePicker = do_GetService("@mozilla.org/capturepicker;1"); if (capturePicker) { CaptureCallbackData data; data.picker = capturePicker; data.mode = GetCaptureMode(data); if (data.mode != 0) { mCaptureMouseListener->mMode = data.mode; nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::input, nullptr, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); NS_NewHTMLElement(getter_AddRefs(mCapture), nodeInfo.forget(), dom::NOT_FROM_PARSER); if (!mCapture) return NS_ERROR_OUT_OF_MEMORY; // Mark the element to be native anonymous before setting any attributes. mCapture->SetNativeAnonymous(); mCapture->SetAttr(kNameSpaceID_None, nsGkAtoms::type, NS_LITERAL_STRING("button"), false); mCapture->SetAttr(kNameSpaceID_None, nsGkAtoms::value, NS_LITERAL_STRING("capture"), false); mCapture->AddSystemEventListener(NS_LITERAL_STRING("click"), mCaptureMouseListener, false); } } nsCOMPtr<nsIDOMHTMLInputElement> fileContent = do_QueryInterface(mContent); nsCOMPtr<nsIDOMHTMLInputElement> browseControl = do_QueryInterface(mBrowse); if (fileContent && browseControl) { int32_t tabIndex; nsAutoString accessKey; fileContent->GetAccessKey(accessKey); browseControl->SetAccessKey(accessKey); fileContent->GetTabIndex(&tabIndex); browseControl->SetTabIndex(tabIndex); } if (!aElements.AppendElement(mBrowse)) return NS_ERROR_OUT_OF_MEMORY; if (mCapture && !aElements.AppendElement(mCapture)) return NS_ERROR_OUT_OF_MEMORY; // Register as an event listener of the button // to open file dialog on mouse click mBrowse->AddSystemEventListener(NS_LITERAL_STRING("click"), mMouseListener, false); SyncAttr(kNameSpaceID_None, nsGkAtoms::size, SYNC_TEXT); SyncDisabledState(); return NS_OK; }
nsresult PluginDocument::CreateSyntheticPluginDocument() { NS_ASSERTION(!GetShell() || !GetShell()->DidInitialize(), "Creating synthetic plugin document content too late"); // make our generic document nsresult rv = MediaDocument::CreateSyntheticDocument(); NS_ENSURE_SUCCESS(rv, rv); // then attach our plugin Element* body = GetBodyElement(); if (!body) { NS_WARNING("no body on plugin document!"); return NS_ERROR_FAILURE; } // remove margins from body NS_NAMED_LITERAL_STRING(zero, "0"); body->SetAttr(kNameSpaceID_None, nsGkAtoms::marginwidth, zero, false); body->SetAttr(kNameSpaceID_None, nsGkAtoms::marginheight, zero, false); // make plugin content RefPtr<mozilla::dom::NodeInfo> nodeInfo; nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::embed, nullptr, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); rv = NS_NewHTMLElement(getter_AddRefs(mPluginContent), nodeInfo.forget(), NOT_FROM_PARSER); NS_ENSURE_SUCCESS(rv, rv); // make it a named element mPluginContent->SetAttr(kNameSpaceID_None, nsGkAtoms::name, NS_LITERAL_STRING("plugin"), false); // fill viewport and auto-resize NS_NAMED_LITERAL_STRING(percent100, "100%"); mPluginContent->SetAttr(kNameSpaceID_None, nsGkAtoms::width, percent100, false); mPluginContent->SetAttr(kNameSpaceID_None, nsGkAtoms::height, percent100, false); // set URL nsAutoCString src; mDocumentURI->GetSpec(src); mPluginContent->SetAttr(kNameSpaceID_None, nsGkAtoms::src, NS_ConvertUTF8toUTF16(src), false); // set mime type mPluginContent->SetAttr(kNameSpaceID_None, nsGkAtoms::type, NS_ConvertUTF8toUTF16(mMimeType), false); // nsHTML(Shared)ObjectElement does not kick off a load on BindToTree if it is // to a PluginDocument body->AppendChildTo(mPluginContent, false); return NS_OK; }
nsresult PluginDocument::CreateSyntheticPluginDocument() { NS_ASSERTION(!GetShell() || !GetShell()->DidInitialReflow(), "Creating synthetic plugin document content too late"); // make our generic document nsresult rv = MediaDocument::CreateSyntheticDocument(); NS_ENSURE_SUCCESS(rv, rv); // then attach our plugin Element* body = GetBodyElement(); if (!body) { NS_WARNING("no body on plugin document!"); return NS_ERROR_FAILURE; } // remove margins from body NS_NAMED_LITERAL_STRING(zero, "0"); body->SetAttr(kNameSpaceID_None, nsGkAtoms::marginwidth, zero, PR_FALSE); body->SetAttr(kNameSpaceID_None, nsGkAtoms::marginheight, zero, PR_FALSE); // make plugin content nsCOMPtr<nsINodeInfo> nodeInfo; nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::embed, nsnull, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); rv = NS_NewHTMLElement(getter_AddRefs(mPluginContent), nodeInfo.forget(), NOT_FROM_PARSER); NS_ENSURE_SUCCESS(rv, rv); // make it a named element mPluginContent->SetAttr(kNameSpaceID_None, nsGkAtoms::name, NS_LITERAL_STRING("plugin"), PR_FALSE); // fill viewport and auto-resize NS_NAMED_LITERAL_STRING(percent100, "100%"); mPluginContent->SetAttr(kNameSpaceID_None, nsGkAtoms::width, percent100, PR_FALSE); mPluginContent->SetAttr(kNameSpaceID_None, nsGkAtoms::height, percent100, PR_FALSE); // set URL nsCAutoString src; mDocumentURI->GetSpec(src); mPluginContent->SetAttr(kNameSpaceID_None, nsGkAtoms::src, NS_ConvertUTF8toUTF16(src), PR_FALSE); // set mime type mPluginContent->SetAttr(kNameSpaceID_None, nsGkAtoms::type, NS_ConvertUTF8toUTF16(mMimeType), PR_FALSE); // This will not start the load because nsObjectLoadingContent checks whether // its document is an nsIPluginDocument body->AppendChildTo(mPluginContent, PR_FALSE); return NS_OK; }
nsresult nsFileControlFrame::CreateAnonymousContent(nsTArray<nsIContent*>& aElements) { // Get the NodeInfoManager and tag necessary to create input elements nsCOMPtr<nsIDocument> doc = mContent->GetDocument(); nsCOMPtr<nsINodeInfo> nodeInfo; doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::input, nsnull, kNameSpaceID_None, getter_AddRefs(nodeInfo)); // Create the text content NS_NewHTMLElement(getter_AddRefs(mTextContent), nodeInfo, PR_FALSE); if (!mTextContent) return NS_ERROR_OUT_OF_MEMORY; mTextContent->SetAttr(kNameSpaceID_None, nsGkAtoms::type, NS_LITERAL_STRING("text"), PR_FALSE); nsCOMPtr<nsIDOMHTMLInputElement> textControl = do_QueryInterface(mTextContent); if (textControl) { nsCOMPtr<nsIFileControlElement> fileControl = do_QueryInterface(mContent); if (fileControl) { // Initialize value when we create the content in case the value was set // before we got here nsAutoString value; fileControl->GetFileName(value); textControl->SetValue(value); } textControl->SetTabIndex(-1); textControl->SetReadOnly(PR_TRUE); } if (!aElements.AppendElement(mTextContent)) return NS_ERROR_OUT_OF_MEMORY; NS_NAMED_LITERAL_STRING(click, "click"); nsCOMPtr<nsIDOMEventGroup> systemGroup; mContent->GetSystemEventGroup(getter_AddRefs(systemGroup)); nsCOMPtr<nsIDOM3EventTarget> dom3TextContent = do_QueryInterface(mTextContent); NS_ENSURE_STATE(dom3TextContent); // Register as an event listener of the textbox // to open file dialog on mouse click dom3TextContent->AddGroupedEventListener(click, mMouseListener, PR_FALSE, systemGroup); // Create the browse button NS_NewHTMLElement(getter_AddRefs(mBrowse), nodeInfo, PR_FALSE); if (!mBrowse) return NS_ERROR_OUT_OF_MEMORY; mBrowse->SetAttr(kNameSpaceID_None, nsGkAtoms::type, NS_LITERAL_STRING("button"), PR_FALSE); nsCOMPtr<nsIDOMHTMLInputElement> fileContent = do_QueryInterface(mContent); nsCOMPtr<nsIDOMHTMLInputElement> browseControl = do_QueryInterface(mBrowse); if (fileContent && browseControl) { PRInt32 tabIndex; nsAutoString accessKey; fileContent->GetAccessKey(accessKey); browseControl->SetAccessKey(accessKey); fileContent->GetTabIndex(&tabIndex); browseControl->SetTabIndex(tabIndex); } if (!aElements.AppendElement(mBrowse)) return NS_ERROR_OUT_OF_MEMORY; nsCOMPtr<nsIDOM3EventTarget> dom3Browse = do_QueryInterface(mBrowse); NS_ENSURE_STATE(dom3Browse); // Register as an event listener of the button // to open file dialog on mouse click dom3Browse->AddGroupedEventListener(click, mMouseListener, PR_FALSE, systemGroup); SyncAttr(kNameSpaceID_None, nsGkAtoms::size, SYNC_TEXT); SyncAttr(kNameSpaceID_None, nsGkAtoms::disabled, SYNC_BOTH); return NS_OK; }
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; }