Title: [254877] trunk
Revision
254877
Author
[email protected]
Date
2020-01-21 13:25:31 -0800 (Tue, 21 Jan 2020)

Log Message

Add SPI on WKURLSchemeTask to access WKFrameInfo of originating frame
https://bugs.webkit.org/show_bug.cgi?id=204265
<rdar://57193883>

Patch by Alex Christensen <[email protected]> on 2020-01-21
Reviewed by Brady Eidson.

Source/WebKit:

Covered by API tests.

* Shared/URLSchemeTaskParameters.cpp:
(WebKit::URLSchemeTaskParameters::encode const):
(WebKit::URLSchemeTaskParameters::decode):
* Shared/URLSchemeTaskParameters.h:
* UIProcess/API/Cocoa/WKURLSchemeTask.mm:
(-[WKURLSchemeTaskImpl _frame]):
* UIProcess/API/Cocoa/WKURLSchemeTaskPrivate.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::startURLSchemeTaskShared):
(WebKit::WebPageProxy::loadSynchronousURLSchemeTask):
* UIProcess/WebURLSchemeHandler.cpp:
(WebKit::WebURLSchemeHandler::startTask):
* UIProcess/WebURLSchemeHandler.h:
* UIProcess/WebURLSchemeTask.cpp:
(WebKit::WebURLSchemeTask::create):
(WebKit::WebURLSchemeTask::WebURLSchemeTask):
* UIProcess/WebURLSchemeTask.h:
(WebKit::WebURLSchemeTask::frameInfo const):
* WebProcess/Network/WebLoaderStrategy.cpp:
(WebKit::WebLoaderStrategy::tryLoadingUsingURLSchemeHandler):
* WebProcess/WebPage/WebURLSchemeHandlerProxy.cpp:
(WebKit::WebURLSchemeHandlerProxy::startNewTask):
* WebProcess/WebPage/WebURLSchemeHandlerProxy.h:
* WebProcess/WebPage/WebURLSchemeTaskProxy.cpp:
(WebKit::WebURLSchemeTaskProxy::WebURLSchemeTaskProxy):
(WebKit::WebURLSchemeTaskProxy::startLoading):
(WebKit::WebURLSchemeTaskProxy::stopLoading):
(WebKit::WebURLSchemeTaskProxy::didComplete):
(WebKit::WebURLSchemeTaskProxy::hasLoader):
* WebProcess/WebPage/WebURLSchemeTaskProxy.h:
(WebKit::WebURLSchemeTaskProxy::create):

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm:
(-[FrameSchemeHandler waitForAllRequests]):
(-[FrameSchemeHandler setExpectedWebView:]):
(-[FrameSchemeHandler webView:startURLSchemeTask:]):
(-[FrameSchemeHandler webView:stopURLSchemeTask:]):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (254876 => 254877)


--- trunk/Source/WebKit/ChangeLog	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/ChangeLog	2020-01-21 21:25:31 UTC (rev 254877)
@@ -1,3 +1,45 @@
+2020-01-21  Alex Christensen  <[email protected]>
+
+        Add SPI on WKURLSchemeTask to access WKFrameInfo of originating frame
+        https://bugs.webkit.org/show_bug.cgi?id=204265
+        <rdar://57193883>
+
+        Reviewed by Brady Eidson.
+
+        Covered by API tests.
+
+        * Shared/URLSchemeTaskParameters.cpp:
+        (WebKit::URLSchemeTaskParameters::encode const):
+        (WebKit::URLSchemeTaskParameters::decode):
+        * Shared/URLSchemeTaskParameters.h:
+        * UIProcess/API/Cocoa/WKURLSchemeTask.mm:
+        (-[WKURLSchemeTaskImpl _frame]):
+        * UIProcess/API/Cocoa/WKURLSchemeTaskPrivate.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::startURLSchemeTaskShared):
+        (WebKit::WebPageProxy::loadSynchronousURLSchemeTask):
+        * UIProcess/WebURLSchemeHandler.cpp:
+        (WebKit::WebURLSchemeHandler::startTask):
+        * UIProcess/WebURLSchemeHandler.h:
+        * UIProcess/WebURLSchemeTask.cpp:
+        (WebKit::WebURLSchemeTask::create):
+        (WebKit::WebURLSchemeTask::WebURLSchemeTask):
+        * UIProcess/WebURLSchemeTask.h:
+        (WebKit::WebURLSchemeTask::frameInfo const):
+        * WebProcess/Network/WebLoaderStrategy.cpp:
+        (WebKit::WebLoaderStrategy::tryLoadingUsingURLSchemeHandler):
+        * WebProcess/WebPage/WebURLSchemeHandlerProxy.cpp:
+        (WebKit::WebURLSchemeHandlerProxy::startNewTask):
+        * WebProcess/WebPage/WebURLSchemeHandlerProxy.h:
+        * WebProcess/WebPage/WebURLSchemeTaskProxy.cpp:
+        (WebKit::WebURLSchemeTaskProxy::WebURLSchemeTaskProxy):
+        (WebKit::WebURLSchemeTaskProxy::startLoading):
+        (WebKit::WebURLSchemeTaskProxy::stopLoading):
+        (WebKit::WebURLSchemeTaskProxy::didComplete):
+        (WebKit::WebURLSchemeTaskProxy::hasLoader):
+        * WebProcess/WebPage/WebURLSchemeTaskProxy.h:
+        (WebKit::WebURLSchemeTaskProxy::create):
+
 2020-01-21  Keith Rollin  <[email protected]>
 
         Fix SDK availability macros

