| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 2257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2268 m_page->focusController().setActive(true); | 2268 m_page->focusController().setActive(true); |
| 2269 LocalFrame* focusedFrame = m_page->focusController().focusedFrame(); | 2269 LocalFrame* focusedFrame = m_page->focusController().focusedFrame(); |
| 2270 if (focusedFrame) { | 2270 if (focusedFrame) { |
| 2271 Element* element = focusedFrame->document()->focusedElement(); | 2271 Element* element = focusedFrame->document()->focusedElement(); |
| 2272 if (element && focusedFrame->selection().selection().isNone()) { | 2272 if (element && focusedFrame->selection().selection().isNone()) { |
| 2273 // If the selection was cleared while the WebView was not | 2273 // If the selection was cleared while the WebView was not |
| 2274 // focused, then the focus element shows with a focus ring but | 2274 // focused, then the focus element shows with a focus ring but |
| 2275 // no caret and does respond to keyboard inputs. | 2275 // no caret and does respond to keyboard inputs. |
| 2276 if (element->isTextFormControl()) { | 2276 if (element->isTextFormControl()) { |
| 2277 element->updateFocusAppearance(SelectionBehaviorOnFocus::Res
tore); | 2277 element->updateFocusAppearance(SelectionBehaviorOnFocus::Res
tore); |
| 2278 } else if (element->isContentEditable()) { | 2278 } else if (isContentEditable(*element)) { |
| 2279 // updateFocusAppearance() selects all the text of | 2279 // updateFocusAppearance() selects all the text of |
| 2280 // contentseditable DIVs. So we set the selection explicitly | 2280 // contentseditable DIVs. So we set the selection explicitly |
| 2281 // instead. Note that this has the side effect of moving the | 2281 // instead. Note that this has the side effect of moving the |
| 2282 // caret back to the beginning of the text. | 2282 // caret back to the beginning of the text. |
| 2283 Position position(element, 0); | 2283 Position position(element, 0); |
| 2284 focusedFrame->selection().setSelection(VisibleSelection(posi
tion, SelDefaultAffinity)); | 2284 focusedFrame->selection().setSelection(VisibleSelection(posi
tion, SelDefaultAffinity)); |
| 2285 } | 2285 } |
| 2286 } | 2286 } |
| 2287 } | 2287 } |
| 2288 m_imeAcceptEvents = true; | 2288 m_imeAcceptEvents = true; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2337 if (!focused->editor().canEdit() && !inputMethodController.hasComposition()) | 2337 if (!focused->editor().canEdit() && !inputMethodController.hasComposition()) |
| 2338 return false; | 2338 return false; |
| 2339 | 2339 |
| 2340 // We should verify the parent node of this IME composition node are | 2340 // We should verify the parent node of this IME composition node are |
| 2341 // editable because JavaScript may delete a parent node of the composition | 2341 // editable because JavaScript may delete a parent node of the composition |
| 2342 // node. In this case, WebKit crashes while deleting texts from the parent | 2342 // node. In this case, WebKit crashes while deleting texts from the parent |
| 2343 // node, which doesn't exist any longer. | 2343 // node, which doesn't exist any longer. |
| 2344 const EphemeralRange range = inputMethodController.compositionEphemeralRange
(); | 2344 const EphemeralRange range = inputMethodController.compositionEphemeralRange
(); |
| 2345 if (range.isNotNull()) { | 2345 if (range.isNotNull()) { |
| 2346 Node* node = range.startPosition().computeContainerNode(); | 2346 Node* node = range.startPosition().computeContainerNode(); |
| 2347 if (!node || !node->isContentEditable()) | 2347 if (!node || !isContentEditable(*node)) |
| 2348 return false; | 2348 return false; |
| 2349 } | 2349 } |
| 2350 | 2350 |
| 2351 // A keypress event is canceled. If an ongoing composition exists, then the | 2351 // A keypress event is canceled. If an ongoing composition exists, then the |
| 2352 // keydown event should have arisen from a handled key (e.g., backspace). | 2352 // keydown event should have arisen from a handled key (e.g., backspace). |
| 2353 // In this case we ignore the cancellation and continue; otherwise (no | 2353 // In this case we ignore the cancellation and continue; otherwise (no |
| 2354 // ongoing composition) we exit and signal success only for attempts to | 2354 // ongoing composition) we exit and signal success only for attempts to |
| 2355 // clear the composition. | 2355 // clear the composition. |
| 2356 if (m_suppressNextKeypressEvent && !inputMethodController.hasComposition()) | 2356 if (m_suppressNextKeypressEvent && !inputMethodController.hasComposition()) |
| 2357 return text.isEmpty(); | 2357 return text.isEmpty(); |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2535 if (toHTMLTextAreaElement(*element).isDisabledOrReadOnly()) | 2535 if (toHTMLTextAreaElement(*element).isDisabledOrReadOnly()) |
| 2536 return WebTextInputTypeNone; | 2536 return WebTextInputTypeNone; |
| 2537 return WebTextInputTypeTextArea; | 2537 return WebTextInputTypeTextArea; |
| 2538 } | 2538 } |
| 2539 | 2539 |
| 2540 if (element->isHTMLElement()) { | 2540 if (element->isHTMLElement()) { |
| 2541 if (toHTMLElement(element)->isDateTimeFieldElement()) | 2541 if (toHTMLElement(element)->isDateTimeFieldElement()) |
| 2542 return WebTextInputTypeDateTimeField; | 2542 return WebTextInputTypeDateTimeField; |
| 2543 } | 2543 } |
| 2544 | 2544 |
| 2545 if (element->isContentEditable()) | 2545 if (isContentEditable(*element)) |
| 2546 return WebTextInputTypeContentEditable; | 2546 return WebTextInputTypeContentEditable; |
| 2547 | 2547 |
| 2548 return WebTextInputTypeNone; | 2548 return WebTextInputTypeNone; |
| 2549 } | 2549 } |
| 2550 | 2550 |
| 2551 int WebViewImpl::textInputFlags() | 2551 int WebViewImpl::textInputFlags() |
| 2552 { | 2552 { |
| 2553 Element* element = focusedElement(); | 2553 Element* element = focusedElement(); |
| 2554 if (!element) | 2554 if (!element) |
| 2555 return WebTextInputFlagNone; | 2555 return WebTextInputFlagNone; |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2990 | 2990 |
| 2991 Element* oldFocusedElement = document->focusedElement(); | 2991 Element* oldFocusedElement = document->focusedElement(); |
| 2992 document->clearFocusedElement(); | 2992 document->clearFocusedElement(); |
| 2993 if (!oldFocusedElement) | 2993 if (!oldFocusedElement) |
| 2994 return; | 2994 return; |
| 2995 | 2995 |
| 2996 // If a text field has focus, we need to make sure the selection controller | 2996 // If a text field has focus, we need to make sure the selection controller |
| 2997 // knows to remove selection from it. Otherwise, the text field is still | 2997 // knows to remove selection from it. Otherwise, the text field is still |
| 2998 // processing keyboard events even though focus has been moved to the page a
nd | 2998 // processing keyboard events even though focus has been moved to the page a
nd |
| 2999 // keystrokes get eaten as a result. | 2999 // keystrokes get eaten as a result. |
| 3000 if (oldFocusedElement->isContentEditable() || oldFocusedElement->isTextFormC
ontrol()) | 3000 if (isContentEditable(*oldFocusedElement) || oldFocusedElement->isTextFormCo
ntrol()) |
| 3001 localFrame->selection().clear(); | 3001 localFrame->selection().clear(); |
| 3002 } | 3002 } |
| 3003 | 3003 |
| 3004 // TODO(dglazkov): Remove and replace with Node:hasEditableStyle. | 3004 // TODO(dglazkov): Remove and replace with Node:hasEditableStyle. |
| 3005 // http://crbug.com/612560 | 3005 // http://crbug.com/612560 |
| 3006 static bool isElementEditable(const Element* element) | 3006 static bool isElementEditable(const Element* element) |
| 3007 { | 3007 { |
| 3008 if (element->isContentEditable()) | 3008 if (isContentEditable(*element)) |
| 3009 return true; | 3009 return true; |
| 3010 | 3010 |
| 3011 if (element->isTextFormControl()) { | 3011 if (element->isTextFormControl()) { |
| 3012 const HTMLTextFormControlElement* input = toHTMLTextFormControlElement(e
lement); | 3012 const HTMLTextFormControlElement* input = toHTMLTextFormControlElement(e
lement); |
| 3013 if (!input->isDisabledOrReadOnly()) | 3013 if (!input->isDisabledOrReadOnly()) |
| 3014 return true; | 3014 return true; |
| 3015 } | 3015 } |
| 3016 | 3016 |
| 3017 return equalIgnoringCase(element->getAttribute(HTMLNames::roleAttr), "textbo
x"); | 3017 return equalIgnoringCase(element->getAttribute(HTMLNames::roleAttr), "textbo
x"); |
| 3018 } | 3018 } |
| (...skipping 1597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4616 return nullptr; | 4616 return nullptr; |
| 4617 return focusedFrame; | 4617 return focusedFrame; |
| 4618 } | 4618 } |
| 4619 | 4619 |
| 4620 LocalFrame* WebViewImpl::focusedLocalFrameAvailableForIme() const | 4620 LocalFrame* WebViewImpl::focusedLocalFrameAvailableForIme() const |
| 4621 { | 4621 { |
| 4622 return m_imeAcceptEvents ? focusedLocalFrameInWidget() : nullptr; | 4622 return m_imeAcceptEvents ? focusedLocalFrameInWidget() : nullptr; |
| 4623 } | 4623 } |
| 4624 | 4624 |
| 4625 } // namespace blink | 4625 } // namespace blink |
| OLD | NEW |