Title: [288773] trunk
Revision
288773
Author
akeer...@apple.com
Date
2022-01-28 17:23:54 -0800 (Fri, 28 Jan 2022)

Log Message

Add SPI to retrieve the rect of a found text range
https://bugs.webkit.org/show_bug.cgi?id=235830
rdar://88193004

Reviewed by Wenson Hsieh.

Source/WebKit:

Clients of found text ranges need a way to determine their position
in the web view. An asynchronous SPI is provided to support this need.
This information is not encoded in the text range itself, as the
position can change due to scrolling in sub-scrollable regions.
Consequently, the position must be obtained by communicating with the
WebProcess.

* UIProcess/API/Cocoa/WKWebViewPrivate.h:
* UIProcess/API/ios/WKWebViewIOS.mm:
(-[WKWebView _requestRectForFoundTextRange:completionHandler:]):
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::requestRectForFoundTextRange):
* UIProcess/WebPageProxy.h:
* UIProcess/ios/WKContentViewInteraction.h:
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView requestRectForFoundTextRange:completionHandler:]):
* WebProcess/WebPage/WebFoundTextRangeController.cpp:
(WebKit::WebFoundTextRangeController::requestRectForFoundTextRange):
* WebProcess/WebPage/WebFoundTextRangeController.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::requestRectForFoundTextRange):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:

Tools:

Added a test to verify the API works as expected.

The test uses an <iframe> to verify behavior for scrolled
<iframe>s.

* TestWebKitAPI/Tests/WebKitCocoa/FindInPage.mm:
(-[TestSearchAggregator initWithCompletionHandler:]):
(-[TestSearchAggregator foundRange:forSearchString:inDocument:]):
(-[TestSearchAggregator foundRanges]):
(-[TestSearchAggregator count]):
(TEST):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (288772 => 288773)


--- trunk/Source/WebKit/ChangeLog	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/ChangeLog	2022-01-29 01:23:54 UTC (rev 288773)
@@ -1,3 +1,35 @@
+2022-01-28  Aditya Keerthi  <akeer...@apple.com>
+
+        Add SPI to retrieve the rect of a found text range
+        https://bugs.webkit.org/show_bug.cgi?id=235830
+        rdar://88193004
+
+        Reviewed by Wenson Hsieh.
+
+        Clients of found text ranges need a way to determine their position
+        in the web view. An asynchronous SPI is provided to support this need.
+        This information is not encoded in the text range itself, as the
+        position can change due to scrolling in sub-scrollable regions.
+        Consequently, the position must be obtained by communicating with the
+        WebProcess.
+
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+        * UIProcess/API/ios/WKWebViewIOS.mm:
+        (-[WKWebView _requestRectForFoundTextRange:completionHandler:]):
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::requestRectForFoundTextRange):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/ios/WKContentViewInteraction.h:
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView requestRectForFoundTextRange:completionHandler:]):
+        * WebProcess/WebPage/WebFoundTextRangeController.cpp:
+        (WebKit::WebFoundTextRangeController::requestRectForFoundTextRange):
+        * WebProcess/WebPage/WebFoundTextRangeController.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::requestRectForFoundTextRange):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+
 2022-01-28  Brent Fulgham  <bfulg...@apple.com>
 
         Update CaptivePortal entitlements to support full GigaCage

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h (288772 => 288773)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h	2022-01-29 01:23:54 UTC (rev 288773)
@@ -445,6 +445,8 @@
 #if __has_include(<UIKit/_UIFindInteraction.h>)
 @property (nonatomic, readonly) _UIFindInteraction *_findInteraction WK_API_AVAILABLE(ios(WK_IOS_TBA));
 @property (nonatomic, readwrite, setter=_setFindInteractionEnabled:) BOOL _findInteractionEnabled WK_API_AVAILABLE(ios(WK_IOS_TBA));
+
+- (void)_requestRectForFoundTextRange:(UITextRange *)ranges completionHandler:(void (^)(CGRect))completionHandler WK_API_AVAILABLE(ios(WK_IOS_TBA));
 #endif
 
 #endif

Modified: trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm (288772 => 288773)


--- trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm	2022-01-29 01:23:54 UTC (rev 288773)
@@ -3553,6 +3553,11 @@
     [_contentView didEndTextSearchOperation];
 }
 
+- (void)_requestRectForFoundTextRange:(UITextRange *)ranges completionHandler:(void (^)(CGRect rect))completionHandler
+{
+    [_contentView requestRectForFoundTextRange:ranges completionHandler:completionHandler];
+}
+
 #endif // HAVE(UIFINDINTERACTION)
 
 @end // WKWebView (WKPrivateIOS)

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (288772 => 288773)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-01-29 01:23:54 UTC (rev 288773)
@@ -4316,6 +4316,11 @@
     send(Messages::WebPage::DidEndTextSearchOperation());
 }
 
