nsresult MediaDocument::CreateSyntheticDocument() { MOZ_ASSERT(!InitialSetupHasBeenDone()); // Synthesize an empty html document nsresult rv; RefPtr<mozilla::dom::NodeInfo> nodeInfo; nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::html, nullptr, kNameSpaceID_XHTML, nsINode::ELEMENT_NODE); RefPtr<nsGenericHTMLElement> root = NS_NewHTMLHtmlElement(nodeInfo.forget()); NS_ENSURE_TRUE(root, NS_ERROR_OUT_OF_MEMORY); NS_ASSERTION(GetChildCount() == 0, "Shouldn't have any kids"); rv = AppendChildTo(root, false); NS_ENSURE_SUCCESS(rv, rv); nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::head, nullptr, kNameSpaceID_XHTML, nsINode::ELEMENT_NODE); // Create a <head> so our title has somewhere to live RefPtr<nsGenericHTMLElement> head = NS_NewHTMLHeadElement(nodeInfo.forget()); NS_ENSURE_TRUE(head, NS_ERROR_OUT_OF_MEMORY); nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::meta, nullptr, kNameSpaceID_XHTML, nsINode::ELEMENT_NODE); RefPtr<nsGenericHTMLElement> metaContent = NS_NewHTMLMetaElement(nodeInfo.forget()); NS_ENSURE_TRUE(metaContent, NS_ERROR_OUT_OF_MEMORY); metaContent->SetAttr(kNameSpaceID_None, nsGkAtoms::name, NS_LITERAL_STRING("viewport"), true); metaContent->SetAttr(kNameSpaceID_None, nsGkAtoms::content, NS_LITERAL_STRING("width=device-width; height=device-height;"), true); head->AppendChildTo(metaContent, false); root->AppendChildTo(head, false); nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::body, nullptr, kNameSpaceID_XHTML, nsINode::ELEMENT_NODE); RefPtr<nsGenericHTMLElement> body = NS_NewHTMLBodyElement(nodeInfo.forget()); NS_ENSURE_TRUE(body, NS_ERROR_OUT_OF_MEMORY); root->AppendChildTo(body, false); return NS_OK; }
static already_AddRefed<Element> MakeAnonButton(nsIDocument* aDoc, const char* labelKey, HTMLInputElement* aInputElement, const nsAString& aAccessKey) { RefPtr<Element> button = aDoc->CreateHTMLElement(nsGkAtoms::button); // NOTE: SetIsNativeAnonymousRoot() has to be called before setting any // attribute. button->SetIsNativeAnonymousRoot(); button->SetAttr(kNameSpaceID_None, nsGkAtoms::type, NS_LITERAL_STRING("button"), false); // Set the file picking button text depending on the current locale. nsXPIDLString buttonTxt; nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES, labelKey, buttonTxt); // Set the browse button text. It's a bit of a pain to do because we want to // make sure we are not notifying. RefPtr<nsTextNode> textContent = new nsTextNode(button->NodeInfo()->NodeInfoManager()); textContent->SetText(buttonTxt, false); nsresult rv = button->AppendChildTo(textContent, false); if (NS_FAILED(rv)) { return nullptr; } // Make sure access key and tab order for the element actually redirect to the // file picking button. RefPtr<HTMLButtonElement> buttonElement = HTMLButtonElement::FromContentOrNull(button); if (!aAccessKey.IsEmpty()) { buttonElement->SetAccessKey(aAccessKey); } // Both elements are given the same tab index so that the user can tab // to the file control at the correct index, and then between the two // buttons. int32_t tabIndex; aInputElement->GetTabIndex(&tabIndex); buttonElement->SetTabIndex(tabIndex); return button.forget(); }
already_AddRefed<HTMLOptionElement> HTMLOptionElement::Option(const GlobalObject& aGlobal, const Optional<nsAString>& aText, const Optional<nsAString>& aValue, const Optional<bool>& aDefaultSelected, const Optional<bool>& aSelected, ErrorResult& aError) { nsCOMPtr<nsPIDOMWindowInner> win = do_QueryInterface(aGlobal.GetAsSupports()); nsIDocument* doc; if (!win || !(doc = win->GetExtantDoc())) { aError.Throw(NS_ERROR_FAILURE); return nullptr; } already_AddRefed<mozilla::dom::NodeInfo> nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::option, nullptr, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); RefPtr<HTMLOptionElement> option = new HTMLOptionElement(nodeInfo); if (aText.WasPassed()) { // Create a new text node and append it to the option RefPtr<nsTextNode> textContent = new nsTextNode(option->NodeInfo()->NodeInfoManager()); textContent->SetText(aText.Value(), false); aError = option->AppendChildTo(textContent, false); if (aError.Failed()) { return nullptr; } if (aValue.WasPassed()) { // Set the value attribute for this element. We're calling SetAttr // directly because we want to pass aNotify == false. aError = option->SetAttr(kNameSpaceID_None, nsGkAtoms::value, aValue.Value(), false); if (aError.Failed()) { return nullptr; } if (aDefaultSelected.WasPassed()) { if (aDefaultSelected.Value()) { // We're calling SetAttr directly because we want to pass // aNotify == false. aError = option->SetAttr(kNameSpaceID_None, nsGkAtoms::selected, EmptyString(), false); if (aError.Failed()) { return nullptr; } } if (aSelected.WasPassed()) { option->SetSelected(aSelected.Value(), aError); if (aError.Failed()) { return nullptr; } } } } } return option.forget(); }