<!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>[209640] trunk</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/209640">209640</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2016-12-09 17:25:53 -0800 (Fri, 09 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Re-landing:
Source/WebCore:

Add _WKIconLoadingDelegate SPI.
https://bugs.webkit.org/show_bug.cgi?id=164894

Reviewed by Alex Christensen.

No new tests (Manual testing possible in MiniBrowser now, WKTR tests coming soon in https://bugs.webkit.org/show_bug.cgi?id=164895).

With this client, WebCore will ask the FrameLoaderClient about each icon found in the &lt;head&gt;.

WebKit2 will then ask the embedding app - for each icon - if it wants that icon to load.

For icons the app decides to load, WebKit will pass the data to the app without storing locally.

* WebCore.xcodeproj/project.pbxproj:

* dom/Document.cpp:
(WebCore::Document::implicitClose):

* html/LinkIconCollector.cpp:
(WebCore::iconSize):
(WebCore::compareIcons):
* html/LinkIconCollector.h:

* loader/DocumentLoader.cpp:
(WebCore::DocumentLoader::startIconLoading):
(WebCore::DocumentLoader::didGetLoadDecisionForIcon):
(WebCore::DocumentLoader::finishedLoadingIcon):
* loader/DocumentLoader.h:

* loader/FrameLoaderClient.h:

* loader/icon/IconLoader.cpp:
(WebCore::IconLoader::IconLoader):
(WebCore::IconLoader::startLoading):
(WebCore::IconLoader::notifyFinished):
* loader/icon/IconLoader.h:

* platform/LinkIcon.h: Copied from Source/WebCore/html/LinkIconCollector.h.
(WebCore::LinkIcon::encode):
(WebCore::LinkIcon::decode):

Source/WebKit2:

Add _WKIconLoadingDelegate SPI.
https://bugs.webkit.org/show_bug.cgi?id=164894

Reviewed by Alex Christensen.

With this client, WebCore will ask the FrameLoaderClient about each icon found in the &lt;head&gt;.

WebKit2 will then ask the embedding app - for each icon - if it wants that icon to load.

For icons the app decides to load, WebKit will pass the data to the app without storing locally.

* UIProcess/API/APIIconLoadingClient.h: Copied from Source/WebCore/html/LinkIconCollector.h.
(API::IconLoadingClient::~IconLoadingClient):
(API::IconLoadingClient::getLoadDecisionForIcon):

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _initializeWithConfiguration:]):
(-[WKWebView _iconLoadingDelegate]):
(-[WKWebView _setIconLoadingDelegate:]):
* UIProcess/API/Cocoa/WKWebViewPrivate.h:

* UIProcess/API/Cocoa/_WKIconLoadingDelegate.h: Copied from Source/WebCore/html/LinkIconCollector.h.

* UIProcess/API/Cocoa/_WKLinkIconParameters.h: Copied from Source/WebCore/html/LinkIconCollector.h.
* UIProcess/API/Cocoa/_WKLinkIconParameters.mm: Copied from Source/WebCore/html/LinkIconCollector.h.
(-[_WKLinkIconParameters _initWithLinkIcon:]):
(-[_WKLinkIconParameters url]):
(-[_WKLinkIconParameters mimeType]):
(-[_WKLinkIconParameters size]):
(-[_WKLinkIconParameters iconType]):
* UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h: Copied from Source/WebCore/html/LinkIconCollector.h.

* UIProcess/Cocoa/IconLoadingDelegate.h: Copied from Source/WebCore/html/LinkIconCollector.h.
* UIProcess/Cocoa/IconLoadingDelegate.mm: Added.
(WebKit::IconLoadingDelegate::IconLoadingDelegate):
(WebKit::IconLoadingDelegate::~IconLoadingDelegate):
(WebKit::IconLoadingDelegate::createIconLoadingClient):
(WebKit::IconLoadingDelegate::delegate):
(WebKit::IconLoadingDelegate::setDelegate):
(WebKit::IconLoadingDelegate::IconLoadingClient::IconLoadingClient):
(WebKit::IconLoadingDelegate::IconLoadingClient::~IconLoadingClient):
(WebKit::IconLoadingDelegate::IconLoadingClient::getLoadDecisionForIcon):

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::setIconLoadingClient):
(WebKit::WebPageProxy::getLoadDecisionForIcon):
(WebKit::WebPageProxy::finishedLoadingIcon):
* UIProcess/WebPageProxy.h:
(WebKit::WebPageProxy::iconLoadingClient):
* UIProcess/WebPageProxy.messages.in:

* WebKit2.xcodeproj/project.pbxproj:

* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::useIconLoadingClient):
(WebKit::WebFrameLoaderClient::getLoadDecisionForIcon):
(WebKit::WebFrameLoaderClient::finishedLoadingIcon):
* WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
(WebKit::WebFrameLoaderClient::setUseIconLoadingClient):

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::didGetLoadDecisionForIcon):
(WebKit::WebPage::setUseIconLoadingClient):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:

Tools:

Add _WKIconLoadingDelegate SPI.
https://bugs.webkit.org/show_bug.cgi?id=164894

Reviewed by Alex Christensen.

Add MiniBrowser support for this new SPI, configurable with a setting.