+void WebPageProxy::requestRectForFoundTextRange(const WebFoundTextRange& range, CompletionHandler<void(WebCore::FloatRect)>&& callbackFunction)
+{
+    sendWithAsyncReply(Messages::WebPage::RequestRectForFoundTextRange(range), WTFMove(callbackFunction));
+}
+
 void WebPageProxy::getImageForFindMatch(int32_t matchIndex)
 {
     send(Messages::WebPage::GetImageForFindMatch(matchIndex));

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (288772 => 288773)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2022-01-29 01:23:54 UTC (rev 288773)
@@ -1221,6 +1221,8 @@
     void didBeginTextSearchOperation();
     void didEndTextSearchOperation();
 
+    void requestRectForFoundTextRange(const WebFoundTextRange&, CompletionHandler<void(WebCore::FloatRect)>&&);
+
     void getContentsAsString(ContentAsStringIncludesChildFrames, CompletionHandler<void(const String&)>&&);
 #if PLATFORM(COCOA)
     void getContentsAsAttributedString(CompletionHandler<void(const WebCore::AttributedString&)>&&);

Modified: trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h (288772 => 288773)


--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.h	2022-01-29 01:23:54 UTC (rev 288773)
@@ -777,6 +777,10 @@
 - (void)requestTextRecognition:(NSURL *)imageURL imageData:(const WebKit::ShareableBitmap::Handle&)imageData identifier:(NSString *)identifier completionHandler:(CompletionHandler<void(WebCore::TextRecognitionResult&&)>&&)completion;
 #endif
 
+#if HAVE(UIFINDINTERACTION)
+- (void)requestRectForFoundTextRange:(UITextRange *)range completionHandler:(void (^)(CGRect))completionHandler;
+#endif
+
 @end
 
 @interface WKContentView (WKTesting)

Modified: trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm (288772 => 288773)


--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm	2022-01-29 01:23:54 UTC (rev 288773)
@@ -10073,6 +10073,18 @@
     return [self offsetFromPosition:from toPosition:toPosition];
 }
 
+- (void)requestRectForFoundTextRange:(UITextRange *)range completionHandler:(void (^)(CGRect))completionHandler
+{
+    if (auto* foundTextRange = dynamic_objc_cast<WKFoundTextRange>(range)) {
+        _page->requestRectForFoundTextRange([foundTextRange webFoundTextRange], [completionHandler = makeBlockPtr(completionHandler)] (WebCore::FloatRect rect) {
+            completionHandler(rect);
+        });
+        return;
+    }
+
+    completionHandler(CGRectZero);
+}
+
 #endif // HAVE(UIFINDINTERACTION)
 
 #if ENABLE(IMAGE_ANALYSIS)

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebFoundTextRangeController.cpp (288772 => 288773)


--- trunk/Source/WebKit/WebProcess/WebPage/WebFoundTextRangeController.cpp	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebFoundTextRangeController.cpp	2022-01-29 01:23:54 UTC (rev 288773)
@@ -172,6 +172,18 @@
     m_findPageOverlay = nullptr;
 }
 
+void WebFoundTextRangeController::requestRectForFoundTextRange(const WebFoundTextRange& range, CompletionHandler<void(WebCore::FloatRect)>&& completionHandler)
+{
+    auto simpleRange = simpleRangeFromFoundTextRange(range);
+    if (!simpleRange) {
+        completionHandler({ });
+        return;
+    }
+
+    auto* frameView = simpleRange->startContainer().document().frame()->view();
+    completionHandler(frameView->contentsToRootView(unionRect(WebCore::RenderObject::absoluteTextRects(*simpleRange))));
+}
+
 void WebFoundTextRangeController::willMoveToPage(WebCore::PageOverlay&, WebCore::Page* page)
 {
     if (page)

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebFoundTextRangeController.h (288772 => 288773)


--- trunk/Source/WebKit/WebProcess/WebPage/WebFoundTextRangeController.h	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebFoundTextRangeController.h	2022-01-29 01:23:54 UTC (rev 288773)
@@ -62,6 +62,8 @@
     void didBeginTextSearchOperation();
     void didEndTextSearchOperation();
 
+    void requestRectForFoundTextRange(const WebFoundTextRange&, CompletionHandler<void(WebCore::FloatRect)>&&);
+
 private:
     // PageOverlay::Client.
     void willMoveToPage(WebCore::PageOverlay&, WebCore::Page*) override;

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (288772 => 288773)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2022-01-29 01:23:54 UTC (rev 288773)
@@ -4739,6 +4739,11 @@
     foundTextRangeController().didEndTextSearchOperation();
 }
 
