/** * This is called when we receive any registered events on the control. * We've only registered for drop, dragover and click events. */ NS_IMETHODIMP nsFileControlFrame::BrowseMouseListener::HandleEvent(nsIDOMEvent* aEvent) { NS_ASSERTION(mFrame, "We should have been unregistered"); nsAutoString eventType; aEvent->GetType(eventType); if (eventType.EqualsLiteral("click")) { if (!ShouldProcessMouseClick(aEvent)) return NS_OK; nsHTMLInputElement* input = nsHTMLInputElement::FromContent(mFrame->GetContent()); return input ? input->FireAsyncClickHandler() : NS_OK; } bool defaultPrevented = false; aEvent->GetPreventDefault(&defaultPrevented); if (defaultPrevented) { return NS_OK; } nsCOMPtr<nsIDOMDragEvent> dragEvent = do_QueryInterface(aEvent); if (!dragEvent || !IsValidDropData(dragEvent)) { return NS_OK; } if (eventType.EqualsLiteral("dragover")) { // Prevent default if we can accept this drag data aEvent->PreventDefault(); return NS_OK; } if (eventType.EqualsLiteral("drop")) { aEvent->StopPropagation(); aEvent->PreventDefault(); nsIContent* content = mFrame->GetContent(); NS_ASSERTION(content, "The frame has no content???"); nsHTMLInputElement* inputElement = nsHTMLInputElement::FromContent(content); NS_ASSERTION(inputElement, "No input element for this file upload control frame!"); nsCOMPtr<nsIDOMDataTransfer> dataTransfer; dragEvent->GetDataTransfer(getter_AddRefs(dataTransfer)); nsCOMPtr<nsIDOMFileList> fileList; dataTransfer->GetFiles(getter_AddRefs(fileList)); inputElement->SetFiles(fileList, true); inputElement->FireChangeEventIfNeeded(); } return NS_OK; }
/** * This is called when our browse button is clicked */ NS_IMETHODIMP nsFileControlFrame::BrowseMouseListener::MouseClick(nsIDOMEvent* aMouseEvent) { NS_ASSERTION(mFrame, "We should have been unregistered"); if (!ShouldProcessMouseClick(aMouseEvent)) return NS_OK; nsHTMLInputElement* input = nsHTMLInputElement::FromContent(mFrame->GetContent()); return input ? input->FireAsyncClickHandler() : NS_OK; }
/** * This is called when our capture button is clicked */ NS_IMETHODIMP nsFileControlFrame::CaptureMouseListener::HandleEvent(nsIDOMEvent* aMouseEvent) { nsresult rv; NS_ASSERTION(mFrame, "We should have been unregistered"); if (!ShouldProcessMouseClick(aMouseEvent)) return NS_OK; // Get parent nsPIDOMWindow object. nsIContent* content = mFrame->GetContent(); if (!content) return NS_ERROR_FAILURE; nsHTMLInputElement* inputElement = nsHTMLInputElement::FromContent(content); if (!inputElement) return NS_ERROR_FAILURE; nsCOMPtr<nsIDocument> doc = content->GetDocument(); if (!doc) return NS_ERROR_FAILURE; // Get Loc title nsXPIDLString title; nsContentUtils::GetLocalizedString(nsContentUtils::eFORMS_PROPERTIES, "MediaUpload", title); nsPIDOMWindow* win = doc->GetWindow(); if (!win) { return NS_ERROR_FAILURE; } nsCOMPtr<nsICapturePicker> capturePicker; capturePicker = do_CreateInstance("@mozilla.org/capturepicker;1"); if (!capturePicker) return NS_ERROR_FAILURE; rv = capturePicker->Init(win, title, mMode); NS_ENSURE_SUCCESS(rv, rv); // Show dialog uint32_t result; rv = capturePicker->Show(&result); NS_ENSURE_SUCCESS(rv, rv); if (result == nsICapturePicker::RETURN_CANCEL) return NS_OK; if (!mFrame) { // The frame got destroyed while the filepicker was up. Don't do // anything here. // (This listener itself can't be destroyed because the event listener // manager holds a strong reference to us while it fires the event.) return NS_OK; } nsCOMPtr<nsIDOMFile> domFile; rv = capturePicker->GetFile(getter_AddRefs(domFile)); NS_ENSURE_SUCCESS(rv, rv); nsCOMArray<nsIDOMFile> newFiles; if (domFile) { newFiles.AppendObject(domFile); } else { return NS_ERROR_FAILURE; } // XXXkhuey we really should have a better UI story than the tired old // uneditable text box with the file name inside. // Set new selected files if (newFiles.Count()) { // Tell our input element that this update of the value is a user // initiated change. Otherwise it'll think that the value is being set by // a script and not fire onchange when it should. inputElement->SetFiles(newFiles, true); // Should fire a change event here since the SetFiles() call above ensures // a different value from the mFocusedValue of the inputElement. inputElement->FireChangeEventIfNeeded(); } return NS_OK; }