Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
REGRESSION(r283158): TestWebKitAPI.WebKit.AddAndRemoveDataDetectors i…
…s crashing on iOS

https://bugs.webkit.org/show_bug.cgi?id=230890

Unreviewed.


* editing/cocoa/DataDetection.mm:
(WebCore::DataDetection::detectContentInRange):

Scope TextIterator so it is not in stack when DOM is being mutated.


Canonical link: https://commits.webkit.org/242213@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@283165 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
anttijk committed Sep 28, 2021
1 parent a8bae21 commit 934d947
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 37 deletions.
12 changes: 12 additions & 0 deletions Source/WebCore/ChangeLog
@@ -1,3 +1,15 @@
2021-09-28 Antti Koivisto <antti@apple.com>

REGRESSION(r283158): TestWebKitAPI.WebKit.AddAndRemoveDataDetectors is crashing on iOS
https://bugs.webkit.org/show_bug.cgi?id=230890

Unreviewed.

* editing/cocoa/DataDetection.mm:
(WebCore::DataDetection::detectContentInRange):

Scope TextIterator so it is not in stack when DOM is being mutated.

2021-09-27 Myles C. Maxfield <mmaxfield@apple.com>

override-color has been renamed to override-colors
Expand Down
76 changes: 39 additions & 37 deletions Source/WebCore/editing/cocoa/DataDetection.mm
Expand Up @@ -485,47 +485,49 @@ static inline CFComparisonResult queryOffsetCompare(DDQueryOffset o1, DDQueryOff
}

Vector<Vector<SimpleRange>> allResultRanges;
TextIterator iterator(contextRange);
CFIndex iteratorCount = 0;

// Iterate through the array of the expanded results to create a vector of Range objects that indicate
// where the DOM needs to be modified.
// Each result can be contained all in one text node or can span multiple text nodes.
for (auto& result : allResults) {
DDQueryRange queryRange = PAL::softLink_DataDetectorsCore_DDResultGetQueryRangeForURLification(result.get());
CFIndex iteratorTargetAdvanceCount = (CFIndex)PAL::softLink_DataDetectorsCore_DDScanQueryGetFragmentMetaData(scanQuery.get(), queryRange.start.queryIndex);
for (; iteratorCount < iteratorTargetAdvanceCount; ++iteratorCount)
iterator.advance();

Vector<SimpleRange> fragmentRanges;
CFIndex fragmentIndex = queryRange.start.queryIndex;
if (fragmentIndex == queryRange.end.queryIndex) {
CharacterRange fragmentRange;
fragmentRange.location = queryRange.start.offset;
fragmentRange.length = queryRange.end.offset - queryRange.start.offset;
fragmentRanges.append(resolveCharacterRange(iterator.range(), fragmentRange));
} else {
auto range = iterator.range();
range.start.offset += queryRange.start.offset;
fragmentRanges.append(range);
}

while (fragmentIndex < queryRange.end.queryIndex) {
++fragmentIndex;
iteratorTargetAdvanceCount = (CFIndex)PAL::softLink_DataDetectorsCore_DDScanQueryGetFragmentMetaData(scanQuery.get(), fragmentIndex);
{
TextIterator iterator(contextRange);
CFIndex iteratorCount = 0;

// Iterate through the array of the expanded results to create a vector of Range objects that indicate
// where the DOM needs to be modified.
// Each result can be contained all in one text node or can span multiple text nodes.
for (auto& result : allResults) {
DDQueryRange queryRange = PAL::softLink_DataDetectorsCore_DDResultGetQueryRangeForURLification(result.get());
CFIndex iteratorTargetAdvanceCount = (CFIndex)PAL::softLink_DataDetectorsCore_DDScanQueryGetFragmentMetaData(scanQuery.get(), queryRange.start.queryIndex);
for (; iteratorCount < iteratorTargetAdvanceCount; ++iteratorCount)
iterator.advance();

auto fragmentRange = iterator.range();
if (fragmentIndex == queryRange.end.queryIndex)
fragmentRange.end.offset = fragmentRange.start.offset + queryRange.end.offset;
auto& previousRange = fragmentRanges.last();
if (previousRange.start.container.ptr() == fragmentRange.start.container.ptr())
previousRange.end = fragmentRange.end;
else
fragmentRanges.append(fragmentRange);
Vector<SimpleRange> fragmentRanges;
CFIndex fragmentIndex = queryRange.start.queryIndex;
if (fragmentIndex == queryRange.end.queryIndex) {
CharacterRange fragmentRange;
fragmentRange.location = queryRange.start.offset;
fragmentRange.length = queryRange.end.offset - queryRange.start.offset;
fragmentRanges.append(resolveCharacterRange(iterator.range(), fragmentRange));
} else {
auto range = iterator.range();
range.start.offset += queryRange.start.offset;
fragmentRanges.append(range);
}

while (fragmentIndex < queryRange.end.queryIndex) {
++fragmentIndex;
iteratorTargetAdvanceCount = (CFIndex)PAL::softLink_DataDetectorsCore_DDScanQueryGetFragmentMetaData(scanQuery.get(), fragmentIndex);
for (; iteratorCount < iteratorTargetAdvanceCount; ++iteratorCount)
iterator.advance();

auto fragmentRange = iterator.range();
if (fragmentIndex == queryRange.end.queryIndex)
fragmentRange.end.offset = fragmentRange.start.offset + queryRange.end.offset;
auto& previousRange = fragmentRanges.last();
if (previousRange.start.container.ptr() == fragmentRange.start.container.ptr())
previousRange.end = fragmentRange.end;
else
fragmentRanges.append(fragmentRange);
}
allResultRanges.append(WTFMove(fragmentRanges));
}
allResultRanges.append(WTFMove(fragmentRanges));
}

auto tz = adoptCF(CFTimeZoneCopyDefault());
Expand Down

0 comments on commit 934d947

Please sign in to comment.