Changeset 126127 in webkit


Ignore:
Timestamp:
Aug 20, 2012 8:22:06 PM (12 years ago)
Author:
shinyak@chromium.org
Message:

ShadowRoot.cloneNode() must always throw a DATA_CLONE_ERR exception.
https://bugs.webkit.org/show_bug.cgi?id=91704

Reviewed by Dimitri Glazkov.

Source/WebCore:

According to the spec, ShadowRoot.cloneNode() should throw a DATA_CLONE_ERR exception. The existing implementation
returned null object instead.

We change the cloneNode() interface so that we can throw an exception from cloneNode().

Test: fast/dom/shadow/shadowroot-clonenode.html

  • dom/Attr.cpp:

(WebCore::Attr::cloneNode):

  • dom/Attr.h:
  • dom/CDATASection.cpp:

(WebCore::CDATASection::cloneNode):

  • dom/CDATASection.h:

(CDATASection):

  • dom/Comment.cpp:

(WebCore::Comment::cloneNode):

  • dom/Comment.h:

(Comment):

  • dom/Document.cpp:

(WebCore::Document::cloneNode):

  • dom/Document.h:

(Document):

  • dom/DocumentFragment.cpp:

(WebCore::DocumentFragment::cloneNode):

  • dom/DocumentFragment.h:

(DocumentFragment):

  • dom/DocumentType.cpp:

(WebCore::DocumentType::cloneNode):

  • dom/DocumentType.h:

(DocumentType):

  • dom/Element.cpp:

(WebCore::Element::cloneNode):

  • dom/Element.h:

(Element):

  • dom/EntityReference.cpp:

(WebCore::EntityReference::cloneNode):

  • dom/EntityReference.h:

(EntityReference):

  • dom/Node.h:

(Node):
(WebCore::Node::cloneNode):

  • dom/Node.idl:
  • dom/ProcessingInstruction.cpp:

(WebCore::ProcessingInstruction::cloneNode):

  • dom/ProcessingInstruction.h:

(ProcessingInstruction):

  • dom/ShadowRoot.cpp:

(WebCore::ShadowRoot::cloneNode):

  • dom/ShadowRoot.h:

(ShadowRoot):

  • dom/Text.cpp:

(WebCore::Text::cloneNode):

  • dom/Text.h:

(Text):

LayoutTests:

  • fast/dom/shadow/shadowroot-clonenode-expected.txt: Added.
  • fast/dom/shadow/shadowroot-clonenode.html: Added.
