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 FilteredContentIterator_h
7 #define FilteredContentIterator_h
8 
9 #include "nsComposeTxtSrvFilter.h"
10 #include "nsCOMPtr.h"
11 #include "nsCycleCollectionParticipant.h"
12 #include "nsISupportsImpl.h"
13 #include "nscore.h"
14 #include "mozilla/ContentIterator.h"
15 #include "mozilla/UniquePtr.h"
16 
17 class nsAtom;
18 class nsINode;
19 class nsRange;
20 
21 namespace mozilla {
22 
23 namespace dom {
24 class AbstractRange;
25 }
26 
27 class FilteredContentIterator final {
28  public:
29   NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(FilteredContentIterator)
30   NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(FilteredContentIterator)
31 
32   explicit FilteredContentIterator(UniquePtr<nsComposeTxtSrvFilter> aFilter);
33 
34   nsresult Init(nsINode* aRoot);
35   nsresult Init(const dom::AbstractRange* aAbstractRange);
36   nsresult Init(nsINode* aStartContainer, uint32_t aStartOffset,
37                 nsINode* aEndContainer, uint32_t aEndOffset);
38   nsresult Init(const RawRangeBoundary& aStartBoundary,
39                 const RawRangeBoundary& aEndBoundary);
40   void First();
41   void Last();
42   void Next();
43   void Prev();
44   nsINode* GetCurrentNode();
45   bool IsDone();
46   nsresult PositionAt(nsINode* aCurNode);
47 
48   /* Helpers */
DidSkip()49   bool DidSkip() { return mDidSkip; }
ClearDidSkip()50   void ClearDidSkip() { mDidSkip = false; }
51 
52  protected:
FilteredContentIterator()53   FilteredContentIterator()
54       : mDidSkip(false), mIsOutOfRange(false), mDirection{eDirNotSet} {}
55 
56   virtual ~FilteredContentIterator();
57 
58   /**
59    * Callers must guarantee that mRange isn't nullptr and it's positioned.
60    */
61   nsresult InitWithRange();
62 
63   // enum to give us the direction
64   typedef enum { eDirNotSet, eForward, eBackward } eDirectionType;
65   nsresult AdvanceNode(nsINode* aNode, nsINode*& aNewNode, eDirectionType aDir);
66   void CheckAdvNode(nsINode* aNode, bool& aDidSkip, eDirectionType aDir);
67   nsresult SwitchDirections(bool aChangeToForward);
68 
69   ContentIteratorBase* MOZ_NON_OWNING_REF mCurrentIterator;
70   PostContentIterator mPostIterator;
71   PreContentIterator mPreIterator;
72 
73   RefPtr<nsAtom> mBlockQuoteAtom;
74   RefPtr<nsAtom> mScriptAtom;
75   RefPtr<nsAtom> mTextAreaAtom;
76   RefPtr<nsAtom> mSelectAreaAtom;
77   RefPtr<nsAtom> mMapAtom;
78 
79   UniquePtr<nsComposeTxtSrvFilter> mFilter;
80   RefPtr<nsRange> mRange;
81   bool mDidSkip;
82   bool mIsOutOfRange;
83   eDirectionType mDirection;
84 };
85 
86 }  // namespace mozilla
87 
88 #endif  // #ifndef FilteredContentIterator_h
89