<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[182085] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/182085">182085</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2015-03-27 15:04:55 -0700 (Fri, 27 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Implement iOS WebKit2 PDF Find-in-Page
https://bugs.webkit.org/show_bug.cgi?id=143065
&lt;rdar://problem/16793370&gt;

Reviewed by Dan Bernstein.

* Platform/spi/ios/CorePDFSPI.h:
Add some SPI.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _countStringMatches:options:maxCount:]):
(-[WKWebView _findString:options:maxCount:]):
(-[WKWebView _hideFindUI]):
If we have a custom content view, forward find-in-page methods to it.

* UIProcess/API/Cocoa/WKWebViewPrivate.h:
* UIProcess/API/Cocoa/_WKFindOptions.h:
Move _WKFindOptions into its own file.

* UIProcess/Cocoa/WKWebViewContentProvider.h:
Add find-related methods to the WKWebViewContentProvider protocol.

* UIProcess/ios/WKPDFView.mm:
(-[WKPDFView web_initWithFrame:webView:]):
(-[WKPDFView dealloc]):
Maintain a dispatch queue for searching the PDF.

(-[WKPDFView web_setContentProviderData:suggestedFilename:]):
Fix a type.

(-[WKPDFView _ensureViewForPage:]):
Split the code to create/parent a page view out from _revalidateViews,
so that the find code can create/parent the targetted UIPDFPageView
in order to install the find highlight in it, but before it is scrolled into view.

(-[WKPDFView _revalidateViews]):
Use the stored page index instead of counting again.
Don't unparent page views that have find-in-page highlights in them, because
we won't know enough to recreate them later.

(-[WKPDFView _computePageAndDocumentFrames]):
Put the page index in PDFPageInfo, for reference elsewhere.

