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; |
327 Node* startNode = passedPosition.computeNodeBeforePosition(); | 326 Node* startNode = passedPosition.computeNodeBeforePosition(); |
328 if (!startNode) | 327 if (!startNode) |
329 startNode = passedPosition.computeContainerNode(); | 328 startNode = passedPosition.computeContainerNode(); |
330 ASSERT(startNode); | 329 ASSERT(startNode); |
331 ASSERT(innerEditor->contains(startNode)); | 330 ASSERT(innerEditor->contains(startNode)); |
332 | 331 |
333 for (Node* node = startNode; node; node = NodeTraversal::previous(*node, inn erEditor)) { | 332 for (Node* node = startNode; node; node = NodeTraversal::previous(*node, inn erEditor)) { |
334 if (node->isTextNode()) { | 333 if (node->isTextNode()) { |
335 int length = toText(*node).length(); | 334 unsigned length = toText(*node).length(); |
336 if (node == passedPosition.computeContainerNode()) | 335 if (node == passedPosition.computeContainerNode()) |
337 index += std::min(length, passedPosition.offsetInContainerNode() ); | 336 index += std::min<unsigned>(length, passedPosition.offsetInConta inerNode()); |
philipj_slow
2015/08/14 07:45:52
offsetInContainerNode() returns int. Maybe assign
| |
338 else | 337 else |
339 index += length; | 338 index += length; |
340 } else if (node->hasTagName(brTag)) { | 339 } else if (node->hasTagName(brTag)) { |
341 ++index; | 340 ++index; |
342 } | 341 } |
343 } | 342 } |
344 | 343 |
345 ASSERT(index >= 0); | |
346 return index; | 344 return index; |
347 } | 345 } |
348 | 346 |
349 void HTMLTextFormControlElement::setSelectionRange(int start, int end, TextField SelectionDirection direction, NeedToDispatchSelectEvent eventBehaviour, Selectio nOption selectionOption) | 347 void HTMLTextFormControlElement::setSelectionRange(unsigned start, unsigned end, TextFieldSelectionDirection direction, NeedToDispatchSelectEvent eventBehaviour , SelectionOption selectionOption) |
350 { | 348 { |
351 if (openShadowRoot() || !isTextFormControl() || !inDocument()) | 349 if (openShadowRoot() || !isTextFormControl() || !inDocument()) |
352 return; | 350 return; |
353 | 351 |
354 const int editorValueLength = static_cast<int>(innerEditorValue().length()); | 352 const unsigned editorValueLength = static_cast<unsigned>(innerEditorValue(). length()); |
philipj_slow
2015/08/14 07:45:52
String::length() is already unsigned.
tanay.c
2015/08/17 12:06:32
Done.
| |
355 ASSERT(editorValueLength >= 0); | 353 end = std::min<unsigned>(end, editorValueLength); |
356 end = std::max(std::min(end, editorValueLength), 0); | 354 start = std::min<unsigned>(start, end); |
357 start = std::min(std::max(start, 0), end); | |
358 cacheSelection(start, end, direction); | 355 cacheSelection(start, end, direction); |
359 | 356 |
360 if (selectionOption == NotChangeSelection || (selectionOption == ChangeSelec tionIfFocused && document().focusedElement() != this)) { | 357 if (selectionOption == NotChangeSelection || (selectionOption == ChangeSelec tionIfFocused && document().focusedElement() != this)) { |
361 if (eventBehaviour == DispatchSelectEvent) | 358 if (eventBehaviour == DispatchSelectEvent) |
362 scheduleSelectEvent(); | 359 scheduleSelectEvent(); |
363 return; | 360 return; |
364 } | 361 } |
365 | 362 |
366 LocalFrame* frame = document().frame(); | 363 LocalFrame* frame = document().frame(); |
367 HTMLElement* innerEditor = innerEditorElement(); | 364 HTMLElement* innerEditor = innerEditorElement(); |
368 if (!frame || !innerEditor) | 365 if (!frame || !innerEditor) |
369 return; | 366 return; |
370 | 367 |
371 Position startPosition = positionForIndex(innerEditor, start); | 368 Position startPosition = positionForIndex(innerEditor, start); |
372 Position endPosition = start == end ? startPosition : positionForIndex(inner Editor, end); | 369 Position endPosition = start == end ? startPosition : positionForIndex(inner Editor, end); |
373 | 370 |
374 ASSERT(start == indexForPosition(innerEditor, startPosition)); | 371 ASSERT(start == (unsigned)indexForPosition(innerEditor, startPosition)); |
philipj_slow
2015/08/14 07:45:52
Don't use C-style casts.
tanay.c
2015/08/17 12:06:32
Done.
| |
375 ASSERT(end == indexForPosition(innerEditor, endPosition)); | 372 ASSERT(end == (unsigned)indexForPosition(innerEditor, endPosition)); |
376 | 373 |
377 // startPosition and endPosition can be null position for example when | 374 // startPosition and endPosition can be null position for example when |
378 // "-webkit-user-select: none" style attribute is specified. | 375 // "-webkit-user-select: none" style attribute is specified. |
379 if (startPosition.isNotNull() && endPosition.isNotNull()) { | 376 if (startPosition.isNotNull() && endPosition.isNotNull()) { |
380 ASSERT(startPosition.anchorNode()->shadowHost() == this | 377 ASSERT(startPosition.anchorNode()->shadowHost() == this |
381 && endPosition.anchorNode()->shadowHost() == this); | 378 && endPosition.anchorNode()->shadowHost() == this); |
382 } | 379 } |
383 VisibleSelection newSelection; | 380 VisibleSelection newSelection; |
384 if (direction == SelectionHasBackwardDirection) | 381 if (direction == SelectionHasBackwardDirection) |
385 newSelection.setWithoutValidation(endPosition, startPosition); | 382 newSelection.setWithoutValidation(endPosition, startPosition); |
(...skipping 24 matching lines...) Expand all Loading... | |
410 Position indexPosition = pos.deepEquivalent().parentAnchoredEquivalent(); | 407 Position indexPosition = pos.deepEquivalent().parentAnchoredEquivalent(); |
411 if (enclosingTextFormControl(indexPosition) != this) | 408 if (enclosingTextFormControl(indexPosition) != this) |
412 return 0; | 409 return 0; |
413 ASSERT(indexPosition.document()); | 410 ASSERT(indexPosition.document()); |
414 RefPtrWillBeRawPtr<Range> range = Range::create(*indexPosition.document()); | 411 RefPtrWillBeRawPtr<Range> range = Range::create(*indexPosition.document()); |
415 range->setStart(innerEditorElement(), 0, ASSERT_NO_EXCEPTION); | 412 range->setStart(innerEditorElement(), 0, ASSERT_NO_EXCEPTION); |
416 range->setEnd(indexPosition.computeContainerNode(), indexPosition.offsetInCo ntainerNode(), ASSERT_NO_EXCEPTION); | 413 range->setEnd(indexPosition.computeContainerNode(), indexPosition.offsetInCo ntainerNode(), ASSERT_NO_EXCEPTION); |
417 return TextIterator::rangeLength(range->startPosition(), range->endPosition( )); | 414 return TextIterator::rangeLength(range->startPosition(), range->endPosition( )); |
418 } | 415 } |
419 | 416 |
420 int HTMLTextFormControlElement::selectionStart() const | 417 unsigned HTMLTextFormControlElement::selectionStart() const |
421 { | 418 { |
422 if (!isTextFormControl()) | 419 if (!isTextFormControl()) |
423 return 0; | 420 return 0; |
424 if (document().focusedElement() != this) | 421 if (document().focusedElement() != this) |
425 return m_cachedSelectionStart; | 422 return m_cachedSelectionStart; |
426 | 423 |
427 return computeSelectionStart(); | 424 return computeSelectionStart(); |
428 } | 425 } |
429 | 426 |
430 int HTMLTextFormControlElement::computeSelectionStart() const | 427 unsigned HTMLTextFormControlElement::computeSelectionStart() const |
431 { | 428 { |
432 ASSERT(isTextFormControl()); | 429 ASSERT(isTextFormControl()); |
433 LocalFrame* frame = document().frame(); | 430 LocalFrame* frame = document().frame(); |
434 if (!frame) | 431 if (!frame) |
435 return 0; | 432 return 0; |
436 | 433 |
437 return indexForPosition(innerEditorElement(), frame->selection().start()); | 434 return indexForPosition(innerEditorElement(), frame->selection().start()); |
438 } | 435 } |
439 | 436 |
440 int HTMLTextFormControlElement::selectionEnd() const | 437 unsigned HTMLTextFormControlElement::selectionEnd() const |
441 { | 438 { |
442 if (!isTextFormControl()) | 439 if (!isTextFormControl()) |
443 return 0; | 440 return 0; |
444 if (document().focusedElement() != this) | 441 if (document().focusedElement() != this) |
445 return m_cachedSelectionEnd; | 442 return m_cachedSelectionEnd; |
446 return computeSelectionEnd(); | 443 return computeSelectionEnd(); |
447 } | 444 } |
448 | 445 |
449 int HTMLTextFormControlElement::computeSelectionEnd() const | 446 unsigned HTMLTextFormControlElement::computeSelectionEnd() const |
450 { | 447 { |
451 ASSERT(isTextFormControl()); | 448 ASSERT(isTextFormControl()); |
452 LocalFrame* frame = document().frame(); | 449 LocalFrame* frame = document().frame(); |
453 if (!frame) | 450 if (!frame) |
454 return 0; | 451 return 0; |
455 | 452 |
456 return indexForPosition(innerEditorElement(), frame->selection().end()); | 453 return indexForPosition(innerEditorElement(), frame->selection().end()); |
457 } | 454 } |
458 | 455 |
459 static const AtomicString& directionString(TextFieldSelectionDirection direction ) | 456 static const AtomicString& directionString(TextFieldSelectionDirection direction ) |
(...skipping 29 matching lines...) Expand all Loading... | |
489 { | 486 { |
490 ASSERT(isTextFormControl()); | 487 ASSERT(isTextFormControl()); |
491 LocalFrame* frame = document().frame(); | 488 LocalFrame* frame = document().frame(); |
492 if (!frame) | 489 if (!frame) |
493 return SelectionHasNoDirection; | 490 return SelectionHasNoDirection; |
494 | 491 |
495 const VisibleSelection& selection = frame->selection().selection(); | 492 const VisibleSelection& selection = frame->selection().selection(); |
496 return selection.isDirectional() ? (selection.isBaseFirst() ? SelectionHasFo rwardDirection : SelectionHasBackwardDirection) : SelectionHasNoDirection; | 493 return selection.isDirectional() ? (selection.isBaseFirst() ? SelectionHasFo rwardDirection : SelectionHasBackwardDirection) : SelectionHasNoDirection; |
497 } | 494 } |
498 | 495 |
499 static inline void setContainerAndOffsetForRange(Node* node, int offset, Node*& containerNode, int& offsetInContainer) | 496 static inline void setContainerAndOffsetForRange(Node* node, unsigned offset, No de*& containerNode, unsigned& offsetInContainer) |
500 { | 497 { |
501 if (node->isTextNode()) { | 498 if (node->isTextNode()) { |
502 containerNode = node; | 499 containerNode = node; |
503 offsetInContainer = offset; | 500 offsetInContainer = offset; |
504 } else { | 501 } else { |
505 containerNode = node->parentNode(); | 502 containerNode = node->parentNode(); |
506 offsetInContainer = node->nodeIndex() + offset; | 503 offsetInContainer = node->nodeIndex() + offset; |
507 } | 504 } |
508 } | 505 } |
509 | 506 |
510 PassRefPtrWillBeRawPtr<Range> HTMLTextFormControlElement::selection() const | 507 PassRefPtrWillBeRawPtr<Range> HTMLTextFormControlElement::selection() const |
511 { | 508 { |
512 if (!layoutObject() || !isTextFormControl()) | 509 if (!layoutObject() || !isTextFormControl()) |
513 return nullptr; | 510 return nullptr; |
514 | 511 |
515 int start = m_cachedSelectionStart; | 512 unsigned start = m_cachedSelectionStart; |
516 int end = m_cachedSelectionEnd; | 513 unsigned end = m_cachedSelectionEnd; |
517 | 514 |
518 ASSERT(start <= end); | 515 ASSERT(start <= end); |
519 HTMLElement* innerText = innerEditorElement(); | 516 HTMLElement* innerText = innerEditorElement(); |
520 if (!innerText) | 517 if (!innerText) |
521 return nullptr; | 518 return nullptr; |
522 | 519 |
523 if (!innerText->hasChildren()) | 520 if (!innerText->hasChildren()) |
524 return Range::create(document(), innerText, 0, innerText, 0); | 521 return Range::create(document(), innerText, 0, innerText, 0); |
525 | 522 |
526 int offset = 0; | 523 unsigned offset = 0; |
527 Node* startNode = 0; | 524 Node* startNode = 0; |
528 Node* endNode = 0; | 525 Node* endNode = 0; |
529 for (Node& node : NodeTraversal::descendantsOf(*innerText)) { | 526 for (Node& node : NodeTraversal::descendantsOf(*innerText)) { |
530 ASSERT(!node.hasChildren()); | 527 ASSERT(!node.hasChildren()); |
531 ASSERT(node.isTextNode() || isHTMLBRElement(node)); | 528 ASSERT(node.isTextNode() || isHTMLBRElement(node)); |
532 int length = node.isTextNode() ? lastOffsetInNode(&node) : 1; | 529 int length = node.isTextNode() ? lastOffsetInNode(&node) : 1; |
533 | 530 |
534 if (offset <= start && start <= offset + length) | 531 if (offset <= start && start <= offset + length) |
535 setContainerAndOffsetForRange(&node, start - offset, startNode, star t); | 532 setContainerAndOffsetForRange(&node, start - offset, startNode, star t); |
536 | 533 |
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1003 } | 1000 } |
1004 | 1001 |
1005 void HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(const Ele ment& source) | 1002 void HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(const Ele ment& source) |
1006 { | 1003 { |
1007 const HTMLTextFormControlElement& sourceElement = static_cast<const HTMLText FormControlElement&>(source); | 1004 const HTMLTextFormControlElement& sourceElement = static_cast<const HTMLText FormControlElement&>(source); |
1008 m_lastChangeWasUserEdit = sourceElement.m_lastChangeWasUserEdit; | 1005 m_lastChangeWasUserEdit = sourceElement.m_lastChangeWasUserEdit; |
1009 HTMLFormControlElement::copyNonAttributePropertiesFromElement(source); | 1006 HTMLFormControlElement::copyNonAttributePropertiesFromElement(source); |
1010 } | 1007 } |
1011 | 1008 |
1012 } // namespace blink | 1009 } // namespace blink |
OLD | NEW |