Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/editor/libeditor/DeleteNodeTransaction.cpp
Line
Count
Source (jump to first uncovered line)
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
#include "DeleteNodeTransaction.h"
7
#include "mozilla/EditorBase.h"
8
#include "mozilla/SelectionState.h" // RangeUpdater
9
#include "nsDebug.h"
10
#include "nsError.h"
11
#include "nsAString.h"
12
13
namespace mozilla {
14
15
// static
16
already_AddRefed<DeleteNodeTransaction>
17
DeleteNodeTransaction::MaybeCreate(EditorBase& aEditorBase,
18
                              nsINode& aNodeToDelete)
19
0
{
20
0
  RefPtr<DeleteNodeTransaction> transaction =
21
0
    new DeleteNodeTransaction(aEditorBase, aNodeToDelete);
22
0
  if (NS_WARN_IF(!transaction->CanDoIt())) {
23
0
    return nullptr;
24
0
  }
25
0
  return transaction.forget();
26
0
}
27
28
DeleteNodeTransaction::DeleteNodeTransaction(EditorBase& aEditorBase,
29
                                             nsINode& aNodeToDelete)
30
  : mEditorBase(&aEditorBase)
31
  , mNodeToDelete(&aNodeToDelete)
32
  , mParentNode(aNodeToDelete.GetParentNode())
33
0
{
34
0
}
35
36
DeleteNodeTransaction::~DeleteNodeTransaction()
37
0
{
38
0
}
39
40
NS_IMPL_CYCLE_COLLECTION_INHERITED(DeleteNodeTransaction, EditTransactionBase,
41
                                   mEditorBase,
42
                                   mNodeToDelete,
43
                                   mParentNode,
44
                                   mRefNode)
45
46
NS_IMPL_ADDREF_INHERITED(DeleteNodeTransaction, EditTransactionBase)
47
NS_IMPL_RELEASE_INHERITED(DeleteNodeTransaction, EditTransactionBase)
48
0
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DeleteNodeTransaction)
49
0
NS_INTERFACE_MAP_END_INHERITING(EditTransactionBase)
50
51
bool
52
DeleteNodeTransaction::CanDoIt() const
53
0
{
54
0
  if (NS_WARN_IF(!mNodeToDelete) || NS_WARN_IF(!mEditorBase) ||
55
0
      !mParentNode || !mEditorBase->IsModifiableNode(*mParentNode)) {
56
0
    return false;
57
0
  }
58
0
  return true;
59
0
}
60
61
NS_IMETHODIMP
62
DeleteNodeTransaction::DoTransaction()
63
0
{
64
0
  if (NS_WARN_IF(!CanDoIt())) {
65
0
    return NS_OK;
66
0
  }
67
0
68
0
  // Remember which child mNodeToDelete was (by remembering which child was
69
0
  // next).  Note that mRefNode can be nullptr.
70
0
  mRefNode = mNodeToDelete->GetNextSibling();
71
0
72
0
  // give range updater a chance.  SelAdjDeleteNode() needs to be called
73
0
  // *before* we do the action, unlike some of the other RangeItem update
74
0
  // methods.
75
0
  mEditorBase->RangeUpdaterRef().SelAdjDeleteNode(mNodeToDelete);
76
0
77
0
  ErrorResult error;
78
0
  mParentNode->RemoveChild(*mNodeToDelete, error);
79
0
  return error.StealNSResult();
80
0
}
81
82
NS_IMETHODIMP
83
DeleteNodeTransaction::UndoTransaction()
84
0
{
85
0
  if (NS_WARN_IF(!CanDoIt())) {
86
0
    // This is a legal state, the transaction is a no-op.
87
0
    return NS_OK;
88
0
  }
89
0
  ErrorResult error;
90
0
  nsCOMPtr<nsIContent> refNode = mRefNode;
91
0
  mParentNode->InsertBefore(*mNodeToDelete, refNode, error);
92
0
  return error.StealNSResult();
93
0
}
94
95
NS_IMETHODIMP
96
DeleteNodeTransaction::RedoTransaction()
97
0
{
98
0
  if (NS_WARN_IF(!CanDoIt())) {
99
0
    // This is a legal state, the transaction is a no-op.
100
0
    return NS_OK;
101
0
  }
102
0
103
0
  mEditorBase->RangeUpdaterRef().SelAdjDeleteNode(mNodeToDelete);
104
0
105
0
  ErrorResult error;
106
0
  mParentNode->RemoveChild(*mNodeToDelete, error);
107
0
  return error.StealNSResult();
108
0
}
109
110
} // namespace mozilla