Title: [283165] trunk/Source/WebCore
Revision
283165
Author
[email protected]
Date
2021-09-28 05:55:10 -0700 (Tue, 28 Sep 2021)

Log Message

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.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (283164 => 283165)


--- trunk/Source/WebCore/ChangeLog	2021-09-28 12:44:11 UTC (rev 283164)
+++ trunk/Source/WebCore/ChangeLog	2021-09-28 12:55:10 UTC (rev 283165)
@@ -1,3 +1,15 @@
+2021-09-28  Antti Koivisto  <[email protected]>
+
+        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  <[email protected]>
 
         override-color has been renamed to override-colors

Modified: trunk/Source/WebCore/editing/cocoa/DataDetection.mm (283164 => 283165)


--- trunk/Source/WebCore/editing/cocoa/DataDetection.mm	2021-09-28 12:44:11 UTC (rev 283164)
+++ trunk/Source/WebCore/editing/cocoa/DataDetection.mm	2021-09-28 12:55:10 UTC (rev 283165)
@@ -485,47 +485,49 @@
     }
 
     Vector<Vector<SimpleRange>> allResultRanges;
-    TextIterator iterator(contextRange);
-    CFIndex iteratorCount = 0;
+    {
+        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);
+        // 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());
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to