OLD | NEW |
1 /* | 1 /* |
2 * (C) 1999 Lars Knoll (knoll@kde.org) | 2 * (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 2000 Gunnstein Lye (gunnstein@netcom.no) | 3 * (C) 2000 Gunnstein Lye (gunnstein@netcom.no) |
4 * (C) 2000 Frederik Holljen (frederik.holljen@hig.no) | 4 * (C) 2000 Frederik Holljen (frederik.holljen@hig.no) |
5 * (C) 2001 Peter Kelly (pmk@post.com) | 5 * (C) 2001 Peter Kelly (pmk@post.com) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. |
7 * Copyright (C) 2011 Motorola Mobility. All rights reserved. | 7 * Copyright (C) 2011 Motorola Mobility. All rights reserved. |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 #include "platform/geometry/FloatQuad.h" | 46 #include "platform/geometry/FloatQuad.h" |
47 #include "wtf/RefCountedLeakCounter.h" | 47 #include "wtf/RefCountedLeakCounter.h" |
48 #include "wtf/text/CString.h" | 48 #include "wtf/text/CString.h" |
49 #include "wtf/text/StringBuilder.h" | 49 #include "wtf/text/StringBuilder.h" |
50 #ifndef NDEBUG | 50 #ifndef NDEBUG |
51 #include <stdio.h> | 51 #include <stdio.h> |
52 #endif | 52 #endif |
53 | 53 |
54 namespace WebCore { | 54 namespace WebCore { |
55 | 55 |
| 56 using namespace std; |
56 using namespace HTMLNames; | 57 using namespace HTMLNames; |
57 | 58 |
58 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, rangeCounter, ("Range")); | 59 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, rangeCounter, ("Range")); |
59 | 60 |
60 inline Range::Range(Document& ownerDocument) | 61 inline Range::Range(Document& ownerDocument) |
61 : m_ownerDocument(&ownerDocument) | 62 : m_ownerDocument(&ownerDocument) |
62 , m_start(m_ownerDocument) | 63 , m_start(m_ownerDocument) |
63 , m_end(m_ownerDocument) | 64 , m_end(m_ownerDocument) |
64 { | 65 { |
65 #ifndef NDEBUG | 66 #ifndef NDEBUG |
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
927 String Range::toString() const | 928 String Range::toString() const |
928 { | 929 { |
929 StringBuilder builder; | 930 StringBuilder builder; |
930 | 931 |
931 Node* pastLast = pastLastNode(); | 932 Node* pastLast = pastLastNode(); |
932 for (Node* n = firstNode(); n != pastLast; n = NodeTraversal::next(*n)) { | 933 for (Node* n = firstNode(); n != pastLast; n = NodeTraversal::next(*n)) { |
933 Node::NodeType type = n->nodeType(); | 934 Node::NodeType type = n->nodeType(); |
934 if (type == Node::TEXT_NODE || type == Node::CDATA_SECTION_NODE) { | 935 if (type == Node::TEXT_NODE || type == Node::CDATA_SECTION_NODE) { |
935 String data = toCharacterData(n)->data(); | 936 String data = toCharacterData(n)->data(); |
936 int length = data.length(); | 937 int length = data.length(); |
937 int start = (n == m_start.container()) ? std::min(std::max(0, m_star
t.offset()), length) : 0; | 938 int start = (n == m_start.container()) ? min(max(0, m_start.offset()
), length) : 0; |
938 int end = (n == m_end.container()) ? std::min(std::max(start, m_end.
offset()), length) : length; | 939 int end = (n == m_end.container()) ? min(max(start, m_end.offset()),
length) : length; |
939 builder.append(data, start, end - start); | 940 builder.append(data, start, end - start); |
940 } | 941 } |
941 } | 942 } |
942 | 943 |
943 return builder.toString(); | 944 return builder.toString(); |
944 } | 945 } |
945 | 946 |
946 String Range::toHTML() const | 947 String Range::toHTML() const |
947 { | 948 { |
948 return createMarkup(this); | 949 return createMarkup(this); |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1332 bool allFixed = true; | 1333 bool allFixed = true; |
1333 bool someFixed = false; | 1334 bool someFixed = false; |
1334 | 1335 |
1335 Node* stopNode = pastLastNode(); | 1336 Node* stopNode = pastLastNode(); |
1336 for (Node* node = firstNode(); node != stopNode; node = NodeTraversal::next(
*node)) { | 1337 for (Node* node = firstNode(); node != stopNode; node = NodeTraversal::next(
*node)) { |
1337 RenderObject* r = node->renderer(); | 1338 RenderObject* r = node->renderer(); |
1338 if (!r || !r->isText()) | 1339 if (!r || !r->isText()) |
1339 continue; | 1340 continue; |
1340 RenderText* renderText = toRenderText(r); | 1341 RenderText* renderText = toRenderText(r); |
1341 int startOffset = node == startContainer ? m_start.offset() : 0; | 1342 int startOffset = node == startContainer ? m_start.offset() : 0; |
1342 int endOffset = node == endContainer ? m_end.offset() : std::numeric_lim
its<int>::max(); | 1343 int endOffset = node == endContainer ? m_end.offset() : numeric_limits<i
nt>::max(); |
1343 bool isFixed = false; | 1344 bool isFixed = false; |
1344 renderText->absoluteRectsForRange(rects, startOffset, endOffset, useSele
ctionHeight, &isFixed); | 1345 renderText->absoluteRectsForRange(rects, startOffset, endOffset, useSele
ctionHeight, &isFixed); |
1345 allFixed &= isFixed; | 1346 allFixed &= isFixed; |
1346 someFixed |= isFixed; | 1347 someFixed |= isFixed; |
1347 } | 1348 } |
1348 | 1349 |
1349 if (inFixed) | 1350 if (inFixed) |
1350 *inFixed = allFixed ? EntirelyFixedPosition : (someFixed ? PartiallyFixe
dPosition : NotFixedPosition); | 1351 *inFixed = allFixed ? EntirelyFixedPosition : (someFixed ? PartiallyFixe
dPosition : NotFixedPosition); |
1351 } | 1352 } |
1352 | 1353 |
1353 void Range::textQuads(Vector<FloatQuad>& quads, bool useSelectionHeight, RangeIn
FixedPosition* inFixed) const | 1354 void Range::textQuads(Vector<FloatQuad>& quads, bool useSelectionHeight, RangeIn
FixedPosition* inFixed) const |
1354 { | 1355 { |
1355 Node* startContainer = m_start.container(); | 1356 Node* startContainer = m_start.container(); |
1356 ASSERT(startContainer); | 1357 ASSERT(startContainer); |
1357 Node* endContainer = m_end.container(); | 1358 Node* endContainer = m_end.container(); |
1358 ASSERT(endContainer); | 1359 ASSERT(endContainer); |
1359 | 1360 |
1360 bool allFixed = true; | 1361 bool allFixed = true; |
1361 bool someFixed = false; | 1362 bool someFixed = false; |
1362 | 1363 |
1363 Node* stopNode = pastLastNode(); | 1364 Node* stopNode = pastLastNode(); |
1364 for (Node* node = firstNode(); node != stopNode; node = NodeTraversal::next(
*node)) { | 1365 for (Node* node = firstNode(); node != stopNode; node = NodeTraversal::next(
*node)) { |
1365 RenderObject* r = node->renderer(); | 1366 RenderObject* r = node->renderer(); |
1366 if (!r || !r->isText()) | 1367 if (!r || !r->isText()) |
1367 continue; | 1368 continue; |
1368 RenderText* renderText = toRenderText(r); | 1369 RenderText* renderText = toRenderText(r); |
1369 int startOffset = node == startContainer ? m_start.offset() : 0; | 1370 int startOffset = node == startContainer ? m_start.offset() : 0; |
1370 int endOffset = node == endContainer ? m_end.offset() : std::numeric_lim
its<int>::max(); | 1371 int endOffset = node == endContainer ? m_end.offset() : numeric_limits<i
nt>::max(); |
1371 bool isFixed = false; | 1372 bool isFixed = false; |
1372 renderText->absoluteQuadsForRange(quads, startOffset, endOffset, useSele
ctionHeight, &isFixed); | 1373 renderText->absoluteQuadsForRange(quads, startOffset, endOffset, useSele
ctionHeight, &isFixed); |
1373 allFixed &= isFixed; | 1374 allFixed &= isFixed; |
1374 someFixed |= isFixed; | 1375 someFixed |= isFixed; |
1375 } | 1376 } |
1376 | 1377 |
1377 if (inFixed) | 1378 if (inFixed) |
1378 *inFixed = allFixed ? EntirelyFixedPosition : (someFixed ? PartiallyFixe
dPosition : NotFixedPosition); | 1379 *inFixed = allFixed ? EntirelyFixedPosition : (someFixed ? PartiallyFixe
dPosition : NotFixedPosition); |
1379 } | 1380 } |
1380 | 1381 |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1671 | 1672 |
1672 void showTree(const WebCore::Range* range) | 1673 void showTree(const WebCore::Range* range) |
1673 { | 1674 { |
1674 if (range && range->boundaryPointsValid()) { | 1675 if (range && range->boundaryPointsValid()) { |
1675 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); | 1676 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); |
1676 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); | 1677 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); |
1677 } | 1678 } |
1678 } | 1679 } |
1679 | 1680 |
1680 #endif | 1681 #endif |
OLD | NEW |