Modified: trunk/Source/WebKit/Shared/URLSchemeTaskParameters.cpp (254876 => 254877)


--- trunk/Source/WebKit/Shared/URLSchemeTaskParameters.cpp	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/Shared/URLSchemeTaskParameters.cpp	2020-01-21 21:25:31 UTC (rev 254877)
@@ -42,6 +42,7 @@
         request.httpBody()->encode(encoder);
     } else
         encoder << false;
+    encoder << frameInfo;
 }
 
 Optional<URLSchemeTaskParameters> URLSchemeTaskParameters::decode(IPC::Decoder& decoder)
@@ -70,8 +71,18 @@
             return WTF::nullopt;
         request.setHTTPBody(WTFMove(formData));
     }
+    
+    Optional<FrameInfoData> frameInfo;
+    decoder >> frameInfo;
+    if (!frameInfo)
+        return WTF::nullopt;
 
-    return {{ WTFMove(*handlerIdentifier), WTFMove(*taskIdentifier), WTFMove(request) }};
+    return {{
+        WTFMove(*handlerIdentifier),
+        WTFMove(*taskIdentifier),
+        WTFMove(request),
+        WTFMove(*frameInfo),
+    }};
 }
     
 } // namespace WebKit

Modified: trunk/Source/WebKit/Shared/URLSchemeTaskParameters.h (254876 => 254877)


--- trunk/Source/WebKit/Shared/URLSchemeTaskParameters.h	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/Shared/URLSchemeTaskParameters.h	2020-01-21 21:25:31 UTC (rev 254877)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "FrameInfoData.h"
 #include <WebCore/ResourceRequest.h>
 
 namespace IPC {
@@ -38,6 +39,7 @@
     uint64_t handlerIdentifier { 0 };
     uint64_t taskIdentifier { 0 };
     WebCore::ResourceRequest request;
+    FrameInfoData frameInfo;
     
     void encode(IPC::Encoder&) const;
     static Optional<URLSchemeTaskParameters> decode(IPC::Decoder&);

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKURLSchemeTask.mm (254876 => 254877)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKURLSchemeTask.mm	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKURLSchemeTask.mm	2020-01-21 21:25:31 UTC (rev 254877)
@@ -24,8 +24,10 @@
  */
 
 #import "config.h"
+#import "WKURLSchemeTask.h"
+
+#import "WKFrameInfoInternal.h"
 #import "WKURLSchemeTaskInternal.h"
-
 #import "WebURLSchemeHandler.h"
 #import "WebURLSchemeTask.h"
 #import <WebCore/ResourceError.h>
@@ -146,6 +148,11 @@
     raiseExceptionIfNecessary(result);
 }
 
+- (WKFrameInfo *)_frame
+{
+    return wrapper(_urlSchemeTask->task().frameInfo());
+}
+
 #pragma mark WKObject protocol implementation
 
 - (API::Object&)_apiObject

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKURLSchemeTaskPrivate.h (254876 => 254877)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKURLSchemeTaskPrivate.h	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKURLSchemeTaskPrivate.h	2020-01-21 21:25:31 UTC (rev 254877)
@@ -25,6 +25,8 @@
 
 #import <WebKit/WKURLSchemeTask.h>
 