Location:
trunk
Files:
2 added
26 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r126124 r126127  
     12012-08-20  Shinya Kawanaka  <shinyak@chromium.org>
     2
     3        ShadowRoot.cloneNode() must always throw a DATA_CLONE_ERR exception.
     4        https://bugs.webkit.org/show_bug.cgi?id=91704
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        * fast/dom/shadow/shadowroot-clonenode-expected.txt: Added.
     9        * fast/dom/shadow/shadowroot-clonenode.html: Added.
     10
    1112012-08-20  Kenneth Russell  <kbr@google.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r126126 r126127  
     12012-08-20  Shinya Kawanaka  <shinyak@chromium.org>
     2
     3        ShadowRoot.cloneNode() must always throw a DATA_CLONE_ERR exception.
     4        https://bugs.webkit.org/show_bug.cgi?id=91704
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        According to the spec, ShadowRoot.cloneNode() should throw a DATA_CLONE_ERR exception. The existing implementation
     9        returned null object instead.
     10
     11        We change the cloneNode() interface so that we can throw an exception from cloneNode().
     12
     13        Test: fast/dom/shadow/shadowroot-clonenode.html
     14
     15        * dom/Attr.cpp:
     16        (WebCore::Attr::cloneNode):
     17        * dom/Attr.h:
     18        * dom/CDATASection.cpp:
     19        (WebCore::CDATASection::cloneNode):
     20        * dom/CDATASection.h:
     21        (CDATASection):
     22        * dom/Comment.cpp:
     23        (WebCore::Comment::cloneNode):
     24        * dom/Comment.h:
     25        (Comment):
     26        * dom/Document.cpp:
     27        (WebCore::Document::cloneNode):
     28        * dom/Document.h:
     29        (Document):
     30        * dom/DocumentFragment.cpp:
     31        (WebCore::DocumentFragment::cloneNode):
     32        * dom/DocumentFragment.h:
     33        (DocumentFragment):
     34        * dom/DocumentType.cpp:
     35        (WebCore::DocumentType::cloneNode):
     36        * dom/DocumentType.h:
     37        (DocumentType):
     38        * dom/Element.cpp:
     39        (WebCore::Element::cloneNode):
     40        * dom/Element.h:
     41        (Element):
     42        * dom/EntityReference.cpp:
     43        (WebCore::EntityReference::cloneNode):
     44        * dom/EntityReference.h:
     45        (EntityReference):
     46        * dom/Node.h:
     47        (Node):
     48        (WebCore::Node::cloneNode):
     49        * dom/Node.idl:
     50        * dom/ProcessingInstruction.cpp:
     51        (WebCore::ProcessingInstruction::cloneNode):
     52        * dom/ProcessingInstruction.h:
     53        (ProcessingInstruction):
     54        * dom/ShadowRoot.cpp:
     55        (WebCore::ShadowRoot::cloneNode):
     56        * dom/ShadowRoot.h:
     57        (ShadowRoot):
     58        * dom/Text.cpp:
     59        (WebCore::Text::cloneNode):
     60        * dom/Text.h:
     61        (Text):
     62
    1632012-08-20  Kent Tamura  <tkent@chromium.org>
    264
  • trunk/Source/WebCore/dom/Attr.cpp

    r122637 r126127  
    139139}
    140140
    141 PassRefPtr<Node> Attr::cloneNode(bool /*deep*/)
     141PassRefPtr<Node> Attr::cloneNode(bool /*deep*/, ExceptionCode&)
    142142{
    143143    RefPtr<Attr> clone = adoptRef(new Attr(document(), qualifiedName(), value()));
  • trunk/Source/WebCore/dom/Attr.h

    r117195 r126127  
    8282    virtual String nodeValue() const OVERRIDE { return value(); }
    8383    virtual void setNodeValue(const String&, ExceptionCode&);
    84     virtual PassRefPtr<Node> cloneNode(bool deep);
     84    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&);
    8585
    8686    virtual bool isAttributeNode() const { return true; }
  • trunk/Source/WebCore/dom/CDATASection.cpp

    r83816 r126127  
    4747}
    4848
    49 PassRefPtr<Node> CDATASection::cloneNode(bool /*deep*/)
     49PassRefPtr<Node> CDATASection::cloneNode(bool /*deep*/, ExceptionCode&)
    5050{
    5151    return create(document(), data());
  • trunk/Source/WebCore/dom/CDATASection.h

    r83816 r126127  
    3737    virtual String nodeName() const;
    3838    virtual NodeType nodeType() const;
    39     virtual PassRefPtr<Node> cloneNode(bool deep);
     39    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&);
    4040    virtual bool childTypeAllowed(NodeType) const;
    4141    virtual PassRefPtr<Text> virtualCreate(const String&);
  • trunk/Source/WebCore/dom/Comment.cpp

    r113312 r126127  
    4747}
    4848
    49 PassRefPtr<Node> Comment::cloneNode(bool /*deep*/)
     49PassRefPtr<Node> Comment::cloneNode(bool /*deep*/, ExceptionCode&)
    5050{
    5151    return create(document(), data());
  • trunk/Source/WebCore/dom/Comment.h

    r83816 r126127  
    3737    virtual String nodeName() const;
    3838    virtual NodeType nodeType() const;
    39     virtual PassRefPtr<Node> cloneNode(bool deep);
     39    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&);
    4040    virtual bool childTypeAllowed(NodeType) const;
    4141};
  • trunk/Source/WebCore/dom/Document.cpp

    r126113 r126127  
    32863286}
    32873287
    3288 PassRefPtr<Node> Document::cloneNode(bool /*deep*/)
     3288PassRefPtr<Node> Document::cloneNode(bool /*deep*/, ExceptionCode&)
    32893289{
    32903290    // Spec says cloning Document nodes is "implementation dependent"
  • trunk/Source/WebCore/dom/Document.h

    r126113 r126127  
    12071207    virtual NodeType nodeType() const;
    12081208    virtual bool childTypeAllowed(NodeType) const;
    1209     virtual PassRefPtr<Node> cloneNode(bool deep);
     1209    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&);
    12101210    virtual bool canReplaceChild(Node* newChild, Node* oldChild);
    12111211
  • trunk/Source/WebCore/dom/DocumentFragment.cpp

    r106530 r126127  
    6969}
    7070
    71 PassRefPtr<Node> DocumentFragment::cloneNode(bool deep)
     71PassRefPtr<Node> DocumentFragment::cloneNode(bool deep, ExceptionCode&)
    7272{
    7373    RefPtr<DocumentFragment> clone = create(document());
  • trunk/Source/WebCore/dom/DocumentFragment.h

    r117731 r126127  
    4545private:
    4646    virtual NodeType nodeType() const;
    47     virtual PassRefPtr<Node> cloneNode(bool deep);
     47    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&);
    4848    virtual bool childTypeAllowed(NodeType) const;
    4949};
  • trunk/Source/WebCore/dom/DocumentType.cpp

    r118192 r126127  
    5252}
    5353
    54 PassRefPtr<Node> DocumentType::cloneNode(bool /*deep*/)
     54PassRefPtr<Node> DocumentType::cloneNode(bool /*deep*/, ExceptionCode&)
    5555{
    5656    return create(document(), m_name, m_publicId, m_systemId);
  • trunk/Source/WebCore/dom/DocumentType.h

    r118192 r126127  
    5353    virtual String nodeName() const;
    5454    virtual NodeType nodeType() const;
    55     virtual PassRefPtr<Node> cloneNode(bool deep);
     55    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&);
    5656
    5757    virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
  • trunk/Source/WebCore/dom/Element.cpp

    r125951 r126127  
    177177DEFINE_VIRTUAL_ATTRIBUTE_EVENT_LISTENER(Element, load);
    178178
    179 PassRefPtr<Node> Element::cloneNode(bool deep)
     179PassRefPtr<Node> Element::cloneNode(bool deep, ExceptionCode&)
    180180{
    181181    return deep ? cloneElementWithChildren() : cloneElementWithoutChildren();
  • trunk/Source/WebCore/dom/Element.h

    r125009 r126127  
    502502    // cloneNode is private so that non-virtual cloneElementWithChildren and cloneElementWithoutChildren
    503503    // are used instead.
    504     virtual PassRefPtr<Node> cloneNode(bool deep);
     504    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&);
    505505    virtual PassRefPtr<Element> cloneElementWithoutAttributesAndChildren();
    506506
  • trunk/Source/WebCore/dom/EntityReference.cpp

    r58914 r126127  
    4747}
    4848
    49 PassRefPtr<Node> EntityReference::cloneNode(bool)
     49PassRefPtr<Node> EntityReference::cloneNode(bool, ExceptionCode&)
    5050{
    5151    return create(document(), m_entityName);
  • trunk/Source/WebCore/dom/EntityReference.h

    r47313 r126127  
    3636    virtual String nodeName() const;
    3737    virtual NodeType nodeType() const;
    38     virtual PassRefPtr<Node> cloneNode(bool deep);
     38    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&);
    3939
    4040    String m_entityName;
  • trunk/Source/WebCore/dom/Node.h

    r124954 r126127  
    2828#include "EditingBoundary.h"
    2929#include "EventTarget.h"
     30#include "ExceptionCodePlaceholder.h"
    3031#include "KURLHash.h"
    3132#include "LayoutTypes.h"
     
    187188    void remove(ExceptionCode&);
    188189    bool hasChildNodes() const { return firstChild(); }
    189     virtual PassRefPtr<Node> cloneNode(bool deep) = 0;
     190    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&) = 0;
     191    PassRefPtr<Node> cloneNode(bool deep) { return cloneNode(deep, ASSERT_NO_EXCEPTION); }
    190192    const AtomicString& localName() const { return virtualLocalName(); }
    191193    const AtomicString& namespaceURI() const { return virtualNamespaceURI(); }
  • trunk/Source/WebCore/dom/Node.idl

    r112424 r126127  
    8080
    8181        boolean            hasChildNodes();
    82         Node               cloneNode(in [Optional=DefaultIsUndefined] boolean deep);
     82        Node               cloneNode(in [Optional=DefaultIsUndefined] boolean deep)
     83            raises(DOMException);
     84
    8385        void               normalize();
    8486
  • trunk/Source/WebCore/dom/ProcessingInstruction.cpp

    r125805 r126127  
    9898}
    9999
    100 PassRefPtr<Node> ProcessingInstruction::cloneNode(bool /*deep*/)
     100PassRefPtr<Node> ProcessingInstruction::cloneNode(bool /*deep*/, ExceptionCode&)
    101101{
    102102    // FIXME: Is it a problem that this does not copy m_localHref?
  • trunk/Source/WebCore/dom/ProcessingInstruction.h

    r118963 r126127  
    6161    virtual String nodeValue() const;
    6262    virtual void setNodeValue(const String&, ExceptionCode&);
    63     virtual PassRefPtr<Node> cloneNode(bool deep);
     63    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&);
    6464    virtual bool offsetInCharacters() const;
    6565    virtual int maxCharacterOffset() const;
  • trunk/Source/WebCore/dom/ShadowRoot.cpp

    r124027 r126127  
    140140}
    141141
    142 PassRefPtr<Node> ShadowRoot::cloneNode(bool)
     142PassRefPtr<Node> ShadowRoot::cloneNode(bool, ExceptionCode& ec)
    143143{
    144144    // ShadowRoot should not be arbitrarily cloned.
     145    ec = DATA_CLONE_ERR;
    145146    return 0;
    146147}
  • trunk/Source/WebCore/dom/ShadowRoot.h

    r123451 r126127  
    9898    virtual ~ShadowRoot();
    9999    virtual String nodeName() const;
    100     virtual PassRefPtr<Node> cloneNode(bool deep);
     100    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&);
    101101    virtual bool childTypeAllowed(NodeType) const;
    102102    virtual void childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta) OVERRIDE;
  • trunk/Source/WebCore/dom/Text.cpp

    r121123 r126127  
    185185}
    186186
    187 PassRefPtr<Node> Text::cloneNode(bool /*deep*/)
     187PassRefPtr<Node> Text::cloneNode(bool /*deep*/, ExceptionCode&)
    188188{
    189189    return create(document(), data());
  • trunk/Source/WebCore/dom/Text.h

    r117242 r126127  
    5959    virtual String nodeName() const;
    6060    virtual NodeType nodeType() const;
    61     virtual PassRefPtr<Node> cloneNode(bool deep);
     61    virtual PassRefPtr<Node> cloneNode(bool deep, ExceptionCode&);
    6262    virtual bool rendererIsNeeded(const NodeRenderingContext&);
    6363    virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
Note: See TracChangeset for help on using the changeset viewer.