Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(369)

Unified Diff: third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp

Issue 2858493002: Rename AXObject to AXObjectImpl in modules/ and web/ (Closed)
Patch Set: Fixed rebase Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
diff --git a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
index 2e73fd5e2def1bf0e32be330886ead1cd7fb8ae7..01d1c1ed6adb7f6e6668024e8711f66ba6efd1f6 100644
--- a/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
+++ b/third_party/WebKit/Source/modules/accessibility/AXLayoutObject.cpp
@@ -327,7 +327,7 @@ void AXLayoutObject::Detach() {
// Check object role or purpose.
//
-static bool IsLinkable(const AXObject& object) {
+static bool IsLinkable(const AXObjectImpl& object) {
if (!object.GetLayoutObject())
return false;
@@ -350,7 +350,7 @@ bool AXLayoutObject::IsEditable() const {
Document& document = GetLayoutObject()->GetDocument();
HTMLElement* body = document.body();
if (body && HasEditableStyle(*body)) {
- AXObject* ax_body = AxObjectCache().GetOrCreate(body);
+ AXObjectImpl* ax_body = AxObjectCache().GetOrCreate(body);
return ax_body && ax_body != ax_body->AriaHiddenRoot();
}
@@ -370,7 +370,7 @@ bool AXLayoutObject::IsRichlyEditable() const {
Document& document = layout_object_->GetDocument();
HTMLElement* body = document.body();
if (body && HasRichlyEditableStyle(*body)) {
- AXObject* ax_body = AxObjectCache().GetOrCreate(body);
+ AXObjectImpl* ax_body = AxObjectCache().GetOrCreate(body);
return ax_body && ax_body != ax_body->AriaHiddenRoot();
}
@@ -412,7 +412,7 @@ bool AXLayoutObject::IsReadOnly() const {
Document& document = layout_object_->GetDocument();
HTMLElement* body = document.body();
if (body && HasEditableStyle(*body)) {
- AXObject* ax_body = AxObjectCache().GetOrCreate(body);
+ AXObjectImpl* ax_body = AxObjectCache().GetOrCreate(body);
return !ax_body || ax_body == ax_body->AriaHiddenRoot();
}
@@ -441,7 +441,7 @@ bool AXLayoutObject::IsFocused() const {
Element* focused_element = GetDocument()->FocusedElement();
if (!focused_element)
return false;
- AXObject* focused_object = AxObjectCache().GetOrCreate(focused_element);
+ AXObjectImpl* focused_object = AxObjectCache().GetOrCreate(focused_element);
if (!focused_object || !focused_object->IsAXLayoutObject())
return false;
@@ -463,7 +463,7 @@ bool AXLayoutObject::IsSelected() const {
if (EqualIgnoringASCIICase(aria_selected, "true"))
return true;
- AXObject* focused_object = AxObjectCache().FocusedObject();
+ AXObjectImpl* focused_object = AxObjectCache().FocusedObject();
if (AriaRoleAttribute() == kListBoxOptionRole && focused_object &&
focused_object->ActiveDescendant() == this) {
return true;
@@ -501,7 +501,7 @@ AXObjectInclusion AXLayoutObject::DefaultObjectInclusion(
return kIgnoreObject;
}
- return AXObject::DefaultObjectInclusion(ignored_reasons);
+ return AXObjectImpl::DefaultObjectInclusion(ignored_reasons);
}
bool AXLayoutObject::ComputeAccessibilityIsIgnored(
@@ -542,7 +542,7 @@ bool AXLayoutObject::ComputeAccessibilityIsIgnored(
if (HasInheritedPresentationalRole()) {
if (ignored_reasons) {
- const AXObject* inherits_from = InheritsPresentationalRoleFrom();
+ const AXObjectImpl* inherits_from = InheritsPresentationalRoleFrom();
if (inherits_from == this)
ignored_reasons->push_back(IgnoredReason(kAXPresentationalRole));
else
@@ -553,7 +553,7 @@ bool AXLayoutObject::ComputeAccessibilityIsIgnored(
}
// An ARIA tree can only have tree items and static text as children.
- if (AXObject* tree_ancestor = TreeAncestorDisallowingChild()) {
+ if (AXObjectImpl* tree_ancestor = TreeAncestorDisallowingChild()) {
if (ignored_reasons)
ignored_reasons->push_back(
IgnoredReason(kAXAncestorDisallowsChild, tree_ancestor));
@@ -572,13 +572,13 @@ bool AXLayoutObject::ComputeAccessibilityIsIgnored(
// Find out if this element is inside of a label element. If so, it may be
// ignored because it's the label for a checkbox or radio button.
- AXObject* control_object = CorrespondingControlForLabelElement();
+ AXObjectImpl* control_object = CorrespondingControlForLabelElement();
if (control_object && control_object->IsCheckboxOrRadio() &&
control_object->NameFromLabelElement()) {
if (ignored_reasons) {
HTMLLabelElement* label = LabelElementContainer();
if (label && label != GetNode()) {
- AXObject* label_ax_object = AxObjectCache().GetOrCreate(label);
+ AXObjectImpl* label_ax_object = AxObjectCache().GetOrCreate(label);
ignored_reasons->push_back(
IgnoredReason(kAXLabelContainer, label_ax_object));
}
@@ -600,7 +600,7 @@ bool AXLayoutObject::ComputeAccessibilityIsIgnored(
if (layout_object_->IsText()) {
// Static text beneath MenuItems and MenuButtons are just reported along
// with the menu item, so it's ignored on an individual level.
- AXObject* parent = ParentObjectUnignored();
+ AXObjectImpl* parent = ParentObjectUnignored();
if (parent && (parent->AriaRoleAttribute() == kMenuItemRole ||
parent->AriaRoleAttribute() == kMenuButtonRole)) {
if (ignored_reasons)
@@ -616,7 +616,7 @@ bool AXLayoutObject::ComputeAccessibilityIsIgnored(
}
// Don't ignore static text in editable text controls.
- for (AXObject* parent = ParentObject(); parent;
+ for (AXObjectImpl* parent = ParentObject(); parent;
parent = parent->ParentObject()) {
if (parent->RoleValue() == kTextFieldRole)
return false;
@@ -809,7 +809,7 @@ RGBA32 AXLayoutObject::ComputeBackgroundColor() const {
// Color::blend should be called like this: background.blend(foreground).
for (LayoutObject* layout_object = GetLayoutObject(); layout_object;
layout_object = layout_object->Parent()) {
- const AXObject* ax_parent = AxObjectCache().GetOrCreate(layout_object);
+ const AXObjectImpl* ax_parent = AxObjectCache().GetOrCreate(layout_object);
if (ax_parent && ax_parent != this) {
Color parent_color = ax_parent->BackgroundColor();
blended_color = parent_color.Blend(blended_color);
@@ -1080,13 +1080,13 @@ void AXLayoutObject::LoadInlineTextBoxes() {
}
}
-AXObject* AXLayoutObject::NextOnLine() const {
+AXObjectImpl* AXLayoutObject::NextOnLine() const {
if (!GetLayoutObject())
return nullptr;
- AXObject* result = nullptr;
+ AXObjectImpl* result = nullptr;
if (GetLayoutObject()->IsListMarker()) {
- AXObject* next_sibling = RawNextSibling();
+ AXObjectImpl* next_sibling = RawNextSibling();
if (!next_sibling || !next_sibling->Children().size())
return nullptr;
result = next_sibling->Children()[0].Get();
@@ -1119,7 +1119,7 @@ AXObject* AXLayoutObject::NextOnLine() const {
return result;
}
-AXObject* AXLayoutObject::PreviousOnLine() const {
+AXObjectImpl* AXLayoutObject::PreviousOnLine() const {
if (!GetLayoutObject())
return nullptr;
@@ -1132,7 +1132,7 @@ AXObject* AXLayoutObject::PreviousOnLine() const {
if (!inline_box)
return nullptr;
- AXObject* result = nullptr;
+ AXObjectImpl* result = nullptr;
for (InlineBox* prev = inline_box->PrevOnLine(); prev;
prev = prev->PrevOnLine()) {
LayoutObject* layout_object =
@@ -1291,9 +1291,10 @@ bool AXLayoutObject::AriaRoleHasPresentationalChildren() const {
}
}
-AXObject* AXLayoutObject::AncestorForWhichThisIsAPresentationalChild() const {
+AXObjectImpl* AXLayoutObject::AncestorForWhichThisIsAPresentationalChild()
+ const {
// Walk the parent chain looking for a parent that has presentational children
- AXObject* parent = ParentObjectIfExists();
+ AXObjectImpl* parent = ParentObjectIfExists();
while (parent) {
if (parent->AriaRoleHasPresentationalChildren())
break;
@@ -1397,7 +1398,8 @@ bool AXLayoutObject::LiveRegionBusy() const {
// Hit testing.
//
-AXObject* AXLayoutObject::AccessibilityHitTest(const IntPoint& point) const {
+AXObjectImpl* AXLayoutObject::AccessibilityHitTest(
+ const IntPoint& point) const {
if (!layout_object_ || !layout_object_->HasLayer())
return nullptr;
@@ -1424,7 +1426,7 @@ AXObject* AXLayoutObject::AccessibilityHitTest(const IntPoint& point) const {
if (!obj)
return nullptr;
- AXObject* result = AxObjectCache().GetOrCreate(obj);
+ AXObjectImpl* result = AxObjectCache().GetOrCreate(obj);
result->UpdateChildrenIfNecessary();
// Allow the element to perform any hit-testing it might need to do to reach
@@ -1434,7 +1436,7 @@ AXObject* AXLayoutObject::AccessibilityHitTest(const IntPoint& point) const {
// If this element is the label of a control, a hit test should return the
// control.
if (result->IsAXLayoutObject()) {
- AXObject* control_object =
+ AXObjectImpl* control_object =
ToAXLayoutObject(result)->CorrespondingControlForLabelElement();
if (control_object && control_object->NameFromLabelElement())
return control_object;
@@ -1446,19 +1448,19 @@ AXObject* AXLayoutObject::AccessibilityHitTest(const IntPoint& point) const {
return result;
}
-AXObject* AXLayoutObject::ElementAccessibilityHitTest(
+AXObjectImpl* AXLayoutObject::ElementAccessibilityHitTest(
const IntPoint& point) const {
if (IsSVGImage())
return RemoteSVGElementHitTest(point);
- return AXObject::ElementAccessibilityHitTest(point);
+ return AXObjectImpl::ElementAccessibilityHitTest(point);
}
//
// High-level accessibility tree access.
//
-AXObject* AXLayoutObject::ComputeParent() const {
+AXObjectImpl* AXLayoutObject::ComputeParent() const {
DCHECK(!IsDetached());
if (!layout_object_)
return 0;
@@ -1469,7 +1471,7 @@ AXObject* AXLayoutObject::ComputeParent() const {
// menuButton and its corresponding menu are DOM siblings, but Accessibility
// needs them to be parent/child.
if (AriaRoleAttribute() == kMenuRole) {
- AXObject* parent = MenuButtonForMenu();
+ AXObjectImpl* parent = MenuButtonForMenu();
if (parent)
return parent;
}
@@ -1487,7 +1489,7 @@ AXObject* AXLayoutObject::ComputeParent() const {
return 0;
}
-AXObject* AXLayoutObject::ComputeParentIfExists() const {
+AXObjectImpl* AXLayoutObject::ComputeParentIfExists() const {
if (!layout_object_)
return 0;
@@ -1497,7 +1499,7 @@ AXObject* AXLayoutObject::ComputeParentIfExists() const {
// menuButton and its corresponding menu are DOM siblings, but Accessibility
// needs them to be parent/child.
if (AriaRoleAttribute() == kMenuRole) {
- AXObject* parent = MenuButtonForMenu();
+ AXObjectImpl* parent = MenuButtonForMenu();
if (parent)
return parent;
}
@@ -1520,7 +1522,7 @@ AXObject* AXLayoutObject::ComputeParentIfExists() const {
// accessibility module.
//
-AXObject* AXLayoutObject::RawFirstChild() const {
+AXObjectImpl* AXLayoutObject::RawFirstChild() const {
if (!layout_object_)
return 0;
@@ -1532,7 +1534,7 @@ AXObject* AXLayoutObject::RawFirstChild() const {
return AxObjectCache().GetOrCreate(first_child);
}
-AXObject* AXLayoutObject::RawNextSibling() const {
+AXObjectImpl* AXLayoutObject::RawNextSibling() const {
if (!layout_object_)
return 0;
@@ -1600,10 +1602,10 @@ void AXLayoutObject::AddChildren() {
if (!CanHaveChildren())
return;
- HeapVector<Member<AXObject>> owned_children;
+ HeapVector<Member<AXObjectImpl>> owned_children;
ComputeAriaOwnsChildren(owned_children);
- for (AXObject* obj = RawFirstChild(); obj; obj = obj->RawNextSibling()) {
+ for (AXObjectImpl* obj = RawFirstChild(); obj; obj = obj->RawNextSibling()) {
if (!AxObjectCache().IsAriaOwned(obj)) {
obj->SetParent(this);
AddChild(obj);
@@ -1638,11 +1640,11 @@ void AXLayoutObject::UpdateChildrenIfNecessary() {
if (NeedsToUpdateChildren())
ClearChildren();
- AXObject::UpdateChildrenIfNecessary();
+ AXObjectImpl::UpdateChildrenIfNecessary();
}
void AXLayoutObject::ClearChildren() {
- AXObject::ClearChildren();
+ AXObjectImpl::ClearChildren();
children_dirty_ = false;
}
@@ -1729,7 +1731,7 @@ Element* AXLayoutObject::AnchorElement() const {
// Functions that retrieve the current selection.
//
-AXObject::AXRange AXLayoutObject::Selection() const {
+AXObjectImpl::AXRange AXLayoutObject::Selection() const {
AXRange text_selection = TextControlSelection();
if (text_selection.IsValid())
return text_selection;
@@ -1756,7 +1758,7 @@ AXObject::AXRange AXLayoutObject::Selection() const {
DCHECK(anchor_node);
AXLayoutObject* anchor_object = nullptr;
- // Find the closest node that has a corresponding AXObject.
+ // Find the closest node that has a corresponding AXObjectImpl.
// This is because some nodes may be aria hidden or might not even have
// a layout object if they are part of the shadow DOM.
while (anchor_node) {
@@ -1799,7 +1801,7 @@ AXObject::AXRange AXLayoutObject::Selection() const {
// Gets only the start and end offsets of the selection computed using the
// current object as the starting point. Returns a null selection if there is
// no selection in the subtree rooted at this object.
-AXObject::AXRange AXLayoutObject::SelectionUnderObject() const {
+AXObjectImpl::AXRange AXLayoutObject::SelectionUnderObject() const {
AXRange text_selection = TextControlSelection();
if (text_selection.IsValid())
return text_selection;
@@ -1833,7 +1835,7 @@ AXObject::AXRange AXLayoutObject::SelectionUnderObject() const {
return AXRange(start, end);
}
-AXObject::AXRange AXLayoutObject::TextControlSelection() const {
+AXObjectImpl::AXRange AXLayoutObject::TextControlSelection() const {
if (!GetLayoutObject())
return AXRange();
@@ -1850,7 +1852,7 @@ AXObject::AXRange AXLayoutObject::TextControlSelection() const {
if (!layout)
return AXRange();
- AXObject* ax_object = AxObjectCache().GetOrCreate(layout);
+ AXObjectImpl* ax_object = AxObjectCache().GetOrCreate(layout);
if (!ax_object || !ax_object->IsAXLayoutObject())
return AXRange();
@@ -1895,7 +1897,7 @@ AXLayoutObject* AXLayoutObject::GetUnignoredObjectFromNode(Node& node) const {
if (IsDetached())
return nullptr;
- AXObject* ax_object = AxObjectCache().GetOrCreate(&node);
+ AXObjectImpl* ax_object = AxObjectCache().GetOrCreate(&node);
if (!ax_object)
return nullptr;
@@ -1910,7 +1912,7 @@ AXLayoutObject* AXLayoutObject::GetUnignoredObjectFromNode(Node& node) const {
//
// Convert from an accessible object and offset to a VisiblePosition.
-static VisiblePosition ToVisiblePosition(AXObject* obj, int offset) {
+static VisiblePosition ToVisiblePosition(AXObjectImpl* obj, int offset) {
if (!obj->GetNode())
return VisiblePosition();
@@ -1936,7 +1938,7 @@ static VisiblePosition ToVisiblePosition(AXObject* obj, int offset) {
static_cast<unsigned>(offset) > (obj->Children().size() - 1)
? offset - 1
: offset;
- AXObject* child_obj = obj->Children()[clamped_offset];
+ AXObjectImpl* child_obj = obj->Children()[clamped_offset];
Node* child_node = child_obj->GetNode();
if (!child_node || !child_node->parentNode())
return VisiblePosition();
@@ -1969,9 +1971,9 @@ void AXLayoutObject::SetSelection(const AXRange& selection) {
if (!GetLayoutObject() || !selection.IsValid())
return;
- AXObject* anchor_object =
+ AXObjectImpl* anchor_object =
selection.anchor_object ? selection.anchor_object.Get() : this;
- AXObject* focus_object =
+ AXObjectImpl* focus_object =
selection.focus_object ? selection.focus_object.Get() : this;
if (!IsValidSelectionBound(anchor_object) ||
@@ -2023,7 +2025,8 @@ void AXLayoutObject::SetSelection(const AXRange& selection) {
.Build());
}
-bool AXLayoutObject::IsValidSelectionBound(const AXObject* bound_object) const {
+bool AXLayoutObject::IsValidSelectionBound(
+ const AXObjectImpl* bound_object) const {
return GetLayoutObject() && bound_object && !bound_object->IsDetached() &&
bound_object->IsAXLayoutObject() && bound_object->GetLayoutObject() &&
bound_object->GetLayoutObject()->GetFrame() ==
@@ -2054,7 +2057,7 @@ void AXLayoutObject::HandleActiveDescendantChanged() {
if (!GetLayoutObject())
return;
- AXObject* focused_object = AxObjectCache().FocusedObject();
+ AXObjectImpl* focused_object = AxObjectCache().FocusedObject();
if (focused_object == this && SupportsActiveDescendant()) {
AxObjectCache().PostNotification(
GetLayoutObject(), AXObjectCacheImpl::kAXActiveDescendantChanged);
@@ -2063,7 +2066,7 @@ void AXLayoutObject::HandleActiveDescendantChanged() {
void AXLayoutObject::HandleAriaExpandedChanged() {
// Find if a parent of this object should handle aria-expanded changes.
- AXObject* container_parent = this->ParentObject();
+ AXObjectImpl* container_parent = this->ParentObject();
while (container_parent) {
bool found_parent = false;
@@ -2183,7 +2186,7 @@ void AXLayoutObject::AddInlineTextBoxChildren(bool force) {
for (RefPtr<AbstractInlineTextBox> box =
layout_text->FirstAbstractInlineTextBox();
box.Get(); box = box->NextInlineTextBox()) {
- AXObject* ax_object = AxObjectCache().GetOrCreate(box.Get());
+ AXObjectImpl* ax_object = AxObjectCache().GetOrCreate(box.Get());
if (!ax_object->AccessibilityIsIgnored())
children_.push_back(ax_object);
}
@@ -2216,11 +2219,11 @@ void AXLayoutObject::LineBreaks(Vector<int>& line_breaks) const {
// Private.
//
-AXObject* AXLayoutObject::TreeAncestorDisallowingChild() const {
+AXObjectImpl* AXLayoutObject::TreeAncestorDisallowingChild() const {
// Determine if this is in a tree. If so, we apply special behavior to make it
// work like an AXOutline.
- AXObject* ax_obj = ParentObject();
- AXObject* tree_ancestor = 0;
+ AXObjectImpl* ax_obj = ParentObject();
+ AXObjectImpl* tree_ancestor = 0;
while (ax_obj) {
if (ax_obj->IsTree()) {
tree_ancestor = ax_obj;
@@ -2250,7 +2253,7 @@ bool AXLayoutObject::IsTabItemSelected() const {
// The ARIA spec says a tab item can also be selected if it is aria-labeled by
// a tabpanel that has keyboard focus inside of it, or if a tabpanel in its
// aria-controls list has KB focus inside of it.
- AXObject* focused_element = AxObjectCache().FocusedObject();
+ AXObjectImpl* focused_element = AxObjectCache().FocusedObject();
if (!focused_element)
return false;
@@ -2258,13 +2261,13 @@ bool AXLayoutObject::IsTabItemSelected() const {
ElementsFromAttribute(elements, aria_controlsAttr);
for (const auto& element : elements) {
- AXObject* tab_panel = AxObjectCache().GetOrCreate(element);
+ AXObjectImpl* tab_panel = AxObjectCache().GetOrCreate(element);
// A tab item should only control tab panels.
if (!tab_panel || tab_panel->RoleValue() != kTabPanelRole)
continue;
- AXObject* check_focus_element = focused_element;
+ AXObjectImpl* check_focus_element = focused_element;
// Check if the focused element is a descendant of the element controlled by
// the tab item.
while (check_focus_element) {
@@ -2277,13 +2280,13 @@ bool AXLayoutObject::IsTabItemSelected() const {
return false;
}
-AXObject* AXLayoutObject::AccessibilityImageMapHitTest(
+AXObjectImpl* AXLayoutObject::AccessibilityImageMapHitTest(
HTMLAreaElement* area,
const IntPoint& point) const {
if (!area)
return 0;
- AXObject* parent = AxObjectCache().GetOrCreate(area->ImageElement());
+ AXObjectImpl* parent = AxObjectCache().GetOrCreate(area->ImageElement());
if (!parent)
return 0;
@@ -2361,8 +2364,9 @@ AXSVGRoot* AXLayoutObject::RemoteSVGRootElement() const {
return 0;
}
-AXObject* AXLayoutObject::RemoteSVGElementHitTest(const IntPoint& point) const {
- AXObject* remote = RemoteSVGRootElement();
+AXObjectImpl* AXLayoutObject::RemoteSVGElementHitTest(
+ const IntPoint& point) const {
+ AXObjectImpl* remote = RemoteSVGRootElement();
if (!remote)
return 0;
@@ -2376,7 +2380,7 @@ AXObject* AXLayoutObject::RemoteSVGElementHitTest(const IntPoint& point) const {
// coordinates only.
void AXLayoutObject::OffsetBoundingBoxForRemoteSVGElement(
LayoutRect& rect) const {
- for (AXObject* parent = ParentObject(); parent;
+ for (AXObjectImpl* parent = ParentObject(); parent;
parent = parent->ParentObject()) {
if (parent->IsAXSVGRoot()) {
rect.MoveBy(
@@ -2415,7 +2419,7 @@ void AXLayoutObject::AddHiddenChildren() {
for (Node& child : NodeTraversal::ChildrenOf(*node)) {
if (child.GetLayoutObject()) {
// Find out where the last layout sibling is located within m_children.
- if (AXObject* child_object =
+ if (AXObjectImpl* child_object =
AxObjectCache().Get(child.GetLayoutObject())) {
if (child_object->AccessibilityIsIgnored()) {
const auto& children = child_object->Children();
@@ -2470,7 +2474,7 @@ void AXLayoutObject::AddImageMapChildren() {
for (HTMLAreaElement& area :
Traversal<HTMLAreaElement>::DescendantsOf(*map)) {
// add an <area> element for this child if it has a link
- AXObject* obj = AxObjectCache().GetOrCreate(&area);
+ AXObjectImpl* obj = AxObjectCache().GetOrCreate(&area);
if (obj) {
AXImageMapLink* area_object = ToAXImageMapLink(obj);
area_object->SetParent(this);
@@ -2498,7 +2502,8 @@ void AXLayoutObject::AddCanvasChildren() {
void AXLayoutObject::AddPopupChildren() {
if (!isHTMLInputElement(GetNode()))
return;
- if (AXObject* ax_popup = toHTMLInputElement(GetNode())->PopupRootAXObject())
+ if (AXObjectImpl* ax_popup =
+ ToAXObjectImpl(toHTMLInputElement(GetNode())->PopupRootAXObject()))
children_.push_back(ax_popup);
}

Powered by Google App Engine
This is Rietveld 408576698