+@class WKFrameInfo;
+
 WK_API_AVAILABLE(macos(10.13), ios(11.0))
 @protocol WKURLSchemeTaskPrivate <WKURLSchemeTask>
 
@@ -31,5 +33,6 @@
 - (void)_didPerformRedirection:(NSURLResponse *)response newRequest:(NSURLRequest *)request;
 
 @property (nonatomic, readonly) BOOL _requestOnlyIfCached WK_API_AVAILABLE(macos(10.15), ios(13.0));
+@property (nonatomic, readonly) WKFrameInfo *_frame WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
 
 @end

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (254876 => 254877)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2020-01-21 21:25:31 UTC (rev 254877)
@@ -9063,7 +9063,7 @@
     auto iterator = m_urlSchemeHandlersByIdentifier.find(parameters.handlerIdentifier);
     MESSAGE_CHECK(process, iterator != m_urlSchemeHandlersByIdentifier.end());
 
-    iterator->value->startTask(*this, process, webPageID, parameters.taskIdentifier, WTFMove(parameters.request), nullptr);
+    iterator->value->startTask(*this, process, webPageID, WTFMove(parameters), nullptr);
 }
 
 void WebPageProxy::stopURLSchemeTask(uint64_t handlerIdentifier, uint64_t taskIdentifier)
@@ -9079,7 +9079,7 @@
     auto iterator = m_urlSchemeHandlersByIdentifier.find(parameters.handlerIdentifier);
     MESSAGE_CHECK(m_process, iterator != m_urlSchemeHandlersByIdentifier.end());
 
-    iterator->value->startTask(*this, m_process, m_webPageID, parameters.taskIdentifier, WTFMove(parameters.request), WTFMove(reply));
+    iterator->value->startTask(*this, m_process, m_webPageID, WTFMove(parameters), WTFMove(reply));
 }
 
 #if ENABLE(RESOURCE_LOAD_STATISTICS)

Modified: trunk/Source/WebKit/UIProcess/WebURLSchemeHandler.cpp (254876 => 254877)


--- trunk/Source/WebKit/UIProcess/WebURLSchemeHandler.cpp	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/UIProcess/WebURLSchemeHandler.cpp	2020-01-21 21:25:31 UTC (rev 254877)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "WebURLSchemeHandler.h"
 
+#include "URLSchemeTaskParameters.h"
 #include "WebPageProxy.h"
 #include "WebURLSchemeTask.h"
 
@@ -48,9 +49,10 @@
     ASSERT(m_tasks.isEmpty());
 }
 
