mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 10:18:41 +02:00 
			
		
		
		
	First, `EditorBase::CreateTransactionForDeleteSelection` returns an instance of `EditAggregateTransaction`. It's a base class of `PlaceholderTransaction` and `DeleteRangeTransaction` but it's also a concrete class. However, it's too generic. Therefore, this patch creates `DeleteMultipleRangesTransaction` which is a simple sub-class of it, and makes `EditAggregateTransaction` be an abstract class. Then, add `AddChild` methods to each concrete class to restrict the type of child transactions. Next, `DeleteRangeTransaction` contains only `DeleteNodeTransaction` and `DeleteTextTransaction`. Therefore, once they have a common base class, we can check the type easier. Therefore, this patch also adds `DeleteContentTransactionBase` and `EditorBase::CreateTransactionForCollapsedRange` becomes clearer what it returns. With these changes, `DeleteRangeTransaction` obviously contains only `DeleteContentTransactionBase`, `DeleteMultipleRangesTransaction` contains only `DeleteRangeTransaction`, `DeleteNodeTransaction` and `DeleteTextTransaction`. And they are guaranteed at build time (at least from outside the classes). *** fix Differential Revision: https://phabricator.services.mozilla.com/D169038
		
			
				
	
	
		
			99 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | 
						|
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
 | 
						|
#ifndef DeleteTextTransaction_h
 | 
						|
#define DeleteTextTransaction_h
 | 
						|
 | 
						|
#include "DeleteContentTransactionBase.h"
 | 
						|
 | 
						|
#include "EditorForwards.h"
 | 
						|
 | 
						|
#include "mozilla/dom/Text.h"
 | 
						|
 | 
						|
#include "nsCOMPtr.h"
 | 
						|
#include "nsCycleCollectionParticipant.h"
 | 
						|
#include "nsID.h"
 | 
						|
#include "nsString.h"
 | 
						|
#include "nscore.h"
 | 
						|
 | 
						|
namespace mozilla {
 | 
						|
 | 
						|
/**
 | 
						|
 * A transaction that removes text from a content node.
 | 
						|
 */
 | 
						|
class DeleteTextTransaction final : public DeleteContentTransactionBase {
 | 
						|
 protected:
 | 
						|
  DeleteTextTransaction(EditorBase& aEditorBase, dom::Text& aTextNode,
 | 
						|
                        uint32_t aOffset, uint32_t aLengthToDelete);
 | 
						|
 | 
						|
 public:
 | 
						|
  /**
 | 
						|
   * Creates a delete text transaction to remove given range.  This returns
 | 
						|
   * nullptr if it cannot modify the text node.
 | 
						|
   *
 | 
						|
   * @param aEditorBase         The provider of basic editing operations.
 | 
						|
   * @param aTextNode           The content node to remove text from.
 | 
						|
   * @param aOffset             The location in aElement to begin the deletion.
 | 
						|
   * @param aLenthToDelete      The length to delete.
 | 
						|
   */
 | 
						|
  static already_AddRefed<DeleteTextTransaction> MaybeCreate(
 | 
						|
      EditorBase& aEditorBase, dom::Text& aTextNode, uint32_t aOffset,
 | 
						|
      uint32_t aLengthToDelete);
 | 
						|
 | 
						|
  /**
 | 
						|
   * Creates a delete text transaction to remove a previous or next character.
 | 
						|
   * Those methods MAY return nullptr.
 | 
						|
   *
 | 
						|
   * @param aEditorBase         The provider of basic editing operations.
 | 
						|
   * @param aTextNode           The content node to remove text from.
 | 
						|
   * @param aOffset             The location in aElement to begin the deletion.
 | 
						|
   */
 | 
						|
  static already_AddRefed<DeleteTextTransaction>
 | 
						|
  MaybeCreateForPreviousCharacter(EditorBase& aEditorBase, dom::Text& aTextNode,
 | 
						|
                                  uint32_t aOffset);
 | 
						|
  static already_AddRefed<DeleteTextTransaction> MaybeCreateForNextCharacter(
 | 
						|
      EditorBase& aEditorBase, dom::Text& aTextNode, uint32_t aOffset);
 | 
						|
 | 
						|
  /**
 | 
						|
   * CanDoIt() returns true if there are enough members and can modify the
 | 
						|
   * text.  Otherwise, false.
 | 
						|
   */
 | 
						|
  bool CanDoIt() const;
 | 
						|
 | 
						|
  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(DeleteTextTransaction,
 | 
						|
                                           DeleteContentTransactionBase)
 | 
						|
  NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override;
 | 
						|
 | 
						|
  NS_DECL_EDITTRANSACTIONBASE
 | 
						|
  NS_DECL_EDITTRANSACTIONBASE_GETASMETHODS_OVERRIDE(DeleteTextTransaction)
 | 
						|
 | 
						|
  MOZ_CAN_RUN_SCRIPT NS_IMETHOD RedoTransaction() final;
 | 
						|
 | 
						|
  EditorDOMPoint SuggestPointToPutCaret() const final;
 | 
						|
 | 
						|
  dom::Text* GetText() const { return mTextNode; }
 | 
						|
  uint32_t Offset() const { return mOffset; }
 | 
						|
  uint32_t LengthToDelete() const { return mLengthToDelete; }
 | 
						|
 | 
						|
  friend std::ostream& operator<<(std::ostream& aStream,
 | 
						|
                                  const DeleteTextTransaction& aTransaction);
 | 
						|
 | 
						|
 protected:
 | 
						|
  // The CharacterData node to operate upon.
 | 
						|
  RefPtr<dom::Text> mTextNode;
 | 
						|
 | 
						|
  // The offset into mTextNode where the deletion is to take place.
 | 
						|
  uint32_t mOffset;
 | 
						|
 | 
						|
  // The length to delete.
 | 
						|
  uint32_t mLengthToDelete;
 | 
						|
 | 
						|
  // The text that was deleted.
 | 
						|
  nsString mDeletedText;
 | 
						|
};
 | 
						|
 | 
						|
}  // namespace mozilla
 | 
						|
 | 
						|
#endif  // #ifndef DeleteTextTransaction_h
 |