Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Side by Side Diff: Source/core/dom/Document.cpp

Issue 98543011: Improve Document exception messages. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « LayoutTests/fast/frames/adopt-object-into-itself-expected.txt ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 if (newDocumentElement == m_documentElement) 679 if (newDocumentElement == m_documentElement)
680 return; 680 return;
681 m_documentElement = newDocumentElement; 681 m_documentElement = newDocumentElement;
682 // The root style used for media query matching depends on the document elem ent. 682 // The root style used for media query matching depends on the document elem ent.
683 clearStyleResolver(); 683 clearStyleResolver();
684 } 684 }
685 685
686 PassRefPtr<Element> Document::createElement(const AtomicString& name, ExceptionS tate& exceptionState) 686 PassRefPtr<Element> Document::createElement(const AtomicString& name, ExceptionS tate& exceptionState)
687 { 687 {
688 if (!isValidName(name)) { 688 if (!isValidName(name)) {
689 exceptionState.throwUninformativeAndGenericDOMException(InvalidCharacter Error); 689 exceptionState.throwDOMException(InvalidCharacterError, "'" + name + "' is not a valid element name.");
690 return 0; 690 return 0;
691 } 691 }
692 692
693 if (isXHTMLDocument() || isHTMLDocument()) 693 if (isXHTMLDocument() || isHTMLDocument())
694 return HTMLElementFactory::createHTMLElement(isHTMLDocument() ? name.low er() : name, document(), 0, false); 694 return HTMLElementFactory::createHTMLElement(isHTMLDocument() ? name.low er() : name, document(), 0, false);
695 695
696 return createElement(QualifiedName(nullAtom, name, nullAtom), false); 696 return createElement(QualifiedName(nullAtom, name, nullAtom), false);
697 } 697 }
698 698
699 PassRefPtr<Element> Document::createElement(const AtomicString& localName, const AtomicString& typeExtension, ExceptionState& exceptionState) 699 PassRefPtr<Element> Document::createElement(const AtomicString& localName, const AtomicString& typeExtension, ExceptionState& exceptionState)
700 { 700 {
701 if (!isValidName(localName)) { 701 if (!isValidName(localName)) {
702 exceptionState.throwUninformativeAndGenericDOMException(InvalidCharacter Error); 702 exceptionState.throwDOMException(InvalidCharacterError, "'" + localName + "' is not a valid element name.");
sof 2013/12/20 11:10:53 Tangential, but are there missing checks of except
Mike West 2013/12/20 11:38:49 Good eye. Would you like to take care of that in a
sof 2013/12/20 12:21:12 I can take care of it right away.
703 return 0; 703 return 0;
704 } 704 }
705 705
706 RefPtr<Element> element; 706 RefPtr<Element> element;
707 707
708 if (RuntimeEnabledFeatures::customElementsEnabled() && CustomElement::isVali dName(localName) && registrationContext()) 708 if (RuntimeEnabledFeatures::customElementsEnabled() && CustomElement::isVali dName(localName) && registrationContext())
709 element = registrationContext()->createCustomTagElement(*this, Qualified Name(nullAtom, localName, xhtmlNamespaceURI)); 709 element = registrationContext()->createCustomTagElement(*this, Qualified Name(nullAtom, localName, xhtmlNamespaceURI));
710 else 710 else
711 element = createElement(localName, exceptionState); 711 element = createElement(localName, exceptionState);
712 712
713 if (RuntimeEnabledFeatures::customElementsEnabled() && !typeExtension.isNull () && !typeExtension.isEmpty()) 713 if (RuntimeEnabledFeatures::customElementsEnabled() && !typeExtension.isNull () && !typeExtension.isEmpty())
714 CustomElementRegistrationContext::setIsAttributeAndTypeExtension(element .get(), typeExtension); 714 CustomElementRegistrationContext::setIsAttributeAndTypeExtension(element .get(), typeExtension);
715 715
716 return element; 716 return element;
717 } 717 }
718 718
719 PassRefPtr<Element> Document::createElementNS(const AtomicString& namespaceURI, const AtomicString& qualifiedName, const AtomicString& typeExtension, ExceptionS tate& exceptionState) 719 PassRefPtr<Element> Document::createElementNS(const AtomicString& namespaceURI, const AtomicString& qualifiedName, const AtomicString& typeExtension, ExceptionS tate& exceptionState)
720 { 720 {
721 AtomicString prefix, localName; 721 AtomicString prefix, localName;
722 if (!parseQualifiedName(qualifiedName, prefix, localName, exceptionState)) 722 if (!parseQualifiedName(qualifiedName, prefix, localName, exceptionState))
723 return 0; 723 return 0;
724 724
725 QualifiedName qName(prefix, localName, namespaceURI); 725 QualifiedName qName(prefix, localName, namespaceURI);
726 if (!hasValidNamespaceForElements(qName)) { 726 if (!hasValidNamespaceForElements(qName)) {
727 exceptionState.throwUninformativeAndGenericDOMException(NamespaceError); 727 exceptionState.throwDOMException(NamespaceError, "'" + namespaceURI + "' is not a valid namespace for elements.");
728 return 0; 728 return 0;
729 } 729 }
730 730
731 RefPtr<Element> element; 731 RefPtr<Element> element;
732 if (CustomElement::isValidName(qName.localName()) && registrationContext()) 732 if (CustomElement::isValidName(qName.localName()) && registrationContext())
733 element = registrationContext()->createCustomTagElement(*this, qName); 733 element = registrationContext()->createCustomTagElement(*this, qName);
734 else 734 else
735 element = createElementNS(namespaceURI, qualifiedName, exceptionState); 735 element = createElementNS(namespaceURI, qualifiedName, exceptionState);
736 736
737 if (!typeExtension.isNull() && !typeExtension.isEmpty()) 737 if (!typeExtension.isNull() && !typeExtension.isEmpty())
738 CustomElementRegistrationContext::setIsAttributeAndTypeExtension(element .get(), typeExtension); 738 CustomElementRegistrationContext::setIsAttributeAndTypeExtension(element .get(), typeExtension);
739 739
740 return element; 740 return element;
741 } 741 }
742 742
743 ScriptValue Document::registerElement(WebCore::ScriptState* state, const AtomicS tring& name, ExceptionState& exceptionState) 743 ScriptValue Document::registerElement(WebCore::ScriptState* state, const AtomicS tring& name, ExceptionState& exceptionState)
744 { 744 {
745 return registerElement(state, name, Dictionary(), exceptionState); 745 return registerElement(state, name, Dictionary(), exceptionState);
746 } 746 }
747 747
748 ScriptValue Document::registerElement(WebCore::ScriptState* state, const AtomicS tring& name, const Dictionary& options, ExceptionState& exceptionState, CustomEl ement::NameSet validNames) 748 ScriptValue Document::registerElement(WebCore::ScriptState* state, const AtomicS tring& name, const Dictionary& options, ExceptionState& exceptionState, CustomEl ement::NameSet validNames)
749 { 749 {
750 if (!registrationContext()) { 750 if (!registrationContext()) {
751 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 751 exceptionState.throwDOMException(NotSupportedError, "No element registra tion context is available.");
752 return ScriptValue(); 752 return ScriptValue();
753 } 753 }
754 754
755 CustomElementConstructorBuilder constructorBuilder(state, &options); 755 CustomElementConstructorBuilder constructorBuilder(state, &options);
756 registrationContext()->registerElement(this, &constructorBuilder, name, vali dNames, exceptionState); 756 registrationContext()->registerElement(this, &constructorBuilder, name, vali dNames, exceptionState);
757 return constructorBuilder.bindingsReturnValue(); 757 return constructorBuilder.bindingsReturnValue();
758 } 758 }
759 759
760 void Document::setImport(HTMLImport* import) 760 void Document::setImport(HTMLImport* import)
761 { 761 {
(...skipping 22 matching lines...) Expand all
784 } 784 }
785 785
786 PassRefPtr<Comment> Document::createComment(const String& data) 786 PassRefPtr<Comment> Document::createComment(const String& data)
787 { 787 {
788 return Comment::create(*this, data); 788 return Comment::create(*this, data);
789 } 789 }
790 790
791 PassRefPtr<CDATASection> Document::createCDATASection(const String& data, Except ionState& exceptionState) 791 PassRefPtr<CDATASection> Document::createCDATASection(const String& data, Except ionState& exceptionState)
792 { 792 {
793 if (isHTMLDocument()) { 793 if (isHTMLDocument()) {
794 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 794 exceptionState.throwDOMException(NotSupportedError, "This is an HTML doc ument, which does not allow CData sections.");
795 return 0; 795 return 0;
796 } 796 }
797 if (data.contains("]]>")) { 797 if (data.contains("]]>")) {
798 exceptionState.throwDOMException(InvalidCharacterError, "String cannot c ontain ']]>' since that is the end delimiter of a CData section."); 798 exceptionState.throwDOMException(InvalidCharacterError, "String cannot c ontain ']]>' since that is the end delimiter of a CData section.");
799 return 0; 799 return 0;
800 } 800 }
801 return CDATASection::create(*this, data); 801 return CDATASection::create(*this, data);
802 } 802 }
803 803
804 PassRefPtr<ProcessingInstruction> Document::createProcessingInstruction(const St ring& target, const String& data, ExceptionState& exceptionState) 804 PassRefPtr<ProcessingInstruction> Document::createProcessingInstruction(const St ring& target, const String& data, ExceptionState& exceptionState)
(...skipping 15 matching lines...) Expand all
820 } 820 }
821 821
822 PassRefPtr<CSSStyleDeclaration> Document::createCSSStyleDeclaration() 822 PassRefPtr<CSSStyleDeclaration> Document::createCSSStyleDeclaration()
823 { 823 {
824 return MutableStylePropertySet::create()->ensureCSSStyleDeclaration(); 824 return MutableStylePropertySet::create()->ensureCSSStyleDeclaration();
825 } 825 }
826 826
827 PassRefPtr<Node> Document::importNode(Node* importedNode, bool deep, ExceptionSt ate& exceptionState) 827 PassRefPtr<Node> Document::importNode(Node* importedNode, bool deep, ExceptionSt ate& exceptionState)
828 { 828 {
829 if (!importedNode) { 829 if (!importedNode) {
830 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 830 exceptionState.throwDOMException(NotSupportedError, "The node provided i s invalid.");
831 return 0; 831 return 0;
832 } 832 }
833 833
834 switch (importedNode->nodeType()) { 834 switch (importedNode->nodeType()) {
835 case TEXT_NODE: 835 case TEXT_NODE:
836 return createTextNode(importedNode->nodeValue()); 836 return createTextNode(importedNode->nodeValue());
837 case CDATA_SECTION_NODE: 837 case CDATA_SECTION_NODE:
838 return createCDATASection(importedNode->nodeValue(), exceptionState); 838 return createCDATASection(importedNode->nodeValue(), exceptionState);
839 case PROCESSING_INSTRUCTION_NODE: 839 case PROCESSING_INSTRUCTION_NODE:
840 return createProcessingInstruction(importedNode->nodeName(), importedNod e->nodeValue(), exceptionState); 840 return createProcessingInstruction(importedNode->nodeName(), importedNod e->nodeValue(), exceptionState);
841 case COMMENT_NODE: 841 case COMMENT_NODE:
842 return createComment(importedNode->nodeValue()); 842 return createComment(importedNode->nodeValue());
843 case DOCUMENT_TYPE_NODE: { 843 case DOCUMENT_TYPE_NODE: {
844 DocumentType* doctype = toDocumentType(importedNode); 844 DocumentType* doctype = toDocumentType(importedNode);
845 return DocumentType::create(this, doctype->name(), doctype->publicId(), doctype->systemId()); 845 return DocumentType::create(this, doctype->name(), doctype->publicId(), doctype->systemId());
846 } 846 }
847 case ELEMENT_NODE: { 847 case ELEMENT_NODE: {
848 Element* oldElement = toElement(importedNode); 848 Element* oldElement = toElement(importedNode);
849 // FIXME: The following check might be unnecessary. Is it possible that 849 // FIXME: The following check might be unnecessary. Is it possible that
850 // oldElement has mismatched prefix/namespace? 850 // oldElement has mismatched prefix/namespace?
851 if (!hasValidNamespaceForElements(oldElement->tagQName())) { 851 if (!hasValidNamespaceForElements(oldElement->tagQName())) {
852 exceptionState.throwUninformativeAndGenericDOMException(NamespaceErr or); 852 exceptionState.throwDOMException(NamespaceError, "The imported node has an invalid namespace.");
853 return 0; 853 return 0;
854 } 854 }
855 RefPtr<Element> newElement = createElement(oldElement->tagQName(), false ); 855 RefPtr<Element> newElement = createElement(oldElement->tagQName(), false );
856 856
857 newElement->cloneDataFromElement(*oldElement); 857 newElement->cloneDataFromElement(*oldElement);
858 858
859 if (deep) { 859 if (deep) {
860 for (Node* oldChild = oldElement->firstChild(); oldChild; oldChild = oldChild->nextSibling()) { 860 for (Node* oldChild = oldElement->firstChild(); oldChild; oldChild = oldChild->nextSibling()) {
861 RefPtr<Node> newChild = importNode(oldChild, true, exceptionStat e); 861 RefPtr<Node> newChild = importNode(oldChild, true, exceptionStat e);
862 if (exceptionState.hadException()) 862 if (exceptionState.hadException())
(...skipping 30 matching lines...) Expand all
893 return newFragment.release(); 893 return newFragment.release();
894 } 894 }
895 case ENTITY_NODE: 895 case ENTITY_NODE:
896 case NOTATION_NODE: 896 case NOTATION_NODE:
897 // FIXME: It should be possible to import these node types, however in D OM3 the DocumentType is readonly, so there isn't much sense in doing that. 897 // FIXME: It should be possible to import these node types, however in D OM3 the DocumentType is readonly, so there isn't much sense in doing that.
898 // Ability to add these imported nodes to a DocumentType will be conside red for addition to a future release of the DOM. 898 // Ability to add these imported nodes to a DocumentType will be conside red for addition to a future release of the DOM.
899 case DOCUMENT_NODE: 899 case DOCUMENT_NODE:
900 case XPATH_NAMESPACE_NODE: 900 case XPATH_NAMESPACE_NODE:
901 break; 901 break;
902 } 902 }
903 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedError); 903 Element* el = toElement(importedNode);
904 exceptionState.throwDOMException(NotSupportedError, "The node to import is o f type '" + el->tagName() + "', which may not be imported.");
904 return 0; 905 return 0;
905 } 906 }
906 907
907 PassRefPtr<Node> Document::adoptNode(PassRefPtr<Node> source, ExceptionState& ex ceptionState) 908 PassRefPtr<Node> Document::adoptNode(PassRefPtr<Node> source, ExceptionState& ex ceptionState)
908 { 909 {
909 if (!source) { 910 if (!source) {
910 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 911 exceptionState.throwDOMException(NotSupportedError, "The node provided i s invalid.");
911 return 0; 912 return 0;
912 } 913 }
913 914
914 EventQueueScope scope; 915 EventQueueScope scope;
915 916
916 switch (source->nodeType()) { 917 switch (source->nodeType()) {
917 case ENTITY_NODE: 918 case ENTITY_NODE:
918 case NOTATION_NODE: 919 case NOTATION_NODE:
919 case DOCUMENT_NODE: 920 case DOCUMENT_NODE:
920 case DOCUMENT_TYPE_NODE: 921 case DOCUMENT_TYPE_NODE:
921 case XPATH_NAMESPACE_NODE: 922 case XPATH_NAMESPACE_NODE: {
922 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 923 Element* el = toElement(source.get());
924 exceptionState.throwDOMException(NotSupportedError, "The node provided i s of type '" + el->tagName() + "', which may not be adopted.");
923 return 0; 925 return 0;
926 }
924 case ATTRIBUTE_NODE: { 927 case ATTRIBUTE_NODE: {
925 Attr* attr = toAttr(source.get()); 928 Attr* attr = toAttr(source.get());
926 if (attr->ownerElement()) 929 if (attr->ownerElement())
927 attr->ownerElement()->removeAttributeNode(attr, exceptionState); 930 attr->ownerElement()->removeAttributeNode(attr, exceptionState);
928 break; 931 break;
929 } 932 }
930 default: 933 default:
931 if (source->isShadowRoot()) { 934 if (source->isShadowRoot()) {
932 // ShadowRoot cannot disconnect itself from the host node. 935 // ShadowRoot cannot disconnect itself from the host node.
933 exceptionState.throwUninformativeAndGenericDOMException(HierarchyReq uestError); 936 exceptionState.throwDOMException(HierarchyRequestError, "The node pr ovided is a shadow root, which may not be adopted.");
934 return 0; 937 return 0;
935 } 938 }
936 939
937 if (source->isFrameOwnerElement()) { 940 if (source->isFrameOwnerElement()) {
938 HTMLFrameOwnerElement* frameOwnerElement = toHTMLFrameOwnerElement(s ource.get()); 941 HTMLFrameOwnerElement* frameOwnerElement = toHTMLFrameOwnerElement(s ource.get());
939 if (frame() && frame()->tree().isDescendantOf(frameOwnerElement->con tentFrame())) { 942 if (frame() && frame()->tree().isDescendantOf(frameOwnerElement->con tentFrame())) {
940 exceptionState.throwUninformativeAndGenericDOMException(Hierarch yRequestError); 943 exceptionState.throwDOMException(HierarchyRequestError, "The nod e provided is a frame which contains this document.");
941 return 0; 944 return 0;
942 } 945 }
943 } 946 }
944 if (source->parentNode()) { 947 if (source->parentNode()) {
945 source->parentNode()->removeChild(source.get(), exceptionState); 948 source->parentNode()->removeChild(source.get(), exceptionState);
946 if (exceptionState.hadException()) 949 if (exceptionState.hadException())
947 return 0; 950 return 0;
948 } 951 }
949 } 952 }
950 953
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 } 1033 }
1031 1034
1032 PassRefPtr<Element> Document::createElementNS(const AtomicString& namespaceURI, const AtomicString& qualifiedName, ExceptionState& exceptionState) 1035 PassRefPtr<Element> Document::createElementNS(const AtomicString& namespaceURI, const AtomicString& qualifiedName, ExceptionState& exceptionState)
1033 { 1036 {
1034 AtomicString prefix, localName; 1037 AtomicString prefix, localName;
1035 if (!parseQualifiedName(qualifiedName, prefix, localName, exceptionState)) 1038 if (!parseQualifiedName(qualifiedName, prefix, localName, exceptionState))
1036 return 0; 1039 return 0;
1037 1040
1038 QualifiedName qName(prefix, localName, namespaceURI); 1041 QualifiedName qName(prefix, localName, namespaceURI);
1039 if (!hasValidNamespaceForElements(qName)) { 1042 if (!hasValidNamespaceForElements(qName)) {
1040 exceptionState.throwUninformativeAndGenericDOMException(NamespaceError); 1043 exceptionState.throwDOMException(NamespaceError, "'" + namespaceURI + "' is an invalid namespace for elements.");
1041 return 0; 1044 return 0;
1042 } 1045 }
1043 1046
1044 return createElement(qName, false); 1047 return createElement(qName, false);
1045 } 1048 }
1046 1049
1047 String Document::readyState() const 1050 String Document::readyState() const
1048 { 1051 {
1049 DEFINE_STATIC_LOCAL(const String, loading, ("loading")); 1052 DEFINE_STATIC_LOCAL(const String, loading, ("loading"));
1050 DEFINE_STATIC_LOCAL(const String, interactive, ("interactive")); 1053 DEFINE_STATIC_LOCAL(const String, interactive, ("interactive"));
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 return; 1132 return;
1130 m_contentLanguage = language; 1133 m_contentLanguage = language;
1131 1134
1132 // Document's style depends on the content language. 1135 // Document's style depends on the content language.
1133 setNeedsStyleRecalc(); 1136 setNeedsStyleRecalc();
1134 } 1137 }
1135 1138
1136 void Document::setXMLVersion(const String& version, ExceptionState& exceptionSta te) 1139 void Document::setXMLVersion(const String& version, ExceptionState& exceptionSta te)
1137 { 1140 {
1138 if (!implementation()->hasFeature("XML", String())) { 1141 if (!implementation()->hasFeature("XML", String())) {
1139 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 1142 exceptionState.throwDOMException(NotSupportedError, "This document does not support XML.");
1140 return; 1143 return;
1141 } 1144 }
1142 1145
1143 if (!XMLDocumentParser::supportsXMLVersion(version)) { 1146 if (!XMLDocumentParser::supportsXMLVersion(version)) {
1144 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 1147 exceptionState.throwDOMException(NotSupportedError, "This document does not support the XML version '" + version + "'.");
1145 return; 1148 return;
1146 } 1149 }
1147 1150
1148 m_xmlVersion = version; 1151 m_xmlVersion = version;
1149 } 1152 }
1150 1153
1151 void Document::setXMLStandalone(bool standalone, ExceptionState& exceptionState) 1154 void Document::setXMLStandalone(bool standalone, ExceptionState& exceptionState)
1152 { 1155 {
1153 if (!implementation()->hasFeature("XML", String())) { 1156 if (!implementation()->hasFeature("XML", String())) {
1154 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 1157 exceptionState.throwDOMException(NotSupportedError, "This document does not support XML.");
1155 return; 1158 return;
1156 } 1159 }
1157 1160
1158 m_xmlStandalone = standalone ? Standalone : NotStandalone; 1161 m_xmlStandalone = standalone ? Standalone : NotStandalone;
1159 } 1162 }
1160 1163
1161 KURL Document::baseURI() const 1164 KURL Document::baseURI() const
1162 { 1165 {
1163 return m_baseURL; 1166 return m_baseURL;
1164 } 1167 }
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
1443 1446
1444 PassRefPtr<Range> Document::createRange() 1447 PassRefPtr<Range> Document::createRange()
1445 { 1448 {
1446 return Range::create(*this); 1449 return Range::create(*this);
1447 } 1450 }
1448 1451
1449 PassRefPtr<NodeIterator> Document::createNodeIterator(Node* root, ExceptionState & exceptionState) 1452 PassRefPtr<NodeIterator> Document::createNodeIterator(Node* root, ExceptionState & exceptionState)
1450 { 1453 {
1451 // FIXME: Probably this should be handled within the bindings layer and Type Error should be thrown. 1454 // FIXME: Probably this should be handled within the bindings layer and Type Error should be thrown.
1452 if (!root) { 1455 if (!root) {
1453 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 1456 exceptionState.throwDOMException(NotSupportedError, "The provided node i s invalid.");
1454 return 0; 1457 return 0;
1455 } 1458 }
1456 return NodeIterator::create(root, NodeFilter::SHOW_ALL, PassRefPtr<NodeFilte r>()); 1459 return NodeIterator::create(root, NodeFilter::SHOW_ALL, PassRefPtr<NodeFilte r>());
1457 } 1460 }
1458 1461
1459 PassRefPtr<NodeIterator> Document::createNodeIterator(Node* root, unsigned whatT oShow, ExceptionState& exceptionState) 1462 PassRefPtr<NodeIterator> Document::createNodeIterator(Node* root, unsigned whatT oShow, ExceptionState& exceptionState)
1460 { 1463 {
1461 if (!root) { 1464 if (!root) {
1462 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 1465 exceptionState.throwDOMException(NotSupportedError, "The provided node i s invalid.");
1463 return 0; 1466 return 0;
1464 } 1467 }
1465 // FIXME: It might be a good idea to emit a warning if |whatToShow| contains a bit that is not defined in 1468 // FIXME: It might be a good idea to emit a warning if |whatToShow| contains a bit that is not defined in
1466 // NodeFilter. 1469 // NodeFilter.
1467 return NodeIterator::create(root, whatToShow, PassRefPtr<NodeFilter>()); 1470 return NodeIterator::create(root, whatToShow, PassRefPtr<NodeFilter>());
1468 } 1471 }
1469 1472
1470 PassRefPtr<NodeIterator> Document::createNodeIterator(Node* root, unsigned whatT oShow, PassRefPtr<NodeFilter> filter, ExceptionState& exceptionState) 1473 PassRefPtr<NodeIterator> Document::createNodeIterator(Node* root, unsigned whatT oShow, PassRefPtr<NodeFilter> filter, ExceptionState& exceptionState)
1471 { 1474 {
1472 if (!root) { 1475 if (!root) {
1473 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 1476 exceptionState.throwDOMException(NotSupportedError, "The provided node i s invalid.");
1474 return 0; 1477 return 0;
1475 } 1478 }
1476 // FIXME: Ditto. 1479 // FIXME: Ditto.
1477 return NodeIterator::create(root, whatToShow, filter); 1480 return NodeIterator::create(root, whatToShow, filter);
1478 } 1481 }
1479 1482
1480 PassRefPtr<TreeWalker> Document::createTreeWalker(Node* root, ExceptionState& ex ceptionState) 1483 PassRefPtr<TreeWalker> Document::createTreeWalker(Node* root, ExceptionState& ex ceptionState)
1481 { 1484 {
1482 if (!root) { 1485 if (!root) {
1483 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 1486 exceptionState.throwDOMException(NotSupportedError, "The provided node i s invalid.");
1484 return 0; 1487 return 0;
1485 } 1488 }
1486 return TreeWalker::create(root, NodeFilter::SHOW_ALL, PassRefPtr<NodeFilter> ()); 1489 return TreeWalker::create(root, NodeFilter::SHOW_ALL, PassRefPtr<NodeFilter> ());
1487 } 1490 }
1488 1491
1489 PassRefPtr<TreeWalker> Document::createTreeWalker(Node* root, unsigned whatToSho w, ExceptionState& exceptionState) 1492 PassRefPtr<TreeWalker> Document::createTreeWalker(Node* root, unsigned whatToSho w, ExceptionState& exceptionState)
1490 { 1493 {
1491 if (!root) { 1494 if (!root) {
1492 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 1495 exceptionState.throwDOMException(NotSupportedError, "The provided node i s invalid.");
1493 return 0; 1496 return 0;
1494 } 1497 }
1495 return TreeWalker::create(root, whatToShow, PassRefPtr<NodeFilter>()); 1498 return TreeWalker::create(root, whatToShow, PassRefPtr<NodeFilter>());
1496 } 1499 }
1497 1500
1498 PassRefPtr<TreeWalker> Document::createTreeWalker(Node* root, unsigned whatToSho w, PassRefPtr<NodeFilter> filter, ExceptionState& exceptionState) 1501 PassRefPtr<TreeWalker> Document::createTreeWalker(Node* root, unsigned whatToSho w, PassRefPtr<NodeFilter> filter, ExceptionState& exceptionState)
1499 { 1502 {
1500 if (!root) { 1503 if (!root) {
1501 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedErro r); 1504 exceptionState.throwDOMException(NotSupportedError, "The provided node i s invalid.");
1502 return 0; 1505 return 0;
1503 } 1506 }
1504 return TreeWalker::create(root, whatToShow, filter); 1507 return TreeWalker::create(root, whatToShow, filter);
1505 } 1508 }
1506 1509
1507 void Document::scheduleStyleRecalc() 1510 void Document::scheduleStyleRecalc()
1508 { 1511 {
1509 if (shouldDisplaySeamlesslyWithParent()) { 1512 if (shouldDisplaySeamlesslyWithParent()) {
1510 // When we're seamless, our parent document manages our style recalcs. 1513 // When we're seamless, our parent document manages our style recalcs.
1511 ownerElement()->setNeedsStyleRecalc(); 1514 ownerElement()->setNeedsStyleRecalc();
(...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after
2231 return toHTMLElement(child); 2234 return toHTMLElement(child);
2232 } 2235 }
2233 2236
2234 return 0; 2237 return 0;
2235 } 2238 }
2236 2239
2237 void Document::setBody(PassRefPtr<HTMLElement> prpNewBody, ExceptionState& excep tionState) 2240 void Document::setBody(PassRefPtr<HTMLElement> prpNewBody, ExceptionState& excep tionState)
2238 { 2241 {
2239 RefPtr<HTMLElement> newBody = prpNewBody; 2242 RefPtr<HTMLElement> newBody = prpNewBody;
2240 2243
2241 if (!newBody || !documentElement()) { 2244 if (!newBody) {
2242 exceptionState.throwUninformativeAndGenericDOMException(HierarchyRequest Error); 2245 exceptionState.throwDOMException(HierarchyRequestError, "The node provid ed is invalid.");
2246 return;
2247 }
2248 if (!documentElement()) {
2249 exceptionState.throwDOMException(HierarchyRequestError, "No document ele ment exists.");
2243 return; 2250 return;
2244 } 2251 }
2245 2252
2246 if (!newBody->hasTagName(bodyTag) && !newBody->hasTagName(framesetTag)) { 2253 if (!newBody->hasTagName(bodyTag) && !newBody->hasTagName(framesetTag)) {
2247 exceptionState.throwUninformativeAndGenericDOMException(HierarchyRequest Error); 2254 exceptionState.throwDOMException(HierarchyRequestError, "The new body el ement is of type '" + newBody->tagName() + "'. It must be either a 'BODY' or 'FR AMESET' element.");
2248 return; 2255 return;
2249 } 2256 }
2250 2257
2251 HTMLElement* oldBody = body(); 2258 HTMLElement* oldBody = body();
2252 if (oldBody == newBody) 2259 if (oldBody == newBody)
2253 return; 2260 return;
2254 2261
2255 if (oldBody) 2262 if (oldBody)
2256 documentElement()->replaceChild(newBody.release(), oldBody, exceptionSta te); 2263 documentElement()->replaceChild(newBody.release(), oldBody, exceptionSta te);
2257 else 2264 else
(...skipping 1392 matching lines...) Expand 10 before | Expand all | Expand 10 after
3650 event->setTarget(domWindow()); 3657 event->setTarget(domWindow());
3651 ensureScriptedAnimationController().enqueuePerFrameEvent(event.release()); 3658 ensureScriptedAnimationController().enqueuePerFrameEvent(event.release());
3652 } 3659 }
3653 3660
3654 PassRefPtr<Event> Document::createEvent(const String& eventType, ExceptionState& exceptionState) 3661 PassRefPtr<Event> Document::createEvent(const String& eventType, ExceptionState& exceptionState)
3655 { 3662 {
3656 RefPtr<Event> event = EventFactory::create(eventType); 3663 RefPtr<Event> event = EventFactory::create(eventType);
3657 if (event) 3664 if (event)
3658 return event.release(); 3665 return event.release();
3659 3666
3660 exceptionState.throwUninformativeAndGenericDOMException(NotSupportedError); 3667 exceptionState.throwDOMException(NotSupportedError, "The provided event type ('" + eventType + "') is invalid.");
3661 return 0; 3668 return 0;
3662 } 3669 }
3663 3670
3664 void Document::addMutationEventListenerTypeIfEnabled(ListenerType listenerType) 3671 void Document::addMutationEventListenerTypeIfEnabled(ListenerType listenerType)
3665 { 3672 {
3666 if (ContextFeatures::mutationEventsEnabled(this)) 3673 if (ContextFeatures::mutationEventsEnabled(this))
3667 addListenerType(listenerType); 3674 addListenerType(listenerType);
3668 } 3675 }
3669 3676
3670 void Document::addListenerTypeIfNeeded(const AtomicString& eventType) 3677 void Document::addListenerTypeIfNeeded(const AtomicString& eventType)
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
3925 { 3932 {
3926 bool nameStart = true; 3933 bool nameStart = true;
3927 bool sawColon = false; 3934 bool sawColon = false;
3928 int colonPos = 0; 3935 int colonPos = 0;
3929 3936
3930 for (unsigned i = 0; i < length;) { 3937 for (unsigned i = 0; i < length;) {
3931 UChar32 c; 3938 UChar32 c;
3932 U16_NEXT(characters, i, length, c) 3939 U16_NEXT(characters, i, length, c)
3933 if (c == ':') { 3940 if (c == ':') {
3934 if (sawColon) { 3941 if (sawColon) {
3935 exceptionState.throwUninformativeAndGenericDOMException(Namespac eError); 3942 exceptionState.throwDOMException(NamespaceError, "Multiple colon s (':') are not allowed.");
3936 return false; // multiple colons: not allowed 3943 return false; // multiple colons: not allowed
3937 } 3944 }
3938 nameStart = true; 3945 nameStart = true;
3939 sawColon = true; 3946 sawColon = true;
3940 colonPos = i - 1; 3947 colonPos = i - 1;
3941 } else if (nameStart) { 3948 } else if (nameStart) {
3942 if (!isValidNameStart(c)) { 3949 if (!isValidNameStart(c)) {
3943 exceptionState.throwUninformativeAndGenericDOMException(InvalidC haracterError); 3950 StringBuilder message;
3951 message.append("The character '");
3952 message.append(c);
3953 message.append("' may not be used to start a name.");
3954 exceptionState.throwDOMException(InvalidCharacterError, message. toString());
3944 return false; 3955 return false;
3945 } 3956 }
3946 nameStart = false; 3957 nameStart = false;
3947 } else { 3958 } else {
3948 if (!isValidNamePart(c)) { 3959 if (!isValidNamePart(c)) {
3949 exceptionState.throwUninformativeAndGenericDOMException(InvalidC haracterError); 3960 StringBuilder message;
sof 2013/12/20 11:10:53 String::format() a shorter alternative?
Mike West 2013/12/20 11:38:49 StringBuilder has an explicit 'append(UChar32)' me
3961 message.append("The character '");
3962 message.append(c);
3963 message.append("' may not be used in a name.");
3964 exceptionState.throwDOMException(InvalidCharacterError, message. toString());
3950 return false; 3965 return false;
3951 } 3966 }
3952 } 3967 }
3953 } 3968 }
3954 3969
3955 if (!sawColon) { 3970 if (!sawColon) {
3956 prefix = nullAtom; 3971 prefix = nullAtom;
3957 localName = qualifiedName; 3972 localName = qualifiedName;
3958 } else { 3973 } else {
3959 prefix = AtomicString(characters, colonPos); 3974 prefix = AtomicString(characters, colonPos);
3960 if (prefix.isEmpty()) { 3975 if (prefix.isEmpty()) {
3961 exceptionState.throwUninformativeAndGenericDOMException(NamespaceErr or); 3976 exceptionState.throwDOMException(NamespaceError, "A colon (':') may not be used to begin a name.");
3962 return false; 3977 return false;
3963 } 3978 }
3964 int prefixStart = colonPos + 1; 3979 int prefixStart = colonPos + 1;
3965 localName = AtomicString(characters + prefixStart, length - prefixStart) ; 3980 localName = AtomicString(characters + prefixStart, length - prefixStart) ;
3966 } 3981 }
3967 3982
3968 if (localName.isEmpty()) { 3983 if (localName.isEmpty()) {
3969 exceptionState.throwUninformativeAndGenericDOMException(NamespaceError); 3984 exceptionState.throwDOMException(NamespaceError, "The specified name is empty.");
3970 return false; 3985 return false;
3971 } 3986 }
3972 3987
3973 return true; 3988 return true;
3974 } 3989 }
3975 3990
3976 bool Document::parseQualifiedName(const AtomicString& qualifiedName, AtomicStrin g& prefix, AtomicString& localName, ExceptionState& exceptionState) 3991 bool Document::parseQualifiedName(const AtomicString& qualifiedName, AtomicStrin g& prefix, AtomicString& localName, ExceptionState& exceptionState)
3977 { 3992 {
3978 unsigned length = qualifiedName.length(); 3993 unsigned length = qualifiedName.length();
3979 3994
3980 if (!length) { 3995 if (!length) {
3981 exceptionState.throwUninformativeAndGenericDOMException(InvalidCharacter Error); 3996 exceptionState.throwDOMException(InvalidCharacterError, "The provided qu alified name is empty.");
3982 return false; 3997 return false;
3983 } 3998 }
3984 3999
3985 if (qualifiedName.is8Bit()) 4000 if (qualifiedName.is8Bit())
3986 return parseQualifiedNameInternal(qualifiedName, qualifiedName.character s8(), length, prefix, localName, exceptionState); 4001 return parseQualifiedNameInternal(qualifiedName, qualifiedName.character s8(), length, prefix, localName, exceptionState);
3987 return parseQualifiedNameInternal(qualifiedName, qualifiedName.characters16( ), length, prefix, localName, exceptionState); 4002 return parseQualifiedNameInternal(qualifiedName, qualifiedName.characters16( ), length, prefix, localName, exceptionState);
3988 } 4003 }
3989 4004
3990 void Document::setEncodingData(const DocumentEncodingData& newData) 4005 void Document::setEncodingData(const DocumentEncodingData& newData)
3991 { 4006 {
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
4197 4212
4198 PassRefPtr<Attr> Document::createAttributeNS(const AtomicString& namespaceURI, c onst AtomicString& qualifiedName, ExceptionState& exceptionState, bool shouldIgn oreNamespaceChecks) 4213 PassRefPtr<Attr> Document::createAttributeNS(const AtomicString& namespaceURI, c onst AtomicString& qualifiedName, ExceptionState& exceptionState, bool shouldIgn oreNamespaceChecks)
4199 { 4214 {
4200 AtomicString prefix, localName; 4215 AtomicString prefix, localName;
4201 if (!parseQualifiedName(qualifiedName, prefix, localName, exceptionState)) 4216 if (!parseQualifiedName(qualifiedName, prefix, localName, exceptionState))
4202 return 0; 4217 return 0;
4203 4218
4204 QualifiedName qName(prefix, localName, namespaceURI); 4219 QualifiedName qName(prefix, localName, namespaceURI);
4205 4220
4206 if (!shouldIgnoreNamespaceChecks && !hasValidNamespaceForAttributes(qName)) { 4221 if (!shouldIgnoreNamespaceChecks && !hasValidNamespaceForAttributes(qName)) {
4207 exceptionState.throwUninformativeAndGenericDOMException(NamespaceError); 4222 exceptionState.throwDOMException(NamespaceError, "The namespace '" + nam espaceURI + "' is invalid.");
4208 return 0; 4223 return 0;
4209 } 4224 }
4210 4225
4211 return Attr::create(*this, qName, emptyString()); 4226 return Attr::create(*this, qName, emptyString());
4212 } 4227 }
4213 4228
4214 const SVGDocumentExtensions* Document::svgExtensions() 4229 const SVGDocumentExtensions* Document::svgExtensions()
4215 { 4230 {
4216 return m_svgExtensions.get(); 4231 return m_svgExtensions.get();
4217 } 4232 }
(...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after
5249 } 5264 }
5250 5265
5251 FastTextAutosizer* Document::fastTextAutosizer() 5266 FastTextAutosizer* Document::fastTextAutosizer()
5252 { 5267 {
5253 if (!m_fastTextAutosizer && RuntimeEnabledFeatures::fastTextAutosizingEnable d()) 5268 if (!m_fastTextAutosizer && RuntimeEnabledFeatures::fastTextAutosizingEnable d())
5254 m_fastTextAutosizer = FastTextAutosizer::create(this); 5269 m_fastTextAutosizer = FastTextAutosizer::create(this);
5255 return m_fastTextAutosizer.get(); 5270 return m_fastTextAutosizer.get();
5256 } 5271 }
5257 5272
5258 } // namespace WebCore 5273 } // namespace WebCore
OLDNEW
« no previous file with comments | « LayoutTests/fast/frames/adopt-object-into-itself-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698