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; | |
57 using namespace HTMLNames; | 56 using namespace HTMLNames; |
58 | 57 |
59 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, rangeCounter, ("Range")); | 58 DEFINE_DEBUG_ONLY_GLOBAL(WTF::RefCountedLeakCounter, rangeCounter, ("Range")); |
60 | 59 |
61 inline Range::Range(Document& ownerDocument) | 60 inline Range::Range(Document& ownerDocument) |
62 : m_ownerDocument(&ownerDocument) | 61 : m_ownerDocument(&ownerDocument) |
63 , m_start(m_ownerDocument) | 62 , m_start(m_ownerDocument) |
64 , m_end(m_ownerDocument) | 63 , m_end(m_ownerDocument) |
65 { | 64 { |
66 #ifndef NDEBUG | 65 #ifndef NDEBUG |
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
928 String Range::toString() const | 927 String Range::toString() const |
929 { | 928 { |
930 StringBuilder builder; | 929 StringBuilder builder; |
931 | 930 |
932 Node* pastLast = pastLastNode(); | 931 Node* pastLast = pastLastNode(); |
933 for (Node* n = firstNode(); n != pastLast; n = NodeTraversal::next(*n)) { | 932 for (Node* n = firstNode(); n != pastLast; n = NodeTraversal::next(*n)) { |
934 Node::NodeType type = n->nodeType(); | 933 Node::NodeType type = n->nodeType(); |
935 if (type == Node::TEXT_NODE || type == Node::CDATA_SECTION_NODE) { | 934 if (type == Node::TEXT_NODE || type == Node::CDATA_SECTION_NODE) { |
936 String data = toCharacterData(n)->data(); | 935 String data = toCharacterData(n)->data(); |
937 int length = data.length(); | 936 int length = data.length(); |
938 int start = (n == m_start.container()) ? min(max(0, m_start.offset()
), length) : 0; | 937 int start = (n == m_start.container()) ? std::min(std::max(0, m_star
t.offset()), length) : 0; |
939 int end = (n == m_end.container()) ? min(max(start, m_end.offset()),
length) : length; | 938 int end = (n == m_end.container()) ? std::min(std::max(start, m_end.
offset()), length) : length; |
940 builder.append(data, start, end - start); | 939 builder.append(data, start, end - start); |
941 } | 940 } |
942 } | 941 } |
943 | 942 |
944 return builder.toString(); | 943 return builder.toString(); |
945 } | 944 } |
946 | 945 |
947 String Range::toHTML() const | 946 String Range::toHTML() const |
948 { | 947 { |
949 return createMarkup(this); | 948 return createMarkup(this); |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1333 bool allFixed = true; | 1332 bool allFixed = true; |
1334 bool someFixed = false; | 1333 bool someFixed = false; |
1335 | 1334 |
1336 Node* stopNode = pastLastNode(); | 1335 Node* stopNode = pastLastNode(); |
1337 for (Node* node = firstNode(); node != stopNode; node = NodeTraversal::next(
*node)) { | 1336 for (Node* node = firstNode(); node != stopNode; node = NodeTraversal::next(
*node)) { |
1338 RenderObject* r = node->renderer(); | 1337 RenderObject* r = node->renderer(); |
1339 if (!r || !r->isText()) | 1338 if (!r || !r->isText()) |
1340 continue; | 1339 continue; |
1341 RenderText* renderText = toRenderText(r); | 1340 RenderText* renderText = toRenderText(r); |
1342 int startOffset = node == startContainer ? m_start.offset() : 0; | 1341 int startOffset = node == startContainer ? m_start.offset() : 0; |
1343 int endOffset = node == endContainer ? m_end.offset() : numeric_limits<i
nt>::max(); | 1342 int endOffset = node == endContainer ? m_end.offset() : std::numeric_lim
its<int>::max(); |
1344 bool isFixed = false; | 1343 bool isFixed = false; |
1345 renderText->absoluteRectsForRange(rects, startOffset, endOffset, useSele
ctionHeight, &isFixed); | 1344 renderText->absoluteRectsForRange(rects, startOffset, endOffset, useSele
ctionHeight, &isFixed); |
1346 allFixed &= isFixed; | 1345 allFixed &= isFixed; |
1347 someFixed |= isFixed; | 1346 someFixed |= isFixed; |
1348 } | 1347 } |
1349 | 1348 |
1350 if (inFixed) | 1349 if (inFixed) |
1351 *inFixed = allFixed ? EntirelyFixedPosition : (someFixed ? PartiallyFixe
dPosition : NotFixedPosition); | 1350 *inFixed = allFixed ? EntirelyFixedPosition : (someFixed ? PartiallyFixe
dPosition : NotFixedPosition); |
1352 } | 1351 } |
1353 | 1352 |
1354 void Range::textQuads(Vector<FloatQuad>& quads, bool useSelectionHeight, RangeIn
FixedPosition* inFixed) const | 1353 void Range::textQuads(Vector<FloatQuad>& quads, bool useSelectionHeight, RangeIn
FixedPosition* inFixed) const |
1355 { | 1354 { |
1356 Node* startContainer = m_start.container(); | 1355 Node* startContainer = m_start.container(); |
1357 ASSERT(startContainer); | 1356 ASSERT(startContainer); |
1358 Node* endContainer = m_end.container(); | 1357 Node* endContainer = m_end.container(); |
1359 ASSERT(endContainer); | 1358 ASSERT(endContainer); |
1360 | 1359 |
1361 bool allFixed = true; | 1360 bool allFixed = true; |
1362 bool someFixed = false; | 1361 bool someFixed = false; |
1363 | 1362 |
1364 Node* stopNode = pastLastNode(); | 1363 Node* stopNode = pastLastNode(); |
1365 for (Node* node = firstNode(); node != stopNode; node = NodeTraversal::next(
*node)) { | 1364 for (Node* node = firstNode(); node != stopNode; node = NodeTraversal::next(
*node)) { |
1366 RenderObject* r = node->renderer(); | 1365 RenderObject* r = node->renderer(); |
1367 if (!r || !r->isText()) | 1366 if (!r || !r->isText()) |
1368 continue; | 1367 continue; |
1369 RenderText* renderText = toRenderText(r); | 1368 RenderText* renderText = toRenderText(r); |
1370 int startOffset = node == startContainer ? m_start.offset() : 0; | 1369 int startOffset = node == startContainer ? m_start.offset() : 0; |
1371 int endOffset = node == endContainer ? m_end.offset() : numeric_limits<i
nt>::max(); | 1370 int endOffset = node == endContainer ? m_end.offset() : std::numeric_lim
its<int>::max(); |
1372 bool isFixed = false; | 1371 bool isFixed = false; |
1373 renderText->absoluteQuadsForRange(quads, startOffset, endOffset, useSele
ctionHeight, &isFixed); | 1372 renderText->absoluteQuadsForRange(quads, startOffset, endOffset, useSele
ctionHeight, &isFixed); |
1374 allFixed &= isFixed; | 1373 allFixed &= isFixed; |
1375 someFixed |= isFixed; | 1374 someFixed |= isFixed; |
1376 } | 1375 } |
1377 | 1376 |
1378 if (inFixed) | 1377 if (inFixed) |
1379 *inFixed = allFixed ? EntirelyFixedPosition : (someFixed ? PartiallyFixe
dPosition : NotFixedPosition); | 1378 *inFixed = allFixed ? EntirelyFixedPosition : (someFixed ? PartiallyFixe
dPosition : NotFixedPosition); |
1380 } | 1379 } |
1381 | 1380 |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1672 | 1671 |
1673 void showTree(const WebCore::Range* range) | 1672 void showTree(const WebCore::Range* range) |
1674 { | 1673 { |
1675 if (range && range->boundaryPointsValid()) { | 1674 if (range && range->boundaryPointsValid()) { |
1676 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); | 1675 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); |
1677 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); | 1676 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); |
1678 } | 1677 } |
1679 } | 1678 } |
1680 | 1679 |
1681 #endif | 1680 #endif |
OLD | NEW |