| OLD | NEW | 
|     1 /* |     1 /* | 
|     2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |     2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 
|     3  *           (C) 1999 Antti Koivisto (koivisto@kde.org) |     3  *           (C) 1999 Antti Koivisto (koivisto@kde.org) | 
|     4  *           (C) 2001 Dirk Mueller (mueller@kde.org) |     4  *           (C) 2001 Dirk Mueller (mueller@kde.org) | 
|     5  * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. |     5  * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. | 
|     6  *           (C) 2006 Alexey Proskuryakov (ap@nypop.com) |     6  *           (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 
|     7  * |     7  * | 
|     8  * This library is free software; you can redistribute it and/or |     8  * This library is free software; you can redistribute it and/or | 
|     9  * modify it under the terms of the GNU Library General Public |     9  * modify it under the terms of the GNU Library General Public | 
|    10  * License as published by the Free Software Foundation; either |    10  * License as published by the Free Software Foundation; either | 
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   164         updatePlaceholderText(); |   164         updatePlaceholderText(); | 
|   165     HTMLElement* placeholder = placeholderElement(); |   165     HTMLElement* placeholder = placeholderElement(); | 
|   166     if (!placeholder) |   166     if (!placeholder) | 
|   167         return; |   167         return; | 
|   168  |   168  | 
|   169     placeholder->setInlineStyleProperty(CSSPropertyDisplay, placeholderShouldBeV
      isible() ? CSSValueBlock : CSSValueNone); |   169     placeholder->setInlineStyleProperty(CSSPropertyDisplay, placeholderShouldBeV
      isible() ? CSSValueBlock : CSSValueNone); | 
|   170 } |   170 } | 
|   171  |   171  | 
|   172 void HTMLTextFormControlElement::setSelectionStart(int start) |   172 void HTMLTextFormControlElement::setSelectionStart(int start) | 
|   173 { |   173 { | 
|   174     setSelectionRange(start, std::max(start, selectionEnd()), selectionDirection
      ()); |   174     setSelectionRange(start, std::max<unsigned>(start, selectionEnd()), selectio
      nDirection()); | 
|   175 } |   175 } | 
|   176  |   176  | 
|   177 void HTMLTextFormControlElement::setSelectionEnd(int end) |   177 void HTMLTextFormControlElement::setSelectionEnd(int end) | 
|   178 { |   178 { | 
|   179     setSelectionRange(std::min(end, selectionStart()), end, selectionDirection()
      ); |   179     setSelectionRange(std::min<unsigned>(end, selectionStart()), end, selectionD
      irection()); | 
|   180 } |   180 } | 
|   181  |   181  | 
|   182 void HTMLTextFormControlElement::setSelectionDirection(const String& direction) |   182 void HTMLTextFormControlElement::setSelectionDirection(const String& direction) | 
|   183 { |   183 { | 
|   184     setSelectionRange(selectionStart(), selectionEnd(), direction); |   184     setSelectionRange(selectionStart(), selectionEnd(), direction); | 
|   185 } |   185 } | 
|   186  |   186  | 
|   187 void HTMLTextFormControlElement::select(NeedToDispatchSelectEvent eventBehaviour
      ) |   187 void HTMLTextFormControlElement::select(NeedToDispatchSelectEvent eventBehaviour
      ) | 
|   188 { |   188 { | 
|   189     document().updateLayoutIgnorePendingStylesheets(); |   189     document().updateLayoutIgnorePendingStylesheets(); | 
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   259  |   259  | 
|   260         if (newSelectionEnd > end) |   260         if (newSelectionEnd > end) | 
|   261             newSelectionEnd += delta; |   261             newSelectionEnd += delta; | 
|   262         else if (newSelectionEnd > start) |   262         else if (newSelectionEnd > start) | 
|   263             newSelectionEnd = start + replacementLength; |   263             newSelectionEnd = start + replacementLength; | 
|   264     } |   264     } | 
|   265  |   265  | 
|   266     setSelectionRange(newSelectionStart, newSelectionEnd, SelectionHasNoDirectio
      n); |   266     setSelectionRange(newSelectionStart, newSelectionEnd, SelectionHasNoDirectio
      n); | 
|   267 } |   267 } | 
|   268  |   268  | 
|   269 void HTMLTextFormControlElement::setSelectionRange(int start, int end, const Str
      ing& directionString) |   269 void HTMLTextFormControlElement::setSelectionRange(unsigned start, unsigned end,
       const String& directionString) | 
|   270 { |   270 { | 
|   271     TextFieldSelectionDirection direction = SelectionHasNoDirection; |   271     TextFieldSelectionDirection direction = SelectionHasNoDirection; | 
|   272     if (directionString == "forward") |   272     if (directionString == "forward") | 
|   273         direction = SelectionHasForwardDirection; |   273         direction = SelectionHasForwardDirection; | 
|   274     else if (directionString == "backward") |   274     else if (directionString == "backward") | 
|   275         direction = SelectionHasBackwardDirection; |   275         direction = SelectionHasBackwardDirection; | 
|   276  |   276  | 
|   277     if (direction == SelectionHasNoDirection && document().frame() && document()
      .frame()->editor().behavior().shouldConsiderSelectionAsDirectional()) |   277     if (direction == SelectionHasNoDirection && document().frame() && document()
      .frame()->editor().behavior().shouldConsiderSelectionAsDirectional()) | 
|   278         direction = SelectionHasForwardDirection; |   278         direction = SelectionHasForwardDirection; | 
|   279  |   279  | 
|   280     return setSelectionRange(start, end, direction); |   280     return setSelectionRange(start, end, direction); | 
|   281 } |   281 } | 
|   282  |   282  | 
|   283 static Position positionForIndex(HTMLElement* innerEditor, int index) |   283 static Position positionForIndex(HTMLElement* innerEditor, unsigned index) | 
|   284 { |   284 { | 
|   285     ASSERT(index >= 0); |  | 
|   286     if (index == 0) { |   285     if (index == 0) { | 
|   287         Node* node = NodeTraversal::next(*innerEditor, innerEditor); |   286         Node* node = NodeTraversal::next(*innerEditor, innerEditor); | 
|   288         if (node && node->isTextNode()) |   287         if (node && node->isTextNode()) | 
|   289             return Position(node, 0); |   288             return Position(node, 0); | 
|   290         return Position(innerEditor, 0); |   289         return Position(innerEditor, 0); | 
|   291     } |   290     } | 
|   292     int remainingCharactersToMoveForward = index; |   291     unsigned remainingCharactersToMoveForward = index; | 
|   293     Node* lastBrOrText = innerEditor; |   292     Node* lastBrOrText = innerEditor; | 
|   294     for (Node& node : NodeTraversal::descendantsOf(*innerEditor)) { |   293     for (Node& node : NodeTraversal::descendantsOf(*innerEditor)) { | 
|   295         ASSERT(remainingCharactersToMoveForward >= 0); |   294         ASSERT(remainingCharactersToMoveForward >= 0); | 
|   296         if (node.hasTagName(brTag)) { |   295         if (node.hasTagName(brTag)) { | 
|   297             if (remainingCharactersToMoveForward == 0) |   296             if (remainingCharactersToMoveForward == 0) | 
|   298                 return positionBeforeNode(&node); |   297                 return positionBeforeNode(&node); | 
|   299             --remainingCharactersToMoveForward; |   298             --remainingCharactersToMoveForward; | 
|   300             lastBrOrText = &node; |   299             lastBrOrText = &node; | 
|   301             continue; |   300             continue; | 
|   302         } |   301         } | 
|   303  |   302  | 
|   304         if (node.isTextNode()) { |   303         if (node.isTextNode()) { | 
|   305             Text& text = toText(node); |   304             Text& text = toText(node); | 
|   306             if (remainingCharactersToMoveForward < static_cast<int>(text.length(
      ))) |   305             if (remainingCharactersToMoveForward < text.length()) | 
|   307                 return Position(&text, remainingCharactersToMoveForward); |   306                 return Position(&text, remainingCharactersToMoveForward); | 
|   308             remainingCharactersToMoveForward -= text.length(); |   307             remainingCharactersToMoveForward -= text.length(); | 
|   309             lastBrOrText = &node; |   308             lastBrOrText = &node; | 
|   310             continue; |   309             continue; | 
|   311         } |   310         } | 
|   312  |   311  | 
|   313         ASSERT_NOT_REACHED(); |   312         ASSERT_NOT_REACHED(); | 
|   314     } |   313     } | 
|   315     return lastPositionInOrAfterNode(lastBrOrText); |   314     return lastPositionInOrAfterNode(lastBrOrText); | 
|   316 } |   315 } | 
|   317  |   316  | 
|   318 static int indexForPosition(HTMLElement* innerEditor, const Position& passedPosi
      tion) |   317 static unsigned indexForPosition(HTMLElement* innerEditor, const Position& passe
      dPosition) | 
|   319 { |   318 { | 
|   320     if (!innerEditor || !innerEditor->contains(passedPosition.anchorNode()) || p
      assedPosition.isNull()) |   319     if (!innerEditor || !innerEditor->contains(passedPosition.anchorNode()) || p
      assedPosition.isNull()) | 
|   321         return 0; |   320         return 0; | 
|   322  |   321  | 
|   323     if (positionBeforeNode(innerEditor) == passedPosition) |   322     if (positionBeforeNode(innerEditor) == passedPosition) | 
|   324         return 0; |   323         return 0; | 
|   325  |   324  | 
|   326     int index = 0; |   325     unsigned index = 0; | 
 |   326     int offset = passedPosition.offsetInContainerNode(); | 
 |   327     ASSERT(offset >= 0); | 
|   327     Node* startNode = passedPosition.computeNodeBeforePosition(); |   328     Node* startNode = passedPosition.computeNodeBeforePosition(); | 
|   328     if (!startNode) |   329     if (!startNode) | 
|   329         startNode = passedPosition.computeContainerNode(); |   330         startNode = passedPosition.computeContainerNode(); | 
|   330     ASSERT(startNode); |   331     ASSERT(startNode); | 
|   331     ASSERT(innerEditor->contains(startNode)); |   332     ASSERT(innerEditor->contains(startNode)); | 
|   332  |   333  | 
|   333     for (Node* node = startNode; node; node = NodeTraversal::previous(*node, inn
      erEditor)) { |   334     for (Node* node = startNode; node; node = NodeTraversal::previous(*node, inn
      erEditor)) { | 
|   334         if (node->isTextNode()) { |   335         if (node->isTextNode()) { | 
|   335             int length = toText(*node).length(); |   336             unsigned length = toText(*node).length(); | 
|   336             if (node == passedPosition.computeContainerNode()) |   337             if (node == passedPosition.computeContainerNode()) | 
|   337                 index += std::min(length, passedPosition.offsetInContainerNode()
      ); |   338                 index += std::min<unsigned>(length, offset); | 
|   338             else |   339             else | 
|   339                 index += length; |   340                 index += length; | 
|   340         } else if (node->hasTagName(brTag)) { |   341         } else if (node->hasTagName(brTag)) { | 
|   341             ++index; |   342             ++index; | 
|   342         } |   343         } | 
|   343     } |   344     } | 
|   344  |   345  | 
|   345     ASSERT(index >= 0); |  | 
|   346     return index; |   346     return index; | 
|   347 } |   347 } | 
|   348  |   348  | 
|   349 void HTMLTextFormControlElement::setSelectionRange(int start, int end, TextField
      SelectionDirection direction, NeedToDispatchSelectEvent eventBehaviour, Selectio
      nOption selectionOption) |   349 void HTMLTextFormControlElement::setSelectionRange(unsigned start, unsigned end,
       TextFieldSelectionDirection direction, NeedToDispatchSelectEvent eventBehaviour
      , SelectionOption selectionOption) | 
|   350 { |   350 { | 
|   351     if (openShadowRoot() || !isTextFormControl() || !inDocument()) |   351     if (openShadowRoot() || !isTextFormControl() || !inDocument()) | 
|   352         return; |   352         return; | 
|   353  |   353  | 
|   354     const int editorValueLength = static_cast<int>(innerEditorValue().length()); |   354     const unsigned editorValueLength = innerEditorValue().length(); | 
|   355     ASSERT(editorValueLength >= 0); |   355     end = std::min<unsigned>(end, editorValueLength); | 
|   356     end = std::max(std::min(end, editorValueLength), 0); |   356     start = std::min<unsigned>(start, end); | 
|   357     start = std::min(std::max(start, 0), end); |  | 
|   358     cacheSelection(start, end, direction); |   357     cacheSelection(start, end, direction); | 
|   359  |   358  | 
|   360     if (selectionOption == NotChangeSelection || (selectionOption == ChangeSelec
      tionIfFocused && document().focusedElement() != this)) { |   359     if (selectionOption == NotChangeSelection || (selectionOption == ChangeSelec
      tionIfFocused && document().focusedElement() != this)) { | 
|   361         if (eventBehaviour == DispatchSelectEvent) |   360         if (eventBehaviour == DispatchSelectEvent) | 
|   362             scheduleSelectEvent(); |   361             scheduleSelectEvent(); | 
|   363         return; |   362         return; | 
|   364     } |   363     } | 
|   365  |   364  | 
|   366     LocalFrame* frame = document().frame(); |   365     LocalFrame* frame = document().frame(); | 
|   367     HTMLElement* innerEditor = innerEditorElement(); |   366     HTMLElement* innerEditor = innerEditorElement(); | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   410     Position indexPosition = pos.deepEquivalent().parentAnchoredEquivalent(); |   409     Position indexPosition = pos.deepEquivalent().parentAnchoredEquivalent(); | 
|   411     if (enclosingTextFormControl(indexPosition) != this) |   410     if (enclosingTextFormControl(indexPosition) != this) | 
|   412         return 0; |   411         return 0; | 
|   413     ASSERT(indexPosition.document()); |   412     ASSERT(indexPosition.document()); | 
|   414     RefPtrWillBeRawPtr<Range> range = Range::create(*indexPosition.document()); |   413     RefPtrWillBeRawPtr<Range> range = Range::create(*indexPosition.document()); | 
|   415     range->setStart(innerEditorElement(), 0, ASSERT_NO_EXCEPTION); |   414     range->setStart(innerEditorElement(), 0, ASSERT_NO_EXCEPTION); | 
|   416     range->setEnd(indexPosition.computeContainerNode(), indexPosition.offsetInCo
      ntainerNode(), ASSERT_NO_EXCEPTION); |   415     range->setEnd(indexPosition.computeContainerNode(), indexPosition.offsetInCo
      ntainerNode(), ASSERT_NO_EXCEPTION); | 
|   417     return TextIterator::rangeLength(range->startPosition(), range->endPosition(
      )); |   416     return TextIterator::rangeLength(range->startPosition(), range->endPosition(
      )); | 
|   418 } |   417 } | 
|   419  |   418  | 
|   420 int HTMLTextFormControlElement::selectionStart() const |   419 unsigned HTMLTextFormControlElement::selectionStart() const | 
|   421 { |   420 { | 
|   422     if (!isTextFormControl()) |   421     if (!isTextFormControl()) | 
|   423         return 0; |   422         return 0; | 
|   424     if (document().focusedElement() != this) |   423     if (document().focusedElement() != this) | 
|   425         return m_cachedSelectionStart; |   424         return m_cachedSelectionStart; | 
|   426  |   425  | 
|   427     return computeSelectionStart(); |   426     return computeSelectionStart(); | 
|   428 } |   427 } | 
|   429  |   428  | 
|   430 int HTMLTextFormControlElement::computeSelectionStart() const |   429 unsigned HTMLTextFormControlElement::computeSelectionStart() const | 
|   431 { |   430 { | 
|   432     ASSERT(isTextFormControl()); |   431     ASSERT(isTextFormControl()); | 
|   433     LocalFrame* frame = document().frame(); |   432     LocalFrame* frame = document().frame(); | 
|   434     if (!frame) |   433     if (!frame) | 
|   435         return 0; |   434         return 0; | 
|   436  |   435  | 
|   437     return indexForPosition(innerEditorElement(), frame->selection().start()); |   436     return indexForPosition(innerEditorElement(), frame->selection().start()); | 
|   438 } |   437 } | 
|   439  |   438  | 
|   440 int HTMLTextFormControlElement::selectionEnd() const |   439 unsigned HTMLTextFormControlElement::selectionEnd() const | 
|   441 { |   440 { | 
|   442     if (!isTextFormControl()) |   441     if (!isTextFormControl()) | 
|   443         return 0; |   442         return 0; | 
|   444     if (document().focusedElement() != this) |   443     if (document().focusedElement() != this) | 
|   445         return m_cachedSelectionEnd; |   444         return m_cachedSelectionEnd; | 
|   446     return computeSelectionEnd(); |   445     return computeSelectionEnd(); | 
|   447 } |   446 } | 
|   448  |   447  | 
|   449 int HTMLTextFormControlElement::computeSelectionEnd() const |   448 unsigned HTMLTextFormControlElement::computeSelectionEnd() const | 
|   450 { |   449 { | 
|   451     ASSERT(isTextFormControl()); |   450     ASSERT(isTextFormControl()); | 
|   452     LocalFrame* frame = document().frame(); |   451     LocalFrame* frame = document().frame(); | 
|   453     if (!frame) |   452     if (!frame) | 
|   454         return 0; |   453         return 0; | 
|   455  |   454  | 
|   456     return indexForPosition(innerEditorElement(), frame->selection().end()); |   455     return indexForPosition(innerEditorElement(), frame->selection().end()); | 
|   457 } |   456 } | 
|   458  |   457  | 
|   459 static const AtomicString& directionString(TextFieldSelectionDirection direction
      ) |   458 static const AtomicString& directionString(TextFieldSelectionDirection direction
      ) | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
|   489 { |   488 { | 
|   490     ASSERT(isTextFormControl()); |   489     ASSERT(isTextFormControl()); | 
|   491     LocalFrame* frame = document().frame(); |   490     LocalFrame* frame = document().frame(); | 
|   492     if (!frame) |   491     if (!frame) | 
|   493         return SelectionHasNoDirection; |   492         return SelectionHasNoDirection; | 
|   494  |   493  | 
|   495     const VisibleSelection& selection = frame->selection().selection(); |   494     const VisibleSelection& selection = frame->selection().selection(); | 
|   496     return selection.isDirectional() ? (selection.isBaseFirst() ? SelectionHasFo
      rwardDirection : SelectionHasBackwardDirection) : SelectionHasNoDirection; |   495     return selection.isDirectional() ? (selection.isBaseFirst() ? SelectionHasFo
      rwardDirection : SelectionHasBackwardDirection) : SelectionHasNoDirection; | 
|   497 } |   496 } | 
|   498  |   497  | 
|   499 static inline void setContainerAndOffsetForRange(Node* node, int offset, Node*& 
      containerNode, int& offsetInContainer) |   498 static inline void setContainerAndOffsetForRange(Node* node, unsigned offset, No
      de*& containerNode, unsigned& offsetInContainer) | 
|   500 { |   499 { | 
|   501     if (node->isTextNode()) { |   500     if (node->isTextNode()) { | 
|   502         containerNode = node; |   501         containerNode = node; | 
|   503         offsetInContainer = offset; |   502         offsetInContainer = offset; | 
|   504     } else { |   503     } else { | 
|   505         containerNode = node->parentNode(); |   504         containerNode = node->parentNode(); | 
|   506         offsetInContainer = node->nodeIndex() + offset; |   505         offsetInContainer = node->nodeIndex() + offset; | 
|   507     } |   506     } | 
|   508 } |   507 } | 
|   509  |   508  | 
|   510 PassRefPtrWillBeRawPtr<Range> HTMLTextFormControlElement::selection() const |   509 PassRefPtrWillBeRawPtr<Range> HTMLTextFormControlElement::selection() const | 
|   511 { |   510 { | 
|   512     if (!layoutObject() || !isTextFormControl()) |   511     if (!layoutObject() || !isTextFormControl()) | 
|   513         return nullptr; |   512         return nullptr; | 
|   514  |   513  | 
|   515     int start = m_cachedSelectionStart; |   514     unsigned start = m_cachedSelectionStart; | 
|   516     int end = m_cachedSelectionEnd; |   515     unsigned end = m_cachedSelectionEnd; | 
|   517  |   516  | 
|   518     ASSERT(start <= end); |   517     ASSERT(start <= end); | 
|   519     HTMLElement* innerText = innerEditorElement(); |   518     HTMLElement* innerText = innerEditorElement(); | 
|   520     if (!innerText) |   519     if (!innerText) | 
|   521         return nullptr; |   520         return nullptr; | 
|   522  |   521  | 
|   523     if (!innerText->hasChildren()) |   522     if (!innerText->hasChildren()) | 
|   524         return Range::create(document(), innerText, 0, innerText, 0); |   523         return Range::create(document(), innerText, 0, innerText, 0); | 
|   525  |   524  | 
|   526     int offset = 0; |   525     unsigned offset = 0; | 
|   527     Node* startNode = 0; |   526     Node* startNode = 0; | 
|   528     Node* endNode = 0; |   527     Node* endNode = 0; | 
|   529     for (Node& node : NodeTraversal::descendantsOf(*innerText)) { |   528     for (Node& node : NodeTraversal::descendantsOf(*innerText)) { | 
|   530         ASSERT(!node.hasChildren()); |   529         ASSERT(!node.hasChildren()); | 
|   531         ASSERT(node.isTextNode() || isHTMLBRElement(node)); |   530         ASSERT(node.isTextNode() || isHTMLBRElement(node)); | 
|   532         int length = node.isTextNode() ? lastOffsetInNode(&node) : 1; |   531         int length = node.isTextNode() ? lastOffsetInNode(&node) : 1; | 
|   533  |   532  | 
|   534         if (offset <= start && start <= offset + length) |   533         if (offset <= start && start <= offset + length) | 
|   535             setContainerAndOffsetForRange(&node, start - offset, startNode, star
      t); |   534             setContainerAndOffsetForRange(&node, start - offset, startNode, star
      t); | 
|   536  |   535  | 
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1003 } |  1002 } | 
|  1004  |  1003  | 
|  1005 void HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(const Ele
      ment& source) |  1004 void HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(const Ele
      ment& source) | 
|  1006 { |  1005 { | 
|  1007     const HTMLTextFormControlElement& sourceElement = static_cast<const HTMLText
      FormControlElement&>(source); |  1006     const HTMLTextFormControlElement& sourceElement = static_cast<const HTMLText
      FormControlElement&>(source); | 
|  1008     m_lastChangeWasUserEdit = sourceElement.m_lastChangeWasUserEdit; |  1007     m_lastChangeWasUserEdit = sourceElement.m_lastChangeWasUserEdit; | 
|  1009     HTMLFormControlElement::copyNonAttributePropertiesFromElement(source); |  1008     HTMLFormControlElement::copyNonAttributePropertiesFromElement(source); | 
|  1010 } |  1009 } | 
|  1011  |  1010  | 
|  1012 } // namespace blink |  1011 } // namespace blink | 
| OLD | NEW |