* MiniBrowser/mac/SettingsController.h:
* MiniBrowser/mac/SettingsController.m:
(-[SettingsController _populateMenu]):
(-[SettingsController validateMenuItem:]):
(-[SettingsController loadsAllSiteIcons]):
(-[SettingsController toggleLoadsAllSiteIcons:]):
* MiniBrowser/mac/WK2BrowserWindowController.m:
(-[WK2BrowserWindowController awakeFromNib]):
(-[WK2BrowserWindowController webView:shouldLoadIconWithParameters:completionHandler:]):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoredomDocumentcpp">trunk/Source/WebCore/dom/Document.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderDocumentLoadercpp">trunk/Source/WebCore/loader/DocumentLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderDocumentLoaderh">trunk/Source/WebCore/loader/DocumentLoader.h</a></li>
<li><a href="#trunkSourceWebCoreloaderFrameLoaderClienth">trunk/Source/WebCore/loader/FrameLoaderClient.h</a></li>
<li><a href="#trunkSourceWebCoreloadericonIconLoadercpp">trunk/Source/WebCore/loader/icon/IconLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloadericonIconLoaderh">trunk/Source/WebCore/loader/icon/IconLoader.h</a></li>
<li><a href="#trunkSourceWebCoreplatformLinkIconh">trunk/Source/WebCore/platform/LinkIcon.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2PlatformMaccmake">trunk/Source/WebKit2/PlatformMac.cmake</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="#trunkSourceWebKit2UIProcessWebPageProxycpp">trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxymessagesin">trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClientcpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClienth">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagecpp">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPagemessagesin">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsMiniBrowsermacSettingsControllerh">trunk/Tools/MiniBrowser/mac/SettingsController.h</a></li>
<li><a href="#trunkToolsMiniBrowsermacSettingsControllerm">trunk/Tools/MiniBrowser/mac/SettingsController.m</a></li>
<li><a href="#trunkToolsMiniBrowsermacWK2BrowserWindowControllerm">trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2UIProcessAPIAPIIconLoadingClienth">trunk/Source/WebKit2/UIProcess/API/APIIconLoadingClient.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKIconLoadingDelegateh">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKIconLoadingDelegate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKLinkIconParametersh">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKLinkIconParametersmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoa_WKLinkIconParametersInternalh">trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessCocoaIconLoadingDelegateh">trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessCocoaIconLoadingDelegatemm">trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebCore/ChangeLog        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -1,3 +1,47 @@
</span><ins>+2016-12-09  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Re-landing:
+        Add _WKIconLoadingDelegate SPI.
+        https://bugs.webkit.org/show_bug.cgi?id=164894
+
+        Reviewed by Alex Christensen.
+
+        No new tests (Manual testing possible in MiniBrowser now, WKTR tests coming soon in https://bugs.webkit.org/show_bug.cgi?id=164895).
+
+        With this client, WebCore will ask the FrameLoaderClient about each icon found in the &lt;head&gt;.
+
+        WebKit2 will then ask the embedding app - for each icon - if it wants that icon to load.
+
+        For icons the app decides to load, WebKit will pass the data to the app without storing locally.
+
+        * WebCore.xcodeproj/project.pbxproj:
+
+        * dom/Document.cpp:
+        (WebCore::Document::implicitClose):
+
+        * html/LinkIconCollector.cpp:
+        (WebCore::iconSize):
+        (WebCore::compareIcons):
+        * html/LinkIconCollector.h:
+
+        * loader/DocumentLoader.cpp:
+        (WebCore::DocumentLoader::startIconLoading):
+        (WebCore::DocumentLoader::didGetLoadDecisionForIcon):
+        (WebCore::DocumentLoader::finishedLoadingIcon):
+        * loader/DocumentLoader.h:
+
+        * loader/FrameLoaderClient.h:
+
+        * loader/icon/IconLoader.cpp:
+        (WebCore::IconLoader::IconLoader):
+        (WebCore::IconLoader::startLoading):
+        (WebCore::IconLoader::notifyFinished):
+        * loader/icon/IconLoader.h:
+
+        * platform/LinkIcon.h: Copied from Source/WebCore/html/LinkIconCollector.h.
+        (WebCore::LinkIcon::encode):
+        (WebCore::LinkIcon::decode):
+
</ins><span class="cx"> 2016-12-06  Jiewen Tan  &lt;jiewen_tan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Part 2 of 2] Add support for PKCS8 format while doing SubtleCrypto.importKey/exportKey
</span></span></pre></div>
<a id="trunkSourceWebCoredomDocumentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/dom/Document.cpp (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/dom/Document.cpp        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebCore/dom/Document.cpp        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -2651,7 +2651,12 @@
</span><span class="cx">     // ramifications, and we need to decide what is the Right Thing To Do(tm)
</span><span class="cx">     Frame* f = frame();
</span><span class="cx">     if (f) {
</span><del>-        f-&gt;loader().icon().startLoader();
</del><ins>+        if (f-&gt;loader().client().useIconLoadingClient()) {
+            if (auto* documentLoader = loader())
+                documentLoader-&gt;startIconLoading();
+        } else
+            f-&gt;loader().icon().startLoader();
+
</ins><span class="cx">         f-&gt;animation().startAnimationsIfNotSuspended(this);
</span><span class="cx"> 
</span><span class="cx">         // FIXME: We shouldn't be dispatching pending events globally on all Documents here.
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderDocumentLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/DocumentLoader.cpp (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/DocumentLoader.cpp        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebCore/loader/DocumentLoader.cpp        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> #include &quot;Document.h&quot;
</span><span class="cx"> #include &quot;DocumentParser.h&quot;
</span><span class="cx"> #include &quot;DocumentWriter.h&quot;
</span><ins>+#include &quot;ElementChildIterator.h&quot;
</ins><span class="cx"> #include &quot;Event.h&quot;
</span><span class="cx"> #include &quot;EventNames.h&quot;
</span><span class="cx"> #include &quot;ExtensionStyleSheets.h&quot;
</span><span class="lines">@@ -53,7 +54,10 @@
</span><span class="cx"> #include &quot;HTTPHeaderNames.h&quot;
</span><span class="cx"> #include &quot;HistoryItem.h&quot;
</span><span class="cx"> #include &quot;IconController.h&quot;
</span><ins>+#include &quot;IconLoader.h&quot;
</ins><span class="cx"> #include &quot;InspectorInstrumentation.h&quot;
</span><ins>+#include &quot;LinkIconCollector.h&quot;
+#include &quot;LinkIconType.h&quot;
</ins><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;MainFrame.h&quot;
</span><span class="cx"> #include &quot;MemoryCache.h&quot;
</span><span class="lines">@@ -1702,6 +1706,46 @@
</span><span class="cx">     iconDatabase().iconDataForIconURL(urlString, m_iconDataCallback);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void DocumentLoader::startIconLoading()
+{
+    ASSERT(m_frame-&gt;loader().client().useIconLoadingClient());
+
+    static uint64_t nextIconCallbackID = 1;
+
+    auto* document = this-&gt;document();
+    if (!document)
+        return;
+
+    Vector&lt;LinkIcon&gt; icons = LinkIconCollector { *document }.iconsOfTypes({ LinkIconType::Favicon, LinkIconType::TouchIcon, LinkIconType::TouchPrecomposedIcon });
+
+    if (icons.isEmpty())
+        icons.append({ m_frame-&gt;document()-&gt;completeURL(ASCIILiteral(&quot;/favicon.ico&quot;)), LinkIconType::Favicon, String(), std::nullopt });
+
+    for (auto&amp; icon : icons) {
+        auto result = m_iconsPendingLoadDecision.add(nextIconCallbackID++, icon);
+        m_frame-&gt;loader().client().getLoadDecisionForIcon(icon, result.iterator-&gt;key);
+    }
+}
+
+void DocumentLoader::didGetLoadDecisionForIcon(bool decision, uint64_t loadIdentifier, uint64_t newCallbackID)
+{
+    auto icon = m_iconsPendingLoadDecision.take(loadIdentifier);
+    if (!decision || icon.url.isEmpty() || !m_frame)
+        return;
+
+    auto iconLoader = std::make_unique&lt;IconLoader&gt;(*this, icon.url);
+    iconLoader-&gt;startLoading();
+    m_iconLoaders.set(WTFMove(iconLoader), newCallbackID);
+}
+
+void DocumentLoader::finishedLoadingIcon(IconLoader&amp; loader, SharedBuffer* buffer)
+{
+    auto loadIdentifier = m_iconLoaders.take(&amp;loader);
+    ASSERT(loadIdentifier);
+
+    m_frame-&gt;loader().client().finishedLoadingIcon(loadIdentifier, buffer);
+}
+
</ins><span class="cx"> void DocumentLoader::dispatchOnloadEvents()
</span><span class="cx"> {
</span><span class="cx">     m_wasOnloadDispatched = true;
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderDocumentLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/DocumentLoader.h (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/DocumentLoader.h        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebCore/loader/DocumentLoader.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &quot;CachedResourceHandle.h&quot;
</span><span class="cx"> #include &quot;DocumentWriter.h&quot;
</span><span class="cx"> #include &quot;IconDatabaseBase.h&quot;
</span><ins>+#include &quot;LinkIcon.h&quot;
</ins><span class="cx"> #include &quot;LoadTiming.h&quot;
</span><span class="cx"> #include &quot;NavigationAction.h&quot;
</span><span class="cx"> #include &quot;ResourceError.h&quot;
</span><span class="lines">@@ -71,6 +72,7 @@
</span><span class="cx"> class FormState;
</span><span class="cx"> class Frame;
</span><span class="cx"> class FrameLoader;
</span><ins>+class IconLoader;
</ins><span class="cx"> class Page;
</span><span class="cx"> class ResourceLoader;
</span><span class="cx"> class SharedBuffer;
</span><span class="lines">@@ -289,6 +291,10 @@
</span><span class="cx"> 
</span><span class="cx">     bool isAlwaysOnLoggingAllowed() const;
</span><span class="cx"> 
</span><ins>+    void startIconLoading();
+    WEBCORE_EXPORT void didGetLoadDecisionForIcon(bool decision, uint64_t loadIdentifier, uint64_t newCallbackID);
+    void finishedLoadingIcon(IconLoader&amp;, SharedBuffer*);
+
</ins><span class="cx"> protected:
</span><span class="cx">     WEBCORE_EXPORT DocumentLoader(const ResourceRequest&amp;, const SubstituteData&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -441,9 +447,14 @@
</span><span class="cx">     bool m_waitingForContentPolicy { false };
</span><span class="cx">     bool m_waitingForNavigationPolicy { false };
</span><span class="cx"> 
</span><ins>+    // For IconDatabase-style loads
</ins><span class="cx">     RefPtr&lt;IconLoadDecisionCallback&gt; m_iconLoadDecisionCallback;
</span><span class="cx">     RefPtr&lt;IconDataCallback&gt; m_iconDataCallback;
</span><span class="cx"> 
</span><ins>+    // For IconLoadingClient-style loads
+    HashMap&lt;uint64_t, LinkIcon&gt; m_iconsPendingLoadDecision;
+    HashMap&lt;std::unique_ptr&lt;IconLoader&gt;, uint64_t&gt; m_iconLoaders;
+
</ins><span class="cx">     bool m_subresourceLoadersArePageCacheAcceptable;
</span><span class="cx">     ShouldOpenExternalURLsPolicy m_shouldOpenExternalURLsPolicy { ShouldOpenExternalURLsPolicy::ShouldNotAllow };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderFrameLoaderClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/FrameLoaderClient.h (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/FrameLoaderClient.h        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebCore/loader/FrameLoaderClient.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;FrameLoaderTypes.h&quot;
</span><span class="cx"> #include &quot;LayoutMilestones.h&quot;
</span><ins>+#include &quot;LinkIcon.h&quot;
</ins><span class="cx"> #include &quot;ResourceLoadPriority.h&quot;
</span><span class="cx"> #include &lt;functional&gt;
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="lines">@@ -354,6 +355,10 @@
</span><span class="cx">     virtual void prefetchDNS(const String&amp;) = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual void didRestoreScrollPosition() { }
</span><ins>+
+    virtual bool useIconLoadingClient() { return false; }
+    virtual void getLoadDecisionForIcon(const LinkIcon&amp;, uint64_t) { }
+    virtual void finishedLoadingIcon(uint64_t, SharedBuffer*) { }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreloadericonIconLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/icon/IconLoader.cpp (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/icon/IconLoader.cpp        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebCore/loader/icon/IconLoader.cpp        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -44,10 +44,17 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> IconLoader::IconLoader(Frame&amp; frame)
</span><del>-    : m_frame(frame)
</del><ins>+    : m_frame(&amp;frame)
+    , m_url(frame.loader().icon().url())
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+IconLoader::IconLoader(DocumentLoader&amp; documentLoader, const URL&amp; url)
+    : m_documentLoader(&amp;documentLoader)
+    , m_url(url)
+{
+}
+
</ins><span class="cx"> IconLoader::~IconLoader()
</span><span class="cx"> {
</span><span class="cx">     stopLoading();
</span><span class="lines">@@ -55,10 +62,19 @@
</span><span class="cx"> 
</span><span class="cx"> void IconLoader::startLoading()
</span><span class="cx"> {
</span><del>-    if (m_resource || !m_frame.document())
</del><ins>+    ASSERT(m_frame || m_documentLoader);
+
+    if (m_resource)
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    ResourceRequest resourceRequest(m_frame.loader().icon().url());
</del><ins>+    if (m_frame &amp;&amp; !m_frame-&gt;document())
+        return;
+
+
+    if (m_documentLoader &amp;&amp; !m_documentLoader-&gt;frame())
+        return;
+
+    ResourceRequest resourceRequest = m_documentLoader ? m_url :  m_frame-&gt;loader().icon().url();
</ins><span class="cx">     resourceRequest.setPriority(ResourceLoadPriority::Low);
</span><span class="cx"> 
</span><span class="cx">     // ContentSecurityPolicyImposition::DoPolicyCheck is a placeholder value. It does not affect the request since Content Security Policy does not apply to raw resources.
</span><span class="lines">@@ -66,11 +82,12 @@
</span><span class="cx"> 
</span><span class="cx">     request.setInitiator(cachedResourceRequestInitiators().icon);
</span><span class="cx"> 
</span><del>-    m_resource = m_frame.document()-&gt;cachedResourceLoader().requestRawResource(WTFMove(request));
</del><ins>+    auto* frame = m_frame ? m_frame : m_documentLoader-&gt;frame();
+    m_resource = frame-&gt;document()-&gt;cachedResourceLoader().requestRawResource(WTFMove(request));
</ins><span class="cx">     if (m_resource)
</span><span class="cx">         m_resource-&gt;addClient(*this);
</span><span class="cx">     else
</span><del>-        LOG_ERROR(&quot;Failed to start load for icon at url %s&quot;, m_frame.loader().icon().url().string().ascii().data());
</del><ins>+        LOG_ERROR(&quot;Failed to start load for icon at url %s&quot;, resourceRequest.url().string().ascii().data());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IconLoader::stopLoading()
</span><span class="lines">@@ -100,12 +117,19 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     LOG(IconDatabase, &quot;IconLoader::finishLoading() - Committing iconURL %s to database&quot;, m_resource-&gt;url().string().ascii().data());
</span><del>-    m_frame.loader().icon().commitToDatabase(m_resource-&gt;url());
-    // Setting the icon data only after committing to the database ensures that the data is
-    // kept in memory (so it does not have to be read from the database asynchronously), since
-    // there is a page URL referencing it.
-    iconDatabase().setIconDataForIconURL(data, m_resource-&gt;url().string());
-    m_frame.loader().client().dispatchDidReceiveIcon();
</del><ins>+
+    if (m_frame) {
+        m_frame-&gt;loader().icon().commitToDatabase(m_resource-&gt;url());
+
+        // Setting the icon data only after committing to the database ensures that the data is
+        // kept in memory (so it does not have to be read from the database asynchronously), since
+        // there is a page URL referencing it.
+        iconDatabase().setIconDataForIconURL(data, m_resource-&gt;url().string());
+        m_frame-&gt;loader().client().dispatchDidReceiveIcon();
+
+    } else
+        m_documentLoader-&gt;finishedLoadingIcon(*this, data);
+
</ins><span class="cx">     stopLoading();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloadericonIconLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/icon/IconLoader.h (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/icon/IconLoader.h        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebCore/loader/icon/IconLoader.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CachedRawResourceClient.h&quot;
</span><span class="cx"> #include &quot;CachedResourceHandle.h&quot;
</span><ins>+#include &quot;URL.h&quot;
</ins><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -33,6 +34,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class CachedRawResource;
</span><ins>+class DocumentLoader;
</ins><span class="cx"> class Frame;
</span><span class="cx"> 
</span><span class="cx"> class IconLoader final : private CachedRawResourceClient {
</span><span class="lines">@@ -39,6 +41,7 @@
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(IconLoader); WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><span class="cx">     explicit IconLoader(Frame&amp;);
</span><ins>+    IconLoader(DocumentLoader&amp;, const URL&amp;);
</ins><span class="cx">     virtual ~IconLoader();
</span><span class="cx"> 
</span><span class="cx">     void startLoading();
</span><span class="lines">@@ -47,7 +50,9 @@
</span><span class="cx"> private:
</span><span class="cx">     void notifyFinished(CachedResource&amp;) final;
</span><span class="cx"> 
</span><del>-    Frame&amp; m_frame;
</del><ins>+    Frame* m_frame { nullptr };
+    DocumentLoader* m_documentLoader { nullptr };
+    URL m_url;
</ins><span class="cx">     CachedResourceHandle&lt;CachedRawResource&gt; m_resource;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformLinkIconh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/LinkIcon.h (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/LinkIcon.h        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebCore/platform/LinkIcon.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -37,6 +37,34 @@
</span><span class="cx">     LinkIconType type;
</span><span class="cx">     String mimeType;
</span><span class="cx">     std::optional&lt;unsigned&gt; size;
</span><ins>+
+    template&lt;class Encoder&gt; void encode(Encoder&amp;) const;
+    template&lt;class Decoder&gt; static bool decode(Decoder&amp;, LinkIcon&amp;);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><ins>+template&lt;class Encoder&gt;
+void LinkIcon::encode(Encoder&amp; encoder) const
+{
+    encoder &lt;&lt; url &lt;&lt; mimeType &lt;&lt; size;
+    encoder.encodeEnum(type);
+}
+
+template&lt;class Decoder&gt;
+bool LinkIcon::decode(Decoder&amp; decoder, LinkIcon&amp; result)
+{
+    if (!decoder.decode(result.url))
+        return false;
+
+    if (!decoder.decode(result.mimeType))
+        return false;
+
+    if (!decoder.decode(result.size))
+        return false;
+
+    if (!decoder.decodeEnum(result.type))
+        return false;
+
+    return true;
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/ChangeLog        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -1,3 +1,72 @@
</span><ins>+2016-12-09  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Re-landing:
+        Add _WKIconLoadingDelegate SPI.
+        https://bugs.webkit.org/show_bug.cgi?id=164894
+
+        Reviewed by Alex Christensen.
+
+        With this client, WebCore will ask the FrameLoaderClient about each icon found in the &lt;head&gt;.
+
+        WebKit2 will then ask the embedding app - for each icon - if it wants that icon to load.
+
+        For icons the app decides to load, WebKit will pass the data to the app without storing locally.
+
+        * UIProcess/API/APIIconLoadingClient.h: Copied from Source/WebCore/html/LinkIconCollector.h.
+        (API::IconLoadingClient::~IconLoadingClient):
+        (API::IconLoadingClient::getLoadDecisionForIcon):
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _initializeWithConfiguration:]):
+        (-[WKWebView _iconLoadingDelegate]):
+        (-[WKWebView _setIconLoadingDelegate:]):
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+
+        * UIProcess/API/Cocoa/_WKIconLoadingDelegate.h: Copied from Source/WebCore/html/LinkIconCollector.h.
+
+        * UIProcess/API/Cocoa/_WKLinkIconParameters.h: Copied from Source/WebCore/html/LinkIconCollector.h.
+        * UIProcess/API/Cocoa/_WKLinkIconParameters.mm: Copied from Source/WebCore/html/LinkIconCollector.h.
+        (-[_WKLinkIconParameters _initWithLinkIcon:]):
+        (-[_WKLinkIconParameters url]):
+        (-[_WKLinkIconParameters mimeType]):
+        (-[_WKLinkIconParameters size]):
+        (-[_WKLinkIconParameters iconType]):
+        * UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h: Copied from Source/WebCore/html/LinkIconCollector.h.
+
+        * UIProcess/Cocoa/IconLoadingDelegate.h: Copied from Source/WebCore/html/LinkIconCollector.h.
+        * UIProcess/Cocoa/IconLoadingDelegate.mm: Added.
+        (WebKit::IconLoadingDelegate::IconLoadingDelegate):
+        (WebKit::IconLoadingDelegate::~IconLoadingDelegate):
+        (WebKit::IconLoadingDelegate::createIconLoadingClient):
+        (WebKit::IconLoadingDelegate::delegate):
+        (WebKit::IconLoadingDelegate::setDelegate):
+        (WebKit::IconLoadingDelegate::IconLoadingClient::IconLoadingClient):
+        (WebKit::IconLoadingDelegate::IconLoadingClient::~IconLoadingClient):
+        (WebKit::IconLoadingDelegate::IconLoadingClient::getLoadDecisionForIcon):
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::setIconLoadingClient):
+        (WebKit::WebPageProxy::getLoadDecisionForIcon):
+        (WebKit::WebPageProxy::finishedLoadingIcon):
+        * UIProcess/WebPageProxy.h:
+        (WebKit::WebPageProxy::iconLoadingClient):
+        * UIProcess/WebPageProxy.messages.in:
+
+        * WebKit2.xcodeproj/project.pbxproj:
+
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::useIconLoadingClient):
+        (WebKit::WebFrameLoaderClient::getLoadDecisionForIcon):
+        (WebKit::WebFrameLoaderClient::finishedLoadingIcon):
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
+        (WebKit::WebFrameLoaderClient::setUseIconLoadingClient):
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::didGetLoadDecisionForIcon):
+        (WebKit::WebPage::setUseIconLoadingClient):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+
</ins><span class="cx"> 2016-12-09  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix initialization of contentUpdateFrequency
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformMaccmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/PlatformMac.cmake (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/PlatformMac.cmake        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/PlatformMac.cmake        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -209,6 +209,7 @@
</span><span class="cx">     UIProcess/API/Cocoa/_WKElementAction.mm
</span><span class="cx">     UIProcess/API/Cocoa/_WKErrorRecoveryAttempting.mm
</span><span class="cx">     UIProcess/API/Cocoa/_WKExperimentalFeature.mm
</span><ins>+    UIProcess/API/Cocoa/_WKLinkIconParameters.mm
</ins><span class="cx">     UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm
</span><span class="cx">     UIProcess/API/Cocoa/_WKRemoteWebInspectorViewController.mm
</span><span class="cx">     UIProcess/API/Cocoa/_WKSessionState.mm
</span><span class="lines">@@ -232,6 +233,7 @@
</span><span class="cx">     UIProcess/Cocoa/DownloadClient.mm
</span><span class="cx">     UIProcess/Cocoa/FindClient.mm
</span><span class="cx">     UIProcess/Cocoa/FullscreenClient.mm
</span><ins>+    UIProcess/Cocoa/IconLoadingDelegate.mm
</ins><span class="cx">     UIProcess/Cocoa/NavigationState.mm
</span><span class="cx">     UIProcess/Cocoa/RemoteLayerTreeScrollingPerformanceData.mm
</span><span class="cx">     UIProcess/Cocoa/SessionStateCoding.mm
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIAPIIconLoadingClienthfromrev209639trunkSourceWebCoreplatformLinkIconh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebKit2/UIProcess/API/APIIconLoadingClient.h (from rev 209639, trunk/Source/WebCore/platform/LinkIcon.h) (0 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/APIIconLoadingClient.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/APIIconLoadingClient.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -0,0 +1,47 @@
</span><ins>+/*
+ * Copyright (C) 2016 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.
+ */
+
+#pragma once
+
+#include &quot;GenericCallback.h&quot;
+#include &lt;WebCore/LinkIcon.h&gt;
+#include &lt;wtf/Function.h&gt;
+
+namespace IPC {
+class DataReference;
+}
+
+namespace API {
+
+class IconLoadingClient {
+public:
+    virtual ~IconLoadingClient() { }
+
+    virtual void getLoadDecisionForIcon(const WebCore::LinkIcon&amp;, Function&lt;void (std::function&lt;void (API::Data*, WebKit::CallbackBase::Error)&gt;)&gt;&amp;&amp; completionHandler) {
+        completionHandler(nullptr);
+    }
+};
+
+} // namespace API
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #import &quot;DiagnosticLoggingClient.h&quot;
</span><span class="cx"> #import &quot;FindClient.h&quot;
</span><span class="cx"> #import &quot;FullscreenClient.h&quot;
</span><ins>+#import &quot;IconLoadingDelegate.h&quot;
</ins><span class="cx"> #import &quot;LegacySessionStateCoding.h&quot;
</span><span class="cx"> #import &quot;Logging.h&quot;
</span><span class="cx"> #import &quot;NavigationState.h&quot;
</span><span class="lines">@@ -195,6 +196,7 @@
</span><span class="cx"> @implementation WKWebView {
</span><span class="cx">     std::unique_ptr&lt;WebKit::NavigationState&gt; _navigationState;
</span><span class="cx">     std::unique_ptr&lt;WebKit::UIDelegate&gt; _uiDelegate;
</span><ins>+    std::unique_ptr&lt;WebKit::IconLoadingDelegate&gt; _iconLoadingDelegate;
</ins><span class="cx"> 
</span><span class="cx">     _WKRenderingProgressEvents _observedRenderingProgressEvents;
</span><span class="cx"> 
</span><span class="lines">@@ -568,6 +570,8 @@
</span><span class="cx">     _page-&gt;setFindClient(std::make_unique&lt;WebKit::FindClient&gt;(self));
</span><span class="cx">     _page-&gt;setDiagnosticLoggingClient(std::make_unique&lt;WebKit::DiagnosticLoggingClient&gt;(self));
</span><span class="cx"> 
</span><ins>+    _iconLoadingDelegate = std::make_unique&lt;WebKit::IconLoadingDelegate&gt;(self);
+
</ins><span class="cx"> #if ENABLE(FULLSCREEN_API)
</span><span class="cx">     _page-&gt;setFullscreenClient(std::make_unique&lt;WebKit::FullscreenClient&gt;(self));
</span><span class="cx"> #endif
</span><span class="lines">@@ -682,6 +686,17 @@
</span><span class="cx">     _uiDelegate-&gt;setDelegate(UIDelegate);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (id &lt;_WKIconLoadingDelegate&gt;)_iconLoadingDelegate
+{
+    return _iconLoadingDelegate-&gt;delegate().autorelease();
+}
+
+- (void)_setIconLoadingDelegate:(id&lt;_WKIconLoadingDelegate&gt;)iconLoadingDelegate
+{
+    _page-&gt;setIconLoadingClient(_iconLoadingDelegate-&gt;createIconLoadingClient());
+    _iconLoadingDelegate-&gt;setDelegate(iconLoadingDelegate);
+}
+
</ins><span class="cx"> - (WKNavigation *)loadRequest:(NSURLRequest *)request
</span><span class="cx"> {
</span><span class="cx">     auto navigation = _page-&gt;loadRequest(request);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -56,6 +56,7 @@
</span><span class="cx"> @class WKBrowsingContextHandle;
</span><span class="cx"> @class _WKFrameHandle;
</span><span class="cx"> @class _WKHitTestResult;
</span><ins>+@class _WKIconLoadingDelegate;
</ins><span class="cx"> @class _WKRemoteObjectRegistry;
</span><span class="cx"> @class _WKSessionState;
</span><span class="cx"> @class _WKWebViewPrintFormatter;
</span><span class="lines">@@ -63,6 +64,7 @@
</span><span class="cx"> @protocol WKHistoryDelegatePrivate;
</span><span class="cx"> @protocol _WKDiagnosticLoggingDelegate;
</span><span class="cx"> @protocol _WKFindDelegate;
</span><ins>+@protocol _WKIconLoadingDelegate;
</ins><span class="cx"> @protocol _WKInputDelegate;
</span><span class="cx"> @protocol _WKFullscreenDelegate;
</span><span class="cx"> 
</span><span class="lines">@@ -75,6 +77,7 @@
</span><span class="cx"> @property (nonatomic, setter=_setObservedRenderingProgressEvents:) _WKRenderingProgressEvents _observedRenderingProgressEvents;
</span><span class="cx"> 
</span><span class="cx"> @property (nonatomic, weak, setter=_setHistoryDelegate:) id &lt;WKHistoryDelegatePrivate&gt; _historyDelegate;
</span><ins>+@property (nonatomic, weak, setter=_setIconLoadingDelegate:) id &lt;_WKIconLoadingDelegate&gt; _iconLoadingDelegate;
</ins><span class="cx"> 
</span><span class="cx"> @property (nonatomic, readonly) NSURL *_unreachableURL;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKIconLoadingDelegatehfromrev209639trunkSourceWebCoreplatformLinkIconh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKIconLoadingDelegate.h (from rev 209639, trunk/Source/WebCore/platform/LinkIcon.h) (0 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKIconLoadingDelegate.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKIconLoadingDelegate.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+/*
+ * Copyright (C) 2016 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
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class _WKLinkIconParameters;
+
+@protocol _WKIconLoadingDelegate &lt;NSObject&gt;
+@optional
+
+- (void)webView:(WKWebView *)webView shouldLoadIconWithParameters:(_WKLinkIconParameters *)parameters completionHandler:(void (^)(void (^)(NSData*)))completionHandler;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKLinkIconParametershfromrev209639trunkSourceWebCoreplatformLinkIconh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.h (from rev 209639, trunk/Source/WebCore/platform/LinkIcon.h) (0 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -0,0 +1,47 @@
</span><ins>+/*
+ * Copyright (C) 2016 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
+
+#import &lt;Foundation/Foundation.h&gt;
+
+typedef NS_ENUM(NSInteger, WKLinkIconType) {
+    WKLinkIconTypeFavicon,
+    WKLinkIconTypeTouchIcon,
+    WKLinkIconTypeTouchPrecomposedIcon,
+};
+
+@interface _WKLinkIconParameters : NSObject
+
+@property (nonatomic, readonly, copy) NSURL *url;
+@property (nonatomic, readonly) WKLinkIconType iconType;
+@property (nonatomic, readonly, copy) NSString *mimeType;
+@property (nonatomic, readonly, copy) NSNumber *size;
+
+@end
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKLinkIconParametersmmfromrev209639trunkSourceWebCoreplatformLinkIconh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.mm (from rev 209639, trunk/Source/WebCore/platform/LinkIcon.h) (0 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.mm                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.mm        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -0,0 +1,88 @@
</span><ins>+/*
+ * Copyright (C) 2016 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 &quot;config.h&quot;
+#import &quot;_WKLinkIconParametersInternal.h&quot;
+
+#if WK_API_ENABLED
+
+#import &lt;WebCore/LinkIcon.h&gt;
+
+@implementation _WKLinkIconParameters {
+    RetainPtr&lt;NSURL&gt; _url;
+    WKLinkIconType _iconType;
+    RetainPtr&lt;NSString&gt; _mimeType;
+    RetainPtr&lt;NSNumber&gt; _size;
+}
+
+- (instancetype)_initWithLinkIcon:(const WebCore::LinkIcon&amp;)linkIcon
+{
+    if (!(self = [super init]))
+        return nil;
+
+    _url = adoptNS([(NSURL *)linkIcon.url copy]);
+    _mimeType = adoptNS([(NSString *)linkIcon.mimeType copy]);
+
+    if (linkIcon.size)
+        _size = adoptNS([[NSNumber alloc] initWithUnsignedInt:linkIcon.size.value()]);
+
+    switch (linkIcon.type) {
+    case WebCore::LinkIconType::Favicon:
+        _iconType = WKLinkIconTypeFavicon;
+        break;
+    case WebCore::LinkIconType::TouchIcon:
+        _iconType = WKLinkIconTypeTouchIcon;
+        break;
+    case WebCore::LinkIconType::TouchPrecomposedIcon:
+        _iconType = WKLinkIconTypeTouchPrecomposedIcon;
+        break;
+    }
+
+    return self;
+}
+
+- (NSURL *)url
+{
+    return _url.get();
+}
+
+- (NSString *)mimeType
+{
+    return _mimeType.get();
+}
+
+- (NSNumber *)size
+{
+    return _size.get();
+}
+
+- (WKLinkIconType)iconType
+{
+    return _iconType;
+}
+
+@end
+
+#endif // WK_API_ENABLED
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoa_WKLinkIconParametersInternalhfromrev209639trunkSourceWebCoreplatformLinkIconh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h (from rev 209639, trunk/Source/WebCore/platform/LinkIcon.h) (0 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -0,0 +1,40 @@
</span><ins>+/*
+ * Copyright (C) 2016 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 &quot;_WKLinkIconParameters.h&quot;
+
+#if WK_API_ENABLED
+
+namespace WebCore {
+struct LinkIcon;
+}
+
+@interface _WKLinkIconParameters ()
+
+- (instancetype)_initWithLinkIcon:(const WebCore::LinkIcon&amp;)linkIcon;
+
+@end
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessCocoaIconLoadingDelegatehfromrev209639trunkSourceWebCoreplatformLinkIconh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.h (from rev 209639, trunk/Source/WebCore/platform/LinkIcon.h) (0 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -0,0 +1,73 @@
</span><ins>+/*
+ * Copyright (C) 2016 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.
+ */
+
+#pragma once
+
+#import &quot;WKFoundation.h&quot;
+
+#if WK_API_ENABLED
+
+#import &quot;APIIconLoadingClient.h&quot;
+#import &quot;WeakObjCPtr.h&quot;
+#import &lt;wtf/RetainPtr.h&gt;
+
+@class WKWebView;
+@protocol _WKIconLoadingDelegate;
+
+namespace WebKit {
+
+class IconLoadingDelegate {
+public:
+    explicit IconLoadingDelegate(WKWebView *);
+    ~IconLoadingDelegate();
+
+    std::unique_ptr&lt;API::IconLoadingClient&gt; createIconLoadingClient();
+
+    RetainPtr&lt;id &lt;_WKIconLoadingDelegate&gt; &gt; delegate();
+    void setDelegate(id &lt;_WKIconLoadingDelegate&gt;);
+
+private:
+    class IconLoadingClient : public API::IconLoadingClient {
+    public:
+        explicit IconLoadingClient(IconLoadingDelegate&amp;);
+        ~IconLoadingClient();
+
+    private:
+        void getLoadDecisionForIcon(const WebCore::LinkIcon&amp;, Function&lt;void (std::function&lt;void (API::Data*, WebKit::CallbackBase::Error)&gt;)&gt;&amp;&amp; completionHandler) override;
+
+        IconLoadingDelegate&amp; m_iconLoadingDelegate;
+    };
+
+    WKWebView *m_webView;
+    WeakObjCPtr&lt;id &lt;_WKIconLoadingDelegate&gt; &gt; m_delegate;
+
+    struct {
+        bool webViewShouldLoadIconWithParametersCompletionHandler : 1;
+    } m_delegateMethods;
+};
+
+} // namespace WebKit
+
+#endif // WK_API_ENABLED
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessCocoaIconLoadingDelegatemm"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.mm (0 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.mm                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.mm        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -0,0 +1,104 @@
</span><ins>+/*
+ * Copyright (C) 2016 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 &quot;config.h&quot;
+#import &quot;IconLoadingDelegate.h&quot;
+
+#if WK_API_ENABLED
+
+#include &quot;WKNSData.h&quot;
+#include &quot;_WKIconLoadingDelegate.h&quot;
+#include &quot;_WKLinkIconParametersInternal.h&quot;
+
+namespace WebKit {
+
+IconLoadingDelegate::IconLoadingDelegate(WKWebView *webView)
+    : m_webView(webView)
+{
+}
+
+IconLoadingDelegate::~IconLoadingDelegate()
+{
+}
+
+std::unique_ptr&lt;API::IconLoadingClient&gt; IconLoadingDelegate::createIconLoadingClient()
+{
+    return std::make_unique&lt;IconLoadingClient&gt;(*this);
+}
+
+RetainPtr&lt;id &lt;_WKIconLoadingDelegate&gt; &gt; IconLoadingDelegate::delegate()
+{
+    return m_delegate.get();
+}
+
+void IconLoadingDelegate::setDelegate(id &lt;_WKIconLoadingDelegate&gt; delegate)
+{
+    m_delegate = delegate;
+
+    m_delegateMethods.webViewShouldLoadIconWithParametersCompletionHandler = [delegate respondsToSelector:@selector(webView:shouldLoadIconWithParameters:completionHandler:)];
+}
+
+IconLoadingDelegate::IconLoadingClient::IconLoadingClient(IconLoadingDelegate&amp; iconLoadingDelegate)
+    : m_iconLoadingDelegate(iconLoadingDelegate)
+{
+}
+
+IconLoadingDelegate::IconLoadingClient::~IconLoadingClient()
+{
+}
+
+typedef void (^IconLoadCompletionHandler)(NSData*);
+
+void IconLoadingDelegate::IconLoadingClient::getLoadDecisionForIcon(const WebCore::LinkIcon&amp; linkIcon, Function&lt;void (std::function&lt;void (API::Data*, WebKit::CallbackBase::Error)&gt;)&gt;&amp;&amp; completionHandler)
+{
+    if (!m_iconLoadingDelegate.m_delegateMethods.webViewShouldLoadIconWithParametersCompletionHandler) {
+        completionHandler(nullptr);
+        return;
+    }
+
+    auto delegate = m_iconLoadingDelegate.m_delegate.get();
+    if (!delegate) {
+        completionHandler(nullptr);
+        return;
+    }
+
+    RetainPtr&lt;_WKLinkIconParameters&gt; parameters = adoptNS([[_WKLinkIconParameters alloc] _initWithLinkIcon:linkIcon]);
+
+    [delegate webView:m_iconLoadingDelegate.m_webView shouldLoadIconWithParameters:parameters.get() completionHandler:^void (IconLoadCompletionHandler loadCompletionHandler) {
+        if (loadCompletionHandler) {
+            completionHandler([loadCompletionHandler = Block_copy(loadCompletionHandler)](API::Data* data, WebKit::CallbackBase::Error error) {
+                if (error != CallbackBase::Error::None || !data)
+                    loadCompletionHandler(nil);
+                else
+                    loadCompletionHandler(wrapper(*data));
+            });
+        } else
+            completionHandler(nullptr);
+    }];
+}
+
+} // namespace WebKit
+
+#endif // WK_API_ENABLED
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #include &quot;APIGeometry.h&quot;
</span><span class="cx"> #include &quot;APIHistoryClient.h&quot;
</span><span class="cx"> #include &quot;APIHitTestResult.h&quot;
</span><ins>+#include &quot;APIIconLoadingClient.h&quot;
</ins><span class="cx"> #include &quot;APILegacyContextHistoryClient.h&quot;
</span><span class="cx"> #include &quot;APILoaderClient.h&quot;
</span><span class="cx"> #include &quot;APINavigation.h&quot;
</span><span class="lines">@@ -627,6 +628,20 @@
</span><span class="cx">     setCanRunModal(m_uiClient-&gt;canRunModal());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPageProxy::setIconLoadingClient(std::unique_ptr&lt;API::IconLoadingClient&gt; iconLoadingClient)
+{
+    bool hasClient = iconLoadingClient.get();
+    if (!iconLoadingClient)
+        m_iconLoadingClient = std::make_unique&lt;API::IconLoadingClient&gt;();
+    else
+        m_iconLoadingClient = WTFMove(iconLoadingClient);
+
+    if (!isValid())
+        return;
+
+    m_process-&gt;send(Messages::WebPage::SetUseIconLoadingClient(hasClient), m_pageID);
+}
+
</ins><span class="cx"> void WebPageProxy::setFindClient(std::unique_ptr&lt;API::FindClient&gt; findClient)
</span><span class="cx"> {
</span><span class="cx">     if (!findClient) {
</span><span class="lines">@@ -6673,6 +6688,30 @@
</span><span class="cx">     m_pageClient.didRestoreScrollPosition();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPageProxy::getLoadDecisionForIcon(const WebCore::LinkIcon&amp; icon, uint64_t loadIdentifier)
+{
+    if (!m_iconLoadingClient)
+        return;
+
+    m_iconLoadingClient-&gt;getLoadDecisionForIcon(icon, [this, protectedThis = Ref&lt;WebPageProxy&gt;(*this), loadIdentifier](std::function&lt;void (API::Data*, CallbackBase::Error)&gt; callbackFunction) {
+        if (!isValid()) {
+            if (callbackFunction)
+                callbackFunction(nullptr, CallbackBase::Error::Unknown);
+            return;
+        }
+
+        bool decision = (bool)callbackFunction;
+        uint64_t newCallbackIdentifier = decision ? m_callbacks.put(WTFMove(callbackFunction), m_process-&gt;throttler().backgroundActivityToken()) : 0;
+
+        m_process-&gt;send(Messages::WebPage::DidGetLoadDecisionForIcon(decision, loadIdentifier, newCallbackIdentifier), m_pageID);
+    });
+}
+
+void WebPageProxy::finishedLoadingIcon(uint64_t callbackIdentifier, const IPC::DataReference&amp; data)
+{
+    dataCallback(data, callbackIdentifier);
+}
+
</ins><span class="cx"> void WebPageProxy::setResourceCachingDisabled(bool disabled)
</span><span class="cx"> {
</span><span class="cx">     if (m_isResourceCachingDisabled == disabled)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -130,6 +130,7 @@
</span><span class="cx"> class FormClient;
</span><span class="cx"> class FullscreenClient;
</span><span class="cx"> class HistoryClient;
</span><ins>+class IconLoadingClient;
</ins><span class="cx"> class LoaderClient;
</span><span class="cx"> class Navigation;
</span><span class="cx"> class NavigationClient;
</span><span class="lines">@@ -368,6 +369,9 @@
</span><span class="cx">     API::UIClient&amp; uiClient() { return *m_uiClient; }
</span><span class="cx">     void setUIClient(std::unique_ptr&lt;API::UIClient&gt;);
</span><span class="cx"> 
</span><ins>+    API::IconLoadingClient&amp; iconLoadingClient() { return *m_iconLoadingClient; }
+    void setIconLoadingClient(std::unique_ptr&lt;API::IconLoadingClient&gt;);
+
</ins><span class="cx">     void initializeWebPage();
</span><span class="cx"> 
</span><span class="cx">     void close();
</span><span class="lines">@@ -1141,6 +1145,9 @@
</span><span class="cx"> 
</span><span class="cx">     void didRestoreScrollPosition();
</span><span class="cx"> 
</span><ins>+    void getLoadDecisionForIcon(const WebCore::LinkIcon&amp;, uint64_t callbackID);
+    void finishedLoadingIcon(uint64_t callbackIdentifier, const IPC::DataReference&amp;);
+
</ins><span class="cx">     void setFocus(bool focused);
</span><span class="cx">     void setWindowFrame(const WebCore::FloatRect&amp;);
</span><span class="cx">     void getWindowFrame(WebCore::FloatRect&amp;);
</span><span class="lines">@@ -1593,6 +1600,7 @@
</span><span class="cx">     std::unique_ptr&lt;API::PolicyClient&gt; m_policyClient;
</span><span class="cx">     std::unique_ptr&lt;API::NavigationClient&gt; m_navigationClient;
</span><span class="cx">     std::unique_ptr&lt;API::HistoryClient&gt; m_historyClient;
</span><ins>+    std::unique_ptr&lt;API::IconLoadingClient&gt; m_iconLoadingClient;
</ins><span class="cx">     std::unique_ptr&lt;API::FormClient&gt; m_formClient;
</span><span class="cx">     std::unique_ptr&lt;API::UIClient&gt; m_uiClient;
</span><span class="cx">     std::unique_ptr&lt;API::FindClient&gt; m_findClient;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxymessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -478,6 +478,9 @@
</span><span class="cx"> 
</span><span class="cx">     DidRestoreScrollPosition()
</span><span class="cx"> 
</span><ins>+    GetLoadDecisionForIcon(struct WebCore::LinkIcon icon, uint64_t callbackID)
+    FinishedLoadingIcon(uint64_t callbackIdentifier, IPC::DataReference data);
+
</ins><span class="cx"> #if PLATFORM(MAC)
</span><span class="cx">     DidHandleAcceptedCandidate()
</span><span class="cx">     HandleActiveNowPlayingSessionInfoResponse(bool hasActiveSession, String title, double duration, double elapsedTime)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -893,6 +893,9 @@
</span><span class="cx">                 5106D7C418BDBE73000AB166 /* ContextMenuContextData.h in Headers */ = {isa = PBXBuildFile; fileRef = 5106D7C018BDBE73000AB166 /* ContextMenuContextData.h */; };
</span><span class="cx">                 510AFFB916542048001BA05E /* WebResourceLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 510AFFB716542048001BA05E /* WebResourceLoader.cpp */; };
</span><span class="cx">                 510AFFBA16542048001BA05E /* WebResourceLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 510AFFB816542048001BA05E /* WebResourceLoader.h */; };
</span><ins>+                510F59101DDE296900412FF5 /* _WKIconLoadingDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5143B25E1DDCDFD10014FAC6 /* _WKIconLoadingDelegate.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                510F59111DDE297000412FF5 /* _WKLinkIconParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 51C0C9791DDD78540032CAD3 /* _WKLinkIconParameters.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                510F59121DDE297700412FF5 /* _WKLinkIconParameters.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51C0C97A1DDD78540032CAD3 /* _WKLinkIconParameters.mm */; };
</ins><span class="cx">                 510FBB9A1288C95E00AFFDF4 /* WebContextMenuItemData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 510FBB981288C95E00AFFDF4 /* WebContextMenuItemData.cpp */; };
</span><span class="cx">                 510FBB9B1288C95E00AFFDF4 /* WebContextMenuItemData.h in Headers */ = {isa = PBXBuildFile; fileRef = 510FBB991288C95E00AFFDF4 /* WebContextMenuItemData.h */; };
</span><span class="cx">                 5110AE0C133C16CB0072717A /* WKIconDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5110AE0A133C16CB0072717A /* WKIconDatabase.cpp */; };
</span><span class="lines">@@ -1008,6 +1011,8 @@
</span><span class="cx">                 51ACBBA1127A8F2C00D203B9 /* WebContextMenuProxyMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51ACBB9F127A8F2C00D203B9 /* WebContextMenuProxyMac.mm */; };
</span><span class="cx">                 51B15A8413843A3900321AD8 /* EnvironmentUtilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51B15A8213843A3900321AD8 /* EnvironmentUtilities.cpp */; };
</span><span class="cx">                 51B15A8513843A3900321AD8 /* EnvironmentUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 51B15A8313843A3900321AD8 /* EnvironmentUtilities.h */; };
</span><ins>+                51C0C9741DDD76000032CAD3 /* IconLoadingDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 51C0C9721DDD74F00032CAD3 /* IconLoadingDelegate.h */; };
+                51C0C9751DDD76030032CAD3 /* IconLoadingDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51C0C9731DDD74F00032CAD3 /* IconLoadingDelegate.mm */; };
</ins><span class="cx">                 51CD1C5D1B3493AF00142CA5 /* WKSecurityOriginRef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51CD1C591B3493A900142CA5 /* WKSecurityOriginRef.cpp */; };
</span><span class="cx">                 51CD1C5E1B3493B400142CA5 /* WKSecurityOriginRef.h in Headers */ = {isa = PBXBuildFile; fileRef = 51CD1C5A1B3493A900142CA5 /* WKSecurityOriginRef.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 51CD1C651B34B9D400142CA5 /* WKSecurityOrigin.h in Headers */ = {isa = PBXBuildFile; fileRef = 51CD1C5F1B34B9C900142CA5 /* WKSecurityOrigin.h */; settings = {ATTRIBUTES = (Public, ); }; };
</span><span class="lines">@@ -3059,6 +3064,8 @@
</span><span class="cx">                 513E462C1AD837560016234A /* WKSharingServicePickerDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKSharingServicePickerDelegate.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 514129911C6428100059E714 /* WebIDBConnectionToServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebIDBConnectionToServer.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 514129921C6428100059E714 /* WebIDBConnectionToServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebIDBConnectionToServer.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                5143B25E1DDCDFD10014FAC6 /* _WKIconLoadingDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKIconLoadingDelegate.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                5143B2611DDD0DA00014FAC6 /* APIIconLoadingClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIIconLoadingClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 514BDED216C98EDD00E4E25E /* StatisticsRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatisticsRequest.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 514D9F5519119D35000063A7 /* ServicesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServicesController.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 514D9F5619119D35000063A7 /* ServicesController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ServicesController.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -3128,6 +3135,11 @@
</span><span class="cx">                 51ACC9351628064800342550 /* NetworkProcessMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkProcessMessages.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51B15A8213843A3900321AD8 /* EnvironmentUtilities.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = EnvironmentUtilities.cpp; path = unix/EnvironmentUtilities.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51B15A8313843A3900321AD8 /* EnvironmentUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EnvironmentUtilities.h; path = unix/EnvironmentUtilities.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                51C0C9721DDD74F00032CAD3 /* IconLoadingDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IconLoadingDelegate.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                51C0C9731DDD74F00032CAD3 /* IconLoadingDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IconLoadingDelegate.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
+                51C0C9791DDD78540032CAD3 /* _WKLinkIconParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKLinkIconParameters.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                51C0C97A1DDD78540032CAD3 /* _WKLinkIconParameters.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKLinkIconParameters.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
+                51C0C97B1DDD78540032CAD3 /* _WKLinkIconParametersInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKLinkIconParametersInternal.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 51CD1C591B3493A900142CA5 /* WKSecurityOriginRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKSecurityOriginRef.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51CD1C5A1B3493A900142CA5 /* WKSecurityOriginRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSecurityOriginRef.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51CD1C5F1B34B9C900142CA5 /* WKSecurityOrigin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSecurityOrigin.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -4890,6 +4902,8 @@
</span><span class="cx">                                 00B9661718E25AE100CE1F88 /* FindClient.mm */,
</span><span class="cx">                                 CD78E1121DB7D7ED0014A2DE /* FullscreenClient.mm */,
</span><span class="cx">                                 CD78E1131DB7D7ED0014A2DE /* FullscreenClient.h */,
</span><ins>+                                51C0C9721DDD74F00032CAD3 /* IconLoadingDelegate.h */,
+                                51C0C9731DDD74F00032CAD3 /* IconLoadingDelegate.mm */,
</ins><span class="cx">                                 0F0C365918C0555800F607D7 /* LayerRepresentation.h */,
</span><span class="cx">                                 1ABC3DF41899E437004F0626 /* NavigationState.h */,
</span><span class="cx">                                 1ABC3DF31899E437004F0626 /* NavigationState.mm */,
</span><span class="lines">@@ -5278,8 +5292,12 @@
</span><span class="cx">                                 2E7A94491BBD95C600945547 /* _WKFocusedElementInfo.h */,
</span><span class="cx">                                 37A64E5618F38F4600EB30F1 /* _WKFormInputSession.h */,
</span><span class="cx">                                 CD78E1181DB7E5AD0014A2DE /* _WKFullscreenDelegate.h */,
</span><ins>+                                5143B25E1DDCDFD10014FAC6 /* _WKIconLoadingDelegate.h */,
</ins><span class="cx">                                 37A64E5418F38E3C00EB30F1 /* _WKInputDelegate.h */,
</span><span class="cx">                                 2D790A9C1AD7050D00AB90B3 /* _WKLayoutMode.h */,
</span><ins>+                                51C0C9791DDD78540032CAD3 /* _WKLinkIconParameters.h */,
+                                51C0C97A1DDD78540032CAD3 /* _WKLinkIconParameters.mm */,
+                                51C0C97B1DDD78540032CAD3 /* _WKLinkIconParametersInternal.h */,
</ins><span class="cx">                                 9323611D1B015DA800FA9232 /* _WKOverlayScrollbarStyle.h */,
</span><span class="cx">                                 1A43E828188F3CDC009E4D30 /* _WKProcessPoolConfiguration.h */,
</span><span class="cx">                                 1A43E827188F3CDC009E4D30 /* _WKProcessPoolConfiguration.mm */,
</span><span class="lines">@@ -6395,6 +6413,7 @@
</span><span class="cx">                                 93A88B431BC8828C00ABA5C2 /* APIHitTestResult.h */,
</span><span class="cx">                                 7CE4D2061A46775700C7F152 /* APILegacyContextHistoryClient.h */,
</span><span class="cx">                                 1A2464F21891E45100234C5B /* APILoaderClient.h */,
</span><ins>+                                5143B2611DDD0DA00014FAC6 /* APIIconLoadingClient.h */,
</ins><span class="cx">                                 7CD3A4801A5D02FA009623B8 /* APINavigation.cpp */,
</span><span class="cx">                                 7CD3A4811A5D02FA009623B8 /* APINavigation.h */,
</span><span class="cx">                                 2DF9EEEA1A7836EE00B6CFBE /* APINavigationAction.h */,
</span><span class="lines">@@ -7964,6 +7983,7 @@
</span><span class="cx">                                 1A7865BA16CAC71500ACE83A /* PluginProcessConnectionManagerMessages.h in Headers */,
</span><span class="cx">                                 1A2BB6D114117B4D000F35D4 /* PluginProcessConnectionMessages.h in Headers */,
</span><span class="cx">                                 1A2D90D21281C966001EB962 /* PluginProcessCreationParameters.h in Headers */,
</span><ins>+                                510F59101DDE296900412FF5 /* _WKIconLoadingDelegate.h in Headers */,
</ins><span class="cx">                                 1A0EC603124A9F2C007EF4A5 /* PluginProcessManager.h in Headers */,
</span><span class="cx">                                 1A0EC6C0124BBD9B007EF4A5 /* PluginProcessMessages.h in Headers */,
</span><span class="cx">                                 1A0EC75E124BC7B2007EF4A5 /* PluginProcessProxy.h in Headers */,
</span><span class="lines">@@ -8050,6 +8070,7 @@
</span><span class="cx">                                 4A3CC18D19B0641900D14AEF /* UserMediaPermissionRequestProxy.h in Headers */,
</span><span class="cx">                                 E4E864931B16750700C82F40 /* VersionChecks.h in Headers */,
</span><span class="cx">                                 2D125C5E1857EA05003BA3CB /* ViewGestureController.h in Headers */,
</span><ins>+                                510F59111DDE297000412FF5 /* _WKLinkIconParameters.h in Headers */,
</ins><span class="cx">                                 2D1B5D5E185869C8006C6596 /* ViewGestureControllerMessages.h in Headers */,
</span><span class="cx">                                 2D819BA21862800E001F03D1 /* ViewGestureGeometryCollectorMessages.h in Headers */,
</span><span class="cx">                                 2D6CD119189058A500E5A4A0 /* ViewSnapshotStore.h in Headers */,
</span><span class="lines">@@ -8416,6 +8437,7 @@
</span><span class="cx">                                 1AA13212191D5924009C1489 /* WKNavigationResponsePrivate.h in Headers */,
</span><span class="cx">                                 2D3A65DF1A7C3A7D00CAC637 /* WKNavigationResponseRef.h in Headers */,
</span><span class="cx">                                 318BE17914743E6F00A8FBB2 /* WKNotification.h in Headers */,
</span><ins>+                                51C0C9741DDD76000032CAD3 /* IconLoadingDelegate.h in Headers */,
</ins><span class="cx">                                 318BE17114743DB100A8FBB2 /* WKNotificationManager.h in Headers */,
</span><span class="cx">                                 31A2EC74148D59CA00810D71 /* WKNotificationPermissionRequest.h in Headers */,
</span><span class="cx">                                 312C0C4A146DDC8A0016C911 /* WKNotificationProvider.h in Headers */,
</span><span class="lines">@@ -9657,6 +9679,7 @@
</span><span class="cx">                                 BC1BE1E112D54A410004A228 /* WebGeolocationClient.cpp in Sources */,
</span><span class="cx">                                 BC0E5FE612D697160012A72A /* WebGeolocationManager.cpp in Sources */,
</span><span class="cx">                                 BC0E606112D6BA910012A72A /* WebGeolocationManagerMessageReceiver.cpp in Sources */,
</span><ins>+                                510F59121DDE297700412FF5 /* _WKLinkIconParameters.mm in Sources */,
</ins><span class="cx">                                 BC54CACC12D64291005C67B0 /* WebGeolocationManagerProxy.cpp in Sources */,
</span><span class="cx">                                 BC0E618212D6CB1D0012A72A /* WebGeolocationManagerProxyMessageReceiver.cpp in Sources */,
</span><span class="cx">                                 BC0E607412D6BC200012A72A /* WebGeolocationPosition.cpp in Sources */,
</span><span class="lines">@@ -9753,6 +9776,7 @@
</span><span class="cx">                                 BCD59800112B57BE00EC8C23 /* WebPreferences.cpp in Sources */,
</span><span class="cx">                                 7C85FD7F19341665000177C4 /* WebPreferencesKeys.cpp in Sources */,
</span><span class="cx">                                 BC84EB1812A7100C0083F2DA /* WebPreferencesMac.mm in Sources */,
</span><ins>+                                51C0C9751DDD76030032CAD3 /* IconLoadingDelegate.mm in Sources */,
</ins><span class="cx">                                 BCD598AD112B7FDF00EC8C23 /* WebPreferencesStore.cpp in Sources */,
</span><span class="cx">                                 BC111AE4112F5C2600337BAB /* WebProcess.cpp in Sources */,
</span><span class="cx">                                 7C6E70FB18B2DC7A00F24E2E /* WebProcessCocoa.mm in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -1755,4 +1755,25 @@
</span><span class="cx">     webPage-&gt;didRestoreScrollPosition();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool WebFrameLoaderClient::useIconLoadingClient()
+{
+    return m_useIconLoadingClient;
+}
+
+void WebFrameLoaderClient::getLoadDecisionForIcon(const LinkIcon&amp; icon, uint64_t callbackID)
+{
+    if (WebPage* webPage { m_frame-&gt;page() })
+        webPage-&gt;send(Messages::WebPageProxy::GetLoadDecisionForIcon(icon, callbackID));
+}
+
+void WebFrameLoaderClient::finishedLoadingIcon(uint64_t loadIdentifier, SharedBuffer* data)
+{
+    if (WebPage* webPage { m_frame-&gt;page() }) {
+        if (data)
+            webPage-&gt;send(Messages::WebPageProxy::FinishedLoadingIcon(loadIdentifier, { reinterpret_cast&lt;const uint8_t*&gt;(data-&gt;data()), data-&gt;size() }));
+        else
+            webPage-&gt;send(Messages::WebPageProxy::FinishedLoadingIcon(loadIdentifier, { nullptr, 0 }));
+    }
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebFrameLoaderClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.h (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.h        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -46,6 +46,8 @@
</span><span class="cx"> 
</span><span class="cx">     bool frameHasCustomContentProvider() const { return m_frameHasCustomContentProvider; }
</span><span class="cx"> 
</span><ins>+    void setUseIconLoadingClient(bool useIconLoadingClient) { m_useIconLoadingClient = useIconLoadingClient; }
+
</ins><span class="cx"> private:
</span><span class="cx">     void frameLoaderDestroyed() override;
</span><span class="cx"> 
</span><span class="lines">@@ -255,6 +257,10 @@
</span><span class="cx"> 
</span><span class="cx">     void didRestoreScrollPosition() override;
</span><span class="cx"> 
</span><ins>+    bool useIconLoadingClient() override;
+    void getLoadDecisionForIcon(const WebCore::LinkIcon&amp;, uint64_t callbackID) override;
+    void finishedLoadingIcon(uint64_t loadIdentifier, WebCore::SharedBuffer*) override;
+
</ins><span class="cx">     WebFrame* m_frame;
</span><span class="cx">     RefPtr&lt;PluginView&gt; m_pluginView;
</span><span class="cx">     bool m_hasSentResponseToPluginView;
</span><span class="lines">@@ -261,6 +267,7 @@
</span><span class="cx">     bool m_didCompletePageTransition;
</span><span class="cx">     bool m_frameHasCustomContentProvider;
</span><span class="cx">     bool m_frameCameFromPageCache;
</span><ins>+    bool m_useIconLoadingClient { false };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // As long as EmptyFrameLoaderClient exists in WebCore, this can return 0.
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -5651,4 +5651,15 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+void WebPage::didGetLoadDecisionForIcon(bool decision, uint64_t loadIdentifier, uint64_t newCallbackID)
+{
+    if (auto* documentLoader = corePage()-&gt;mainFrame().loader().documentLoader())
+        documentLoader-&gt;didGetLoadDecisionForIcon(decision, loadIdentifier, newCallbackID);
+}
+
+void WebPage::setUseIconLoadingClient(bool useIconLoadingClient)
+{
+    static_cast&lt;WebFrameLoaderClient&amp;&gt;(corePage()-&gt;mainFrame().loader().client()).setUseIconLoadingClient(useIconLoadingClient);
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -971,6 +971,9 @@
</span><span class="cx">     void didLosePointerLock();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    void didGetLoadDecisionForIcon(bool decision, uint64_t loadIdentifier, uint64_t newCallbackID);
+    void setUseIconLoadingClient(bool);
+
</ins><span class="cx"> private:
</span><span class="cx">     WebPage(uint64_t pageID, const WebPageCreationParameters&amp;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPagemessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -448,6 +448,9 @@
</span><span class="cx"> 
</span><span class="cx">     SetUserInterfaceLayoutDirection(uint32_t direction)
</span><span class="cx"> 
</span><ins>+    DidGetLoadDecisionForIcon(bool decision, uint64_t loadIdentifier, uint64_t newCallbackID)
+    SetUseIconLoadingClient(bool useIconLoadingClient)
+
</ins><span class="cx"> #if ENABLE(GAMEPAD)
</span><span class="cx">     GamepadActivity(Vector&lt;WebKit::GamepadData&gt; gamepadDatas)
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Tools/ChangeLog        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2016-12-09  Brady Eidson  &lt;beidson@apple.com&gt; 

+        Re-landing:
+        Add _WKIconLoadingDelegate SPI. 
+        https://bugs.webkit.org/show_bug.cgi?id=164894 

+        Reviewed by Alex Christensen. 
+        
+        Add MiniBrowser support for this new SPI, configurable with a setting. 

+        * MiniBrowser/mac/SettingsController.h: 
+        * MiniBrowser/mac/SettingsController.m: 
+        (-[SettingsController _populateMenu]): 
+        (-[SettingsController validateMenuItem:]): 
+        (-[SettingsController loadsAllSiteIcons]): 
+        (-[SettingsController toggleLoadsAllSiteIcons:]): 
+        * MiniBrowser/mac/WK2BrowserWindowController.m: 
+        (-[WK2BrowserWindowController awakeFromNib]): 
+        (-[WK2BrowserWindowController webView:shouldLoadIconWithParameters:completionHandler:]): 
+
</ins><span class="cx"> 2016-12-09  Ryan Haddad  &lt;ryanhaddad@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix the 32-bit build.
</span></span></pre></div>
<a id="trunkToolsMiniBrowsermacSettingsControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/MiniBrowser/mac/SettingsController.h (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/MiniBrowser/mac/SettingsController.h        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Tools/MiniBrowser/mac/SettingsController.h        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -52,6 +52,7 @@
</span><span class="cx"> @property (nonatomic, readonly) BOOL visualViewportEnabled;
</span><span class="cx"> @property (nonatomic, readonly) BOOL largeImageAsyncDecodingEnabled;
</span><span class="cx"> @property (nonatomic, readonly) BOOL animatedImageAsyncDecodingEnabled;
</span><ins>+@property (nonatomic, readonly) BOOL loadsAllSiteIcons;
</ins><span class="cx"> @property (nonatomic, readonly) BOOL usesGameControllerFramework;
</span><span class="cx"> 
</span><span class="cx"> @property (nonatomic, readonly) NSString *defaultURL;
</span></span></pre></div>
<a id="trunkToolsMiniBrowsermacSettingsControllerm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/MiniBrowser/mac/SettingsController.m (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/MiniBrowser/mac/SettingsController.m        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Tools/MiniBrowser/mac/SettingsController.m        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> static NSString * const SimpleLineLayoutDebugBordersEnabledPreferenceKey = @&quot;SimpleLineLayoutDebugBordersEnabled&quot;;
</span><span class="cx"> static NSString * const TiledScrollingIndicatorVisiblePreferenceKey = @&quot;TiledScrollingIndicatorVisible&quot;;
</span><span class="cx"> static NSString * const ResourceUsageOverlayVisiblePreferenceKey = @&quot;ResourceUsageOverlayVisible&quot;;
</span><ins>+static NSString * const LoadsAllSiteIconsKey = @&quot;LoadsAllSiteIcons&quot;;
</ins><span class="cx"> static NSString * const UsesGameControllerFrameworkKey = @&quot;UsesGameControllerFramework&quot;;
</span><span class="cx"> static NSString * const IncrementalRenderingSuppressedPreferenceKey = @&quot;IncrementalRenderingSuppressed&quot;;
</span><span class="cx"> static NSString * const AcceleratedDrawingEnabledPreferenceKey = @&quot;AcceleratedDrawingEnabled&quot;;
</span><span class="lines">@@ -137,6 +138,7 @@
</span><span class="cx">     [self _addItemWithTitle:@&quot;Use UI-Side Compositing&quot; action:@selector(toggleUseUISideCompositing:) indented:YES];
</span><span class="cx">     [self _addItemWithTitle:@&quot;Disable Per-Window Web Processes&quot; action:@selector(togglePerWindowWebProcessesDisabled:) indented:YES];
</span><span class="cx">     [self _addItemWithTitle:@&quot;Show Resource Usage Overlay&quot; action:@selector(toggleShowResourceUsageOverlay:) indented:YES];
</span><ins>+    [self _addItemWithTitle:@&quot;Load All Site Icons Per-Page&quot; action:@selector(toggleLoadsAllSiteIcons:) indented:YES];
</ins><span class="cx">     [self _addItemWithTitle:@&quot;Use GameController.framework on macOS (Restart required)&quot; action:@selector(toggleUsesGameControllerFramework:) indented:YES];
</span><span class="cx"> 
</span><span class="cx">     NSMenuItem *debugOverlaysSubmenuItem = [[NSMenuItem alloc] initWithTitle:@&quot;Debug Overlays&quot; action:nil keyEquivalent:@&quot;&quot;];
</span><span class="lines">@@ -213,6 +215,8 @@
</span><span class="cx">         [menuItem setState:[self tiledScrollingIndicatorVisible] ? NSOnState : NSOffState];
</span><span class="cx">     else if (action == @selector(toggleShowResourceUsageOverlay:))
</span><span class="cx">         [menuItem setState:[self resourceUsageOverlayVisible] ? NSOnState : NSOffState];
</span><ins>+    else if (action == @selector(toggleLoadsAllSiteIcons:))
+        [menuItem setState:[self loadsAllSiteIcons] ? NSOnState : NSOffState];
</ins><span class="cx">     else if (action == @selector(toggleUsesGameControllerFramework:))
</span><span class="cx">         [menuItem setState:[self usesGameControllerFramework] ? NSOnState : NSOffState];
</span><span class="cx">     else if (action == @selector(toggleUseUISideCompositing:))
</span><span class="lines">@@ -362,6 +366,16 @@
</span><span class="cx">     [self _toggleBooleanDefault:ResourceUsageOverlayVisiblePreferenceKey];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (BOOL)loadsAllSiteIcons
+{
+    return [[NSUserDefaults standardUserDefaults] boolForKey:LoadsAllSiteIconsKey];
+}
+
+- (void)toggleLoadsAllSiteIcons:(id)sender
+{
+    [self _toggleBooleanDefault:LoadsAllSiteIconsKey];
+}
+
</ins><span class="cx"> - (BOOL)usesGameControllerFramework
</span><span class="cx"> {
</span><span class="cx">     return [[NSUserDefaults standardUserDefaults] boolForKey:UsesGameControllerFrameworkKey];
</span></span></pre></div>
<a id="trunkToolsMiniBrowsermacWK2BrowserWindowControllerm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m (209639 => 209640)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m        2016-12-10 01:24:59 UTC (rev 209639)
+++ trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m        2016-12-10 01:25:53 UTC (rev 209640)
</span><span class="lines">@@ -38,11 +38,13 @@
</span><span class="cx"> #import &lt;WebKit/WKWebViewPrivate.h&gt;
</span><span class="cx"> #import &lt;WebKit/WKWebsiteDataStorePrivate.h&gt;
</span><span class="cx"> #import &lt;WebKit/WebNSURLExtras.h&gt;
</span><ins>+#import &lt;WebKit/_WKIconLoadingDelegate.h&gt;
+#import &lt;WebKit/_WKLinkIconParameters.h&gt;
</ins><span class="cx"> #import &lt;WebKit/_WKUserInitiatedAction.h&gt;
</span><span class="cx"> 
</span><span class="cx"> static void* keyValueObservingContext = &amp;keyValueObservingContext;
</span><span class="cx"> 
</span><del>-@interface WK2BrowserWindowController () &lt;WKNavigationDelegate, WKUIDelegate&gt;
</del><ins>+@interface WK2BrowserWindowController () &lt;WKNavigationDelegate, WKUIDelegate, _WKIconLoadingDelegate&gt;
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @implementation WK2BrowserWindowController {
</span><span class="lines">@@ -73,6 +75,11 @@
</span><span class="cx"> 
</span><span class="cx">     _webView.navigationDelegate = self;
</span><span class="cx">     _webView.UIDelegate = self;
</span><ins>+
+    // This setting installs the new WK2 Icon Loading Delegate and tests that mechanism by
+    // telling WebKit to load every icon referenced by the page.
+    if ([[SettingsController shared] loadsAllSiteIcons])
+        _webView._iconLoadingDelegate = self;
</ins><span class="cx">     
</span><span class="cx">     _webView._observedRenderingProgressEvents = _WKRenderingProgressEventFirstLayout
</span><span class="cx">         | _WKRenderingProgressEventFirstVisuallyNonEmptyLayout
</span><span class="lines">@@ -650,6 +657,13 @@
</span><span class="cx">         LOG(@&quot;renderingProgressDidChange: %@&quot;, @&quot;first paint after suppressed incremental rendering&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)webView:(WKWebView *)webView shouldLoadIconWithParameters:(_WKLinkIconParameters *)parameters completionHandler:(void (^)(void (^)(NSData*)))completionHandler
+{
+    completionHandler(^void (NSData *data) {
+        LOG(@&quot;Icon URL %@ received icon data of length %u&quot;, parameters.url, (unsigned)data.length);
+    });
+}
+
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> #endif // WK_API_ENABLED
</span></span></pre>
</div>
</div>

</body>
</html>