Re-landing:
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 10 Dec 2016 01:25:53 +0000 (01:25 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 10 Dec 2016 01:25:53 +0000 (01:25 +0000)
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 <head>.

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 <head>.

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:]):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@209640 268f45cc-cd09-0410-ab3c-d52691b4dbfc

32 files changed:
Source/WebCore/ChangeLog
Source/WebCore/dom/Document.cpp
Source/WebCore/loader/DocumentLoader.cpp
Source/WebCore/loader/DocumentLoader.h
Source/WebCore/loader/FrameLoaderClient.h
Source/WebCore/loader/icon/IconLoader.cpp
Source/WebCore/loader/icon/IconLoader.h
Source/WebCore/platform/LinkIcon.h
Source/WebKit2/ChangeLog
Source/WebKit2/PlatformMac.cmake
Source/WebKit2/UIProcess/API/APIIconLoadingClient.h [new file with mode: 0644]
Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm
Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h
Source/WebKit2/UIProcess/API/Cocoa/_WKIconLoadingDelegate.h [new file with mode: 0644]
Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.h [new file with mode: 0644]
Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.mm [new file with mode: 0644]
Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h [new file with mode: 0644]
Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.h [new file with mode: 0644]
Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.mm [new file with mode: 0644]
Source/WebKit2/UIProcess/WebPageProxy.cpp
Source/WebKit2/UIProcess/WebPageProxy.h
Source/WebKit2/UIProcess/WebPageProxy.messages.in
Source/WebKit2/WebKit2.xcodeproj/project.pbxproj
Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.h
Source/WebKit2/WebProcess/WebPage/WebPage.cpp
Source/WebKit2/WebProcess/WebPage/WebPage.h
Source/WebKit2/WebProcess/WebPage/WebPage.messages.in
Tools/ChangeLog
Tools/MiniBrowser/mac/SettingsController.h
Tools/MiniBrowser/mac/SettingsController.m
Tools/MiniBrowser/mac/WK2BrowserWindowController.m

index 2d489af..7292f06 100644 (file)
@@ -1,3 +1,47 @@
+2016-12-09  Brady Eidson  <beidson@apple.com>
+
+        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 <head>.
+
+        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):
+
 2016-12-06  Jiewen Tan  <jiewen_tan@apple.com>
 
         [Part 2 of 2] Add support for PKCS8 format while doing SubtleCrypto.importKey/exportKey
index 5c3a2b2..6df989f 100644 (file)
@@ -2651,7 +2651,12 @@ void Document::implicitClose()
     // ramifications, and we need to decide what is the Right Thing To Do(tm)
     Frame* f = frame();
     if (f) {
-        f->loader().icon().startLoader();
+        if (f->loader().client().useIconLoadingClient()) {
+            if (auto* documentLoader = loader())
+                documentLoader->startIconLoading();
+        } else
+            f->loader().icon().startLoader();
+
         f->animation().startAnimationsIfNotSuspended(this);
 
         // FIXME: We shouldn't be dispatching pending events globally on all Documents here.
index bf66c2f..24bb505 100644 (file)
@@ -41,6 +41,7 @@
 #include "Document.h"
 #include "DocumentParser.h"
 #include "DocumentWriter.h"
+#include "ElementChildIterator.h"
 #include "Event.h"
 #include "EventNames.h"
 #include "ExtensionStyleSheets.h"
 #include "HTTPHeaderNames.h"
 #include "HistoryItem.h"
 #include "IconController.h"
+#include "IconLoader.h"
 #include "InspectorInstrumentation.h"
+#include "LinkIconCollector.h"
+#include "LinkIconType.h"
 #include "Logging.h"
 #include "MainFrame.h"
 #include "MemoryCache.h"
@@ -1702,6 +1706,46 @@ void DocumentLoader::getIconDataForIconURL(const String& urlString)
     iconDatabase().iconDataForIconURL(urlString, m_iconDataCallback);
 }
 
