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];
+}