Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(466)

Side by Side Diff: Source/core/editing/VisiblePosition.cpp

Issue 184023003: Make InlineBox::renderer() and related subclass methods return reference. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: No reference reassignment. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/editing/RenderedPosition.cpp ('k') | Source/core/editing/VisibleUnits.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 RenderObject* renderer = box->renderer(); 138 RenderObject* renderer = &box->renderer();
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->renderer();
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
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->renderer();
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()->getLogicalStartBo xWithNode(logicalStart) : box->root()->getLogicalEndBoxWithNode(logicalStart)) { 192 if (primaryDirection == LTR ? box->root()->getLogicalStartBo xWithNode(logicalStart) : box->root()->getLogicalEndBoxWithNode(logicalStart)) {
193 box = logicalStart; 193 box = logicalStart;
194 renderer = box->renderer(); 194 renderer = &box->renderer();
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->renderer();
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->renderer().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->renderer();
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->renderer();
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 27 matching lines...) Expand all
293 Position downstreamStart = p.downstream(); 293 Position downstreamStart = p.downstream();
294 TextDirection primaryDirection = p.primaryDirection(); 294 TextDirection primaryDirection = p.primaryDirection();
295 295
296 while (true) { 296 while (true) {
297 InlineBox* box; 297 InlineBox* box;
298 int offset; 298 int offset;
299 p.getInlineBoxAndOffset(m_affinity, primaryDirection, box, offset); 299 p.getInlineBoxAndOffset(m_affinity, primaryDirection, box, offset);
300 if (!box) 300 if (!box)
301 return primaryDirection == LTR ? nextVisuallyDistinctCandidate(m_dee pPosition) : previousVisuallyDistinctCandidate(m_deepPosition); 301 return primaryDirection == LTR ? nextVisuallyDistinctCandidate(m_dee pPosition) : previousVisuallyDistinctCandidate(m_deepPosition);
302 302
303 RenderObject* renderer = box->renderer(); 303 RenderObject* renderer = &box->renderer();
304 304
305 while (true) { 305 while (true) {
306 if ((renderer->isReplaced() || renderer->isBR()) && offset == box->c aretLeftmostOffset()) 306 if ((renderer->isReplaced() || renderer->isBR()) && offset == box->c aretLeftmostOffset())
307 return box->isLeftToRightDirection() ? nextVisuallyDistinctCandi date(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition); 307 return box->isLeftToRightDirection() ? nextVisuallyDistinctCandi date(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition);
308 308
309 if (!renderer->node()) { 309 if (!renderer->node()) {
310 box = box->nextLeafChild(); 310 box = box->nextLeafChild();
311 if (!box) 311 if (!box)
312 return primaryDirection == LTR ? nextVisuallyDistinctCandida te(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition); 312 return primaryDirection == LTR ? nextVisuallyDistinctCandida te(m_deepPosition) : previousVisuallyDistinctCandidate(m_deepPosition);
313 renderer = box->renderer(); 313 renderer = &box->renderer();
314 offset = box->caretLeftmostOffset(); 314 offset = box->caretLeftmostOffset();
315 continue; 315 continue;
316 } 316 }
317 317
318 offset = box->isLeftToRightDirection() ? renderer->nextOffset(offset ) : renderer->previousOffset(offset); 318 offset = box->isLeftToRightDirection() ? renderer->nextOffset(offset ) : renderer->previousOffset(offset);
319 319
320 int caretMinOffset = box->caretMinOffset(); 320 int caretMinOffset = box->caretMinOffset();
321 int caretMaxOffset = box->caretMaxOffset(); 321 int caretMaxOffset = box->caretMaxOffset();
322 322
323 if (offset > caretMinOffset && offset < caretMaxOffset) 323 if (offset > caretMinOffset && offset < caretMaxOffset)
(...skipping 10 matching lines...) Expand all
334 InlineBox* boxOnRight; 334 InlineBox* boxOnRight;
335 int offsetOnRight; 335 int offsetOnRight;
336 positionOnRight.getInlineBoxAndOffset(m_affinity, primaryDir ection, boxOnRight, offsetOnRight); 336 positionOnRight.getInlineBoxAndOffset(m_affinity, primaryDir ection, boxOnRight, offsetOnRight);
337 if (boxOnRight && boxOnRight->root() == box->root()) 337 if (boxOnRight && boxOnRight->root() == box->root())
338 return Position(); 338 return Position();
339 return positionOnRight; 339 return positionOnRight;
340 } 340 }
341 341
342 // Reposition at the other logical position corresponding to our edge's visual position and go for another round. 342 // Reposition at the other logical position corresponding to our edge's visual position and go for another round.
343 box = nextBox; 343 box = nextBox;
344 renderer = box->renderer(); 344 renderer = &box->renderer();
345 offset = nextBox->caretLeftmostOffset(); 345 offset = nextBox->caretLeftmostOffset();
346 continue; 346 continue;
347 } 347 }
348 348
349 ASSERT(offset == box->caretRightmostOffset()); 349 ASSERT(offset == box->caretRightmostOffset());
350 350
351 unsigned char level = box->bidiLevel(); 351 unsigned char level = box->bidiLevel();
352 InlineBox* nextBox = box->nextLeafChild(); 352 InlineBox* nextBox = box->nextLeafChild();
353 353
354 if (box->direction() == primaryDirection) { 354 if (box->direction() == primaryDirection) {
355 if (!nextBox) { 355 if (!nextBox) {
356 InlineBox* logicalEnd = 0; 356 InlineBox* logicalEnd = 0;
357 if (primaryDirection == LTR ? box->root()->getLogicalEndBoxW ithNode(logicalEnd) : box->root()->getLogicalStartBoxWithNode(logicalEnd)) { 357 if (primaryDirection == LTR ? box->root()->getLogicalEndBoxW ithNode(logicalEnd) : box->root()->getLogicalStartBoxWithNode(logicalEnd)) {
358 box = logicalEnd; 358 box = logicalEnd;
359 renderer = box->renderer(); 359 renderer = &box->renderer();
360 offset = primaryDirection == LTR ? box->caretMaxOffset() : box->caretMinOffset(); 360 offset = primaryDirection == LTR ? box->caretMaxOffset() : box->caretMinOffset();
361 } 361 }
362 break; 362 break;
363 } 363 }
364 364
365 if (nextBox->bidiLevel() >= level) 365 if (nextBox->bidiLevel() >= level)
366 break; 366 break;
367 367
368 level = nextBox->bidiLevel(); 368 level = nextBox->bidiLevel();
369 369
370 InlineBox* prevBox = box; 370 InlineBox* prevBox = box;
371 do { 371 do {
372 prevBox = prevBox->prevLeafChild(); 372 prevBox = prevBox->prevLeafChild();
373 } while (prevBox && prevBox->bidiLevel() > level); 373 } while (prevBox && prevBox->bidiLevel() > level);
374 374
375 if (prevBox && prevBox->bidiLevel() == level) // For example, abc FED 123 ^ CBA 375 if (prevBox && prevBox->bidiLevel() == level) // For example, abc FED 123 ^ CBA
376 break; 376 break;
377 377
378 // For example, abc 123 ^ CBA or 123 ^ CBA abc 378 // For example, abc 123 ^ CBA or 123 ^ CBA abc
379 box = nextBox; 379 box = nextBox;
380 renderer = box->renderer(); 380 renderer = &box->renderer();
381 offset = box->caretLeftmostOffset(); 381 offset = box->caretLeftmostOffset();
382 if (box->direction() == primaryDirection) 382 if (box->direction() == primaryDirection)
383 break; 383 break;
384 continue; 384 continue;
385 } 385 }
386 386
387 while (nextBox && !nextBox->renderer()->node()) 387 while (nextBox && !nextBox->renderer().node())
388 nextBox = nextBox->nextLeafChild(); 388 nextBox = nextBox->nextLeafChild();
389 389
390 if (nextBox) { 390 if (nextBox) {
391 box = nextBox; 391 box = nextBox;
392 renderer = box->renderer(); 392 renderer = &box->renderer();
393 offset = box->caretLeftmostOffset(); 393 offset = box->caretLeftmostOffset();
394 394
395 if (box->bidiLevel() > level) { 395 if (box->bidiLevel() > level) {
396 do { 396 do {
397 nextBox = nextBox->nextLeafChild(); 397 nextBox = nextBox->nextLeafChild();
398 } while (nextBox && nextBox->bidiLevel() > level); 398 } while (nextBox && nextBox->bidiLevel() > level);
399 399
400 if (!nextBox || nextBox->bidiLevel() < level) 400 if (!nextBox || nextBox->bidiLevel() < level)
401 continue; 401 continue;
402 } 402 }
(...skipping 10 matching lines...) Expand all
413 level = box->bidiLevel(); 413 level = box->bidiLevel();
414 while (InlineBox* nextBox = box->nextLeafChild()) { 414 while (InlineBox* nextBox = box->nextLeafChild()) {
415 if (nextBox->bidiLevel() < level) 415 if (nextBox->bidiLevel() < level)
416 break; 416 break;
417 box = nextBox; 417 box = nextBox;
418 } 418 }
419 if (box->bidiLevel() == level) 419 if (box->bidiLevel() == level)
420 break; 420 break;
421 level = box->bidiLevel(); 421 level = box->bidiLevel();
422 } 422 }
423 renderer = box->renderer(); 423 renderer = &box->renderer();
424 offset = primaryDirection == LTR ? box->caretMaxOffset() : box-> caretMinOffset(); 424 offset = primaryDirection == LTR ? box->caretMaxOffset() : box-> caretMinOffset();
425 } 425 }
426 break; 426 break;
427 } 427 }
428 428
429 p = createLegacyEditingPosition(renderer->node(), offset); 429 p = createLegacyEditingPosition(renderer->node(), offset);
430 430
431 if ((p.isCandidate() && p.downstream() != downstreamStart) || p.atStartO fTree() || p.atEndOfTree()) 431 if ((p.isCandidate() && p.downstream() != downstreamStart) || p.atStartO fTree() || p.atEndOfTree())
432 return p; 432 return p;
433 433
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 657
658 renderer = node->renderer(); 658 renderer = node->renderer();
659 if (!renderer) 659 if (!renderer)
660 return LayoutRect(); 660 return LayoutRect();
661 661
662 InlineBox* inlineBox; 662 InlineBox* inlineBox;
663 int caretOffset; 663 int caretOffset;
664 getInlineBoxAndOffset(inlineBox, caretOffset); 664 getInlineBoxAndOffset(inlineBox, caretOffset);
665 665
666 if (inlineBox) 666 if (inlineBox)
667 renderer = inlineBox->renderer(); 667 renderer = &inlineBox->renderer();
668 668
669 return renderer->localCaretRect(inlineBox, caretOffset); 669 return renderer->localCaretRect(inlineBox, caretOffset);
670 } 670 }
671 671
672 IntRect VisiblePosition::absoluteCaretBounds() const 672 IntRect VisiblePosition::absoluteCaretBounds() const
673 { 673 {
674 RenderObject* renderer; 674 RenderObject* renderer;
675 LayoutRect localRect = localCaretRect(renderer); 675 LayoutRect localRect = localCaretRect(renderer);
676 if (localRect.isEmpty() || !renderer) 676 if (localRect.isEmpty() || !renderer)
677 return IntRect(); 677 return IntRect();
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 if (vpos) 799 if (vpos)
800 vpos->showTreeForThis(); 800 vpos->showTreeForThis();
801 } 801 }
802 802
803 void showTree(const WebCore::VisiblePosition& vpos) 803 void showTree(const WebCore::VisiblePosition& vpos)
804 { 804 {
805 vpos.showTreeForThis(); 805 vpos.showTreeForThis();
806 } 806 }
807 807
808 #endif 808 #endif
OLDNEW
« no previous file with comments | « Source/core/editing/RenderedPosition.cpp ('k') | Source/core/editing/VisibleUnits.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698