+void DocumentLoader::startIconLoading()
+{
+    ASSERT(m_frame->loader().client().useIconLoadingClient());
+
+    static uint64_t nextIconCallbackID = 1;
+
+    auto* document = this->document();
+    if (!document)
+        return;
+
+    Vector<LinkIcon> icons = LinkIconCollector { *document }.iconsOfTypes({ LinkIconType::Favicon, LinkIconType::TouchIcon, LinkIconType::TouchPrecomposedIcon });
+
+    if (icons.isEmpty())
+        icons.append({ m_frame->document()->completeURL(ASCIILiteral("/favicon.ico")), LinkIconType::Favicon, String(), std::nullopt });
+
+    for (auto& icon : icons) {
+        auto result = m_iconsPendingLoadDecision.add(nextIconCallbackID++, icon);
+        m_frame->loader().client().getLoadDecisionForIcon(icon, result.iterator->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<IconLoader>(*this, icon.url);
+    iconLoader->startLoading();
+    m_iconLoaders.set(WTFMove(iconLoader), newCallbackID);
+}
+
+void DocumentLoader::finishedLoadingIcon(IconLoader& loader, SharedBuffer* buffer)
+{
+    auto loadIdentifier = m_iconLoaders.take(&loader);
+    ASSERT(loadIdentifier);
+
+    m_frame->loader().client().finishedLoadingIcon(loadIdentifier, buffer);
+}
+
 void DocumentLoader::dispatchOnloadEvents()
 {
     m_wasOnloadDispatched = true;
index 541dfbe..4d73f48 100644 (file)
@@ -33,6 +33,7 @@
 #include "CachedResourceHandle.h"
 #include "DocumentWriter.h"
 #include "IconDatabaseBase.h"
+#include "LinkIcon.h"
 #include "LoadTiming.h"
 #include "NavigationAction.h"
 #include "ResourceError.h"
@@ -71,6 +72,7 @@ class ContentFilter;
 class FormState;
 class Frame;
 class FrameLoader;
+class IconLoader;
 class Page;
 class ResourceLoader;
 class SharedBuffer;
@@ -289,6 +291,10 @@ public:
 
     bool isAlwaysOnLoggingAllowed() const;
 
+    void startIconLoading();
+    WEBCORE_EXPORT void didGetLoadDecisionForIcon(bool decision, uint64_t loadIdentifier, uint64_t newCallbackID);
+    void finishedLoadingIcon(IconLoader&, SharedBuffer*);
+
 protected:
     WEBCORE_EXPORT DocumentLoader(const ResourceRequest&, const SubstituteData&);
 
@@ -441,9 +447,14 @@ private:
     bool m_waitingForContentPolicy { false };
     bool m_waitingForNavigationPolicy { false };
 
+    // For IconDatabase-style loads
     RefPtr<IconLoadDecisionCallback> m_iconLoadDecisionCallback;
     RefPtr<IconDataCallback> m_iconDataCallback;
 
+    // For IconLoadingClient-style loads
+    HashMap<uint64_t, LinkIcon> m_iconsPendingLoadDecision;
+    HashMap<std::unique_ptr<IconLoader>, uint64_t> m_iconLoaders;
+
     bool m_subresourceLoadersArePageCacheAcceptable;
     ShouldOpenExternalURLsPolicy m_shouldOpenExternalURLsPolicy { ShouldOpenExternalURLsPolicy::ShouldNotAllow };
 
index efae594..30a8b63 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "FrameLoaderTypes.h"
 #include "LayoutMilestones.h"
+#include "LinkIcon.h"
 #include "ResourceLoadPriority.h"
 #include <functional>
 #include <wtf/Forward.h>
@@ -354,6 +355,10 @@ public:
     virtual void prefetchDNS(const String&) = 0;
 
     virtual void didRestoreScrollPosition() { }
+
+    virtual bool useIconLoadingClient() { return false; }
+    virtual void getLoadDecisionForIcon(const LinkIcon&, uint64_t) { }
+    virtual void finishedLoadingIcon(uint64_t, SharedBuffer*) { }
 };
 
 } // namespace WebCore
index f9a629a..ba59a84 100644 (file)
 namespace WebCore {
 
 IconLoader::IconLoader(Frame& frame)
-    : m_frame(frame)
+    : m_frame(&frame)
+    , m_url(frame.loader().icon().url())
+{
+}
+
+IconLoader::IconLoader(DocumentLoader& documentLoader, const URL& url)
+    : m_documentLoader(&documentLoader)
+    , m_url(url)
 {
 }
 
@@ -55,10 +62,19 @@ IconLoader::~IconLoader()
 
 void IconLoader::startLoading()
 {
-    if (m_resource || !m_frame.document())
+    ASSERT(m_frame || m_documentLoader);
+
+    if (m_resource)
+        return;
+
+    if (m_frame && !m_frame->document())
         return;
 
-    ResourceRequest resourceRequest(m_frame.loader().icon().url());
+
+    if (m_documentLoader && !m_documentLoader->frame())
+        return;
+
+    ResourceRequest resourceRequest = m_documentLoader ? m_url :  m_frame->loader().icon().url();
     resourceRequest.setPriority(ResourceLoadPriority::Low);
 
     // ContentSecurityPolicyImposition::DoPolicyCheck is a placeholder value. It does not affect the request since Content Security Policy does not apply to raw resources.
@@ -66,11 +82,12 @@ void IconLoader::startLoading()
 
     request.setInitiator(cachedResourceRequestInitiators().icon);
 
-    m_resource = m_frame.document()->cachedResourceLoader().requestRawResource(WTFMove(request));
+    auto* frame = m_frame ? m_frame : m_documentLoader->frame();
+    m_resource = frame->document()->cachedResourceLoader().requestRawResource(WTFMove(request));
     if (m_resource)
         m_resource->addClient(*this);
     else
-        LOG_ERROR("Failed to start load for icon at url %s", m_frame.loader().icon().url().string().ascii().data());
+        LOG_ERROR("Failed to start load for icon at url %s", resourceRequest.url().string().ascii().data());
 }
 
 void IconLoader::stopLoading()
@@ -100,12 +117,19 @@ void IconLoader::notifyFinished(CachedResource& resource)
     }
 
     LOG(IconDatabase, "IconLoader::finishLoading() - Committing iconURL %s to database", m_resource->url().string().ascii().data());
-    m_frame.loader().icon().commitToDatabase(m_resource->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->url().string());
-    m_frame.loader().client().dispatchDidReceiveIcon();
+
+    if (m_frame) {
+        m_frame->loader().icon().commitToDatabase(m_resource->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->url().string());
+        m_frame->loader().client().dispatchDidReceiveIcon();
+
+    } else
+        m_documentLoader->finishedLoadingIcon(*this, data);
+
     stopLoading();
 }
 
index feb0370..2de53e8 100644 (file)
 
 #include "CachedRawResourceClient.h"
 #include "CachedResourceHandle.h"
+#include "URL.h"
 #include <wtf/Forward.h>
 #include <wtf/Noncopyable.h>
 
 namespace WebCore {
 
 class CachedRawResource;
+class DocumentLoader;
 class Frame;
 
 class IconLoader final : private CachedRawResourceClient {
     WTF_MAKE_NONCOPYABLE(IconLoader); WTF_MAKE_FAST_ALLOCATED;
 public:
     explicit IconLoader(Frame&);
+    IconLoader(DocumentLoader&, const URL&);
     virtual ~IconLoader();
 
     void startLoading();
@@ -47,7 +50,9 @@ public:
 private:
     void notifyFinished(CachedResource&) final;
 
-    Frame& m_frame;
+    Frame* m_frame { nullptr };
+    DocumentLoader* m_documentLoader { nullptr };
+    URL m_url;
     CachedResourceHandle<CachedRawResource> m_resource;
 };
 
index 9e67481..032ccda 100644 (file)
@@ -37,6 +37,34 @@ struct LinkIcon {
     LinkIconType type;
     String mimeType;
     std::optional<unsigned> size;
+
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static bool decode(Decoder&, LinkIcon&);
 };
 
+template<class Encoder>
+void LinkIcon::encode(Encoder& encoder) const
+{
+    encoder << url << mimeType << size;
+    encoder.encodeEnum(type);
+}
+
+template<class Decoder>
+bool LinkIcon::decode(Decoder& decoder, LinkIcon& 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;
+}
+
 } // namespace WebCore
index 24b7aad..94d9350 100644 (file)
@@ -1,3 +1,72 @@
+2016-12-09  Brady Eidson  <beidson@apple.com>
+
+        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 <head>.
+
+        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:
+
 2016-12-09  Simon Fraser  <simon.fraser@apple.com>
 
         Fix initialization of contentUpdateFrequency
