forked from mirrors/gecko-dev
Since the method is deferred we need to do extra guesswork for possible situtations where the name has changed because we don't have the privilege to calculate the name in-line when content is deleted. I tried to account for all cases as we have in our test coverage. I hope that if there are edge cases they are false positives, and we are firing extra name changes and not the opposite. Original Revision: https://phabricator.services.mozilla.com/D223877 Differential Revision: https://phabricator.services.mozilla.com/D225716
86 lines
2.2 KiB
C++
86 lines
2.2 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 mozilla_a11y_EventQueue_h_
|
|
#define mozilla_a11y_EventQueue_h_
|
|
|
|
#include "AccEvent.h"
|
|
#include "mozilla/Assertions.h"
|
|
|
|
namespace mozilla {
|
|
namespace a11y {
|
|
|
|
class DocAccessible;
|
|
|
|
/**
|
|
* Used to organize and coalesce pending events.
|
|
*/
|
|
class EventQueue {
|
|
protected:
|
|
explicit EventQueue(DocAccessible* aDocument) : mDocument(aDocument) {
|
|
MOZ_ASSERT(mDocument,
|
|
"There's no point creating an event queue for a null document");
|
|
}
|
|
|
|
/**
|
|
* Put an accessible event into the queue to process it later.
|
|
*/
|
|
bool PushEvent(AccEvent* aEvent);
|
|
|
|
bool PushNameOrDescriptionChangeToRelations(LocalAccessible* aAccessible,
|
|
RelationType aType);
|
|
|
|
/**
|
|
* Puts name and/or description change events into the queue, if needed.
|
|
*/
|
|
bool PushNameOrDescriptionChange(AccEvent* aOrigEvent);
|
|
|
|
/**
|
|
* Process events from the queue and fires events.
|
|
*/
|
|
void ProcessEventQueue();
|
|
|
|
private:
|
|
EventQueue(const EventQueue&) = delete;
|
|
EventQueue& operator=(const EventQueue&) = delete;
|
|
|
|
// Event queue processing
|
|
/**
|
|
* Coalesce redundant events from the queue.
|
|
*/
|
|
void CoalesceEvents();
|
|
|
|
/**
|
|
* Coalesce events from the same subtree.
|
|
*/
|
|
void CoalesceReorderEvents(AccEvent* aTailEvent);
|
|
|
|
/**
|
|
* Coalesce two selection change events within the same select control.
|
|
*/
|
|
void CoalesceSelChangeEvents(AccSelChangeEvent* aTailEvent,
|
|
AccSelChangeEvent* aThisEvent,
|
|
uint32_t aThisIndex);
|
|
|
|
protected:
|
|
/**
|
|
* The document accessible reference owning this queue.
|
|
*/
|
|
DocAccessible* mDocument;
|
|
|
|
/**
|
|
* Pending events array. Don't make this an AutoTArray; we use
|
|
* SwapElements() on it.
|
|
*/
|
|
nsTArray<RefPtr<AccEvent>> mEvents;
|
|
|
|
// Pending focus event.
|
|
RefPtr<AccEvent> mFocusEvent;
|
|
};
|
|
|
|
} // namespace a11y
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_a11y_EventQueue_h_
|