Changeset 93935 in webkit
- Timestamp:
- Aug 26, 2011, 9:42:59 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 8 added
- 7 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/editing/selection/move-by-word-visually-crash-test-1-expected.txt (added)
-
LayoutTests/editing/selection/move-by-word-visually-crash-test-1.html (added)
-
LayoutTests/editing/selection/move-by-word-visually-crash-test-2-expected.txt (added)
-
LayoutTests/editing/selection/move-by-word-visually-crash-test-2.html (added)
-
LayoutTests/editing/selection/move-by-word-visually-crash-test-3-expected.txt (added)
-
LayoutTests/editing/selection/move-by-word-visually-crash-test-3.html (added)
-
LayoutTests/editing/selection/move-by-word-visually-crash-test-4-expected.txt (added)
-
LayoutTests/editing/selection/move-by-word-visually-crash-test-4.html (added)
-
LayoutTests/editing/selection/move-by-word-visually-multi-line-expected.txt (modified) (6 diffs)
-
LayoutTests/editing/selection/resources/move-by-word-visually.js (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/editing/htmlediting.cpp (modified) (1 diff)
-
Source/WebCore/editing/htmlediting.h (modified) (1 diff)
-
Source/WebCore/editing/visible_units.cpp (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r93934 r93935 1 2011-08-26 Xiaomei Ji <xji@chromium.org> 2 3 Regression(91788): Bad cast in WebCore::blockWithNextLineBox 4 https://bugs.webkit.org/show_bug.cgi?id=66090 5 6 Reviewed by Ryosuke Niwa. 7 8 * editing/selection/move-by-word-visually-crash-test-1-expected.txt: Added. 9 * editing/selection/move-by-word-visually-crash-test-1.html: Added. 10 * editing/selection/move-by-word-visually-crash-test-2-expected.txt: Added. 11 * editing/selection/move-by-word-visually-crash-test-2.html: Added. 12 * editing/selection/move-by-word-visually-crash-test-3-expected.txt: Added. 13 * editing/selection/move-by-word-visually-crash-test-3.html: Added. 14 * editing/selection/move-by-word-visually-crash-test-4-expected.txt: Added. 15 * editing/selection/move-by-word-visually-crash-test-4.html: Added. 16 * editing/selection/move-by-word-visually-multi-line-expected.txt: 17 * editing/selection/resources/move-by-word-visually.js: 18 (runMoveLeftRight): 19 1 20 2011-08-26 Gavin Barraclough <barraclough@apple.com> 2 21 -
trunk/LayoutTests/editing/selection/move-by-word-visually-multi-line-expected.txt
r92223 r93935 8 8 Test 2, LTR: 9 9 Move right by one word 10 "abc def ghi jkl mn "[0, 4, 8, 12, 16, 18], "opq rst uvw xyz"[0, 4, 8, 12, 15] 10 "abc def ghi jkl mn "[0, 4, 8, 12, 16, 18] FAIL expected: ["abc def ghi jkl mn "[ 0, 4, 8, 12, 16, 18, ]"opq rst uvw xyz"[ 0, 4, 8, 12, 15] 11 "abc def ghi jkl mn "[18, 18] FAIL expected "opq rst uvw xyz"[ 0] 12 <DIV>[0, 0] FAIL expected "opq rst uvw xyz"[ 0] 13 <DIV>[0, 0] FAIL expected "opq rst uvw xyz"[ 0] 14 <DIV>[0, 0] FAIL expected "opq rst uvw xyz"[ 0] 11 15 Move left by one word 12 "opq rst uvw xyz"[15, 12, 8, 4, 0], "abc def ghi jkl mn "[16, 12, 8, 4, 0] 16 "opq rst uvw xyz"[15, 12, 8, 4, 0] FAIL expected: ["opq rst uvw xyz"[ 15, 12, 8, 4, 0, ]"abc def ghi jkl mn "[ 16, 12, 8, 4, 0] 17 "opq rst uvw xyz"[0, 0] FAIL expected "abc def ghi jkl mn "[ 16] 18 <DIV>[0, 0] FAIL expected "abc def ghi jkl mn "[ 16] 19 <DIV>[0, 0] FAIL expected "abc def ghi jkl mn "[ 16] 20 <DIV>[0, 0] FAIL expected "abc def ghi jkl mn "[ 16] 13 21 Test 3, LTR: 14 22 Move right by one word … … 18 26 Test 4, LTR: 19 27 Move right by one word 20 "AAA AAA AAA AAA "[0, 3, 8, 11, 16], "AAA AAA AAA AAA"[0, 3, 8, 11, 15] 28 "AAA AAA AAA AAA "[0, 3, 8, 11, 16] FAIL expected: ["AAA AAA AAA AAA "[ 0, 3, 8, 11, 16, ]"AAA AAA AAA AAA"[ 0, 3, 8, 11, 15] 29 "AAA AAA AAA AAA "[16, 16] FAIL expected "AAA AAA AAA AAA"[ 0] 30 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA"[ 0] 31 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA"[ 0] 32 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA"[ 0] 21 33 Move left by one word 22 "AAA AAA AAA AAA"[15, 11, 8, 3, 0], "AAA AAA AAA AAA "[11, 8, 3, 0] 34 "AAA AAA AAA AAA"[15, 11, 8, 3, 0] FAIL expected: ["AAA AAA AAA AAA"[ 15, 11, 8, 3, 0, ]"AAA AAA AAA AAA "[ 11, 8, 3, 0] 35 "AAA AAA AAA AAA"[0, 0] FAIL expected "AAA AAA AAA AAA "[ 11] 36 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA "[ 11] 37 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA "[ 11] 38 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA "[ 11] 23 39 Test 5, LTR: 24 40 Move right by one word … … 28 44 Test 6, LTR: 29 45 Move right by one word 30 " abc def AAA AAA hij AAA AAA uvw xyz "[1, 5, 9, 12, 17, 21, 25, 29, 33, 36], "AAA kj AAA mn opq AAA AAA"[0, 4, 7, 11, 14, 18, 22, 25] 46 " abc def AAA AAA hij AAA AAA uvw xyz "[1, 5, 9, 12, 17, 21, 25, 29, 33, 36] FAIL expected: [" abc def AAA AAA hij AAA AAA uvw xyz "[ 1, 5, 9, 12, 17, 21, 25, 29, 33, 36, ]"AAA kj AAA mn opq AAA AAA"[ 0, 4, 7, 11, 14, 18, 22, 25] 47 " abc def AAA AAA hij AAA AAA uvw xyz "[36, 36] FAIL expected "AAA kj AAA mn opq AAA AAA"[ 0] 48 <DIV>[0, 0] FAIL expected "AAA kj AAA mn opq AAA AAA"[ 0] 49 <DIV>[0, 0] FAIL expected "AAA kj AAA mn opq AAA AAA"[ 0] 50 <DIV>[0, 0] FAIL expected "AAA kj AAA mn opq AAA AAA"[ 0] 31 51 Move left by one word 32 "AAA kj AAA mn opq AAA AAA"[25, 22, 18, 14, 11, 7, 4, 0], " abc def AAA AAA hij AAA AAA uvw xyz "[33, 29, 25, 21, 17, 12, 9, 5, 1] 52 "AAA kj AAA mn opq AAA AAA"[25, 22, 18, 14, 11, 7, 4, 0] FAIL expected: ["AAA kj AAA mn opq AAA AAA"[ 25, 22, 18, 14, 11, 7, 4, 0, ]" abc def AAA AAA hij AAA AAA uvw xyz "[ 33, 29, 25, 21, 17, 12, 9, 5, 1] 53 "AAA kj AAA mn opq AAA AAA"[0, 0] FAIL expected " abc def AAA AAA hij AAA AAA uvw xyz "[ 33] 54 <DIV>[0, 0] FAIL expected " abc def AAA AAA hij AAA AAA uvw xyz "[ 33] 55 <DIV>[0, 0] FAIL expected " abc def AAA AAA hij AAA AAA uvw xyz "[ 33] 56 <DIV>[0, 0] FAIL expected " abc def AAA AAA hij AAA AAA uvw xyz "[ 33] 33 57 Test 7, RTL: 34 58 Move left by one word … … 38 62 Test 8, RTL: 39 63 Move left by one word 40 "abc def ghi jkl mn "[0, 3, 8, 11, 16, 18], "opq rst uvw xyz"[0, 3, 8, 11, 15] 64 "abc def ghi jkl mn "[0, 3, 8, 11, 16, 18] FAIL expected: ["abc def ghi jkl mn "[ 0, 3, 8, 11, 16, 18, ]"opq rst uvw xyz"[ 0, 3, 8, 11, 15] 65 "abc def ghi jkl mn "[18, 18] FAIL expected "opq rst uvw xyz"[ 0] 66 <DIV>[0, 0] FAIL expected "opq rst uvw xyz"[ 0] 67 <DIV>[0, 0] FAIL expected "opq rst uvw xyz"[ 0] 68 <DIV>[0, 0] FAIL expected "opq rst uvw xyz"[ 0] 41 69 Move right by one word 42 "opq rst uvw xyz"[15, 11, 8, 3, 0], "abc def ghi jkl mn "[18, 16, 11, 8, 3, 0] 70 "opq rst uvw xyz"[15, 11, 8, 3, 0] FAIL expected: ["opq rst uvw xyz"[ 15, 11, 8, 3, 0, ]"abc def ghi jkl mn "[ 18, 16, 11, 8, 3, 0] 71 "opq rst uvw xyz"[0, 0] FAIL expected "abc def ghi jkl mn "[ 18] 72 <DIV>[0, 0] FAIL expected "abc def ghi jkl mn "[ 18] 73 <DIV>[0, 0] FAIL expected "abc def ghi jkl mn "[ 18] 74 <DIV>[0, 0] FAIL expected "abc def ghi jkl mn "[ 18] 43 75 Test 9, RTL: 44 76 Move left by one word … … 48 80 Test 10, RTL: 49 81 Move left by one word 50 "AAA AAA AAA AAA "[0, 4, 8, 12, 16], "AAA AAA AAA AAA"[0, 4, 8, 12, 15] 82 "AAA AAA AAA AAA "[0, 4, 8, 12, 16] FAIL expected: ["AAA AAA AAA AAA "[ 0, 4, 8, 12, 16, ]"AAA AAA AAA AAA"[ 0, 4, 8, 12, 15] 83 "AAA AAA AAA AAA "[16, 16] FAIL expected "AAA AAA AAA AAA"[ 0] 84 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA"[ 0] 85 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA"[ 0] 86 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA"[ 0] 51 87 Move right by one word 52 "AAA AAA AAA AAA"[15, 12, 8, 4, 0], "AAA AAA AAA AAA "[12, 8, 4, 0] 88 "AAA AAA AAA AAA"[15, 12, 8, 4, 0] FAIL expected: ["AAA AAA AAA AAA"[ 15, 12, 8, 4, 0, ]"AAA AAA AAA AAA "[ 12, 8, 4, 0] 89 "AAA AAA AAA AAA"[0, 0] FAIL expected "AAA AAA AAA AAA "[ 12] 90 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA "[ 12] 91 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA "[ 12] 92 <DIV>[0, 0] FAIL expected "AAA AAA AAA AAA "[ 12] 53 93 Test 11, RTL: 54 94 Move left by one word … … 58 98 Test 12, RTL: 59 99 Move left by one word 60 " abc def AAA AAA hij AAA AAA uvw xyz "[1, 4, 9, 13, 17, 21, 25, 29, 33, 36], "AAA kj AAA mn opq AAA AAA"[0, 4, 7, 11, 14, 18, 22, 25] 100 " abc def AAA AAA hij AAA AAA uvw xyz "[1, 4, 9, 13, 17, 21, 25, 29, 33, 36] FAIL expected: [" abc def AAA AAA hij AAA AAA uvw xyz "[ 1, 4, 9, 13, 17, 21, 25, 29, 33, 36, ]"AAA kj AAA mn opq AAA AAA"[ 0, 4, 7, 11, 14, 18, 22, 25] 101 " abc def AAA AAA hij AAA AAA uvw xyz "[36, 36] FAIL expected "AAA kj AAA mn opq AAA AAA"[ 0] 102 <DIV>[0, 0] FAIL expected "AAA kj AAA mn opq AAA AAA"[ 0] 103 <DIV>[0, 0] FAIL expected "AAA kj AAA mn opq AAA AAA"[ 0] 104 <DIV>[0, 0] FAIL expected "AAA kj AAA mn opq AAA AAA"[ 0] 61 105 Move right by one word 62 "AAA kj AAA mn opq AAA AAA"[25, 22, 18, 14, 11, 7, 4, 0], " abc def AAA AAA hij AAA AAA uvw xyz "[36, 33, 29, 25, 21, 17, 13, 9, 4, 1] 106 "AAA kj AAA mn opq AAA AAA"[25, 22, 18, 14, 11, 7, 4, 0] FAIL expected: ["AAA kj AAA mn opq AAA AAA"[ 25, 22, 18, 14, 11, 7, 4, 0, ]" abc def AAA AAA hij AAA AAA uvw xyz "[ 36, 33, 29, 25, 21, 17, 13, 9, 4, 1] 107 "AAA kj AAA mn opq AAA AAA"[0, 0] FAIL expected " abc def AAA AAA hij AAA AAA uvw xyz "[ 36] 108 <DIV>[0, 0] FAIL expected " abc def AAA AAA hij AAA AAA uvw xyz "[ 36] 109 <DIV>[0, 0] FAIL expected " abc def AAA AAA hij AAA AAA uvw xyz "[ 36] 110 <DIV>[0, 0] FAIL expected " abc def AAA AAA hij AAA AAA uvw xyz "[ 36] 63 111 Test 13, LTR: 64 112 Move right by one word -
trunk/LayoutTests/editing/selection/resources/move-by-word-visually.js
r91788 r93935 267 267 } 268 268 } 269 270 document.getElementById("testMoveByWord").style.display = "none";269 if (document.getElementById("testMoveByWord")) 270 document.getElementById("testMoveByWord").style.display = "none"; 271 271 } 272 272 -
trunk/Source/WebCore/ChangeLog
r93927 r93935 1 2011-08-26 Xiaomei Ji <xji@chromium.org> 2 3 Regression(91788): Bad cast in WebCore::blockWithNextLineBox 4 https://bugs.webkit.org/show_bug.cgi?id=66090 5 6 Reviewed by Ryosuke Niwa. 7 8 This is more like (but not exactly) a revert of r91788. 9 It does not search for previous or next root inline box in different 10 render object, which completely eliminates the cause of this issue. 11 And it removes createPositionAvoidingIgnoredNode(), changed its caller 12 to use createLegacyEditingPosition(). createPositionAvoidingIgnoredNode 13 is not correct when node is a replaced element whose caretMaxOffset 14 could be greater than 1. 15 16 Tests: editing/selection/move-by-word-visually-crash-test-1.html 17 editing/selection/move-by-word-visually-crash-test-2.html 18 editing/selection/move-by-word-visually-crash-test-3.html 19 editing/selection/move-by-word-visually-crash-test-4.html 20 21 * editing/htmlediting.cpp: 22 * editing/htmlediting.h: 23 * editing/visible_units.cpp: 24 (WebCore::previousWordBreakInBoxInsideBlockWithSameDirectionality): 25 (WebCore::leftmostPositionInRTLBoxInLTRBlock): 26 (WebCore::rightmostPositionInLTRBoxInRTLBlock): 27 (WebCore::nextWordBreakInBoxInsideBlockWithDifferentDirectionality): 28 (WebCore::appendPositionAtLogicalEndOfLine): 29 (WebCore::leftInlineBox): 30 (WebCore::rightInlineBox): 31 1 32 2011-08-26 James Robinson <jamesr@chromium.org> 2 33 -
trunk/Source/WebCore/editing/htmlediting.cpp
r92695 r93935 1138 1138 } 1139 1139 1140 Position createPositionAvoidingIgnoredNode(Node* node, int offset)1141 {1142 if (!node)1143 return Position();1144 if (!node->isTextNode()) {1145 // FIXME: the pass-in offset is the caretMinOffset() or caretMaxOffset() of box.1146 // caretMaxOffset could be 1 for replacedElement, br, and hr.1147 // We should get rid of this offset checking code after we get rid of legacy editing1148 // position in rendering code.1149 if (!offset)1150 return positionBeforeNode(node);1151 ASSERT(offset == 1);1152 return positionAfterNode(node);1153 }1154 return Position(static_cast<Text*>(node), offset);1155 }1156 1157 1140 } // namespace WebCore -
trunk/Source/WebCore/editing/htmlediting.h
r92695 r93935 143 143 } 144 144 145 Position createPositionAvoidingIgnoredNode(Node*, int offset);146 147 145 // comparision functions on Position 148 146 -
trunk/Source/WebCore/editing/visible_units.cpp
r93834 r93935 1178 1178 wordBreak = previousWordBreak; 1179 1179 else { 1180 wordBreak = create PositionAvoidingIgnoredNode(box->renderer()->node(), box->caretMaxOffset());1180 wordBreak = createLegacyEditingPosition(box->renderer()->node(), box->caretMaxOffset()); 1181 1181 1182 1182 // Return the rightmost word boundary of LTR box or leftmost word boundary of RTL box if … … 1217 1217 1218 1218 if (previousLeaf && !previousLeaf->isLeftToRightDirection()) 1219 return create PositionAvoidingIgnoredNode(node, box->caretMaxOffset());1219 return createLegacyEditingPosition(node, box->caretMaxOffset()); 1220 1220 1221 1221 if (nextLeaf && !nextLeaf->isLeftToRightDirection()) { 1222 1222 if (previousLeaf) 1223 return create PositionAvoidingIgnoredNode(previousLeaf->renderer()->node(), previousLeaf->caretMaxOffset());1223 return createLegacyEditingPosition(previousLeaf->renderer()->node(), previousLeaf->caretMaxOffset()); 1224 1224 1225 1225 InlineBox* lastRTLLeaf; … … 1228 1228 nextLeaf = nextLeaf->nextLeafChild(); 1229 1229 } while (nextLeaf && !nextLeaf->isLeftToRightDirection()); 1230 return create PositionAvoidingIgnoredNode(lastRTLLeaf->renderer()->node(), lastRTLLeaf->caretMinOffset());1231 } 1232 1233 return create PositionAvoidingIgnoredNode(node, box->caretMinOffset());1230 return createLegacyEditingPosition(lastRTLLeaf->renderer()->node(), lastRTLLeaf->caretMinOffset()); 1231 } 1232 1233 return createLegacyEditingPosition(node, box->caretMinOffset()); 1234 1234 } 1235 1235 … … 1242 1242 1243 1243 if (nextLeaf && nextLeaf->isLeftToRightDirection()) 1244 return create PositionAvoidingIgnoredNode(node, box->caretMaxOffset());1244 return createLegacyEditingPosition(node, box->caretMaxOffset()); 1245 1245 1246 1246 if (previousLeaf && previousLeaf->isLeftToRightDirection()) { 1247 1247 if (nextLeaf) 1248 return create PositionAvoidingIgnoredNode(nextLeaf->renderer()->node(), nextLeaf->caretMaxOffset());1248 return createLegacyEditingPosition(nextLeaf->renderer()->node(), nextLeaf->caretMaxOffset()); 1249 1249 1250 1250 InlineBox* firstLTRLeaf; … … 1253 1253 previousLeaf = previousLeaf->prevLeafChild(); 1254 1254 } while (previousLeaf && previousLeaf->isLeftToRightDirection()); 1255 return create PositionAvoidingIgnoredNode(firstLTRLeaf->renderer()->node(), firstLTRLeaf->caretMinOffset());1256 } 1257 1258 return create PositionAvoidingIgnoredNode(node, box->caretMinOffset());1255 return createLegacyEditingPosition(firstLTRLeaf->renderer()->node(), firstLTRLeaf->caretMinOffset()); 1256 } 1257 1258 return createLegacyEditingPosition(node, box->caretMinOffset()); 1259 1259 } 1260 1260 … … 1302 1302 bool hasSeenWordBreakInThisBox = previousWordBreak.isNotNull(); 1303 1303 VisiblePosition wordBreak = hasSeenWordBreakInThisBox ? previousWordBreak : 1304 create PositionAvoidingIgnoredNode(box->renderer()->node(), box->caretMinOffset());1304 createLegacyEditingPosition(box->renderer()->node(), box->caretMinOffset()); 1305 1305 1306 1306 wordBreak = nextBoundary(wordBreak, nextWordPositionBoundary); … … 1341 1341 static void appendPositionAtLogicalEndOfLine(const InlineBox* box, WordBoundaryVector& orderedWordBoundaries) 1342 1342 { 1343 VisiblePosition endOfBlock = logicalEndOfLine(create PositionAvoidingIgnoredNode(box->renderer()->node(), box->caretMaxOffset()));1343 VisiblePosition endOfBlock = logicalEndOfLine(createLegacyEditingPosition(box->renderer()->node(), box->caretMaxOffset())); 1344 1344 1345 1345 int offsetOfEndOfBlock; … … 1473 1473 } 1474 1474 1475 static const RenderBlock* blockWithPreviousLineBox(const RenderBlock* startingBlock)1476 {1477 for (const RenderBlock* block = startingBlock; block; block = toRenderBlock(block->previousSibling())) {1478 if (block->childrenInline()) {1479 if (block->firstRootBox())1480 return block;1481 } else if (const RenderBlock* renderBlock = blockWithPreviousLineBox(toRenderBlock(block->lastChild())))1482 return renderBlock;1483 }1484 return 0;1485 }1486 1487 static const RootInlineBox* previousRootInlineBox(const InlineBox* box)1488 {1489 Node* node = box->renderer()->node();1490 1491 for (RenderObject* renderer = node->renderer(); renderer; renderer = renderer->parent()) {1492 if (renderer->isRenderBlock()) {1493 if (const RenderBlock* blockWithLineBoxes = blockWithPreviousLineBox(toRenderBlock(renderer->previousSibling())))1494 return blockWithLineBoxes->lastRootBox();1495 }1496 }1497 1498 return 0;1499 }1500 1501 static const RenderBlock* blockWithNextLineBox(const RenderBlock* startingBlock)1502 {1503 for (const RenderBlock* block = startingBlock; block; block = toRenderBlock(block->nextSibling())) {1504 if (block->childrenInline()) {1505 if (block->firstRootBox())1506 return block;1507 } else if (const RenderBlock* renderBlock = blockWithNextLineBox(toRenderBlock(block->firstChild())))1508 return renderBlock;1509 }1510 return 0;1511 }1512 1513 static const RootInlineBox* nextRootInlineBox(const InlineBox* box)1514 {1515 Node* node = box->renderer()->node();1516 1517 for (RenderObject* renderer = node->renderer(); renderer; renderer = renderer->parent()) {1518 if (renderer->isRenderBlock()) {1519 if (const RenderBlock* blockWithLineBoxes = blockWithNextLineBox(toRenderBlock(renderer->nextSibling())))1520 return blockWithLineBoxes->firstRootBox();1521 }1522 }1523 1524 return 0;1525 }1526 1527 1475 static const InlineBox* leftInlineBox(const InlineBox* box, TextDirection blockDirection) 1528 1476 { … … 1536 1484 return leftLineBox->lastLeafChild(); 1537 1485 1538 const RootInlineBox* leftRootInlineBox = isBlockLTR ? previousRootInlineBox(box) : nextRootInlineBox(box); 1539 return leftRootInlineBox ? leftRootInlineBox->lastLeafChild() : 0; 1486 return 0; 1540 1487 } 1541 1488 … … 1551 1498 return rightLineBox->firstLeafChild(); 1552 1499 1553 const RootInlineBox* rightRootInlineBox = isBlockLTR ? nextRootInlineBox(box) : previousRootInlineBox(box); 1554 return rightRootInlineBox ? rightRootInlineBox->firstLeafChild() : 0; 1500 return 0; 1555 1501 } 1556 1502
Note:
See TracChangeset
for help on using the changeset viewer.