void HTMLTextAreaElement::GetSelectionDirection(nsAString& aDirection, ErrorResult& aError) { nsresult rv = NS_ERROR_FAILURE; nsIFormControlFrame* formControlFrame = GetFormControlFrame(true); if (formControlFrame) { nsITextControlFrame* textControlFrame = do_QueryFrame(formControlFrame); if (textControlFrame) { nsITextControlFrame::SelectionDirection dir; rv = textControlFrame->GetSelectionRange(nullptr, nullptr, &dir); if (NS_SUCCEEDED(rv)) { DirectionToName(dir, aDirection); } } } if (NS_FAILED(rv)) { if (mState.IsSelectionCached()) { DirectionToName(mState.GetSelectionProperties().mDirection, aDirection); return; } aError.Throw(rv); } }
void HTMLTextAreaElement::SetSelectionRange(uint32_t aSelectionStart, uint32_t aSelectionEnd, const Optional<nsAString>& aDirection, ErrorResult& aError) { nsresult rv = NS_ERROR_FAILURE; nsIFormControlFrame* formControlFrame = GetFormControlFrame(true); nsITextControlFrame* textControlFrame = do_QueryFrame(formControlFrame); if (textControlFrame) { // Default to forward, even if not specified. // Note that we don't currently support directionless selections, so // "none" is treated like "forward". nsITextControlFrame::SelectionDirection dir = nsITextControlFrame::eForward; if (aDirection.WasPassed() && aDirection.Value().EqualsLiteral("backward")) { dir = nsITextControlFrame::eBackward; } rv = textControlFrame->SetSelectionRange(aSelectionStart, aSelectionEnd, dir); if (NS_SUCCEEDED(rv)) { rv = textControlFrame->ScrollSelectionIntoView(); nsRefPtr<AsyncEventDispatcher> asyncDispatcher = new AsyncEventDispatcher(this, NS_LITERAL_STRING("select"), true, false); asyncDispatcher->PostDOMEvent(); } } if (NS_FAILED(rv)) { aError.Throw(rv); } }
bool HTMLTextAreaElement::IsDisabledForEvents(uint32_t aMessage) { nsIFormControlFrame* formControlFrame = GetFormControlFrame(false); nsIFrame* formFrame = do_QueryFrame(formControlFrame); return IsElementDisabledForEvents(aMessage, formFrame); }
bool HTMLButtonElement::IsDisabledForEvents(EventMessage aMessage) { nsIFormControlFrame* formControlFrame = GetFormControlFrame(false); nsIFrame* formFrame = do_QueryFrame(formControlFrame); return IsElementDisabledForEvents(aMessage, formFrame); }
nsresult nsHTMLTextAreaElement::PreHandleEvent(nsEventChainPreVisitor& aVisitor) { // Do not process any DOM events if the element is disabled aVisitor.mCanHandle = PR_FALSE; PRBool disabled; nsresult rv = GetDisabled(&disabled); if (NS_FAILED(rv) || disabled) { return rv; } nsIFormControlFrame* formControlFrame = GetFormControlFrame(PR_FALSE); nsIFrame* formFrame = nsnull; if (formControlFrame && (formFrame = do_QueryFrame(formControlFrame))) { const nsStyleUserInterface* uiStyle = formFrame->GetStyleUserInterface(); if (uiStyle->mUserInput == NS_STYLE_USER_INPUT_NONE || uiStyle->mUserInput == NS_STYLE_USER_INPUT_DISABLED) { return NS_OK; } } // Don't dispatch a second select event if we are already handling // one. if (aVisitor.mEvent->message == NS_FORM_SELECTED) { if (mHandlingSelect) { return NS_OK; } mHandlingSelect = PR_TRUE; } // If NS_EVENT_FLAG_NO_CONTENT_DISPATCH is set we will not allow content to handle // this event. But to allow middle mouse button paste to work we must allow // middle clicks to go to text fields anyway. if (aVisitor.mEvent->flags & NS_EVENT_FLAG_NO_CONTENT_DISPATCH) aVisitor.mItemFlags |= NS_NO_CONTENT_DISPATCH; if (aVisitor.mEvent->message == NS_MOUSE_CLICK && aVisitor.mEvent->eventStructType == NS_MOUSE_EVENT && static_cast<nsMouseEvent*>(aVisitor.mEvent)->button == nsMouseEvent::eMiddleButton) { aVisitor.mEvent->flags &= ~NS_EVENT_FLAG_NO_CONTENT_DISPATCH; } // Fire onchange (if necessary), before we do the blur, bug 370521. if (aVisitor.mEvent->message == NS_BLUR_CONTENT) { nsIFrame* primaryFrame = GetPrimaryFrame(); if (primaryFrame) { nsITextControlFrame* textFrame = do_QueryFrame(primaryFrame); if (textFrame) { textFrame->CheckFireOnChange(); } } } return nsGenericHTMLFormElement::PreHandleEvent(aVisitor); }
NS_IMETHODIMP HTMLTextAreaElement::SelectAll(nsPresContext* aPresContext) { nsIFormControlFrame* formControlFrame = GetFormControlFrame(true); if (formControlFrame) { formControlFrame->SetFormProperty(nsGkAtoms::select, EmptyString()); } return NS_OK; }
nsresult HTMLTextAreaElement::GetSelectionRange(int32_t* aSelectionStart, int32_t* aSelectionEnd) { nsIFormControlFrame* formControlFrame = GetFormControlFrame(true); nsITextControlFrame* textControlFrame = do_QueryFrame(formControlFrame); if (textControlFrame) { return textControlFrame->GetSelectionRange(aSelectionStart, aSelectionEnd); } return NS_ERROR_FAILURE; }
NS_IMETHODIMP nsHTMLTextAreaElement::SetSelectionRange(PRInt32 aSelectionStart, PRInt32 aSelectionEnd) { nsresult rv = NS_ERROR_FAILURE; nsIFormControlFrame* formControlFrame = GetFormControlFrame(PR_TRUE); if (formControlFrame) { nsITextControlFrame* textControlFrame = do_QueryFrame(formControlFrame); if (textControlFrame) rv = textControlFrame->SetSelectionRange(aSelectionStart, aSelectionEnd); } return rv; }
nsresult nsHTMLTextAreaElement::Reset() { nsresult rv; // If the frame is there, we have to set the value so that it will show up. nsIFormControlFrame* formControlFrame = GetFormControlFrame(PR_FALSE); if (formControlFrame) { nsAutoString resetVal; GetDefaultValue(resetVal); rv = SetValue(resetVal); NS_ENSURE_SUCCESS(rv, rv); } SetValueChanged(PR_FALSE); return NS_OK; }
nsresult nsHTMLTextAreaElement::SetValueInternal(const nsAString& aValue, nsITextControlFrame* aFrame, PRBool aUserInput) { nsITextControlFrame* textControlFrame = aFrame; nsIFormControlFrame* formControlFrame = textControlFrame; if (!textControlFrame) { // No need to flush here, if there is no frame for this yet forcing // creation of one will not do us any good formControlFrame = GetFormControlFrame(PR_FALSE); if (formControlFrame) { textControlFrame = do_QueryFrame(formControlFrame); } } PRBool frameOwnsValue = PR_FALSE; if (textControlFrame) { textControlFrame->OwnsValue(&frameOwnsValue); } if (frameOwnsValue) { formControlFrame->SetFormProperty( aUserInput ? nsGkAtoms::userInput : nsGkAtoms::value, aValue); } else { if (mValue) { nsMemory::Free(mValue); } mValue = ToNewUTF8String(aValue); NS_ENSURE_TRUE(mValue, NS_ERROR_OUT_OF_MEMORY); SetValueChanged(PR_TRUE); } return NS_OK; }
bool HTMLTextAreaElement::IsDisabledForEvents(WidgetEvent* aEvent) { nsIFormControlFrame* formControlFrame = GetFormControlFrame(false); nsIFrame* formFrame = do_QueryFrame(formControlFrame); return IsElementDisabledForEvents(aEvent, formFrame); }