Changeset 201967 in webkit
- Timestamp:
- Jun 11, 2016, 4:09:54 AM (9 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r201958 r201967 1 2016-06-10 Antti Koivisto <antti@apple.com> 2 3 Vary:Cookie validation doesn't work in private browsing 4 https://bugs.webkit.org/show_bug.cgi?id=158616 5 6 Reviewed by Darin Adler. 7 8 * http/tests/cache/disk-cache/disk-cache-vary-cookie-expected.txt: 9 * http/tests/cache/disk-cache/disk-cache-vary-cookie.html: 10 11 Exapand the existing test to cover memory cache and private browsing. 12 1 13 2016-06-10 Benjamin Poulain <bpoulain@apple.com> 2 14 -
trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-vary-cookie-expected.txt
r181894 r201967 1 Test that Vary: Cookie in response is handled by the disk cache.1 Test that Vary: Cookie in response is handled by caches. 2 2 3 3 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". 4 4 5 5 6 Testing disk cache 6 7 Setting cookie and loading 7 8 response headers: {"Cache-control":"max-age=100"} … … 32 33 response source: Disk cache 33 34 35 Testing memory cache 36 Setting cookie and loading 37 response headers: {"Cache-control":"max-age=100"} 38 response source: Network 39 40 response headers: {"Vary":"Cookie","Cache-control":"max-age=100"} 41 response source: Network 42 43 Loading again 44 response headers: {"Cache-control":"max-age=100"} 45 response source: Memory cache 46 47 response headers: {"Vary":"Cookie","Cache-control":"max-age=100"} 48 response source: Memory cache 49 50 Changing cookie and loading 51 response headers: {"Cache-control":"max-age=100"} 52 response source: Memory cache 53 54 response headers: {"Vary":"Cookie","Cache-control":"max-age=100"} 55 response source: Network 56 57 Loading again 58 response headers: {"Cache-control":"max-age=100"} 59 response source: Memory cache 60 61 response headers: {"Vary":"Cookie","Cache-control":"max-age=100"} 62 response source: Memory cache 63 64 Testing memory cache in private browsing 65 Setting cookie and loading 66 response headers: {"Cache-control":"max-age=100"} 67 response source: Network 68 69 response headers: {"Vary":"Cookie","Cache-control":"max-age=100"} 70 response source: Network 71 72 Loading again 73 response headers: {"Cache-control":"max-age=100"} 74 response source: Memory cache 75 76 response headers: {"Vary":"Cookie","Cache-control":"max-age=100"} 77 response source: Memory cache 78 79 Changing cookie and loading 80 response headers: {"Cache-control":"max-age=100"} 81 response source: Memory cache 82 83 response headers: {"Vary":"Cookie","Cache-control":"max-age=100"} 84 response source: Network 85 86 Loading again 87 response headers: {"Cache-control":"max-age=100"} 88 response source: Memory cache 89 90 response headers: {"Vary":"Cookie","Cache-control":"max-age=100"} 91 response source: Memory cache 92 34 93 PASS successfullyParsed is true 35 94 -
trunk/LayoutTests/http/tests/cache/disk-cache/disk-cache-vary-cookie.html
r183261 r201967 4 4 <script> 5 5 6 var tests =7 [8 { responseHeaders: {'Cache-control': 'max-age=100'} },9 { responseHeaders: {'Vary': 'Cookie', 'Cache-control': 'max-age=100'} },10 ];11 6 12 description("Test that Vary: Cookie in response is handled by the disk cache.");7 description("Test that Vary: Cookie in response is handled by caches."); 13 8 14 debug("Setting cookie and loading"); 15 document.cookie = "cookie=value"; 16 loadResources(tests, function () { 17 printResults(tests); 18 debug("Loading again"); 19 loadResources(tests, function () { 9 function testCookies(testDiskCache, completionHandler) 10 { 11 var tests = [ 12 { responseHeaders: {'Cache-control': 'max-age=100'} }, 13 { responseHeaders: {'Vary': 'Cookie', 'Cache-control': 'max-age=100'} }, 14 ]; 15 16 var options = { "ClearMemoryCache" : testDiskCache }; 17 debug("Setting cookie and loading"); 18 document.cookie = "cookie=" + Math.floor((Math.random() * 1000000000000)); 19 loadResourcesWithOptions(tests, options, function () { 20 20 printResults(tests); 21 debug("Changing cookie and loading"); 22 document.cookie = "cookie=othervalue"; 23 loadResources(tests, function () { 21 debug("Loading again"); 22 loadResourcesWithOptions(tests, options, function () { 24 23 printResults(tests); 25 debug("Loading again"); 26 loadResources(tests, function () { 27 printResults(tests); 28 finishJSTest(); 24 debug("Changing cookie and loading"); 25 document.cookie = "cookie" + Math.floor((Math.random() * 1000000000000)); 26 loadResourcesWithOptions(tests, options, function () { 27 printResults(tests); 28 debug("Loading again"); 29 loadResourcesWithOptions(tests, options, function () { 30 printResults(tests); 31 completionHandler(); 32 }); 29 33 }); 34 }); 35 }); 36 } 37 38 debug("Testing disk cache"); 39 testCookies(true, function () { 40 debug("Testing memory cache"); 41 testCookies(false, function () { 42 debug("Testing memory cache in private browsing"); 43 testRunner.setPrivateBrowsingEnabled(true); 44 testCookies(false, function () { 45 finishJSTest(); 30 46 }); 31 47 }); -
trunk/Source/WebCore/CMakeLists.txt
r201946 r201967 2339 2339 platform/network/MIMEHeader.cpp 2340 2340 platform/network/NetworkStateNotifier.cpp 2341 platform/network/NetworkStorageSession.cpp 2341 2342 platform/network/ParsedContentRange.cpp 2342 2343 platform/network/ParsedContentType.cpp -
trunk/Source/WebCore/ChangeLog
r201963 r201967 1 2016-06-10 Antti Koivisto <antti@apple.com> 2 3 Vary:Cookie validation doesn't work in private browsing 4 https://bugs.webkit.org/show_bug.cgi?id=158616 5 rdar://problem/26755067 6 7 Reviewed by Darin Adler. 8 9 This wasn't implemented because there was no way to get NetworkStorageSession from 10 a SessionID on WebCore side. 11 12 The patch adds a simple WebCore level weak map that allows getting NetworkStorageSessions 13 from SessionID. This seemed like the cleanest way to do this without a big refactoring 14 around the currently WebKit2 level SessionTracker. 15 16 * CMakeLists.txt: 17 * WebCore.xcodeproj/project.pbxproj: 18 * platform/network/CacheValidation.cpp: 19 (WebCore::headerValueForVary): 20 21 Get NetworkStorageSession from SessionID for cookies 22 23 (WebCore::verifyVaryingRequestHeaders): 24 * platform/network/NetworkStorageSession.cpp: Added. 25 26 Add platform independent .cpp for NetworkStorageSession. 27 Implement a weak map for SessionID -> NetworkStorageSession. 28 29 (WebCore::sessionsMap): 30 (WebCore::NetworkStorageSession::NetworkStorageSession): 31 (WebCore::NetworkStorageSession::~NetworkStorageSession): 32 (WebCore::NetworkStorageSession::forSessionID): 33 34 Get NetworkStorageSession for sessionID. 35 36 * platform/network/NetworkStorageSession.h: 37 (WebCore::NetworkStorageSession::sessionID): 38 (WebCore::NetworkStorageSession::credentialStorage): 39 * platform/network/cf/NetworkStorageSessionCFNet.cpp: 40 (WebCore::NetworkStorageSession::NetworkStorageSession): 41 42 Call to common constructor. 43 44 (WebCore::defaultNetworkStorageSession): 45 * platform/network/soup/NetworkStorageSessionSoup.cpp: 46 (WebCore::NetworkStorageSession::NetworkStorageSession): 47 48 Call to common constructor. 49 50 (WebCore::defaultSession): 51 (WebCore::NetworkStorageSession::~NetworkStorageSession): Deleted. 52 1 53 2016-06-10 Ada Chan <adachan@apple.com> 2 54 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r201963 r201967 6734 6734 E4F9EEF2156D9FFA00D23E7E /* StyleSheetContents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4F9EEF0156D84C400D23E7E /* StyleSheetContents.cpp */; }; 6735 6735 E4F9EEF3156DA00700D23E7E /* StyleSheetContents.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F9EEF1156D84C400D23E7E /* StyleSheetContents.h */; settings = {ATTRIBUTES = (Private, ); }; }; 6736 E4FD02041D0AF2C100D8E57E /* NetworkStorageSession.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4FD02031D0AF2C100D8E57E /* NetworkStorageSession.cpp */; }; 6736 6737 E51A81DF17298D7700BFCA61 /* JSPerformance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E51A81DE17298D7700BFCA61 /* JSPerformance.cpp */; }; 6737 6738 E526AF3F1727F8F200E41781 /* Performance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E526AF3E1727F8F200E41781 /* Performance.cpp */; }; … … 14819 14820 E4F9EEF0156D84C400D23E7E /* StyleSheetContents.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleSheetContents.cpp; sourceTree = "<group>"; }; 14820 14821 E4F9EEF1156D84C400D23E7E /* StyleSheetContents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StyleSheetContents.h; sourceTree = "<group>"; }; 14822 E4FD02031D0AF2C100D8E57E /* NetworkStorageSession.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkStorageSession.cpp; sourceTree = "<group>"; }; 14821 14823 E51A81DE17298D7700BFCA61 /* JSPerformance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPerformance.cpp; sourceTree = "<group>"; }; 14822 14824 E526AF3E1727F8F200E41781 /* Performance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Performance.cpp; sourceTree = "<group>"; }; … … 17807 17809 1A7FA61A0DDA3BBE0028F8A5 /* NetworkStateNotifier.cpp */, 17808 17810 1A7FA6180DDA3B3A0028F8A5 /* NetworkStateNotifier.h */, 17811 E4FD02031D0AF2C100D8E57E /* NetworkStorageSession.cpp */, 17809 17812 E13EF3421684ECF40034C83F /* NetworkStorageSession.h */, 17810 17813 CDCD41E51C3DDB0900965D99 /* ParsedContentRange.cpp */, … … 32191 32194 A3E2643014748991005A8588 /* WorkerEventQueue.cpp in Sources */, 32192 32195 2E4346480F546A8200B0F1BA /* WorkerGlobalScope.cpp in Sources */, 32196 E4FD02041D0AF2C100D8E57E /* NetworkStorageSession.cpp in Sources */, 32193 32197 418C395A1C8DD6990051C8A3 /* WorkerGlobalScopeFetch.cpp in Sources */, 32194 32198 5185FCB31BB4C4E80012898F /* WorkerGlobalScopeIndexedDatabase.cpp in Sources */, -
trunk/Source/WebCore/platform/network/CacheValidation.cpp
r201805 r201967 339 339 // is a blocking operation. This should be sufficient to cover reasonable cases. 340 340 if (headerName == httpHeaderNameString(HTTPHeaderName::Cookie)) { 341 if (sessionID != SessionID::defaultSessionID()) { 342 // FIXME: Don't know how to get the cookie. There should be a global way to get NetworkStorageSession from sessionID. 343 return ""; 344 } 345 auto& session = NetworkStorageSession::defaultStorageSession(); 341 auto& session = NetworkStorageSession::forSessionID(sessionID); 346 342 auto* cookieStrategy = platformStrategies() ? platformStrategies()->cookiesStrategy() : nullptr; 347 343 if (!cookieStrategy) … … 375 371 if (varyingRequestHeader.first == "*") 376 372 return false; 377 if (sessionID != SessionID::defaultSessionID() && varyingRequestHeader.first == httpHeaderNameString(HTTPHeaderName::Cookie)) {378 // FIXME: See the comment in headerValueForVary.379 return false;380 }381 373 String headerValue = headerValueForVary(request, varyingRequestHeader.first, sessionID); 382 374 if (headerValue != varyingRequestHeader.second) -
trunk/Source/WebCore/platform/network/NetworkStorageSession.h
r198083 r201967 38 38 namespace WebCore { 39 39 40 class NetworkingContext;41 40 class ResourceRequest; 42 41 class SoupNetworkSession; … … 50 49 WEBCORE_EXPORT static void switchToNewTestingSession(); 51 50 51 static NetworkStorageSession& forSessionID(SessionID); 52 53 WEBCORE_EXPORT ~NetworkStorageSession(); 54 52 55 SessionID sessionID() const { return m_sessionID; } 53 56 CredentialStorage& credentialStorage() { return m_credentialStorage; } 54 57 55 58 #if PLATFORM(COCOA) || USE(CFNETWORK) 56 NetworkStorageSession(SessionID, RetainPtr<CFURLStorageSessionRef> );59 NetworkStorageSession(SessionID, RetainPtr<CFURLStorageSessionRef>&&); 57 60 58 61 // May be null, in which case a Foundation default should be used. … … 61 64 #elif USE(SOUP) 62 65 NetworkStorageSession(SessionID, std::unique_ptr<SoupNetworkSession>); 63 ~NetworkStorageSession();64 66 65 67 SoupNetworkSession& soupNetworkSession() const; 66 68 void setSoupNetworkSession(std::unique_ptr<SoupNetworkSession>); 67 #else68 NetworkStorageSession(SessionID, NetworkingContext*);69 ~NetworkStorageSession();70 71 NetworkingContext* context() const;72 69 #endif 73 70 74 71 private: 72 explicit NetworkStorageSession(SessionID); 73 74 static void replaceDefaultSession(std::unique_ptr<NetworkStorageSession>); 75 75 76 SessionID m_sessionID; 76 77 … … 79 80 #elif USE(SOUP) 80 81 std::unique_ptr<SoupNetworkSession> m_session; 81 #else82 RefPtr<NetworkingContext> m_context;83 82 #endif 84 83 -
trunk/Source/WebCore/platform/network/cf/NetworkStorageSessionCFNet.cpp
r198083 r201967 42 42 namespace WebCore { 43 43 44 NetworkStorageSession::NetworkStorageSession(SessionID sessionID, RetainPtr<CFURLStorageSessionRef> platformSession) 45 : m_sessionID(sessionID) 46 , m_platformSession(platformSession) 44 NetworkStorageSession::NetworkStorageSession(SessionID sessionID, RetainPtr<CFURLStorageSessionRef>&& platformSession) 45 : NetworkStorageSession(sessionID) 47 46 { 48 } 49 50 static std::unique_ptr<NetworkStorageSession>& defaultNetworkStorageSession() 51 { 52 ASSERT(isMainThread()); 53 static NeverDestroyed<std::unique_ptr<NetworkStorageSession>> session; 54 return session; 47 m_platformSession = WTFMove(platformSession); 55 48 } 56 49 … … 60 53 String sessionName = String::format("WebKit Test-%u", static_cast<uint32_t>(getCurrentProcessID())); 61 54 #if PLATFORM(COCOA) 62 defaultNetworkStorageSession() = std::make_unique<NetworkStorageSession>(SessionID::defaultSessionID(), adoptCF(wkCreatePrivateStorageSession(sessionName.createCFString().get())));55 replaceDefaultSession(std::make_unique<NetworkStorageSession>(SessionID::defaultSessionID(), adoptCF(wkCreatePrivateStorageSession(sessionName.createCFString().get())))); 63 56 #else 64 defaultNetworkStorageSession() = std::make_unique<NetworkStorageSession>(SessionID::defaultSessionID(), adoptCF(wkCreatePrivateStorageSession(sessionName.createCFString().get(), defaultNetworkStorageSession()->platformSession())));57 replaceDefaultSession(std::make_unique<NetworkStorageSession>(SessionID::defaultSessionID(), adoptCF(wkCreatePrivateStorageSession(sessionName.createCFString().get(), defaultNetworkStorageSession()->platformSession())))); 65 58 #endif 66 }67 68 NetworkStorageSession& NetworkStorageSession::defaultStorageSession()69 {70 if (!defaultNetworkStorageSession())71 defaultNetworkStorageSession() = std::make_unique<NetworkStorageSession>(SessionID::defaultSessionID(), nullptr);72 return *defaultNetworkStorageSession();73 59 } 74 60 … … 80 66 auto session = std::make_unique<NetworkStorageSession>(sessionID, adoptCF(wkCreatePrivateStorageSession(cfIdentifier.get()))); 81 67 #else 82 auto session = std::make_unique<NetworkStorageSession>(sessionID, adoptCF(wkCreatePrivateStorageSession(cfIdentifier.get(), default NetworkStorageSession()->platformSession())));68 auto session = std::make_unique<NetworkStorageSession>(sessionID, adoptCF(wkCreatePrivateStorageSession(cfIdentifier.get(), defaultStorageSession().platformSession()))); 83 69 #endif 84 70 -
trunk/Source/WebCore/platform/network/soup/NetworkStorageSessionSoup.cpp
r198083 r201967 38 38 39 39 NetworkStorageSession::NetworkStorageSession(SessionID sessionID, std::unique_ptr<SoupNetworkSession> session) 40 : m_sessionID(sessionID) 41 , m_session(WTFMove(session)) 40 : NetworkStorageSession(sessionID) 42 41 { 43 } 44 45 NetworkStorageSession::~NetworkStorageSession() 46 { 47 } 48 49 static std::unique_ptr<NetworkStorageSession>& defaultSession() 50 { 51 ASSERT(isMainThread()); 52 static NeverDestroyed<std::unique_ptr<NetworkStorageSession>> session; 53 return session; 54 } 55 56 NetworkStorageSession& NetworkStorageSession::defaultStorageSession() 57 { 58 if (!defaultSession()) 59 defaultSession() = std::make_unique<NetworkStorageSession>(SessionID::defaultSessionID(), nullptr); 60 return *defaultSession(); 42 m_session = WTFMove(session); 61 43 } 62 44 … … 69 51 void NetworkStorageSession::switchToNewTestingSession() 70 52 { 71 defaultSession() = std::make_unique<NetworkStorageSession>(SessionID::defaultSessionID(), SoupNetworkSession::createTestingSession());53 replaceDefaultSession(std::make_unique<NetworkStorageSession>(SessionID::defaultSessionID(), SoupNetworkSession::createTestingSession())); 72 54 } 73 55
Note:
See TracChangeset
for help on using the changeset viewer.