Diff
Modified: trunk/Source/WebCore/ChangeLog (208864 => 208865)
--- trunk/Source/WebCore/ChangeLog 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebCore/ChangeLog 2016-11-18 00:22:44 UTC (rev 208865)
@@ -1,3 +1,46 @@
+2016-11-17 Brady Eidson <[email protected]>
+
+ 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-11-15 Sam Weinig <[email protected]>
[SVG] Moving more special casing of SVG out of the bindings - SVG lists
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (208864 => 208865)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2016-11-18 00:22:44 UTC (rev 208865)
@@ -2065,6 +2065,7 @@
514129981C6976900059E714 /* IDBRequestCompletionEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 514129961C6976150059E714 /* IDBRequestCompletionEvent.cpp */; };
514129991C6976900059E714 /* IDBRequestCompletionEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 514129971C6976150059E714 /* IDBRequestCompletionEvent.h */; };
5141299B1C6C16740059E714 /* JSIDBIndexCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5141299A1C6C166D0059E714 /* JSIDBIndexCustom.cpp */; };
+ 5143B2631DDD15200014FAC6 /* LinkIcon.h in Headers */ = {isa = PBXBuildFile; fileRef = 5143B2621DDD14900014FAC6 /* LinkIcon.h */; settings = {ATTRIBUTES = (Private, ); }; };
5145B1091BC48E2E00E86219 /* IDBResourceIdentifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5145B1071BC4890B00E86219 /* IDBResourceIdentifier.cpp */; };
5145B10A1BC48E2E00E86219 /* IDBResourceIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 5145B1081BC4890B00E86219 /* IDBResourceIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
5148453E1BB9D07E006A72ED /* IDBError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5148453C1BB9D076006A72ED /* IDBError.cpp */; };
@@ -9268,6 +9269,7 @@
514129961C6976150059E714 /* IDBRequestCompletionEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBRequestCompletionEvent.cpp; sourceTree = "<group>"; };
514129971C6976150059E714 /* IDBRequestCompletionEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBRequestCompletionEvent.h; sourceTree = "<group>"; };
5141299A1C6C166D0059E714 /* JSIDBIndexCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSIDBIndexCustom.cpp; sourceTree = "<group>"; };
+ 5143B2621DDD14900014FAC6 /* LinkIcon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinkIcon.h; sourceTree = "<group>"; };
5145B1071BC4890B00E86219 /* IDBResourceIdentifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBResourceIdentifier.cpp; sourceTree = "<group>"; };
5145B1081BC4890B00E86219 /* IDBResourceIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBResourceIdentifier.h; sourceTree = "<group>"; };
5148453C1BB9D076006A72ED /* IDBError.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBError.cpp; sourceTree = "<group>"; };
@@ -22439,6 +22441,7 @@
BCFF64900EAD15C200C1D6F7 /* LengthSize.h */,
A7AD2F850EC89D07008AB002 /* LinkHash.cpp */,
A7AD2F860EC89D07008AB002 /* LinkHash.h */,
+ 5143B2621DDD14900014FAC6 /* LinkIcon.h */,
C046E1AB1208A9FE00BA2CF7 /* LocalizedStrings.cpp */,
935207BD09BD410A00F2038D /* LocalizedStrings.h */,
A8239DFE09B3CF8A00B60641 /* Logging.cpp */,
@@ -27645,6 +27648,7 @@
B22279F40D00BF220071B782 /* SVGFEMergeElement.h in Headers */,
B22279F70D00BF220071B782 /* SVGFEMergeNodeElement.h in Headers */,
84224194107E78A700766A87 /* SVGFEMorphologyElement.h in Headers */,
+ 5143B2631DDD15200014FAC6 /* LinkIcon.h in Headers */,
B22279FA0D00BF220071B782 /* SVGFEOffsetElement.h in Headers */,
B22279FD0D00BF220071B782 /* SVGFEPointLightElement.h in Headers */,
B2227A000D00BF220071B782 /* SVGFESpecularLightingElement.h in Headers */,
Modified: trunk/Source/WebCore/dom/Document.cpp (208864 => 208865)
--- trunk/Source/WebCore/dom/Document.cpp 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebCore/dom/Document.cpp 2016-11-18 00:22:44 UTC (rev 208865)
@@ -2654,7 +2654,12 @@
// 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.
Modified: trunk/Source/WebCore/html/LinkIconCollector.cpp (208864 => 208865)
--- trunk/Source/WebCore/html/LinkIconCollector.cpp 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebCore/html/LinkIconCollector.cpp 2016-11-18 00:22:44 UTC (rev 208865)
@@ -36,7 +36,7 @@
const unsigned defaultTouchIconWidth = 60;
-static unsigned iconSize(const LinkIconCollector::Icon& icon)
+static unsigned iconSize(const LinkIcon& icon)
{
if (icon.size)
return *icon.size;
@@ -47,7 +47,7 @@
return 0;
}
-static int compareIcons(const LinkIconCollector::Icon& a, const LinkIconCollector::Icon& b)
+static int compareIcons(const LinkIcon& a, const LinkIcon& b)
{
// Apple Touch icons always come first.
if (a.type == LinkIconType::Favicon && b.type != LinkIconType::Favicon)
@@ -72,13 +72,13 @@
return 0;
}
-auto LinkIconCollector::iconsOfTypes(OptionSet<LinkIconType> iconTypes) -> Vector<Icon>
+auto LinkIconCollector::iconsOfTypes(OptionSet<LinkIconType> iconTypes) -> Vector<LinkIcon>
{
auto* head = m_document.head();
if (!head)
return { };
- Vector<Icon> icons;
+ Vector<LinkIcon> icons;
for (auto& linkElement : childrenOfType<HTMLLinkElement>(*head)) {
if (!linkElement.iconType())
@@ -104,7 +104,7 @@
iconSize = size;
}
- icons.append({ url, iconType, iconSize });
+ icons.append({ url, iconType, linkElement.type(), iconSize });
}
std::sort(icons.begin(), icons.end(), [](auto& a, auto& b) {
Modified: trunk/Source/WebCore/html/LinkIconCollector.h (208864 => 208865)
--- trunk/Source/WebCore/html/LinkIconCollector.h 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebCore/html/LinkIconCollector.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -25,9 +25,8 @@
#pragma once
-#include "URL.h"
+#include "LinkIcon.h"
#include <wtf/OptionSet.h>
-#include <wtf/Optional.h>
namespace WebCore {
@@ -41,15 +40,8 @@
{
}
- struct Icon {
- URL url;
+ WEBCORE_EXPORT Vector<LinkIcon> iconsOfTypes(OptionSet<LinkIconType>);
- LinkIconType type;
- Optional<unsigned> size;
- };
-
- WEBCORE_EXPORT Vector<Icon> iconsOfTypes(OptionSet<LinkIconType>);
-
private:
Document& m_document;
};
Modified: trunk/Source/WebCore/loader/DocumentLoader.cpp (208864 => 208865)
--- trunk/Source/WebCore/loader/DocumentLoader.cpp 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebCore/loader/DocumentLoader.cpp 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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"
@@ -53,7 +54,10 @@
#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"
@@ -1698,6 +1702,46 @@
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(), 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;
Modified: trunk/Source/WebCore/loader/DocumentLoader.h (208864 => 208865)
--- trunk/Source/WebCore/loader/DocumentLoader.h 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebCore/loader/DocumentLoader.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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 FormState;
class Frame;
class FrameLoader;
+class IconLoader;
class Page;
class ResourceLoader;
class SharedBuffer;
@@ -289,6 +291,10 @@
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 @@
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 };
Modified: trunk/Source/WebCore/loader/FrameLoaderClient.h (208864 => 208865)
--- trunk/Source/WebCore/loader/FrameLoaderClient.h 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebCore/loader/FrameLoaderClient.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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 @@
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
Modified: trunk/Source/WebCore/loader/icon/IconLoader.cpp (208864 => 208865)
--- trunk/Source/WebCore/loader/icon/IconLoader.cpp 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebCore/loader/icon/IconLoader.cpp 2016-11-18 00:22:44 UTC (rev 208865)
@@ -44,10 +44,17 @@
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)
+{
+}
+
IconLoader::~IconLoader()
{
stopLoading();
@@ -55,10 +62,18 @@
void IconLoader::startLoading()
{
- if (m_resource || !m_frame.document())
+ ASSERT(m_frame || m_documentLoader);
+
+ if (m_resource)
return;
- ResourceRequest resourceRequest(m_frame.loader().icon().url());
+ if (m_frame && !m_frame->document())
+ return;
+
+ if (m_documentLoader && !m_documentLoader->frame())
+ return;
+
+ ResourceRequest resourceRequest(m_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 +81,12 @@
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", frame->loader().icon().url().string().ascii().data());
}
void IconLoader::stopLoading()
@@ -100,12 +116,19 @@
}
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();
}
Modified: trunk/Source/WebCore/loader/icon/IconLoader.h (208864 => 208865)
--- trunk/Source/WebCore/loader/icon/IconLoader.h 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebCore/loader/icon/IconLoader.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -27,6 +27,7 @@
#include "CachedRawResourceClient.h"
#include "CachedResourceHandle.h"
+#include "URL.h"
#include <wtf/Forward.h>
#include <wtf/Noncopyable.h>
@@ -33,6 +34,7 @@
namespace WebCore {
class CachedRawResource;
+class DocumentLoader;
class Frame;
class IconLoader final : private CachedRawResourceClient {
@@ -39,6 +41,7 @@
WTF_MAKE_NONCOPYABLE(IconLoader); WTF_MAKE_FAST_ALLOCATED;
public:
explicit IconLoader(Frame&);
+ IconLoader(DocumentLoader&, const URL&);
virtual ~IconLoader();
void startLoading();
@@ -47,7 +50,9 @@
private:
void notifyFinished(CachedResource&) final;
- Frame& m_frame;
+ Frame* m_frame { nullptr };
+ DocumentLoader* m_documentLoader { nullptr };
+ URL m_url;
CachedResourceHandle<CachedRawResource> m_resource;
};
Copied: trunk/Source/WebCore/platform/LinkIcon.h (from rev 208864, trunk/Source/WebCore/html/LinkIconCollector.h) (0 => 208865)
--- trunk/Source/WebCore/platform/LinkIcon.h (rev 0)
+++ trunk/Source/WebCore/platform/LinkIcon.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -0,0 +1,70 @@
+/*
+ * 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 "LinkIconType.h"
+#include "URL.h"
+#include <wtf/Optional.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebCore {
+
+struct LinkIcon {
+ URL url;
+ LinkIconType type;
+ String mimeType;
+ 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
Modified: trunk/Source/WebKit2/ChangeLog (208864 => 208865)
--- trunk/Source/WebKit2/ChangeLog 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/ChangeLog 2016-11-18 00:22:44 UTC (rev 208865)
@@ -1,3 +1,71 @@
+2016-11-17 Brady Eidson <[email protected]>
+
+ 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-11-17 Saam Barati <[email protected]>
Remove async/await compile time flag and enable tests
Copied: trunk/Source/WebKit2/UIProcess/API/APIIconLoadingClient.h (from rev 208864, trunk/Source/WebCore/html/LinkIconCollector.h) (0 => 208865)
--- trunk/Source/WebKit2/UIProcess/API/APIIconLoadingClient.h (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/APIIconLoadingClient.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (208864 => 208865)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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 @@
@implementation WKWebView {
std::unique_ptr<WebKit::NavigationState> _navigationState;
std::unique_ptr<WebKit::UIDelegate> _uiDelegate;
+ std::unique_ptr<WebKit::IconLoadingDelegate> _iconLoadingDelegate;
_WKRenderingProgressEvents _observedRenderingProgressEvents;
@@ -562,6 +564,8 @@
_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
@@ -676,6 +680,17 @@
_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);
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h (208864 => 208865)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -56,6 +56,7 @@
@class WKBrowsingContextHandle;
@class _WKFrameHandle;
@class _WKHitTestResult;
+@class _WKIconLoadingDelegate;
@class _WKRemoteObjectRegistry;
@class _WKSessionState;
@class _WKWebViewPrintFormatter;
@@ -63,6 +64,7 @@
@protocol WKHistoryDelegatePrivate;
@protocol _WKDiagnosticLoggingDelegate;
@protocol _WKFindDelegate;
+@protocol _WKIconLoadingDelegate;
@protocol _WKInputDelegate;
@protocol _WKFullscreenDelegate;
@@ -75,6 +77,7 @@
@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;
Copied: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKIconLoadingDelegate.h (from rev 208864, trunk/Source/WebCore/html/LinkIconCollector.h) (0 => 208865)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKIconLoadingDelegate.h (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKIconLoadingDelegate.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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
Copied: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.h (from rev 208864, trunk/Source/WebCore/html/LinkIconCollector.h) (0 => 208865)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.h (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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
Copied: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.mm (from rev 208864, trunk/Source/WebCore/html/LinkIconCollector.h) (0 => 208865)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.mm (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParameters.mm 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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
Copied: trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h (from rev 208864, trunk/Source/WebCore/html/LinkIconCollector.h) (0 => 208865)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKLinkIconParametersInternal.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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
Copied: trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.h (from rev 208864, trunk/Source/WebCore/html/LinkIconCollector.h) (0 => 208865)
--- trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.h (rev 0)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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
Added: trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.mm (0 => 208865)
--- trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.mm (rev 0)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/IconLoadingDelegate.mm 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (208864 => 208865)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp 2016-11-18 00:22:44 UTC (rev 208865)
@@ -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 @@
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) {
@@ -6635,6 +6650,30 @@
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)
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (208864 => 208865)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -129,6 +129,7 @@
class FormClient;
class FullscreenClient;
class HistoryClient;
+class IconLoadingClient;
class LoaderClient;
class Navigation;
class NavigationClient;
@@ -366,6 +367,9 @@
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();
@@ -1136,6 +1140,9 @@
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&);
@@ -1583,6 +1590,7 @@
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;
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (208864 => 208865)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in 2016-11-18 00:22:44 UTC (rev 208865)
@@ -478,6 +478,9 @@
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)
Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (208864 => 208865)
--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj 2016-11-18 00:22:44 UTC (rev 208865)
@@ -881,6 +881,9 @@
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 */; };
@@ -996,6 +999,8 @@
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, ); }; };
@@ -3012,6 +3017,8 @@
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>"; };
@@ -3081,6 +3088,11 @@
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>"; };
@@ -4820,6 +4832,8 @@
00B9661718E25AE100CE1F88 /* FindClient.mm */,
CD78E1121DB7D7ED0014A2DE /* FullscreenClient.mm */,
CD78E1131DB7D7ED0014A2DE /* FullscreenClient.h */,
+ 51C0C9721DDD74F00032CAD3 /* IconLoadingDelegate.h */,
+ 51C0C9731DDD74F00032CAD3 /* IconLoadingDelegate.mm */,
0F0C365918C0555800F607D7 /* LayerRepresentation.h */,
1ABC3DF41899E437004F0626 /* NavigationState.h */,
1ABC3DF31899E437004F0626 /* NavigationState.mm */,
@@ -5202,8 +5216,12 @@
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 */,
@@ -6290,6 +6308,7 @@
93A88B431BC8828C00ABA5C2 /* APIHitTestResult.h */,
7CE4D2061A46775700C7F152 /* APILegacyContextHistoryClient.h */,
1A2464F21891E45100234C5B /* APILoaderClient.h */,
+ 5143B2611DDD0DA00014FAC6 /* APIIconLoadingClient.h */,
7CD3A4801A5D02FA009623B8 /* APINavigation.cpp */,
7CD3A4811A5D02FA009623B8 /* APINavigation.h */,
2DF9EEEA1A7836EE00B6CFBE /* APINavigationAction.h */,
@@ -7837,6 +7856,7 @@
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 */,
@@ -7923,6 +7943,7 @@
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 */,
@@ -8284,6 +8305,7 @@
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 */,
@@ -9511,6 +9533,7 @@
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 */,
@@ -9608,6 +9631,7 @@
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 */,
Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (208864 => 208865)
--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp 2016-11-18 00:22:44 UTC (rev 208865)
@@ -1749,4 +1749,25 @@
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
Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.h (208864 => 208865)
--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.h 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -46,6 +46,8 @@
bool frameHasCustomContentProvider() const { return m_frameHasCustomContentProvider; }
+ void setUseIconLoadingClient(bool useIconLoadingClient) { m_useIconLoadingClient = useIconLoadingClient; }
+
private:
void frameLoaderDestroyed() override;
@@ -255,6 +257,10 @@
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;
@@ -261,6 +267,7 @@
bool m_didCompletePageTransition;
bool m_frameHasCustomContentProvider;
bool m_frameCameFromPageCache;
+ bool m_useIconLoadingClient { false };
};
// As long as EmptyFrameLoaderClient exists in WebCore, this can return 0.
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (208864 => 208865)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp 2016-11-18 00:22:44 UTC (rev 208865)
@@ -5663,4 +5663,15 @@
}
#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
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (208864 => 208865)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -968,6 +968,9 @@
void didLosePointerLock();
#endif
+ void didGetLoadDecisionForIcon(bool decision, uint64_t loadIdentifier, uint64_t newCallbackID);
+ void setUseIconLoadingClient(bool);
+
private:
WebPage(uint64_t pageID, const WebPageCreationParameters&);
Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in (208864 => 208865)
--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in 2016-11-18 00:22:44 UTC (rev 208865)
@@ -446,6 +446,9 @@
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
Modified: trunk/Tools/ChangeLog (208864 => 208865)
--- trunk/Tools/ChangeLog 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Tools/ChangeLog 2016-11-18 00:22:44 UTC (rev 208865)
@@ -1,3 +1,22 @@
+2016-11-17 Brady Eidson <[email protected]>
+
+ 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-11-17 Caitlin Potter <[email protected]>
[JSC] remove leftover references to ES2017_ASYNCFUNCTION_SYNTAX flag
Modified: trunk/Tools/MiniBrowser/mac/SettingsController.h (208864 => 208865)
--- trunk/Tools/MiniBrowser/mac/SettingsController.h 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Tools/MiniBrowser/mac/SettingsController.h 2016-11-18 00:22:44 UTC (rev 208865)
@@ -51,6 +51,7 @@
@property (nonatomic, readonly) BOOL resourceLoadStatisticsEnabled;
@property (nonatomic, readonly) BOOL visualViewportEnabled;
@property (nonatomic, readonly) BOOL asyncImageDecodingEnabled;
+@property (nonatomic, readonly) BOOL loadsAllSiteIcons;
@property (nonatomic, readonly) BOOL usesGameControllerFramework;
@property (nonatomic, readonly) NSString *defaultURL;
Modified: trunk/Tools/MiniBrowser/mac/SettingsController.m (208864 => 208865)
--- trunk/Tools/MiniBrowser/mac/SettingsController.m 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Tools/MiniBrowser/mac/SettingsController.m 2016-11-18 00:22:44 UTC (rev 208865)
@@ -41,6 +41,7 @@
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";
@@ -135,6 +136,7 @@
[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:@""];
@@ -209,6 +211,8 @@
[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:))
@@ -358,6 +362,16 @@
[self _toggleBooleanDefault:ResourceUsageOverlayVisiblePreferenceKey];
}
+- (BOOL)loadsAllSiteIcons
+{
+ return [[NSUserDefaults standardUserDefaults] boolForKey:LoadsAllSiteIconsKey];
+}
+
+- (void)toggleLoadsAllSiteIcons:(id)sender
+{
+ [self _toggleBooleanDefault:LoadsAllSiteIconsKey];
+}
+
- (BOOL)usesGameControllerFramework
{
return [[NSUserDefaults standardUserDefaults] boolForKey:UsesGameControllerFrameworkKey];
Modified: trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m (208864 => 208865)
--- trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m 2016-11-18 00:11:18 UTC (rev 208864)
+++ trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m 2016-11-18 00:22:44 UTC (rev 208865)
@@ -38,11 +38,13 @@
#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 @@
_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
@@ -649,6 +656,13 @@
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