@@ -1008,6 +1008,17 @@ Accessible* SessionAccessibility::GetAccessibleByID(int32_t aID) const {
1008
1008
return accessible;
1009
1009
}
1010
1010
1011
+ #ifdef DEBUG
1012
+ static bool IsDetachedDoc (Accessible* aAccessible) {
1013
+ if (!aAccessible->IsRemote () || !aAccessible->AsRemote ()->IsDoc ()) {
1014
+ return false ;
1015
+ }
1016
+
1017
+ return !aAccessible->Parent () ||
1018
+ aAccessible->Parent ()->FirstChild () != aAccessible;
1019
+ }
1020
+ #endif
1021
+
1011
1022
void SessionAccessibility::RegisterAccessible (Accessible* aAccessible) {
1012
1023
if (IPCAccessibilityActive ()) {
1013
1024
// Don't register accessible in content process.
@@ -1044,8 +1055,14 @@ void SessionAccessibility::RegisterAccessible(Accessible* aAccessible) {
1044
1055
}
1045
1056
AccessibleWrap::SetVirtualViewID (aAccessible, virtualViewID);
1046
1057
1047
- MOZ_ASSERT (!sessionAcc->mIDToAccessibleMap .Contains (virtualViewID),
1048
- " ID already registered" );
1058
+ Accessible* oldAcc = sessionAcc->mIDToAccessibleMap .Get (virtualViewID);
1059
+ if (oldAcc) {
1060
+ // About to overwrite mapping of registered accessible. This should
1061
+ // only happen when the registered accessible is a detached document.
1062
+ MOZ_ASSERT (IsDetachedDoc (oldAcc),
1063
+ " ID already registered to non-detached document" );
1064
+ }
1065
+
1049
1066
sessionAcc->mIDToAccessibleMap .InsertOrUpdate (virtualViewID, aAccessible);
1050
1067
}
1051
1068
@@ -1064,8 +1081,21 @@ void SessionAccessibility::UnregisterAccessible(Accessible* aAccessible) {
1064
1081
RefPtr<SessionAccessibility> sessionAcc = GetInstanceFor (aAccessible);
1065
1082
MOZ_ASSERT (sessionAcc, " Need SessionAccessibility to unregister Accessible!" );
1066
1083
if (sessionAcc) {
1067
- MOZ_ASSERT (sessionAcc->mIDToAccessibleMap .Contains (virtualViewID),
1068
- " Unregistering unregistered accessible" );
1084
+ Accessible* registeredAcc =
1085
+ sessionAcc->mIDToAccessibleMap .Get (virtualViewID);
1086
+ if (registeredAcc != aAccessible) {
1087
+ // Attempting to unregister an accessible that is not mapped to
1088
+ // its virtual view ID. This probably means it is a detached document
1089
+ // and a more recent document overwrote its '-1' mapping.
1090
+ // We set its own virtual view ID to `kUnsetID` and return early.
1091
+ MOZ_ASSERT (!registeredAcc || IsDetachedDoc (aAccessible),
1092
+ " Accessible is detached document" );
1093
+ AccessibleWrap::SetVirtualViewID (aAccessible, kUnsetID );
1094
+ return ;
1095
+ }
1096
+
1097
+ MOZ_ASSERT (registeredAcc, " Unregistering unregistered accessible" );
1098
+ MOZ_ASSERT (registeredAcc == aAccessible, " Unregistering wrong accessible" );
1069
1099
sessionAcc->mIDToAccessibleMap .Remove (virtualViewID);
1070
1100
}
1071
1101
0 commit comments