1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
25f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (c) 2009 Google Inc. All rights reserved.
35f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian *
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met:
75f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian *
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions of source code must retain the above copyright
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer.
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions in binary form must reproduce the above
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution.
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Neither the name of Google Inc. nor the names of its
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission.
175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian *
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "config.h"
325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "ReplaceNodeWithSpanCommand.h"
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "htmlediting.h"
355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "HTMLElement.h"
365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "HTMLNames.h"
375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <wtf/Assertions.h>
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianusing namespace HTMLNames;
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
44a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochReplaceNodeWithSpanCommand::ReplaceNodeWithSpanCommand(PassRefPtr<HTMLElement> element)
45a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    : SimpleEditCommand(element->document())
46a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_elementToReplace(element)
475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
48a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(m_elementToReplace);
495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
51a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic void swapInNodePreservingAttributesAndChildren(HTMLElement* newNode, HTMLElement* nodeToReplace)
525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    ASSERT(nodeToReplace->inDocument());
545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    ExceptionCode ec = 0;
55a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ContainerNode* parentNode = nodeToReplace->parentNode();
565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    parentNode->insertBefore(newNode, nodeToReplace, ec);
575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    ASSERT(!ec);
585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<Node> nextChild;
602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    for (Node* child = nodeToReplace->firstChild(); child; child = nextChild.get()) {
61cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        nextChild = child->nextSibling();
625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        newNode->appendChild(child, ec);
635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        ASSERT(!ec);
645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    newNode->attributes()->setAttributes(*nodeToReplace->attributes());
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    parentNode->removeChild(nodeToReplace, ec);
695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    ASSERT(!ec);
705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ReplaceNodeWithSpanCommand::doApply()
735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
74a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_elementToReplace->inDocument())
755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!m_spanElement)
77a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_spanElement = createHTMLElement(m_elementToReplace->document(), spanTag);
78a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    swapInNodePreservingAttributesAndChildren(m_spanElement.get(), m_elementToReplace.get());
795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid ReplaceNodeWithSpanCommand::doUnapply()
825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!m_spanElement->inDocument())
845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return;
85a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    swapInNodePreservingAttributesAndChildren(m_elementToReplace.get(), m_spanElement.get());
865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} // namespace WebCore
89