OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. |
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. |
9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. |
(...skipping 3240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3251 // Documents may contain no more than one of each of these. | 3251 // Documents may contain no more than one of each of these. |
3252 // (One Element and one DocumentType.) | 3252 // (One Element and one DocumentType.) |
3253 for (Node& c : NodeTraversal::childrenOf(*this)) | 3253 for (Node& c : NodeTraversal::childrenOf(*this)) |
3254 if (c.nodeType() == type) | 3254 if (c.nodeType() == type) |
3255 return false; | 3255 return false; |
3256 return true; | 3256 return true; |
3257 } | 3257 } |
3258 return false; | 3258 return false; |
3259 } | 3259 } |
3260 | 3260 |
3261 bool Document::canReplaceChild(const Node& newChild, const Node& oldChild) const | 3261 bool Document::canAcceptChild(const Node& newChild, const Node* oldChild, Except
ionState& exceptionState) const |
3262 { | 3262 { |
3263 if (oldChild.nodeType() == newChild.nodeType()) | 3263 if (oldChild && oldChild->nodeType() == newChild.nodeType()) |
3264 return true; | 3264 return true; |
3265 | 3265 |
3266 int numDoctypes = 0; | 3266 int numDoctypes = 0; |
3267 int numElements = 0; | 3267 int numElements = 0; |
3268 | 3268 |
3269 // First, check how many doctypes and elements we have, not counting | 3269 // First, check how many doctypes and elements we have, not counting |
3270 // the child we're about to remove. | 3270 // the child we're about to remove. |
3271 for (Node& c : NodeTraversal::childrenOf(*this)) { | 3271 for (Node& child : NodeTraversal::childrenOf(*this)) { |
3272 if (c == oldChild) | 3272 if (oldChild && *oldChild == child) |
3273 continue; | 3273 continue; |
3274 | 3274 |
3275 switch (c.nodeType()) { | 3275 switch (child.nodeType()) { |
3276 case DOCUMENT_TYPE_NODE: | 3276 case DOCUMENT_TYPE_NODE: |
3277 numDoctypes++; | 3277 numDoctypes++; |
3278 break; | 3278 break; |
3279 case ELEMENT_NODE: | 3279 case ELEMENT_NODE: |
3280 numElements++; | 3280 numElements++; |
3281 break; | 3281 break; |
3282 default: | 3282 default: |
3283 break; | 3283 break; |
3284 } | 3284 } |
3285 } | 3285 } |
3286 | 3286 |
3287 // Then, see how many doctypes and elements might be added by the new child. | 3287 // Then, see how many doctypes and elements might be added by the new child. |
3288 if (newChild.isDocumentFragment()) { | 3288 if (newChild.isDocumentFragment()) { |
3289 for (Node& c : NodeTraversal::childrenOf(toDocumentFragment(newChild)))
{ | 3289 for (Node& child : NodeTraversal::childrenOf(toDocumentFragment(newChild
))) { |
3290 switch (c.nodeType()) { | 3290 switch (child.nodeType()) { |
3291 case ATTRIBUTE_NODE: | 3291 case ATTRIBUTE_NODE: |
3292 case CDATA_SECTION_NODE: | 3292 case CDATA_SECTION_NODE: |
3293 case DOCUMENT_FRAGMENT_NODE: | 3293 case DOCUMENT_FRAGMENT_NODE: |
3294 case DOCUMENT_NODE: | 3294 case DOCUMENT_NODE: |
3295 case TEXT_NODE: | 3295 case TEXT_NODE: |
| 3296 exceptionState.throwDOMException(HierarchyRequestError, "Nodes o
f type '" + newChild.nodeName() + |
| 3297 "' may not be inserted inside nodes of type '#document'."); |
3296 return false; | 3298 return false; |
3297 case COMMENT_NODE: | 3299 case COMMENT_NODE: |
3298 case PROCESSING_INSTRUCTION_NODE: | 3300 case PROCESSING_INSTRUCTION_NODE: |
3299 break; | 3301 break; |
3300 case DOCUMENT_TYPE_NODE: | 3302 case DOCUMENT_TYPE_NODE: |
3301 numDoctypes++; | 3303 numDoctypes++; |
3302 break; | 3304 break; |
3303 case ELEMENT_NODE: | 3305 case ELEMENT_NODE: |
3304 numElements++; | 3306 numElements++; |
3305 break; | 3307 break; |
3306 } | 3308 } |
3307 } | 3309 } |
3308 } else { | 3310 } else { |
3309 switch (newChild.nodeType()) { | 3311 switch (newChild.nodeType()) { |
3310 case ATTRIBUTE_NODE: | 3312 case ATTRIBUTE_NODE: |
3311 case CDATA_SECTION_NODE: | 3313 case CDATA_SECTION_NODE: |
3312 case DOCUMENT_FRAGMENT_NODE: | 3314 case DOCUMENT_FRAGMENT_NODE: |
3313 case DOCUMENT_NODE: | 3315 case DOCUMENT_NODE: |
3314 case TEXT_NODE: | 3316 case TEXT_NODE: |
| 3317 exceptionState.throwDOMException(HierarchyRequestError, "Nodes of ty
pe '" + newChild.nodeName() + |
| 3318 "' may not be inserted inside nodes of type '#document'."); |
3315 return false; | 3319 return false; |
3316 case COMMENT_NODE: | 3320 case COMMENT_NODE: |
3317 case PROCESSING_INSTRUCTION_NODE: | 3321 case PROCESSING_INSTRUCTION_NODE: |
3318 return true; | 3322 return true; |
3319 case DOCUMENT_TYPE_NODE: | 3323 case DOCUMENT_TYPE_NODE: |
3320 numDoctypes++; | 3324 numDoctypes++; |
3321 break; | 3325 break; |
3322 case ELEMENT_NODE: | 3326 case ELEMENT_NODE: |
3323 numElements++; | 3327 numElements++; |
3324 break; | 3328 break; |
3325 } | 3329 } |
3326 } | 3330 } |
3327 | 3331 |
3328 if (numElements > 1 || numDoctypes > 1) | 3332 if (numElements > 1 || numDoctypes > 1) { |
| 3333 exceptionState.throwDOMException(HierarchyRequestError, |
| 3334 String::format("Only one %s on document allowed.", |
| 3335 numElements > 1 ? "element" : "doctype")); |
3329 return false; | 3336 return false; |
| 3337 } |
3330 | 3338 |
3331 return true; | 3339 return true; |
3332 } | 3340 } |
3333 | 3341 |
3334 PassRefPtrWillBeRawPtr<Node> Document::cloneNode(bool deep) | 3342 PassRefPtrWillBeRawPtr<Node> Document::cloneNode(bool deep) |
3335 { | 3343 { |
3336 RefPtrWillBeRawPtr<Document> clone = cloneDocumentWithoutChildren(); | 3344 RefPtrWillBeRawPtr<Document> clone = cloneDocumentWithoutChildren(); |
3337 clone->cloneDataFromDocument(*this); | 3345 clone->cloneDataFromDocument(*this); |
3338 if (deep) | 3346 if (deep) |
3339 cloneChildNodes(clone.get()); | 3347 cloneChildNodes(clone.get()); |
(...skipping 2499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5839 #ifndef NDEBUG | 5847 #ifndef NDEBUG |
5840 using namespace blink; | 5848 using namespace blink; |
5841 void showLiveDocumentInstances() | 5849 void showLiveDocumentInstances() |
5842 { | 5850 { |
5843 WeakDocumentSet& set = liveDocumentSet(); | 5851 WeakDocumentSet& set = liveDocumentSet(); |
5844 fprintf(stderr, "There are %u documents currently alive:\n", set.size()); | 5852 fprintf(stderr, "There are %u documents currently alive:\n", set.size()); |
5845 for (Document* document : set) | 5853 for (Document* document : set) |
5846 fprintf(stderr, "- Document %p URL: %s\n", document, document->url().str
ing().utf8().data()); | 5854 fprintf(stderr, "- Document %p URL: %s\n", document, document->url().str
ing().utf8().data()); |
5847 } | 5855 } |
5848 #endif | 5856 #endif |
OLD | NEW |