Changeset 126258 in webkit


Ignore:
Timestamp:
Aug 21, 2012 8:56:30 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

Implement UndoManager's automatic DOM transactions
https://bugs.webkit.org/show_bug.cgi?id=91812

Patch by Sukolsak Sakshuwong <sukolsak@google.com> on 2012-08-21
Reviewed by Ryosuke Niwa.

Source/WebCore:

This patch implements automatic DOM transactions in UndoManager
by recording changes in tree structure, attributes, and character data
of nodes under undo scope host.

Tests: editing/undomanager/automatic-transaction-attribute.html

editing/undomanager/automatic-transaction-data.html
editing/undomanager/automatic-transaction-node.html

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • WebCore.gypi:
  • WebCore.vcproj/WebCore.vcproj:
  • WebCore.xcodeproj/project.pbxproj:
  • bindings/js/DOMTransaction.h:

(WebCore::DOMTransaction::addTransactionStep):
(DOMTransaction):

  • bindings/v8/DOMTransaction.cpp:

(DOMTransactionScope):
(WebCore::DOMTransactionScope::DOMTransactionScope):
(WebCore::DOMTransactionScope::~DOMTransactionScope):
(WebCore):
(WebCore::DOMTransaction::apply):
(WebCore::DOMTransaction::unapply):
(WebCore::DOMTransaction::reapply):

  • bindings/v8/DOMTransaction.h:

(WebCore::DOMTransaction::addTransactionStep):
(DOMTransaction):

  • css/PropertySetCSSStyleDeclaration.cpp:

(WebCore::PropertySetCSSStyleDeclaration::setCssText):
(WebCore::PropertySetCSSStyleDeclaration::setProperty):
(WebCore::PropertySetCSSStyleDeclaration::removeProperty):
(WebCore::PropertySetCSSStyleDeclaration::setPropertyInternal):

  • dom/CharacterData.cpp:

(WebCore::CharacterData::setDataAndUpdate):

  • dom/ContainerNode.cpp:

(WebCore::willRemoveChild):
(WebCore::willRemoveChildren):
(WebCore::updateTreeAfterInsertion):

  • dom/Element.cpp:

(WebCore::Element::willModifyAttribute):

  • editing/DOMTransactionStep.cpp: Added.

(WebCore):
(WebCore::NodeInsertingDOMTransactionStep::NodeInsertingDOMTransactionStep):
(WebCore::NodeInsertingDOMTransactionStep::create):
(WebCore::NodeInsertingDOMTransactionStep::unapply):
(WebCore::NodeInsertingDOMTransactionStep::reapply):
(WebCore::NodeRemovingDOMTransactionStep::NodeRemovingDOMTransactionStep):
(WebCore::NodeRemovingDOMTransactionStep::create):
(WebCore::NodeRemovingDOMTransactionStep::unapply):
(WebCore::NodeRemovingDOMTransactionStep::reapply):
(WebCore::DataReplacingDOMTransactionStep::DataReplacingDOMTransactionStep):
(WebCore::DataReplacingDOMTransactionStep::create):
(WebCore::DataReplacingDOMTransactionStep::unapply):
(WebCore::DataReplacingDOMTransactionStep::reapply):
(WebCore::AttrChangingDOMTransactionStep::AttrChangingDOMTransactionStep):
(WebCore::AttrChangingDOMTransactionStep::create):
(WebCore::AttrChangingDOMTransactionStep::unapply):
(WebCore::AttrChangingDOMTransactionStep::reapply):

  • editing/DOMTransactionStep.h: Added.

(WebCore):
(DOMTransactionStep):
(WebCore::DOMTransactionStep::~DOMTransactionStep):
(NodeInsertingDOMTransactionStep):
(NodeRemovingDOMTransactionStep):
(DataReplacingDOMTransactionStep):
(AttrChangingDOMTransactionStep):

  • editing/UndoManager.cpp:

(WebCore):
(WebCore::UndoManager::isRecordingAutomaticTransaction):
(WebCore::UndoManager::addTransactionStep):

  • editing/UndoManager.h:

