mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
bug 1213402 - separate value change events into text value changes and numeric value changes r=davidb
Arguably these are different things, and it will be easier to proxy events for atk this way because atk only wants the numeric value changes.
This commit is contained in:
parent
2917e844c7
commit
d77a67806c
@ -1245,6 +1245,7 @@ AccessibleWrap::HandleAccEvent(AccEvent* aEvent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case nsIAccessibleEvent::EVENT_VALUE_CHANGE:
|
case nsIAccessibleEvent::EVENT_VALUE_CHANGE:
|
||||||
|
case nsIAccessibleEvent::EVENT_TEXT_VALUE_CHANGE:
|
||||||
if (accessible->HasNumericValue()) {
|
if (accessible->HasNumericValue()) {
|
||||||
// Make sure this is a numeric value. Don't fire for string value changes
|
// Make sure this is a numeric value. Don't fire for string value changes
|
||||||
// (e.g. text editing) ATK values are always numeric.
|
// (e.g. text editing) ATK values are always numeric.
|
||||||
|
@ -385,6 +385,7 @@ static const char kEventTypeNames[][40] = {
|
|||||||
"hypertext links count changed", // EVENT_HYPERTEXT_NLINKS_CHANGED
|
"hypertext links count changed", // EVENT_HYPERTEXT_NLINKS_CHANGED
|
||||||
"object attribute changed", // EVENT_OBJECT_ATTRIBUTE_CHANGED
|
"object attribute changed", // EVENT_OBJECT_ATTRIBUTE_CHANGED
|
||||||
"virtual cursor changed" // EVENT_VIRTUALCURSOR_CHANGED
|
"virtual cursor changed" // EVENT_VIRTUALCURSOR_CHANGED
|
||||||
|
"text value change", // EVENT_TEXT_VALUE_CHANGE
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __nsIAccessibilityService_h__ */
|
#endif /* __nsIAccessibilityService_h__ */
|
||||||
|
@ -124,7 +124,7 @@ DocAccessible::MaybeNotifyOfValueChange(Accessible* aAccessible)
|
|||||||
{
|
{
|
||||||
a11y::role role = aAccessible->Role();
|
a11y::role role = aAccessible->Role();
|
||||||
if (role == roles::ENTRY || role == roles::COMBOBOX)
|
if (role == roles::ENTRY || role == roles::COMBOBOX)
|
||||||
FireDelayedEvent(nsIAccessibleEvent::EVENT_VALUE_CHANGE, aAccessible);
|
FireDelayedEvent(nsIAccessibleEvent::EVENT_TEXT_VALUE_CHANGE, aAccessible);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Accessible*
|
inline Accessible*
|
||||||
|
@ -1039,13 +1039,18 @@ DocAccessible::ARIAAttributeChanged(Accessible* aAccessible, nsIAtom* aAttribute
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fire value change event whenever aria-valuetext is changed, or
|
// Fire text value change event whenever aria-valuetext is changed.
|
||||||
// when aria-valuenow is changed and aria-valuetext is empty
|
if (aAttribute == nsGkAtoms::aria_valuetext) {
|
||||||
if (aAttribute == nsGkAtoms::aria_valuetext ||
|
FireDelayedEvent(nsIAccessibleEvent::EVENT_TEXT_VALUE_CHANGE, aAccessible);
|
||||||
(aAttribute == nsGkAtoms::aria_valuenow &&
|
return;
|
||||||
(!elm->HasAttr(kNameSpaceID_None, nsGkAtoms::aria_valuetext) ||
|
}
|
||||||
elm->AttrValueIs(kNameSpaceID_None, nsGkAtoms::aria_valuetext,
|
|
||||||
nsGkAtoms::_empty, eCaseMatters)))) {
|
// Fire numeric value change event when aria-valuenow is changed and
|
||||||
|
// aria-valuetext is empty
|
||||||
|
if (aAttribute == nsGkAtoms::aria_valuenow &&
|
||||||
|
(!elm->HasAttr(kNameSpaceID_None, nsGkAtoms::aria_valuetext) ||
|
||||||
|
elm->AttrValueIs(kNameSpaceID_None, nsGkAtoms::aria_valuetext,
|
||||||
|
nsGkAtoms::_empty, eCaseMatters))) {
|
||||||
FireDelayedEvent(nsIAccessibleEvent::EVENT_VALUE_CHANGE, aAccessible);
|
FireDelayedEvent(nsIAccessibleEvent::EVENT_VALUE_CHANGE, aAccessible);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -452,8 +452,10 @@ RootAccessible::ProcessDOMEvent(nsIDOMEvent* aDOMEvent)
|
|||||||
}
|
}
|
||||||
else if (accessible->NeedsDOMUIEvent() &&
|
else if (accessible->NeedsDOMUIEvent() &&
|
||||||
eventType.EqualsLiteral("ValueChange")) {
|
eventType.EqualsLiteral("ValueChange")) {
|
||||||
targetDocument->FireDelayedEvent(nsIAccessibleEvent::EVENT_VALUE_CHANGE,
|
uint32_t event = accessible->HasNumericValue()
|
||||||
accessible);
|
? nsIAccessibleEvent::EVENT_VALUE_CHANGE
|
||||||
|
: nsIAccessibleEvent::EVENT_TEXT_VALUE_CHANGE;
|
||||||
|
targetDocument->FireDelayedEvent(event, accessible);
|
||||||
}
|
}
|
||||||
#ifdef DEBUG_DRAGDROPSTART
|
#ifdef DEBUG_DRAGDROPSTART
|
||||||
else if (eventType.EqualsLiteral("mouseover")) {
|
else if (eventType.EqualsLiteral("mouseover")) {
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
/**
|
/**
|
||||||
* Fired when the caret changes position in text.
|
* Fired when the caret changes position in text.
|
||||||
*/
|
*/
|
||||||
[scriptable, builtinclass, uuid(5675c486-a230-4d85-a4bd-33670826d5ff)]
|
[scriptable, builtinclass, uuid(ed1982e4-57d7-41a8-8cd8-9023f809383e)]
|
||||||
interface nsIAccessibleCaretMoveEvent: nsIAccessibleEvent
|
interface nsIAccessibleCaretMoveEvent: nsIAccessibleEvent
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -25,7 +25,7 @@ interface nsIDOMNode;
|
|||||||
* if (NS_SUCCEEDED(rv))
|
* if (NS_SUCCEEDED(rv))
|
||||||
* rv = observerService->AddObserver(this, "accessible-event", PR_TRUE);
|
* rv = observerService->AddObserver(this, "accessible-event", PR_TRUE);
|
||||||
*/
|
*/
|
||||||
[scriptable, builtinclass, uuid(7f66a33a-9ed7-4fd4-87a8-e431b0f43368)]
|
[scriptable, builtinclass, uuid(20c69a40-6c2c-42a3-a578-6f4473aab9dd)]
|
||||||
interface nsIAccessibleEvent : nsISupports
|
interface nsIAccessibleEvent : nsISupports
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@ -75,7 +75,7 @@ interface nsIAccessibleEvent : nsISupports
|
|||||||
const unsigned long EVENT_DESCRIPTION_CHANGE = 0x0009;
|
const unsigned long EVENT_DESCRIPTION_CHANGE = 0x0009;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An object's Value property has changed.
|
* An object's numeric Value has changed.
|
||||||
*/
|
*/
|
||||||
const unsigned long EVENT_VALUE_CHANGE = 0x000A;
|
const unsigned long EVENT_VALUE_CHANGE = 0x000A;
|
||||||
|
|
||||||
@ -412,10 +412,15 @@ interface nsIAccessibleEvent : nsISupports
|
|||||||
*/
|
*/
|
||||||
const unsigned long EVENT_VIRTUALCURSOR_CHANGED = 0x0056;
|
const unsigned long EVENT_VIRTUALCURSOR_CHANGED = 0x0056;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An object's text Value has changed.
|
||||||
|
*/
|
||||||
|
const unsigned long EVENT_TEXT_VALUE_CHANGE = 0x0057;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Help make sure event map does not get out-of-line.
|
* Help make sure event map does not get out-of-line.
|
||||||
*/
|
*/
|
||||||
const unsigned long EVENT_LAST_ENTRY = 0x0057;
|
const unsigned long EVENT_LAST_ENTRY = 0x0058;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The type of event, based on the enumerated event values
|
* The type of event, based on the enumerated event values
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
/**
|
/**
|
||||||
* Fired when a accessible and its subtree are removed from the tree.
|
* Fired when a accessible and its subtree are removed from the tree.
|
||||||
*/
|
*/
|
||||||
[scriptable, builtinclass, uuid(a2bd2eca-3afa-489b-afb2-f93ef32ad99c)]
|
[scriptable, builtinclass, uuid(2051709a-4e0d-4be5-873d-b49d1dee35fa)]
|
||||||
interface nsIAccessibleHideEvent: nsIAccessibleEvent
|
interface nsIAccessibleHideEvent: nsIAccessibleEvent
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -11,7 +11,7 @@ interface nsIAtom;
|
|||||||
/**
|
/**
|
||||||
* Fired when an attribute of an accessible changes.
|
* Fired when an attribute of an accessible changes.
|
||||||
*/
|
*/
|
||||||
[scriptable, builtinclass, uuid(4CA96609-23C8-4771-86E7-77C8B651CA24)]
|
[scriptable, builtinclass, uuid(ce41add2-096e-4606-b1ca-7408c6d5b4c3)]
|
||||||
interface nsIAccessibleObjectAttributeChangedEvent : nsIAccessibleEvent
|
interface nsIAccessibleObjectAttributeChangedEvent : nsIAccessibleEvent
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
/**
|
/**
|
||||||
* Fired when a state of an accessible changes.
|
* Fired when a state of an accessible changes.
|
||||||
*/
|
*/
|
||||||
[scriptable, builtinclass, uuid(0d2d77c5-7b16-4a15-8b20-c484ceb5ac0d)]
|
[scriptable, builtinclass, uuid(58b74954-1835-46ed-9ccd-c906490106f6)]
|
||||||
interface nsIAccessibleStateChangeEvent : nsIAccessibleEvent
|
interface nsIAccessibleStateChangeEvent : nsIAccessibleEvent
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include "nsIAccessibleEvent.idl"
|
#include "nsIAccessibleEvent.idl"
|
||||||
|
|
||||||
[scriptable, builtinclass, uuid(df517997-ed52-4ea2-b310-2f8e0fe64572)]
|
[scriptable, builtinclass, uuid(9fb3a8a4-d254-43d3-80a5-20e171d52b21)]
|
||||||
interface nsIAccessibleTableChangeEvent: nsIAccessibleEvent
|
interface nsIAccessibleTableChangeEvent: nsIAccessibleEvent
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
/**
|
/**
|
||||||
* Fired when an accessible's text changes.
|
* Fired when an accessible's text changes.
|
||||||
*/
|
*/
|
||||||
[scriptable, builtinclass, uuid(21e0f8bd-5638-4964-870b-3c8e944ac4c4)]
|
[scriptable, builtinclass, uuid(1fcc0dfa-93e6-48f4-bbd4-f80eb1d9f2e6)]
|
||||||
interface nsIAccessibleTextChangeEvent : nsIAccessibleEvent
|
interface nsIAccessibleTextChangeEvent : nsIAccessibleEvent
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
* An interface for virtual cursor changed events.
|
* An interface for virtual cursor changed events.
|
||||||
* Passes previous cursor position and text offsets.
|
* Passes previous cursor position and text offsets.
|
||||||
*/
|
*/
|
||||||
[scriptable, builtinclass, uuid(370e8b9b-2bbc-4bff-a9c7-16ddc54aea21)]
|
[scriptable, builtinclass, uuid(a58693b1-009e-4cc9-ae93-9c7d8f85cfdf)]
|
||||||
interface nsIAccessibleVirtualCursorChangeEvent : nsIAccessibleEvent
|
interface nsIAccessibleVirtualCursorChangeEvent : nsIAccessibleEvent
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -302,6 +302,7 @@ this.EventManager.prototype = {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Events.VALUE_CHANGE:
|
case Events.VALUE_CHANGE:
|
||||||
|
case Events.TEXT_VALUE_CHANGE:
|
||||||
{
|
{
|
||||||
let position = this.contentControl.vc.position;
|
let position = this.contentControl.vc.position;
|
||||||
let target = aEvent.accessible;
|
let target = aEvent.accessible;
|
||||||
|
@ -114,6 +114,7 @@ AccessibleWrap::HandleAccEvent(AccEvent* aEvent)
|
|||||||
// and document load complete events for now.
|
// and document load complete events for now.
|
||||||
if (eventType != nsIAccessibleEvent::EVENT_FOCUS &&
|
if (eventType != nsIAccessibleEvent::EVENT_FOCUS &&
|
||||||
eventType != nsIAccessibleEvent::EVENT_VALUE_CHANGE &&
|
eventType != nsIAccessibleEvent::EVENT_VALUE_CHANGE &&
|
||||||
|
eventType != nsIAccessibleEvent::EVENT_TEXT_VALUE_CHANGE &&
|
||||||
eventType != nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED &&
|
eventType != nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED &&
|
||||||
eventType != nsIAccessibleEvent::EVENT_TEXT_SELECTION_CHANGED &&
|
eventType != nsIAccessibleEvent::EVENT_TEXT_SELECTION_CHANGED &&
|
||||||
eventType != nsIAccessibleEvent::EVENT_DOCUMENT_LOAD_COMPLETE)
|
eventType != nsIAccessibleEvent::EVENT_DOCUMENT_LOAD_COMPLETE)
|
||||||
@ -248,6 +249,7 @@ a11y::FireNativeEvent(mozAccessible* aNativeAcc, uint32_t aEventType)
|
|||||||
[aNativeAcc didReceiveFocus];
|
[aNativeAcc didReceiveFocus];
|
||||||
break;
|
break;
|
||||||
case nsIAccessibleEvent::EVENT_VALUE_CHANGE:
|
case nsIAccessibleEvent::EVENT_VALUE_CHANGE:
|
||||||
|
case nsIAccessibleEvent::EVENT_TEXT_VALUE_CHANGE:
|
||||||
[aNativeAcc valueDidChange];
|
[aNativeAcc valueDidChange];
|
||||||
break;
|
break;
|
||||||
case nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED:
|
case nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED:
|
||||||
|
@ -72,6 +72,7 @@ ProxyEvent(ProxyAccessible* aProxy, uint32_t aEventType)
|
|||||||
// events for now.
|
// events for now.
|
||||||
if (aEventType != nsIAccessibleEvent::EVENT_FOCUS &&
|
if (aEventType != nsIAccessibleEvent::EVENT_FOCUS &&
|
||||||
aEventType != nsIAccessibleEvent::EVENT_VALUE_CHANGE &&
|
aEventType != nsIAccessibleEvent::EVENT_VALUE_CHANGE &&
|
||||||
|
aEventType != nsIAccessibleEvent::EVENT_TEXT_VALUE_CHANGE &&
|
||||||
aEventType != nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED &&
|
aEventType != nsIAccessibleEvent::EVENT_TEXT_CARET_MOVED &&
|
||||||
aEventType != nsIAccessibleEvent::EVENT_TEXT_SELECTION_CHANGED)
|
aEventType != nsIAccessibleEvent::EVENT_TEXT_SELECTION_CHANGED)
|
||||||
return;
|
return;
|
||||||
|
@ -28,6 +28,7 @@ const EVENT_TEXT_INSERTED = nsIAccessibleEvent.EVENT_TEXT_INSERTED;
|
|||||||
const EVENT_TEXT_REMOVED = nsIAccessibleEvent.EVENT_TEXT_REMOVED;
|
const EVENT_TEXT_REMOVED = nsIAccessibleEvent.EVENT_TEXT_REMOVED;
|
||||||
const EVENT_TEXT_SELECTION_CHANGED = nsIAccessibleEvent.EVENT_TEXT_SELECTION_CHANGED;
|
const EVENT_TEXT_SELECTION_CHANGED = nsIAccessibleEvent.EVENT_TEXT_SELECTION_CHANGED;
|
||||||
const EVENT_VALUE_CHANGE = nsIAccessibleEvent.EVENT_VALUE_CHANGE;
|
const EVENT_VALUE_CHANGE = nsIAccessibleEvent.EVENT_VALUE_CHANGE;
|
||||||
|
const EVENT_TEXT_VALUE_CHANGE = nsIAccessibleEvent.EVENT_TEXT_VALUE_CHANGE;
|
||||||
const EVENT_VIRTUALCURSOR_CHANGED = nsIAccessibleEvent.EVENT_VIRTUALCURSOR_CHANGED;
|
const EVENT_VIRTUALCURSOR_CHANGED = nsIAccessibleEvent.EVENT_VIRTUALCURSOR_CHANGED;
|
||||||
|
|
||||||
const kNotFromUserInput = 0;
|
const kNotFromUserInput = 0;
|
||||||
|
@ -180,7 +180,8 @@
|
|||||||
{
|
{
|
||||||
this.__proto__ = new textRemoveInvoker(aID, aStart, aEnd, aText);
|
this.__proto__ = new textRemoveInvoker(aID, aStart, aEnd, aText);
|
||||||
|
|
||||||
this.eventSeq.push(new invokerChecker(EVENT_VALUE_CHANGE, this.DOMNode));
|
this.eventSeq.push(new invokerChecker(EVENT_TEXT_VALUE_CHANGE,
|
||||||
|
this.DOMNode));
|
||||||
|
|
||||||
this.invoke = function removeTextFromInput_invoke()
|
this.invoke = function removeTextFromInput_invoke()
|
||||||
{
|
{
|
||||||
@ -207,7 +208,8 @@
|
|||||||
{
|
{
|
||||||
this.__proto__ = new textInsertInvoker(aID, aStart, aEnd, aText);
|
this.__proto__ = new textInsertInvoker(aID, aStart, aEnd, aText);
|
||||||
|
|
||||||
this.eventSeq.push(new invokerChecker(EVENT_VALUE_CHANGE, this.DOMNode));
|
this.eventSeq.push(new invokerChecker(EVENT_TEXT_VALUE_CHANGE,
|
||||||
|
this.DOMNode));
|
||||||
|
|
||||||
this.invoke = function insertTextIntoInput_invoke()
|
this.invoke = function insertTextIntoInput_invoke()
|
||||||
{
|
{
|
||||||
|
@ -31,6 +31,10 @@
|
|||||||
function changeARIAValue(aNodeOrID, aValuenow, aValuetext)
|
function changeARIAValue(aNodeOrID, aValuenow, aValuetext)
|
||||||
{
|
{
|
||||||
this.DOMNode = getNode(aNodeOrID);
|
this.DOMNode = getNode(aNodeOrID);
|
||||||
|
this.eventSeq = [ new invokerChecker(aValuetext ?
|
||||||
|
EVENT_TEXT_VALUE_CHANGE :
|
||||||
|
EVENT_VALUE_CHANGE, this.DOMNode)
|
||||||
|
];
|
||||||
|
|
||||||
this.invoke = function changeARIAValue_invoke() {
|
this.invoke = function changeARIAValue_invoke() {
|
||||||
|
|
||||||
@ -63,6 +67,9 @@
|
|||||||
function changeValue(aID, aValue)
|
function changeValue(aID, aValue)
|
||||||
{
|
{
|
||||||
this.DOMNode = getNode(aID);
|
this.DOMNode = getNode(aID);
|
||||||
|
this.eventSeq = [new invokerChecker(EVENT_TEXT_VALUE_CHANGE,
|
||||||
|
this.DOMNode)
|
||||||
|
];
|
||||||
|
|
||||||
this.invoke = function changeValue_invoke()
|
this.invoke = function changeValue_invoke()
|
||||||
{
|
{
|
||||||
@ -84,6 +91,7 @@
|
|||||||
function changeProgressValue(aID, aValue)
|
function changeProgressValue(aID, aValue)
|
||||||
{
|
{
|
||||||
this.DOMNode = getNode(aID);
|
this.DOMNode = getNode(aID);
|
||||||
|
this.eventSeq = [new invokerChecker(EVENT_VALUE_CHANGE, this.DOMNode)];
|
||||||
|
|
||||||
this.invoke = function changeProgressValue_invoke()
|
this.invoke = function changeProgressValue_invoke()
|
||||||
{
|
{
|
||||||
@ -105,6 +113,7 @@
|
|||||||
function changeRangeValue(aID)
|
function changeRangeValue(aID)
|
||||||
{
|
{
|
||||||
this.DOMNode = getNode(aID);
|
this.DOMNode = getNode(aID);
|
||||||
|
this.eventSeq = [new invokerChecker(EVENT_VALUE_CHANGE, this.DOMNode)];
|
||||||
|
|
||||||
this.invoke = function changeRangeValue_invoke()
|
this.invoke = function changeRangeValue_invoke()
|
||||||
{
|
{
|
||||||
@ -134,7 +143,7 @@
|
|||||||
testValue("range", "6", 6, 0, 10, 1);
|
testValue("range", "6", 6, 0, 10, 1);
|
||||||
|
|
||||||
// Test value change events
|
// Test value change events
|
||||||
gQueue = new eventQueue(nsIAccessibleEvent.EVENT_VALUE_CHANGE);
|
gQueue = new eventQueue();
|
||||||
|
|
||||||
gQueue.push(new changeARIAValue("slider_vn", "6", undefined));
|
gQueue.push(new changeARIAValue("slider_vn", "6", undefined));
|
||||||
gQueue.push(new changeARIAValue("slider_vt", undefined, "hey!"));
|
gQueue.push(new changeARIAValue("slider_vt", undefined, "hey!"));
|
||||||
|
@ -98,5 +98,6 @@ static const uint32_t gWinEventMap[] = {
|
|||||||
IA2_EVENT_HYPERTEXT_NLINKS_CHANGED, // nsIAccessibleEvent::EVENT_HYPERTEXT_NLINKS_CHANGED
|
IA2_EVENT_HYPERTEXT_NLINKS_CHANGED, // nsIAccessibleEvent::EVENT_HYPERTEXT_NLINKS_CHANGED
|
||||||
IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED, // nsIAccessibleEvent::EVENT_OBJECT_ATTRIBUTE_CHANGED
|
IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED, // nsIAccessibleEvent::EVENT_OBJECT_ATTRIBUTE_CHANGED
|
||||||
kEVENT_WIN_UNKNOWN // nsIAccessibleEvent::EVENT_VIRTUALCURSOR_CHANGED
|
kEVENT_WIN_UNKNOWN // nsIAccessibleEvent::EVENT_VIRTUALCURSOR_CHANGED
|
||||||
|
EVENT_OBJECT_VALUECHANGE, // nsIAccessibleEvent::EVENT_TEXT_VALUE_CHANGE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user