Line data Source code
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_a11y_TextUpdater_h__
7 : #define mozilla_a11y_TextUpdater_h__
8 :
9 : #include "AccEvent.h"
10 : #include "HyperTextAccessible.h"
11 :
12 : namespace mozilla {
13 : namespace a11y {
14 :
15 : /**
16 : * Used to find a difference between old and new text and fire text change
17 : * events.
18 : */
19 : class TextUpdater
20 : {
21 : public:
22 : /**
23 : * Start text of the text leaf update.
24 : */
25 : static void Run(DocAccessible* aDocument, TextLeafAccessible* aTextLeaf,
26 : const nsAString& aNewText);
27 :
28 : private:
29 0 : TextUpdater(DocAccessible* aDocument, TextLeafAccessible* aTextLeaf) :
30 : mDocument(aDocument), mTextLeaf(aTextLeaf), mHyperText(nullptr),
31 0 : mTextOffset(-1) { }
32 :
33 0 : ~TextUpdater()
34 0 : { mDocument = nullptr; mTextLeaf = nullptr; mHyperText = nullptr; }
35 :
36 : /**
37 : * Update text of the text leaf accessible, fire text change and value change
38 : * (if applicable) events for its container hypertext accessible.
39 : */
40 : void DoUpdate(const nsAString& aNewText, const nsAString& aOldText,
41 : uint32_t aSkipStart);
42 :
43 : private:
44 : TextUpdater();
45 : TextUpdater(const TextUpdater&);
46 : TextUpdater& operator=(const TextUpdater&);
47 :
48 : /**
49 : * Fire text change events based on difference between strings.
50 : */
51 : void ComputeTextChangeEvents(const nsAString& aStr1,
52 : const nsAString& aStr2,
53 : uint32_t* aEntries,
54 : nsTArray<RefPtr<AccEvent> >& aEvents);
55 :
56 : /**
57 : * Helper to create text change events for inserted text.
58 : */
59 0 : inline void FireInsertEvent(const nsAString& aText, uint32_t aAddlOffset,
60 : nsTArray<RefPtr<AccEvent> >& aEvents)
61 : {
62 : RefPtr<AccEvent> event =
63 0 : new AccTextChangeEvent(mHyperText, mTextOffset + aAddlOffset,
64 0 : aText, true);
65 0 : aEvents.AppendElement(event);
66 0 : }
67 :
68 : /**
69 : * Helper to create text change events for removed text.
70 : */
71 0 : inline void FireDeleteEvent(const nsAString& aText, uint32_t aAddlOffset,
72 : nsTArray<RefPtr<AccEvent> >& aEvents)
73 : {
74 : RefPtr<AccEvent> event =
75 0 : new AccTextChangeEvent(mHyperText, mTextOffset + aAddlOffset,
76 0 : aText, false);
77 0 : aEvents.AppendElement(event);
78 0 : }
79 :
80 : /**
81 : * The constant used to skip string difference calculation in case of long
82 : * strings.
83 : */
84 : const static uint32_t kMaxStrLen = 1 << 6;
85 :
86 : private:
87 : DocAccessible* mDocument;
88 : TextLeafAccessible* mTextLeaf;
89 : HyperTextAccessible* mHyperText;
90 : int32_t mTextOffset;
91 : };
92 :
93 : } // namespace a11y
94 : } // namespace mozilla
95 :
96 : #endif
|