in lib/src/context.dart [569:612]
_PathRelation _isWithinOrEquals(String parent, String child) {
// Make both paths the same level of relative. We're only able to do the
// quick comparison if both paths are in the same format, and making a path
// absolute is faster than making it relative.
final parentIsAbsolute = isAbsolute(parent);
final childIsAbsolute = isAbsolute(child);
if (parentIsAbsolute && !childIsAbsolute) {
child = absolute(child);
if (style.isRootRelative(parent)) parent = absolute(parent);
} else if (childIsAbsolute && !parentIsAbsolute) {
parent = absolute(parent);
if (style.isRootRelative(child)) child = absolute(child);
} else if (childIsAbsolute && parentIsAbsolute) {
final childIsRootRelative = style.isRootRelative(child);
final parentIsRootRelative = style.isRootRelative(parent);
if (childIsRootRelative && !parentIsRootRelative) {
child = absolute(child);
} else if (parentIsRootRelative && !childIsRootRelative) {
parent = absolute(parent);
}
}
final result = _isWithinOrEqualsFast(parent, child);
if (result != _PathRelation.inconclusive) return result;
String relative;
try {
relative = this.relative(child, from: parent);
} on PathException catch (_) {
// If no relative path from [parent] to [child] is found, [child]
// definitely isn't a child of [parent].
return _PathRelation.different;
}
if (!isRelative(relative)) return _PathRelation.different;
if (relative == '.') return _PathRelation.equal;
if (relative == '..') return _PathRelation.different;
return (relative.length >= 3 &&
relative.startsWith('..') &&
style.isSeparator(relative.codeUnitAt(2)))
? _PathRelation.different
: _PathRelation.within;
}