index c0f1ada..6f5fd38 100644 (file)
@@ -209,6 +209,7 @@ list(APPEND WebKit2_SOURCES
     UIProcess/API/Cocoa/_WKElementAction.mm
     UIProcess/API/Cocoa/_WKErrorRecoveryAttempting.mm
     UIProcess/API/Cocoa/_WKExperimentalFeature.mm
+    UIProcess/API/Cocoa/_WKLinkIconParameters.mm
     UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm
     UIProcess/API/Cocoa/_WKRemoteWebInspectorViewController.mm
     UIProcess/API/Cocoa/_WKSessionState.mm
@@ -232,6 +233,7 @@ list(APPEND WebKit2_SOURCES
     UIProcess/Cocoa/DownloadClient.mm
     UIProcess/Cocoa/FindClient.mm
     UIProcess/Cocoa/FullscreenClient.mm
+    UIProcess/Cocoa/IconLoadingDelegate.mm
     UIProcess/Cocoa/NavigationState.mm
     UIProcess/Cocoa/RemoteLayerTreeScrollingPerformanceData.mm
     UIProcess/Cocoa/SessionStateCoding.mm
diff --git a/Source/WebKit2/UIProcess/API/APIIconLoadingClient.h b/Source/WebKit2/UIProcess/API/APIIconLoadingClient.h
new file mode 100644 (file)
index 0000000..bbba34c
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * 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 "GenericCallback.h"
+#include <WebCore/LinkIcon.h>
+#include <wtf/Function.h>
+
+namespace IPC {
+class DataReference;
+}
+
+namespace API {
+
+class IconLoadingClient {
+public:
+    virtual ~IconLoadingClient() { }
+
+    virtual void getLoadDecisionForIcon(const WebCore::LinkIcon&, Function<void (std::function<void (API::Data*, WebKit::CallbackBase::Error)>)>&& completionHandler) {
+        completionHandler(nullptr);
+    }
+};
+
+} // namespace API
index 80d16a6..cedacf3 100644 (file)
@@ -35,6 +35,7 @@
 #import "DiagnosticLoggingClient.h"
 #import "FindClient.h"
 #import "FullscreenClient.h"
+#import "IconLoadingDelegate.h"
 #import "LegacySessionStateCoding.h"
 #import "Logging.h"
 #import "NavigationState.h"
@@ -195,6 +196,7 @@ WKWebView* fromWebPageProxy(WebKit::WebPageProxy& page)
 @implementation WKWebView {
     std::unique_ptr<WebKit::NavigationState> _navigationState;
     std::unique_ptr<WebKit::UIDelegate> _uiDelegate;
+    std::unique_ptr<WebKit::IconLoadingDelegate> _iconLoadingDelegate;
 
     _WKRenderingProgressEvents _observedRenderingProgressEvents;
 
@@ -568,6 +570,8 @@ static uint32_t convertSystemLayoutDirection(NSUserInterfaceLayoutDirection dire
     _page->setFindClient(std::make_unique<WebKit::FindClient>(self));
     _page->setDiagnosticLoggingClient(std::make_unique<WebKit::DiagnosticLoggingClient>(self));
 
+    _iconLoadingDelegate = std::make_unique<WebKit::IconLoadingDelegate>(self);
+
 #if ENABLE(FULLSCREEN_API)
     _page->setFullscreenClient(std::make_unique<WebKit::FullscreenClient>(self));
 #endif
@@ -682,6 +686,17 @@ static uint32_t convertSystemLayoutDirection(NSUserInterfaceLayoutDirection dire
     _uiDelegate->setDelegate(UIDelegate);
 }
 
+- (id <_WKIconLoadingDelegate>)_iconLoadingDelegate
+{
+    return _iconLoadingDelegate->delegate().autorelease();
+}
+
+- (void)_setIconLoadingDelegate:(id<_WKIconLoadingDelegate>)iconLoadingDelegate
+{
+    _page->setIconLoadingClient(_iconLoadingDelegate->createIconLoadingClient());
+    _iconLoadingDelegate->setDelegate(iconLoadingDelegate);
+}
+
 - (WKNavigation *)loadRequest:(NSURLRequest *)request
 {
     auto navigation = _page->loadRequest(request);
index 7f5a7fe..9d95a6b 100644 (file)
@@ -56,6 +56,7 @@ typedef NS_ENUM(NSInteger, _WKImmediateActionType) {
 @class WKBrowsingContextHandle;
 @class _WKFrameHandle;
 @class _WKHitTestResult;
+@class _WKIconLoadingDelegate;
 @class _WKRemoteObjectRegistry;
 @class _WKSessionState;
 @class _WKWebViewPrintFormatter;
@@ -63,6 +64,7 @@ typedef NS_ENUM(NSInteger, _WKImmediateActionType) {
 @protocol WKHistoryDelegatePrivate;
 @protocol _WKDiagnosticLoggingDelegate;
 @protocol _WKFindDelegate;
+@protocol _WKIconLoadingDelegate;
 @protocol _WKInputDelegate;
 @protocol _WKFullscreenDelegate;
 
@@ -75,6 +77,7 @@ typedef NS_ENUM(NSInteger, _WKImmediateActionType) {
 @property (nonatomic, setter=_setObservedRenderingProgressEvents:) _WKRenderingProgressEvents _observedRenderingProgressEvents;
 
 @property (nonatomic, weak, setter=_setHistoryDelegate:) id <WKHistoryDelegatePrivate> _historyDelegate;
+@property (nonatomic, weak, setter=_setIconLoadingDelegate:) id <_WKIconLoadingDelegate> _iconLoadingDelegate;
 
 @property (nonatomic, readonly) NSURL *_unreachableURL;
 
diff --git a/Source/WebKit2/UIProcess/API/Cocoa/_WKIconLoadingDelegate.h b/Source/WebKit2/UIProcess/API/Cocoa/_WKIconLoadingDelegate.h
new file mode 100644 (file)
index 0000000..7242ffd
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * 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 <WebKit/WKFoundation.h>
+
+#if WK_API_ENABLED
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class _WKLinkIconParameters;
+
+@protocol _WKIconLoadingDelegate <NSObject>
+@optional
+
+- (void)webView:(WKWebView *)webView shouldLoadIconWithParameters:(_WKLinkIconParameters *)parameters completionHandler:(void (^)(void (^)(NSData*)))completionHandler;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
+#endif
diff --git a/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.h b/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.h
new file mode 100644 (file)
index 0000000..6b49a7a
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * 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 <WebKit/WKFoundation.h>
+
+#if WK_API_ENABLED
+
+#import <Foundation/Foundation.h>
+
+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
diff --git a/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.mm b/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.mm
new file mode 100644 (file)
index 0000000..d545dfc
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * 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 "config.h"
+#import "_WKLinkIconParametersInternal.h"
+
+#if WK_API_ENABLED
+
+#import <WebCore/LinkIcon.h>
+
+@implementation _WKLinkIconParameters {
+    RetainPtr<NSURL> _url;
+    WKLinkIconType _iconType;
+    RetainPtr<NSString> _mimeType;
+    RetainPtr<NSNumber> _size;
+}
+
+- (instancetype)_initWithLinkIcon:(const WebCore::LinkIcon&)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
diff --git a/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h b/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h
new file mode 100644 (file)
index 0000000..2421e71
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * 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 "_WKLinkIconParameters.h"
+
+#if WK_API_ENABLED
+
+namespace WebCore {
+struct LinkIcon;
+}
+
+@interface _WKLinkIconParameters ()
+
+- (instancetype)_initWithLinkIcon:(const WebCore::LinkIcon&)linkIcon;
+
+@end
+
+#endif
diff --git a/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.h b/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.h
new file mode 100644 (file)
index 0000000..b729d99
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * 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 "WKFoundation.h"
+
+#if WK_API_ENABLED
+
+#import "APIIconLoadingClient.h"
+#import "WeakObjCPtr.h"
+#import <wtf/RetainPtr.h>
+
+@class WKWebView;
+@protocol _WKIconLoadingDelegate;
+
+namespace WebKit {
+
+class IconLoadingDelegate {
+public:
+    explicit IconLoadingDelegate(WKWebView *);
+    ~IconLoadingDelegate();
+
+    std::unique_ptr<API::IconLoadingClient> createIconLoadingClient();
+
+    RetainPtr<id <_WKIconLoadingDelegate> > delegate();
+    void setDelegate(id <_WKIconLoadingDelegate>);
+
+private:
+    class IconLoadingClient : public API::IconLoadingClient {
+    public:
+        explicit IconLoadingClient(IconLoadingDelegate&);
+        ~IconLoadingClient();
+
+    private:
+        void getLoadDecisionForIcon(const WebCore::LinkIcon&, Function<void (std::function<void (API::Data*, WebKit::CallbackBase::Error)>)>&& completionHandler) override;
+
+        IconLoadingDelegate& m_iconLoadingDelegate;
+    };
+
+    WKWebView *m_webView;
+    WeakObjCPtr<id <_WKIconLoadingDelegate> > m_delegate;
+
+    struct {
+        bool webViewShouldLoadIconWithParametersCompletionHandler : 1;
+    } m_delegateMethods;
+};
+
+} // namespace WebKit
+
+#endif // WK_API_ENABLED
diff --git a/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.mm b/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.mm
new file mode 100644 (file)
index 0000000..25f9628
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * 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 "config.h"
+#import "IconLoadingDelegate.h"
+
+#if WK_API_ENABLED
+
+#include "WKNSData.h"
+#include "_WKIconLoadingDelegate.h"
+#include "_WKLinkIconParametersInternal.h"
+
+namespace WebKit {
+
+IconLoadingDelegate::IconLoadingDelegate(WKWebView *webView)
+    : m_webView(webView)
+{
+}
+
+IconLoadingDelegate::~IconLoadingDelegate()
+{
+}
+
+std::unique_ptr<API::IconLoadingClient> IconLoadingDelegate::createIconLoadingClient()
+{
+    return std::make_unique<IconLoadingClient>(*this);
+}
+
+RetainPtr<id <_WKIconLoadingDelegate> > IconLoadingDelegate::delegate()
+{
+    return m_delegate.get();
+}
+
+void IconLoadingDelegate::setDelegate(id <_WKIconLoadingDelegate> delegate)
+{
+    m_delegate = delegate;
+
+    m_delegateMethods.webViewShouldLoadIconWithParametersCompletionHandler = [delegate respondsToSelector:@selector(webView:shouldLoadIconWithParameters:completionHandler:)];
+}
+
+IconLoadingDelegate::IconLoadingClient::IconLoadingClient(IconLoadingDelegate& iconLoadingDelegate)
+    : m_iconLoadingDelegate(iconLoadingDelegate)
+{
+}
+
+IconLoadingDelegate::IconLoadingClient::~IconLoadingClient()
+{
+}
+
+typedef void (^IconLoadCompletionHandler)(NSData*);
+
+void IconLoadingDelegate::IconLoadingClient::getLoadDecisionForIcon(const WebCore::LinkIcon& linkIcon, Function<void (std::function<void (API::Data*, WebKit::CallbackBase::Error)>)>&& completionHandler)
+{
+    if (!m_iconLoadingDelegate.m_delegateMethods.webViewShouldLoadIconWithParametersCompletionHandler) {
+        completionHandler(nullptr);
+        return;
+    }
+
+    auto delegate = m_iconLoadingDelegate.m_delegate.get();
+    if (!delegate) {
+        completionHandler(nullptr);
+        return;
+    }
+
+    RetainPtr<_WKLinkIconParameters> 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
index 89258c4..c5a088a 100644 (file)
@@ -37,6 +37,7 @@
 #include "APIGeometry.h"
 #include "APIHistoryClient.h"
 #include "APIHitTestResult.h"
+#include "APIIconLoadingClient.h"
 #include "APILegacyContextHistoryClient.h"
 #include "APILoaderClient.h"
 #include "APINavigation.h"
@@ -627,6 +628,20 @@ void WebPageProxy::setUIClient(std::unique_ptr<API::UIClient> uiClient)
     setCanRunModal(m_uiClient->canRunModal());
 }
 
+void WebPageProxy::setIconLoadingClient(std::unique_ptr<API::IconLoadingClient> iconLoadingClient)
+{
+    bool hasClient = iconLoadingClient.get();
+    if (!iconLoadingClient)
+        m_iconLoadingClient = std::make_unique<API::IconLoadingClient>();
+    else
+        m_iconLoadingClient = WTFMove(iconLoadingClient);
+
+    if (!isValid())
+        return;
+
+    m_process->send(Messages::WebPage::SetUseIconLoadingClient(hasClient), m_pageID);
+}
+
 void WebPageProxy::setFindClient(std::unique_ptr<API::FindClient> findClient)
 {
     if (!findClient) {
@@ -6673,6 +6688,30 @@ void WebPageProxy::didRestoreScrollPosition()
     m_pageClient.didRestoreScrollPosition();
 }
 
+void WebPageProxy::getLoadDecisionForIcon(const WebCore::LinkIcon& icon, uint64_t loadIdentifier)
+{
+    if (!m_iconLoadingClient)
+        return;
+
+    m_iconLoadingClient->getLoadDecisionForIcon(icon, [this, protectedThis = Ref<WebPageProxy>(*this), loadIdentifier](std::function<void (API::Data*, CallbackBase::Error)> 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->throttler().backgroundActivityToken()) : 0;
+
+        m_process->send(Messages::WebPage::DidGetLoadDecisionForIcon(decision, loadIdentifier, newCallbackIdentifier), m_pageID);
+    });
+}
+
+void WebPageProxy::finishedLoadingIcon(uint64_t callbackIdentifier, const IPC::DataReference& data)
+{
+    dataCallback(data, callbackIdentifier);
+}
+
 void WebPageProxy::setResourceCachingDisabled(bool disabled)
 {
     if (m_isResourceCachingDisabled == disabled)
index a5b1d6b..09a1882 100644 (file)
@@ -130,6 +130,7 @@ class FindMatchesClient;
 class FormClient;
 class FullscreenClient;
 class HistoryClient;
+class IconLoadingClient;
 class LoaderClient;
 class Navigation;
 class NavigationClient;
@@ -368,6 +369,9 @@ public:
     API::UIClient& uiClient() { return *m_uiClient; }
     void setUIClient(std::unique_ptr<API::UIClient>);
 
+    API::IconLoadingClient& iconLoadingClient() { return *m_iconLoadingClient; }
+    void setIconLoadingClient(std::unique_ptr<API::IconLoadingClient>);
+
     void initializeWebPage();
 
     void close();
@@ -1141,6 +1145,9 @@ public:
 
     void didRestoreScrollPosition();
 
+    void getLoadDecisionForIcon(const WebCore::LinkIcon&, uint64_t callbackID);
+    void finishedLoadingIcon(uint64_t callbackIdentifier, const IPC::DataReference&);
+
     void setFocus(bool focused);
     void setWindowFrame(const WebCore::FloatRect&);
     void getWindowFrame(WebCore::FloatRect&);
@@ -1593,6 +1600,7 @@ private:
     std::unique_ptr<API::PolicyClient> m_policyClient;
     std::unique_ptr<API::NavigationClient> m_navigationClient;
     std::unique_ptr<API::HistoryClient> m_historyClient;
+    std::unique_ptr<API::IconLoadingClient> m_iconLoadingClient;
     std::unique_ptr<API::FormClient> m_formClient;
     std::unique_ptr<API::UIClient> m_uiClient;
     std::unique_ptr<API::FindClient> m_findClient;
index 044c9fa..193682e 100644 (file)
@@ -478,6 +478,9 @@ messages -> WebPageProxy {
 
     DidRestoreScrollPosition()
 
+    GetLoadDecisionForIcon(struct WebCore::LinkIcon icon, uint64_t callbackID)
+    FinishedLoadingIcon(uint64_t callbackIdentifier, IPC::DataReference data);
+
 #if PLATFORM(MAC)
     DidHandleAcceptedCandidate()
     HandleActiveNowPlayingSessionInfoResponse(bool hasActiveSession, String title, double duration, double elapsedTime)
index b286415..191a6b4 100644 (file)
                5106D7C418BDBE73000AB166 /* ContextMenuContextData.h in Headers */ = {isa = PBXBuildFile; fileRef = 5106D7C018BDBE73000AB166 /* ContextMenuContextData.h */; };
                510AFFB916542048001BA05E /* WebResourceLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 510AFFB716542048001BA05E /* WebResourceLoader.cpp */; };
                510AFFBA16542048001BA05E /* WebResourceLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 510AFFB816542048001BA05E /* WebResourceLoader.h */; };
+               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 */; };
                510FBB9A1288C95E00AFFDF4 /* WebContextMenuItemData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 510FBB981288C95E00AFFDF4 /* WebContextMenuItemData.cpp */; };
                510FBB9B1288C95E00AFFDF4 /* WebContextMenuItemData.h in Headers */ = {isa = PBXBuildFile; fileRef = 510FBB991288C95E00AFFDF4 /* WebContextMenuItemData.h */; };
                5110AE0C133C16CB0072717A /* WKIconDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5110AE0A133C16CB0072717A /* WKIconDatabase.cpp */; };
                51ACBBA1127A8F2C00D203B9 /* WebContextMenuProxyMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51ACBB9F127A8F2C00D203B9 /* WebContextMenuProxyMac.mm */; };
                51B15A8413843A3900321AD8 /* EnvironmentUtilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51B15A8213843A3900321AD8 /* EnvironmentUtilities.cpp */; };
                51B15A8513843A3900321AD8 /* EnvironmentUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 51B15A8313843A3900321AD8 /* EnvironmentUtilities.h */; };
+               51C0C9741DDD76000032CAD3 /* IconLoadingDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 51C0C9721DDD74F00032CAD3 /* IconLoadingDelegate.h */; };
+               51C0C9751DDD76030032CAD3 /* IconLoadingDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51C0C9731DDD74F00032CAD3 /* IconLoadingDelegate.mm */; };
                51CD1C5D1B3493AF00142CA5 /* WKSecurityOriginRef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51CD1C591B3493A900142CA5 /* WKSecurityOriginRef.cpp */; };
                51CD1C5E1B3493B400142CA5 /* WKSecurityOriginRef.h in Headers */ = {isa = PBXBuildFile; fileRef = 51CD1C5A1B3493A900142CA5 /* WKSecurityOriginRef.h */; settings = {ATTRIBUTES = (Private, ); }; };
                51CD1C651B34B9D400142CA5 /* WKSecurityOrigin.h in Headers */ = {isa = PBXBuildFile; fileRef = 51CD1C5F1B34B9C900142CA5 /* WKSecurityOrigin.h */; settings = {ATTRIBUTES = (Public, ); }; };
                513E462C1AD837560016234A /* WKSharingServicePickerDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKSharingServicePickerDelegate.mm; sourceTree = "<group>"; };
                514129911C6428100059E714 /* WebIDBConnectionToServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebIDBConnectionToServer.cpp; sourceTree = "<group>"; };
                514129921C6428100059E714 /* WebIDBConnectionToServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebIDBConnectionToServer.h; sourceTree = "<group>"; };
+               5143B25E1DDCDFD10014FAC6 /* _WKIconLoadingDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKIconLoadingDelegate.h; sourceTree = "<group>"; };
+               5143B2611DDD0DA00014FAC6 /* APIIconLoadingClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIIconLoadingClient.h; sourceTree = "<group>"; };
                514BDED216C98EDD00E4E25E /* StatisticsRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatisticsRequest.h; sourceTree = "<group>"; };
                514D9F5519119D35000063A7 /* ServicesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServicesController.h; sourceTree = "<group>"; };
                514D9F5619119D35000063A7 /* ServicesController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ServicesController.mm; sourceTree = "<group>"; };
                51ACC9351628064800342550 /* NetworkProcessMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkProcessMessages.h; sourceTree = "<group>"; };
                51B15A8213843A3900321AD8 /* EnvironmentUtilities.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = EnvironmentUtilities.cpp; path = unix/EnvironmentUtilities.cpp; sourceTree = "<group>"; };
                51B15A8313843A3900321AD8 /* EnvironmentUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EnvironmentUtilities.h; path = unix/EnvironmentUtilities.h; sourceTree = "<group>"; };
+               51C0C9721DDD74F00032CAD3 /* IconLoadingDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IconLoadingDelegate.h; sourceTree = "<group>"; };
+               51C0C9731DDD74F00032CAD3 /* IconLoadingDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IconLoadingDelegate.mm; sourceTree = "<group>"; };
+               51C0C9791DDD78540032CAD3 /* _WKLinkIconParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKLinkIconParameters.h; sourceTree = "<group>"; };
+               51C0C97A1DDD78540032CAD3 /* _WKLinkIconParameters.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKLinkIconParameters.mm; sourceTree = "<group>"; };
+               51C0C97B1DDD78540032CAD3 /* _WKLinkIconParametersInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKLinkIconParametersInternal.h; sourceTree = "<group>"; };
                51CD1C591B3493A900142CA5 /* WKSecurityOriginRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKSecurityOriginRef.cpp; sourceTree = "<group>"; };
                51CD1C5A1B3493A900142CA5 /* WKSecurityOriginRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSecurityOriginRef.h; sourceTree = "<group>"; };
                51CD1C5F1B34B9C900142CA5 /* WKSecurityOrigin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSecurityOrigin.h; sourceTree = "<group>"; };
                                00B9661718E25AE100CE1F88 /* FindClient.mm */,
                                CD78E1121DB7D7ED0014A2DE /* FullscreenClient.mm */,
                                CD78E1131DB7D7ED0014A2DE /* FullscreenClient.h */,
