Chromium Code Reviews| Index: Source/web/WebViewImpl.cpp |
| diff --git a/Source/web/WebViewImpl.cpp b/Source/web/WebViewImpl.cpp |
| index 0058e054eb3038f1b91e0da696fe6666b71a7b88..cd056751413928f1c537fc243b8d86261e15a4e8 100644 |
| --- a/Source/web/WebViewImpl.cpp |
| +++ b/Source/web/WebViewImpl.cpp |
| @@ -2432,9 +2432,106 @@ int WebViewImpl::textInputFlags() |
| else if (spellcheck == "off") |
| flags |= WebTextInputFlagSpellcheckOff; |
| + if (wantEnterEvents(element)) { |
| + flags |= WebTextInputFlagWantEnterEvents; |
| + } |
| + |
| + if (havePreviousInput(element)) { |
| + flags |= WebTextInputFlagHavePreviousInput; |
| + } |
| + |
| + if (haveNextInput(element)) { |
| + flags |= WebTextInputFlagHaveNextInput; |
| + } |
| return flags; |
| } |
| +Element* WebViewImpl::haveNextInput(Element* element) |
| +{ |
| + if (!element->isFormControlElement()) |
| + return 0; |
| + |
| + HTMLFormControlElement* formControlElement = toHTMLFormControlElement(element); |
|
bcwhite
2015/02/24 17:06:23
80 character line limits
yosin_UTC9
2015/02/25 01:25:36
Blink coding style rule allows lines to over 80 ch
AKV
2015/04/08 18:38:12
Done.
|
| + Node* parentFormNode = reinterpret_cast<Node*>(formControlElement->formOwner()); |
|
yosin_UTC9
2015/02/25 01:25:36
We don't need to use |reinterpret_cast<Node*>|. |f
|
| + if (!parentFormNode) |
| + return 0; |
|
yosin_UTC9
2015/02/25 01:25:36
nit: better to use |nullptr|.
AKV
2015/04/08 18:38:12
Done.
|
| + Node* nextNode = static_cast<Node*>(element)->nextSibling(); |
|
yosin_UTC9
2015/02/25 01:25:36
nit: We don't need to cast to |Node| for |element|
|
| + // Find all children of parentForm and do the checks |
| + // NodeList childNodes = static_cast<Node*>(parentFormElement)->childNodes(); |
| + while ((nextNode = NodeRenderingTraversal::next(nextNode, parentFormNode))) { |
|
yosin_UTC9
2015/02/25 01:25:36
I think we should use tab order rather than render
AKV
2015/04/08 18:38:12
Done.
|
| + RenderObject* renderer = nextNode->renderer(); |
| + if (nextNode->isContentEditable() || (renderer && renderer->isTextControl())) { |
| + if (nextNode->isElementNode()) { |
| + return toElement(nextNode); |
| + } |
| + } |
| + // TODO(AKV) Need to handle when form has an iframe/frame as its child. |
| + } |
| + return 0; |
|
yosin_UTC9
2015/02/25 01:25:36
nit: better to use |nullptr|.
AKV
2015/04/08 18:38:12
Done.
|
| +} |
| + |
| +Element* WebViewImpl::havePreviousInput(Element* element) |
| +{ |
| + if (!element->isFormControlElement()) |
| + return 0; |
|
yosin_UTC9
2015/02/25 01:25:36
nit: better to use |nullptr|.
AKV
2015/04/08 18:38:12
Done.
AKV
2015/04/08 18:38:12
Done.
|
| + |
| + HTMLFormControlElement* formControlElement = toHTMLFormControlElement(element); |
| + Node* parentFormNode = reinterpret_cast<Node*>(formControlElement->formOwner()); |
|
yosin_UTC9
2015/02/25 01:25:36
We don't need to use |reinterpret_cast<Node*>|. |f
AKV
2015/04/08 18:38:12
I wanted to use Node pointer to pass to FocusContr
|
| + if (!parentFormNode) |
| + return 0; |
| + Node* previousNode = static_cast<Node*>(element)->previousSibling(); |
| + while ((previousNode = NodeRenderingTraversal::previous(previousNode, parentFormNode))) { |
| + RenderObject* renderer = previousNode->renderer(); |
| + if (previousNode->isContentEditable() || (renderer && renderer->isTextControl())) { |
| + if (previousNode->isElementNode()) { |
| + return toElement(previousNode); |
| + } |
| + } |
| + // TODO(AKV) Need to handle when form has an iframe/frame as its child. |
| + } |
| + return 0; |
| +} |
| + |
| +bool WebViewImpl::wantEnterEvents(Element* element) |
| +{ |
| + if (!element->isFormControlElement()) |
| + return false; |
| + |
| + if (element->hasEventListeners(EventTypeNames::keydown) || element->hasEventListeners(EventTypeNames::keypress) || element->hasEventListeners(EventTypeNames::keyup)) |
| + return true; |
| + |
| + return false; |
| +} |
| + |
| +void WebViewImpl::advanceFocusToNextInputField(bool direction) |
| +{ |
| + Element* element = focusedElement(); |
| + if (!element) |
| + return; |
| + |
| + HTMLFormControlElement* formControlElement = toHTMLFormControlElement(element); |
| + HTMLFormElement* parentFormElement = formControlElement->formOwner(); |
| + if (!parentFormElement) // There is no form element as parent, so navigation is not required. |
| + return; |
| + |
| + Element* nextElement = element; |
| + FocusType focusType = FocusTypeNone; |
| + if (direction) { |
| + focusType = FocusTypeForward; |
| + nextElement = haveNextInput(element); |
| + } else { |
| + nextElement = havePreviousInput(element); |
| + focusType = FocusTypeBackward; |
| + } |
| + |
| + if (!nextElement) |
| + return; |
| + |
| + nextElement->scrollIntoViewIfNeeded(true /*centerIfNeeded*/); |
| + nextElement->dispatchSimulatedClick(0, SendMouseUpDownEvents); |
| + nextElement->focus(false, focusType); |
| +} |
| + |
| WebString WebViewImpl::inputModeOfFocusedElement() |
| { |
| if (!RuntimeEnabledFeatures::inputModeAttributeEnabled()) |