(WebCore):
(WebCore::UndoManager::setRecordingDOMTransaction):
(UndoManager):

LayoutTests:

  • editing/undomanager/automatic-transaction-attribute-expected.txt: Added.
  • editing/undomanager/automatic-transaction-attribute.html: Added.
  • editing/undomanager/automatic-transaction-data-expected.txt: Added.
  • editing/undomanager/automatic-transaction-data.html: Added.
  • editing/undomanager/automatic-transaction-node-expected.txt: Added.
  • editing/undomanager/automatic-transaction-node.html: Added.
Location:
trunk
Files:
8 added
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r126257 r126258  
     12012-08-21  Sukolsak Sakshuwong  <sukolsak@google.com>
     2
     3        Implement UndoManager's automatic DOM transactions
     4        https://bugs.webkit.org/show_bug.cgi?id=91812
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        * editing/undomanager/automatic-transaction-attribute-expected.txt: Added.
     9        * editing/undomanager/automatic-transaction-attribute.html: Added.
     10        * editing/undomanager/automatic-transaction-data-expected.txt: Added.
     11        * editing/undomanager/automatic-transaction-data.html: Added.
     12        * editing/undomanager/automatic-transaction-node-expected.txt: Added.
     13        * editing/undomanager/automatic-transaction-node.html: Added.
     14
    1152012-08-21  Shezan Baig  <sbaig1@bloomberg.net>
    216
  • trunk/Source/WebCore/CMakeLists.txt

    r126238 r126258  
    12191219    editing/CompositeEditCommand.cpp
    12201220    editing/CreateLinkCommand.cpp
     1221    editing/DOMTransactionStep.cpp
    12211222    editing/DeleteButton.cpp
    12221223    editing/DeleteButtonController.cpp
  • trunk/Source/WebCore/ChangeLog

    r126257 r126258  
     12012-08-21  Sukolsak Sakshuwong  <sukolsak@google.com>
     2
     3        Implement UndoManager's automatic DOM transactions
     4        https://bugs.webkit.org/show_bug.cgi?id=91812
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        This patch implements automatic DOM transactions in UndoManager
     9        by recording changes in tree structure, attributes, and character data
     10        of nodes under undo scope host.
     11
     12        Tests: editing/undomanager/automatic-transaction-attribute.html
     13               editing/undomanager/automatic-transaction-data.html
     14               editing/undomanager/automatic-transaction-node.html
     15
     16        * CMakeLists.txt:
     17        * GNUmakefile.list.am:
     18        * WebCore.gypi:
     19        * WebCore.vcproj/WebCore.vcproj:
     20        * WebCore.xcodeproj/project.pbxproj:
     21        * bindings/js/DOMTransaction.h:
     22        (WebCore::DOMTransaction::addTransactionStep):
     23        (DOMTransaction):
     24        * bindings/v8/DOMTransaction.cpp:
     25        (DOMTransactionScope):
     26        (WebCore::DOMTransactionScope::DOMTransactionScope):
     27        (WebCore::DOMTransactionScope::~DOMTransactionScope):
     28        (WebCore):
     29        (WebCore::DOMTransaction::apply):
     30        (WebCore::DOMTransaction::unapply):
     31        (WebCore::DOMTransaction::reapply):
     32        * bindings/v8/DOMTransaction.h:
     33        (WebCore::DOMTransaction::addTransactionStep):
     34        (DOMTransaction):
     35        * css/PropertySetCSSStyleDeclaration.cpp:
     36        (WebCore::PropertySetCSSStyleDeclaration::setCssText):
     37        (WebCore::PropertySetCSSStyleDeclaration::setProperty):
     38        (WebCore::PropertySetCSSStyleDeclaration::removeProperty):
     39        (WebCore::PropertySetCSSStyleDeclaration::setPropertyInternal):
     40        * dom/CharacterData.cpp:
     41        (WebCore::CharacterData::setDataAndUpdate):
     42        * dom/ContainerNode.cpp:
     43        (WebCore::willRemoveChild):
     44        (WebCore::willRemoveChildren):
     45        (WebCore::updateTreeAfterInsertion):
     46        * dom/Element.cpp:
     47        (WebCore::Element::willModifyAttribute):
     48        * editing/DOMTransactionStep.cpp: Added.
     49        (WebCore):
     50        (WebCore::NodeInsertingDOMTransactionStep::NodeInsertingDOMTransactionStep):
     51        (WebCore::NodeInsertingDOMTransactionStep::create):
     52        (WebCore::NodeInsertingDOMTransactionStep::unapply):
     53        (WebCore::NodeInsertingDOMTransactionStep::reapply):
     54        (WebCore::NodeRemovingDOMTransactionStep::NodeRemovingDOMTransactionStep):
     55        (WebCore::NodeRemovingDOMTransactionStep::create):
     56        (WebCore::NodeRemovingDOMTransactionStep::unapply):
     57        (WebCore::NodeRemovingDOMTransactionStep::reapply):
     58        (WebCore::DataReplacingDOMTransactionStep::DataReplacingDOMTransactionStep):
     59        (WebCore::DataReplacingDOMTransactionStep::create):
     60        (WebCore::DataReplacingDOMTransactionStep::unapply):
     61        (WebCore::DataReplacingDOMTransactionStep::reapply):
     62        (WebCore::AttrChangingDOMTransactionStep::AttrChangingDOMTransactionStep):
     63        (WebCore::AttrChangingDOMTransactionStep::create):
     64        (WebCore::AttrChangingDOMTransactionStep::unapply):
     65        (WebCore::AttrChangingDOMTransactionStep::reapply):
     66        * editing/DOMTransactionStep.h: Added.
     67        (WebCore):
     68        (DOMTransactionStep):
     69        (WebCore::DOMTransactionStep::~DOMTransactionStep):
     70        (NodeInsertingDOMTransactionStep):
     71        (NodeRemovingDOMTransactionStep):
     72        (DataReplacingDOMTransactionStep):
     73        (AttrChangingDOMTransactionStep):
     74        * editing/UndoManager.cpp:
     75        (WebCore):
     76        (WebCore::UndoManager::isRecordingAutomaticTransaction):
     77        (WebCore::UndoManager::addTransactionStep):
     78        * editing/UndoManager.h:
     79        (WebCore):
     80        (WebCore::UndoManager::setRecordingDOMTransaction):
     81        (UndoManager):
     82
    1832012-08-21  Shezan Baig  <sbaig1@bloomberg.net>
    284
  • trunk/Source/WebCore/GNUmakefile.list.am

    r126238 r126258  
    29392939        Source/WebCore/editing/DictationCommand.cpp \
    29402940        Source/WebCore/editing/DictationCommand.h \
     2941        Source/WebCore/editing/DOMTransactionStep.cpp \
     2942        Source/WebCore/editing/DOMTransactionStep.h \
    29412943        Source/WebCore/editing/EditAction.h \
    29422944        Source/WebCore/editing/EditCommand.cpp \
  • trunk/Source/WebCore/WebCore.gypi

    r126238 r126258  
    26452645            'editing/CreateLinkCommand.cpp',
    26462646            'editing/CreateLinkCommand.h',
     2647            'editing/DOMTransactionStep.cpp',
     2648            'editing/DOMTransactionStep.h',
    26472649            'editing/DeleteButton.cpp',
    26482650            'editing/DeleteButton.h',
  • trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj

    r126238 r126258  
    5600056000                        </File>
    5600156001                        <File
     56002                                RelativePath="..\editing\DOMTransactionStep.cpp"
     56003                                >
     56004                                <FileConfiguration
     56005                                        Name="Debug|Win32"
     56006                                        ExcludedFromBuild="true"
     56007                                        >
     56008                                        <Tool
     56009                                                Name="VCCLCompilerTool"
     56010                                        />
     56011                                </FileConfiguration>
     56012                                <FileConfiguration
     56013                                        Name="Release|Win32"
     56014                                        ExcludedFromBuild="true"
     56015                                        >
     56016                                        <Tool
     56017                                                Name="VCCLCompilerTool"
     56018                                        />
     56019                                </FileConfiguration>
     56020                                <FileConfiguration
     56021                                        Name="Debug_Cairo_CFLite|Win32"
     56022                                        ExcludedFromBuild="true"
     56023                                        >
     56024                                        <Tool
     56025                                                Name="VCCLCompilerTool"
     56026                                        />
     56027                                </FileConfiguration>
     56028                                <FileConfiguration
     56029                                        Name="Release_Cairo_CFLite|Win32"
     56030                                        ExcludedFromBuild="true"
     56031                                        >
     56032                                        <Tool
     56033                                                Name="VCCLCompilerTool"
     56034                                        />
     56035                                </FileConfiguration>
     56036                                <FileConfiguration
     56037                                        Name="Debug_All|Win32"
     56038                                        ExcludedFromBuild="true"
     56039                                        >
     56040                                        <Tool
     56041                                                Name="VCCLCompilerTool"
     56042                                        />
     56043                                </FileConfiguration>
     56044                                <FileConfiguration
     56045                                        Name="Production|Win32"
     56046                                        ExcludedFromBuild="true"
     56047                                        >
     56048                                        <Tool
     56049                                                Name="VCCLCompilerTool"
     56050                                        />
     56051                                </FileConfiguration>
     56052                        </File>
     56053                        <File
     56054                                RelativePath="..\editing\DOMTransactionStep.h"
     56055                                >
     56056                        </File>
     56057                        <File
    5600256058                                RelativePath="..\editing\EditAction.h"
    5600356059                                >
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r126238 r126258  
    19691969                7BB35AEB15CCDDF400F2A643 /* DOMTransaction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BB35AE915CCDDF400F2A643 /* DOMTransaction.cpp */; };
    19701970                7BB35AEC15CCDDF400F2A643 /* DOMTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB35AEA15CCDDF400F2A643 /* DOMTransaction.h */; };
     1971                7BD117EB15B8DB0100C974A3 /* DOMTransactionStep.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7BD117E915B8DB0100C974A3 /* DOMTransactionStep.cpp */; };
     1972                7BD117EC15B8DB0100C974A3 /* DOMTransactionStep.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BD117EA15B8DB0100C974A3 /* DOMTransactionStep.h */; };
    19711973                7C522D4B15B477E8009B7C95 /* InspectorOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C522D4915B477E8009B7C95 /* InspectorOverlay.cpp */; };
    19721974                7E33CD01127F340D00BE8F17 /* PurgePriority.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E33CD00127F340D00BE8F17 /* PurgePriority.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    91469148                7BB35AE915CCDDF400F2A643 /* DOMTransaction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DOMTransaction.cpp; sourceTree = "<group>"; };
    91479149                7BB35AEA15CCDDF400F2A643 /* DOMTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMTransaction.h; sourceTree = "<group>"; };
     9150                7BD117E915B8DB0100C974A3 /* DOMTransactionStep.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DOMTransactionStep.cpp; sourceTree = "<group>"; };
     9151                7BD117EA15B8DB0100C974A3 /* DOMTransactionStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMTransactionStep.h; sourceTree = "<group>"; };
    91489152                7C522D4915B477E8009B7C95 /* InspectorOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorOverlay.cpp; sourceTree = "<group>"; };
    91499153                7C522D4A15B478B2009B7C95 /* InspectorOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorOverlay.h; sourceTree = "<group>"; };
     
    1710517109                                CECADFC5153778FF00E37068 /* DictationCommand.h */,
    1710617110                                7B8C1FE615CCE3C2004B35DC /* DOMTransaction.idl */,
     17111                                7BD117E915B8DB0100C974A3 /* DOMTransactionStep.cpp */,
     17112                                7BD117EA15B8DB0100C974A3 /* DOMTransactionStep.h */,
    1710717113                                93309D93099E64910056E581 /* EditAction.h */,
    1710817114                                93309D94099E64910056E581 /* EditCommand.cpp */,
     
    2313023136                                76FC2B0C12370DA0006A991A /* DOMTokenList.h in Headers */,
    2313123137                                7BB35AEC15CCDDF400F2A643 /* DOMTransaction.h in Headers */,
     23138                                7BD117EC15B8DB0100C974A3 /* DOMTransactionStep.h in Headers */,
    2313223139                                BC1A37BE097C715F0019F3D8 /* DOMTraversal.h in Headers */,
    2313323140                                85526CD20AB0B7D9000302EA /* DOMTreeWalker.h in Headers */,
     
    2640126408                                76FC2B0B12370DA0006A991A /* DOMTokenList.cpp in Sources */,
    2640226409                                7BB35AEB15CCDDF400F2A643 /* DOMTransaction.cpp in Sources */,
     26410                                7BD117EB15B8DB0100C974A3 /* DOMTransactionStep.cpp in Sources */,
    2640326411                                85526CD30AB0B7DA000302EA /* DOMTreeWalker.mm in Sources */,
    2640426412                                85C7F4920AAF79DC004014DD /* DOMUIEvent.mm in Sources */,
  • trunk/Source/WebCore/bindings/js/DOMTransaction.h

    r125865 r126258  
    2828#if ENABLE(UNDO_MANAGER)
    2929
     30#include "DOMTransactionStep.h"
    3031#include "UndoStep.h"
    3132#include <wtf/RefPtr.h>
     
    4950    void setUndoManager(UndoManager* undoManager) { m_undoManager = undoManager; }
    5051
     52    void addTransactionStep(PassRefPtr<DOMTransactionStep> step) { m_transactionSteps.append(step); }
     53
    5154private:
    5255    DOMTransaction();
    5356
    5457    UndoManager* m_undoManager;
     58    Vector<RefPtr<DOMTransactionStep> > m_transactionSteps;
    5559};
    5660
  • trunk/Source/WebCore/bindings/v8/DOMTransaction.cpp

    r126245 r126258  
    3636namespace WebCore {
    3737
     38class DOMTransactionScope {
     39public:
     40    DOMTransactionScope(DOMTransaction* transaction)
     41    {
     42        UndoManager::setRecordingDOMTransaction(transaction);
     43    }
     44   
     45    ~DOMTransactionScope()
     46    {
     47        UndoManager::setRecordingDOMTransaction(0);
     48    }
     49};
     50
    3851DOMTransaction::DOMTransaction(const WorldContextHandle& worldContext)
    3952    : m_worldContext(worldContext)
     
    5265    if (!m_isAutomatic)
    5366        callFunction("execute");
     67    else {
     68        DOMTransactionScope scope(this);
     69        callFunction("executeAutomatic");
     70    }
    5471}
    5572
     
    5875    if (!m_isAutomatic)
    5976        callFunction("undo");
     77    else {
     78        for (size_t i = m_transactionSteps.size(); i > 0; --i)
     79            m_transactionSteps[i - 1]->unapply();
     80    }
    6081
    6182    if (m_undoManager)
     
    6788    if (!m_isAutomatic)
    6889        callFunction("redo");
     90    else {
     91        for (size_t i = 0; i < m_transactionSteps.size(); ++i)
     92            m_transactionSteps[i]->reapply();
     93    }
    6994
    7095    if (m_undoManager)
  • trunk/Source/WebCore/bindings/v8/DOMTransaction.h

    r125865 r126258  
    2828#if ENABLE(UNDO_MANAGER)
    2929
     30#include "DOMTransactionStep.h"
    3031#include "UndoStep.h"
    3132#include "WorldContextHandle.h"
     
    5051    void setUndoManager(UndoManager* undoManager) { m_undoManager = undoManager; }
    5152
     53    void addTransactionStep(PassRefPtr<DOMTransactionStep> step) { m_transactionSteps.append(step); }
     54
    5255private:
    5356    DOMTransaction(const WorldContextHandle&);
     
    5861    UndoManager* m_undoManager;
    5962    bool m_isAutomatic;
     63    Vector<RefPtr<DOMTransactionStep> > m_transactionSteps;
    6064};
    6165
  • trunk/Source/WebCore/css/PropertySetCSSStyleDeclaration.cpp

    r126118 r126258  
    3232#include "StylePropertySet.h"
    3333#include "StyledElement.h"
     34#include "UndoManager.h"
    3435
    3536using namespace std;
     
    5455        s_currentDecl = decl;
    5556
    56 #if ENABLE(MUTATION_OBSERVERS)
     57#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    5758        if (!s_currentDecl->parentElement())
    5859            return;
     60
     61        bool shouldReadOldValue = false;
     62
     63#if ENABLE(MUTATION_OBSERVERS)
    5964        m_mutationRecipients = MutationObserverInterestGroup::createForAttributesMutation(s_currentDecl->parentElement(), HTMLNames::styleAttr);
    60         if (!m_mutationRecipients)
    61             return;
    62 
    63         AtomicString oldValue = m_mutationRecipients->isOldValueRequested() ? s_currentDecl->parentElement()->getAttribute(HTMLNames::styleAttr) : nullAtom;
    64         m_mutation = MutationRecord::createAttributes(s_currentDecl->parentElement(), HTMLNames::styleAttr, oldValue);
     65        if (m_mutationRecipients && m_mutationRecipients->isOldValueRequested())
     66            shouldReadOldValue = true;
     67#endif
     68#if ENABLE(UNDO_MANAGER)
     69        m_isRecordingAutomaticTransaction = UndoManager::isRecordingAutomaticTransaction(s_currentDecl->parentElement());
     70        if (m_isRecordingAutomaticTransaction)
     71            shouldReadOldValue = true;
     72#endif
     73
     74        AtomicString oldValue;
     75        if (shouldReadOldValue)
     76            oldValue = s_currentDecl->parentElement()->getAttribute(HTMLNames::styleAttr);
     77
     78#if ENABLE(MUTATION_OBSERVERS)
     79        if (m_mutationRecipients) {
     80            AtomicString requestedOldValue = m_mutationRecipients->isOldValueRequested() ? oldValue : nullAtom;
     81            m_mutation = MutationRecord::createAttributes(s_currentDecl->parentElement(), HTMLNames::styleAttr, requestedOldValue);
     82        }
     83#endif
     84#if ENABLE(UNDO_MANAGER)
     85        if (m_isRecordingAutomaticTransaction)
     86            m_oldValue = oldValue;
     87#endif
     88
    6589#endif
    6690    }
     
    7599        if (m_mutation && s_shouldDeliver)
    76100            m_mutationRecipients->enqueueMutationRecord(m_mutation);
     101#endif
     102#if ENABLE(UNDO_MANAGER)
     103        if (m_isRecordingAutomaticTransaction && s_shouldDeliver) {
     104            UndoManager::addTransactionStep(AttrChangingDOMTransactionStep::create(
     105                s_currentDecl->parentElement(), HTMLNames::styleAttr, m_oldValue, s_currentDecl->parentElement()->getAttribute(HTMLNames::styleAttr)));
     106        }
     107#endif
     108#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    77109        s_shouldDeliver = false;
    78110#endif
     
    89121    }
    90122
    91 #if ENABLE(MUTATION_OBSERVERS)
     123#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    92124    void enqueueMutationRecord()
    93125    {
     
    105137    static PropertySetCSSStyleDeclaration* s_currentDecl;
    106138    static bool s_shouldNotifyInspector;
     139#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
     140    static bool s_shouldDeliver;
     141#endif
     142
    107143#if ENABLE(MUTATION_OBSERVERS)
    108     static bool s_shouldDeliver;
    109 
    110144    OwnPtr<MutationObserverInterestGroup> m_mutationRecipients;
    111145    RefPtr<MutationRecord> m_mutation;
     146#endif
     147#if ENABLE(UNDO_MANAGER)
     148    bool m_isRecordingAutomaticTransaction;
     149    AtomicString m_oldValue;
    112150#endif
    113151};
     
    116154PropertySetCSSStyleDeclaration* StyleAttributeMutationScope::s_currentDecl = 0;
    117155bool StyleAttributeMutationScope::s_shouldNotifyInspector = false;
    118 #if ENABLE(MUTATION_OBSERVERS)
     156#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    119157bool StyleAttributeMutationScope::s_shouldDeliver = false;
    120158#endif
     
    159197void PropertySetCSSStyleDeclaration::setCssText(const String& text, ExceptionCode& ec)
    160198{
    161 #if ENABLE(MUTATION_OBSERVERS)
     199#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    162200    StyleAttributeMutationScope mutationScope(this);
    163201#endif
     
    170208    didMutate(PropertyChanged);
    171209
    172 #if ENABLE(MUTATION_OBSERVERS)
     210#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    173211    mutationScope.enqueueMutationRecord();   
    174212#endif
     
    220258void PropertySetCSSStyleDeclaration::setProperty(const String& propertyName, const String& value, const String& priority, ExceptionCode& ec)
    221259{
    222 #if ENABLE(MUTATION_OBSERVERS)
     260#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    223261    StyleAttributeMutationScope mutationScope(this);
    224262#endif
     
    239277        // CSS DOM requires raising SYNTAX_ERR of parsing failed, but this is too dangerous for compatibility,
    240278        // see <http://bugs.webkit.org/show_bug.cgi?id=7296>.
    241 #if ENABLE(MUTATION_OBSERVERS)
     279#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    242280        mutationScope.enqueueMutationRecord();
    243281#endif
     
    247285String PropertySetCSSStyleDeclaration::removeProperty(const String& propertyName, ExceptionCode& ec)
    248286{
    249 #if ENABLE(MUTATION_OBSERVERS)
     287#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    250288    StyleAttributeMutationScope mutationScope(this);
    251289#endif
     
    263301
    264302    if (changed) {
    265 #if ENABLE(MUTATION_OBSERVERS)
     303#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    266304        mutationScope.enqueueMutationRecord();
    267305#endif
     
    282320void PropertySetCSSStyleDeclaration::setPropertyInternal(CSSPropertyID propertyID, const String& value, bool important, ExceptionCode& ec)
    283321{
    284 #if ENABLE(MUTATION_OBSERVERS)
     322#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    285323    StyleAttributeMutationScope mutationScope(this);
    286324#endif
     
    293331
    294332    if (changed) {
    295 #if ENABLE(MUTATION_OBSERVERS)
     333#if ENABLE(MUTATION_OBSERVERS) || ENABLE(UNDO_MANAGER)
    296334        mutationScope.enqueueMutationRecord();
    297335#endif
  • trunk/Source/WebCore/dom/CharacterData.cpp

    r126154 r126258  
    3434#include "RenderText.h"
    3535#include "TextBreakIterator.h"
     36#include "UndoManager.h"
    3637
    3738using namespace std;
     
    184185void CharacterData::setDataAndUpdate(const String& newData, unsigned offsetOfReplacedData, unsigned oldLength, unsigned newLength)
    185186{
     187#if ENABLE(UNDO_MANAGER)
     188    if (UndoManager::isRecordingAutomaticTransaction(this)) {
     189        const String& replacingData = newData.substring(offsetOfReplacedData, newLength);
     190        const String& replacedData = m_data.substring(offsetOfReplacedData, oldLength);
     191        UndoManager::addTransactionStep(DataReplacingDOMTransactionStep::create(this, offsetOfReplacedData, oldLength, replacingData, replacedData));
     192    }
     193#endif
    186194    String oldData = m_data;
    187195    m_data = newData;
  • trunk/Source/WebCore/dom/ContainerNode.cpp

    r125237 r126258  
    4141#include "RenderTheme.h"
    4242#include "RootInlineBox.h"
     43#include "UndoManager.h"
    4344#include <wtf/CurrentTime.h>
    4445#include <wtf/Vector.h>
     
    328329    child->notifyMutationObserversNodeWillDetach();
    329330#endif
     331#if ENABLE(UNDO_MANAGER)
     332    if (UndoManager::isRecordingAutomaticTransaction(child->parentNode()))
     333        UndoManager::addTransactionStep(NodeRemovingDOMTransactionStep::create(child->parentNode(), child));
     334#endif
    330335
    331336    dispatchChildRemovalEvents(child);
     
    351356        mutation.willRemoveChild(child);
    352357        child->notifyMutationObserversNodeWillDetach();
     358#endif
     359#if ENABLE(UNDO_MANAGER)
     360        if (UndoManager::isRecordingAutomaticTransaction(container))
     361            UndoManager::addTransactionStep(NodeRemovingDOMTransactionStep::create(container, child));
    353362#endif
    354363
     
    980989#endif
    981990
     991#if ENABLE(UNDO_MANAGER)
     992    if (UndoManager::isRecordingAutomaticTransaction(parent))
     993        UndoManager::addTransactionStep(NodeInsertingDOMTransactionStep::create(parent, child));
     994#endif
     995
    982996    parent->childrenChanged(false, child->previousSibling(), child->nextSibling(), 1);
    983997
  • trunk/Source/WebCore/dom/Element.cpp

    r126245 r126258  
    7171#include "Text.h"
    7272#include "TextIterator.h"
     73#include "UndoManager.h"
    7374#include "VoidCallback.h"
    7475#include "WebKitAnimationList.h"
     
    20492050#endif
    20502051
     2052#if ENABLE(UNDO_MANAGER)
     2053    if (UndoManager::isRecordingAutomaticTransaction(this))
     2054        UndoManager::addTransactionStep(AttrChangingDOMTransactionStep::create(this, name, oldValue, newValue));
     2055#endif
     2056
    20512057#if ENABLE(INSPECTOR)
    20522058    InspectorInstrumentation::willModifyDOMAttr(document(), this, oldValue, newValue);
  • trunk/Source/WebCore/editing/UndoManager.cpp

    r126245 r126258  
    3535#include "UndoManager.h"
    3636
    37 #include "DOMTransaction.h"
    3837#include "ExceptionCode.h"
    3938
    4039namespace WebCore {
     40
     41DOMTransaction* UndoManager::s_recordingDOMTransaction = 0;
    4142
    4243PassRefPtr<UndoManager> UndoManager::create(Document* document)
     
    200201}
    201202
     203bool UndoManager::isRecordingAutomaticTransaction(Node* node)
     204{
     205    // We need to check that transaction still has its undomanager because
     206    // transaction can disconnect its undomanager, which will clear the undo/redo stacks.
     207    if (!s_recordingDOMTransaction || !s_recordingDOMTransaction->undoManager())
     208        return false;
     209    Document* document = s_recordingDOMTransaction->undoManager()->document();
     210    return document && node->document() == document;
     211}
     212
     213void UndoManager::addTransactionStep(PassRefPtr<DOMTransactionStep> step)
     214{
     215    ASSERT(s_recordingDOMTransaction);
     216    s_recordingDOMTransaction->addTransactionStep(step);
     217}
     218
    202219}
    203220
  • trunk/Source/WebCore/editing/UndoManager.h

    r126245 r126258  
    3535
    3636#include "ActiveDOMObject.h"
     37#include "DOMTransaction.h"
    3738#include "Document.h"
    3839#include "ExceptionCodePlaceholder.h"
     
    4647
    4748namespace WebCore {
    48 
    49 class DOMTransaction;
    5049
    5150typedef Vector<RefPtr<UndoStep> > UndoManagerEntry;
     
    7978    Node* ownerNode() const { return m_document; }
    8079
     80    static void setRecordingDOMTransaction(DOMTransaction* transaction) { s_recordingDOMTransaction = transaction; }
     81    static bool isRecordingAutomaticTransaction(Node*);
     82    static void addTransactionStep(PassRefPtr<DOMTransactionStep>);
     83
    8184private:
    8285    explicit UndoManager(Document*);
     
    8790    bool m_isInProgress;
    8891    OwnPtr<UndoManagerEntry> m_inProgressEntry;
     92
     93    static DOMTransaction* s_recordingDOMTransaction;
    8994};
    9095   
Note: See TracChangeset for help on using the changeset viewer.