+                               51C0C9721DDD74F00032CAD3 /* IconLoadingDelegate.h */,
+                               51C0C9731DDD74F00032CAD3 /* IconLoadingDelegate.mm */,
                                0F0C365918C0555800F607D7 /* LayerRepresentation.h */,
                                1ABC3DF41899E437004F0626 /* NavigationState.h */,
                                1ABC3DF31899E437004F0626 /* NavigationState.mm */,
                                2E7A94491BBD95C600945547 /* _WKFocusedElementInfo.h */,
                                37A64E5618F38F4600EB30F1 /* _WKFormInputSession.h */,
                                CD78E1181DB7E5AD0014A2DE /* _WKFullscreenDelegate.h */,
+                               5143B25E1DDCDFD10014FAC6 /* _WKIconLoadingDelegate.h */,
                                37A64E5418F38E3C00EB30F1 /* _WKInputDelegate.h */,
                                2D790A9C1AD7050D00AB90B3 /* _WKLayoutMode.h */,
+                               51C0C9791DDD78540032CAD3 /* _WKLinkIconParameters.h */,
+                               51C0C97A1DDD78540032CAD3 /* _WKLinkIconParameters.mm */,
+                               51C0C97B1DDD78540032CAD3 /* _WKLinkIconParametersInternal.h */,
                                9323611D1B015DA800FA9232 /* _WKOverlayScrollbarStyle.h */,
                                1A43E828188F3CDC009E4D30 /* _WKProcessPoolConfiguration.h */,
                                1A43E827188F3CDC009E4D30 /* _WKProcessPoolConfiguration.mm */,
                                93A88B431BC8828C00ABA5C2 /* APIHitTestResult.h */,
                                7CE4D2061A46775700C7F152 /* APILegacyContextHistoryClient.h */,
                                1A2464F21891E45100234C5B /* APILoaderClient.h */,
