Title: [271507] trunk
Revision
271507
Author
[email protected]
Date
2021-01-14 18:00:26 -0800 (Thu, 14 Jan 2021)

Log Message

[Cocoa] Strip DataDetectors links when copying content to the pasteboard
https://bugs.webkit.org/show_bug.cgi?id=220526
<rdar://problem/71045590>

Reviewed by Ryosuke Niwa.

Source/WebCore:

Currently, when DataDetectors links are written to the pasteboard when
copied. This is problematic, since clicking on a DataDetector link
outside of a valid context results in an attempt to open an invalid
URL. Instead, DataDetectors links should be stripped when copied.

To remove the link, while preserving any custom styles, the <a> element
created by Data Detection is replaced with a <span> element. Any
attributes and styles added by WebKit are removed as a part of this
transformation.

Tests: editing/pasteboard/copy-paste-data-detected-links.html
       CopyRTF.StripsDataDetectedLinks
       PasteWebArchive.StripsDataDetectedLinks

* editing/cocoa/DataDetection.h:
* editing/cocoa/DataDetection.mm:
(WebCore::DataDetection::isDataDetectorElement):

Add a helper to check if an element was created through Data Detection.

* editing/cocoa/HTMLConverter.mm:
(HTMLConverter::_addLinkForElement):

Do not add NSLinkAttributeName for DataDetectors links.

(HTMLConverter::_exitElement):

Factor out link creation logic.

* editing/markup.cpp:
(WebCore::StyledMarkupAccumulator::spanReplacementForElement):

Centralize the logic that determines whether or not an element should
be replaced by a <span>. Previously, this only applied to <slot>
elements. Now, it applies to <slot> and DataDetectors links.

(WebCore::StyledMarkupAccumulator::appendStartTag):

If the element was created through DataDetection, append a <span>
rather than an <a>, to drop the link. The DataDetectors and href
attributes are also dropped from the markup string. Finally, remove
the text decoration style that was added by WebKit to style the
DataDetectors link.

(WebCore::StyledMarkupAccumulator::appendEndTag):

Consult shouldReplaceElementWithSpan when appending the end tag.

Tools:

Added API tests to verify DataDetectors links are not preserved when
copying/pasting WebArchives and rich text.

* TestWebKitAPI/Tests/WebKitCocoa/CopyRTF.mm:
(StripsDataDetectorsLinks):
* TestWebKitAPI/Tests/WebKitCocoa/PasteWebArchive.mm:
(StripsDataDetectorsLinks):

LayoutTests:

Added a test which copies content containing two data detected links
and verifies that the links are removed.

* editing/pasteboard/copy-paste-data-detected-links-expected.txt: Added.
* editing/pasteboard/copy-paste-data-detected-links.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (271506 => 271507)


--- trunk/LayoutTests/ChangeLog	2021-01-15 00:58:01 UTC (rev 271506)
+++ trunk/LayoutTests/ChangeLog	2021-01-15 02:00:26 UTC (rev 271507)
@@ -1,3 +1,17 @@
+2021-01-14  Aditya Keerthi  <[email protected]>
+
+        [Cocoa] Strip DataDetectors links when copying content to the pasteboard
+        https://bugs.webkit.org/show_bug.cgi?id=220526
+        <rdar://problem/71045590>
+
+        Reviewed by Ryosuke Niwa.
+
+        Added a test which copies content containing two data detected links
+        and verifies that the links are removed.
+
+        * editing/pasteboard/copy-paste-data-detected-links-expected.txt: Added.
+        * editing/pasteboard/copy-paste-data-detected-links.html: Added.
+
 2021-01-14  Youenn Fablet  <[email protected]>
 
         MediaSessionManager should update its state as soon as an audio capture track is ended

Added: trunk/LayoutTests/editing/pasteboard/copy-paste-data-detected-links-expected.txt (0 => 271507)


