Changeset 253978 in webkit
- Timestamp:
- Jan 2, 2020, 1:14:02 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r253977 r253978 1 2020-01-02 Alex Christensen <achristensen@webkit.org> 2 3 Add SPI to disable CORS on requests to URLs matching a pattern 4 https://bugs.webkit.org/show_bug.cgi?id=205534 5 <rdar://problem/58011337> 6 7 Reviewed by Chris Dumez. 8 9 This should allow us to remove the layering violation in LegacySchemeRegistry::isUserExtensionScheme 10 and fix the bug in the radar. The SPI is exercised by a new API test. 11 12 * loader/DocumentThreadableLoader.cpp: 13 (WebCore::DocumentThreadableLoader::DocumentThreadableLoader): 14 * page/Page.cpp: 15 (WebCore::m_deviceOrientationUpdateProvider): 16 (WebCore::Page::shouldDisableCorsForRequestTo const): 17 * page/Page.h: 18 * page/PageConfiguration.h: 19 * platform/LegacySchemeRegistry.cpp: 20 (WebCore::LegacySchemeRegistry::isUserExtensionScheme): 21 1 22 2020-01-02 Zalan Bujtas <zalan@apple.com> 2 23 -
trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp
r253213 r253978 154 154 m_options.httpHeadersToKeep = httpHeadersToKeepFromCleaning(request.httpHeaderFields()); 155 155 156 if (document.isRunningUserScripts() && LegacySchemeRegistry::isUserExtensionScheme(request.url().protocol().toStringWithoutCopying())) { 156 bool shouldDisableCORS = document.isRunningUserScripts() && LegacySchemeRegistry::isUserExtensionScheme(request.url().protocol().toStringWithoutCopying()); 157 if (auto* page = document.page()) 158 shouldDisableCORS |= page->shouldDisableCorsForRequestTo(request.url()); 159 160 if (shouldDisableCORS) { 157 161 m_options.mode = FetchOptions::Mode::NoCors; 158 162 m_options.filteringPolicy = ResponseFilteringPolicy::Disable; -
trunk/Source/WebCore/page/Page.cpp
r253923 r253978 120 120 #include "TextResourceDecoder.h" 121 121 #include "UserContentProvider.h" 122 #include "UserContentURLPattern.h" 122 123 #include "UserInputBridge.h" 123 124 #include "ValidationMessageClient.h" … … 328 329 m_libWebRTCProvider->supportsVP8(RuntimeEnabledFeatures::sharedFeatures().webRTCVP8CodecEnabled()); 329 330 #endif 331 332 m_corsDisablingPatterns.reserveInitialCapacity(pageConfiguration.corsDisablingPatterns.size()); 333 for (auto&& pattern : WTFMove(pageConfiguration.corsDisablingPatterns)) { 334 UserContentURLPattern parsedPattern(WTFMove(pattern)); 335 if (parsedPattern.isValid()) 336 m_corsDisablingPatterns.uncheckedAppend(WTFMove(parsedPattern)); 337 } 338 m_corsDisablingPatterns.shrinkToFit(); 330 339 } 331 340 … … 2999 3008 #endif 3000 3009 3010 bool Page::shouldDisableCorsForRequestTo(const URL& url) const 3011 { 3012 return WTF::anyOf(m_corsDisablingPatterns, [&] (const auto& pattern) { 3013 return pattern.matches(url); 3014 }); 3015 } 3016 3001 3017 } // namespace WebCore -
trunk/Source/WebCore/page/Page.h
r253923 r253978 139 139 class StorageNamespaceProvider; 140 140 class UserContentProvider; 141 class UserContentURLPattern; 141 142 class UserInputBridge; 142 143 class ValidationMessageClient; … … 713 714 void forEachDocument(const WTF::Function<void(Document&)>&) const; 714 715 void forEachMediaElement(const WTF::Function<void(HTMLMediaElement&)>&); 716 717 bool shouldDisableCorsForRequestTo(const URL&) const; 715 718 716 719 private: … … 987 990 bool m_mediaBufferingIsSuspended { false }; 988 991 bool m_inUpdateRendering { false }; 992 Vector<UserContentURLPattern> m_corsDisablingPatterns; 989 993 }; 990 994 -
trunk/Source/WebCore/page/PageConfiguration.h
r253231 r253978 123 123 RefPtr<DeviceOrientationUpdateProvider> deviceOrientationUpdateProvider; 124 124 #endif 125 Vector<String> corsDisablingPatterns; 125 126 }; 126 127 -
trunk/Source/WebCore/platform/LegacySchemeRegistry.cpp
r251659 r253978 534 534 bool LegacySchemeRegistry::isUserExtensionScheme(const String& scheme) 535 535 { 536 // FIXME: Remove this once Safari has adopted WKWebViewConfiguration._corsDisablingPatterns 536 537 #if PLATFORM(MAC) 537 538 if (scheme == "safari-extension") -
trunk/Source/WebKit/ChangeLog
r253975 r253978 1 2020-01-02 Alex Christensen <achristensen@webkit.org> 2 3 Add SPI to disable CORS on requests to URLs matching a pattern 4 https://bugs.webkit.org/show_bug.cgi?id=205534 5 <rdar://problem/58011337> 6 7 Reviewed by Chris Dumez. 8 9 * Shared/WebPageCreationParameters.cpp: 10 (WebKit::WebPageCreationParameters::encode const): 11 (WebKit::WebPageCreationParameters::decode): 12 * Shared/WebPageCreationParameters.h: 13 * UIProcess/API/APIPageConfiguration.cpp: 14 (API::PageConfiguration::copy const): 15 (API::PageConfiguration::PageConfiguration): Deleted. 16 (API::PageConfiguration::~PageConfiguration): Deleted. 17 * UIProcess/API/APIPageConfiguration.h: 18 (API::PageConfiguration::corsDisablingPatterns const): 19 (API::PageConfiguration::setCORSDisablingPatterns): 20 * UIProcess/API/Cocoa/WKWebViewConfiguration.mm: 21 (-[WKWebViewConfiguration _corsDisablingPatterns]): 22 (-[WKWebViewConfiguration _setCORSDisablingPatterns:]): 23 * UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h: 24 * UIProcess/WebPageProxy.cpp: 25 * WebProcess/WebPage/WebPage.cpp: 26 (WebKit::m_overriddenMediaType): 27 1 28 2020-01-02 Sam Weinig <weinig@apple.com> 2 29 -
trunk/Source/WebKit/Shared/WebPageCreationParameters.cpp
r252459 r253978 131 131 encoder << oldPageID; 132 132 encoder << overriddenMediaType; 133 encoder << corsDisablingPatterns; 133 134 } 134 135 … … 398 399 return WTF::nullopt; 399 400 401 Optional<Vector<String>> corsDisablingPatterns; 402 decoder >> corsDisablingPatterns; 403 if (!corsDisablingPatterns) 404 return WTF::nullopt; 405 parameters.corsDisablingPatterns = WTFMove(*corsDisablingPatterns); 406 400 407 return parameters; 401 408 } -
trunk/Source/WebKit/Shared/WebPageCreationParameters.h
r252459 r253978 203 203 204 204 String overriddenMediaType; 205 Vector<String> corsDisablingPatterns; 205 206 }; 206 207 -
trunk/Source/WebKit/UIProcess/API/APIPageConfiguration.cpp
r250169 r253978 41 41 42 42 namespace API { 43 using namespace WebCore;44 43 using namespace WebKit; 45 44 … … 49 48 } 50 49 51 PageConfiguration::PageConfiguration() 52 { 53 } 54 55 PageConfiguration::~PageConfiguration() 56 { 57 } 50 PageConfiguration::PageConfiguration() = default; 51 PageConfiguration::~PageConfiguration() = default; 58 52 59 53 Ref<PageConfiguration> PageConfiguration::copy() const … … 86 80 for (auto& pair : this->m_urlSchemeHandlers) 87 81 copy->m_urlSchemeHandlers.set(pair.key, pair.value.copyRef()); 82 copy->m_corsDisablingPatterns = this->m_corsDisablingPatterns; 88 83 89 84 return copy; … … 141 136 } 142 137 143 144 138 VisitedLinkStore* PageConfiguration::visitedLinkStore() 145 139 { -
trunk/Source/WebKit/UIProcess/API/APIPageConfiguration.h
r250287 r253978 30 30 #include <wtf/Forward.h> 31 31 #include <wtf/GetPtr.h> 32 #include <wtf/HashSet.h> 32 33 33 34 #if PLATFORM(IOS_FAMILY) … … 135 136 const HashMap<WTF::String, Ref<WebKit::WebURLSchemeHandler>>& urlSchemeHandlers() { return m_urlSchemeHandlers; } 136 137 138 const Vector<WTF::String>& corsDisablingPatterns() const { return m_corsDisablingPatterns; } 139 void setCORSDisablingPatterns(Vector<WTF::String>&& patterns) { m_corsDisablingPatterns = WTFMove(patterns); } 140 137 141 private: 138 142 … … 171 175 172 176 HashMap<WTF::String, Ref<WebKit::WebURLSchemeHandler>> m_urlSchemeHandlers; 177 Vector<WTF::String> m_corsDisablingPatterns; 173 178 }; 174 179 -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfiguration.mm
r252354 r253978 884 884 } 885 885 886 - (NSArray<NSString *> *)_corsDisablingPatterns 887 { 888 auto& vector = _pageConfiguration->corsDisablingPatterns(); 889 NSMutableArray *array = [NSMutableArray arrayWithCapacity:vector.size()]; 890 for (auto& pattern : vector) 891 [array addObject:pattern]; 892 return array; 893 } 894 895 - (void)_setCORSDisablingPatterns:(NSArray<NSString *> *)patterns 896 { 897 Vector<String> vector; 898 vector.reserveInitialCapacity(patterns.count); 899 for (NSString *pattern in patterns) 900 vector.uncheckedAppend(pattern); 901 _pageConfiguration->setCORSDisablingPatterns(WTFMove(vector)); 902 } 903 886 904 - (BOOL)_drawsBackground 887 905 { -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfigurationPrivate.h
r252354 r253978 78 78 79 79 @property (nonatomic, readonly) WKWebsiteDataStore *_websiteDataStoreIfExists WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 80 @property (nonatomic, copy, setter=_setCORSDisablingPatterns:) NSArray<NSString *> *_corsDisablingPatterns WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 80 81 81 82 #if TARGET_OS_IPHONE -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r253950 r253978 7547 7547 7548 7548 parameters.overriddenMediaType = m_overriddenMediaType; 7549 parameters.corsDisablingPatterns = m_configuration->corsDisablingPatterns(); 7549 7550 7550 7551 process.addWebUserContentControllerProxy(m_userContentController, parameters); -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r253950 r253978 517 517 #endif 518 518 519 pageConfiguration.corsDisablingPatterns = WTFMove(parameters.corsDisablingPatterns); 520 519 521 m_page = makeUnique<Page>(WTFMove(pageConfiguration)); 520 522 -
trunk/Tools/ChangeLog
r253975 r253978 1 2020-01-02 Alex Christensen <achristensen@webkit.org> 2 3 Add SPI to disable CORS on requests to URLs matching a pattern 4 https://bugs.webkit.org/show_bug.cgi?id=205534 5 <rdar://problem/58011337> 6 7 Reviewed by Chris Dumez. 8 9 * TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm: 10 1 11 2020-01-02 Sam Weinig <weinig@apple.com> 2 12 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm
r253501 r253978 26 26 #import "config.h" 27 27 28 #import "HTTPServer.h" 28 29 #import "PlatformUtilities.h" 29 30 #import "Test.h" … … 804 805 EXPECT_FALSE(corsfailure); 805 806 } 807 808 #if HAVE(NETWORK_FRAMEWORK) 809 810 TEST(URLSchemeHandler, DisableCORS) 811 { 812 TestWebKitAPI::HTTPServer server({ 813 { "/subresource", { "subresourcecontent" } } 814 }); 815 816 bool corssuccess = false; 817 bool corsfailure = false; 818 bool done = false; 819 820 auto handler = adoptNS([[TestURLSchemeHandler alloc] init]); 821 822 WKWebViewConfiguration *configuration = [[[WKWebViewConfiguration alloc] init] autorelease]; 823 [configuration setURLSchemeHandler:handler.get() forURLScheme:@"cors"]; 824 825 [handler setStartURLSchemeTaskHandler:[&](WKWebView *, id<WKURLSchemeTask> task) { 826 if ([task.request.URL.path isEqualToString:@"/main.html"]) { 827 NSData *data = [[NSString stringWithFormat:@"<script>fetch('http://127.0.0.1:%d/subresource').then(function(){fetch('/corssuccess')}).catch(function(){fetch('/corsfailure')})</script>", server.port()] dataUsingEncoding:NSUTF8StringEncoding]; 828 [task didReceiveResponse:[[[NSURLResponse alloc] initWithURL:task.request.URL MIMEType:@"text/html" expectedContentLength:data.length textEncodingName:nil] autorelease]]; 829 [task didReceiveData:data]; 830 [task didFinish]; 831 } else if ([task.request.URL.path isEqualToString:@"/corssuccess"]) { 832 corssuccess = true; 833 done = true; 834 } else if ([task.request.URL.path isEqualToString:@"/corsfailure"]) { 835 corsfailure = true; 836 done = true; 837 } else 838 ASSERT_NOT_REACHED(); 839 }]; 840 841 { 842 auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration]); 843 [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"cors://host1/main.html"]]]; 844 TestWebKitAPI::Util::run(&done); 845 } 846 EXPECT_FALSE(corssuccess); 847 EXPECT_TRUE(corsfailure); 848 849 corssuccess = false; 850 corsfailure = false; 851 done = false; 852 853 configuration._corsDisablingPatterns = @[@"http://*/*"]; 854 { 855 auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration]); 856 [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"cors://host1/main.html"]]]; 857 TestWebKitAPI::Util::run(&done); 858 } 859 EXPECT_TRUE(corssuccess); 860 EXPECT_FALSE(corsfailure); 861 } 862 863 #endif // HAVE(NETWORK_FRAMEWORK)
Note:
See TracChangeset
for help on using the changeset viewer.