1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #ifndef mozilla_EditTransactionBase_h
7 #define mozilla_EditTransactionBase_h
8 
9 #include "nsCycleCollectionParticipant.h"
10 #include "nsISupportsImpl.h"
11 #include "nsITransaction.h"
12 #include "nscore.h"
13 
14 already_AddRefed<mozilla::EditTransactionBase>
GetAsEditTransactionBase()15 nsITransaction::GetAsEditTransactionBase() {
16   RefPtr<mozilla::EditTransactionBase> editTransactionBase;
17   return NS_SUCCEEDED(
18              GetAsEditTransactionBase(getter_AddRefs(editTransactionBase)))
19              ? editTransactionBase.forget()
20              : nullptr;
21 }
22 
23 namespace mozilla {
24 
25 class ChangeAttributeTransaction;
26 class ChangeStyleTransaction;
27 class CompositionTransaction;
28 class CreateElementTransaction;
29 class DeleteNodeTransaction;
30 class DeleteRangeTransaction;
31 class DeleteTextTransaction;
32 class EditAggregateTransaction;
33 class InsertNodeTransaction;
34 class InsertTextTransaction;
35 class JoinNodeTransaction;
36 class LogModule;
37 class PlaceholderTransaction;
38 class ReplaceTextTransaction;
39 class SplitNodeTransaction;
40 
41 #define NS_DECL_GETASTRANSACTION_BASE(aClass) \
42   virtual aClass* GetAs##aClass();            \
43   virtual const aClass* GetAs##aClass() const;
44 
45 /**
46  * Base class for all document editing transactions.
47  */
48 class EditTransactionBase : public nsITransaction {
49  public:
50   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
51   NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(EditTransactionBase, nsITransaction)
52 
53   MOZ_CAN_RUN_SCRIPT NS_IMETHOD RedoTransaction(void) override;
54   NS_IMETHOD GetIsTransient(bool* aIsTransient) override;
55   NS_IMETHOD Merge(nsITransaction* aTransaction, bool* aDidMerge) override;
GetAsEditTransactionBase(EditTransactionBase ** aEditTransactionBase)56   NS_IMETHOD GetAsEditTransactionBase(
57       EditTransactionBase** aEditTransactionBase) final {
58     MOZ_ASSERT(aEditTransactionBase);
59     MOZ_ASSERT(!*aEditTransactionBase);
60     *aEditTransactionBase = do_AddRef(this).take();
61     return NS_OK;
62   }
63 
64   NS_DECL_GETASTRANSACTION_BASE(ChangeAttributeTransaction)
65   NS_DECL_GETASTRANSACTION_BASE(ChangeStyleTransaction)
66   NS_DECL_GETASTRANSACTION_BASE(CompositionTransaction)
67   NS_DECL_GETASTRANSACTION_BASE(CreateElementTransaction)
68   NS_DECL_GETASTRANSACTION_BASE(DeleteNodeTransaction)
69   NS_DECL_GETASTRANSACTION_BASE(DeleteRangeTransaction)
70   NS_DECL_GETASTRANSACTION_BASE(DeleteTextTransaction)
71   NS_DECL_GETASTRANSACTION_BASE(EditAggregateTransaction)
72   NS_DECL_GETASTRANSACTION_BASE(InsertNodeTransaction)
73   NS_DECL_GETASTRANSACTION_BASE(InsertTextTransaction)
74   NS_DECL_GETASTRANSACTION_BASE(JoinNodeTransaction)
75   NS_DECL_GETASTRANSACTION_BASE(PlaceholderTransaction)
76   NS_DECL_GETASTRANSACTION_BASE(ReplaceTextTransaction)
77   NS_DECL_GETASTRANSACTION_BASE(SplitNodeTransaction)
78 
79  protected:
80   virtual ~EditTransactionBase() = default;
81 
82   static LogModule* GetLogModule();
83 };
84 
85 #undef NS_DECL_GETASTRANSACTION_BASE
86 
87 }  // namespace mozilla
88 
89 #define NS_DECL_EDITTRANSACTIONBASE                       \
90   MOZ_CAN_RUN_SCRIPT NS_IMETHOD DoTransaction() override; \
91   MOZ_CAN_RUN_SCRIPT NS_IMETHOD UndoTransaction() override;
92 
93 #define NS_DECL_EDITTRANSACTIONBASE_GETASMETHODS_OVERRIDE(aClass) \
94   aClass* GetAs##aClass() final { return this; }                  \
95   const aClass* GetAs##aClass() const final { return this; }
96 
97 #endif  // #ifndef mozilla_EditTransactionBase_h
98