-void WebURLSchemeHandler::startTask(WebPageProxy& page, WebProcessProxy& process, PageIdentifier webPageID, uint64_t taskIdentifier, ResourceRequest&& request, SyncLoadCompletionHandler&& completionHandler)
+void WebURLSchemeHandler::startTask(WebPageProxy& page, WebProcessProxy& process, PageIdentifier webPageID, URLSchemeTaskParameters&& parameters, SyncLoadCompletionHandler&& completionHandler)
 {
-    auto result = m_tasks.add(taskIdentifier, WebURLSchemeTask::create(*this, page, process, webPageID, taskIdentifier, WTFMove(request), WTFMove(completionHandler)));
+    auto taskIdentifier = parameters.taskIdentifier;
+    auto result = m_tasks.add(taskIdentifier, WebURLSchemeTask::create(*this, page, process, webPageID, WTFMove(parameters), WTFMove(completionHandler)));
     ASSERT(result.isNewEntry);
 
     auto pageEntry = m_tasksByPageIdentifier.add(page.identifier(), HashSet<uint64_t>());

Modified: trunk/Source/WebKit/UIProcess/WebURLSchemeHandler.h (254876 => 254877)


--- trunk/Source/WebKit/UIProcess/WebURLSchemeHandler.h	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/UIProcess/WebURLSchemeHandler.h	2020-01-21 21:25:31 UTC (rev 254877)
@@ -41,6 +41,7 @@
 
 namespace WebKit {
 
+struct URLSchemeTaskParameters;
 class WebPageProxy;
 class WebProcessProxy;
 
@@ -53,7 +54,7 @@
 
     uint64_t identifier() const { return m_identifier; }
 
-    void startTask(WebPageProxy&, WebProcessProxy&, WebCore::PageIdentifier, uint64_t taskIdentifier, WebCore::ResourceRequest&&, SyncLoadCompletionHandler&&);
+    void startTask(WebPageProxy&, WebProcessProxy&, WebCore::PageIdentifier, URLSchemeTaskParameters&&, SyncLoadCompletionHandler&&);
     void stopTask(WebPageProxy&, uint64_t taskIdentifier);
     void stopAllTasksForPage(WebPageProxy&, WebProcessProxy*);
     void taskCompleted(WebURLSchemeTask&);

Modified: trunk/Source/WebKit/UIProcess/WebURLSchemeTask.cpp (254876 => 254877)


--- trunk/Source/WebKit/UIProcess/WebURLSchemeTask.cpp	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/UIProcess/WebURLSchemeTask.cpp	2020-01-21 21:25:31 UTC (rev 254877)
@@ -26,8 +26,10 @@
 #include "config.h"
 #include "WebURLSchemeTask.h"
 
+#include "APIFrameInfo.h"
 #include "DataReference.h"
 #include "SharedBufferDataReference.h"
+#include "URLSchemeTaskParameters.h"
 #include "WebErrors.h"
 #include "WebPageMessages.h"
 #include "WebPageProxy.h"
@@ -36,18 +38,19 @@
 namespace WebKit {
 using namespace WebCore;
 
-Ref<WebURLSchemeTask> WebURLSchemeTask::create(WebURLSchemeHandler& handler, WebPageProxy& page, WebProcessProxy& process, PageIdentifier webPageID, uint64_t resourceIdentifier, ResourceRequest&& request, SyncLoadCompletionHandler&& syncCompletionHandler)
+Ref<WebURLSchemeTask> WebURLSchemeTask::create(WebURLSchemeHandler& handler, WebPageProxy& page, WebProcessProxy& process, PageIdentifier webPageID, URLSchemeTaskParameters&& parameters, SyncLoadCompletionHandler&& syncCompletionHandler)
 {
-    return adoptRef(*new WebURLSchemeTask(handler, page, process, webPageID, resourceIdentifier, WTFMove(request), WTFMove(syncCompletionHandler)));
+    return adoptRef(*new WebURLSchemeTask(handler, page, process, webPageID, WTFMove(parameters), WTFMove(syncCompletionHandler)));
 }
 
-WebURLSchemeTask::WebURLSchemeTask(WebURLSchemeHandler& handler, WebPageProxy& page, WebProcessProxy& process, PageIdentifier webPageID, uint64_t resourceIdentifier, ResourceRequest&& request, SyncLoadCompletionHandler&& syncCompletionHandler)
+WebURLSchemeTask::WebURLSchemeTask(WebURLSchemeHandler& handler, WebPageProxy& page, WebProcessProxy& process, PageIdentifier webPageID, URLSchemeTaskParameters&& parameters, SyncLoadCompletionHandler&& syncCompletionHandler)
     : m_urlSchemeHandler(handler)
     , m_process(makeRef(process))
-    , m_identifier(resourceIdentifier)
+    , m_identifier(parameters.taskIdentifier)
     , m_pageProxyID(page.identifier())
     , m_webPageID(webPageID)
-    , m_request(WTFMove(request))
+    , m_request(WTFMove(parameters.request))
+    , m_frameInfo(API::FrameInfo::create(WTFMove(parameters.frameInfo), &page))
     , m_syncCompletionHandler(WTFMove(syncCompletionHandler))
 {
     ASSERT(RunLoop::isMain());

Modified: trunk/Source/WebKit/UIProcess/WebURLSchemeTask.h (254876 => 254877)


--- trunk/Source/WebKit/UIProcess/WebURLSchemeTask.h	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/UIProcess/WebURLSchemeTask.h	2020-01-21 21:25:31 UTC (rev 254877)
@@ -34,6 +34,10 @@
 #include <wtf/RefCounted.h>
 #include <wtf/RefPtr.h>
 
+namespace API {
+class FrameInfo;
+}
+
 namespace IPC {
 class DataReference;
 }
@@ -46,6 +50,7 @@
 
 namespace WebKit {
 
+struct URLSchemeTaskParameters;
 class WebURLSchemeHandler;
 class WebPageProxy;
 
@@ -54,7 +59,7 @@
 class WebURLSchemeTask : public ThreadSafeRefCounted<WebURLSchemeTask>, public InstanceCounted<WebURLSchemeTask> {
     WTF_MAKE_NONCOPYABLE(WebURLSchemeTask);
 public:
-    static Ref<WebURLSchemeTask> create(WebURLSchemeHandler&, WebPageProxy&, WebProcessProxy&, WebCore::PageIdentifier, uint64_t identifier, WebCore::ResourceRequest&&, SyncLoadCompletionHandler&&);
+    static Ref<WebURLSchemeTask> create(WebURLSchemeHandler&, WebPageProxy&, WebProcessProxy&, WebCore::PageIdentifier, URLSchemeTaskParameters&&, SyncLoadCompletionHandler&&);
 
     ~WebURLSchemeTask();
 
@@ -63,6 +68,7 @@
     WebCore::PageIdentifier webPageID() const { ASSERT(RunLoop::isMain()); return m_webPageID; }
     WebProcessProxy* process() { ASSERT(RunLoop::isMain()); return m_process.get(); }
     const WebCore::ResourceRequest& request() const { ASSERT(RunLoop::isMain()); return m_request; }
+    API::FrameInfo& frameInfo() const { return m_frameInfo.get(); }
 
 #if PLATFORM(COCOA)
     NSURLRequest *nsRequest() const;
@@ -85,7 +91,7 @@
     void pageDestroyed();
 
 private:
-    WebURLSchemeTask(WebURLSchemeHandler&, WebPageProxy&, WebProcessProxy&, WebCore::PageIdentifier, uint64_t identifier, WebCore::ResourceRequest&&, SyncLoadCompletionHandler&&);
+    WebURLSchemeTask(WebURLSchemeHandler&, WebPageProxy&, WebProcessProxy&, WebCore::PageIdentifier, URLSchemeTaskParameters&&, SyncLoadCompletionHandler&&);
 
     bool isSync() const { return !!m_syncCompletionHandler; }
 
@@ -95,6 +101,7 @@
     WebPageProxyIdentifier m_pageProxyID;
     WebCore::PageIdentifier m_webPageID;
     WebCore::ResourceRequest m_request;
+    Ref<API::FrameInfo> m_frameInfo;
     mutable Lock m_requestLock;
     bool m_stopped { false };
     bool m_responseSent { false };

Modified: trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (254876 => 254877)


--- trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp	2020-01-21 21:25:31 UTC (rev 254877)
@@ -240,18 +240,26 @@
 bool WebLoaderStrategy::tryLoadingUsingURLSchemeHandler(ResourceLoader& resourceLoader, const WebResourceLoader::TrackingParameters& trackingParameters)
 {
     auto* webFrameLoaderClient = toWebFrameLoaderClient(resourceLoader.frameLoader()->client());
-    auto* webFrame = webFrameLoaderClient ? webFrameLoaderClient->webFrame() : nullptr;
-    auto* webPage = webFrame ? webFrame->page() : nullptr;
-    if (webPage) {
-        if (auto* handler = webPage->urlSchemeHandlerForScheme(resourceLoader.request().url().protocol().toStringWithoutCopying())) {
-            LOG(NetworkScheduling, "(WebProcess) WebLoaderStrategy::scheduleLoad, URL '%s' will be handled by a UIProcess URL scheme handler.", resourceLoader.url().string().utf8().data());
-            WEBLOADERSTRATEGY_RELEASE_LOG_IF_ALLOWED("tryLoadingUsingURLSchemeHandler: URL will be handled by a UIProcess URL scheme handler");
+    if (!webFrameLoaderClient)
+        return false;
 
-            handler->startNewTask(resourceLoader);
-            return true;
-        }
-    }
-    return false;
+    auto* webFrame = webFrameLoaderClient->webFrame();
+    if (!webFrame)
+        return false;
+
+    auto* webPage = webFrame->page();
+    if (!webPage)
+        return false;
+
+    auto* handler = webPage->urlSchemeHandlerForScheme(resourceLoader.request().url().protocol().toStringWithoutCopying());
+    if (!handler)
+        return false;
+
+    LOG(NetworkScheduling, "(WebProcess) WebLoaderStrategy::scheduleLoad, URL '%s' will be handled by a UIProcess URL scheme handler.", resourceLoader.url().string().utf8().data());
+    WEBLOADERSTRATEGY_RELEASE_LOG_IF_ALLOWED("tryLoadingUsingURLSchemeHandler: URL will be handled by a UIProcess URL scheme handler");
+
+    handler->startNewTask(resourceLoader, *webFrame);
+    return true;
 }
 
 static void addParametersFromFrame(const Frame* frame, NetworkResourceLoadParameters& parameters)
@@ -532,7 +540,7 @@
     LOG(NetworkScheduling, "(WebProcess) WebLoaderStrategy::scheduleLoad, sync load to URL '%s' will be handled by a UIProcess URL scheme handler.", request.url().string().utf8().data());
 
     SyncLoadResult result;
-    handler->loadSynchronously(identifier, request, result.response, result.error, result.data);
+    handler->loadSynchronously(identifier, *webFrame, request, result.response, result.error, result.data);
 
     return result;
 }

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeHandlerProxy.cpp (254876 => 254877)


--- trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeHandlerProxy.cpp	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeHandlerProxy.cpp	2020-01-21 21:25:31 UTC (rev 254877)
@@ -53,9 +53,9 @@
     ASSERT(m_tasks.isEmpty());
 }
 
-void WebURLSchemeHandlerProxy::startNewTask(ResourceLoader& loader)
+void WebURLSchemeHandlerProxy::startNewTask(ResourceLoader& loader, WebFrame& webFrame)
 {
-    auto result = m_tasks.add(loader.identifier(), WebURLSchemeTaskProxy::create(*this, loader));
+    auto result = m_tasks.add(loader.identifier(), WebURLSchemeTaskProxy::create(*this, loader, webFrame));
     ASSERT(result.isNewEntry);
 
     WebProcess::singleton().webLoaderStrategy().addURLSchemeTaskProxy(*result.iterator->value);
@@ -62,10 +62,10 @@
     result.iterator->value->startLoading();
 }
 
-void WebURLSchemeHandlerProxy::loadSynchronously(ResourceLoadIdentifier loadIdentifier, const ResourceRequest& request, ResourceResponse& response, ResourceError& error, Vector<char>& data)
+void WebURLSchemeHandlerProxy::loadSynchronously(ResourceLoadIdentifier loadIdentifier, WebFrame& webFrame, const ResourceRequest& request, ResourceResponse& response, ResourceError& error, Vector<char>& data)
 {
     data.shrink(0);
-    if (!m_webPage.sendSync(Messages::WebPageProxy::LoadSynchronousURLSchemeTask(URLSchemeTaskParameters { m_identifier, loadIdentifier, request }), Messages::WebPageProxy::LoadSynchronousURLSchemeTask::Reply(response, error, data))) {
+    if (!m_webPage.sendSync(Messages::WebPageProxy::LoadSynchronousURLSchemeTask(URLSchemeTaskParameters { m_identifier, loadIdentifier, request, webFrame.info() }), Messages::WebPageProxy::LoadSynchronousURLSchemeTask::Reply(response, error, data))) {
         error = failedCustomProtocolSyncLoad(request);
         return;
     }

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeHandlerProxy.h (254876 => 254877)


--- trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeHandlerProxy.h	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeHandlerProxy.h	2020-01-21 21:25:31 UTC (rev 254877)
@@ -49,10 +49,10 @@
     }
     ~WebURLSchemeHandlerProxy();
 
-    void startNewTask(WebCore::ResourceLoader&);
+    void startNewTask(WebCore::ResourceLoader&, WebFrame&);
     void stopAllTasks();
 
-    void loadSynchronously(ResourceLoadIdentifier, const WebCore::ResourceRequest&, WebCore::ResourceResponse&, WebCore::ResourceError&, Vector<char>&);
+    void loadSynchronously(ResourceLoadIdentifier, WebFrame&, const WebCore::ResourceRequest&, WebCore::ResourceResponse&, WebCore::ResourceError&, Vector<char>&);
 
     uint64_t identifier() const { return m_identifier; }
     WebPage& page() { return m_webPage; }

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeTaskProxy.cpp (254876 => 254877)


--- trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeTaskProxy.cpp	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeTaskProxy.cpp	2020-01-21 21:25:31 UTC (rev 254877)
@@ -29,6 +29,7 @@
 #include "Logging.h"
 #include "URLSchemeTaskParameters.h"
 #include "WebCoreArgumentCoders.h"
+#include "WebFrame.h"
 #include "WebPage.h"
 #include "WebPageProxyMessages.h"
 #include "WebURLSchemeHandlerProxy.h"
@@ -40,9 +41,10 @@
 namespace WebKit {
 using namespace WebCore;
 
-WebURLSchemeTaskProxy::WebURLSchemeTaskProxy(WebURLSchemeHandlerProxy& handler, ResourceLoader& loader)
+WebURLSchemeTaskProxy::WebURLSchemeTaskProxy(WebURLSchemeHandlerProxy& handler, ResourceLoader& loader, WebFrame& frame)
     : m_urlSchemeHandler(handler)
     , m_coreLoader(&loader)
+    , m_frame(&frame)
     , m_request(loader.request())
     , m_identifier(loader.identifier())
 {
@@ -51,7 +53,8 @@
 void WebURLSchemeTaskProxy::startLoading()
 {
     ASSERT(m_coreLoader);
-    m_urlSchemeHandler.page().send(Messages::WebPageProxy::StartURLSchemeTask({m_urlSchemeHandler.identifier(), m_coreLoader->identifier(), m_request}));
+    ASSERT(m_frame);
+    m_urlSchemeHandler.page().send(Messages::WebPageProxy::StartURLSchemeTask(URLSchemeTaskParameters { m_urlSchemeHandler.identifier(), m_coreLoader->identifier(), m_request, m_frame->info() }));
 }
 
 void WebURLSchemeTaskProxy::stopLoading()
@@ -59,6 +62,7 @@
     ASSERT(m_coreLoader);
     m_urlSchemeHandler.page().send(Messages::WebPageProxy::StopURLSchemeTask(m_urlSchemeHandler.identifier(), m_coreLoader->identifier()));
     m_coreLoader = nullptr;
+    m_frame = nullptr;
 
     // This line will result in this being deleted.
     m_urlSchemeHandler.taskDidStopLoading(*this);
@@ -149,12 +153,15 @@
         m_coreLoader->didFail(error);
 
     m_coreLoader = nullptr;
+    m_frame = nullptr;
 }
 
 bool WebURLSchemeTaskProxy::hasLoader()
 {
-    if (m_coreLoader && m_coreLoader->reachedTerminalState())
+    if (m_coreLoader && m_coreLoader->reachedTerminalState()) {
         m_coreLoader = nullptr;
+        m_frame = nullptr;
+    }
 
     return m_coreLoader;
 }

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeTaskProxy.h (254876 => 254877)


--- trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeTaskProxy.h	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebURLSchemeTaskProxy.h	2020-01-21 21:25:31 UTC (rev 254877)
@@ -37,13 +37,14 @@
 
 namespace WebKit {
 
+class WebFrame;
 class WebURLSchemeHandlerProxy;
 
 class WebURLSchemeTaskProxy : public RefCounted<WebURLSchemeTaskProxy> {
 public:
-    static Ref<WebURLSchemeTaskProxy> create(WebURLSchemeHandlerProxy& handler, WebCore::ResourceLoader& loader)
+    static Ref<WebURLSchemeTaskProxy> create(WebURLSchemeHandlerProxy& handler, WebCore::ResourceLoader& loader, WebFrame& webFrame)
     {
-        return adoptRef(*new WebURLSchemeTaskProxy(handler, loader));
+        return adoptRef(*new WebURLSchemeTaskProxy(handler, loader, webFrame));
     }
     
     const WebCore::ResourceRequest& request() const { return m_request; }
@@ -59,7 +60,7 @@
     unsigned long identifier() const { return m_identifier; }
 
 private:
-    WebURLSchemeTaskProxy(WebURLSchemeHandlerProxy&, WebCore::ResourceLoader&);
+    WebURLSchemeTaskProxy(WebURLSchemeHandlerProxy&, WebCore::ResourceLoader&, WebFrame&);
     bool hasLoader();
 
     void queueTask(Function<void()>&& task) { m_queuedTasks.append(WTFMove(task)); }
@@ -67,6 +68,7 @@
 
     WebURLSchemeHandlerProxy& m_urlSchemeHandler;
     RefPtr<WebCore::ResourceLoader> m_coreLoader;
+    RefPtr<WebFrame> m_frame;
     WebCore::ResourceRequest m_request;
     unsigned long m_identifier;
     bool m_waitingForCompletionHandler { false };

Modified: trunk/Tools/ChangeLog (254876 => 254877)


--- trunk/Tools/ChangeLog	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Tools/ChangeLog	2020-01-21 21:25:31 UTC (rev 254877)
@@ -1,3 +1,17 @@
+2020-01-21  Alex Christensen  <[email protected]>
+
+        Add SPI on WKURLSchemeTask to access WKFrameInfo of originating frame
+        https://bugs.webkit.org/show_bug.cgi?id=204265
+        <rdar://57193883>
+
+        Reviewed by Brady Eidson.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm:
+        (-[FrameSchemeHandler waitForAllRequests]):
+        (-[FrameSchemeHandler setExpectedWebView:]):
+        (-[FrameSchemeHandler webView:startURLSchemeTask:]):
+        (-[FrameSchemeHandler webView:stopURLSchemeTask:]):
+
 2020-01-21  Aakash Jain  <[email protected]>
 
         [ews] commit-queue should check cq+ flag

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm (254876 => 254877)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm	2020-01-21 21:12:12 UTC (rev 254876)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm	2020-01-21 21:25:31 UTC (rev 254877)
@@ -42,6 +42,7 @@
 #import <wtf/RunLoop.h>
 #import <wtf/Threading.h>
 #import <wtf/Vector.h>
+#import <wtf/WeakObjCPtr.h>
 #import <wtf/text/StringHash.h>
 #import <wtf/text/WTFString.h>
 
@@ -882,3 +883,78 @@
 }
 
 #endif // HAVE(NETWORK_FRAMEWORK)
+
+@interface FrameSchemeHandler : NSObject <WKURLSchemeHandler>
+- (void)waitForAllRequests;
+- (void)setExpectedWebView:(WKWebView *)webView;
+@end
+
+@implementation FrameSchemeHandler {
+    size_t _requestCount;
+    WeakObjCPtr<WKWebView> _webView;
+}
+
+- (void)waitForAllRequests
+{
+    while (_requestCount < 3)
+        TestWebKitAPI::Util::spinRunLoop();
+}
+
+- (void)setExpectedWebView:(WKWebView *)webView
+{
+    _webView = webView;
+}
+
+- (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)task
+{
+    auto check = [&] (id<WKURLSchemeTask> task, const char* url, bool mainFrame, const char* request, const char* originProtocol, const char* originHost, NSInteger originPort) {
+        EXPECT_WK_STREQ(task.request.URL.absoluteString, url);
+        WKFrameInfo *info = ((id<WKURLSchemeTaskPrivate>)task)._frame;
+        EXPECT_EQ(info.isMainFrame, mainFrame);
+        EXPECT_WK_STREQ(info.request.URL.absoluteString, request);
+        EXPECT_WK_STREQ(info.securityOrigin.protocol, originProtocol);
+        EXPECT_WK_STREQ(info.securityOrigin.host, originHost);
+        EXPECT_EQ(info.securityOrigin.port, originPort);
+        EXPECT_EQ(info.webView, _webView.get().get());
+    };
+
+    auto respond = [] (id<WKURLSchemeTask> task, const char* bytes) {
+        [task didReceiveResponse:[[[NSURLResponse alloc] initWithURL:task.request.URL MIMEType:@"text/html" expectedContentLength:strlen(bytes) textEncodingName:nil] autorelease]];
+        [task didReceiveData:[NSData dataWithBytes:bytes length:strlen(bytes)]];
+        [task didFinish];
+    };
+
+    switch (++_requestCount) {
+    case 1:
+        check(task, "frame://host1/main", true, "", "", "", 0);
+        respond(task, "<iframe src=''></iframe>");
+        return;
+    case 2:
+        check(task, "frame://host2:123/iframe", false, "", "frame", "host1", 0);
+        respond(task, "<script>fetch('subresource')</script>");
+        return;
+    case 3:
+        check(task, "frame://host2:123/subresource", false, "frame://host2:123/iframe", "frame", "host2", 123);
+        respond(task, "done!");
+        return;
+    }
+    ASSERT_NOT_REACHED();
+}
+
+- (void)webView:(WKWebView *)webView stopURLSchemeTask:(id <WKURLSchemeTask>)task
+{
+    ASSERT_NOT_REACHED();
+}
+
+@end
+
+TEST(URLSchemeHandler, Frame)
+{
+    auto configuration = adoptNS([WKWebViewConfiguration new]);
+    auto handler = adoptNS([FrameSchemeHandler new]);
+    [configuration setURLSchemeHandler:handler.get() forURLScheme:@"frame"];
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    [handler setExpectedWebView:webView.get()];
+    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"frame://host1/main"]]];
+    [handler waitForAllRequests];
+}
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to