--- trunk/LayoutTests/editing/pasteboard/copy-paste-data-detected-links-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/editing/pasteboard/copy-paste-data-detected-links-expected.txt	2021-01-15 02:00:26 UTC (rev 271507)
@@ -0,0 +1,12 @@
+This tests copy/paste of content containing data-detected links.
+| "Meeting "
+| <span>
+|   dir="ltr"
+|   style="font-weight: bold;"
+|   "on Friday 11/6 at 4pm"
+| " "
+| "at"
+| " "
+| <span>
+|   dir="ltr"
+|   "1 Apple Park Way, Cupertino CA<#selection-caret>"

Added: trunk/LayoutTests/editing/pasteboard/copy-paste-data-detected-links.html (0 => 271507)


--- trunk/LayoutTests/editing/pasteboard/copy-paste-data-detected-links.html	                        (rev 0)
+++ trunk/LayoutTests/editing/pasteboard/copy-paste-data-detected-links.html	2021-01-15 02:00:26 UTC (rev 271507)
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<body>
+<p>This tests copy/paste of content containing data-detected links.</p>
+<div id="copy" contenteditable="true">
+    <span>Meeting <a href="" dir="ltr" x-apple-data-detectors="true" x-apple-data-detectors-type="calendar-event" x-apple-data-detectors-result="0" style="color: currentcolor; text-decoration-color: rgba(128, 128, 128, 0.38); font-weight: bold;">on Friday 11/6 at 4pm</a> at <a href="" dir="ltr" x-apple-data-detectors="true" x-apple-data-detectors-type="address" x-apple-data-detectors-result="1" style="color: currentcolor; text-decoration-color: rgba(128, 128, 128, 0.38);">1 Apple Park Way, Cupertino CA</a>
+    </span>
+</div>
+<div id="paste" contenteditable="true"></div>
+<script src=""
+<script>
+var copy = document.getElementById("copy");
+copy.focus();
+document.execCommand("SelectAll");
+document.execCommand("Copy");
+
+var paste = document.getElementById("paste");
+paste.focus();
+document.execCommand("Paste");
+
+Markup.description(document.getElementsByTagName('p')[0].textContent);
+Markup.dump('paste');
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (271506 => 271507)


--- trunk/Source/WebCore/ChangeLog	2021-01-15 00:58:01 UTC (rev 271506)
+++ trunk/Source/WebCore/ChangeLog	2021-01-15 02:00:26 UTC (rev 271507)
@@ -1,3 +1,59 @@
+2021-01-14  Aditya Keerthi  <[email protected]>
+
+        [Cocoa] Strip DataDetectors links when copying content to the pasteboard
+        https://bugs.webkit.org/show_bug.cgi?id=220526
+        <rdar://problem/71045590>
+
+        Reviewed by Ryosuke Niwa.
+
+        Currently, when DataDetectors links are written to the pasteboard when
+        copied. This is problematic, since clicking on a DataDetector link
+        outside of a valid context results in an attempt to open an invalid
+        URL. Instead, DataDetectors links should be stripped when copied.
+
+        To remove the link, while preserving any custom styles, the <a> element
+        created by Data Detection is replaced with a <span> element. Any
+        attributes and styles added by WebKit are removed as a part of this
+        transformation.
+
+        Tests: editing/pasteboard/copy-paste-data-detected-links.html
+               CopyRTF.StripsDataDetectedLinks
+               PasteWebArchive.StripsDataDetectedLinks
+
+        * editing/cocoa/DataDetection.h:
+        * editing/cocoa/DataDetection.mm:
+        (WebCore::DataDetection::isDataDetectorElement):
+
+        Add a helper to check if an element was created through Data Detection.
+
+        * editing/cocoa/HTMLConverter.mm:
+        (HTMLConverter::_addLinkForElement):
+
+        Do not add NSLinkAttributeName for DataDetectors links.
+
+        (HTMLConverter::_exitElement):
+
+        Factor out link creation logic.
+
+        * editing/markup.cpp:
+        (WebCore::StyledMarkupAccumulator::spanReplacementForElement):
+
+        Centralize the logic that determines whether or not an element should
+        be replaced by a <span>. Previously, this only applied to <slot>
+        elements. Now, it applies to <slot> and DataDetectors links.
+
+        (WebCore::StyledMarkupAccumulator::appendStartTag):
+
+        If the element was created through DataDetection, append a <span>
+        rather than an <a>, to drop the link. The DataDetectors and href
+        attributes are also dropped from the markup string. Finally, remove
+        the text decoration style that was added by WebKit to style the
+        DataDetectors link.
+
+        (WebCore::StyledMarkupAccumulator::appendEndTag):
+
+        Consult shouldReplaceElementWithSpan when appending the end tag.
+
 2021-01-14  Peng Liu  <[email protected]>
 
         Add a quirk to disable "return to element fullscreen from picture-in-picture" for some sites

