| 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 * Portions Copyright (c) 2011 Motorola Mobility, Inc. All rights reserved. | 3 * Portions Copyright (c) 2011 Motorola Mobility, Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 Position downstreamStart = p.downstream(); | 128 Position downstreamStart = p.downstream(); |
| 129 TextDirection primaryDirection = p.primaryDirection(); | 129 TextDirection primaryDirection = p.primaryDirection(); |
| 130 | 130 |
| 131 while (true) { | 131 while (true) { |
| 132 InlineBox* box; | 132 InlineBox* box; |
| 133 int offset; | 133 int offset; |
| 134 p.getInlineBoxAndOffset(m_affinity, primaryDirection, box, offset); | 134 p.getInlineBoxAndOffset(m_affinity, primaryDirection, box, offset); |
| 135 if (!box) | 135 if (!box) |
| 136 return primaryDirection == LTR ? previousVisuallyDistinctCandidate(m
_deepPosition) : nextVisuallyDistinctCandidate(m_deepPosition); | 136 return primaryDirection == LTR ? previousVisuallyDistinctCandidate(m
_deepPosition) : nextVisuallyDistinctCandidate(m_deepPosition); |
| 137 | 137 |
| 138 LayoutObject* renderer = &box->renderer(); | 138 LayoutObject* renderer = &box->layoutObject(); |
| 139 | 139 |
| 140 while (true) { | 140 while (true) { |
| 141 if ((renderer->isReplaced() || renderer->isBR()) && offset == box->c
aretRightmostOffset()) | 141 if ((renderer->isReplaced() || renderer->isBR()) && offset == box->c
aretRightmostOffset()) |
| 142 return box->isLeftToRightDirection() ? previousVisuallyDistinctC
andidate(m_deepPosition) : nextVisuallyDistinctCandidate(m_deepPosition); | 142 return box->isLeftToRightDirection() ? previousVisuallyDistinctC
andidate(m_deepPosition) : nextVisuallyDistinctCandidate(m_deepPosition); |
| 143 | 143 |
| 144 if (!renderer->node()) { | 144 if (!renderer->node()) { |
| 145 box = box->prevLeafChild(); | 145 box = box->prevLeafChild(); |
| 146 if (!box) | 146 if (!box) |
| 147 return primaryDirection == LTR ? previousVisuallyDistinctCan
didate(m_deepPosition) : nextVisuallyDistinctCandidate(m_deepPosition); | 147 return primaryDirection == LTR ? previousVisuallyDistinctCan
didate(m_deepPosition) : nextVisuallyDistinctCandidate(m_deepPosition); |
| 148 renderer = &box->renderer(); | 148 renderer = &box->layoutObject(); |
| 149 offset = box->caretRightmostOffset(); | 149 offset = box->caretRightmostOffset(); |
| 150 continue; | 150 continue; |
| 151 } | 151 } |
| 152 | 152 |
| 153 offset = box->isLeftToRightDirection() ? renderer->previousOffset(of
fset) : renderer->nextOffset(offset); | 153 offset = box->isLeftToRightDirection() ? renderer->previousOffset(of
fset) : renderer->nextOffset(offset); |
| 154 | 154 |
| 155 int caretMinOffset = box->caretMinOffset(); | 155 int caretMinOffset = box->caretMinOffset(); |
| 156 int caretMaxOffset = box->caretMaxOffset(); | 156 int caretMaxOffset = box->caretMaxOffset(); |
| 157 | 157 |
| 158 if (offset > caretMinOffset && offset < caretMaxOffset) | 158 if (offset > caretMinOffset && offset < caretMaxOffset) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 169 InlineBox* boxOnLeft; | 169 InlineBox* boxOnLeft; |
| 170 int offsetOnLeft; | 170 int offsetOnLeft; |
| 171 positionOnLeft.getInlineBoxAndOffset(m_affinity, primaryDire
ction, boxOnLeft, offsetOnLeft); | 171 positionOnLeft.getInlineBoxAndOffset(m_affinity, primaryDire
ction, boxOnLeft, offsetOnLeft); |
| 172 if (boxOnLeft && boxOnLeft->root() == box->root()) | 172 if (boxOnLeft && boxOnLeft->root() == box->root()) |
| 173 return Position(); | 173 return Position(); |
| 174 return positionOnLeft; | 174 return positionOnLeft; |
| 175 } | 175 } |
| 176 | 176 |
| 177 // Reposition at the other logical position corresponding to our
edge's visual position and go for another round. | 177 // Reposition at the other logical position corresponding to our
edge's visual position and go for another round. |
| 178 box = prevBox; | 178 box = prevBox; |
| 179 renderer = &box->renderer(); | 179 renderer = &box->layoutObject(); |
| 180 offset = prevBox->caretRightmostOffset(); | 180 offset = prevBox->caretRightmostOffset(); |
| 181 continue; | 181 continue; |
| 182 } | 182 } |
| 183 | 183 |
| 184 ASSERT(offset == box->caretLeftmostOffset()); | 184 ASSERT(offset == box->caretLeftmostOffset()); |
| 185 | 185 |
| 186 unsigned char level = box->bidiLevel(); | 186 unsigned char level = box->bidiLevel(); |
| 187 InlineBox* prevBox = box->prevLeafChild(); | 187 InlineBox* prevBox = box->prevLeafChild(); |
| 188 | 188 |
| 189 if (box->direction() == primaryDirection) { | 189 if (box->direction() == primaryDirection) { |
| 190 if (!prevBox) { | 190 if (!prevBox) { |
| 191 InlineBox* logicalStart = 0; | 191 InlineBox* logicalStart = 0; |
| 192 if (primaryDirection == LTR ? box->root().getLogicalStartBox
WithNode(logicalStart) : box->root().getLogicalEndBoxWithNode(logicalStart)) { | 192 if (primaryDirection == LTR ? box->root().getLogicalStartBox
WithNode(logicalStart) : box->root().getLogicalEndBoxWithNode(logicalStart)) { |
| 193 box = logicalStart; | 193 box = logicalStart; |
| 194 renderer = &box->renderer(); | 194 renderer = &box->layoutObject(); |
| 195 offset = primaryDirection == LTR ? box->caretMinOffset()
: box->caretMaxOffset(); | 195 offset = primaryDirection == LTR ? box->caretMinOffset()
: box->caretMaxOffset(); |
| 196 } | 196 } |
| 197 break; | 197 break; |
| 198 } | 198 } |
| 199 if (prevBox->bidiLevel() >= level) | 199 if (prevBox->bidiLevel() >= level) |
| 200 break; | 200 break; |
| 201 | 201 |
| 202 level = prevBox->bidiLevel(); | 202 level = prevBox->bidiLevel(); |
| 203 | 203 |
| 204 InlineBox* nextBox = box; | 204 InlineBox* nextBox = box; |
| 205 do { | 205 do { |
| 206 nextBox = nextBox->nextLeafChild(); | 206 nextBox = nextBox->nextLeafChild(); |
| 207 } while (nextBox && nextBox->bidiLevel() > level); | 207 } while (nextBox && nextBox->bidiLevel() > level); |
| 208 | 208 |
| 209 if (nextBox && nextBox->bidiLevel() == level) | 209 if (nextBox && nextBox->bidiLevel() == level) |
| 210 break; | 210 break; |
| 211 | 211 |
| 212 box = prevBox; | 212 box = prevBox; |
| 213 renderer = &box->renderer(); | 213 renderer = &box->layoutObject(); |
| 214 offset = box->caretRightmostOffset(); | 214 offset = box->caretRightmostOffset(); |
| 215 if (box->direction() == primaryDirection) | 215 if (box->direction() == primaryDirection) |
| 216 break; | 216 break; |
| 217 continue; | 217 continue; |
| 218 } | 218 } |
| 219 | 219 |
| 220 while (prevBox && !prevBox->renderer().node()) | 220 while (prevBox && !prevBox->layoutObject().node()) |
| 221 prevBox = prevBox->prevLeafChild(); | 221 prevBox = prevBox->prevLeafChild(); |
| 222 | 222 |
| 223 if (prevBox) { | 223 if (prevBox) { |
| 224 box = prevBox; | 224 box = prevBox; |
| 225 renderer = &box->renderer(); | 225 renderer = &box->layoutObject(); |
| 226 offset = box->caretRightmostOffset(); | 226 offset = box->caretRightmostOffset(); |
| 227 if (box->bidiLevel() > level) { | 227 if (box->bidiLevel() > level) { |
| 228 do { | 228 do { |
| 229 prevBox = prevBox->prevLeafChild(); | 229 prevBox = prevBox->prevLeafChild(); |
| 230 } while (prevBox && prevBox->bidiLevel() > level); | 230 } while (prevBox && prevBox->bidiLevel() > level); |
| 231 | 231 |
| 232 if (!prevBox || prevBox->bidiLevel() < level) | 232 if (!prevBox || prevBox->bidiLevel() < level) |
| 233 continue; | 233 continue; |
| 234 } | 234 } |
| 235 } else { | 235 } else { |
| 236 // Trailing edge of a secondary run. Set to the leading edge of
the entire run. | 236 // Trailing edge of a secondary run. Set to the leading edge of
the entire run. |
| 237 while (true) { | 237 while (true) { |
| 238 while (InlineBox* nextBox = box->nextLeafChild()) { | 238 while (InlineBox* nextBox = box->nextLeafChild()) { |
| 239 if (nextBox->bidiLevel() < level) | 239 if (nextBox->bidiLevel() < level) |
| 240 break; | 240 break; |
| 241 box = nextBox; | 241 box = nextBox; |
| 242 } | 242 } |
| 243 if (box->bidiLevel() == level) | 243 if (box->bidiLevel() == level) |
| 244 break; | 244 break; |
| 245 level = box->bidiLevel(); | 245 level = box->bidiLevel(); |
| 246 while (InlineBox* prevBox = box->prevLeafChild()) { | 246 while (InlineBox* prevBox = box->prevLeafChild()) { |
| 247 if (prevBox->bidiLevel() < level) | 247 if (prevBox->bidiLevel() < level) |
| 248 break; | 248 break; |
| 249 box = prevBox; | 249 box = prevBox; |
| 250 } | 250 } |
| 251 if (box->bidiLevel() == level) | 251 if (box->bidiLevel() == level) |
| 252 break; | 252 break; |
| 253 level = box->bidiLevel(); | 253 level = box->bidiLevel(); |
| 254 } | 254 } |
| 255 renderer = &box->renderer(); | 255 renderer = &box->layoutObject(); |
| 256 offset = primaryDirection == LTR ? box->caretMinOffset() : box->
caretMaxOffset(); | 256 offset = primaryDirection == LTR ? box->caretMinOffset() : box->
caretMaxOffset(); |
| 257 } | 257 } |
| 258 break; | 258 break; |
| 259 } | 259 } |
| 260 | 260 |
| 261 p = createLegacyEditingPosition(renderer->node(), offset); | 261 p = createLegacyEditingPosition(renderer->node(), offset); |
| 262 | 262 |
| 263 if ((p.isCandidate() && p.downstream() != downstreamStart) || p.atStartO
fTree() || p.atEndOfTree()) | 263 if ((p.isCandidate() && p.downstream() != downstreamStart) || p.atStartO
fTree() || p.atEndOfTree()) |
| 264 return p; | 264 return p; |
| 265 | 265 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 292 Position downstreamStart = p.downstream(); | 292 Position downstreamStart = p.downstream(); |
| 293 TextDirection primaryDirection = p.primaryDirection(); | 293 TextDirection primaryDirection = p.primaryDirection(); |
| 294 | 294 |
| 295 while (true) { | 295 while (true) { |
| 296 InlineBox* box; | 296 InlineBox* box; |
| 297 int offset; | 297 int offset; |
| 298 p.getInlineBoxAndOffset(m_affinity, primaryDirection, box, offset); | 298 p.getInlineBoxAndOffset(m_affinity, primaryDirection, box, offset); |
| 299 if (!box) | 299 if (!box) |
| 300 return primaryDirection == LTR ? nextVisuallyDistinctCandidate(m_dee
pPosition) : previousVisuallyDistinctCandidate(m_deepPosition); | 300 return primaryDirection == LTR ? nextVisuallyDistinctCandidate(m_dee
pPosition) : previousVisuallyDistinctCandidate(m_deepPosition); |
| 301 | 301 |
| 302 LayoutObject* renderer = &box->renderer(); | 302 LayoutObject* renderer = &box->layoutObject(); |
| 303 | 303 |
| 304 while (true) { | 304 while (true) { |
| 305 if ((renderer->isReplaced() || renderer->isBR()) && offset == box->c
aretLeftmostOffset()) | 305 if ((renderer->isReplaced() || renderer->isBR()) && offset == box->c
aretLeftmostOffset()) |
| 306 return box->isLeftToRightDirection() ? nextVisuallyDistinctCandi
date(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition); | 306 return box->isLeftToRightDirection() ? nextVisuallyDistinctCandi
date(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition); |
| 307 | 307 |
| 308 if (!renderer->node()) { | 308 if (!renderer->node()) { |
| 309 box = box->nextLeafChild(); | 309 box = box->nextLeafChild(); |
| 310 if (!box) | 310 if (!box) |
| 311 return primaryDirection == LTR ? nextVisuallyDistinctCandida
te(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition); | 311 return primaryDirection == LTR ? nextVisuallyDistinctCandida
te(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition); |
| 312 renderer = &box->renderer(); | 312 renderer = &box->layoutObject(); |
| 313 offset = box->caretLeftmostOffset(); | 313 offset = box->caretLeftmostOffset(); |
| 314 continue; | 314 continue; |
| 315 } | 315 } |
| 316 | 316 |
| 317 offset = box->isLeftToRightDirection() ? renderer->nextOffset(offset
) : renderer->previousOffset(offset); | 317 offset = box->isLeftToRightDirection() ? renderer->nextOffset(offset
) : renderer->previousOffset(offset); |
| 318 | 318 |
| 319 int caretMinOffset = box->caretMinOffset(); | 319 int caretMinOffset = box->caretMinOffset(); |
| 320 int caretMaxOffset = box->caretMaxOffset(); | 320 int caretMaxOffset = box->caretMaxOffset(); |
| 321 | 321 |
| 322 if (offset > caretMinOffset && offset < caretMaxOffset) | 322 if (offset > caretMinOffset && offset < caretMaxOffset) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 333 InlineBox* boxOnRight; | 333 InlineBox* boxOnRight; |
| 334 int offsetOnRight; | 334 int offsetOnRight; |
| 335 positionOnRight.getInlineBoxAndOffset(m_affinity, primaryDir
ection, boxOnRight, offsetOnRight); | 335 positionOnRight.getInlineBoxAndOffset(m_affinity, primaryDir
ection, boxOnRight, offsetOnRight); |
| 336 if (boxOnRight && boxOnRight->root() == box->root()) | 336 if (boxOnRight && boxOnRight->root() == box->root()) |
| 337 return Position(); | 337 return Position(); |
| 338 return positionOnRight; | 338 return positionOnRight; |
| 339 } | 339 } |
| 340 | 340 |
| 341 // Reposition at the other logical position corresponding to our
edge's visual position and go for another round. | 341 // Reposition at the other logical position corresponding to our
edge's visual position and go for another round. |
| 342 box = nextBox; | 342 box = nextBox; |
| 343 renderer = &box->renderer(); | 343 renderer = &box->layoutObject(); |
| 344 offset = nextBox->caretLeftmostOffset(); | 344 offset = nextBox->caretLeftmostOffset(); |
| 345 continue; | 345 continue; |
| 346 } | 346 } |
| 347 | 347 |
| 348 ASSERT(offset == box->caretRightmostOffset()); | 348 ASSERT(offset == box->caretRightmostOffset()); |
| 349 | 349 |
| 350 unsigned char level = box->bidiLevel(); | 350 unsigned char level = box->bidiLevel(); |
| 351 InlineBox* nextBox = box->nextLeafChild(); | 351 InlineBox* nextBox = box->nextLeafChild(); |
| 352 | 352 |
| 353 if (box->direction() == primaryDirection) { | 353 if (box->direction() == primaryDirection) { |
| 354 if (!nextBox) { | 354 if (!nextBox) { |
| 355 InlineBox* logicalEnd = 0; | 355 InlineBox* logicalEnd = 0; |
| 356 if (primaryDirection == LTR ? box->root().getLogicalEndBoxWi
thNode(logicalEnd) : box->root().getLogicalStartBoxWithNode(logicalEnd)) { | 356 if (primaryDirection == LTR ? box->root().getLogicalEndBoxWi
thNode(logicalEnd) : box->root().getLogicalStartBoxWithNode(logicalEnd)) { |
| 357 box = logicalEnd; | 357 box = logicalEnd; |
| 358 renderer = &box->renderer(); | 358 renderer = &box->layoutObject(); |
| 359 offset = primaryDirection == LTR ? box->caretMaxOffset()
: box->caretMinOffset(); | 359 offset = primaryDirection == LTR ? box->caretMaxOffset()
: box->caretMinOffset(); |
| 360 } | 360 } |
| 361 break; | 361 break; |
| 362 } | 362 } |
| 363 | 363 |
| 364 if (nextBox->bidiLevel() >= level) | 364 if (nextBox->bidiLevel() >= level) |
| 365 break; | 365 break; |
| 366 | 366 |
| 367 level = nextBox->bidiLevel(); | 367 level = nextBox->bidiLevel(); |
| 368 | 368 |
| 369 InlineBox* prevBox = box; | 369 InlineBox* prevBox = box; |
| 370 do { | 370 do { |
| 371 prevBox = prevBox->prevLeafChild(); | 371 prevBox = prevBox->prevLeafChild(); |
| 372 } while (prevBox && prevBox->bidiLevel() > level); | 372 } while (prevBox && prevBox->bidiLevel() > level); |
| 373 | 373 |
| 374 if (prevBox && prevBox->bidiLevel() == level) // For example,
abc FED 123 ^ CBA | 374 if (prevBox && prevBox->bidiLevel() == level) // For example,
abc FED 123 ^ CBA |
| 375 break; | 375 break; |
| 376 | 376 |
| 377 // For example, abc 123 ^ CBA or 123 ^ CBA abc | 377 // For example, abc 123 ^ CBA or 123 ^ CBA abc |
| 378 box = nextBox; | 378 box = nextBox; |
| 379 renderer = &box->renderer(); | 379 renderer = &box->layoutObject(); |
| 380 offset = box->caretLeftmostOffset(); | 380 offset = box->caretLeftmostOffset(); |
| 381 if (box->direction() == primaryDirection) | 381 if (box->direction() == primaryDirection) |
| 382 break; | 382 break; |
| 383 continue; | 383 continue; |
| 384 } | 384 } |
| 385 | 385 |
| 386 while (nextBox && !nextBox->renderer().node()) | 386 while (nextBox && !nextBox->layoutObject().node()) |
| 387 nextBox = nextBox->nextLeafChild(); | 387 nextBox = nextBox->nextLeafChild(); |
| 388 | 388 |
| 389 if (nextBox) { | 389 if (nextBox) { |
| 390 box = nextBox; | 390 box = nextBox; |
| 391 renderer = &box->renderer(); | 391 renderer = &box->layoutObject(); |
| 392 offset = box->caretLeftmostOffset(); | 392 offset = box->caretLeftmostOffset(); |
| 393 | 393 |
| 394 if (box->bidiLevel() > level) { | 394 if (box->bidiLevel() > level) { |
| 395 do { | 395 do { |
| 396 nextBox = nextBox->nextLeafChild(); | 396 nextBox = nextBox->nextLeafChild(); |
| 397 } while (nextBox && nextBox->bidiLevel() > level); | 397 } while (nextBox && nextBox->bidiLevel() > level); |
| 398 | 398 |
| 399 if (!nextBox || nextBox->bidiLevel() < level) | 399 if (!nextBox || nextBox->bidiLevel() < level) |
| 400 continue; | 400 continue; |
| 401 } | 401 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 412 level = box->bidiLevel(); | 412 level = box->bidiLevel(); |
| 413 while (InlineBox* nextBox = box->nextLeafChild()) { | 413 while (InlineBox* nextBox = box->nextLeafChild()) { |
| 414 if (nextBox->bidiLevel() < level) | 414 if (nextBox->bidiLevel() < level) |
| 415 break; | 415 break; |
| 416 box = nextBox; | 416 box = nextBox; |
| 417 } | 417 } |
| 418 if (box->bidiLevel() == level) | 418 if (box->bidiLevel() == level) |
| 419 break; | 419 break; |
| 420 level = box->bidiLevel(); | 420 level = box->bidiLevel(); |
| 421 } | 421 } |
| 422 renderer = &box->renderer(); | 422 renderer = &box->layoutObject(); |
| 423 offset = primaryDirection == LTR ? box->caretMaxOffset() : box->
caretMinOffset(); | 423 offset = primaryDirection == LTR ? box->caretMaxOffset() : box->
caretMinOffset(); |
| 424 } | 424 } |
| 425 break; | 425 break; |
| 426 } | 426 } |
| 427 | 427 |
| 428 p = createLegacyEditingPosition(renderer->node(), offset); | 428 p = createLegacyEditingPosition(renderer->node(), offset); |
| 429 | 429 |
| 430 if ((p.isCandidate() && p.downstream() != downstreamStart) || p.atStartO
fTree() || p.atEndOfTree()) | 430 if ((p.isCandidate() && p.downstream() != downstreamStart) || p.atStartO
fTree() || p.atEndOfTree()) |
| 431 return p; | 431 return p; |
| 432 | 432 |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 786 if (vpos) | 786 if (vpos) |
| 787 vpos->showTreeForThis(); | 787 vpos->showTreeForThis(); |
| 788 } | 788 } |
| 789 | 789 |
| 790 void showTree(const blink::VisiblePosition& vpos) | 790 void showTree(const blink::VisiblePosition& vpos) |
| 791 { | 791 { |
| 792 vpos.showTreeForThis(); | 792 vpos.showTreeForThis(); |
| 793 } | 793 } |
| 794 | 794 |
| 795 #endif | 795 #endif |
| OLD | NEW |