NS_IMETHODIMP nsContentDLF::CreateBlankDocument(nsILoadGroup *aLoadGroup, nsIPrincipal* aPrincipal, nsIDocument **aDocument) { *aDocument = nullptr; nsresult rv = NS_ERROR_FAILURE; // create a new blank HTML document nsCOMPtr<nsIDocument> blankDoc(do_CreateInstance(kHTMLDocumentCID)); if (blankDoc) { // initialize nsCOMPtr<nsIURI> uri; NS_NewURI(getter_AddRefs(uri), NS_LITERAL_CSTRING("about:blank")); if (uri) { blankDoc->ResetToURI(uri, aLoadGroup, aPrincipal); rv = NS_OK; } } // add some simple content structure if (NS_SUCCEEDED(rv)) { rv = NS_ERROR_FAILURE; nsNodeInfoManager *nim = blankDoc->NodeInfoManager(); nsCOMPtr<nsINodeInfo> htmlNodeInfo; // generate an html html element htmlNodeInfo = nim->GetNodeInfo(nsGkAtoms::html, 0, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); nsCOMPtr<nsIContent> htmlElement = NS_NewHTMLHtmlElement(htmlNodeInfo.forget()); // generate an html head element htmlNodeInfo = nim->GetNodeInfo(nsGkAtoms::head, 0, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); nsCOMPtr<nsIContent> headElement = NS_NewHTMLHeadElement(htmlNodeInfo.forget()); // generate an html body elemment htmlNodeInfo = nim->GetNodeInfo(nsGkAtoms::body, 0, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); nsCOMPtr<nsIContent> bodyElement = NS_NewHTMLBodyElement(htmlNodeInfo.forget()); // blat in the structure if (htmlElement && headElement && bodyElement) { NS_ASSERTION(blankDoc->GetChildCount() == 0, "Shouldn't have children"); rv = blankDoc->AppendChildTo(htmlElement, false); if (NS_SUCCEEDED(rv)) { rv = htmlElement->AppendChildTo(headElement, false); if (NS_SUCCEEDED(rv)) { // XXXbz Why not notifying here? htmlElement->AppendChildTo(bodyElement, false); } } } } // add a nice bow if (NS_SUCCEEDED(rv)) { blankDoc->SetDocumentCharacterSetSource(kCharsetFromDocTypeDefault); blankDoc->SetDocumentCharacterSet(NS_LITERAL_CSTRING("UTF-8")); *aDocument = blankDoc; NS_ADDREF(*aDocument); } return rv; }
nsresult MediaDocument::CreateSyntheticDocument() { // Synthesize an empty html document nsresult rv; nsCOMPtr<nsINodeInfo> nodeInfo; nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::html, nsnull, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); nsRefPtr<nsGenericHTMLElement> root = NS_NewHTMLHtmlElement(nodeInfo.forget()); if (!root) { return NS_ERROR_OUT_OF_MEMORY; } NS_ASSERTION(GetChildCount() == 0, "Shouldn't have any kids"); rv = AppendChildTo(root, PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::head, nsnull, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); // Create a <head> so our title has somewhere to live nsRefPtr<nsGenericHTMLElement> head = NS_NewHTMLHeadElement(nodeInfo.forget()); if (!head) { return NS_ERROR_OUT_OF_MEMORY; } nsCOMPtr<nsINodeInfo> nodeInfoMeta; nodeInfoMeta = mNodeInfoManager->GetNodeInfo(nsGkAtoms::meta, nsnull, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfoMeta, NS_ERROR_OUT_OF_MEMORY); nsRefPtr<nsGenericHTMLElement> metaContent = NS_NewHTMLMetaElement(nodeInfoMeta.forget()); if (!metaContent) { return NS_ERROR_OUT_OF_MEMORY; } metaContent->SetAttr(kNameSpaceID_None, nsGkAtoms::name, NS_LITERAL_STRING("viewport"), PR_TRUE); metaContent->SetAttr(kNameSpaceID_None, nsGkAtoms::content, NS_LITERAL_STRING("width=device-width; height=device-height;"), PR_TRUE); head->AppendChildTo(metaContent, PR_FALSE); root->AppendChildTo(head, PR_FALSE); nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::body, nsnull, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE); NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY); nsRefPtr<nsGenericHTMLElement> body = NS_NewHTMLBodyElement(nodeInfo.forget()); if (!body) { return NS_ERROR_OUT_OF_MEMORY; } root->AppendChildTo(body, PR_FALSE); return NS_OK; }