Modified: trunk/Source/WebCore/editing/cocoa/DataDetection.h (271506 => 271507)


--- trunk/Source/WebCore/editing/cocoa/DataDetection.h	2021-01-15 00:58:01 UTC (rev 271506)
+++ trunk/Source/WebCore/editing/cocoa/DataDetection.h	2021-01-15 02:00:26 UTC (rev 271507)
@@ -40,6 +40,7 @@
 namespace WebCore {
 
 class HitTestResult;
+class QualifiedName;
 
 struct DetectedItem {
     RetainPtr<DDActionContext> actionContext;
@@ -64,6 +65,8 @@
 
     static const String& dataDetectorURLProtocol();
     static bool isDataDetectorURL(const URL&);
+    static bool isDataDetectorAttribute(const QualifiedName&);
+    static bool isDataDetectorElement(const Element&);
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/editing/cocoa/DataDetection.mm (271506 => 271507)


--- trunk/Source/WebCore/editing/cocoa/DataDetection.mm	2021-01-15 00:58:01 UTC (rev 271506)
+++ trunk/Source/WebCore/editing/cocoa/DataDetection.mm	2021-01-15 02:00:26 UTC (rev 271507)
@@ -42,6 +42,7 @@
 #import "HitTestResult.h"
 #import "NodeList.h"
 #import "NodeTraversal.h"
+#import "QualifiedName.h"
 #import "Range.h"
 #import "RenderObject.h"
 #import "StyleProperties.h"
@@ -654,6 +655,28 @@
     return url.protocolIs(dataDetectorURLProtocol());
 }
 
+bool DataDetection::isDataDetectorAttribute(const QualifiedName& name)
+{
+    if (name == x_apple_data_detectorsAttr)
+        return true;
+
+    if (name == x_apple_data_detectors_resultAttr)
+        return true;
+
+    if (name == x_apple_data_detectors_typeAttr)
+        return true;
+
+    if (name == hrefAttr)
+        return true;
+
+    return false;
+}
+
+bool DataDetection::isDataDetectorElement(const Element& element)
+{
+    return is<HTMLAnchorElement>(element) && equalIgnoringASCIICase(element.attributeWithoutSynchronization(x_apple_data_detectorsAttr), "true");
+}
+
 } // namespace WebCore
 
 #endif

Modified: trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm (271506 => 271507)


--- trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm	2021-01-15 00:58:01 UTC (rev 271506)
+++ trunk/Source/WebCore/editing/cocoa/HTMLConverter.mm	2021-01-15 02:00:26 UTC (rev 271507)
@@ -68,6 +68,10 @@
 #import <wtf/ASCIICType.h>
 #import <wtf/text/StringBuilder.h>
 
+#if ENABLE(DATA_DETECTION)
+#import "DataDetection.h"
+#endif
+
 #if PLATFORM(IOS_FAMILY)
 
 #import "WAKAppKitStubs.h"
@@ -343,7 +347,8 @@
     
     void _processHeadElement(Element&);
     void _processMetaElementWithName(NSString *name, NSString *content);
-    
+
+    void _addLinkForElement(Element&, NSRange);
     void _addTableForElement(Element* tableElement);
     void _addTableCellForElement(Element* tableCellElement);
     void _addMarkersToList(NSTextList *list, NSRange range);
@@ -1632,6 +1637,25 @@
     return NO;
 }
 