+void WebPage::requestRectForFoundTextRange(const WebFoundTextRange& range, CompletionHandler<void(WebCore::FloatRect)>&& completionHandler)
+{
+    foundTextRangeController().requestRectForFoundTextRange(range, WTFMove(completionHandler));
+}
+
 void WebPage::getImageForFindMatch(uint32_t matchIndex)
 {
     findController().getImageForFindMatch(matchIndex);

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (288772 => 288773)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2022-01-29 01:23:54 UTC (rev 288773)
@@ -1766,6 +1766,8 @@
     void didBeginTextSearchOperation();
     void didEndTextSearchOperation();
 
+    void requestRectForFoundTextRange(const WebFoundTextRange&, CompletionHandler<void(WebCore::FloatRect)>&&);
+
 #if USE(COORDINATED_GRAPHICS)
     void sendViewportAttributesChanged(const WebCore::ViewportArguments&);
 #endif

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (288772 => 288773)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2022-01-29 01:23:54 UTC (rev 288773)
@@ -318,6 +318,8 @@
     ClearAllDecoratedFoundText();
     DidBeginTextSearchOperation();
     DidEndTextSearchOperation();
+
+    RequestRectForFoundTextRange(struct WebKit::WebFoundTextRange range) -> (WebCore::FloatRect rect) Async
     
     AddMIMETypeWithCustomContentProvider(String mimeType)
 

Modified: trunk/Tools/ChangeLog (288772 => 288773)


--- trunk/Tools/ChangeLog	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Tools/ChangeLog	2022-01-29 01:23:54 UTC (rev 288773)
@@ -1,3 +1,23 @@
+2022-01-28  Aditya Keerthi  <akeer...@apple.com>
+
+        Add SPI to retrieve the rect of a found text range
+        https://bugs.webkit.org/show_bug.cgi?id=235830
+        rdar://88193004
+
+        Reviewed by Wenson Hsieh.
+
+        Added a test to verify the API works as expected.
+
+        The test uses an <iframe> to verify behavior for scrolled
+        <iframe>s.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/FindInPage.mm:
+        (-[TestSearchAggregator initWithCompletionHandler:]):
+        (-[TestSearchAggregator foundRange:forSearchString:inDocument:]):
+        (-[TestSearchAggregator foundRanges]):
+        (-[TestSearchAggregator count]):
+        (TEST):
+
 2022-01-28  Elliott Williams  <e...@apple.com>
 
         [XCBuild] Small corrections to build-webkit and Makefile for workspace builds

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/FindInPage.mm (288772 => 288773)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/FindInPage.mm	2022-01-29 01:02:51 UTC (rev 288772)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/FindInPage.mm	2022-01-29 01:23:54 UTC (rev 288773)
@@ -340,6 +340,7 @@
 @interface TestSearchAggregator : NSObject <_UITextSearchAggregator>
 
 @property (readonly) NSUInteger count;
+@property (nonatomic, readonly) NSArray<UITextRange *> *foundRanges;
 
 - (instancetype)initWithCompletionHandler:(dispatch_block_t)completionHandler;
 
@@ -346,6 +347,7 @@
 @end
 
 @implementation TestSearchAggregator {
+    RetainPtr<NSMutableArray<UITextRange *>> _foundRanges;
     BlockPtr<void()> _completionHandler;
 }
 
@@ -354,7 +356,7 @@
     if (!(self = [super init]))
         return nil;
 
-    _count = 0;
+    _foundRanges = adoptNS([[NSMutableArray alloc] init]);
     _completionHandler = makeBlockPtr(completionHandler);
 
     return self;
@@ -362,7 +364,7 @@
 
 - (void)foundRange:(UITextRange *)range forSearchString:(NSString *)string inDocument:(_UITextSearchDocumentIdentifier)document
 {
-    _count++;
+    [_foundRanges addObject:range];
 }
 
 - (void)finishedSearching
@@ -371,6 +373,16 @@
         _completionHandler();
 }
 
+- (NSArray<UITextRange *>*)foundRanges
+{
+    return _foundRanges.get();
+}
+
+- (NSUInteger)count
+{
+    return [_foundRanges count];
+}
+
 @end
 
 static void testPerformTextSearchWithQueryStringInWebView(WKWebView *webView, NSString *query, TestTextSearchOptions *searchOptions, NSUInteger expectedMatches)
@@ -388,9 +400,25 @@
     EXPECT_EQ([aggregator count], expectedMatches);
 }
 
