void SearchFieldCancelButtonElement::defaultEventHandler(Event* evt) { // If the element is visible, on mouseup, clear the value, and set selection HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode()); if (evt->type() == eventNames().mousedownEvent && evt->isMouseEvent() && static_cast<MouseEvent*>(evt)->button() == LeftButton) { input->focus(); input->select(); evt->setDefaultHandled(); if (renderer() && renderer()->visibleToHitTesting()) if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(this); m_capturing = true; } } else if (evt->type() == eventNames().mouseupEvent && evt->isMouseEvent() && static_cast<MouseEvent*>(evt)->button() == LeftButton) { if (m_capturing && renderer() && renderer()->visibleToHitTesting()) { if (hovered()) { input->setValue(""); input->onSearch(); evt->setDefaultHandled(); } if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(0); m_capturing = false; } } } if (!evt->defaultHandled()) HTMLDivElement::defaultEventHandler(evt); }
JSValue* JSHTMLInputElementPrototypeFunction::callAsFunction(ExecState* exec, JSObject* thisObj, const List& args) { if (!thisObj->inherits(&JSHTMLInputElement::info)) return throwError(exec, TypeError); HTMLInputElement* imp = static_cast<HTMLInputElement*>(static_cast<JSHTMLInputElement*>(thisObj)->impl()); switch (id) { case JSHTMLInputElement::BlurFuncNum: { imp->blur(); return jsUndefined(); } case JSHTMLInputElement::FocusFuncNum: { imp->focus(); return jsUndefined(); } case JSHTMLInputElement::SelectFuncNum: { imp->select(); return jsUndefined(); } case JSHTMLInputElement::ClickFuncNum: { imp->click(); return jsUndefined(); } } return 0; }
TEST_F(InputMethodControllerTest, BackspaceFromEndOfInput) { document().write("<input id='sample'>"); HTMLInputElement* input = toHTMLInputElement(document().getElementById("sample")); document().updateLayout(); input->focus(); input->setValue("fooX"); controller().setEditableSelectionOffsets(PlainTextRange(4, 4)); EXPECT_STREQ("fooX", input->value().utf8().data()); controller().extendSelectionAndDelete(1, 0); EXPECT_STREQ("foo", input->value().utf8().data()); input->setValue(String::fromUTF8("foo\xE2\x98\x85")); // U+2605 == "black star" controller().setEditableSelectionOffsets(PlainTextRange(4, 4)); EXPECT_STREQ("foo\xE2\x98\x85", input->value().utf8().data()); controller().extendSelectionAndDelete(1, 0); EXPECT_STREQ("foo", input->value().utf8().data()); input->setValue(String::fromUTF8("foo\xF0\x9F\x8F\x86")); // U+1F3C6 == "trophy" controller().setEditableSelectionOffsets(PlainTextRange(4, 4)); EXPECT_STREQ("foo\xF0\x9F\x8F\x86", input->value().utf8().data()); controller().extendSelectionAndDelete(1, 0); EXPECT_STREQ("foo", input->value().utf8().data()); input->setValue(String::fromUTF8("foo\xE0\xB8\x81\xE0\xB9\x89")); // composed U+0E01 "ka kai" + U+0E49 "mai tho" controller().setEditableSelectionOffsets(PlainTextRange(4, 4)); EXPECT_STREQ("foo\xE0\xB8\x81\xE0\xB9\x89", input->value().utf8().data()); controller().extendSelectionAndDelete(1, 0); EXPECT_STREQ("foo", input->value().utf8().data()); }
void InputFieldSpeechButtonElement::defaultEventHandler(Event* event) { // For privacy reasons, only allow clicks directly coming from the user. if (!event->fromUserGesture()) { HTMLDivElement::defaultEventHandler(event); return; } // On mouse down, select the text and set focus. HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode()); if (event->type() == eventNames().mousedownEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) { if (renderer() && renderer()->visibleToHitTesting()) { if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(this); m_capturing = true; } } // The call to focus() below dispatches a focus event, and an event handler in the page might // remove the input element from DOM. To make sure it remains valid until we finish our work // here, we take a temporary reference. RefPtr<HTMLInputElement> holdRef(input); input->focus(); input->select(); event->setDefaultHandled(); } // On mouse up, release capture cleanly. if (event->type() == eventNames().mouseupEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) { if (m_capturing && renderer() && renderer()->visibleToHitTesting()) { if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(0); m_capturing = false; } } } if (event->type() == eventNames().clickEvent) { switch (m_state) { case Idle: if (speechInput()->startRecognition(m_listenerId, input->renderer()->absoluteBoundingBoxRect())) setState(Recording); break; case Recording: speechInput()->stopRecording(m_listenerId); break; case Recognizing: // Nothing to do here, we will continue to wait for results. break; } event->setDefaultHandled(); } if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); }
void HTMLSearchFieldResultsButtonElement::defaultEventHandler(Event* evt) { // On mousedown, bring up a menu, if needed HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode()); if (evt->type() == mousedownEvent) { input->focus(); input->select(); evt->setDefaultHandled(); } if (!evt->defaultHandled()) HTMLDivElement::defaultEventHandler(evt); }
void SpinButtonElement::defaultEventHandler(Event* evt) { if (!evt->isMouseEvent()) { if (!evt->defaultHandled()) HTMLDivElement::defaultEventHandler(evt); return; } const MouseEvent* mevt = static_cast<MouseEvent*>(evt); if (mevt->button() != LeftButton) { if (!evt->defaultHandled()) HTMLDivElement::defaultEventHandler(evt); return; } HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode()); IntPoint local = roundedIntPoint(renderBox()->absoluteToLocal(mevt->absoluteLocation(), false, true)); if (evt->type() == eventNames().clickEvent) { if (renderBox()->borderBoxRect().contains(local)) { input->focus(); input->select(); if (local.y() < renderBox()->y() + renderBox()->height() / 2) input->stepUpFromRenderer(1); else input->stepUpFromRenderer(-1); evt->setDefaultHandled(); } } else if (evt->type() == eventNames().mousemoveEvent) { if (renderBox()->borderBoxRect().contains(local)) { if (!m_capturing) { if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(input); m_capturing = true; } } bool oldOnUpButton = m_onUpButton; m_onUpButton = local.y() < renderBox()->y() + renderBox()->height() / 2; if (m_onUpButton != oldOnUpButton) renderer()->repaint(); } else { if (m_capturing) { if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(0); m_capturing = false; } } } } if (!evt->defaultHandled()) HTMLDivElement::defaultEventHandler(evt); }
void SearchFieldResultsButtonElement::defaultEventHandler(Event* evt) { // On mousedown, bring up a menu, if needed HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode()); if (evt->type() == eventNames().mousedownEvent && evt->isMouseEvent() && static_cast<MouseEvent*>(evt)->button() == LeftButton) { input->focus(); input->select(); if (input && input->renderer() && static_cast<RenderTextControl*>(input->renderer())->popupIsVisible()) static_cast<RenderTextControl*>(input->renderer())->hidePopup(); else if (input->maxResults() > 0) static_cast<RenderTextControl*>(input->renderer())->showPopup(); evt->setDefaultHandled(); } if (!evt->defaultHandled()) HTMLDivElement::defaultEventHandler(evt); }
void HTMLSearchFieldCancelButtonElement::defaultEventHandler(Event* evt) { // If the element is visible, on mouseup, clear the value, and set selection HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode()); if (evt->type() == mousedownEvent) { input->focus(); input->select(); evt->setDefaultHandled(); } else if (evt->type() == mouseupEvent) { if (renderer() && renderer()->style()->visibility() == VISIBLE) { input->setValue(""); //input->onSearch(); evt->setDefaultHandled(); } } if (!evt->defaultHandled()) HTMLDivElement::defaultEventHandler(evt); }
TEST_F(HTMLTextFormControlElementTest, SpellCheckDoesNotCauseUpdateLayout) { HTMLInputElement* input = toHTMLInputElement(document().getElementById("input")); input->focus(); input->setValue("Hello, input field"); VisibleSelection oldSelection = document().frame()->selection().selection(); Position newPosition(input->innerEditorElement()->firstChild(), 3); VisibleSelection newSelection(newPosition, TextAffinity::Downstream); document().frame()->selection().setSelection(newSelection, FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle | FrameSelection::DoNotUpdateAppearance); ASSERT_EQ(3, input->selectionStart()); Persistent<SpellChecker> spellChecker(SpellChecker::create(page().frame())); forceLayoutFlag(); int startCount = layoutCount(); spellChecker->respondToChangedSelection(oldSelection, FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle); EXPECT_EQ(startCount, layoutCount()); }
void SearchFieldResultsButtonElement::defaultEventHandler(Event* event) { // On mousedown, bring up a menu, if needed HTMLInputElement* input = toHTMLInputElement(shadowHost()); if (input && event->type() == eventNames().mousedownEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) { input->focus(); input->select(); RenderSearchField* renderer = toRenderSearchField(input->renderer()); if (renderer->popupIsVisible()) renderer->hidePopup(); else if (input->maxResults() > 0) renderer->showPopup(); event->setDefaultHandled(); } if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); }
void SearchFieldResultsButtonElement::defaultEventHandler(Event* event) { // On mousedown, bring up a menu, if needed HTMLInputElement* input = downcast<HTMLInputElement>(shadowHost()); if (input && event->type() == eventNames().mousedownEvent && is<MouseEvent>(*event) && downcast<MouseEvent>(*event).button() == LeftButton) { input->focus(); input->select(); #if !PLATFORM(IOS) RenderSearchField& renderer = downcast<RenderSearchField>(*input->renderer()); if (renderer.popupIsVisible()) renderer.hidePopup(); else if (input->maxResults() > 0) renderer.showPopup(); #endif event->setDefaultHandled(); } if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); }
void SearchFieldCancelButtonElement::defaultEventHandler(Event* event) { // If the element is visible, on mouseup, clear the value, and set selection HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode()); if (event->type() == eventNames().mousedownEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) { if (renderer() && renderer()->visibleToHitTesting()) { if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(this); m_capturing = true; } } input->focus(); input->select(); event->setDefaultHandled(); } if (event->type() == eventNames().mouseupEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) { if (m_capturing && renderer() && renderer()->visibleToHitTesting()) { if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(0); m_capturing = false; } if (hovered()) { RefPtr<HTMLInputElement> protector(input); String oldValue = input->value(); input->setValue(""); if (!oldValue.isEmpty()) { toRenderTextControl(input->renderer())->setChangedSinceLastChangeEvent(true); input->dispatchEvent(Event::create(eventNames().inputEvent, true, false)); } input->onSearch(); event->setDefaultHandled(); } } } if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); }
void SpinButtonElement::defaultEventHandler(Event* event) { if (!event->isMouseEvent()) { if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); return; } RenderBox* box = renderBox(); if (!box) { if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); return; } HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode()); if (input->disabled() || input->isReadOnlyFormControl()) { if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); return; } MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); IntPoint local = roundedIntPoint(box->absoluteToLocal(mouseEvent->absoluteLocation(), false, true)); if (mouseEvent->type() == eventNames().mousedownEvent && mouseEvent->button() == LeftButton) { if (box->borderBoxRect().contains(local)) { RefPtr<Node> protector(input); input->focus(); input->select(); input->stepUpFromRenderer(m_upDownState == Up ? 1 : -1); event->setDefaultHandled(); startRepeatingTimer(); } } else if (mouseEvent->type() == eventNames().mouseupEvent && mouseEvent->button() == LeftButton) stopRepeatingTimer(); else if (event->type() == eventNames().mousemoveEvent) { if (box->borderBoxRect().contains(local)) { if (!m_capturing) { if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(this); m_capturing = true; } } UpDownState oldUpDownState = m_upDownState; m_upDownState = local.y() < box->height() / 2 ? Up : Down; if (m_upDownState != oldUpDownState) renderer()->repaint(); } else { if (m_capturing) { stopRepeatingTimer(); if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(0); m_capturing = false; } } } } if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); }
void SearchFieldCancelButtonElement::defaultEventHandler(Event* event) { // If the element is visible, on mouseup, clear the value, and set selection HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode()); if (event->type() == eventNames().mousedownEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) { if (renderer() && renderer()->visibleToHitTesting()) { if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(this); m_capturing = true; } } input->focus(); input->select(); event->setDefaultHandled(); } if (event->type() == eventNames().mouseupEvent && event->isMouseEvent() && static_cast<MouseEvent*>(event)->button() == LeftButton) { if (m_capturing && renderer() && renderer()->visibleToHitTesting()) { if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(0); m_capturing = false; } #if !PLATFORM(OLYMPIA) // FIXME: It's always false on OLYMPIA platform. This problem depends on RIM bug #1067. if (hovered()) { #else if (event->target() == this) { #endif RefPtr<HTMLInputElement> protector(input); String oldValue = input->value(); input->setValue(""); if (!oldValue.isEmpty()) { toRenderTextControl(input->renderer())->setChangedSinceLastChangeEvent(true); input->dispatchEvent(Event::create(eventNames().inputEvent, true, false)); } input->onSearch(); event->setDefaultHandled(); } } } if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); } // ---------------------------- inline SpinButtonElement::SpinButtonElement(HTMLElement* shadowParent) : TextControlInnerElement(shadowParent->document(), shadowParent) , m_capturing(false) , m_upDownState(Indeterminate) , m_pressStartingState(Indeterminate) , m_repeatingTimer(this, &SpinButtonElement::repeatingTimerFired) { } PassRefPtr<SpinButtonElement> SpinButtonElement::create(HTMLElement* shadowParent) { return adoptRef(new SpinButtonElement(shadowParent)); } void SpinButtonElement::defaultEventHandler(Event* event) { if (!event->isMouseEvent()) { if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); return; } RenderBox* box = renderBox(); if (!box) { if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); return; } HTMLInputElement* input = static_cast<HTMLInputElement*>(shadowAncestorNode()); if (input->disabled() || input->isReadOnlyFormControl()) { if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); return; } MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); IntPoint local = roundedIntPoint(box->absoluteToLocal(mouseEvent->absoluteLocation(), false, true)); if (mouseEvent->type() == eventNames().mousedownEvent && mouseEvent->button() == LeftButton) { if (box->borderBoxRect().contains(local)) { RefPtr<Node> protector(input); input->focus(); input->select(); input->stepUpFromRenderer(m_upDownState == Up ? 1 : -1); event->setDefaultHandled(); startRepeatingTimer(); } } else if (mouseEvent->type() == eventNames().mouseupEvent && mouseEvent->button() == LeftButton) stopRepeatingTimer(); else if (event->type() == eventNames().mousemoveEvent) { if (box->borderBoxRect().contains(local)) { if (!m_capturing) { if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(this); m_capturing = true; } } UpDownState oldUpDownState = m_upDownState; m_upDownState = local.y() < box->height() / 2 ? Up : Down; if (m_upDownState != oldUpDownState) renderer()->repaint(); } else { if (m_capturing) { stopRepeatingTimer(); if (Frame* frame = document()->frame()) { frame->eventHandler()->setCapturingMouseEventsNode(0); m_capturing = false; } } } } if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); } void SpinButtonElement::startRepeatingTimer() { m_pressStartingState = m_upDownState; ScrollbarTheme* theme = ScrollbarTheme::nativeTheme(); m_repeatingTimer.start(theme->initialAutoscrollTimerDelay(), theme->autoscrollTimerDelay()); }