+                               5143B2611DDD0DA00014FAC6 /* APIIconLoadingClient.h */,
                                7CD3A4801A5D02FA009623B8 /* APINavigation.cpp */,
                                7CD3A4811A5D02FA009623B8 /* APINavigation.h */,
                                2DF9EEEA1A7836EE00B6CFBE /* APINavigationAction.h */,
                                1A7865BA16CAC71500ACE83A /* PluginProcessConnectionManagerMessages.h in Headers */,
                                1A2BB6D114117B4D000F35D4 /* PluginProcessConnectionMessages.h in Headers */,
                                1A2D90D21281C966001EB962 /* PluginProcessCreationParameters.h in Headers */,
+                               510F59101DDE296900412FF5 /* _WKIconLoadingDelegate.h in Headers */,
                                1A0EC603124A9F2C007EF4A5 /* PluginProcessManager.h in Headers */,
                                1A0EC6C0124BBD9B007EF4A5 /* PluginProcessMessages.h in Headers */,
                                1A0EC75E124BC7B2007EF4A5 /* PluginProcessProxy.h in Headers */,
                                4A3CC18D19B0641900D14AEF /* UserMediaPermissionRequestProxy.h in Headers */,
                                E4E864931B16750700C82F40 /* VersionChecks.h in Headers */,
                                2D125C5E1857EA05003BA3CB /* ViewGestureController.h in Headers */,
