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 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 } | 776 } |
777 | 777 |
778 PassRefPtr<Element> Document::createElementNS(const AtomicString& namespaceURI,
const String& qualifiedName, const AtomicString& typeExtension, ExceptionCode& e
c) | 778 PassRefPtr<Element> Document::createElementNS(const AtomicString& namespaceURI,
const String& qualifiedName, const AtomicString& typeExtension, ExceptionCode& e
c) |
779 { | 779 { |
780 String prefix, localName; | 780 String prefix, localName; |
781 if (!parseQualifiedName(qualifiedName, prefix, localName, ec)) | 781 if (!parseQualifiedName(qualifiedName, prefix, localName, ec)) |
782 return 0; | 782 return 0; |
783 | 783 |
784 QualifiedName qName(prefix, localName, namespaceURI); | 784 QualifiedName qName(prefix, localName, namespaceURI); |
785 if (!hasValidNamespaceForElements(qName)) { | 785 if (!hasValidNamespaceForElements(qName)) { |
786 ec = NAMESPACE_ERR; | 786 ec = NamespaceError; |
787 return 0; | 787 return 0; |
788 } | 788 } |
789 | 789 |
790 RefPtr<Element> element; | 790 RefPtr<Element> element; |
791 if (CustomElementRegistry::isCustomTagName(qName.localName())) | 791 if (CustomElementRegistry::isCustomTagName(qName.localName())) |
792 element = ensureCustomElementRegistry()->createCustomTagElement(qName); | 792 element = ensureCustomElementRegistry()->createCustomTagElement(qName); |
793 else | 793 else |
794 element = createElementNS(namespaceURI, qualifiedName, ec); | 794 element = createElementNS(namespaceURI, qualifiedName, ec); |
795 | 795 |
796 if (!typeExtension.isNull()) { | 796 if (!typeExtension.isNull()) { |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
906 return createCDATASection(importedNode->nodeValue(), ec); | 906 return createCDATASection(importedNode->nodeValue(), ec); |
907 case PROCESSING_INSTRUCTION_NODE: | 907 case PROCESSING_INSTRUCTION_NODE: |
908 return createProcessingInstruction(importedNode->nodeName(), importedNod
e->nodeValue(), ec); | 908 return createProcessingInstruction(importedNode->nodeName(), importedNod
e->nodeValue(), ec); |
909 case COMMENT_NODE: | 909 case COMMENT_NODE: |
910 return createComment(importedNode->nodeValue()); | 910 return createComment(importedNode->nodeValue()); |
911 case ELEMENT_NODE: { | 911 case ELEMENT_NODE: { |
912 Element* oldElement = toElement(importedNode); | 912 Element* oldElement = toElement(importedNode); |
913 // FIXME: The following check might be unnecessary. Is it possible that | 913 // FIXME: The following check might be unnecessary. Is it possible that |
914 // oldElement has mismatched prefix/namespace? | 914 // oldElement has mismatched prefix/namespace? |
915 if (!hasValidNamespaceForElements(oldElement->tagQName())) { | 915 if (!hasValidNamespaceForElements(oldElement->tagQName())) { |
916 ec = NAMESPACE_ERR; | 916 ec = NamespaceError; |
917 return 0; | 917 return 0; |
918 } | 918 } |
919 RefPtr<Element> newElement = createElement(oldElement->tagQName(), false
); | 919 RefPtr<Element> newElement = createElement(oldElement->tagQName(), false
); |
920 | 920 |
921 newElement->cloneDataFromElement(*oldElement); | 921 newElement->cloneDataFromElement(*oldElement); |
922 | 922 |
923 if (deep) { | 923 if (deep) { |
924 for (Node* oldChild = oldElement->firstChild(); oldChild; oldChild =
oldChild->nextSibling()) { | 924 for (Node* oldChild = oldElement->firstChild(); oldChild; oldChild =
oldChild->nextSibling()) { |
925 RefPtr<Node> newChild = importNode(oldChild, true, ec); | 925 RefPtr<Node> newChild = importNode(oldChild, true, ec); |
926 if (ec) | 926 if (ec) |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 } | 1105 } |
1106 | 1106 |
1107 PassRefPtr<Element> Document::createElementNS(const String& namespaceURI, const
String& qualifiedName, ExceptionCode& ec) | 1107 PassRefPtr<Element> Document::createElementNS(const String& namespaceURI, const
String& qualifiedName, ExceptionCode& ec) |
1108 { | 1108 { |
1109 String prefix, localName; | 1109 String prefix, localName; |
1110 if (!parseQualifiedName(qualifiedName, prefix, localName, ec)) | 1110 if (!parseQualifiedName(qualifiedName, prefix, localName, ec)) |
1111 return 0; | 1111 return 0; |
1112 | 1112 |
1113 QualifiedName qName(prefix, localName, namespaceURI); | 1113 QualifiedName qName(prefix, localName, namespaceURI); |
1114 if (!hasValidNamespaceForElements(qName)) { | 1114 if (!hasValidNamespaceForElements(qName)) { |
1115 ec = NAMESPACE_ERR; | 1115 ec = NamespaceError; |
1116 return 0; | 1116 return 0; |
1117 } | 1117 } |
1118 | 1118 |
1119 return createElement(qName, false); | 1119 return createElement(qName, false); |
1120 } | 1120 } |
1121 | 1121 |
1122 String Document::readyState() const | 1122 String Document::readyState() const |
1123 { | 1123 { |
1124 DEFINE_STATIC_LOCAL(const String, loading, (ASCIILiteral("loading"))); | 1124 DEFINE_STATIC_LOCAL(const String, loading, (ASCIILiteral("loading"))); |
1125 DEFINE_STATIC_LOCAL(const String, interactive, (ASCIILiteral("interactive"))
); | 1125 DEFINE_STATIC_LOCAL(const String, interactive, (ASCIILiteral("interactive"))
); |
(...skipping 2476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3602 return 0; | 3602 return 0; |
3603 return frame()->ownerElement(); | 3603 return frame()->ownerElement(); |
3604 } | 3604 } |
3605 | 3605 |
3606 String Document::cookie(ExceptionCode& ec) const | 3606 String Document::cookie(ExceptionCode& ec) const |
3607 { | 3607 { |
3608 if (page() && !page()->settings()->cookieEnabled()) | 3608 if (page() && !page()->settings()->cookieEnabled()) |
3609 return String(); | 3609 return String(); |
3610 | 3610 |
3611 // FIXME: The HTML5 DOM spec states that this attribute can raise an | 3611 // FIXME: The HTML5 DOM spec states that this attribute can raise an |
3612 // INVALID_STATE_ERR exception on getting if the Document has no | 3612 // InvalidStateError exception on getting if the Document has no |
3613 // browsing context. | 3613 // browsing context. |
3614 | 3614 |
3615 if (!securityOrigin()->canAccessCookies()) { | 3615 if (!securityOrigin()->canAccessCookies()) { |
3616 ec = SECURITY_ERR; | 3616 ec = SecurityError; |
3617 return String(); | 3617 return String(); |
3618 } | 3618 } |
3619 | 3619 |
3620 KURL cookieURL = this->cookieURL(); | 3620 KURL cookieURL = this->cookieURL(); |
3621 if (cookieURL.isEmpty()) | 3621 if (cookieURL.isEmpty()) |
3622 return String(); | 3622 return String(); |
3623 | 3623 |
3624 return cookies(this, cookieURL); | 3624 return cookies(this, cookieURL); |
3625 } | 3625 } |
3626 | 3626 |
3627 void Document::setCookie(const String& value, ExceptionCode& ec) | 3627 void Document::setCookie(const String& value, ExceptionCode& ec) |
3628 { | 3628 { |
3629 if (page() && !page()->settings()->cookieEnabled()) | 3629 if (page() && !page()->settings()->cookieEnabled()) |
3630 return; | 3630 return; |
3631 | 3631 |
3632 // FIXME: The HTML5 DOM spec states that this attribute can raise an | 3632 // FIXME: The HTML5 DOM spec states that this attribute can raise an |
3633 // INVALID_STATE_ERR exception on setting if the Document has no | 3633 // InvalidStateError exception on setting if the Document has no |
3634 // browsing context. | 3634 // browsing context. |
3635 | 3635 |
3636 if (!securityOrigin()->canAccessCookies()) { | 3636 if (!securityOrigin()->canAccessCookies()) { |
3637 ec = SECURITY_ERR; | 3637 ec = SecurityError; |
3638 return; | 3638 return; |
3639 } | 3639 } |
3640 | 3640 |
3641 KURL cookieURL = this->cookieURL(); | 3641 KURL cookieURL = this->cookieURL(); |
3642 if (cookieURL.isEmpty()) | 3642 if (cookieURL.isEmpty()) |
3643 return; | 3643 return; |
3644 | 3644 |
3645 setCookies(this, cookieURL, value); | 3645 setCookies(this, cookieURL, value); |
3646 } | 3646 } |
3647 | 3647 |
3648 String Document::referrer() const | 3648 String Document::referrer() const |
3649 { | 3649 { |
3650 if (frame()) | 3650 if (frame()) |
3651 return frame()->loader()->referrer(); | 3651 return frame()->loader()->referrer(); |
3652 return String(); | 3652 return String(); |
3653 } | 3653 } |
3654 | 3654 |
3655 String Document::domain() const | 3655 String Document::domain() const |
3656 { | 3656 { |
3657 return securityOrigin()->domain(); | 3657 return securityOrigin()->domain(); |
3658 } | 3658 } |
3659 | 3659 |
3660 void Document::setDomain(const String& newDomain, ExceptionCode& ec) | 3660 void Document::setDomain(const String& newDomain, ExceptionCode& ec) |
3661 { | 3661 { |
3662 if (SchemeRegistry::isDomainRelaxationForbiddenForURLScheme(securityOrigin()
->protocol())) { | 3662 if (SchemeRegistry::isDomainRelaxationForbiddenForURLScheme(securityOrigin()
->protocol())) { |
3663 ec = SECURITY_ERR; | 3663 ec = SecurityError; |
3664 return; | 3664 return; |
3665 } | 3665 } |
3666 | 3666 |
3667 // Both NS and IE specify that changing the domain is only allowed when | 3667 // Both NS and IE specify that changing the domain is only allowed when |
3668 // the new domain is a suffix of the old domain. | 3668 // the new domain is a suffix of the old domain. |
3669 | 3669 |
3670 // FIXME: We should add logging indicating why a domain was not allowed. | 3670 // FIXME: We should add logging indicating why a domain was not allowed. |
3671 | 3671 |
3672 // If the new domain is the same as the old domain, still call | 3672 // If the new domain is the same as the old domain, still call |
3673 // securityOrigin()->setDomainForDOM. This will change the | 3673 // securityOrigin()->setDomainForDOM. This will change the |
3674 // security check behavior. For example, if a page loaded on port 8000 | 3674 // security check behavior. For example, if a page loaded on port 8000 |
3675 // assigns its current domain using document.domain, the page will | 3675 // assigns its current domain using document.domain, the page will |
3676 // allow other pages loaded on different ports in the same domain that | 3676 // allow other pages loaded on different ports in the same domain that |
3677 // have also assigned to access this page. | 3677 // have also assigned to access this page. |
3678 if (equalIgnoringCase(domain(), newDomain)) { | 3678 if (equalIgnoringCase(domain(), newDomain)) { |
3679 securityOrigin()->setDomainFromDOM(newDomain); | 3679 securityOrigin()->setDomainFromDOM(newDomain); |
3680 if (m_frame) | 3680 if (m_frame) |
3681 m_frame->script()->updateSecurityOrigin(); | 3681 m_frame->script()->updateSecurityOrigin(); |
3682 return; | 3682 return; |
3683 } | 3683 } |
3684 | 3684 |
3685 int oldLength = domain().length(); | 3685 int oldLength = domain().length(); |
3686 int newLength = newDomain.length(); | 3686 int newLength = newDomain.length(); |
3687 // e.g. newDomain = webkit.org (10) and domain() = www.webkit.org (14) | 3687 // e.g. newDomain = webkit.org (10) and domain() = www.webkit.org (14) |
3688 if (newLength >= oldLength) { | 3688 if (newLength >= oldLength) { |
3689 ec = SECURITY_ERR; | 3689 ec = SecurityError; |
3690 return; | 3690 return; |
3691 } | 3691 } |
3692 | 3692 |
3693 String test = domain(); | 3693 String test = domain(); |
3694 // Check that it's a subdomain, not e.g. "ebkit.org" | 3694 // Check that it's a subdomain, not e.g. "ebkit.org" |
3695 if (test[oldLength - newLength - 1] != '.') { | 3695 if (test[oldLength - newLength - 1] != '.') { |
3696 ec = SECURITY_ERR; | 3696 ec = SecurityError; |
3697 return; | 3697 return; |
3698 } | 3698 } |
3699 | 3699 |
3700 // Now test is "webkit.org" from domain() | 3700 // Now test is "webkit.org" from domain() |
3701 // and we check that it's the same thing as newDomain | 3701 // and we check that it's the same thing as newDomain |
3702 test.remove(0, oldLength - newLength); | 3702 test.remove(0, oldLength - newLength); |
3703 if (test != newDomain) { | 3703 if (test != newDomain) { |
3704 ec = SECURITY_ERR; | 3704 ec = SecurityError; |
3705 return; | 3705 return; |
3706 } | 3706 } |
3707 | 3707 |
3708 securityOrigin()->setDomainFromDOM(newDomain); | 3708 securityOrigin()->setDomainFromDOM(newDomain); |
3709 if (m_frame) | 3709 if (m_frame) |
3710 m_frame->script()->updateSecurityOrigin(); | 3710 m_frame->script()->updateSecurityOrigin(); |
3711 } | 3711 } |
3712 | 3712 |
3713 // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-lastmodified | 3713 // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-lastmodified |
3714 String Document::lastModified() const | 3714 String Document::lastModified() const |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3814 bool nameStart = true; | 3814 bool nameStart = true; |
3815 bool sawColon = false; | 3815 bool sawColon = false; |
3816 int colonPos = 0; | 3816 int colonPos = 0; |
3817 | 3817 |
3818 const UChar* s = qualifiedName.bloatedCharacters(); | 3818 const UChar* s = qualifiedName.bloatedCharacters(); |
3819 for (unsigned i = 0; i < length;) { | 3819 for (unsigned i = 0; i < length;) { |
3820 UChar32 c; | 3820 UChar32 c; |
3821 U16_NEXT(s, i, length, c) | 3821 U16_NEXT(s, i, length, c) |
3822 if (c == ':') { | 3822 if (c == ':') { |
3823 if (sawColon) { | 3823 if (sawColon) { |
3824 ec = NAMESPACE_ERR; | 3824 ec = NamespaceError; |
3825 return false; // multiple colons: not allowed | 3825 return false; // multiple colons: not allowed |
3826 } | 3826 } |
3827 nameStart = true; | 3827 nameStart = true; |
3828 sawColon = true; | 3828 sawColon = true; |
3829 colonPos = i - 1; | 3829 colonPos = i - 1; |
3830 } else if (nameStart) { | 3830 } else if (nameStart) { |
3831 if (!isValidNameStart(c)) { | 3831 if (!isValidNameStart(c)) { |
3832 ec = InvalidCharacterError; | 3832 ec = InvalidCharacterError; |
3833 return false; | 3833 return false; |
3834 } | 3834 } |
3835 nameStart = false; | 3835 nameStart = false; |
3836 } else { | 3836 } else { |
3837 if (!isValidNamePart(c)) { | 3837 if (!isValidNamePart(c)) { |
3838 ec = InvalidCharacterError; | 3838 ec = InvalidCharacterError; |
3839 return false; | 3839 return false; |
3840 } | 3840 } |
3841 } | 3841 } |
3842 } | 3842 } |
3843 | 3843 |
3844 if (!sawColon) { | 3844 if (!sawColon) { |
3845 prefix = String(); | 3845 prefix = String(); |
3846 localName = qualifiedName; | 3846 localName = qualifiedName; |
3847 } else { | 3847 } else { |
3848 prefix = qualifiedName.substring(0, colonPos); | 3848 prefix = qualifiedName.substring(0, colonPos); |
3849 if (prefix.isEmpty()) { | 3849 if (prefix.isEmpty()) { |
3850 ec = NAMESPACE_ERR; | 3850 ec = NamespaceError; |
3851 return false; | 3851 return false; |
3852 } | 3852 } |
3853 localName = qualifiedName.substring(colonPos + 1); | 3853 localName = qualifiedName.substring(colonPos + 1); |
3854 } | 3854 } |
3855 | 3855 |
3856 if (localName.isEmpty()) { | 3856 if (localName.isEmpty()) { |
3857 ec = NAMESPACE_ERR; | 3857 ec = NamespaceError; |
3858 return false; | 3858 return false; |
3859 } | 3859 } |
3860 | 3860 |
3861 return true; | 3861 return true; |
3862 } | 3862 } |
3863 | 3863 |
3864 void Document::setDecoder(PassRefPtr<TextResourceDecoder> decoder) | 3864 void Document::setDecoder(PassRefPtr<TextResourceDecoder> decoder) |
3865 { | 3865 { |
3866 m_decoder = decoder; | 3866 m_decoder = decoder; |
3867 } | 3867 } |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4046 | 4046 |
4047 PassRefPtr<Attr> Document::createAttributeNS(const String& namespaceURI, const S
tring& qualifiedName, ExceptionCode& ec, bool shouldIgnoreNamespaceChecks) | 4047 PassRefPtr<Attr> Document::createAttributeNS(const String& namespaceURI, const S
tring& qualifiedName, ExceptionCode& ec, bool shouldIgnoreNamespaceChecks) |
4048 { | 4048 { |
4049 String prefix, localName; | 4049 String prefix, localName; |
4050 if (!parseQualifiedName(qualifiedName, prefix, localName, ec)) | 4050 if (!parseQualifiedName(qualifiedName, prefix, localName, ec)) |
4051 return 0; | 4051 return 0; |
4052 | 4052 |
4053 QualifiedName qName(prefix, localName, namespaceURI); | 4053 QualifiedName qName(prefix, localName, namespaceURI); |
4054 | 4054 |
4055 if (!shouldIgnoreNamespaceChecks && !hasValidNamespaceForAttributes(qName))
{ | 4055 if (!shouldIgnoreNamespaceChecks && !hasValidNamespaceForAttributes(qName))
{ |
4056 ec = NAMESPACE_ERR; | 4056 ec = NamespaceError; |
4057 return 0; | 4057 return 0; |
4058 } | 4058 } |
4059 | 4059 |
4060 return Attr::create(this, qName, emptyString()); | 4060 return Attr::create(this, qName, emptyString()); |
4061 } | 4061 } |
4062 | 4062 |
4063 const SVGDocumentExtensions* Document::svgExtensions() | 4063 const SVGDocumentExtensions* Document::svgExtensions() |
4064 { | 4064 { |
4065 return m_svgExtensions.get(); | 4065 return m_svgExtensions.get(); |
4066 } | 4066 } |
(...skipping 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5230 { | 5230 { |
5231 return DocumentLifecycleNotifier::create(this); | 5231 return DocumentLifecycleNotifier::create(this); |
5232 } | 5232 } |
5233 | 5233 |
5234 DocumentLifecycleNotifier* Document::lifecycleNotifier() | 5234 DocumentLifecycleNotifier* Document::lifecycleNotifier() |
5235 { | 5235 { |
5236 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec
ycleNotifier()); | 5236 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec
ycleNotifier()); |
5237 } | 5237 } |
5238 | 5238 |
5239 } // namespace WebCore | 5239 } // namespace WebCore |
OLD | NEW |