NS_IMETHODIMP nsFileControlFrame::AttributeChanged(int32_t aNameSpaceID, nsIAtom* aAttribute, int32_t aModType) { if (aNameSpaceID == kNameSpaceID_None) { if (aAttribute == nsGkAtoms::size) { SyncAttr(aNameSpaceID, aAttribute, SYNC_TEXT); } else if (aAttribute == nsGkAtoms::tabindex) { SyncAttr(aNameSpaceID, aAttribute, SYNC_BUTTON); } } return nsBlockFrame::AttributeChanged(aNameSpaceID, aAttribute, aModType); }
NS_IMETHODIMP nsFileControlFrame::AttributeChanged(PRInt32 aNameSpaceID, nsIAtom* aAttribute, PRInt32 aModType) { // propagate disabled to text / button inputs if (aNameSpaceID == kNameSpaceID_None && aAttribute == nsGkAtoms::disabled) { SyncAttr(aNameSpaceID, aAttribute, SYNC_BOTH); // propagate size to text } else if (aNameSpaceID == kNameSpaceID_None && aAttribute == nsGkAtoms::size) { SyncAttr(aNameSpaceID, aAttribute, SYNC_TEXT); } return nsAreaFrame::AttributeChanged(aNameSpaceID, aAttribute, aModType); }
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 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; }