+                               510F59111DDE297000412FF5 /* _WKLinkIconParameters.h in Headers */,
                                2D1B5D5E185869C8006C6596 /* ViewGestureControllerMessages.h in Headers */,
                                2D819BA21862800E001F03D1 /* ViewGestureGeometryCollectorMessages.h in Headers */,
                                2D6CD119189058A500E5A4A0 /* ViewSnapshotStore.h in Headers */,
                                1AA13212191D5924009C1489 /* WKNavigationResponsePrivate.h in Headers */,
                                2D3A65DF1A7C3A7D00CAC637 /* WKNavigationResponseRef.h in Headers */,
                                318BE17914743E6F00A8FBB2 /* WKNotification.h in Headers */,
+                               51C0C9741DDD76000032CAD3 /* IconLoadingDelegate.h in Headers */,
                                318BE17114743DB100A8FBB2 /* WKNotificationManager.h in Headers */,
                                31A2EC74148D59CA00810D71 /* WKNotificationPermissionRequest.h in Headers */,
                                312C0C4A146DDC8A0016C911 /* WKNotificationProvider.h in Headers */,
                                BC1BE1E112D54A410004A228 /* WebGeolocationClient.cpp in Sources */,
                                BC0E5FE612D697160012A72A /* WebGeolocationManager.cpp in Sources */,
                                BC0E606112D6BA910012A72A /* WebGeolocationManagerMessageReceiver.cpp in Sources */,
