15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/DOMEditor.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionStatePlaceholder.h"
36591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "core/dom/DOMException.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Node.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Text.h"
40e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/editing/markup.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/DOMPatchSupport.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorHistory.h"
43e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/RefPtr.h"
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class DOMEditor::RemoveChildAction FINAL : public InspectorHistory::Action {
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(RemoveChildAction);
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RemoveChildAction(Node* parentNode, Node* node)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : InspectorHistory::Action("RemoveChild")
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_parentNode(parentNode)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_node(node)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool perform(ExceptionState& exceptionState) OVERRIDE
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_anchorNode = m_node->nextSibling();
6051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return redo(exceptionState);
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool undo(ExceptionState& exceptionState) OVERRIDE
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_parentNode->insertBefore(m_node.get(), m_anchorNode.get(), exceptionState);
6651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return !exceptionState.hadException();
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool redo(ExceptionState& exceptionState) OVERRIDE
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_parentNode->removeChild(m_node.get(), exceptionState);
7251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return !exceptionState.hadException();
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    virtual void trace(Visitor* visitor) OVERRIDE
765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_parentNode);
785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_node);
795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_anchorNode);
805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        InspectorHistory::Action::trace(visitor);
815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_parentNode;
855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_node;
865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_anchorNode;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class DOMEditor::InsertBeforeAction FINAL : public InspectorHistory::Action {
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(InsertBeforeAction);
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
92f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    InsertBeforeAction(Node* parentNode, PassRefPtrWillBeRawPtr<Node> node, Node* anchorNode)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : InspectorHistory::Action("InsertBefore")
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_parentNode(parentNode)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_node(node)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_anchorNode(anchorNode)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool perform(ExceptionState& exceptionState) OVERRIDE
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_node->parentNode()) {
1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            m_removeChildAction = adoptRefWillBeNoop(new RemoveChildAction(m_node->parentNode(), m_node.get()));
10451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            if (!m_removeChildAction->perform(exceptionState))
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return false;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
10751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_parentNode->insertBefore(m_node.get(), m_anchorNode.get(), exceptionState);
10851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return !exceptionState.hadException();
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool undo(ExceptionState& exceptionState) OVERRIDE
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
11351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_parentNode->removeChild(m_node.get(), exceptionState);
11451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (exceptionState.hadException())
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_removeChildAction)
11751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return m_removeChildAction->undo(exceptionState);
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool redo(ExceptionState& exceptionState) OVERRIDE
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
12351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (m_removeChildAction && !m_removeChildAction->redo(exceptionState))
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
12551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_parentNode->insertBefore(m_node.get(), m_anchorNode.get(), exceptionState);
12651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return !exceptionState.hadException();
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    virtual void trace(Visitor* visitor) OVERRIDE
1305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
1315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_parentNode);
1325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_node);
1335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_anchorNode);
1345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_removeChildAction);
1355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        InspectorHistory::Action::trace(visitor);
1365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
1375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_parentNode;
1405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_node;
1415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_anchorNode;
1425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<RemoveChildAction> m_removeChildAction;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class DOMEditor::RemoveAttributeAction FINAL : public InspectorHistory::Action {
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(RemoveAttributeAction);
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
148a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RemoveAttributeAction(Element* element, const AtomicString& name)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : InspectorHistory::Action("RemoveAttribute")
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_element(element)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_name(name)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool perform(ExceptionState& exceptionState) OVERRIDE
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_value = m_element->getAttribute(m_name);
15851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return redo(exceptionState);
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool undo(ExceptionState& exceptionState) OVERRIDE
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
16351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_element->setAttribute(m_name, m_value, exceptionState);
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool redo(ExceptionState&) OVERRIDE
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_element->removeAttribute(m_name);
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    virtual void trace(Visitor* visitor) OVERRIDE
1745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
1755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_element);
1765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        InspectorHistory::Action::trace(visitor);
1775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
1785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Element> m_element;
181a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    AtomicString m_name;
182a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    AtomicString m_value;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class DOMEditor::SetAttributeAction FINAL : public InspectorHistory::Action {
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(SetAttributeAction);
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
188a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    SetAttributeAction(Element* element, const AtomicString& name, const AtomicString& value)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : InspectorHistory::Action("SetAttribute")
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_element(element)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_name(name)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_value(value)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_hadAttribute(false)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool perform(ExceptionState& exceptionState) OVERRIDE
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
199d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        const AtomicString& value = m_element->getAttribute(m_name);
200d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_hadAttribute = !value.isNull();
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_hadAttribute)
202d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_oldValue = value;
20351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return redo(exceptionState);
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool undo(ExceptionState& exceptionState) OVERRIDE
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_hadAttribute)
20951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            m_element->setAttribute(m_name, m_oldValue, exceptionState);
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_element->removeAttribute(m_name);
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool redo(ExceptionState& exceptionState) OVERRIDE
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
21751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_element->setAttribute(m_name, m_value, exceptionState);
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    virtual void trace(Visitor* visitor) OVERRIDE
2225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
2235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_element);
2245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        InspectorHistory::Action::trace(visitor);
2255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
2265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Element> m_element;
229a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    AtomicString m_name;
230a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    AtomicString m_value;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_hadAttribute;
232a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    AtomicString m_oldValue;
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class DOMEditor::SetOuterHTMLAction FINAL : public InspectorHistory::Action {
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(SetOuterHTMLAction);
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SetOuterHTMLAction(Node* node, const String& html)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : InspectorHistory::Action("SetOuterHTML")
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_node(node)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_nextSibling(node->nextSibling())
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_html(html)
2435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        , m_newNode(nullptr)
2445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        , m_history(adoptPtrWillBeNoop(new InspectorHistory()))
2455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        , m_domEditor(adoptPtrWillBeNoop(new DOMEditor(m_history.get())))
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool perform(ExceptionState& exceptionState) OVERRIDE
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_oldHTML = createMarkup(m_node.get());
2528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        ASSERT(m_node->ownerDocument());
2538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        DOMPatchSupport domPatchSupport(m_domEditor.get(), *m_node->ownerDocument());
25451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_newNode = domPatchSupport.patchNode(m_node.get(), m_html, exceptionState);
25551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return !exceptionState.hadException();
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool undo(ExceptionState& exceptionState) OVERRIDE
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
26051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return m_history->undo(exceptionState);
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool redo(ExceptionState& exceptionState) OVERRIDE
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
26551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return m_history->redo(exceptionState);
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* newNode()
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_newNode;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    virtual void trace(Visitor* visitor) OVERRIDE
2745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
2755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_node);
2765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_nextSibling);
2775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_newNode);
2785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_history);
2795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_domEditor);
2805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        InspectorHistory::Action::trace(visitor);
2815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
2825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_node;
2855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_nextSibling;
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_html;
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_oldHTML;
2885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RawPtrWillBeMember<Node> m_newNode;
2895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    OwnPtrWillBeMember<InspectorHistory> m_history;
2905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    OwnPtrWillBeMember<DOMEditor> m_domEditor;
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class DOMEditor::ReplaceWholeTextAction FINAL : public InspectorHistory::Action {
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(ReplaceWholeTextAction);
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ReplaceWholeTextAction(Text* textNode, const String& text)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : InspectorHistory::Action("ReplaceWholeText")
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_textNode(textNode)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_text(text)
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool perform(ExceptionState& exceptionState) OVERRIDE
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_oldText = m_textNode->wholeText();
30651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return redo(exceptionState);
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool undo(ExceptionState&) OVERRIDE
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
311e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        m_textNode->replaceWholeText(m_oldText);
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool redo(ExceptionState&) OVERRIDE
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
317e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        m_textNode->replaceWholeText(m_text);
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    virtual void trace(Visitor* visitor) OVERRIDE
3225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
3235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_textNode);
3245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        InspectorHistory::Action::trace(visitor);
3255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
3265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
3285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Text> m_textNode;
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_text;
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_oldText;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class DOMEditor::ReplaceChildNodeAction FINAL : public InspectorHistory::Action {
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(ReplaceChildNodeAction);
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
336f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ReplaceChildNodeAction(Node* parentNode, PassRefPtrWillBeRawPtr<Node> newNode, Node* oldNode)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : InspectorHistory::Action("ReplaceChildNode")
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_parentNode(parentNode)
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_newNode(newNode)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_oldNode(oldNode)
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool perform(ExceptionState& exceptionState) OVERRIDE
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
34651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return redo(exceptionState);
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool undo(ExceptionState& exceptionState) OVERRIDE
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_parentNode->replaceChild(m_oldNode, m_newNode.get(), exceptionState);
35251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return !exceptionState.hadException();
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool redo(ExceptionState& exceptionState) OVERRIDE
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_parentNode->replaceChild(m_newNode, m_oldNode.get(), exceptionState);
35851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return !exceptionState.hadException();
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    virtual void trace(Visitor* visitor) OVERRIDE
3625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
3635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_parentNode);
3645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_newNode);
3655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_oldNode);
3665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        InspectorHistory::Action::trace(visitor);
3675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
3685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
3705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_parentNode;
3715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_newNode;
3725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_oldNode;
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class DOMEditor::SetNodeValueAction FINAL : public InspectorHistory::Action {
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(SetNodeValueAction);
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SetNodeValueAction(Node* node, const String& value)
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : InspectorHistory::Action("SetNodeValue")
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_node(node)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_value(value)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool perform(ExceptionState&) OVERRIDE
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_oldValue = m_node->nodeValue();
3881fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        return redo(IGNORE_EXCEPTION);
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool undo(ExceptionState&) OVERRIDE
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
393e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        m_node->setNodeValue(m_oldValue);
394e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return true;
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool redo(ExceptionState&) OVERRIDE
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
399e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        m_node->setNodeValue(m_value);
400e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return true;
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    virtual void trace(Visitor* visitor) OVERRIDE
4045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
4055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        visitor->trace(m_node);
4065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        InspectorHistory::Action::trace(visitor);
4075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
4085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
4105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeMember<Node> m_node;
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_value;
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_oldValue;
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DOMEditor::DOMEditor(InspectorHistory* history) : m_history(history) { }
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
417f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)bool DOMEditor::insertBefore(Node* parentNode, PassRefPtrWillBeRawPtr<Node> node, Node* anchorNode, ExceptionState& exceptionState)
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_history->perform(adoptRefWillBeNoop(new InsertBeforeAction(parentNode, node, anchorNode)), exceptionState);
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool DOMEditor::removeChild(Node* parentNode, Node* node, ExceptionState& exceptionState)
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_history->perform(adoptRefWillBeNoop(new RemoveChildAction(parentNode, node)), exceptionState);
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool DOMEditor::setAttribute(Element* element, const String& name, const String& value, ExceptionState& exceptionState)
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_history->perform(adoptRefWillBeNoop(new SetAttributeAction(element, AtomicString(name), AtomicString(value))), exceptionState);
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool DOMEditor::removeAttribute(Element* element, const String& name, ExceptionState& exceptionState)
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_history->perform(adoptRefWillBeNoop(new RemoveAttributeAction(element, AtomicString(name))), exceptionState);
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool DOMEditor::setOuterHTML(Node* node, const String& html, Node** newNode, ExceptionState& exceptionState)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<SetOuterHTMLAction> action = adoptRefWillBeNoop(new SetOuterHTMLAction(node, html));
44007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool result = m_history->perform(action, exceptionState);
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (result)
44207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        *newNode = action->newNode();
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool DOMEditor::replaceWholeText(Text* textNode, const String& text, ExceptionState& exceptionState)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_history->perform(adoptRefWillBeNoop(new ReplaceWholeTextAction(textNode, text)), exceptionState);
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
451f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)bool DOMEditor::replaceChild(Node* parentNode, PassRefPtrWillBeRawPtr<Node> newNode, Node* oldNode, ExceptionState& exceptionState)
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_history->perform(adoptRefWillBeNoop(new ReplaceChildNodeAction(parentNode, newNode, oldNode)), exceptionState);
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool DOMEditor::setNodeValue(Node* node, const String& value, ExceptionState& exceptionState)
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return m_history->perform(adoptRefWillBeNoop(new SetNodeValueAction(node, value)), exceptionState);
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)static void populateErrorString(ExceptionState& exceptionState, ErrorString* errorString)
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
46351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (exceptionState.hadException())
46451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        *errorString = DOMException::getErrorName(exceptionState.code());
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
467f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)bool DOMEditor::insertBefore(Node* parentNode, PassRefPtrWillBeRawPtr<Node> node, Node* anchorNode, ErrorString* errorString)
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
46951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
47051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool result = insertBefore(parentNode, node, anchorNode, exceptionState);
47151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    populateErrorString(exceptionState, errorString);
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool DOMEditor::removeChild(Node* parentNode, Node* node, ErrorString* errorString)
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
47751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
47851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool result = removeChild(parentNode, node, exceptionState);
47951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    populateErrorString(exceptionState, errorString);
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool DOMEditor::setAttribute(Element* element, const String& name, const String& value, ErrorString* errorString)
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
48551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
48651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool result = setAttribute(element, name, value, exceptionState);
48751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    populateErrorString(exceptionState, errorString);
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool DOMEditor::removeAttribute(Element* element, const String& name, ErrorString* errorString)
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
49351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
49451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool result = removeAttribute(element, name, exceptionState);
49551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    populateErrorString(exceptionState, errorString);
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool DOMEditor::setOuterHTML(Node* node, const String& html, Node** newNode, ErrorString* errorString)
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
50151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
50251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool result = setOuterHTML(node, html, newNode, exceptionState);
50351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    populateErrorString(exceptionState, errorString);
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool DOMEditor::replaceWholeText(Text* textNode, const String& text, ErrorString* errorString)
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
50951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
51051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool result = replaceWholeText(textNode, text, exceptionState);
51151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    populateErrorString(exceptionState, errorString);
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void DOMEditor::trace(Visitor* visitor)
5165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
5175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_history);
5185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
5195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
520c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
522