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 547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 case Node::DOCUMENT_NODE: | 558 case Node::DOCUMENT_NODE: |
559 case Node::DOCUMENT_FRAGMENT_NODE: | 559 case Node::DOCUMENT_FRAGMENT_NODE: |
560 return toContainerNode(node)->countChildren(); | 560 return toContainerNode(node)->countChildren(); |
561 case Node::DOCUMENT_TYPE_NODE: | 561 case Node::DOCUMENT_TYPE_NODE: |
562 return 0; | 562 return 0; |
563 } | 563 } |
564 ASSERT_NOT_REACHED(); | 564 ASSERT_NOT_REACHED(); |
565 return 0; | 565 return 0; |
566 } | 566 } |
567 | 567 |
568 PassRefPtr<DocumentFragment> Range::processContents(ActionType action, Exception
State& exceptionState) | 568 PassRefPtrWillBeRawPtr<DocumentFragment> Range::processContents(ActionType actio
n, ExceptionState& exceptionState) |
569 { | 569 { |
570 typedef Vector<RefPtr<Node> > NodeVector; | 570 typedef Vector<RefPtr<Node> > NodeVector; |
571 | 571 |
572 RefPtr<DocumentFragment> fragment; | 572 RefPtrWillBeRawPtr<DocumentFragment> fragment = nullptr; |
573 if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) | 573 if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) |
574 fragment = DocumentFragment::create(*m_ownerDocument.get()); | 574 fragment = DocumentFragment::create(*m_ownerDocument.get()); |
575 | 575 |
576 if (collapsed()) | 576 if (collapsed()) |
577 return fragment.release(); | 577 return fragment.release(); |
578 | 578 |
579 RefPtr<Node> commonRoot = commonAncestorContainer(); | 579 RefPtr<Node> commonRoot = commonAncestorContainer(); |
580 ASSERT(commonRoot); | 580 ASSERT(commonRoot); |
581 | 581 |
582 if (m_start.container() == m_end.container()) { | 582 if (m_start.container() == m_end.container()) { |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
669 } | 669 } |
670 | 670 |
671 static inline void deleteCharacterData(PassRefPtrWillBeRawPtr<CharacterData> dat
a, unsigned startOffset, unsigned endOffset, ExceptionState& exceptionState) | 671 static inline void deleteCharacterData(PassRefPtrWillBeRawPtr<CharacterData> dat
a, unsigned startOffset, unsigned endOffset, ExceptionState& exceptionState) |
672 { | 672 { |
673 if (data->length() - endOffset) | 673 if (data->length() - endOffset) |
674 data->deleteData(endOffset, data->length() - endOffset, exceptionState); | 674 data->deleteData(endOffset, data->length() - endOffset, exceptionState); |
675 if (startOffset) | 675 if (startOffset) |
676 data->deleteData(0, startOffset, exceptionState); | 676 data->deleteData(0, startOffset, exceptionState); |
677 } | 677 } |
678 | 678 |
679 PassRefPtr<Node> Range::processContentsBetweenOffsets(ActionType action, PassRef
Ptr<DocumentFragment> fragment, | 679 PassRefPtr<Node> Range::processContentsBetweenOffsets(ActionType action, PassRef
PtrWillBeRawPtr<DocumentFragment> fragment, |
680 Node* container, unsigned startOffset, unsigned endOffset, ExceptionState& e
xceptionState) | 680 Node* container, unsigned startOffset, unsigned endOffset, ExceptionState& e
xceptionState) |
681 { | 681 { |
682 ASSERT(container); | 682 ASSERT(container); |
683 ASSERT(startOffset <= endOffset); | 683 ASSERT(startOffset <= endOffset); |
684 | 684 |
685 // This switch statement must be consistent with that of lengthOfContentsInN
ode. | 685 // This switch statement must be consistent with that of lengthOfContentsInN
ode. |
686 RefPtr<Node> result; | 686 RefPtr<Node> result; |
687 switch (container->nodeType()) { | 687 switch (container->nodeType()) { |
688 case Node::TEXT_NODE: | 688 case Node::TEXT_NODE: |
689 case Node::CDATA_SECTION_NODE: | 689 case Node::CDATA_SECTION_NODE: |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
814 clonedContainer->insertBefore(child->cloneNode(true), cloned
Container->firstChild(), exceptionState); | 814 clonedContainer->insertBefore(child->cloneNode(true), cloned
Container->firstChild(), exceptionState); |
815 break; | 815 break; |
816 } | 816 } |
817 } | 817 } |
818 firstChildInAncestorToProcess = direction == ProcessContentsForward ? an
cestor->nextSibling() : ancestor->previousSibling(); | 818 firstChildInAncestorToProcess = direction == ProcessContentsForward ? an
cestor->nextSibling() : ancestor->previousSibling(); |
819 } | 819 } |
820 | 820 |
821 return clonedContainer.release(); | 821 return clonedContainer.release(); |
822 } | 822 } |
823 | 823 |
824 PassRefPtr<DocumentFragment> Range::extractContents(ExceptionState& exceptionSta
te) | 824 PassRefPtrWillBeRawPtr<DocumentFragment> Range::extractContents(ExceptionState&
exceptionState) |
825 { | 825 { |
826 checkDeleteExtract(exceptionState); | 826 checkDeleteExtract(exceptionState); |
827 if (exceptionState.hadException()) | 827 if (exceptionState.hadException()) |
828 return nullptr; | 828 return nullptr; |
829 | 829 |
830 return processContents(EXTRACT_CONTENTS, exceptionState); | 830 return processContents(EXTRACT_CONTENTS, exceptionState); |
831 } | 831 } |
832 | 832 |
833 PassRefPtr<DocumentFragment> Range::cloneContents(ExceptionState& exceptionState
) | 833 PassRefPtrWillBeRawPtr<DocumentFragment> Range::cloneContents(ExceptionState& ex
ceptionState) |
834 { | 834 { |
835 return processContents(CLONE_CONTENTS, exceptionState); | 835 return processContents(CLONE_CONTENTS, exceptionState); |
836 } | 836 } |
837 | 837 |
838 void Range::insertNode(PassRefPtr<Node> prpNewNode, ExceptionState& exceptionSta
te) | 838 void Range::insertNode(PassRefPtr<Node> prpNewNode, ExceptionState& exceptionSta
te) |
839 { | 839 { |
840 RefPtr<Node> newNode = prpNewNode; | 840 RefPtr<Node> newNode = prpNewNode; |
841 | 841 |
842 if (!newNode) { | 842 if (!newNode) { |
843 exceptionState.throwDOMException(NotFoundError, "The node provided is nu
ll."); | 843 exceptionState.throwDOMException(NotFoundError, "The node provided is nu
ll."); |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
967 | 967 |
968 String Range::text() const | 968 String Range::text() const |
969 { | 969 { |
970 // We need to update layout, since plainText uses line boxes in the render t
ree. | 970 // We need to update layout, since plainText uses line boxes in the render t
ree. |
971 // FIXME: As with innerText, we'd like this to work even if there are no ren
der objects. | 971 // FIXME: As with innerText, we'd like this to work even if there are no ren
der objects. |
972 m_start.container()->document().updateLayout(); | 972 m_start.container()->document().updateLayout(); |
973 | 973 |
974 return plainText(this); | 974 return plainText(this); |
975 } | 975 } |
976 | 976 |
977 PassRefPtr<DocumentFragment> Range::createContextualFragment(const String& marku
p, ExceptionState& exceptionState) | 977 PassRefPtrWillBeRawPtr<DocumentFragment> Range::createContextualFragment(const S
tring& markup, ExceptionState& exceptionState) |
978 { | 978 { |
979 Node* element = m_start.container()->isElementNode() ? m_start.container() :
m_start.container()->parentNode(); | 979 Node* element = m_start.container()->isElementNode() ? m_start.container() :
m_start.container()->parentNode(); |
980 if (!element || !element->isHTMLElement()) { | 980 if (!element || !element->isHTMLElement()) { |
981 exceptionState.throwDOMException(NotSupportedError, "The range's contain
er must be an HTML element."); | 981 exceptionState.throwDOMException(NotSupportedError, "The range's contain
er must be an HTML element."); |
982 return nullptr; | 982 return nullptr; |
983 } | 983 } |
984 | 984 |
985 RefPtr<DocumentFragment> fragment = WebCore::createContextualFragment(markup
, toHTMLElement(element), AllowScriptingContentAndDoNotMarkAlreadyStarted, excep
tionState); | 985 RefPtrWillBeRawPtr<DocumentFragment> fragment = WebCore::createContextualFra
gment(markup, toHTMLElement(element), AllowScriptingContentAndDoNotMarkAlreadySt
arted, exceptionState); |
986 if (!fragment) | 986 if (!fragment) |
987 return nullptr; | 987 return nullptr; |
988 | 988 |
989 return fragment.release(); | 989 return fragment.release(); |
990 } | 990 } |
991 | 991 |
992 | 992 |
993 void Range::detach() | 993 void Range::detach() |
994 { | 994 { |
995 // This is now a no-op as per the DOM specification. | 995 // This is now a no-op as per the DOM specification. |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1259 if (startNonTextContainer != endNonTextContainer) { | 1259 if (startNonTextContainer != endNonTextContainer) { |
1260 exceptionState.throwDOMException(InvalidStateError, "The Range has parti
ally selected a non-Text node."); | 1260 exceptionState.throwDOMException(InvalidStateError, "The Range has parti
ally selected a non-Text node."); |
1261 return; | 1261 return; |
1262 } | 1262 } |
1263 | 1263 |
1264 while (Node* n = newParent->firstChild()) { | 1264 while (Node* n = newParent->firstChild()) { |
1265 toContainerNode(newParent)->removeChild(n, exceptionState); | 1265 toContainerNode(newParent)->removeChild(n, exceptionState); |
1266 if (exceptionState.hadException()) | 1266 if (exceptionState.hadException()) |
1267 return; | 1267 return; |
1268 } | 1268 } |
1269 RefPtr<DocumentFragment> fragment = extractContents(exceptionState); | 1269 RefPtrWillBeRawPtr<DocumentFragment> fragment = extractContents(exceptionSta
te); |
1270 if (exceptionState.hadException()) | 1270 if (exceptionState.hadException()) |
1271 return; | 1271 return; |
1272 insertNode(newParent, exceptionState); | 1272 insertNode(newParent, exceptionState); |
1273 if (exceptionState.hadException()) | 1273 if (exceptionState.hadException()) |
1274 return; | 1274 return; |
1275 newParent->appendChild(fragment.release(), exceptionState); | 1275 newParent->appendChild(fragment.release(), exceptionState); |
1276 if (exceptionState.hadException()) | 1276 if (exceptionState.hadException()) |
1277 return; | 1277 return; |
1278 selectNode(newParent.get(), exceptionState); | 1278 selectNode(newParent.get(), exceptionState); |
1279 } | 1279 } |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1685 | 1685 |
1686 void showTree(const WebCore::Range* range) | 1686 void showTree(const WebCore::Range* range) |
1687 { | 1687 { |
1688 if (range && range->boundaryPointsValid()) { | 1688 if (range && range->boundaryPointsValid()) { |
1689 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); | 1689 range->startContainer()->showTreeAndMark(range->startContainer(), "S", r
ange->endContainer(), "E"); |
1690 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); | 1690 fprintf(stderr, "start offset: %d, end offset: %d\n", range->startOffset
(), range->endOffset()); |
1691 } | 1691 } |
1692 } | 1692 } |
1693 | 1693 |
1694 #endif | 1694 #endif |
OLD | NEW |