(-[WKPDFView _stringCompareOptionsFromWKFindOptions:]):
(-[WKPDFView _computeMatchesForString:options:maxCount:completionHandler:]):
Asynchronously (and on our serial queue) search the PDF for the given string.
We'll cache the most recent results to avoid searching more than once,
cancel existing searches when another begins (since it's a serial queue,
this ensures we'll only have one search active at a time).

(-[WKPDFView web_countStringMatches:options:maxCount:]):
Count the number of matches for the given string, and inform the FindClient
of the result.

(-[WKPDFView _didFindMatch:]):
When we find a match, create a view for it, highlight the match, and
zoom so that it's in-view.

(-[WKPDFView web_findString:options:maxCount:]):
Incrementally search the document for the given string. We do an incremental
search even if we have all of the results so that we can anchor the search
in the right place if the new string is a prefix of the old string, etc.
Wrap around appropriately when searching past the beginning or end of the
document. If we have all of the results (there were less than maxCount results),
look through the cached matches for the incrementally-found result and
report its index to the client.

(-[WKPDFView web_hideFindUI]):
Dismiss the selection and clear some state so we start the next search afresh.

* WebKit2.xcodeproj/project.pbxproj:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2PlatformspiiosCorePDFSPIh">trunk/Source/WebKit2/Platform/spi/ios/CorePDFSPI.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewPrivateh">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessCocoaWKWebViewContentProviderh">trunk/Source/WebKit2/UIProcess/Cocoa/WKWebViewContentProvider.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKPDFViewmm">trunk/Source/WebKit2/UIProcess/ios/WKPDFView.mm</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKFindOptionsh">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKFindOptions.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (182084 => 182085)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-03-27 22:01:54 UTC (rev 182084)
+++ trunk/Source/WebKit2/ChangeLog        2015-03-27 22:04:55 UTC (rev 182085)
</span><span class="lines">@@ -1,3 +1,77 @@
</span><ins>+2015-03-27  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        Implement iOS WebKit2 PDF Find-in-Page
+        https://bugs.webkit.org/show_bug.cgi?id=143065
+        &lt;rdar://problem/16793370&gt;
+
+        Reviewed by Dan Bernstein.
+
+        * Platform/spi/ios/CorePDFSPI.h:
+        Add some SPI.
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _countStringMatches:options:maxCount:]):
+        (-[WKWebView _findString:options:maxCount:]):
+        (-[WKWebView _hideFindUI]):
+        If we have a custom content view, forward find-in-page methods to it.
+        
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+        * UIProcess/API/Cocoa/_WKFindOptions.h:
+        Move _WKFindOptions into its own file.
+
+        * UIProcess/Cocoa/WKWebViewContentProvider.h:
+        Add find-related methods to the WKWebViewContentProvider protocol.
+
+        * UIProcess/ios/WKPDFView.mm:
+        (-[WKPDFView web_initWithFrame:webView:]):
+        (-[WKPDFView dealloc]):
+        Maintain a dispatch queue for searching the PDF.
+
+        (-[WKPDFView web_setContentProviderData:suggestedFilename:]):
+        Fix a type.
+
+        (-[WKPDFView _ensureViewForPage:]):
+        Split the code to create/parent a page view out from _revalidateViews,
+        so that the find code can create/parent the targetted UIPDFPageView
+        in order to install the find highlight in it, but before it is scrolled into view.
+
+        (-[WKPDFView _revalidateViews]):
+        Use the stored page index instead of counting again.
+        Don't unparent page views that have find-in-page highlights in them, because
+        we won't know enough to recreate them later.
+
+        (-[WKPDFView _computePageAndDocumentFrames]):
+        Put the page index in PDFPageInfo, for reference elsewhere.
+
+        (-[WKPDFView _stringCompareOptionsFromWKFindOptions:]):
+        (-[WKPDFView _computeMatchesForString:options:maxCount:completionHandler:]):
+        Asynchronously (and on our serial queue) search the PDF for the given string.
+        We'll cache the most recent results to avoid searching more than once,
+        cancel existing searches when another begins (since it's a serial queue,
+        this ensures we'll only have one search active at a time).
+
+        (-[WKPDFView web_countStringMatches:options:maxCount:]):
+        Count the number of matches for the given string, and inform the FindClient
+        of the result.
+
+        (-[WKPDFView _didFindMatch:]):
+        When we find a match, create a view for it, highlight the match, and
+        zoom so that it's in-view.
+
+        (-[WKPDFView web_findString:options:maxCount:]):
+        Incrementally search the document for the given string. We do an incremental
+        search even if we have all of the results so that we can anchor the search
+        in the right place if the new string is a prefix of the old string, etc.
+        Wrap around appropriately when searching past the beginning or end of the
+        document. If we have all of the results (there were less than maxCount results),
+        look through the cached matches for the incrementally-found result and
+        report its index to the client.
+
+        (-[WKPDFView web_hideFindUI]):
+        Dismiss the selection and clear some state so we start the next search afresh.
+
+        * WebKit2.xcodeproj/project.pbxproj:
+
</ins><span class="cx"> 2015-03-27  Andreas Kling  &lt;akling@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WebProcessProxy should not retain WebBackForwardListItems forever.
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformspiiosCorePDFSPIh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Platform/spi/ios/CorePDFSPI.h (182084 => 182085)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Platform/spi/ios/CorePDFSPI.h        2015-03-27 22:01:54 UTC (rev 182084)
+++ trunk/Source/WebKit2/Platform/spi/ios/CorePDFSPI.h        2015-03-27 22:04:55 UTC (rev 182085)
</span><span class="lines">@@ -33,14 +33,18 @@
</span><span class="cx"> #import &lt;CorePDF/UIPDFLinkAnnotation.h&gt;
</span><span class="cx"> #import &lt;CorePDF/UIPDFPage.h&gt;
</span><span class="cx"> #import &lt;CorePDF/UIPDFPageView.h&gt;
</span><ins>+#import &lt;CorePDF/UIPDFSelection.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #else
</span><span class="cx"> 
</span><ins>+@class UIPDFSelection;
+
</ins><span class="cx"> @interface UIPDFPage : NSObject
</span><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @interface UIPDFPage (Details)
</span><span class="cx"> - (CGRect)cropBoxAccountForRotation;
</span><ins>+- (UIPDFSelection *)findString:(NSString *)string fromSelection:(UIPDFSelection *)selection options:(NSStringCompareOptions)options;
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @interface UIPDFDocument : NSObject
</span><span class="lines">@@ -55,6 +59,7 @@
</span><span class="cx"> 
</span><span class="cx"> typedef enum {
</span><span class="cx">     kUIPDFObjectKindGraphic = 1,
</span><ins>+    kUIPDFObjectKindText = 2
</ins><span class="cx"> } UIPDFObjectKind;
</span><span class="cx"> 
</span><span class="cx"> @class UIPDFPageView;
</span><span class="lines">@@ -76,6 +81,8 @@
</span><span class="cx"> @interface UIPDFPageView (Details)
</span><span class="cx"> - (id)initWithPage:(UIPDFPage *) page tiledContent:(BOOL)tiled;
</span><span class="cx"> - (CGRect)convertRectFromPDFPageSpace:(CGRect)p;
</span><ins>+- (void)highlightSearchSelection:(UIPDFSelection *)selection animated:(BOOL)animated;
+- (void)clearSearchHighlights;
</ins><span class="cx"> @property (nonatomic, assign) BOOL useBackingLayer;
</span><span class="cx"> @property (nonatomic, assign) id&lt;NSObject, UIPDFPageViewDelegate&gt; delegate;
</span><span class="cx"> @property (nonatomic, readonly) CALayer *contentLayer;
</span><span class="lines">@@ -120,4 +127,15 @@
</span><span class="cx"> - (void)annotation:(UIPDFAnnotation *)annotation isBeingPressedAtPoint:(CGPoint) point controller:(UIPDFAnnotationController *)controller;
</span><span class="cx"> @end
</span><span class="cx"> 
</span><ins>+@interface UIPDFSelection : NSObject
+@end
+
+@interface UIPDFSelection (Details)
+- (id)initWithPage:(UIPDFPage *)page fromIndex:(NSUInteger)startIndex toIndex:(NSUInteger)endIndex;
+- (CGRect)bounds;
+- (UIPDFPage *)page;
+- (NSUInteger)startIndex;
+@property (nonatomic, assign) CFRange stringRange;
+@end
+
</ins><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (182084 => 182085)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-03-27 22:01:54 UTC (rev 182084)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-03-27 22:04:55 UTC (rev 182085)
</span><span class="lines">@@ -2094,16 +2094,34 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)_countStringMatches:(NSString *)string options:(_WKFindOptions)options maxCount:(NSUInteger)maxCount
</span><span class="cx"> {
</span><ins>+#if PLATFORM(IOS)
+    if (_customContentView) {
+        [_customContentView web_countStringMatches:string options:options maxCount:maxCount];
+        return;
+    }
+#endif
</ins><span class="cx">     _page-&gt;countStringMatches(string, toFindOptions(options), maxCount);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)_findString:(NSString *)string options:(_WKFindOptions)options maxCount:(NSUInteger)maxCount
</span><span class="cx"> {
</span><ins>+#if PLATFORM(IOS)
+    if (_customContentView) {
+        [_customContentView web_findString:string options:options maxCount:maxCount];
+        return;
+    }
+#endif
</ins><span class="cx">     _page-&gt;findString(string, toFindOptions(options), maxCount);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)_hideFindUI
</span><span class="cx"> {
</span><ins>+#if PLATFORM(IOS)
+    if (_customContentView) {
+        [_customContentView web_hideFindUI];
+        return;
+    }
+#endif
</ins><span class="cx">     _page-&gt;hideFindUI();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h (182084 => 182085)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h        2015-03-27 22:01:54 UTC (rev 182084)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h        2015-03-27 22:04:55 UTC (rev 182085)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if WK_API_ENABLED
</span><span class="cx"> 
</span><ins>+#import &lt;WebKit/_WKFindOptions.h&gt;
</ins><span class="cx"> #import &lt;WebKit/_WKRenderingProgressEvents.h&gt;
</span><span class="cx"> 
</span><span class="cx"> typedef NS_ENUM(NSInteger, _WKPaginationMode) {
</span><span class="lines">@@ -37,18 +38,6 @@
</span><span class="cx">     _WKPaginationModeBottomToTop,
</span><span class="cx"> } WK_ENUM_AVAILABLE(10_10, 8_0);
</span><span class="cx"> 
</span><del>-typedef NS_OPTIONS(NSUInteger, _WKFindOptions) {
-    _WKFindOptionsCaseInsensitive = 1 &lt;&lt; 0,
-    _WKFindOptionsAtWordStarts = 1 &lt;&lt; 1,
-    _WKFindOptionsTreatMedialCapitalAsWordStart = 1 &lt;&lt; 2,
-    _WKFindOptionsBackwards = 1 &lt;&lt; 3,
-    _WKFindOptionsWrapAround = 1 &lt;&lt; 4,
-    _WKFindOptionsShowOverlay = 1 &lt;&lt; 5,
-    _WKFindOptionsShowFindIndicator = 1 &lt;&lt; 6,
-    _WKFindOptionsShowHighlight = 1 &lt;&lt; 7,
-    _WKFindOptionsDetermineMatchIndex = 1 &lt;&lt; 8,
-} WK_ENUM_AVAILABLE(10_10, 8_0);
-
</del><span class="cx"> @class WKBrowsingContextHandle;
</span><span class="cx"> @class _WKRemoteObjectRegistry;
</span><span class="cx"> @class _WKSessionState;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKFindOptionsh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKFindOptions.h (0 => 182085)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKFindOptions.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKFindOptions.h        2015-03-27 22:04:55 UTC (rev 182085)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import &lt;WebKit/WKFoundation.h&gt;
+
+#if WK_API_ENABLED
+
+typedef NS_OPTIONS(NSUInteger, _WKFindOptions) {
+    _WKFindOptionsCaseInsensitive = 1 &lt;&lt; 0,
+    _WKFindOptionsAtWordStarts = 1 &lt;&lt; 1,
+    _WKFindOptionsTreatMedialCapitalAsWordStart = 1 &lt;&lt; 2,
+    _WKFindOptionsBackwards = 1 &lt;&lt; 3,
+    _WKFindOptionsWrapAround = 1 &lt;&lt; 4,
+    _WKFindOptionsShowOverlay = 1 &lt;&lt; 5,
+    _WKFindOptionsShowFindIndicator = 1 &lt;&lt; 6,
+    _WKFindOptionsShowHighlight = 1 &lt;&lt; 7,
+    _WKFindOptionsDetermineMatchIndex = 1 &lt;&lt; 8,
+
+    _WKFindOptionsIrrelevantForIncrementalResults = _WKFindOptionsShowOverlay | _WKFindOptionsShowFindIndicator | _WKFindOptionsShowHighlight | _WKFindOptionsDetermineMatchIndex,
+    _WKFindOptionsIrrelevantForBatchResults = _WKFindOptionsBackwards | _WKFindOptionsWrapAround | _WKFindOptionsIrrelevantForIncrementalResults
+
+} WK_ENUM_AVAILABLE(10_10, 8_0);
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessCocoaWKWebViewContentProviderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Cocoa/WKWebViewContentProvider.h (182084 => 182085)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Cocoa/WKWebViewContentProvider.h        2015-03-27 22:01:54 UTC (rev 182084)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/WKWebViewContentProvider.h        2015-03-27 22:04:55 UTC (rev 182085)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> 
</span><span class="cx"> #import &lt;WebKit/WKPageLoadTypes.h&gt;
</span><ins>+#import &lt;WebKit/_WKFindOptions.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> @class NSData;
</span><span class="cx"> @class UIScrollView;
</span><span class="lines">@@ -50,6 +51,9 @@
</span><span class="cx"> - (void)web_computedContentInsetDidChange;
</span><span class="cx"> - (void)web_setFixedOverlayView:(UIView *)fixedOverlayView;
</span><span class="cx"> - (void)web_didSameDocumentNavigation:(WKSameDocumentNavigationType)navigationType;
</span><ins>+- (void)web_countStringMatches:(NSString *)string options:(_WKFindOptions)options maxCount:(NSUInteger)maxCount;
+- (void)web_findString:(NSString *)string options:(_WKFindOptions)options maxCount:(NSUInteger)maxCount;
+- (void)web_hideFindUI;
</ins><span class="cx"> 
</span><span class="cx"> @end
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKPDFViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKPDFView.mm (182084 => 182085)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKPDFView.mm        2015-03-27 22:01:54 UTC (rev 182084)
+++ trunk/Source/WebKit2/UIProcess/ios/WKPDFView.mm        2015-03-27 22:04:55 UTC (rev 182085)
</span><span class="lines">@@ -28,13 +28,16 @@
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> 
</span><ins>+#import &quot;APIFindClient.h&quot;
</ins><span class="cx"> #import &quot;APIUIClient.h&quot;
</span><span class="cx"> #import &quot;CorePDFSPI.h&quot;
</span><span class="cx"> #import &quot;SessionState.h&quot;
</span><span class="cx"> #import &quot;UIKitSPI.h&quot;
</span><span class="cx"> #import &quot;WKPDFPageNumberIndicator.h&quot;
</span><span class="cx"> #import &quot;WKWebViewInternal.h&quot;
</span><ins>+#import &quot;WeakObjCPtr.h&quot;
</ins><span class="cx"> #import &quot;WebPageProxy.h&quot;
</span><ins>+#import &quot;_WKFindDelegate.h&quot;
</ins><span class="cx"> #import &lt;MobileCoreServices/UTCoreTypes.h&gt;
</span><span class="cx"> #import &lt;WebCore/FloatRect.h&gt;
</span><span class="cx"> #import &lt;wtf/RetainPtr.h&gt;
</span><span class="lines">@@ -54,6 +57,7 @@
</span><span class="cx">     CGRect frame;
</span><span class="cx">     RetainPtr&lt;UIPDFPageView&gt; view;
</span><span class="cx">     RetainPtr&lt;UIPDFPage&gt; page;
</span><ins>+    unsigned index;
</ins><span class="cx"> } PDFPageInfo;
</span><span class="cx"> 
</span><span class="cx"> @interface WKPDFView ()
</span><span class="lines">@@ -79,6 +83,22 @@
</span><span class="cx"> 
</span><span class="cx">     RetainPtr&lt;WKActionSheetAssistant&gt; _actionSheetAssistant;
</span><span class="cx">     WebKit::InteractionInformationAtPosition _positionInformation;
</span><ins>+
+    unsigned _currentFindPageIndex;
+    unsigned _currentFindMatchIndex;
+    RetainPtr&lt;UIPDFSelection&gt; _currentFindSelection;
+
+    RetainPtr&lt;NSString&gt; _cachedFindString;
+    Vector&lt;RetainPtr&lt;UIPDFSelection&gt;&gt; _cachedFindMatches;
+    unsigned _cachedFindMaximumCount;
+    _WKFindOptions _cachedFindOptionsAffectingResults;
+
+    std::atomic&lt;unsigned&gt; _nextComputeMatchesOperationID;
+    RetainPtr&lt;NSString&gt; _nextCachedFindString;
+    unsigned _nextCachedFindMaximumCount;
+    _WKFindOptions _nextCachedFindOptionsAffectingResults;
+
+    dispatch_queue_t _findQueue;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (instancetype)web_initWithFrame:(CGRect)frame webView:(WKWebView *)webView
</span><span class="lines">@@ -98,6 +118,8 @@
</span><span class="cx">     _actionSheetAssistant = adoptNS([[WKActionSheetAssistant alloc] initWithView:self]);
</span><span class="cx">     [_actionSheetAssistant setDelegate:self];
</span><span class="cx"> 
</span><ins>+    _findQueue = dispatch_queue_create(&quot;com.apple.WebKit.WKPDFViewComputeMatchesQueue&quot;, DISPATCH_QUEUE_SERIAL);
+
</ins><span class="cx">     return self;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -105,6 +127,7 @@
</span><span class="cx"> {
</span><span class="cx">     [self _clearPages];
</span><span class="cx">     [_pageNumberIndicator removeFromSuperview];
</span><ins>+    dispatch_release(_findQueue);
</ins><span class="cx">     [super dealloc];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -135,7 +158,7 @@
</span><span class="cx"> 
</span><span class="cx">     [self _clearPages];
</span><span class="cx"> 
</span><del>-    RetainPtr&lt;CGDataProvider&gt; dataProvider = adoptCF(CGDataProviderCreateWithCFData((CFDataRef)data));
</del><ins>+    RetainPtr&lt;CGDataProviderRef&gt; dataProvider = adoptCF(CGDataProviderCreateWithCFData((CFDataRef)data));
</ins><span class="cx">     RetainPtr&lt;CGPDFDocumentRef&gt; cgPDFDocument = adoptCF(CGPDFDocumentCreateWithProvider(dataProvider.get()));
</span><span class="cx">     _pdfDocument = adoptNS([[UIPDFDocument alloc] initWithCGPDFDocument:cgPDFDocument.get()]);
</span><span class="cx"> 
</span><span class="lines">@@ -165,6 +188,21 @@
</span><span class="cx">         [_pageNumberIndicator show];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_ensureViewForPage:(PDFPageInfo&amp;)pageInfo
+{
+    if (pageInfo.view)
+        return;
+
+    pageInfo.view = adoptNS([[UIPDFPageView alloc] initWithPage:pageInfo.page.get() tiledContent:YES]);
+    [pageInfo.view setUseBackingLayer:YES];
+    [pageInfo.view setDelegate:self];
+    [[pageInfo.view annotationController] setDelegate:self];
+    [self addSubview:pageInfo.view.get()];
+
+    [pageInfo.view setFrame:pageInfo.frame];
+    [pageInfo.view contentLayer].contentsScale = self.window.screen.scale;
+}
+
</ins><span class="cx"> - (void)_revalidateViews
</span><span class="cx"> {
</span><span class="cx">     if (_isStartingZoom)
</span><span class="lines">@@ -178,31 +216,18 @@
</span><span class="cx">     CGRect targetRectForCenterPage = CGRectInset(targetRect, 0, targetRect.size.height / 2 - pdfPageMargin * 2);
</span><span class="cx"> 
</span><span class="cx">     _centerPageNumber = 0;
</span><del>-    unsigned currentPage = 0;
</del><span class="cx"> 
</span><span class="cx">     for (auto&amp; pageInfo : _pages) {
</span><del>-        ++currentPage;
-
-        if (!CGRectIntersectsRect(pageInfo.frame, targetRectWithOverdraw)) {
</del><ins>+        if (!CGRectIntersectsRect(pageInfo.frame, targetRectWithOverdraw) &amp;&amp; pageInfo.index != _currentFindPageIndex) {
</ins><span class="cx">             [pageInfo.view removeFromSuperview];
</span><span class="cx">             pageInfo.view = nullptr;
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (!_centerPageNumber &amp;&amp; CGRectIntersectsRect(pageInfo.frame, targetRectForCenterPage))
</span><del>-            _centerPageNumber = currentPage;
</del><ins>+            _centerPageNumber = pageInfo.index + 1;
</ins><span class="cx"> 
</span><del>-        if (pageInfo.view)
-            continue;
-
-        pageInfo.view = adoptNS([[UIPDFPageView alloc] initWithPage:pageInfo.page.get() tiledContent:YES]);
-        [pageInfo.view setUseBackingLayer:YES];
-        [pageInfo.view setDelegate:self];
-        [[pageInfo.view annotationController] setDelegate:self];
-        [self addSubview:pageInfo.view.get()];
-
-        [pageInfo.view setFrame:pageInfo.frame];
-        [pageInfo.view contentLayer].contentsScale = self.window.screen.scale;
</del><ins>+        [self _ensureViewForPage:pageInfo];
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     [self _updatePageNumberIndicator];
</span><span class="lines">@@ -291,8 +316,8 @@
</span><span class="cx">     _pages.reserveCapacity(pageCount);
</span><span class="cx"> 
</span><span class="cx">     CGRect pageFrame = CGRectMake(0, 0, _minimumSize.width, _minimumSize.height);
</span><del>-    for (NSUInteger pageNumber = 0; pageNumber &lt; pageCount; ++pageNumber) {
-        UIPDFPage *page = [_pdfDocument pageAtIndex:pageNumber];
</del><ins>+    for (NSUInteger pageIndex = 0; pageIndex &lt; pageCount; ++pageIndex) {
+        UIPDFPage *page = [_pdfDocument pageAtIndex:pageIndex];
</ins><span class="cx">         if (!page)
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><span class="lines">@@ -303,6 +328,7 @@
</span><span class="cx">         PDFPageInfo pageInfo;
</span><span class="cx">         pageInfo.page = page;
</span><span class="cx">         pageInfo.frame = pageFrameWithMarginApplied;
</span><ins>+        pageInfo.index = pageIndex;
</ins><span class="cx">         _pages.append(pageInfo);
</span><span class="cx">         pageFrame.origin.y += pageFrame.size.height - pdfPageMargin;
</span><span class="cx">     }
</span><span class="lines">@@ -364,6 +390,194 @@
</span><span class="cx">     return nil;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#pragma mark Find-in-Page
+
+static NSStringCompareOptions stringCompareOptions(_WKFindOptions options)
+{
+    NSStringCompareOptions findOptions = 0;
+    if (options &amp; _WKFindOptionsCaseInsensitive)
+        findOptions |= NSCaseInsensitiveSearch;
+    if (options &amp; _WKFindOptionsBackwards)
+        findOptions |= NSBackwardsSearch;
+    return findOptions;
+}
+
+- (void)_computeMatchesForString:(NSString *)string options:(_WKFindOptions)options maxCount:(NSUInteger)maxCount completionHandler:(void (^)(BOOL success))completionHandler
+{
+    if (!_pdfDocument) {
+        completionHandler(NO);
+        return;
+    }
+
+    _WKFindOptions optionsAffectingResults = options &amp; ~_WKFindOptionsIrrelevantForBatchResults;
+
+    // If this search is equivalent to the currently cached search, bail and call the completion handler, because the existing cached results are valid.
+    if (!_cachedFindMatches.isEmpty() &amp;&amp; [_cachedFindString isEqualToString:string] &amp;&amp; _cachedFindOptionsAffectingResults == optionsAffectingResults &amp;&amp; _cachedFindMaximumCount == maxCount) {
+        // Also, cancel any running search, because it will eventually replace the now-valid results.
+        ++_nextComputeMatchesOperationID;
+
+        completionHandler(YES);
+        return;
+    }
+
+    // If this search is equivalent to the currently running asynchronous search, bail as if this search were cancelled; the original search's completion handler will eventually fire.
+    if ([_nextCachedFindString isEqualToString:string] &amp;&amp; _nextCachedFindOptionsAffectingResults == optionsAffectingResults &amp;&amp; _nextCachedFindMaximumCount == maxCount) {
+        completionHandler(NO);
+        return;
+    }
+
+    NSStringCompareOptions findOptions = stringCompareOptions(optionsAffectingResults);
+
+    Vector&lt;PDFPageInfo&gt; pages = _pages;
+
+    unsigned computeMatchesOperationID = ++_nextComputeMatchesOperationID;
+    _nextCachedFindString = string;
+    _nextCachedFindOptionsAffectingResults = optionsAffectingResults;
+    _nextCachedFindMaximumCount = maxCount;
+
+    RetainPtr&lt;WKPDFView&gt; retainedSelf = self;
+    typeof(completionHandler) completionHandlerCopy = Block_copy(completionHandler);
+
+    dispatch_async(_findQueue, [pages, string, findOptions, optionsAffectingResults, maxCount, computeMatchesOperationID, retainedSelf, completionHandlerCopy] {
+        Vector&lt;RetainPtr&lt;UIPDFSelection&gt;&gt; matches;
+
+        for (unsigned pageIndex = 0; pageIndex &lt; pages.size(); ++pageIndex) {
+            UIPDFSelection *match = nullptr;
+            while ((match = [pages[pageIndex].page findString:string fromSelection:match options:findOptions])) {
+                matches.append(match);
+                if (matches.size() &gt; maxCount)
+                    goto maxCountExceeded;
+
+                // If we've enqueued another search, cancel this one.
+                if (retainedSelf-&gt;_nextComputeMatchesOperationID != computeMatchesOperationID) {
+                    dispatch_async(dispatch_get_main_queue(), [completionHandlerCopy] {
+                        completionHandlerCopy(NO);
+                        Block_release(completionHandlerCopy);
+                    });
+                    return;
+                }
+            };
+        }
+
+    maxCountExceeded:
+        dispatch_async(dispatch_get_main_queue(), [computeMatchesOperationID, string, optionsAffectingResults, maxCount, matches, completionHandlerCopy, retainedSelf] {
+
+            // If another search has been enqueued in the meantime, ignore this result.
+            if (retainedSelf-&gt;_nextComputeMatchesOperationID != computeMatchesOperationID) {
+                Block_release(completionHandlerCopy);
+                return;
+            }
+
+            retainedSelf-&gt;_cachedFindString = string;
+            retainedSelf-&gt;_cachedFindOptionsAffectingResults = optionsAffectingResults;
+            retainedSelf-&gt;_cachedFindMaximumCount = maxCount;
+            retainedSelf-&gt;_cachedFindMatches = matches;
+
+            retainedSelf-&gt;_nextCachedFindString = nil;
+
+            completionHandlerCopy(YES);
+            Block_release(completionHandlerCopy);
+        });
+    });
+}
+
+- (void)web_countStringMatches:(NSString *)string options:(_WKFindOptions)options maxCount:(NSUInteger)maxCount
+{
+    RefPtr&lt;WebKit::WebPageProxy&gt; page = _webView-&gt;_page;
+    [self _computeMatchesForString:string options:options maxCount:maxCount completionHandler:^(BOOL success) {
+        if (!success)
+            return;
+        page-&gt;findClient().didCountStringMatches(page.get(), string, _cachedFindMatches.size());
+    }];
+}
+
+- (void)_didFindMatch:(UIPDFSelection *)match
+{
+    for (auto&amp; pageInfo : _pages) {
+        if (pageInfo.page == match.page) {
+            [self _ensureViewForPage:pageInfo];
+
+            [pageInfo.view highlightSearchSelection:match animated:NO];
+
+            _currentFindPageIndex = pageInfo.index;
+            _currentFindSelection = match;
+
+            CGRect zoomRect = [pageInfo.view convertRectFromPDFPageSpace:match.bounds];
+            [self zoom:pageInfo.view.get() to:zoomRect atPoint:CGPointZero kind:kUIPDFObjectKindText];
+
+            return;
+        }
+    }
+}
+
+- (void)web_findString:(NSString *)string options:(_WKFindOptions)options maxCount:(NSUInteger)maxCount
+{
+    if (_currentFindSelection)
+        [_pages[_currentFindPageIndex].view clearSearchHighlights];
+
+    RetainPtr&lt;UIPDFSelection&gt; previousFindSelection = _currentFindSelection;
+    unsigned previousFindPageIndex = 0;
+    if (previousFindSelection) {
+        previousFindPageIndex = _currentFindPageIndex;
+        if (![_cachedFindString isEqualToString:string]) {
+            NSUInteger location = [_currentFindSelection startIndex];
+            if (location)
+                previousFindSelection = adoptNS([[UIPDFSelection alloc] initWithPage:[_currentFindSelection page] fromIndex:location - 1 toIndex:location]);
+        }
+    }
+
+    NSStringCompareOptions findOptions = stringCompareOptions(options);
+    bool backwards = (options &amp; _WKFindOptionsBackwards);
+    RefPtr&lt;WebKit::WebPageProxy&gt; page = _webView-&gt;_page;
+
+    [self _computeMatchesForString:string options:options maxCount:maxCount completionHandler:^(BOOL success) {
+        if (!success)
+            return;
+
+        unsigned pageIndex = previousFindPageIndex;
+        for (unsigned i = 0; i &lt; _pages.size(); ++i) {
+            UIPDFSelection *match = [_pages[pageIndex].page findString:string fromSelection:(pageIndex == previousFindPageIndex ? previousFindSelection.get() : nil) options:findOptions];
+
+            if (!match) {
+                if (!pageIndex &amp;&amp; backwards)
+                    pageIndex = _pages.size() - 1;
+                else if (pageIndex == _pages.size() - 1 &amp;&amp; !backwards)
+                    pageIndex = 0;
+                else
+                    pageIndex += backwards ? -1 : 1;
+                continue;
+            }
+
+            [self _didFindMatch:match];
+
+            if (_cachedFindMatches.size() &lt;= maxCount) {
+                _currentFindMatchIndex = 0;
+                for (const auto&amp; knownMatch : _cachedFindMatches) {
+                    if (match.stringRange.location == [knownMatch stringRange].location &amp;&amp; match.stringRange.length == [knownMatch stringRange].length) {
+                        page-&gt;findClient().didFindString(page.get(), string, _cachedFindMatches.size(), _currentFindMatchIndex);
+                        break;
+                    }
+                    _currentFindMatchIndex++;
+                }
+            }
+
+            return;
+        }
+        
+        page-&gt;findClient().didFailToFindString(page.get(), string);
+    }];
+}
+
+- (void)web_hideFindUI
+{
+    if (_currentFindSelection)
+        [_pages[_currentFindPageIndex].view clearSearchHighlights];
+
+    _currentFindSelection = nullptr;
+    _cachedFindString = nullptr;
+    _cachedFindMatches.clear();
+}
+
</ins><span class="cx"> #pragma mark UIPDFPageViewDelegate
</span><span class="cx"> 
</span><span class="cx"> - (void)zoom:(UIPDFPageView *)pageView to:(CGRect)targetRect atPoint:(CGPoint)origin kind:(UIPDFObjectKind)kind
</span></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (182084 => 182085)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2015-03-27 22:01:54 UTC (rev 182084)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2015-03-27 22:04:55 UTC (rev 182085)
</span><span class="lines">@@ -676,6 +676,7 @@
</span><span class="cx">                 2DDF731618E95060004F5A66 /* RemoteLayerBackingStoreCollection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DDF731418E95060004F5A66 /* RemoteLayerBackingStoreCollection.mm */; };
</span><span class="cx">                 2DE6943D18BD2A68005C15E5 /* SmartMagnificationControllerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2DE6943B18BD2A68005C15E5 /* SmartMagnificationControllerMessageReceiver.cpp */; };
</span><span class="cx">                 2DE6943E18BD2A68005C15E5 /* SmartMagnificationControllerMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DE6943C18BD2A68005C15E5 /* SmartMagnificationControllerMessages.h */; };
</span><ins>+                2DEAC5CF1AC368BB00A195D8 /* _WKFindOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DEAC5CE1AC368BB00A195D8 /* _WKFindOptions.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 2DF9593B18A42412009785A1 /* ViewGestureControllerIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2DF9593418A42412009785A1 /* ViewGestureControllerIOS.mm */; };
</span><span class="cx">                 2DF9EEE51A781FB400B6CFBE /* APIFrameInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2DF9EEE31A781FB400B6CFBE /* APIFrameInfo.cpp */; };
</span><span class="cx">                 2DF9EEE61A781FB400B6CFBE /* APIFrameInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DF9EEE41A781FB400B6CFBE /* APIFrameInfo.h */; };
</span><span class="lines">@@ -2833,6 +2834,7 @@
</span><span class="cx">                 2DDF731418E95060004F5A66 /* RemoteLayerBackingStoreCollection.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RemoteLayerBackingStoreCollection.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2DE6943B18BD2A68005C15E5 /* SmartMagnificationControllerMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SmartMagnificationControllerMessageReceiver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2DE6943C18BD2A68005C15E5 /* SmartMagnificationControllerMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmartMagnificationControllerMessages.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                2DEAC5CE1AC368BB00A195D8 /* _WKFindOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKFindOptions.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 2DF9593418A42412009785A1 /* ViewGestureControllerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ViewGestureControllerIOS.mm; path = ios/ViewGestureControllerIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2DF9EEE31A781FB400B6CFBE /* APIFrameInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = APIFrameInfo.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 2DF9EEE41A781FB400B6CFBE /* APIFrameInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIFrameInfo.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -5323,6 +5325,7 @@
</span><span class="cx">                                 1AD01BC71905D37E00C9C45F /* _WKErrorRecoveryAttempting.h */,
</span><span class="cx">                                 1AD01BC61905D37E00C9C45F /* _WKErrorRecoveryAttempting.mm */,
</span><span class="cx">                                 005D158E18E4C4EB00734619 /* _WKFindDelegate.h */,
</span><ins>+                                2DEAC5CE1AC368BB00A195D8 /* _WKFindOptions.h */,
</ins><span class="cx">                                 37A64E5418F38E3C00EB30F1 /* _WKFormDelegate.h */,
</span><span class="cx">                                 37A64E5618F38F4600EB30F1 /* _WKFormInputSession.h */,
</span><span class="cx">                                 1A43E828188F3CDC009E4D30 /* _WKProcessPoolConfiguration.h */,
</span><span class="lines">@@ -7754,6 +7757,7 @@
</span><span class="cx">                                 1A6FBD2811E69BC200DB1371 /* NetscapePlugin.h in Headers */,
</span><span class="cx">                                 1A4A9C5612B816CF008FE984 /* NetscapePluginModule.h in Headers */,
</span><span class="cx">                                 1AA5889211EE70400061B882 /* NetscapePluginStream.h in Headers */,
</span><ins>+                                2DEAC5CF1AC368BB00A195D8 /* _WKFindOptions.h in Headers */,
</ins><span class="cx">                                 E1798C7A16E6818800240139 /* NetworkBlobRegistry.h in Headers */,
</span><span class="cx">                                 E4436ECC1A0D040B00EAD204 /* NetworkCache.h in Headers */,
</span><span class="cx">                                 E489D28A1A0A2DB80078C06A /* NetworkCacheCoder.h in Headers */,
</span></span></pre>
</div>
</div>

</body>
</html>