+                               510F59121DDE297700412FF5 /* _WKLinkIconParameters.mm in Sources */,
                                BC54CACC12D64291005C67B0 /* WebGeolocationManagerProxy.cpp in Sources */,
                                BC0E618212D6CB1D0012A72A /* WebGeolocationManagerProxyMessageReceiver.cpp in Sources */,
                                BC0E607412D6BC200012A72A /* WebGeolocationPosition.cpp in Sources */,
                                BCD59800112B57BE00EC8C23 /* WebPreferences.cpp in Sources */,
                                7C85FD7F19341665000177C4 /* WebPreferencesKeys.cpp in Sources */,
                                BC84EB1812A7100C0083F2DA /* WebPreferencesMac.mm in Sources */,
+                               51C0C9751DDD76030032CAD3 /* IconLoadingDelegate.mm in Sources */,
                                BCD598AD112B7FDF00EC8C23 /* WebPreferencesStore.cpp in Sources */,
                                BC111AE4112F5C2600337BAB /* WebProcess.cpp in Sources */,
                                7C6E70FB18B2DC7A00F24E2E /* WebProcessCocoa.mm in Sources */,
index 5469102..84df264 100644 (file)
@@ -1755,4 +1755,25 @@ void WebFrameLoaderClient::didRestoreScrollPosition()
     webPage->didRestoreScrollPosition();
 }
 
+bool WebFrameLoaderClient::useIconLoadingClient()
+{
+    return m_useIconLoadingClient;
+}
+
+void WebFrameLoaderClient::getLoadDecisionForIcon(const LinkIcon& icon, uint64_t callbackID)
+{
+    if (WebPage* webPage { m_frame->page() })
+        webPage->send(Messages::WebPageProxy::GetLoadDecisionForIcon(icon, callbackID));
+}
+
+void WebFrameLoaderClient::finishedLoadingIcon(uint64_t loadIdentifier, SharedBuffer* data)
+{
+    if (WebPage* webPage { m_frame->page() }) {
+        if (data)
+            webPage->send(Messages::WebPageProxy::FinishedLoadingIcon(loadIdentifier, { reinterpret_cast<const uint8_t*>(data->data()), data->size() }));
+        else
+            webPage->send(Messages::WebPageProxy::FinishedLoadingIcon(loadIdentifier, { nullptr, 0 }));
+    }
+}
+
 } // namespace WebKit
index 17dda76..db2f949 100644 (file)
@@ -46,6 +46,8 @@ public:
 
     bool frameHasCustomContentProvider() const { return m_frameHasCustomContentProvider; }
 
+    void setUseIconLoadingClient(bool useIconLoadingClient) { m_useIconLoadingClient = useIconLoadingClient; }
+
 private:
     void frameLoaderDestroyed() override;
 
@@ -255,12 +257,17 @@ private:
 
     void didRestoreScrollPosition() override;
 
+    bool useIconLoadingClient() override;
+    void getLoadDecisionForIcon(const WebCore::LinkIcon&, uint64_t callbackID) override;
+    void finishedLoadingIcon(uint64_t loadIdentifier, WebCore::SharedBuffer*) override;
+
     WebFrame* m_frame;
     RefPtr<PluginView> m_pluginView;
     bool m_hasSentResponseToPluginView;
     bool m_didCompletePageTransition;
     bool m_frameHasCustomContentProvider;
     bool m_frameCameFromPageCache;
+    bool m_useIconLoadingClient { false };
 };
 
 // As long as EmptyFrameLoaderClient exists in WebCore, this can return 0.
index 4569448..fab953e 100644 (file)
@@ -5651,4 +5651,15 @@ void WebPage::didLosePointerLock()
 }
 #endif
 
+void WebPage::didGetLoadDecisionForIcon(bool decision, uint64_t loadIdentifier, uint64_t newCallbackID)
+{
+    if (auto* documentLoader = corePage()->mainFrame().loader().documentLoader())
+        documentLoader->didGetLoadDecisionForIcon(decision, loadIdentifier, newCallbackID);
+}
+
+void WebPage::setUseIconLoadingClient(bool useIconLoadingClient)
+{
+    static_cast<WebFrameLoaderClient&>(corePage()->mainFrame().loader().client()).setUseIconLoadingClient(useIconLoadingClient);
+}
+
 } // namespace WebKit
index 486af29..c595de3 100644 (file)
@@ -971,6 +971,9 @@ public:
     void didLosePointerLock();
 #endif
 
+    void didGetLoadDecisionForIcon(bool decision, uint64_t loadIdentifier, uint64_t newCallbackID);
+    void setUseIconLoadingClient(bool);
+
 private:
     WebPage(uint64_t pageID, const WebPageCreationParameters&);
 
