• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2005, 2008 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #include "config.h"
27 #include "SplitElementCommand.h"
28 
29 #include "Element.h"
30 #include <wtf/Assertions.h>
31 
32 namespace WebCore {
33 
SplitElementCommand(PassRefPtr<Element> element,PassRefPtr<Node> atChild)34 SplitElementCommand::SplitElementCommand(PassRefPtr<Element> element, PassRefPtr<Node> atChild)
35     : SimpleEditCommand(element->document())
36     , m_element2(element)
37     , m_atChild(atChild)
38 {
39     ASSERT(m_element2);
40     ASSERT(m_atChild);
41     ASSERT(m_atChild->parentNode() == m_element2);
42 }
43 
doApply()44 void SplitElementCommand::doApply()
45 {
46     RefPtr<Element> prefixElement = m_element2->cloneElementWithoutChildren();
47 
48     if (m_atChild->parentNode() != m_element2)
49         return;
50 
51     Vector<RefPtr<Node> > children;
52     for (Node* node = m_element2->firstChild(); node != m_atChild; node = node->nextSibling())
53         children.append(node);
54 
55     ExceptionCode ec = 0;
56 
57     Node* parent = m_element2->parentNode();
58     if (!parent)
59         return;
60     parent->insertBefore(prefixElement.get(), m_element2.get(), ec);
61     if (ec)
62         return;
63     m_element1 = prefixElement.release();
64 
65     size_t size = children.size();
66     for (size_t i = 0; i < size; ++i)
67         m_element1->appendChild(children[i], ec);
68 }
69 
doUnapply()70 void SplitElementCommand::doUnapply()
71 {
72     if (!m_element1)
73         return;
74 
75     Vector<RefPtr<Node> > children;
76     for (Node* node = m_element1->firstChild(); node; node = node->nextSibling())
77         children.append(node);
78 
79     RefPtr<Node> refChild = m_element2->firstChild();
80 
81     ExceptionCode ec = 0;
82 
83     size_t size = children.size();
84     for (size_t i = 0; i < size; ++i)
85         m_element2->insertBefore(children[i].get(), refChild.get(), ec);
86 
87     m_element1->remove(ec);
88     m_element1 = 0;
89 }
90 
91 } // namespace WebCore
92