Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(803)

Unified Diff: android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java

Issue 241143002: Allows AwCookieManager to block ThirdParty cookies (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed toThirdPartyUrl use Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
index 18cde687786914e7475f42e5f06f1eca475d6d7c..d1059667adb5b2645e079e3bd350aff1ab4c924a 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerTest.java
@@ -234,4 +234,167 @@ public class CookieManagerTest extends AwTestBase {
}
});
}
+
+ @MediumTest
+ @Feature({"AndroidWebView", "Privacy"})
+ public void testThirdPartyCookie() throws Throwable {
+ TestWebServer webServer = null;
+ try {
+ // In theory we need two servers to test this, one server ('the first party')
+ // which returns a response with a link to a second server ('the third party')
+ // at different origin. This second server attempts to set a cookie which should
+ // fail if AcceptThirdPartyCookie() is false.
+ // Strictly according to the letter of RFC6454 it should be possible to set this
+ // situation up with two TestServers on different ports (these count as having
+ // different origins) but Chrome is not strict about this and does not check the
+ // port. Instead we cheat making some of the urls come from localhost and some
+ // from 127.0.0.1 which count (both in theory and pratice) as having different
+ // origins.
+ webServer = new TestWebServer(false);
+
+ // Turn global allow on.
+ mCookieManager.setAcceptCookie(true);
+ mCookieManager.removeAllCookie();
+ assertTrue(mCookieManager.acceptCookie());
+ assertFalse(mCookieManager.hasCookies());
+
+ // When third party cookies are disabled...
+ mCookieManager.setAcceptThirdPartyCookie(false);
+ assertFalse(mCookieManager.acceptThirdPartyCookie());
+
+ // ...we can't set third party cookies.
+ // First on the third party server we create a url which tries to set a cookie.
+ String cookieUrl = toThirdPartyUrl(
+ makeCookieUrl(webServer, "/cookie_1.js", "test1", "value1"));
+ // Then we create a url on the first party server which links to the first url.
+ String url = makeScriptLinkUrl(webServer, "/content_1.html", cookieUrl);
+ loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
+ assertNull(mCookieManager.getCookie(cookieUrl));
+
+ // When third party cookies are enabled...
+ mCookieManager.setAcceptThirdPartyCookie(true);
+ assertTrue(mCookieManager.acceptThirdPartyCookie());
+
+ // ...we can set third party cookies.
+ cookieUrl = toThirdPartyUrl(
+ makeCookieUrl(webServer, "/cookie_2.js", "test2", "value2"));
+ url = makeScriptLinkUrl(webServer, "/content_2.html", cookieUrl);
+ loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
+ waitForCookie(cookieUrl);
+ String cookie = mCookieManager.getCookie(cookieUrl);
+ assertNotNull(cookie);
+ validateCookies(cookie, "test2");
+ } finally {
+ if (webServer != null) webServer.shutdown();
+ }
+ }
+
+ /**
+ * Creates a response on the TestWebServer which attempts to set a cookie when fetched.
+ * @param webServer the webServer on which to create the response
+ * @param path the path component of the url (e.g "/cookie_test.html")
+ * @param key the key of the cookie
+ * @param value the value of the cookie
+ * @return the url which gets the response
+ */
+ private String makeCookieUrl(TestWebServer webServer, String path, String key, String value) {
+ String response = "";
+ List<Pair<String, String>> responseHeaders = new ArrayList<Pair<String, String>>();
+ responseHeaders.add(
+ Pair.create("Set-Cookie", key + "=" + value + "; path=" + path));
+ return webServer.setResponse(path, response, responseHeaders);
+ }
+
+ /**
+ * Creates a response on the TestWebServer which contains a script tag with an external src.
+ * @param webServer the webServer on which to create the response
+ * @param path the path component of the url (e.g "/my_thing_with_script.html")
+ * @param url the url which which should appear as the src of the script tag.
+ * @return the url which gets the response
+ */
+ private String makeScriptLinkUrl(TestWebServer webServer, String path, String url) {
+ String responseStr = "<html><head><title>Content!</title></head>" +
+ "<body><script src=" + url + "></script></body></html>";
+ return webServer.setResponse(path, responseStr, null);
+ }
+
+ @MediumTest
+ @Feature({"AndroidWebView", "Privacy"})
+ public void testThirdPartyJavascriptCookie() throws Throwable {
+ TestWebServer webServer = null;
+ try {
+ // This test again uses 127.0.0.1/localhost trick to simulate a third party.
+ webServer = new TestWebServer(false);
+
+ mCookieManager.setAcceptCookie(true);
+ mCookieManager.removeAllCookie();
+ assertTrue(mCookieManager.acceptCookie());
+ assertFalse(mCookieManager.hasCookies());
+
+ // When third party cookies are disabled...
+ mCookieManager.setAcceptThirdPartyCookie(false);
+ assertFalse(mCookieManager.acceptThirdPartyCookie());
+
+ // ...we can't set third party cookies.
+ // We create a script which tries to set a cookie on a third party.
+ String cookieUrl = toThirdPartyUrl(
+ makeCookieScriptUrl(webServer, "/cookie_1.html", "test1", "value1"));
+ // Then we load it as an iframe.
+ String url = makeIframeUrl(webServer, "/content_1.html", cookieUrl);
+ loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
+ assertNull(mCookieManager.getCookie(cookieUrl));
+
+ // When third party cookies are enabled...
+ mCookieManager.setAcceptThirdPartyCookie(true);
+ assertTrue(mCookieManager.acceptThirdPartyCookie());
+
+ // ...we can set third party cookies.
+ cookieUrl = toThirdPartyUrl(
+ makeCookieScriptUrl(webServer, "/cookie_2.html", "test2", "value2"));
+ url = makeIframeUrl(webServer, "/content_2.html", cookieUrl);
+ loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
+ String cookie = mCookieManager.getCookie(cookieUrl);
+ assertNotNull(cookie);
+ validateCookies(cookie, "test2");
+ } finally {
+ if (webServer != null) webServer.shutdown();
+ }
+ }
+
+ /**
+ * Creates a response on the TestWebServer which attempts to set a cookie when fetched.
+ * @param webServer the webServer on which to create the response
+ * @param path the path component of the url (e.g "/my_thing_with_iframe.html")
+ * @param url the url which which should appear as the src of the iframe.
+ * @return the url which gets the response
+ */
+ private String makeIframeUrl(TestWebServer webServer, String path, String url) {
+ String responseStr = "<html><head><title>Content!</title></head>" +
+ "<body><iframe src=" + url + "></iframe></body></html>";
+ return webServer.setResponse(path, responseStr, null);
+ }
+
+ /**
+ * Creates a response on the TestWebServer with a script that attempts to set a cookie.
+ * @param webServer the webServer on which to create the response
+ * @param path the path component of the url (e.g "/cookie_test.html")
+ * @param key the key of the cookie
+ * @param value the value of the cookie
+ * @return the url which gets the response
+ */
+ private String makeCookieScriptUrl(TestWebServer webServer, String path, String key,
+ String value) {
+ String response = "<html><head></head><body>" +
+ "<script>document.cookie = \"" + key + "=" + value + "\";</script></body></html>";
+ return webServer.setResponse(path, response, null);
+ }
+
+ /**
+ * Makes a url look as if it comes from a different host.
+ * @param url the url to fake.
+ * @return the resulting after faking.
+ */
+ private String toThirdPartyUrl(String url) {
+ return url.replace("localhost", "127.0.0.1");
+ }
}
« no previous file with comments | « android_webview/java/src/org/chromium/android_webview/AwCookieManager.java ('k') | android_webview/native/cookie_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698