+static RetainPtr<NSArray<UITextRange *>> textRangesForQueryString(WKWebView *webView, NSString *query)
+{
+    __block bool finishedSearching = false;
+    auto aggregator = adoptNS([[TestSearchAggregator alloc] initWithCompletionHandler:^{
+        finishedSearching = true;
+    }]);
+
+    // FIXME: (rdar://86140914) Use _UITextSearchOptions directly when the symbol is exported.
+    auto options = adoptNS([[TestTextSearchOptions alloc] init]);
+    [webView performTextSearchWithQueryString:query usingOptions:(_UITextSearchOptions *)options.get() resultAggregator:aggregator.get()];
+
+    TestWebKitAPI::Util::run(&finishedSearching);
+
+    return adoptNS([[aggregator foundRanges] copy]);
+}
+
 TEST(WebKit, FindInPage)
 {
-    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]);
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]);
 
     NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"lots-of-text" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
     [webView loadRequest:request];
@@ -402,7 +430,7 @@
 
 TEST(WebKit, FindInPageCaseInsensitive)
 {
-    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]);
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]);
 
     NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"lots-of-text" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
     [webView loadRequest:request];
@@ -417,7 +445,7 @@
 
 TEST(WebKit, FindInPageStartsWith)
 {
-    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]);
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]);
 
     NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"lots-of-text" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
     [webView loadRequest:request];
@@ -436,7 +464,7 @@
 
 TEST(WebKit, FindInPageFullWord)
 {
-    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]);
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]);
 
     NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"lots-of-text" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
     [webView loadRequest:request];
@@ -454,7 +482,7 @@
 
 TEST(WebKit, FindInteraction)
 {
-    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]);
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]);
 
     EXPECT_NULL([webView _findInteraction]);
 
@@ -465,4 +493,36 @@
     EXPECT_NULL([webView _findInteraction]);
 }
 
+TEST(WebKit, RequestRectForFoundTextRange)
+{
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    [webView synchronouslyLoadHTMLString:@"<iframe srcdoc='<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tellus in metus vulputate eu scelerisque felis imperdiet. Mi quis hendrerit dolor magna eget est lorem ipsum dolor. In cursus turpis massa tincidunt dui ut ornare. Sapien et ligula ullamcorper malesuada. Maecenas volutpat blandit aliquam etiam erat. Turpis egestas integer eget aliquet nibh praesent tristique. Ipsum dolor sit amet consectetur adipiscing. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra. Sem fringilla ut morbi tincidunt augue interdum velit euismod. Habitant morbi tristique senectus et netus. Aenean euismod elementum nisi quis. Facilisi nullam vehicula ipsum a. Elementum facilisis leo vel fringilla. Molestie nunc non blandit massa enim. Orci ac auctor augue mauris. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Magnis dis par
 turient montes nascetur ridiculus mus mauris vitae. Id leo in vitae turpis massa sed. Netus et malesuada fames ac turpis egestas sed tempus. Morbi quis commodo odio aenean sed adipiscing diam donec. Sit amet purus gravida quis blandit turpis. Odio euismod lacinia at quis risus sed vulputate. Varius duis at consectetur lorem donec massa. Sit amet consectetur adipiscing elit pellentesque habitant. Feugiat in fermentum posuere urna nec tincidunt praesent.</p>'></iframe>"];
+
+    auto ranges = textRangesForQueryString(webView.get(), @"Sapien");
+
+    __block bool done = false;
+    [webView _requestRectForFoundTextRange:[ranges firstObject] completionHandler:^(CGRect rect) {
+        EXPECT_TRUE(CGRectEqualToRect(rect, CGRectMake(252, 146, 44, 19)));
+        done = true;
+    }];
+    TestWebKitAPI::Util::run(&done);
+
+    ranges = textRangesForQueryString(webView.get(), @"fermentum");
+
+    done = false;
+    [webView _requestRectForFoundTextRange:[ranges firstObject] completionHandler:^(CGRect rect) {
+        EXPECT_TRUE(CGRectEqualToRect(rect, CGRectMake(229, 646, 72, 19)));
+        done = true;
+    }];
+    TestWebKitAPI::Util::run(&done);
+
+    [webView scrollRangeToVisible:[ranges firstObject] inDocument:nil];
+    done = false;
+    [webView _requestRectForFoundTextRange:[ranges firstObject] completionHandler:^(CGRect rect) {
+        EXPECT_TRUE(CGRectEqualToRect(rect, CGRectMake(229, 104, 72, 19)));
+        done = true;
+    }];
+    TestWebKitAPI::Util::run(&done);
+}
+
 #endif // HAVE(UIFINDINTERACTION)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to