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 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 4 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
5 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 5 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
6 * Copyright (C) 2011 Motorola Mobility. All rights reserved. | 6 * Copyright (C) 2011 Motorola Mobility. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 parent->replaceChild(newChild.release(), this, exceptionState); | 445 parent->replaceChild(newChild.release(), this, exceptionState); |
446 | 446 |
447 RefPtr<Node> node = next ? next->previousSibling() : 0; | 447 RefPtr<Node> node = next ? next->previousSibling() : 0; |
448 if (!exceptionState.hadException() && node && node->isTextNode()) | 448 if (!exceptionState.hadException() && node && node->isTextNode()) |
449 mergeWithNextTextNode(node.release(), exceptionState); | 449 mergeWithNextTextNode(node.release(), exceptionState); |
450 | 450 |
451 if (!exceptionState.hadException() && prev && prev->isTextNode()) | 451 if (!exceptionState.hadException() && prev && prev->isTextNode()) |
452 mergeWithNextTextNode(prev.release(), exceptionState); | 452 mergeWithNextTextNode(prev.release(), exceptionState); |
453 } | 453 } |
454 | 454 |
455 Node* HTMLElement::insertAdjacent(const String& where, Node* newChild, Exception
State& exceptionState) | |
456 { | |
457 // In Internet Explorer if the element has no parent and where is "beforeBeg
in" or "afterEnd", | |
458 // a document fragment is created and the elements appended in the correct o
rder. This document | |
459 // fragment isn't returned anywhere. | |
460 // | |
461 // This is impossible for us to implement as the DOM tree does not allow for
such structures, | |
462 // Opera also appears to disallow such usage. | |
463 | |
464 if (equalIgnoringCase(where, "beforeBegin")) { | |
465 if (ContainerNode* parent = this->parentNode()) { | |
466 parent->insertBefore(newChild, this, exceptionState); | |
467 if (!exceptionState.hadException()) | |
468 return newChild; | |
469 } | |
470 return 0; | |
471 } | |
472 | |
473 if (equalIgnoringCase(where, "afterBegin")) { | |
474 insertBefore(newChild, firstChild(), exceptionState); | |
475 return exceptionState.hadException() ? 0 : newChild; | |
476 } | |
477 | |
478 if (equalIgnoringCase(where, "beforeEnd")) { | |
479 appendChild(newChild, exceptionState); | |
480 return exceptionState.hadException() ? 0 : newChild; | |
481 } | |
482 | |
483 if (equalIgnoringCase(where, "afterEnd")) { | |
484 if (ContainerNode* parent = this->parentNode()) { | |
485 parent->insertBefore(newChild, nextSibling(), exceptionState); | |
486 if (!exceptionState.hadException()) | |
487 return newChild; | |
488 } | |
489 return 0; | |
490 } | |
491 | |
492 // IE throws COM Exception E_INVALIDARG; this is the best DOM exception alte
rnative. | |
493 exceptionState.throwDOMException(SyntaxError, "The value provided ('" + wher
e + "') is not one of 'beforeBegin', 'afterBegin', 'beforeEnd', or 'afterEnd'.")
; | |
494 return 0; | |
495 } | |
496 | |
497 Element* HTMLElement::insertAdjacentElement(const String& where, Element* newChi
ld, ExceptionState& exceptionState) | 455 Element* HTMLElement::insertAdjacentElement(const String& where, Element* newChi
ld, ExceptionState& exceptionState) |
498 { | 456 { |
499 if (!newChild) { | 457 if (!newChild) { |
500 // IE throws COM Exception E_INVALIDARG; this is the best DOM exception
alternative. | 458 // IE throws COM Exception E_INVALIDARG; this is the best DOM exception
alternative. |
501 exceptionState.throwTypeError("The node provided is null."); | 459 exceptionState.throwTypeError("The node provided is null."); |
502 return 0; | 460 return 0; |
503 } | 461 } |
504 | 462 |
505 Node* returnValue = insertAdjacent(where, newChild, exceptionState); | 463 Node* returnValue = insertAdjacent(where, newChild, exceptionState); |
506 return toElement(returnValue); | 464 return toElement(returnValue); |
507 } | 465 } |
508 | 466 |
509 // Step 1 of http://domparsing.spec.whatwg.org/#insertadjacenthtml() | |
510 static Element* contextElementForInsertion(const String& where, Element* element
, ExceptionState& exceptionState) | |
511 { | |
512 if (equalIgnoringCase(where, "beforeBegin") || equalIgnoringCase(where, "aft
erEnd")) { | |
513 ContainerNode* parent = element->parentNode(); | |
514 if (!parent || !parent->isElementNode()) { | |
515 exceptionState.throwDOMException(NoModificationAllowedError, "The el
ement has no parent."); | |
516 return 0; | |
517 } | |
518 return toElement(parent); | |
519 } | |
520 if (equalIgnoringCase(where, "afterBegin") || equalIgnoringCase(where, "befo
reEnd")) | |
521 return element; | |
522 exceptionState.throwDOMException(SyntaxError, "The value provided ('" + wher
e + "') is not one of 'beforeBegin', 'afterBegin', 'beforeEnd', or 'afterEnd'.")
; | |
523 return 0; | |
524 } | |
525 | |
526 void HTMLElement::insertAdjacentHTML(const String& where, const String& markup,
ExceptionState& exceptionState) | |
527 { | |
528 RefPtr<Element> contextElement = contextElementForInsertion(where, this, exc
eptionState); | |
529 if (!contextElement) | |
530 return; | |
531 | |
532 RefPtr<DocumentFragment> fragment = createFragmentForInnerOuterHTML(markup,
contextElement.get(), AllowScriptingContent, "insertAdjacentHTML", exceptionStat
e); | |
533 if (!fragment) | |
534 return; | |
535 insertAdjacent(where, fragment.get(), exceptionState); | |
536 } | |
537 | |
538 void HTMLElement::insertAdjacentText(const String& where, const String& text, Ex
ceptionState& exceptionState) | 467 void HTMLElement::insertAdjacentText(const String& where, const String& text, Ex
ceptionState& exceptionState) |
539 { | 468 { |
540 RefPtr<Text> textNode = document().createTextNode(text); | 469 RefPtr<Text> textNode = document().createTextNode(text); |
541 insertAdjacent(where, textNode.get(), exceptionState); | 470 insertAdjacent(where, textNode.get(), exceptionState); |
542 } | 471 } |
543 | 472 |
544 void HTMLElement::applyAlignmentAttributeToStyle(const AtomicString& alignment,
MutableStylePropertySet* style) | 473 void HTMLElement::applyAlignmentAttributeToStyle(const AtomicString& alignment,
MutableStylePropertySet* style) |
545 { | 474 { |
546 // Vertical alignment with respect to the current baseline of the text | 475 // Vertical alignment with respect to the current baseline of the text |
547 // right or left means floating images. | 476 // right or left means floating images. |
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1075 #ifndef NDEBUG | 1004 #ifndef NDEBUG |
1076 | 1005 |
1077 // For use in the debugger | 1006 // For use in the debugger |
1078 void dumpInnerHTML(WebCore::HTMLElement*); | 1007 void dumpInnerHTML(WebCore::HTMLElement*); |
1079 | 1008 |
1080 void dumpInnerHTML(WebCore::HTMLElement* element) | 1009 void dumpInnerHTML(WebCore::HTMLElement* element) |
1081 { | 1010 { |
1082 printf("%s\n", element->innerHTML().ascii().data()); | 1011 printf("%s\n", element->innerHTML().ascii().data()); |
1083 } | 1012 } |
1084 #endif | 1013 #endif |
OLD | NEW |