void AXObjectCache::attachWrapper(AccessibilityObject* obj) { AtkObject* atkObj = ATK_OBJECT(webkitAccessibleNew(obj)); obj->setWrapper(atkObj); g_object_unref(atkObj); // If an object is being attached and we are not in the middle of a layout update, then // we should report ATs by emitting the children-changed::add signal from the parent. Document* document = obj->document(); if (!document || document->childNeedsStyleRecalc()) return; // Don't emit the signal for objects that we already know won't be exposed directly. AccessibilityObject* coreParent = obj->parentObjectUnignored(); if (!coreParent || coreParent->accessibilityIsIgnoredByDefault()) return; // Look for the right object to emit the signal from. AtkObject* atkParent = coreParent->wrapper(); if (!atkParent) return; size_t index = coreParent->children(false).find(obj); g_signal_emit_by_name(atkParent, "children-changed::add", index, atkObj); }
void AXObjectCache::attachWrapper(AccessibilityObject* obj) { AtkObject* atkObj = ATK_OBJECT(webkitAccessibleNew(obj)); obj->setWrapper(atkObj); g_object_unref(atkObj); // If an object is being attached and we are not in the middle of a layout update, then // we should report ATs by emitting the children-changed::add signal from the parent. Document* document = obj->document(); if (!document || document->childNeedsStyleRecalc()) return; // Don't emit the signal when the actual object being added is not going to be exposed. if (obj->accessibilityIsIgnoredByDefault()) return; // Don't emit the signal if the object being added is not -- or not yet -- rendered, // which can occur in nested iframes. In these instances we don't want to ignore the // child. But if an assistive technology is listening, AT-SPI2 will attempt to create // and cache the state set for the child upon emission of the signal. If the object // has not yet been rendered, this will result in a crash. if (!obj->renderer()) return; // Don't emit the signal for objects whose parents won't be exposed directly. AccessibilityObject* coreParent = obj->parentObjectUnignored(); if (!coreParent || coreParent->accessibilityIsIgnoredByDefault()) return; // Look for the right object to emit the signal from. AtkObject* atkParent = coreParent->wrapper(); if (!atkParent) return; size_t index = coreParent->children(false).find(obj); g_signal_emit_by_name(atkParent, "children-changed::add", index, atkObj); }