bool TextRange::Crop(Accessible* aContainer) { uint32_t boundaryPos = 0, containerPos = 0; AutoTArray<Accessible*, 30> boundaryParents, containerParents; // Crop the start boundary. Accessible* container = nullptr; Accessible* boundary = mStartContainer->GetChildAtOffset(mStartOffset); if (boundary != aContainer) { CommonParent(boundary, aContainer, &boundaryParents, &boundaryPos, &containerParents, &containerPos); if (boundaryPos == 0) { if (containerPos != 0) { // The container is contained by the start boundary, reduce the range to // the point starting at the container. aContainer->ToTextPoint(mStartContainer.StartAssignment(), &mStartOffset); static_cast<Accessible*>(mStartContainer)->AddRef(); } else { // The start boundary and the container are siblings. container = aContainer; } } else if (containerPos != 0) { // The container does not contain the start boundary. boundary = boundaryParents[boundaryPos]; container = containerParents[containerPos]; } if (container) { // If the range start is after the container, then make the range invalid. if (boundary->IndexInParent() > container->IndexInParent()) { return !!(mRoot = nullptr); } // If the range starts before the container, then reduce the range to // the point starting at the container. if (boundary->IndexInParent() < container->IndexInParent()) { container->ToTextPoint(mStartContainer.StartAssignment(), &mStartOffset); mStartContainer.get()->AddRef(); } } boundaryParents.SetLengthAndRetainStorage(0); containerParents.SetLengthAndRetainStorage(0); } boundary = mEndContainer->GetChildAtOffset(mEndOffset); if (boundary == aContainer) { return true; } // Crop the end boundary. container = nullptr; CommonParent(boundary, aContainer, &boundaryParents, &boundaryPos, &containerParents, &containerPos); if (boundaryPos == 0) { if (containerPos != 0) { aContainer->ToTextPoint(mEndContainer.StartAssignment(), &mEndOffset, false); static_cast<Accessible*>(mEndContainer)->AddRef(); } else { container = aContainer; } } else if (containerPos != 0) { boundary = boundaryParents[boundaryPos]; container = containerParents[containerPos]; } if (!container) { return true; } if (boundary->IndexInParent() < container->IndexInParent()) { return !!(mRoot = nullptr); } if (boundary->IndexInParent() > container->IndexInParent()) { container->ToTextPoint(mEndContainer.StartAssignment(), &mEndOffset, false); static_cast<Accessible*>(mEndContainer)->AddRef(); } return true; }