| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. |
| 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 | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 | 397 |
| 398 const InlineTextBox* previousBox = leafBoxes.previousTextBox(&startBox->root
(), textBox); | 398 const InlineTextBox* previousBox = leafBoxes.previousTextBox(&startBox->root
(), textBox); |
| 399 if (previousBox) | 399 if (previousBox) |
| 400 return previousBox; | 400 return previousBox; |
| 401 | 401 |
| 402 previousBox = leafBoxes.previousTextBox(startBox->root().prevRootBox(), 0); | 402 previousBox = leafBoxes.previousTextBox(startBox->root().prevRootBox(), 0); |
| 403 if (previousBox) | 403 if (previousBox) |
| 404 return previousBox; | 404 return previousBox; |
| 405 | 405 |
| 406 while (1) { | 406 while (1) { |
| 407 Node* startNode = startBox->lineLayoutItem().nonPseudoNode(); | 407 Node* startNode = startBox->getLineLayoutItem().nonPseudoNode(); |
| 408 if (!startNode) | 408 if (!startNode) |
| 409 break; | 409 break; |
| 410 | 410 |
| 411 Position position = previousRootInlineBoxCandidatePosition(startNode, vi
siblePosition, ContentIsEditable); | 411 Position position = previousRootInlineBoxCandidatePosition(startNode, vi
siblePosition, ContentIsEditable); |
| 412 if (position.isNull()) | 412 if (position.isNull()) |
| 413 break; | 413 break; |
| 414 | 414 |
| 415 RenderedPosition renderedPosition(position, TextAffinity::Downstream); | 415 RenderedPosition renderedPosition(position, TextAffinity::Downstream); |
| 416 RootInlineBox* previousRoot = renderedPosition.rootBox(); | 416 RootInlineBox* previousRoot = renderedPosition.rootBox(); |
| 417 if (!previousRoot) | 417 if (!previousRoot) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 438 | 438 |
| 439 const InlineTextBox* nextBox = leafBoxes.nextTextBox(&startBox->root(), text
Box); | 439 const InlineTextBox* nextBox = leafBoxes.nextTextBox(&startBox->root(), text
Box); |
| 440 if (nextBox) | 440 if (nextBox) |
| 441 return nextBox; | 441 return nextBox; |
| 442 | 442 |
| 443 nextBox = leafBoxes.nextTextBox(startBox->root().nextRootBox(), 0); | 443 nextBox = leafBoxes.nextTextBox(startBox->root().nextRootBox(), 0); |
| 444 if (nextBox) | 444 if (nextBox) |
| 445 return nextBox; | 445 return nextBox; |
| 446 | 446 |
| 447 while (1) { | 447 while (1) { |
| 448 Node* startNode =startBox->lineLayoutItem().nonPseudoNode(); | 448 Node* startNode =startBox->getLineLayoutItem().nonPseudoNode(); |
| 449 if (!startNode) | 449 if (!startNode) |
| 450 break; | 450 break; |
| 451 | 451 |
| 452 Position position = nextRootInlineBoxCandidatePosition(startNode, visibl
ePosition, ContentIsEditable); | 452 Position position = nextRootInlineBoxCandidatePosition(startNode, visibl
ePosition, ContentIsEditable); |
| 453 if (position.isNull()) | 453 if (position.isNull()) |
| 454 break; | 454 break; |
| 455 | 455 |
| 456 RenderedPosition renderedPosition(position, TextAffinity::Downstream); | 456 RenderedPosition renderedPosition(position, TextAffinity::Downstream); |
| 457 RootInlineBox* nextRoot = renderedPosition.rootBox(); | 457 RootInlineBox* nextRoot = renderedPosition.rootBox(); |
| 458 if (!nextRoot) | 458 if (!nextRoot) |
| (...skipping 17 matching lines...) Expand all Loading... |
| 476 { | 476 { |
| 477 previousBoxInDifferentBlock = false; | 477 previousBoxInDifferentBlock = false; |
| 478 | 478 |
| 479 // FIXME: Handle the case when we don't have an inline text box. | 479 // FIXME: Handle the case when we don't have an inline text box. |
| 480 const InlineTextBox* previousBox = logicallyPreviousBox(visiblePosition, tex
tBox, previousBoxInDifferentBlock, leafBoxes); | 480 const InlineTextBox* previousBox = logicallyPreviousBox(visiblePosition, tex
tBox, previousBoxInDifferentBlock, leafBoxes); |
| 481 | 481 |
| 482 int len = 0; | 482 int len = 0; |
| 483 string.clear(); | 483 string.clear(); |
| 484 if (previousBox) { | 484 if (previousBox) { |
| 485 previousBoxLength = previousBox->len(); | 485 previousBoxLength = previousBox->len(); |
| 486 previousBox->lineLayoutItem().text().appendTo(string, previousBox->start
(), previousBoxLength); | 486 previousBox->getLineLayoutItem().text().appendTo(string, previousBox->st
art(), previousBoxLength); |
| 487 len += previousBoxLength; | 487 len += previousBoxLength; |
| 488 } | 488 } |
| 489 textBox->lineLayoutItem().text().appendTo(string, textBox->start(), textBox-
>len()); | 489 textBox->getLineLayoutItem().text().appendTo(string, textBox->start(), textB
ox->len()); |
| 490 len += textBox->len(); | 490 len += textBox->len(); |
| 491 | 491 |
| 492 return wordBreakIterator(string.data(), len); | 492 return wordBreakIterator(string.data(), len); |
| 493 } | 493 } |
| 494 | 494 |
| 495 static TextBreakIterator* wordBreakIteratorForMaxOffsetBoundary(const VisiblePos
ition& visiblePosition, const InlineTextBox* textBox, | 495 static TextBreakIterator* wordBreakIteratorForMaxOffsetBoundary(const VisiblePos
ition& visiblePosition, const InlineTextBox* textBox, |
| 496 bool& nextBoxInDifferentBlock, Vector<UChar, 1024>& string, CachedLogicallyO
rderedLeafBoxes& leafBoxes) | 496 bool& nextBoxInDifferentBlock, Vector<UChar, 1024>& string, CachedLogicallyO
rderedLeafBoxes& leafBoxes) |
| 497 { | 497 { |
| 498 nextBoxInDifferentBlock = false; | 498 nextBoxInDifferentBlock = false; |
| 499 | 499 |
| 500 // FIXME: Handle the case when we don't have an inline text box. | 500 // FIXME: Handle the case when we don't have an inline text box. |
| 501 const InlineTextBox* nextBox = logicallyNextBox(visiblePosition, textBox, ne
xtBoxInDifferentBlock, leafBoxes); | 501 const InlineTextBox* nextBox = logicallyNextBox(visiblePosition, textBox, ne
xtBoxInDifferentBlock, leafBoxes); |
| 502 | 502 |
| 503 int len = 0; | 503 int len = 0; |
| 504 string.clear(); | 504 string.clear(); |
| 505 textBox->lineLayoutItem().text().appendTo(string, textBox->start(), textBox-
>len()); | 505 textBox->getLineLayoutItem().text().appendTo(string, textBox->start(), textB
ox->len()); |
| 506 len += textBox->len(); | 506 len += textBox->len(); |
| 507 if (nextBox) { | 507 if (nextBox) { |
| 508 nextBox->lineLayoutItem().text().appendTo(string, nextBox->start(), next
Box->len()); | 508 nextBox->getLineLayoutItem().text().appendTo(string, nextBox->start(), n
extBox->len()); |
| 509 len += nextBox->len(); | 509 len += nextBox->len(); |
| 510 } | 510 } |
| 511 | 511 |
| 512 return wordBreakIterator(string.data(), len); | 512 return wordBreakIterator(string.data(), len); |
| 513 } | 513 } |
| 514 | 514 |
| 515 static bool isLogicalStartOfWord(TextBreakIterator* iter, int position, bool har
dLineBreak) | 515 static bool isLogicalStartOfWord(TextBreakIterator* iter, int position, bool har
dLineBreak) |
| 516 { | 516 { |
| 517 bool boundary = hardLineBreak ? true : iter->isBoundary(position); | 517 bool boundary = hardLineBreak ? true : iter->isBoundary(position); |
| 518 if (!boundary) | 518 if (!boundary) |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 int previousBoxLength = 0; | 565 int previousBoxLength = 0; |
| 566 bool previousBoxInDifferentBlock = false; | 566 bool previousBoxInDifferentBlock = false; |
| 567 bool nextBoxInDifferentBlock = false; | 567 bool nextBoxInDifferentBlock = false; |
| 568 bool movingIntoNewBox = previouslyVisitedBox != box; | 568 bool movingIntoNewBox = previouslyVisitedBox != box; |
| 569 | 569 |
| 570 if (offsetInBox == box->caretMinOffset()) { | 570 if (offsetInBox == box->caretMinOffset()) { |
| 571 iter = wordBreakIteratorForMinOffsetBoundary(visiblePosition, textBo
x, previousBoxLength, previousBoxInDifferentBlock, string, leafBoxes); | 571 iter = wordBreakIteratorForMinOffsetBoundary(visiblePosition, textBo
x, previousBoxLength, previousBoxInDifferentBlock, string, leafBoxes); |
| 572 } else if (offsetInBox == box->caretMaxOffset()) { | 572 } else if (offsetInBox == box->caretMaxOffset()) { |
| 573 iter = wordBreakIteratorForMaxOffsetBoundary(visiblePosition, textBo
x, nextBoxInDifferentBlock, string, leafBoxes); | 573 iter = wordBreakIteratorForMaxOffsetBoundary(visiblePosition, textBo
x, nextBoxInDifferentBlock, string, leafBoxes); |
| 574 } else if (movingIntoNewBox) { | 574 } else if (movingIntoNewBox) { |
| 575 iter = wordBreakIterator(textBox->lineLayoutItem().text(), textBox->
start(), textBox->len()); | 575 iter = wordBreakIterator(textBox->getLineLayoutItem().text(), textBo
x->start(), textBox->len()); |
| 576 previouslyVisitedBox = box; | 576 previouslyVisitedBox = box; |
| 577 } | 577 } |
| 578 | 578 |
| 579 if (!iter) | 579 if (!iter) |
| 580 break; | 580 break; |
| 581 | 581 |
| 582 iter->first(); | 582 iter->first(); |
| 583 int offsetInIterator = offsetInBox - textBox->start() + previousBoxLengt
h; | 583 int offsetInIterator = offsetInBox - textBox->start() + previousBoxLengt
h; |
| 584 | 584 |
| 585 bool isWordBreak; | 585 bool isWordBreak; |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 989 if (!startNode) | 989 if (!startNode) |
| 990 return PositionWithAffinityTemplate<Strategy>(); | 990 return PositionWithAffinityTemplate<Strategy>(); |
| 991 } else { | 991 } else { |
| 992 // Generated content (e.g. list markers and CSS :before and :after pseud
oelements) have no corresponding DOM element, | 992 // Generated content (e.g. list markers and CSS :before and :after pseud
oelements) have no corresponding DOM element, |
| 993 // and so cannot be represented by a VisiblePosition. Use whatever follo
ws instead. | 993 // and so cannot be represented by a VisiblePosition. Use whatever follo
ws instead. |
| 994 startBox = rootBox->firstLeafChild(); | 994 startBox = rootBox->firstLeafChild(); |
| 995 while (true) { | 995 while (true) { |
| 996 if (!startBox) | 996 if (!startBox) |
| 997 return PositionWithAffinityTemplate<Strategy>(); | 997 return PositionWithAffinityTemplate<Strategy>(); |
| 998 | 998 |
| 999 startNode = startBox->lineLayoutItem().nonPseudoNode(); | 999 startNode = startBox->getLineLayoutItem().nonPseudoNode(); |
| 1000 if (startNode) | 1000 if (startNode) |
| 1001 break; | 1001 break; |
| 1002 | 1002 |
| 1003 startBox = startBox->nextLeafChild(); | 1003 startBox = startBox->nextLeafChild(); |
| 1004 } | 1004 } |
| 1005 } | 1005 } |
| 1006 | 1006 |
| 1007 return PositionWithAffinityTemplate<Strategy>(startNode->isTextNode() ? Posi
tionTemplate<Strategy>(toText(startNode), toInlineTextBox(startBox)->start()) :
PositionTemplate<Strategy>::beforeNode(startNode)); | 1007 return PositionWithAffinityTemplate<Strategy>(startNode->isTextNode() ? Posi
tionTemplate<Strategy>(toText(startNode), toInlineTextBox(startBox)->start()) :
PositionTemplate<Strategy>::beforeNode(startNode)); |
| 1008 } | 1008 } |
| 1009 | 1009 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1086 return VisiblePositionTemplate<Strategy>(); | 1086 return VisiblePositionTemplate<Strategy>(); |
| 1087 } else { | 1087 } else { |
| 1088 // Generated content (e.g. list markers and CSS :before and :after | 1088 // Generated content (e.g. list markers and CSS :before and :after |
| 1089 // pseudo elements) have no corresponding DOM element, and so cannot be | 1089 // pseudo elements) have no corresponding DOM element, and so cannot be |
| 1090 // represented by a VisiblePosition. Use whatever precedes instead. | 1090 // represented by a VisiblePosition. Use whatever precedes instead. |
| 1091 endBox = rootBox->lastLeafChild(); | 1091 endBox = rootBox->lastLeafChild(); |
| 1092 while (true) { | 1092 while (true) { |
| 1093 if (!endBox) | 1093 if (!endBox) |
| 1094 return VisiblePositionTemplate<Strategy>(); | 1094 return VisiblePositionTemplate<Strategy>(); |
| 1095 | 1095 |
| 1096 endNode = endBox->lineLayoutItem().nonPseudoNode(); | 1096 endNode = endBox->getLineLayoutItem().nonPseudoNode(); |
| 1097 if (endNode) | 1097 if (endNode) |
| 1098 break; | 1098 break; |
| 1099 | 1099 |
| 1100 endBox = endBox->prevLeafChild(); | 1100 endBox = endBox->prevLeafChild(); |
| 1101 } | 1101 } |
| 1102 } | 1102 } |
| 1103 | 1103 |
| 1104 PositionTemplate<Strategy> pos; | 1104 PositionTemplate<Strategy> pos; |
| 1105 if (isHTMLBRElement(*endNode)) { | 1105 if (isHTMLBRElement(*endNode)) { |
| 1106 pos = PositionTemplate<Strategy>::beforeNode(endNode); | 1106 pos = PositionTemplate<Strategy>::beforeNode(endNode); |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1323 RenderedPosition renderedPosition((createVisiblePosition(position)))
; | 1323 RenderedPosition renderedPosition((createVisiblePosition(position)))
; |
| 1324 root = renderedPosition.rootBox(); | 1324 root = renderedPosition.rootBox(); |
| 1325 if (!root) | 1325 if (!root) |
| 1326 return createVisiblePosition(position); | 1326 return createVisiblePosition(position); |
| 1327 } | 1327 } |
| 1328 } | 1328 } |
| 1329 | 1329 |
| 1330 if (root) { | 1330 if (root) { |
| 1331 // FIXME: Can be wrong for multi-column layout and with transforms. | 1331 // FIXME: Can be wrong for multi-column layout and with transforms. |
| 1332 LayoutPoint pointInLine = absoluteLineDirectionPointToLocalPointInBlock(
root, lineDirectionPoint); | 1332 LayoutPoint pointInLine = absoluteLineDirectionPointToLocalPointInBlock(
root, lineDirectionPoint); |
| 1333 LineLayoutItem lineLayoutItem = root->closestLeafChildForPoint(pointInLi
ne, isEditablePosition(p))->lineLayoutItem(); | 1333 LineLayoutItem lineLayoutItem = root->closestLeafChildForPoint(pointInLi
ne, isEditablePosition(p))->getLineLayoutItem(); |
| 1334 Node* node = lineLayoutItem.node(); | 1334 Node* node = lineLayoutItem.node(); |
| 1335 if (node && editingIgnoresContent(node)) | 1335 if (node && editingIgnoresContent(node)) |
| 1336 return createVisiblePosition(positionInParentBeforeNode(*node)); | 1336 return createVisiblePosition(positionInParentBeforeNode(*node)); |
| 1337 return createVisiblePosition(lineLayoutItem.positionForPoint(pointInLine
)); | 1337 return createVisiblePosition(lineLayoutItem.positionForPoint(pointInLine
)); |
| 1338 } | 1338 } |
| 1339 | 1339 |
| 1340 // Could not find a previous line. This means we must already be on the firs
t line. | 1340 // Could not find a previous line. This means we must already be on the firs
t line. |
| 1341 // Move to the start of the content in this block, which effectively moves u
s | 1341 // Move to the start of the content in this block, which effectively moves u
s |
| 1342 // to the start of the line we're on. | 1342 // to the start of the line we're on. |
| 1343 Element* rootElement = node->hasEditableStyle(editableType) ? node->rootEdit
ableElement(editableType) : node->document().documentElement(); | 1343 Element* rootElement = node->hasEditableStyle(editableType) ? node->rootEdit
ableElement(editableType) : node->document().documentElement(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1379 RenderedPosition renderedPosition((createVisiblePosition(position)))
; | 1379 RenderedPosition renderedPosition((createVisiblePosition(position)))
; |
| 1380 root = renderedPosition.rootBox(); | 1380 root = renderedPosition.rootBox(); |
| 1381 if (!root) | 1381 if (!root) |
| 1382 return createVisiblePosition(position); | 1382 return createVisiblePosition(position); |
| 1383 } | 1383 } |
| 1384 } | 1384 } |
| 1385 | 1385 |
| 1386 if (root) { | 1386 if (root) { |
| 1387 // FIXME: Can be wrong for multi-column layout and with transforms. | 1387 // FIXME: Can be wrong for multi-column layout and with transforms. |
| 1388 LayoutPoint pointInLine = absoluteLineDirectionPointToLocalPointInBlock(
root, lineDirectionPoint); | 1388 LayoutPoint pointInLine = absoluteLineDirectionPointToLocalPointInBlock(
root, lineDirectionPoint); |
| 1389 LineLayoutItem lineLayoutItem = root->closestLeafChildForPoint(pointInLi
ne, isEditablePosition(p))->lineLayoutItem(); | 1389 LineLayoutItem lineLayoutItem = root->closestLeafChildForPoint(pointInLi
ne, isEditablePosition(p))->getLineLayoutItem(); |
| 1390 Node* node = lineLayoutItem.node(); | 1390 Node* node = lineLayoutItem.node(); |
| 1391 if (node && editingIgnoresContent(node)) | 1391 if (node && editingIgnoresContent(node)) |
| 1392 return createVisiblePosition(positionInParentBeforeNode(*node)); | 1392 return createVisiblePosition(positionInParentBeforeNode(*node)); |
| 1393 return createVisiblePosition(lineLayoutItem.positionForPoint(pointInLine
)); | 1393 return createVisiblePosition(lineLayoutItem.positionForPoint(pointInLine
)); |
| 1394 } | 1394 } |
| 1395 | 1395 |
| 1396 // Could not find a next line. This means we must already be on the last lin
e. | 1396 // Could not find a next line. This means we must already be on the last lin
e. |
| 1397 // Move to the end of the content in this block, which effectively moves us | 1397 // Move to the end of the content in this block, which effectively moves us |
| 1398 // to the end of the line we're on. | 1398 // to the end of the line we're on. |
| 1399 Element* rootElement = node->hasEditableStyle(editableType) ? node->rootEdit
ableElement(editableType) : node->document().documentElement(); | 1399 Element* rootElement = node->hasEditableStyle(editableType) ? node->rootEdit
ableElement(editableType) : node->document().documentElement(); |
| (...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2131 } | 2131 } |
| 2132 Node* node = position.position().anchorNode(); | 2132 Node* node = position.position().anchorNode(); |
| 2133 | 2133 |
| 2134 layoutObject = node->layoutObject(); | 2134 layoutObject = node->layoutObject(); |
| 2135 if (!layoutObject) | 2135 if (!layoutObject) |
| 2136 return LayoutRect(); | 2136 return LayoutRect(); |
| 2137 | 2137 |
| 2138 InlineBoxPosition boxPosition = computeInlineBoxPosition(position.position()
, position.affinity()); | 2138 InlineBoxPosition boxPosition = computeInlineBoxPosition(position.position()
, position.affinity()); |
| 2139 | 2139 |
| 2140 if (boxPosition.inlineBox) | 2140 if (boxPosition.inlineBox) |
| 2141 layoutObject = LineLayoutAPIShim::layoutObjectFrom(boxPosition.inlineBox
->lineLayoutItem()); | 2141 layoutObject = LineLayoutAPIShim::layoutObjectFrom(boxPosition.inlineBox
->getLineLayoutItem()); |
| 2142 | 2142 |
| 2143 return layoutObject->localCaretRect(boxPosition.inlineBox, boxPosition.offse
tInBox); | 2143 return layoutObject->localCaretRect(boxPosition.inlineBox, boxPosition.offse
tInBox); |
| 2144 } | 2144 } |
| 2145 | 2145 |
| 2146 LayoutRect localCaretRectOfPosition(const PositionWithAffinity& position, Layout
Object*& layoutObject) | 2146 LayoutRect localCaretRectOfPosition(const PositionWithAffinity& position, Layout
Object*& layoutObject) |
| 2147 { | 2147 { |
| 2148 return localCaretRectOfPositionTemplate<EditingStrategy>(position, layoutObj
ect); | 2148 return localCaretRectOfPositionTemplate<EditingStrategy>(position, layoutObj
ect); |
| 2149 } | 2149 } |
| 2150 | 2150 |
| 2151 LayoutRect localCaretRectOfPosition(const PositionInFlatTreeWithAffinity& positi
on, LayoutObject*& layoutObject) | 2151 LayoutRect localCaretRectOfPosition(const PositionInFlatTreeWithAffinity& positi
on, LayoutObject*& layoutObject) |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2566 | 2566 |
| 2567 // The text continues on the next line only if the last text box
is not on this line and | 2567 // The text continues on the next line only if the last text box
is not on this line and |
| 2568 // none of the boxes on this line have a larger start offset. | 2568 // none of the boxes on this line have a larger start offset. |
| 2569 | 2569 |
| 2570 bool continuesOnNextLine = true; | 2570 bool continuesOnNextLine = true; |
| 2571 InlineBox* otherBox = box; | 2571 InlineBox* otherBox = box; |
| 2572 while (continuesOnNextLine) { | 2572 while (continuesOnNextLine) { |
| 2573 otherBox = otherBox->nextLeafChild(); | 2573 otherBox = otherBox->nextLeafChild(); |
| 2574 if (!otherBox) | 2574 if (!otherBox) |
| 2575 break; | 2575 break; |
| 2576 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(other
Box)->start() > textOffset)) | 2576 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->getLineLayoutItem()) == textLayoutObject && toInlineTextBox(ot
herBox)->start() > textOffset)) |
| 2577 continuesOnNextLine = false; | 2577 continuesOnNextLine = false; |
| 2578 } | 2578 } |
| 2579 | 2579 |
| 2580 otherBox = box; | 2580 otherBox = box; |
| 2581 while (continuesOnNextLine) { | 2581 while (continuesOnNextLine) { |
| 2582 otherBox = otherBox->prevLeafChild(); | 2582 otherBox = otherBox->prevLeafChild(); |
| 2583 if (!otherBox) | 2583 if (!otherBox) |
| 2584 break; | 2584 break; |
| 2585 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(other
Box)->start() > textOffset)) | 2585 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->getLineLayoutItem()) == textLayoutObject && toInlineTextBox(ot
herBox)->start() > textOffset)) |
| 2586 continuesOnNextLine = false; | 2586 continuesOnNextLine = false; |
| 2587 } | 2587 } |
| 2588 | 2588 |
| 2589 if (continuesOnNextLine) | 2589 if (continuesOnNextLine) |
| 2590 return currentPos.computePosition(); | 2590 return currentPos.computePosition(); |
| 2591 } | 2591 } |
| 2592 } | 2592 } |
| 2593 } | 2593 } |
| 2594 return lastVisible.deprecatedComputePosition(); | 2594 return lastVisible.deprecatedComputePosition(); |
| 2595 } | 2595 } |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2697 | 2697 |
| 2698 // The text continues on the next line only if the last text box
is not on this line and | 2698 // The text continues on the next line only if the last text box
is not on this line and |
| 2699 // none of the boxes on this line have a larger start offset. | 2699 // none of the boxes on this line have a larger start offset. |
| 2700 | 2700 |
| 2701 bool continuesOnNextLine = true; | 2701 bool continuesOnNextLine = true; |
| 2702 InlineBox* otherBox = box; | 2702 InlineBox* otherBox = box; |
| 2703 while (continuesOnNextLine) { | 2703 while (continuesOnNextLine) { |
| 2704 otherBox = otherBox->nextLeafChild(); | 2704 otherBox = otherBox->nextLeafChild(); |
| 2705 if (!otherBox) | 2705 if (!otherBox) |
| 2706 break; | 2706 break; |
| 2707 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(other
Box)->start() >= textOffset)) | 2707 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->getLineLayoutItem()) == textLayoutObject && toInlineTextBox(ot
herBox)->start() >= textOffset)) |
| 2708 continuesOnNextLine = false; | 2708 continuesOnNextLine = false; |
| 2709 } | 2709 } |
| 2710 | 2710 |
| 2711 otherBox = box; | 2711 otherBox = box; |
| 2712 while (continuesOnNextLine) { | 2712 while (continuesOnNextLine) { |
| 2713 otherBox = otherBox->prevLeafChild(); | 2713 otherBox = otherBox->prevLeafChild(); |
| 2714 if (!otherBox) | 2714 if (!otherBox) |
| 2715 break; | 2715 break; |
| 2716 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->lineLayoutItem()) == textLayoutObject && toInlineTextBox(other
Box)->start() >= textOffset)) | 2716 if (otherBox == lastTextBox || (LineLayoutAPIShim::layoutObj
ectFrom(otherBox->getLineLayoutItem()) == textLayoutObject && toInlineTextBox(ot
herBox)->start() >= textOffset)) |
| 2717 continuesOnNextLine = false; | 2717 continuesOnNextLine = false; |
| 2718 } | 2718 } |
| 2719 | 2719 |
| 2720 if (continuesOnNextLine) | 2720 if (continuesOnNextLine) |
| 2721 return currentPos.computePosition(); | 2721 return currentPos.computePosition(); |
| 2722 } | 2722 } |
| 2723 } | 2723 } |
| 2724 } | 2724 } |
| 2725 | 2725 |
| 2726 return lastVisible.deprecatedComputePosition(); | 2726 return lastVisible.deprecatedComputePosition(); |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2939 TextDirection primaryDirection = primaryDirectionOf(*p.anchorNode()); | 2939 TextDirection primaryDirection = primaryDirectionOf(*p.anchorNode()); |
| 2940 const TextAffinity affinity = visiblePosition.affinity(); | 2940 const TextAffinity affinity = visiblePosition.affinity(); |
| 2941 | 2941 |
| 2942 while (true) { | 2942 while (true) { |
| 2943 InlineBoxPosition boxPosition = computeInlineBoxPosition(p, affinity, pr
imaryDirection); | 2943 InlineBoxPosition boxPosition = computeInlineBoxPosition(p, affinity, pr
imaryDirection); |
| 2944 InlineBox* box = boxPosition.inlineBox; | 2944 InlineBox* box = boxPosition.inlineBox; |
| 2945 int offset = boxPosition.offsetInBox; | 2945 int offset = boxPosition.offsetInBox; |
| 2946 if (!box) | 2946 if (!box) |
| 2947 return primaryDirection == LTR ? previousVisuallyDistinctCandidate(d
eepPosition) : nextVisuallyDistinctCandidate(deepPosition); | 2947 return primaryDirection == LTR ? previousVisuallyDistinctCandidate(d
eepPosition) : nextVisuallyDistinctCandidate(deepPosition); |
| 2948 | 2948 |
| 2949 LineLayoutItem lineLayoutItem = box->lineLayoutItem(); | 2949 LineLayoutItem lineLayoutItem = box->getLineLayoutItem(); |
| 2950 | 2950 |
| 2951 while (true) { | 2951 while (true) { |
| 2952 if ((lineLayoutItem.isAtomicInlineLevel() || lineLayoutItem.isBR())
&& offset == box->caretRightmostOffset()) | 2952 if ((lineLayoutItem.isAtomicInlineLevel() || lineLayoutItem.isBR())
&& offset == box->caretRightmostOffset()) |
| 2953 return box->isLeftToRightDirection() ? previousVisuallyDistinctC
andidate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition); | 2953 return box->isLeftToRightDirection() ? previousVisuallyDistinctC
andidate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition); |
| 2954 | 2954 |
| 2955 if (!lineLayoutItem.node()) { | 2955 if (!lineLayoutItem.node()) { |
| 2956 box = box->prevLeafChild(); | 2956 box = box->prevLeafChild(); |
| 2957 if (!box) | 2957 if (!box) |
| 2958 return primaryDirection == LTR ? previousVisuallyDistinctCan
didate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition); | 2958 return primaryDirection == LTR ? previousVisuallyDistinctCan
didate(deepPosition) : nextVisuallyDistinctCandidate(deepPosition); |
| 2959 lineLayoutItem = box->lineLayoutItem(); | 2959 lineLayoutItem = box->getLineLayoutItem(); |
| 2960 offset = box->caretRightmostOffset(); | 2960 offset = box->caretRightmostOffset(); |
| 2961 continue; | 2961 continue; |
| 2962 } | 2962 } |
| 2963 | 2963 |
| 2964 offset = box->isLeftToRightDirection() ? lineLayoutItem.previousOffs
et(offset) : lineLayoutItem.nextOffset(offset); | 2964 offset = box->isLeftToRightDirection() ? lineLayoutItem.previousOffs
et(offset) : lineLayoutItem.nextOffset(offset); |
| 2965 | 2965 |
| 2966 int caretMinOffset = box->caretMinOffset(); | 2966 int caretMinOffset = box->caretMinOffset(); |
| 2967 int caretMaxOffset = box->caretMaxOffset(); | 2967 int caretMaxOffset = box->caretMaxOffset(); |
| 2968 | 2968 |
| 2969 if (offset > caretMinOffset && offset < caretMaxOffset) | 2969 if (offset > caretMinOffset && offset < caretMaxOffset) |
| 2970 break; | 2970 break; |
| 2971 | 2971 |
| 2972 if (box->isLeftToRightDirection() ? offset < caretMinOffset : offset
> caretMaxOffset) { | 2972 if (box->isLeftToRightDirection() ? offset < caretMinOffset : offset
> caretMaxOffset) { |
| 2973 // Overshot to the left. | 2973 // Overshot to the left. |
| 2974 InlineBox* prevBox = box->prevLeafChildIgnoringLineBreak(); | 2974 InlineBox* prevBox = box->prevLeafChildIgnoringLineBreak(); |
| 2975 if (!prevBox) { | 2975 if (!prevBox) { |
| 2976 PositionTemplate<Strategy> positionOnLeft = primaryDirection
== LTR ? previousVisuallyDistinctCandidate(visiblePosition.deepEquivalent()) :
nextVisuallyDistinctCandidate(visiblePosition.deepEquivalent()); | 2976 PositionTemplate<Strategy> positionOnLeft = primaryDirection
== LTR ? previousVisuallyDistinctCandidate(visiblePosition.deepEquivalent()) :
nextVisuallyDistinctCandidate(visiblePosition.deepEquivalent()); |
| 2977 if (positionOnLeft.isNull()) | 2977 if (positionOnLeft.isNull()) |
| 2978 return PositionTemplate<Strategy>(); | 2978 return PositionTemplate<Strategy>(); |
| 2979 | 2979 |
| 2980 InlineBox* boxOnLeft = computeInlineBoxPosition(positionOnLe
ft, affinity, primaryDirection).inlineBox; | 2980 InlineBox* boxOnLeft = computeInlineBoxPosition(positionOnLe
ft, affinity, primaryDirection).inlineBox; |
| 2981 if (boxOnLeft && boxOnLeft->root() == box->root()) | 2981 if (boxOnLeft && boxOnLeft->root() == box->root()) |
| 2982 return PositionTemplate<Strategy>(); | 2982 return PositionTemplate<Strategy>(); |
| 2983 return positionOnLeft; | 2983 return positionOnLeft; |
| 2984 } | 2984 } |
| 2985 | 2985 |
| 2986 // Reposition at the other logical position corresponding to our | 2986 // Reposition at the other logical position corresponding to our |
| 2987 // edge's visual position and go for another round. | 2987 // edge's visual position and go for another round. |
| 2988 box = prevBox; | 2988 box = prevBox; |
| 2989 lineLayoutItem = box->lineLayoutItem(); | 2989 lineLayoutItem = box->getLineLayoutItem(); |
| 2990 offset = prevBox->caretRightmostOffset(); | 2990 offset = prevBox->caretRightmostOffset(); |
| 2991 continue; | 2991 continue; |
| 2992 } | 2992 } |
| 2993 | 2993 |
| 2994 ASSERT(offset == box->caretLeftmostOffset()); | 2994 ASSERT(offset == box->caretLeftmostOffset()); |
| 2995 | 2995 |
| 2996 unsigned char level = box->bidiLevel(); | 2996 unsigned char level = box->bidiLevel(); |
| 2997 InlineBox* prevBox = box->prevLeafChild(); | 2997 InlineBox* prevBox = box->prevLeafChild(); |
| 2998 | 2998 |
| 2999 if (box->direction() == primaryDirection) { | 2999 if (box->direction() == primaryDirection) { |
| 3000 if (!prevBox) { | 3000 if (!prevBox) { |
| 3001 InlineBox* logicalStart = 0; | 3001 InlineBox* logicalStart = 0; |
| 3002 if (primaryDirection == LTR ? box->root().getLogicalStartBox
WithNode(logicalStart) : box->root().getLogicalEndBoxWithNode(logicalStart)) { | 3002 if (primaryDirection == LTR ? box->root().getLogicalStartBox
WithNode(logicalStart) : box->root().getLogicalEndBoxWithNode(logicalStart)) { |
| 3003 box = logicalStart; | 3003 box = logicalStart; |
| 3004 lineLayoutItem = box->lineLayoutItem(); | 3004 lineLayoutItem = box->getLineLayoutItem(); |
| 3005 offset = primaryDirection == LTR ? box->caretMinOffset()
: box->caretMaxOffset(); | 3005 offset = primaryDirection == LTR ? box->caretMinOffset()
: box->caretMaxOffset(); |
| 3006 } | 3006 } |
| 3007 break; | 3007 break; |
| 3008 } | 3008 } |
| 3009 if (prevBox->bidiLevel() >= level) | 3009 if (prevBox->bidiLevel() >= level) |
| 3010 break; | 3010 break; |
| 3011 | 3011 |
| 3012 level = prevBox->bidiLevel(); | 3012 level = prevBox->bidiLevel(); |
| 3013 | 3013 |
| 3014 InlineBox* nextBox = box; | 3014 InlineBox* nextBox = box; |
| 3015 do { | 3015 do { |
| 3016 nextBox = nextBox->nextLeafChild(); | 3016 nextBox = nextBox->nextLeafChild(); |
| 3017 } while (nextBox && nextBox->bidiLevel() > level); | 3017 } while (nextBox && nextBox->bidiLevel() > level); |
| 3018 | 3018 |
| 3019 if (nextBox && nextBox->bidiLevel() == level) | 3019 if (nextBox && nextBox->bidiLevel() == level) |
| 3020 break; | 3020 break; |
| 3021 | 3021 |
| 3022 box = prevBox; | 3022 box = prevBox; |
| 3023 lineLayoutItem = box->lineLayoutItem(); | 3023 lineLayoutItem = box->getLineLayoutItem(); |
| 3024 offset = box->caretRightmostOffset(); | 3024 offset = box->caretRightmostOffset(); |
| 3025 if (box->direction() == primaryDirection) | 3025 if (box->direction() == primaryDirection) |
| 3026 break; | 3026 break; |
| 3027 continue; | 3027 continue; |
| 3028 } | 3028 } |
| 3029 | 3029 |
| 3030 while (prevBox && !prevBox->lineLayoutItem().node()) | 3030 while (prevBox && !prevBox->getLineLayoutItem().node()) |
| 3031 prevBox = prevBox->prevLeafChild(); | 3031 prevBox = prevBox->prevLeafChild(); |
| 3032 | 3032 |
| 3033 if (prevBox) { | 3033 if (prevBox) { |
| 3034 box = prevBox; | 3034 box = prevBox; |
| 3035 lineLayoutItem = box->lineLayoutItem(); | 3035 lineLayoutItem = box->getLineLayoutItem(); |
| 3036 offset = box->caretRightmostOffset(); | 3036 offset = box->caretRightmostOffset(); |
| 3037 if (box->bidiLevel() > level) { | 3037 if (box->bidiLevel() > level) { |
| 3038 do { | 3038 do { |
| 3039 prevBox = prevBox->prevLeafChild(); | 3039 prevBox = prevBox->prevLeafChild(); |
| 3040 } while (prevBox && prevBox->bidiLevel() > level); | 3040 } while (prevBox && prevBox->bidiLevel() > level); |
| 3041 | 3041 |
| 3042 if (!prevBox || prevBox->bidiLevel() < level) | 3042 if (!prevBox || prevBox->bidiLevel() < level) |
| 3043 continue; | 3043 continue; |
| 3044 } | 3044 } |
| 3045 } else { | 3045 } else { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3056 level = box->bidiLevel(); | 3056 level = box->bidiLevel(); |
| 3057 while (InlineBox* prevBox = box->prevLeafChild()) { | 3057 while (InlineBox* prevBox = box->prevLeafChild()) { |
| 3058 if (prevBox->bidiLevel() < level) | 3058 if (prevBox->bidiLevel() < level) |
| 3059 break; | 3059 break; |
| 3060 box = prevBox; | 3060 box = prevBox; |
| 3061 } | 3061 } |
| 3062 if (box->bidiLevel() == level) | 3062 if (box->bidiLevel() == level) |
| 3063 break; | 3063 break; |
| 3064 level = box->bidiLevel(); | 3064 level = box->bidiLevel(); |
| 3065 } | 3065 } |
| 3066 lineLayoutItem = box->lineLayoutItem(); | 3066 lineLayoutItem = box->getLineLayoutItem(); |
| 3067 offset = primaryDirection == LTR ? box->caretMinOffset() : box->
caretMaxOffset(); | 3067 offset = primaryDirection == LTR ? box->caretMinOffset() : box->
caretMaxOffset(); |
| 3068 } | 3068 } |
| 3069 break; | 3069 break; |
| 3070 } | 3070 } |
| 3071 | 3071 |
| 3072 p = PositionTemplate<Strategy>::editingPositionOf(lineLayoutItem.node(),
offset); | 3072 p = PositionTemplate<Strategy>::editingPositionOf(lineLayoutItem.node(),
offset); |
| 3073 | 3073 |
| 3074 if ((isVisuallyEquivalentCandidate(p) && mostForwardCaretPosition(p) !=
downstreamStart) || p.atStartOfTree() || p.atEndOfTree()) | 3074 if ((isVisuallyEquivalentCandidate(p) && mostForwardCaretPosition(p) !=
downstreamStart) || p.atStartOfTree() || p.atEndOfTree()) |
| 3075 return p; | 3075 return p; |
| 3076 | 3076 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3114 TextDirection primaryDirection = primaryDirectionOf(*p.anchorNode()); | 3114 TextDirection primaryDirection = primaryDirectionOf(*p.anchorNode()); |
| 3115 const TextAffinity affinity = visiblePosition.affinity(); | 3115 const TextAffinity affinity = visiblePosition.affinity(); |
| 3116 | 3116 |
| 3117 while (true) { | 3117 while (true) { |
| 3118 InlineBoxPosition boxPosition = computeInlineBoxPosition(p, affinity, pr
imaryDirection); | 3118 InlineBoxPosition boxPosition = computeInlineBoxPosition(p, affinity, pr
imaryDirection); |
| 3119 InlineBox* box = boxPosition.inlineBox; | 3119 InlineBox* box = boxPosition.inlineBox; |
| 3120 int offset = boxPosition.offsetInBox; | 3120 int offset = boxPosition.offsetInBox; |
| 3121 if (!box) | 3121 if (!box) |
| 3122 return primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepP
osition) : previousVisuallyDistinctCandidate(deepPosition); | 3122 return primaryDirection == LTR ? nextVisuallyDistinctCandidate(deepP
osition) : previousVisuallyDistinctCandidate(deepPosition); |
| 3123 | 3123 |
| 3124 LayoutObject* layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->li
neLayoutItem()); | 3124 LayoutObject* layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->ge
tLineLayoutItem()); |
| 3125 | 3125 |
| 3126 while (true) { | 3126 while (true) { |
| 3127 if ((layoutObject->isAtomicInlineLevel() || layoutObject->isBR()) &&
offset == box->caretLeftmostOffset()) | 3127 if ((layoutObject->isAtomicInlineLevel() || layoutObject->isBR()) &&
offset == box->caretLeftmostOffset()) |
| 3128 return box->isLeftToRightDirection() ? nextVisuallyDistinctCandi
date(deepPosition) : previousVisuallyDistinctCandidate(deepPosition); | 3128 return box->isLeftToRightDirection() ? nextVisuallyDistinctCandi
date(deepPosition) : previousVisuallyDistinctCandidate(deepPosition); |
| 3129 | 3129 |
| 3130 if (!layoutObject->node()) { | 3130 if (!layoutObject->node()) { |
| 3131 box = box->nextLeafChild(); | 3131 box = box->nextLeafChild(); |
| 3132 if (!box) | 3132 if (!box) |
| 3133 return primaryDirection == LTR ? nextVisuallyDistinctCandida
te(deepPosition) : previousVisuallyDistinctCandidate(deepPosition); | 3133 return primaryDirection == LTR ? nextVisuallyDistinctCandida
te(deepPosition) : previousVisuallyDistinctCandidate(deepPosition); |
| 3134 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayo
utItem()); | 3134 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineL
ayoutItem()); |
| 3135 offset = box->caretLeftmostOffset(); | 3135 offset = box->caretLeftmostOffset(); |
| 3136 continue; | 3136 continue; |
| 3137 } | 3137 } |
| 3138 | 3138 |
| 3139 offset = box->isLeftToRightDirection() ? layoutObject->nextOffset(of
fset) : layoutObject->previousOffset(offset); | 3139 offset = box->isLeftToRightDirection() ? layoutObject->nextOffset(of
fset) : layoutObject->previousOffset(offset); |
| 3140 | 3140 |
| 3141 int caretMinOffset = box->caretMinOffset(); | 3141 int caretMinOffset = box->caretMinOffset(); |
| 3142 int caretMaxOffset = box->caretMaxOffset(); | 3142 int caretMaxOffset = box->caretMaxOffset(); |
| 3143 | 3143 |
| 3144 if (offset > caretMinOffset && offset < caretMaxOffset) | 3144 if (offset > caretMinOffset && offset < caretMaxOffset) |
| 3145 break; | 3145 break; |
| 3146 | 3146 |
| 3147 if (box->isLeftToRightDirection() ? offset > caretMaxOffset : offset
< caretMinOffset) { | 3147 if (box->isLeftToRightDirection() ? offset > caretMaxOffset : offset
< caretMinOffset) { |
| 3148 // Overshot to the right. | 3148 // Overshot to the right. |
| 3149 InlineBox* nextBox = box->nextLeafChildIgnoringLineBreak(); | 3149 InlineBox* nextBox = box->nextLeafChildIgnoringLineBreak(); |
| 3150 if (!nextBox) { | 3150 if (!nextBox) { |
| 3151 PositionTemplate<Strategy> positionOnRight = primaryDirectio
n == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinc
tCandidate(deepPosition); | 3151 PositionTemplate<Strategy> positionOnRight = primaryDirectio
n == LTR ? nextVisuallyDistinctCandidate(deepPosition) : previousVisuallyDistinc
tCandidate(deepPosition); |
| 3152 if (positionOnRight.isNull()) | 3152 if (positionOnRight.isNull()) |
| 3153 return PositionTemplate<Strategy>(); | 3153 return PositionTemplate<Strategy>(); |
| 3154 | 3154 |
| 3155 InlineBox* boxOnRight = computeInlineBoxPosition(positionOnR
ight, affinity, primaryDirection).inlineBox; | 3155 InlineBox* boxOnRight = computeInlineBoxPosition(positionOnR
ight, affinity, primaryDirection).inlineBox; |
| 3156 if (boxOnRight && boxOnRight->root() == box->root()) | 3156 if (boxOnRight && boxOnRight->root() == box->root()) |
| 3157 return PositionTemplate<Strategy>(); | 3157 return PositionTemplate<Strategy>(); |
| 3158 return positionOnRight; | 3158 return positionOnRight; |
| 3159 } | 3159 } |
| 3160 | 3160 |
| 3161 // Reposition at the other logical position corresponding to our | 3161 // Reposition at the other logical position corresponding to our |
| 3162 // edge's visual position and go for another round. | 3162 // edge's visual position and go for another round. |
| 3163 box = nextBox; | 3163 box = nextBox; |
| 3164 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayo
utItem()); | 3164 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineL
ayoutItem()); |
| 3165 offset = nextBox->caretLeftmostOffset(); | 3165 offset = nextBox->caretLeftmostOffset(); |
| 3166 continue; | 3166 continue; |
| 3167 } | 3167 } |
| 3168 | 3168 |
| 3169 ASSERT(offset == box->caretRightmostOffset()); | 3169 ASSERT(offset == box->caretRightmostOffset()); |
| 3170 | 3170 |
| 3171 unsigned char level = box->bidiLevel(); | 3171 unsigned char level = box->bidiLevel(); |
| 3172 InlineBox* nextBox = box->nextLeafChild(); | 3172 InlineBox* nextBox = box->nextLeafChild(); |
| 3173 | 3173 |
| 3174 if (box->direction() == primaryDirection) { | 3174 if (box->direction() == primaryDirection) { |
| 3175 if (!nextBox) { | 3175 if (!nextBox) { |
| 3176 InlineBox* logicalEnd = 0; | 3176 InlineBox* logicalEnd = 0; |
| 3177 if (primaryDirection == LTR ? box->root().getLogicalEndBoxWi
thNode(logicalEnd) : box->root().getLogicalStartBoxWithNode(logicalEnd)) { | 3177 if (primaryDirection == LTR ? box->root().getLogicalEndBoxWi
thNode(logicalEnd) : box->root().getLogicalStartBoxWithNode(logicalEnd)) { |
| 3178 box = logicalEnd; | 3178 box = logicalEnd; |
| 3179 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->
lineLayoutItem()); | 3179 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->
getLineLayoutItem()); |
| 3180 offset = primaryDirection == LTR ? box->caretMaxOffset()
: box->caretMinOffset(); | 3180 offset = primaryDirection == LTR ? box->caretMaxOffset()
: box->caretMinOffset(); |
| 3181 } | 3181 } |
| 3182 break; | 3182 break; |
| 3183 } | 3183 } |
| 3184 | 3184 |
| 3185 if (nextBox->bidiLevel() >= level) | 3185 if (nextBox->bidiLevel() >= level) |
| 3186 break; | 3186 break; |
| 3187 | 3187 |
| 3188 level = nextBox->bidiLevel(); | 3188 level = nextBox->bidiLevel(); |
| 3189 | 3189 |
| 3190 InlineBox* prevBox = box; | 3190 InlineBox* prevBox = box; |
| 3191 do { | 3191 do { |
| 3192 prevBox = prevBox->prevLeafChild(); | 3192 prevBox = prevBox->prevLeafChild(); |
| 3193 } while (prevBox && prevBox->bidiLevel() > level); | 3193 } while (prevBox && prevBox->bidiLevel() > level); |
| 3194 | 3194 |
| 3195 // For example, abc FED 123 ^ CBA | 3195 // For example, abc FED 123 ^ CBA |
| 3196 if (prevBox && prevBox->bidiLevel() == level) | 3196 if (prevBox && prevBox->bidiLevel() == level) |
| 3197 break; | 3197 break; |
| 3198 | 3198 |
| 3199 // For example, abc 123 ^ CBA or 123 ^ CBA abc | 3199 // For example, abc 123 ^ CBA or 123 ^ CBA abc |
| 3200 box = nextBox; | 3200 box = nextBox; |
| 3201 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayo
utItem()); | 3201 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineL
ayoutItem()); |
| 3202 offset = box->caretLeftmostOffset(); | 3202 offset = box->caretLeftmostOffset(); |
| 3203 if (box->direction() == primaryDirection) | 3203 if (box->direction() == primaryDirection) |
| 3204 break; | 3204 break; |
| 3205 continue; | 3205 continue; |
| 3206 } | 3206 } |
| 3207 | 3207 |
| 3208 while (nextBox && !nextBox->lineLayoutItem().node()) | 3208 while (nextBox && !nextBox->getLineLayoutItem().node()) |
| 3209 nextBox = nextBox->nextLeafChild(); | 3209 nextBox = nextBox->nextLeafChild(); |
| 3210 | 3210 |
| 3211 if (nextBox) { | 3211 if (nextBox) { |
| 3212 box = nextBox; | 3212 box = nextBox; |
| 3213 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayo
utItem()); | 3213 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineL
ayoutItem()); |
| 3214 offset = box->caretLeftmostOffset(); | 3214 offset = box->caretLeftmostOffset(); |
| 3215 | 3215 |
| 3216 if (box->bidiLevel() > level) { | 3216 if (box->bidiLevel() > level) { |
| 3217 do { | 3217 do { |
| 3218 nextBox = nextBox->nextLeafChild(); | 3218 nextBox = nextBox->nextLeafChild(); |
| 3219 } while (nextBox && nextBox->bidiLevel() > level); | 3219 } while (nextBox && nextBox->bidiLevel() > level); |
| 3220 | 3220 |
| 3221 if (!nextBox || nextBox->bidiLevel() < level) | 3221 if (!nextBox || nextBox->bidiLevel() < level) |
| 3222 continue; | 3222 continue; |
| 3223 } | 3223 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3234 level = box->bidiLevel(); | 3234 level = box->bidiLevel(); |
| 3235 while (InlineBox* nextBox = box->nextLeafChild()) { | 3235 while (InlineBox* nextBox = box->nextLeafChild()) { |
| 3236 if (nextBox->bidiLevel() < level) | 3236 if (nextBox->bidiLevel() < level) |
| 3237 break; | 3237 break; |
| 3238 box = nextBox; | 3238 box = nextBox; |
| 3239 } | 3239 } |
| 3240 if (box->bidiLevel() == level) | 3240 if (box->bidiLevel() == level) |
| 3241 break; | 3241 break; |
| 3242 level = box->bidiLevel(); | 3242 level = box->bidiLevel(); |
| 3243 } | 3243 } |
| 3244 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->lineLayo
utItem()); | 3244 layoutObject = LineLayoutAPIShim::layoutObjectFrom(box->getLineL
ayoutItem()); |
| 3245 offset = primaryDirection == LTR ? box->caretMaxOffset() : box->
caretMinOffset(); | 3245 offset = primaryDirection == LTR ? box->caretMaxOffset() : box->
caretMinOffset(); |
| 3246 } | 3246 } |
| 3247 break; | 3247 break; |
| 3248 } | 3248 } |
| 3249 | 3249 |
| 3250 p = PositionTemplate<Strategy>::editingPositionOf(layoutObject->node(),
offset); | 3250 p = PositionTemplate<Strategy>::editingPositionOf(layoutObject->node(),
offset); |
| 3251 | 3251 |
| 3252 if ((isVisuallyEquivalentCandidate(p) && mostForwardCaretPosition(p) !=
downstreamStart) || p.atStartOfTree() || p.atEndOfTree()) | 3252 if ((isVisuallyEquivalentCandidate(p) && mostForwardCaretPosition(p) !=
downstreamStart) || p.atStartOfTree() || p.atEndOfTree()) |
| 3253 return p; | 3253 return p; |
| 3254 | 3254 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3364 { | 3364 { |
| 3365 return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule); | 3365 return previousPositionOfAlgorithm<EditingStrategy>(visiblePosition, rule); |
| 3366 } | 3366 } |
| 3367 | 3367 |
| 3368 VisiblePositionInFlatTree previousPositionOf(const VisiblePositionInFlatTree& vi
siblePosition, EditingBoundaryCrossingRule rule) | 3368 VisiblePositionInFlatTree previousPositionOf(const VisiblePositionInFlatTree& vi
siblePosition, EditingBoundaryCrossingRule rule) |
| 3369 { | 3369 { |
| 3370 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePositio
n, rule); | 3370 return previousPositionOfAlgorithm<EditingInFlatTreeStrategy>(visiblePositio
n, rule); |
| 3371 } | 3371 } |
| 3372 | 3372 |
| 3373 } // namespace blink | 3373 } // namespace blink |
| OLD | NEW |