Changeset 218750 in webkit
- Timestamp:
- Jun 23, 2017, 10:25:43 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r218748 r218750 1 2017-06-23 Alex Christensen <achristensen@webkit.org> 2 3 Add SPI to WKURLSchemeTask for redirection 4 https://bugs.webkit.org/show_bug.cgi?id=173730 5 6 Reviewed by Brady Eidson. 7 8 * platform/network/CacheValidation.cpp: 9 (WebCore::computeFreshnessLifetimeForHTTPFamily): 10 Asserting that redirects are always http/https URLs is no longer valid. 11 If there's a custom scheme redirect, give it no freshness lifetime in the cache. 12 1 13 2017-06-23 Konstantin Tokarev <annulen@yandex.ru> 2 14 -
trunk/Source/WebCore/platform/network/CacheValidation.cpp
r217860 r218750 119 119 using namespace std::chrono; 120 120 121 ASSERT(response.url().protocolIsInHTTPFamily()); 121 if (!response.url().protocolIsInHTTPFamily()) 122 return 0us; 122 123 123 124 // Freshness Lifetime: -
trunk/Source/WebKit2/ChangeLog
r218749 r218750 1 2017-06-23 Alex Christensen <achristensen@webkit.org> 2 3 Add SPI to WKURLSchemeTask for redirection 4 https://bugs.webkit.org/show_bug.cgi?id=173730 5 6 Reviewed by Brady Eidson. 7 8 This is needed for testing an upcoming fix for redirect callbacks, and it might be 9 necessary for loading with custom schemes in general. Right now just responding with 10 an HTTP 301/302/307/308 response code doesn't work because there is nothing that 11 synthesizes an NSURLRequest from the Location header like we do in 12 SynchronousResourceHandleCFURLConnectionDelegate::willSendRequest et al. for HSTS, 13 and that would require using an NSHTTPURLResponse for non-HTTP responses, which is 14 conceptually wrong. Instead of waiting for a completion handler in the API, we are 15 following the pattern of WKNavigationDelegate.didReceiveServerRedirectForProvisionalNavigation 16 and allowing the SPI to indicate that a redirect has happened to update the state of 17 WebKit, but not allowing the SPI to wait for a processed request and slow down loading. 18 19 This adds WKURLSchemeTaskPrivate._didPerformRedirection which is covered by new API tests. 20 21 * UIProcess/API/Cocoa/WKURLSchemeTask.mm: 22 (raiseExceptionIfNecessary): 23 (-[WKURLSchemeTaskImpl _didPerformRedirection:newRequest:completionHandler:]): 24 * UIProcess/API/Cocoa/WKURLSchemeTaskInternal.h: 25 * UIProcess/API/Cocoa/WKURLSchemeTaskPrivate.h: Added. 26 * UIProcess/WebPageProxy.cpp: 27 (WebKit::WebPageProxy::startURLSchemeTask): 28 (WebKit::WebPageProxy::stopURLSchemeTask): 29 * UIProcess/WebPageProxy.h: 30 * UIProcess/WebPageProxy.messages.in: 31 * UIProcess/WebURLSchemeHandler.cpp: 32 (WebKit::WebURLSchemeHandler::startTask): 33 (WebKit::WebURLSchemeHandler::stopTask): 34 * UIProcess/WebURLSchemeHandler.h: 35 * UIProcess/WebURLSchemeTask.cpp: 36 (WebKit::WebURLSchemeTask::didReceiveResponse): Deleted. 37 (WebKit::WebURLSchemeTask::didReceiveData): Deleted. 38 (WebKit::WebURLSchemeTask::didComplete): Deleted. 39 * UIProcess/WebURLSchemeTask.h: 40 * WebKit2.xcodeproj/project.pbxproj: 41 * WebProcess/WebPage/WebPage.cpp: 42 (WebKit::WebPage::urlSchemeTaskDidPerformRedirection): 43 * WebProcess/WebPage/WebPage.h: 44 * WebProcess/WebPage/WebPage.messages.in: 45 * WebProcess/WebPage/WebURLSchemeHandlerProxy.cpp: 46 (WebKit::WebURLSchemeHandlerProxy::taskDidPerformRedirection): 47 * WebProcess/WebPage/WebURLSchemeHandlerProxy.h: 48 * WebProcess/WebPage/WebURLSchemeTaskProxy.cpp: 49 (WebKit::WebURLSchemeTaskProxy::didPerformRedirection): 50 * WebProcess/WebPage/WebURLSchemeTaskProxy.h: 51 1 52 2017-06-23 Brent Fulgham <bfulgham@apple.com> 2 53 -
trunk/Source/WebKit2/UIProcess/API/Cocoa/WKURLSchemeTask.mm
r216037 r218750 29 29 #if WK_API_ENABLED 30 30 31 #include "WebURLSchemeTask.h" 32 #include <WebCore/ResourceError.h> 33 #include <WebCore/ResourceResponse.h> 34 #include <WebCore/SharedBuffer.h> 31 #import "WebURLSchemeTask.h" 32 #import <WebCore/ResourceError.h> 33 #import <WebCore/ResourceResponse.h> 34 #import <WebCore/SharedBuffer.h> 35 #import <wtf/BlockPtr.h> 35 36 36 37 using namespace WebCore; … … 52 53 case WebKit::WebURLSchemeTask::ExceptionType::NoResponseSent: 53 54 [NSException raise:NSInternalInconsistencyException format:@"No response has been sent for this task"]; 55 break; 56 case WebKit::WebURLSchemeTask::ExceptionType::RedirectAfterResponse: 57 [NSException raise:NSInternalInconsistencyException format:@"No redirects are allowed after the response"]; 54 58 break; 55 59 } … … 87 91 } 88 92 93 - (void)_didPerformRedirection:(NSURLResponse *)response newRequest:(NSURLRequest *)request 94 { 95 auto result = _urlSchemeTask->task().didPerformRedirection(response, request); 96 raiseExceptionIfNecessary(result); 97 } 98 89 99 #pragma mark WKObject protocol implementation 90 100 -
trunk/Source/WebKit2/UIProcess/API/Cocoa/WKURLSchemeTaskInternal.h
r216037 r218750 24 24 */ 25 25 26 #import "WKURLSchemeTask .h"26 #import "WKURLSchemeTaskPrivate.h" 27 27 28 28 #if WK_API_ENABLED … … 31 31 #import "WKObject.h" 32 32 33 @interface WKURLSchemeTaskImpl : NSObject <WKURLSchemeTask >33 @interface WKURLSchemeTaskImpl : NSObject <WKURLSchemeTaskPrivate> 34 34 @end 35 35 -
trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp
r218632 r218750 6880 6880 } 6881 6881 6882 void WebPageProxy::startURLSchemeTask(uint64_t handlerIdentifier, uint64_t resourceIdentifier, const WebCore::ResourceRequest& request)6882 void WebPageProxy::startURLSchemeTask(uint64_t handlerIdentifier, uint64_t taskIdentifier, const WebCore::ResourceRequest& request) 6883 6883 { 6884 6884 auto iterator = m_urlSchemeHandlersByIdentifier.find(handlerIdentifier); 6885 6885 ASSERT(iterator != m_urlSchemeHandlersByIdentifier.end()); 6886 6886 6887 iterator->value->startTask(*this, resourceIdentifier, request);6888 } 6889 6890 void WebPageProxy::stopURLSchemeTask(uint64_t handlerIdentifier, uint64_t resourceIdentifier)6887 iterator->value->startTask(*this, taskIdentifier, request); 6888 } 6889 6890 void WebPageProxy::stopURLSchemeTask(uint64_t handlerIdentifier, uint64_t taskIdentifier) 6891 6891 { 6892 6892 auto iterator = m_urlSchemeHandlersByIdentifier.find(handlerIdentifier); 6893 6893 ASSERT(iterator != m_urlSchemeHandlersByIdentifier.end()); 6894 6894 6895 iterator->value->stopTask(*this, resourceIdentifier);6895 iterator->value->stopTask(*this, taskIdentifier); 6896 6896 } 6897 6897 -
trunk/Source/WebKit2/UIProcess/WebPageProxy.h
r218740 r218750 1608 1608 #endif 1609 1609 1610 void startURLSchemeTask(uint64_t handlerIdentifier, uint64_t resourceIdentifier, const WebCore::ResourceRequest&);1611 void stopURLSchemeTask(uint64_t handlerIdentifier, uint64_t resourceIdentifier);1610 void startURLSchemeTask(uint64_t handlerIdentifier, uint64_t taskIdentifier, const WebCore::ResourceRequest&); 1611 void stopURLSchemeTask(uint64_t handlerIdentifier, uint64_t taskIdentifier); 1612 1612 1613 1613 void handleAutoFillButtonClick(const UserData&); -
trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in
r218295 r218750 496 496 SetIsUsingHighPerformanceWebGL(bool isUsingHighPerformanceWebGL) 497 497 498 StartURLSchemeTask(uint64_t loaderIdentifier, uint64_t resourceIdentifier, WebCore::ResourceRequest request)499 StopURLSchemeTask(uint64_t loaderIdentifier, uint64_t resourceIdentifier)498 StartURLSchemeTask(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceRequest request) 499 StopURLSchemeTask(uint64_t handlerIdentifier, uint64_t taskIdentifier) 500 500 } -
trunk/Source/WebKit2/UIProcess/WebURLSchemeHandler.cpp
r216037 r218750 49 49 } 50 50 51 void WebURLSchemeHandler::startTask(WebPageProxy& page, uint64_t resourceIdentifier, const ResourceRequest& request)51 void WebURLSchemeHandler::startTask(WebPageProxy& page, uint64_t taskIdentifier, const ResourceRequest& request) 52 52 { 53 auto result = m_tasks.add( resourceIdentifier, WebURLSchemeTask::create(*this, page, resourceIdentifier, request));53 auto result = m_tasks.add(taskIdentifier, WebURLSchemeTask::create(*this, page, taskIdentifier, request)); 54 54 ASSERT(result.isNewEntry); 55 55 … … 57 57 } 58 58 59 void WebURLSchemeHandler::stopTask(WebPageProxy& page, uint64_t resourceIdentifier)59 void WebURLSchemeHandler::stopTask(WebPageProxy& page, uint64_t taskIdentifier) 60 60 { 61 auto iterator = m_tasks.find( resourceIdentifier);61 auto iterator = m_tasks.find(taskIdentifier); 62 62 if (iterator == m_tasks.end()) 63 63 return; -
trunk/Source/WebKit2/UIProcess/WebURLSchemeHandler.h
r216037 r218750 46 46 uint64_t identifier() const { return m_identifier; } 47 47 48 void startTask(WebPageProxy&, uint64_t resourceIdentifier, const WebCore::ResourceRequest&);49 void stopTask(WebPageProxy&, uint64_t resourceIdentifier);48 void startTask(WebPageProxy&, uint64_t taskIdentifier, const WebCore::ResourceRequest&); 49 void stopTask(WebPageProxy&, uint64_t taskIdentifier); 50 50 51 51 protected: -
trunk/Source/WebKit2/UIProcess/WebURLSchemeTask.cpp
r216037 r218750 49 49 } 50 50 51 WebURLSchemeTask::ExceptionType WebURLSchemeTask::didReceiveResponse(const ResourceResponse& response) 51 auto WebURLSchemeTask::didPerformRedirection(WebCore::ResourceResponse&& response, WebCore::ResourceRequest&& request) -> ExceptionType 52 52 { 53 53 if (m_stopped) 54 return WebURLSchemeTask::ExceptionType::TaskAlreadyStopped; 54 return ExceptionType::TaskAlreadyStopped; 55 56 if (m_completed) 57 return ExceptionType::CompleteAlreadyCalled; 58 59 if (m_dataSent) 60 return ExceptionType::DataAlreadySent; 61 62 if (m_responseSent) 63 return ExceptionType::RedirectAfterResponse; 64 65 m_request = request; 66 m_page->send(Messages::WebPage::URLSchemeTaskDidPerformRedirection(m_urlSchemeHandler->identifier(), m_identifier, response, request)); 67 68 return ExceptionType::None; 69 } 70 71 auto WebURLSchemeTask::didReceiveResponse(const ResourceResponse& response) -> ExceptionType 72 { 73 if (m_stopped) 74 return ExceptionType::TaskAlreadyStopped; 55 75 56 76 if (m_completed) 57 return WebURLSchemeTask::ExceptionType::CompleteAlreadyCalled;77 return ExceptionType::CompleteAlreadyCalled; 58 78 59 79 if (m_dataSent) 60 return WebURLSchemeTask::ExceptionType::DataAlreadySent;80 return ExceptionType::DataAlreadySent; 61 81 62 82 m_responseSent = true; … … 64 84 response.includeCertificateInfo(); 65 85 m_page->send(Messages::WebPage::URLSchemeTaskDidReceiveResponse(m_urlSchemeHandler->identifier(), m_identifier, response)); 66 return WebURLSchemeTask::ExceptionType::None;86 return ExceptionType::None; 67 87 } 68 88 69 WebURLSchemeTask::ExceptionType WebURLSchemeTask::didReceiveData(Ref<SharedBuffer> buffer) 89 auto WebURLSchemeTask::didReceiveData(Ref<SharedBuffer> buffer) -> ExceptionType 70 90 { 71 91 if (m_stopped) 72 return WebURLSchemeTask::ExceptionType::TaskAlreadyStopped;92 return ExceptionType::TaskAlreadyStopped; 73 93 74 94 if (m_completed) 75 return WebURLSchemeTask::ExceptionType::CompleteAlreadyCalled;95 return ExceptionType::CompleteAlreadyCalled; 76 96 77 97 if (!m_responseSent) 78 return WebURLSchemeTask::ExceptionType::NoResponseSent;98 return ExceptionType::NoResponseSent; 79 99 80 100 m_dataSent = true; 81 101 m_page->send(Messages::WebPage::URLSchemeTaskDidReceiveData(m_urlSchemeHandler->identifier(), m_identifier, IPC::SharedBufferDataReference(buffer.ptr()))); 82 return WebURLSchemeTask::ExceptionType::None;102 return ExceptionType::None; 83 103 } 84 104 85 WebURLSchemeTask::ExceptionType WebURLSchemeTask::didComplete(const ResourceError& error) 105 auto WebURLSchemeTask::didComplete(const ResourceError& error) -> ExceptionType 86 106 { 87 107 if (m_stopped) 88 return WebURLSchemeTask::ExceptionType::TaskAlreadyStopped;108 return ExceptionType::TaskAlreadyStopped; 89 109 90 110 if (m_completed) 91 return WebURLSchemeTask::ExceptionType::CompleteAlreadyCalled;111 return ExceptionType::CompleteAlreadyCalled; 92 112 93 113 if (!m_responseSent && error.isNull()) 94 return WebURLSchemeTask::ExceptionType::NoResponseSent;114 return ExceptionType::NoResponseSent; 95 115 96 116 m_completed = true; 97 117 m_page->send(Messages::WebPage::URLSchemeTaskDidComplete(m_urlSchemeHandler->identifier(), m_identifier, error)); 98 return WebURLSchemeTask::ExceptionType::None;118 return ExceptionType::None; 99 119 } 100 120 -
trunk/Source/WebKit2/UIProcess/WebURLSchemeTask.h
r216037 r218750 53 53 DataAlreadySent, 54 54 CompleteAlreadyCalled, 55 RedirectAfterResponse, 55 56 TaskAlreadyStopped, 56 57 NoResponseSent, 57 58 None, 58 59 }; 60 ExceptionType didPerformRedirection(WebCore::ResourceResponse&&, WebCore::ResourceRequest&&); 59 61 ExceptionType didReceiveResponse(const WebCore::ResourceResponse&); 60 62 ExceptionType didReceiveData(Ref<WebCore::SharedBuffer>); -
trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj
r218321 r218750 1161 1161 5C20CBA01BB1ECD800895BB1 /* NetworkSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C20CB9E1BB0DD1800895BB1 /* NetworkSession.h */; }; 1162 1162 5C298DA01C3DF02100470AFE /* PendingDownload.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C298D9E1C3DEF2900470AFE /* PendingDownload.h */; }; 1163 5C62FDF91EFC271C00CE072E /* WKURLSchemeTaskPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C62FDF81EFC263C00CE072E /* WKURLSchemeTaskPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1163 1164 5C7706741D1138380012700F /* WebSocketProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C7706731D111D8B0012700F /* WebSocketProvider.cpp */; }; 1164 1165 5C85C7881C3F23CE0061A4FA /* PendingDownload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C85C7861C3F23C50061A4FA /* PendingDownload.cpp */; }; … … 3444 3445 5C20CB9E1BB0DD1800895BB1 /* NetworkSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkSession.h; path = NetworkProcess/NetworkSession.h; sourceTree = "<group>"; }; 3445 3446 5C298D9E1C3DEF2900470AFE /* PendingDownload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PendingDownload.h; path = NetworkProcess/Downloads/PendingDownload.h; sourceTree = "<group>"; }; 3447 5C62FDF81EFC263C00CE072E /* WKURLSchemeTaskPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKURLSchemeTaskPrivate.h; sourceTree = "<group>"; }; 3446 3448 5C7706731D111D8B0012700F /* WebSocketProvider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebSocketProvider.cpp; path = Network/WebSocketProvider.cpp; sourceTree = "<group>"; }; 3447 3449 5C7C88DC1D0F41A0009D2F6D /* WebSocketProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebSocketProvider.h; path = Network/WebSocketProvider.h; sourceTree = "<group>"; }; … … 5719 5721 51D124301E6DDDD7002B2820 /* WKURLSchemeTask.mm */, 5720 5722 51D124371E6DFD2A002B2820 /* WKURLSchemeTaskInternal.h */, 5723 5C62FDF81EFC263C00CE072E /* WKURLSchemeTaskPrivate.h */, 5721 5724 1AFA3AC718E61C61003CCBAE /* WKUserContentController.h */, 5722 5725 1AFA3AC618E61C61003CCBAE /* WKUserContentController.mm */, … … 8945 8948 C54256B518BEC18C00DE4179 /* WKFormInputControl.h in Headers */, 8946 8949 C54256B718BEC18C00DE4179 /* WKFormPeripheral.h in Headers */, 8950 5C62FDF91EFC271C00CE072E /* WKURLSchemeTaskPrivate.h in Headers */, 8947 8951 C54256B818BEC18C00DE4179 /* WKFormPopover.h in Headers */, 8948 8952 C54256BA18BEC18C00DE4179 /* WKFormSelectControl.h in Headers */, -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp
r218713 r218750 5906 5906 void WebPage::registerURLSchemeHandler(uint64_t handlerIdentifier, const String& scheme) 5907 5907 { 5908 auto schemeResult = m_schemeToURLSchemeHandlerProxyMap.add(scheme, std::make_unique<WebURLSchemeHandlerProxy>(*this, handlerIdentifier));5908 auto schemeResult = m_schemeToURLSchemeHandlerProxyMap.add(scheme, WebURLSchemeHandlerProxy::create(*this, handlerIdentifier)); 5909 5909 ASSERT(schemeResult.isNewEntry); 5910 5910 … … 5913 5913 } 5914 5914 5915 void WebPage::urlSchemeTaskDid ReceiveResponse(uint64_t handlerIdentifier, uint64_t taskIdentifier, const ResourceResponse& response)5915 void WebPage::urlSchemeTaskDidPerformRedirection(uint64_t handlerIdentifier, uint64_t taskIdentifier, ResourceResponse&& response, ResourceRequest&& request) 5916 5916 { 5917 5917 auto* handler = m_identifierToURLSchemeHandlerProxyMap.get(handlerIdentifier); 5918 5918 ASSERT(handler); 5919 5920 handler->taskDid ReceiveResponse(taskIdentifier, response);5921 } 5922 5923 void WebPage::urlSchemeTaskDidReceive Data(uint64_t handlerIdentifier, uint64_t taskIdentifier, const IPC::DataReference& data)5919 5920 handler->taskDidPerformRedirection(taskIdentifier, WTFMove(response), WTFMove(request)); 5921 } 5922 5923 void WebPage::urlSchemeTaskDidReceiveResponse(uint64_t handlerIdentifier, uint64_t taskIdentifier, const ResourceResponse& response) 5924 5924 { 5925 5925 auto* handler = m_identifierToURLSchemeHandlerProxyMap.get(handlerIdentifier); 5926 5926 ASSERT(handler); 5927 5927 5928 handler->taskDidReceive Data(taskIdentifier, data.size(), data.data());5929 } 5930 5931 void WebPage::urlSchemeTaskDid Complete(uint64_t handlerIdentifier, uint64_t taskIdentifier, const ResourceError& error)5928 handler->taskDidReceiveResponse(taskIdentifier, response); 5929 } 5930 5931 void WebPage::urlSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, const IPC::DataReference& data) 5932 5932 { 5933 5933 auto* handler = m_identifierToURLSchemeHandlerProxyMap.get(handlerIdentifier); 5934 5934 ASSERT(handler); 5935 5935 5936 handler->taskDidReceiveData(taskIdentifier, data.size(), data.data()); 5937 } 5938 5939 void WebPage::urlSchemeTaskDidComplete(uint64_t handlerIdentifier, uint64_t taskIdentifier, const ResourceError& error) 5940 { 5941 auto* handler = m_identifierToURLSchemeHandlerProxyMap.get(handlerIdentifier); 5942 ASSERT(handler); 5943 5936 5944 handler->taskDidComplete(taskIdentifier, error); 5937 5945 } -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h
r218457 r218750 1277 1277 void registerURLSchemeHandler(uint64_t identifier, const String& scheme); 1278 1278 1279 void urlSchemeTaskDidPerformRedirection(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceResponse&&, WebCore::ResourceRequest&&); 1279 1280 void urlSchemeTaskDidReceiveResponse(uint64_t handlerIdentifier, uint64_t taskIdentifier, const WebCore::ResourceResponse&); 1280 1281 void urlSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, const IPC::DataReference&); … … 1569 1570 const std::optional<double> m_cpuLimit; 1570 1571 1571 HashMap<String, std::unique_ptr<WebURLSchemeHandlerProxy>> m_schemeToURLSchemeHandlerProxyMap;1572 HashMap<String, RefPtr<WebURLSchemeHandlerProxy>> m_schemeToURLSchemeHandlerProxyMap; 1572 1573 HashMap<uint64_t, WebURLSchemeHandlerProxy*> m_identifierToURLSchemeHandlerProxyMap; 1573 1574 }; -
trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in
r217725 r218750 476 476 RegisterURLSchemeHandler(uint64_t identifier, String scheme) 477 477 478 URLSchemeTaskDidReceiveResponse(uint64_t providerIdentifier, uint64_t taskIdentifier, WebCore::ResourceResponse response) 479 URLSchemeTaskDidReceiveData(uint64_t providerIdentifier, uint64_t taskIdentifier, IPC::DataReference data) 480 URLSchemeTaskDidComplete(uint64_t providerIdentifier, uint64_t taskIdentifier, WebCore::ResourceError error) 478 URLSchemeTaskDidPerformRedirection(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceResponse response, WebCore::ResourceRequest request) 479 URLSchemeTaskDidReceiveResponse(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceResponse response) 480 URLSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, IPC::DataReference data) 481 URLSchemeTaskDidComplete(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceError error) 481 482 } -
trunk/Source/WebKit2/WebProcess/WebPage/WebURLSchemeHandlerProxy.cpp
r216037 r218750 49 49 void WebURLSchemeHandlerProxy::startNewTask(ResourceLoader& loader) 50 50 { 51 auto result = m_tasks.add(loader.identifier(), std::make_unique<WebURLSchemeTaskProxy>(*this, loader));51 auto result = m_tasks.add(loader.identifier(), WebURLSchemeTaskProxy::create(*this, loader)); 52 52 ASSERT(result.isNewEntry); 53 53 … … 56 56 } 57 57 58 void WebURLSchemeHandlerProxy::taskDidPerformRedirection(uint64_t taskIdentifier, WebCore::ResourceResponse&& redirectResponse, WebCore::ResourceRequest&& newRequest) 59 { 60 auto* task = m_tasks.get(taskIdentifier); 61 if (!task) 62 return; 63 64 task->didPerformRedirection(WTFMove(redirectResponse), WTFMove(newRequest)); 65 } 58 66 59 67 void WebURLSchemeHandlerProxy::taskDidReceiveResponse(uint64_t taskIdentifier, const ResourceResponse& response) -
trunk/Source/WebKit2/WebProcess/WebPage/WebURLSchemeHandlerProxy.h
r216037 r218750 28 28 #include "WebURLSchemeTaskProxy.h" 29 29 #include <wtf/HashMap.h> 30 #include <wtf/RefCounted.h> 30 31 31 32 namespace WebCore { … … 33 34 class ResourceLoader; 34 35 class ResourceResponse; 36 class ResourceRequest; 35 37 } 36 38 … … 39 41 class WebPage; 40 42 41 class WebURLSchemeHandlerProxy { 42 WTF_MAKE_NONCOPYABLE(WebURLSchemeHandlerProxy); 43 class WebURLSchemeHandlerProxy : public RefCounted<WebURLSchemeHandlerProxy> { 43 44 public: 44 WebURLSchemeHandlerProxy(WebPage&, uint64_t identifier); 45 static Ref<WebURLSchemeHandlerProxy> create(WebPage& page, uint64_t identifier) 46 { 47 return adoptRef(*new WebURLSchemeHandlerProxy(page, identifier)); 48 } 45 49 ~WebURLSchemeHandlerProxy(); 46 50 … … 50 54 WebPage& page() { return m_webPage; } 51 55 56 void taskDidPerformRedirection(uint64_t taskIdentifier, WebCore::ResourceResponse&&, WebCore::ResourceRequest&&); 52 57 void taskDidReceiveResponse(uint64_t taskIdentifier, const WebCore::ResourceResponse&); 53 58 void taskDidReceiveData(uint64_t taskIdentifier, size_t, const uint8_t* data); … … 56 61 57 62 private: 63 WebURLSchemeHandlerProxy(WebPage&, uint64_t identifier); 58 64 WebPage& m_webPage; 59 65 uint64_t m_identifier { 0 }; 60 66 61 HashMap<u nsigned long, std::unique_ptr<WebURLSchemeTaskProxy>> m_tasks;67 HashMap<uint64_t, RefPtr<WebURLSchemeTaskProxy>> m_tasks; 62 68 }; // class WebURLSchemeHandlerProxy 63 69 -
trunk/Source/WebKit2/WebProcess/WebPage/WebURLSchemeTaskProxy.cpp
r217041 r218750 63 63 m_urlSchemeHandler.taskDidStopLoading(*this); 64 64 } 65 66 void WebURLSchemeTaskProxy::didPerformRedirection(WebCore::ResourceResponse&& redirectResponse, WebCore::ResourceRequest&& request) 67 { 68 if (!hasLoader()) 69 return; 70 71 auto completionHandler = [this, protectedThis = makeRef(*this), originalRequest = request] (ResourceRequest&& request) { 72 m_waitingForRedirectCompletionHandler = false; 73 // We do not inform the UIProcess of WebKit's new request with the given suggested request. 74 // We do want to know if WebKit would have generated a request that differs from the suggested request, though. 75 if (request.url() != originalRequest.url()) 76 WTFLogAlways("Redirected scheme task would have been sent to a different URL."); 77 }; 78 79 if (m_waitingForRedirectCompletionHandler) 80 WTFLogAlways("Received redirect during previous redirect processing."); 81 m_waitingForRedirectCompletionHandler = true; 82 83 m_coreLoader->willSendRequest(WTFMove(request), redirectResponse, WTFMove(completionHandler)); 84 } 65 85 66 86 void WebURLSchemeTaskProxy::didReceiveResponse(const ResourceResponse& response) 67 87 { 88 if (m_waitingForRedirectCompletionHandler) 89 WTFLogAlways("Received response during redirect processing."); 90 68 91 if (!hasLoader()) 69 92 return; -
trunk/Source/WebKit2/WebProcess/WebPage/WebURLSchemeTaskProxy.h
r216037 r218750 27 27 28 28 #include <WebCore/ResourceRequest.h> 29 #include <wtf/RefCounted.h> 29 30 30 31 namespace WebCore { … … 38 39 class WebURLSchemeHandlerProxy; 39 40 40 class WebURLSchemeTaskProxy { 41 WTF_MAKE_NONCOPYABLE(WebURLSchemeTaskProxy); 41 class WebURLSchemeTaskProxy : public RefCounted<WebURLSchemeTaskProxy> { 42 42 public: 43 WebURLSchemeTaskProxy(WebURLSchemeHandlerProxy&, WebCore::ResourceLoader&); 44 43 static Ref<WebURLSchemeTaskProxy> create(WebURLSchemeHandlerProxy& handler, WebCore::ResourceLoader& loader) 44 { 45 return adoptRef(*new WebURLSchemeTaskProxy(handler, loader)); 46 } 47 45 48 const WebCore::ResourceRequest& request() const { return m_request; } 46 49 … … 48 51 void stopLoading(); 49 52 53 void didPerformRedirection(WebCore::ResourceResponse&&, WebCore::ResourceRequest&&); 50 54 void didReceiveResponse(const WebCore::ResourceResponse&); 51 55 void didReceiveData(size_t, const uint8_t* data); … … 55 59 56 60 private: 61 WebURLSchemeTaskProxy(WebURLSchemeHandlerProxy&, WebCore::ResourceLoader&); 57 62 bool hasLoader(); 58 63 … … 61 66 WebCore::ResourceRequest m_request; 62 67 unsigned long m_identifier; 68 bool m_waitingForRedirectCompletionHandler { }; 63 69 }; 64 70 -
trunk/Tools/ChangeLog
r218743 r218750 1 2017-06-23 Alex Christensen <achristensen@webkit.org> 2 3 Add SPI to WKURLSchemeTask for redirection 4 https://bugs.webkit.org/show_bug.cgi?id=173730 5 6 Reviewed by Brady Eidson. 7 8 * TestWebKitAPI/Tests/WebKit2Cocoa/WKURLSchemeHandler-1.mm: 9 (-[SchemeHandler webView:startURLSchemeTask:]): 10 (-[SchemeHandler webView:stopURLSchemeTask:]): 11 (TEST): 12 (-[RedirectSchemeHandler webView:startURLSchemeTask:]): 13 (-[RedirectSchemeHandler webView:stopURLSchemeTask:]): 14 (-[RedirectSchemeHandler webView:didReceiveServerRedirectForProvisionalNavigation:]): 15 (-[RedirectSchemeHandler webView:decidePolicyForNavigationResponse:decisionHandler:]): 16 (-[RedirectSchemeHandler userContentController:didReceiveScriptMessage:]): 17 1 18 2017-06-23 Carlos Garcia Campos <cgarcia@igalia.com> 2 19 -
trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WKURLSchemeHandler-1.mm
r218694 r218750 29 29 #import "Test.h" 30 30 #import <WebKit/WKURLSchemeHandler.h> 31 #import <WebKit/WKURLSchemeTask .h>31 #import <WebKit/WKURLSchemeTaskPrivate.h> 32 32 #import <WebKit/WKWebViewConfigurationPrivate.h> 33 33 #import <WebKit/WebKit.h> 34 34 #import <wtf/RetainPtr.h> 35 #import <wtf/Vector.h> 35 36 36 37 #if WK_API_ENABLED 37 38 38 static bool receivedScriptMessage;39 static bool done; 39 40 40 41 @interface SchemeHandler : NSObject <WKURLSchemeHandler> … … 77 78 if ([task.request.URL.absoluteString isEqualToString:@"testing:image"]) { 78 79 [task didFailWithError:[NSError errorWithDomain:@"TestWebKitAPI" code:1 userInfo:nil]]; 79 receivedScriptMessage = true;80 done = true; 80 81 return; 81 82 } … … 91 92 [_stoppedURLs addObject:task.request.URL]; 92 93 93 receivedScriptMessage = true;94 done = true; 94 95 } 95 96 … … 103 104 TEST(URLSchemeHandler, Basic) 104 105 { 105 receivedScriptMessage = false;106 done = false; 106 107 107 108 RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]); … … 115 116 [webView loadRequest:request]; 116 117 117 TestWebKitAPI::Util::run(& receivedScriptMessage);118 TestWebKitAPI::Util::run(&done); 118 119 119 120 EXPECT_EQ([handler.get().startedURLs count], 2u); … … 128 129 // This test makes sure that is communicated back to the URLSchemeHandler. 129 130 130 receivedScriptMessage = false;131 done = false; 131 132 132 133 RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]); … … 140 141 [webView loadRequest:request]; 141 142 142 TestWebKitAPI::Util::run(& receivedScriptMessage);143 TestWebKitAPI::Util::run(&done); 143 144 144 145 EXPECT_EQ([handler.get().startedURLs count], 1u); … … 192 193 } 193 194 195 static bool receivedRedirect; 196 static bool responsePolicyDecided; 197 198 @interface RedirectSchemeHandler : NSObject <WKURLSchemeHandler, WKNavigationDelegate, WKScriptMessageHandler> 199 @end 200 201 @implementation RedirectSchemeHandler { } 202 203 - (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)task 204 { 205 ASSERT_STREQ(task.request.URL.absoluteString.UTF8String, "testing:///initial"); 206 NSURLResponse *response = [[[NSURLResponse alloc] initWithURL:task.request.URL MIMEType:nil expectedContentLength:0 textEncodingName:nil] autorelease]; 207 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"testing:///redirected"]]; 208 [(id<WKURLSchemeTaskPrivate>)task _didPerformRedirection:response newRequest:request]; 209 ASSERT_FALSE(receivedRedirect); 210 ASSERT_STREQ(task.request.URL.absoluteString.UTF8String, "testing:///redirected"); 211 NSString *html = @"<script>window.webkit.messageHandlers.testHandler.postMessage('Document URL: ' + document.URL);</script>"; 212 [task didReceiveResponse:[[NSURLResponse alloc] initWithURL:task.request.URL MIMEType:@"text/html" expectedContentLength:html.length textEncodingName:nil]]; 213 [task didReceiveData:[html dataUsingEncoding:NSUTF8StringEncoding]]; 214 [task didFinish]; 215 } 216 217 - (void)webView:(WKWebView *)webView stopURLSchemeTask:(id <WKURLSchemeTask>)task 218 { 219 ASSERT_TRUE(false); 220 } 221 222 - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation 223 { 224 ASSERT_FALSE(receivedRedirect); 225 receivedRedirect = true; 226 } 227 228 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler 229 { 230 ASSERT_TRUE(receivedRedirect); 231 ASSERT_STREQ(navigationResponse.response.URL.absoluteString.UTF8String, "testing:///redirected"); 232 ASSERT_FALSE(responsePolicyDecided); 233 responsePolicyDecided = true; 234 decisionHandler(WKNavigationResponsePolicyAllow); 235 } 236 237 - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message 238 { 239 EXPECT_WK_STREQ(@"Document URL: testing:///redirected", [message body]); 240 done = true; 241 } 242 @end 243 244 TEST(URLSchemeHandler, Redirection) 245 { 246 auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]); 247 auto handler = adoptNS([[RedirectSchemeHandler alloc] init]); 248 [configuration setURLSchemeHandler:handler.get() forURLScheme:@"testing"]; 249 [[configuration userContentController] addScriptMessageHandler:handler.get() name:@"testHandler"]; 250 auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]); 251 [webView setNavigationDelegate:handler.get()]; 252 253 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"testing:///initial"]]; 254 [webView loadRequest:request]; 255 256 TestWebKitAPI::Util::run(&done); 257 258 EXPECT_TRUE(responsePolicyDecided); 259 EXPECT_STREQ(webView.get().URL.absoluteString.UTF8String, "testing:///redirected"); 260 } 261 262 enum class Command { 263 Redirect, 264 Response, 265 Data, 266 Finish, 267 Error, 268 }; 269 270 @interface TaskSchemeHandler : NSObject <WKURLSchemeHandler> 271 - (instancetype)initWithCommands:(Vector<Command>&&)commandVector expectedException:(bool)expected; 272 @end 273 274 @implementation TaskSchemeHandler { 275 Vector<Command> commands; 276 bool expectedException; 277 } 278 279 - (instancetype)initWithCommands:(Vector<Command>&&)commandVector expectedException:(bool)expected 280 { 281 self = [super init]; 282 if (!self) 283 return nil; 284 285 self->commands = WTFMove(commandVector); 286 self->expectedException = expected; 287 288 return self; 289 } 290 291 - (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)task 292 { 293 bool caughtException = false; 294 @try { 295 for (auto command : commands) { 296 switch (command) { 297 case Command::Redirect: 298 [(id<WKURLSchemeTaskPrivate>)task _didPerformRedirection:[[[NSURLResponse alloc] init] autorelease] newRequest:[[[NSURLRequest alloc] init] autorelease]]; 299 break; 300 case Command::Response: 301 [task didReceiveResponse:[[[NSURLResponse alloc] init] autorelease]]; 302 break; 303 case Command::Data: 304 [task didReceiveData:[[[NSData alloc] init] autorelease]]; 305 break; 306 case Command::Finish: 307 [task didFinish]; 308 break; 309 case Command::Error: 310 [task didFailWithError:[[[NSError alloc] init] autorelease]]; 311 break; 312 } 313 } 314 } 315 @catch(NSException *exception) 316 { 317 caughtException = true; 318 } 319 ASSERT_EQ(caughtException, expectedException); 320 done = true; 321 } 322 323 - (void)webView:(WKWebView *)webView stopURLSchemeTask:(id <WKURLSchemeTask>)task 324 { 325 } 326 @end 327 328 enum class ShouldRaiseException { No, Yes }; 329 330 static void checkCallSequence(Vector<Command>&& commands, ShouldRaiseException shouldRaiseException) 331 { 332 done = false; 333 auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]); 334 auto handler = adoptNS([[TaskSchemeHandler alloc] initWithCommands:WTFMove(commands) expectedException:shouldRaiseException == ShouldRaiseException::Yes]); 335 [configuration setURLSchemeHandler:handler.get() forURLScheme:@"testing"]; 336 auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]); 337 [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"testing:///initial"]]]; 338 TestWebKitAPI::Util::run(&done); 339 } 340 341 TEST(URLSchemeHandler, Exceptions) 342 { 343 checkCallSequence({Command::Response, Command::Data, Command::Finish}, ShouldRaiseException::No); 344 checkCallSequence({Command::Response, Command::Redirect}, ShouldRaiseException::Yes); 345 checkCallSequence({Command::Redirect, Command::Response}, ShouldRaiseException::No); 346 checkCallSequence({Command::Data, Command::Finish}, ShouldRaiseException::Yes); 347 checkCallSequence({Command::Error}, ShouldRaiseException::No); 348 checkCallSequence({Command::Error, Command::Error}, ShouldRaiseException::Yes); 349 checkCallSequence({Command::Error, Command::Data}, ShouldRaiseException::Yes); 350 checkCallSequence({Command::Response, Command::Finish, Command::Data}, ShouldRaiseException::Yes); 351 checkCallSequence({Command::Response, Command::Finish, Command::Redirect}, ShouldRaiseException::Yes); 352 checkCallSequence({Command::Response, Command::Finish, Command::Response}, ShouldRaiseException::Yes); 353 checkCallSequence({Command::Response, Command::Finish, Command::Finish}, ShouldRaiseException::Yes); 354 checkCallSequence({Command::Response, Command::Finish, Command::Error}, ShouldRaiseException::Yes); 355 } 194 356 195 357 #endif
Note:
See TracChangeset
for help on using the changeset viewer.