+void HTMLConverter::_addLinkForElement(Element& element, NSRange range)
+{
+#if ENABLE(DATA_DETECTION)
+    if (DataDetection::isDataDetectorElement(element))
+        return;
+#endif
+
+    NSString *urlString = element.getAttribute(hrefAttr);
+    NSString *strippedString = [urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
+    if (urlString && [urlString length] > 0 && strippedString && [strippedString length] > 0 && ![strippedString hasPrefix:@"#"]) {
+        NSURL *url = ""
+        if (!url)
+            url = ""
+        if (!url)
+            url = "" _web_URLWithString:strippedString relativeToURL:_baseURL];
+        [_attrStr addAttribute:NSLinkAttributeName value:url ? (id)url : (id)urlString range:range];
+    }
+}
+
 void HTMLConverter::_addTableForElement(Element *tableElement)
 {
     RetainPtr<NSTextTable> table = adoptNS([(NSTextTable *)[PlatformNSTextTable alloc] init]);
@@ -1963,18 +1987,8 @@
 {
     String displayValue = _caches->propertyValueForNode(element, CSSPropertyDisplay);
     NSRange range = NSMakeRange(startIndex, [_attrStr length] - startIndex);
-    if (range.length > 0 && element.hasTagName(aTag)) {
-        NSString *urlString = element.getAttribute(hrefAttr);
-        NSString *strippedString = [urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
-        if (urlString && [urlString length] > 0 && strippedString && [strippedString length] > 0 && ![strippedString hasPrefix:@"#"]) {
-            NSURL *url = ""
-            if (!url)
-                url = ""
-            if (!url)
-                url = "" _web_URLWithString:strippedString relativeToURL:_baseURL];
-            [_attrStr addAttribute:NSLinkAttributeName value:url ? (id)url : (id)urlString range:range];
-        }
-    }
+    if (range.length > 0 && element.hasTagName(aTag))
+        _addLinkForElement(element, range);
     if (!_flags.reachedEnd && _caches->isBlockElement(element)) {
         [_writingDirectionArray removeAllObjects];
         if (displayValue == "table-cell" && [_textBlocks count] == 0) {

Modified: trunk/Source/WebCore/editing/markup.cpp (271506 => 271507)


--- trunk/Source/WebCore/editing/markup.cpp	2021-01-15 00:58:01 UTC (rev 271506)
+++ trunk/Source/WebCore/editing/markup.cpp	2021-01-15 02:00:26 UTC (rev 271507)
@@ -82,6 +82,10 @@
 #include <wtf/URLParser.h>
 #include <wtf/text/StringBuilder.h>
 
+#if ENABLE(DATA_DETECTION)
+#include "DataDetection.h"
+#endif
+
 namespace WebCore {
 
 using namespace HTMLNames;
@@ -256,6 +260,15 @@
 
     bool shouldPreserveMSOListStyleForElement(const Element&);
 
+    enum class SpanReplacementType : uint8_t {
+        None,
+        Slot,
+#if ENABLE(DATA_DETECTION)
+        DataDetector,
+#endif
+    };
+    SpanReplacementType spanReplacementForElement(const Element&);
+
     void appendStartTag(StringBuilder& out, const Element&, bool addDisplayInline, RangeFullySelectsNode);
     void appendEndTag(StringBuilder& out, const Element&) override;
     void appendCustomAttributes(StringBuilder&, const Element&, Namespaces*) override;
@@ -506,11 +519,25 @@
     return false;
 }
 
+StyledMarkupAccumulator::SpanReplacementType StyledMarkupAccumulator::spanReplacementForElement(const Element& element)
+{
+    if (is<HTMLSlotElement>(element))
+        return SpanReplacementType::Slot;
+
+#if ENABLE(DATA_DETECTION)
+    if (DataDetection::isDataDetectorElement(element))
+        return SpanReplacementType::DataDetector;
+#endif
+
+    return SpanReplacementType::None;
+}
+
 void StyledMarkupAccumulator::appendStartTag(StringBuilder& out, const Element& element, bool addDisplayInline, RangeFullySelectsNode rangeFullySelectsNode)
 {
     const bool documentIsHTML = element.document().isHTMLDocument();
-    const bool isSlotElement = is<HTMLSlotElement>(element);
-    if (UNLIKELY(isSlotElement))
+
+    auto replacementType = spanReplacementForElement(element);
+    if (UNLIKELY(replacementType != SpanReplacementType::None))
         out.append("<span");
     else
         appendOpenTag(out, element, nullptr);
@@ -518,7 +545,7 @@
     appendCustomAttributes(out, element, nullptr);
 
     const bool shouldAnnotateOrForceInline = element.isHTMLElement() && (shouldAnnotate() || addDisplayInline);
-    bool shouldOverrideStyleAttr = (shouldAnnotateOrForceInline || shouldApplyWrappingStyle(element) || isSlotElement) && !shouldPreserveMSOListStyleForElement(element);
+    bool shouldOverrideStyleAttr = (shouldAnnotateOrForceInline || shouldApplyWrappingStyle(element) || replacementType != SpanReplacementType::None) && !shouldPreserveMSOListStyleForElement(element);
     if (element.hasAttributes()) {
         for (const Attribute& attribute : element.attributesIterator()) {
             // We'll handle the style attribute separately, below.
@@ -526,6 +553,10 @@
                 continue;
             if (element.isEventHandlerAttribute(attribute) || element.isJavaScriptURLAttribute(attribute))
                 continue;
+#if ENABLE(DATA_DETECTION)
+            if (replacementType == SpanReplacementType::DataDetector && DataDetection::isDataDetectorAttribute(attribute.name()))
+                continue;
+#endif
             appendAttribute(out, element, attribute, 0);
         }
     }
@@ -540,12 +571,17 @@
         } else
             newInlineStyle = EditingStyle::create();
 
-        if (isSlotElement)
+        if (replacementType == SpanReplacementType::Slot)
             newInlineStyle->addDisplayContents();
 
         if (is<StyledElement>(element) && downcast<StyledElement>(element).inlineStyle())
             newInlineStyle->overrideWithStyle(*downcast<StyledElement>(element).inlineStyle());
 
+#if ENABLE(DATA_DETECTION)
+        if (replacementType == SpanReplacementType::DataDetector && newInlineStyle->style())
+            newInlineStyle->style()->removeProperty(CSSPropertyTextDecorationColor);
+#endif
+
         if (shouldAnnotateOrForceInline) {
             if (shouldAnnotate())
                 newInlineStyle->mergeStyleFromRulesForSerialization(downcast<HTMLElement>(*const_cast<Element*>(&element)), m_standardFontFamilySerializationMode);
@@ -576,7 +612,7 @@
 
 void StyledMarkupAccumulator::appendEndTag(StringBuilder& out, const Element& element)
 {
-    if (UNLIKELY(is<HTMLSlotElement>(element)))
+    if (UNLIKELY(spanReplacementForElement(element) != SpanReplacementType::None))
         out.append("</span>");
     else
         MarkupAccumulator::appendEndTag(out, element);

Modified: trunk/Tools/ChangeLog (271506 => 271507)


--- trunk/Tools/ChangeLog	2021-01-15 00:58:01 UTC (rev 271506)
+++ trunk/Tools/ChangeLog	2021-01-15 02:00:26 UTC (rev 271507)
@@ -1,3 +1,19 @@
+2021-01-14  Aditya Keerthi  <[email protected]>
+
+        [Cocoa] Strip DataDetectors links when copying content to the pasteboard
+        https://bugs.webkit.org/show_bug.cgi?id=220526
+        <rdar://problem/71045590>
+
+        Reviewed by Ryosuke Niwa.
+
+        Added API tests to verify DataDetectors links are not preserved when
+        copying/pasting WebArchives and rich text.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/CopyRTF.mm:
+        (StripsDataDetectorsLinks):
+        * TestWebKitAPI/Tests/WebKitCocoa/PasteWebArchive.mm:
+        (StripsDataDetectorsLinks):
+
 2021-01-14  Jonathan Bedard  <[email protected]>
 
         [webkitscmpy] Add GitHub credentials

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CopyRTF.mm (271506 => 271507)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CopyRTF.mm	2021-01-15 00:58:01 UTC (rev 271506)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/CopyRTF.mm	2021-01-15 02:00:26 UTC (rev 271507)
@@ -140,4 +140,27 @@
     EXPECT_EQ(i, 3UL);
 }
 
+#if ENABLE(DATA_DETECTION)
+
+TEST(CopyRTF, StripsDataDetectorsLinks)
+{
+    auto attributedString = copyAttributedStringFromHTML(@"<a href="" <a href="" dir=\"ltr\" x-apple-data-detectors=\"true\" x-apple-data-detectors-type=\"calendar-event\" x-apple-data-detectors-result=\"0\" style=\"color: currentcolor; text-decoration-color: rgba(128, 128, 128, 0.38);\">on Friday 11/6 at 4pm</a>", false);
+
+    __block size_t i = 0;
+    [attributedString enumerateAttribute:NSLinkAttributeName inRange:NSMakeRange(0, [attributedString length]) options:0 usingBlock:^(id value, NSRange attributeRange, BOOL *stop) {
+        if (!i)
+            EXPECT_NOT_NULL(value);
+        else if (i == 1)
+            EXPECT_NULL(value);
+        else
+            FAIL();
+
+        ++i;
+    }];
+
+    EXPECT_EQ(i, 2UL);
+}
+
+#endif // ENABLE(DATA_DETECTION)
+
 #endif // PLATFORM(COCOA)

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteWebArchive.mm (271506 => 271507)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteWebArchive.mm	2021-01-15 00:58:01 UTC (rev 271506)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PasteWebArchive.mm	2021-01-15 02:00:26 UTC (rev 271507)
@@ -262,6 +262,27 @@
     EXPECT_WK_STREQ("rgb(255, 0, 0)", [webView stringByEvaluatingJavaScript:@"getComputedStyle(document.querySelector('strong')).color"]);
 }
 
+#if ENABLE(DATA_DETECTION)
+
+TEST(PasteWebArchive, StripsDataDetectorsLinks)
+{
+    auto* url = "" URLWithString:@"file:///some-file.html"];
+    auto* markup = [@"<!DOCTYPE html><html><body><span>Meeting <a href="" dir=\"ltr\" x-apple-data-detectors=\"true\" x-apple-data-detectors-type=\"calendar-event\" x-apple-data-detectors-result=\"0\" style=\"color: currentcolor; text-decoration-color: rgba(128, 128, 128, 0.38); font-weight: bold;\">on Friday 11/6 at 4pm</a> at <a href="" dir=\"ltr\" x-apple-data-detectors=\"true\" x-apple-data-detectors-type=\"address\" x-apple-data-detectors-result=\"1\" style=\"color: currentcolor; text-decoration-color: rgba(128, 128, 128, 0.38);\">1 Apple Park Way, Cupertino CA</a></span></body></html>" dataUsingEncoding:NSUTF8StringEncoding];
+    auto mainResource = adoptNS([[WebResource alloc] initWithData:markup URL:url MIMEType:@"text/html" textEncodingName:@"utf-8" frameName:nil]);
+    auto archive = adoptNS([[WebArchive alloc] initWithMainResource:mainResource.get() subresources:nil subframeArchives:nil]);
+
+    [[NSPasteboard generalPasteboard] declareTypes:@[WebArchivePboardType] owner:nil];
+    [[NSPasteboard generalPasteboard] setData:[archive data] forType:WebArchivePboardType];
+
+    auto webView = createWebViewWithCustomPasteboardDataEnabled();
+    [webView synchronouslyLoadTestPageNamed:@"paste-rtfd"];
+    [webView paste:nil];
+
+    EXPECT_WK_STREQ("Meeting&nbsp;<span dir=\"ltr\" style=\"font-weight: bold;\">on Friday 11/6 at 4pm</span>&nbsp;at&nbsp;<span dir=\"ltr\">1 Apple Park Way, Cupertino CA</span>", [webView stringByEvaluatingJavaScript:@"editor.innerHTML"]);
+}
+
+#endif // ENABLE(DATA_DETECTION)
+
 #endif // PLATFORM(MAC)
 
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to