index 633c089..43317b4 100644 (file)
@@ -448,6 +448,9 @@ messages -> WebPage LegacyReceiver {
 
     SetUserInterfaceLayoutDirection(uint32_t direction)
 
+    DidGetLoadDecisionForIcon(bool decision, uint64_t loadIdentifier, uint64_t newCallbackID)
+    SetUseIconLoadingClient(bool useIconLoadingClient)
+
 #if ENABLE(GAMEPAD)
     GamepadActivity(Vector<WebKit::GamepadData> gamepadDatas)
 #endif
index ae3b5d4..d6e63dd 100644 (file)
@@ -1,3 +1,23 @@
+2016-12-09  Brady Eidson  <beidson@apple.com> 
+        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:]): 
+
 2016-12-09  Ryan Haddad  <ryanhaddad@apple.com>
 
         Fix the 32-bit build.
index 93b59b5..0e0862b 100644 (file)
@@ -52,6 +52,7 @@
 @property (nonatomic, readonly) BOOL visualViewportEnabled;
 @property (nonatomic, readonly) BOOL largeImageAsyncDecodingEnabled;
 @property (nonatomic, readonly) BOOL animatedImageAsyncDecodingEnabled;
+@property (nonatomic, readonly) BOOL loadsAllSiteIcons;
 @property (nonatomic, readonly) BOOL usesGameControllerFramework;
 
 @property (nonatomic, readonly) NSString *defaultURL;
index 1633043..6c131d4 100644 (file)
@@ -41,6 +41,7 @@ static NSString * const LayerBordersVisiblePreferenceKey = @"LayerBordersVisible
 static NSString * const SimpleLineLayoutDebugBordersEnabledPreferenceKey = @"SimpleLineLayoutDebugBordersEnabled";
 static NSString * const TiledScrollingIndicatorVisiblePreferenceKey = @"TiledScrollingIndicatorVisible";
 static NSString * const ResourceUsageOverlayVisiblePreferenceKey = @"ResourceUsageOverlayVisible";
+static NSString * const LoadsAllSiteIconsKey = @"LoadsAllSiteIcons";
 static NSString * const UsesGameControllerFrameworkKey = @"UsesGameControllerFramework";
 static NSString * const IncrementalRenderingSuppressedPreferenceKey = @"IncrementalRenderingSuppressed";
 static NSString * const AcceleratedDrawingEnabledPreferenceKey = @"AcceleratedDrawingEnabled";
@@ -137,6 +138,7 @@ typedef NS_ENUM(NSInteger, DebugOverylayMenuItemTag) {
     [self _addItemWithTitle:@"Use UI-Side Compositing" action:@selector(toggleUseUISideCompositing:) indented:YES];
     [self _addItemWithTitle:@"Disable Per-Window Web Processes" action:@selector(togglePerWindowWebProcessesDisabled:) indented:YES];
     [self _addItemWithTitle:@"Show Resource Usage Overlay" action:@selector(toggleShowResourceUsageOverlay:) indented:YES];
+    [self _addItemWithTitle:@"Load All Site Icons Per-Page" action:@selector(toggleLoadsAllSiteIcons:) indented:YES];
     [self _addItemWithTitle:@"Use GameController.framework on macOS (Restart required)" action:@selector(toggleUsesGameControllerFramework:) indented:YES];
 
     NSMenuItem *debugOverlaysSubmenuItem = [[NSMenuItem alloc] initWithTitle:@"Debug Overlays" action:nil keyEquivalent:@""];
@@ -213,6 +215,8 @@ typedef NS_ENUM(NSInteger, DebugOverylayMenuItemTag) {
         [menuItem setState:[self tiledScrollingIndicatorVisible] ? NSOnState : NSOffState];
     else if (action == @selector(toggleShowResourceUsageOverlay:))
         [menuItem setState:[self resourceUsageOverlayVisible] ? NSOnState : NSOffState];
+    else if (action == @selector(toggleLoadsAllSiteIcons:))
+        [menuItem setState:[self loadsAllSiteIcons] ? NSOnState : NSOffState];
     else if (action == @selector(toggleUsesGameControllerFramework:))
         [menuItem setState:[self usesGameControllerFramework] ? NSOnState : NSOffState];
     else if (action == @selector(toggleUseUISideCompositing:))
@@ -362,6 +366,16 @@ typedef NS_ENUM(NSInteger, DebugOverylayMenuItemTag) {
     [self _toggleBooleanDefault:ResourceUsageOverlayVisiblePreferenceKey];
 }
 
+- (BOOL)loadsAllSiteIcons
+{
+    return [[NSUserDefaults standardUserDefaults] boolForKey:LoadsAllSiteIconsKey];
+}
+
+- (void)toggleLoadsAllSiteIcons:(id)sender
+{
+    [self _toggleBooleanDefault:LoadsAllSiteIconsKey];
+}
+
 - (BOOL)usesGameControllerFramework
 {
     return [[NSUserDefaults standardUserDefaults] boolForKey:UsesGameControllerFrameworkKey];
index f3abd9f..b5898fb 100644 (file)
 #import <WebKit/WKWebViewPrivate.h>
 #import <WebKit/WKWebsiteDataStorePrivate.h>
 #import <WebKit/WebNSURLExtras.h>
+#import <WebKit/_WKIconLoadingDelegate.h>
+#import <WebKit/_WKLinkIconParameters.h>
 #import <WebKit/_WKUserInitiatedAction.h>
 
 static void* keyValueObservingContext = &keyValueObservingContext;
 
-@interface WK2BrowserWindowController () <WKNavigationDelegate, WKUIDelegate>
+@interface WK2BrowserWindowController () <WKNavigationDelegate, WKUIDelegate, _WKIconLoadingDelegate>
 @end
 
 @implementation WK2BrowserWindowController {
@@ -73,6 +75,11 @@ static void* keyValueObservingContext = &keyValueObservingContext;
 
     _webView.navigationDelegate = self;
     _webView.UIDelegate = self;
+
+    // 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;
     
     _webView._observedRenderingProgressEvents = _WKRenderingProgressEventFirstLayout
         | _WKRenderingProgressEventFirstVisuallyNonEmptyLayout
@@ -650,6 +657,13 @@ static NSSet *dataTypes()
         LOG(@"renderingProgressDidChange: %@", @"first paint after suppressed incremental rendering");
 }
 
+- (void)webView:(WKWebView *)webView shouldLoadIconWithParameters:(_WKLinkIconParameters *)parameters completionHandler:(void (^)(void (^)(NSData*)))completionHandler
+{
+    completionHandler(^void (NSData *data) {
+        LOG(@"Icon URL %@ received icon data of length %u", parameters.url, (unsigned)data.length);
+    });
+}
+
 @end
 
 #endif // WK_API_ENABLED