Add-site-settings-option-for-session-only-cookies.patch 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. From: csagan5 <32685696+csagan5@users.noreply.github.com>
  2. Date: Tue, 28 Aug 2018 23:27:23 +0200
  3. Subject: Add site settings option for session-only cookies
  4. ---
  5. chrome/android/java/res/values/values.xml | 3 +++
  6. .../java/res/xml/website_preferences.xml | 7 ++++++
  7. .../preferences/PrefServiceBridge.java | 10 ++++++++
  8. .../website/SingleCategoryPreferences.java | 21 +++++++++++++++-
  9. .../java/strings/android_chrome_strings.grd | 6 +++++
  10. .../preferences/pref_service_bridge.cc | 25 +++++++++++++++++++
  11. 6 files changed, 71 insertions(+), 1 deletion(-)
  12. diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml
  13. --- a/chrome/android/java/res/values/values.xml
  14. +++ b/chrome/android/java/res/values/values.xml
  15. @@ -32,6 +32,9 @@
  16. <integer name="reload_button_level_reload">0</integer>
  17. <integer name="reload_button_level_stop">1</integer>
  18. + <string name="allow_cookies_session_only_title">Keep cookies only until you quit your browser</string>
  19. + <string name="allow_cookies_session_only_summary">When enabled, all cookies will be erased when the browsing session is over</string>
  20. +
  21. <!-- Help and Feedback
  22. These constants should be in sync with the context names on go/mobilehelprecs.
  23. If the context ID cannot be found, the default help page will be shown to the user.-->
  24. diff --git a/chrome/android/java/res/xml/website_preferences.xml b/chrome/android/java/res/xml/website_preferences.xml
  25. --- a/chrome/android/java/res/xml/website_preferences.xml
  26. +++ b/chrome/android/java/res/xml/website_preferences.xml
  27. @@ -26,6 +26,13 @@
  28. android:summary="@string/block_third_party_cookies_summary"
  29. android:defaultValue="true"
  30. android:persistent="false" />
  31. + <!-- A toggle for cookies to be saved only until session exit, only shown for the Cookies category. -->
  32. + <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
  33. + android:key="cookies_session_only"
  34. + android:title="@string/allow_cookies_session_only_title"
  35. + android:summary="@string/allow_cookies_session_only_summary"
  36. + android:defaultValue="true"
  37. + android:persistent="false" />
  38. <!-- A toggle for enabling vibration in notifications. -->
  39. <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
  40. android:key="notifications_vibrate"
  41. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
  42. --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
  43. +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
  44. @@ -265,6 +265,10 @@ public class PrefServiceBridge {
  45. return PrefServiceBridgeJni.get().getBlockThirdPartyCookiesEnabled(PrefServiceBridge.this);
  46. }
  47. + public boolean isCookiesSessionOnlyEnabled() {
  48. + return PrefServiceBridgeJni.get().getCookiesSessionOnlyEnabled(PrefServiceBridge.this);
  49. + }
  50. +
  51. /**
  52. * @return Whether third-party cookie blocking is configured by policy
  53. */
  54. @@ -668,6 +672,10 @@ public class PrefServiceBridge {
  55. PrefServiceBridge.this, enabled);
  56. }
  57. + public void setCookiesSessionOnlyEnabled(boolean enabled) {
  58. + PrefServiceBridgeJni.get().setCookiesSessionOnlyEnabled(PrefServiceBridge.this, enabled);
  59. + }
  60. +
  61. public void setDoNotTrackEnabled(boolean enabled) {
  62. PrefServiceBridgeJni.get().setDoNotTrackEnabled(PrefServiceBridge.this, enabled);
  63. }
  64. @@ -1138,6 +1146,8 @@ public class PrefServiceBridge {
  65. @NativeMethods
  66. public interface Natives {
  67. + boolean getCookiesSessionOnlyEnabled(PrefServiceBridge caller);
  68. + void setCookiesSessionOnlyEnabled(PrefServiceBridge caller, boolean enabled);
  69. boolean isContentSettingEnabled(PrefServiceBridge caller, int contentSettingType);
  70. boolean isContentSettingManaged(PrefServiceBridge caller, int contentSettingType);
  71. void setContentSettingEnabled(
  72. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
  73. --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
  74. +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
  75. @@ -127,6 +127,7 @@ public class SingleCategoryPreferences extends PreferenceFragmentCompat
  76. // Keys for category-specific preferences (toggle, link, button etc.), dynamically shown.
  77. public static final String THIRD_PARTY_COOKIES_TOGGLE_KEY = "third_party_cookies";
  78. + public static final String COOKIES_SESSION_ONLY_TOGGLE_KEY = "cookies_session_only";
  79. public static final String NOTIFICATIONS_VIBRATE_TOGGLE_KEY = "notifications_vibrate";
  80. public static final String EXPLAIN_PROTECTED_MEDIA_KEY = "protected_content_learn_more";
  81. private static final String ADD_EXCEPTION_KEY = "add_exception";
  82. @@ -477,6 +478,7 @@ public class SingleCategoryPreferences extends PreferenceFragmentCompat
  83. if (type == SiteSettingsCategory.Type.COOKIES) {
  84. updateThirdPartyCookiesCheckBox();
  85. + updateCookiesSessionOnlyCheckBox();
  86. } else if (type == SiteSettingsCategory.Type.NOTIFICATIONS) {
  87. updateNotificationsVibrateCheckBox();
  88. }
  89. @@ -516,6 +518,8 @@ public class SingleCategoryPreferences extends PreferenceFragmentCompat
  90. int setting = (int) newValue;
  91. prefServiceBridge.setContentSetting(mCategory.getContentSettingsType(), setting);
  92. getInfoForOrigins();
  93. + } else if (COOKIES_SESSION_ONLY_TOGGLE_KEY.equals(preference.getKey())) {
  94. + prefServiceBridge.setCookiesSessionOnlyEnabled((boolean) newValue);
  95. } else if (THIRD_PARTY_COOKIES_TOGGLE_KEY.equals(preference.getKey())) {
  96. prefServiceBridge.setBlockThirdPartyCookiesEnabled(((boolean) newValue));
  97. } else if (NOTIFICATIONS_VIBRATE_TOGGLE_KEY.equals(preference.getKey())) {
  98. @@ -833,6 +837,8 @@ public class SingleCategoryPreferences extends PreferenceFragmentCompat
  99. TriStateSiteSettingsPreference triStateToggle =
  100. (TriStateSiteSettingsPreference) screen.findPreference(TRI_STATE_TOGGLE_KEY);
  101. Preference thirdPartyCookies = screen.findPreference(THIRD_PARTY_COOKIES_TOGGLE_KEY);
  102. + Preference cookiesSessionOnly = getPreferenceScreen().findPreference(
  103. + COOKIES_SESSION_ONLY_TOGGLE_KEY);
  104. Preference notificationsVibrate = screen.findPreference(NOTIFICATIONS_VIBRATE_TOGGLE_KEY);
  105. Preference explainProtectedMediaKey = screen.findPreference(EXPLAIN_PROTECTED_MEDIA_KEY);
  106. PreferenceGroup allowedGroup = (PreferenceGroup) screen.findPreference(ALLOWED_GROUP);
  107. @@ -864,6 +870,7 @@ public class SingleCategoryPreferences extends PreferenceFragmentCompat
  108. if (hideSecondaryToggles) {
  109. screen.removePreference(thirdPartyCookies);
  110. + screen.removePreference(cookiesSessionOnly);
  111. screen.removePreference(notificationsVibrate);
  112. screen.removePreference(explainProtectedMediaKey);
  113. screen.removePreference(allowedGroup);
  114. @@ -874,12 +881,15 @@ public class SingleCategoryPreferences extends PreferenceFragmentCompat
  115. return;
  116. }
  117. - // Configure/hide the third-party cookies toggle, as needed.
  118. + // Configure/hide the third-party cookies toggle and session-only cookie toggle, as needed.
  119. if (mCategory.showSites(SiteSettingsCategory.Type.COOKIES)) {
  120. thirdPartyCookies.setOnPreferenceChangeListener(this);
  121. updateThirdPartyCookiesCheckBox();
  122. + cookiesSessionOnly.setOnPreferenceChangeListener(this);
  123. + updateCookiesSessionOnlyCheckBox();
  124. } else {
  125. screen.removePreference(thirdPartyCookies);
  126. + screen.removePreference(cookiesSessionOnly);
  127. }
  128. // Configure/hide the notifications vibrate toggle, as needed.
  129. @@ -994,6 +1004,15 @@ public class SingleCategoryPreferences extends PreferenceFragmentCompat
  130. preference -> PrefServiceBridge.getInstance().isBlockThirdPartyCookiesManaged());
  131. }
  132. + private void updateCookiesSessionOnlyCheckBox() {
  133. + ChromeBaseCheckBoxPreference cookiesSessionOnlyPref = (ChromeBaseCheckBoxPreference)
  134. + getPreferenceScreen().findPreference(COOKIES_SESSION_ONLY_TOGGLE_KEY);
  135. + cookiesSessionOnlyPref.setChecked(
  136. + PrefServiceBridge.getInstance().isCookiesSessionOnlyEnabled());
  137. + cookiesSessionOnlyPref.setEnabled(PrefServiceBridge.getInstance().isCategoryEnabled(
  138. + ContentSettingsType.CONTENT_SETTINGS_TYPE_COOKIES));
  139. + }
  140. +
  141. private void updateNotificationsVibrateCheckBox() {
  142. ChromeBaseCheckBoxPreference preference =
  143. (ChromeBaseCheckBoxPreference) getPreferenceScreen().findPreference(
  144. diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
  145. --- a/chrome/android/java/strings/android_chrome_strings.grd
  146. +++ b/chrome/android/java/strings/android_chrome_strings.grd
  147. @@ -878,6 +878,12 @@ Your Google account may have other forms of browsing history like searches and a
  148. <message name="IDS_BLOCK_THIRD_PARTY_COOKIES_SUMMARY" desc="Summary text for Block Third Party Cookies preference">
  149. Prevent third-party websites from saving and reading cookie data
  150. </message>
  151. + <message name="IDS_ALLOW_COOKIES_SESSION_ONLY_TITLE" desc="Title for Allow Cookies Session Only preference">
  152. + Keep cookies only until you quit your browser
  153. + </message>
  154. + <message name="IDS_ALLOW_COOKIES_SESSION_ONLY_SUMMARY" desc="Summary text for Allow Session Only Cookies preference">
  155. + When enabled, all cookies will be erased when the browsing session is over
  156. + </message>
  157. <message name="IDS_JAVASCRIPT_PERMISSION_TITLE" desc="Title of the permission to run javascript [CHAR-LIMIT=32]">
  158. JavaScript
  159. </message>
  160. diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc
  161. --- a/chrome/browser/android/preferences/pref_service_bridge.cc
  162. +++ b/chrome/browser/android/preferences/pref_service_bridge.cc
  163. @@ -330,6 +330,17 @@ static jboolean JNI_PrefServiceBridge_GetBlockThirdPartyCookiesEnabled(
  164. return GetPrefService()->GetBoolean(prefs::kBlockThirdPartyCookies);
  165. }
  166. +static jboolean JNI_PrefServiceBridge_GetCookiesSessionOnlyEnabled(
  167. + JNIEnv* env,
  168. + const JavaParamRef<jobject>& obj) {
  169. + HostContentSettingsMap* host_content_settings_map =
  170. + HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
  171. + auto value = host_content_settings_map->GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_COOKIES, nullptr);
  172. + auto enabled = CONTENT_SETTING_SESSION_ONLY == value;
  173. + LOG(INFO) << "GetCookiesSessionOnly := " << enabled << " (raw_value = " << value << ")";
  174. + return enabled;
  175. +}
  176. +
  177. static jboolean JNI_PrefServiceBridge_GetBlockThirdPartyCookiesManaged(
  178. JNIEnv* env,
  179. const JavaParamRef<jobject>& obj) {
  180. @@ -801,6 +812,20 @@ static void JNI_PrefServiceBridge_SetBlockThirdPartyCookiesEnabled(
  181. GetPrefService()->SetBoolean(prefs::kBlockThirdPartyCookies, enabled);
  182. }
  183. +static void JNI_PrefServiceBridge_SetCookiesSessionOnlyEnabled(
  184. + JNIEnv* env,
  185. + const JavaParamRef<jobject>& obj,
  186. + jboolean enabled) {
  187. + HostContentSettingsMap* host_content_settings_map =
  188. + HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
  189. + LOG(INFO) << "SetCookiesSessionOnly -> " << (enabled ? "true" : "false") <<
  190. + "; false -> setting_allow: " << CONTENT_SETTING_ALLOW <<
  191. + "; true -> session_only: " << CONTENT_SETTING_SESSION_ONLY;
  192. + host_content_settings_map->SetDefaultContentSetting(
  193. + CONTENT_SETTINGS_TYPE_COOKIES,
  194. + enabled ? CONTENT_SETTING_SESSION_ONLY : CONTENT_SETTING_ALLOW);
  195. +}
  196. +
  197. static void JNI_PrefServiceBridge_SetRememberPasswordsEnabled(
  198. JNIEnv* env,
  199. const JavaParamRef<jobject>& obj,
  200. --
  201. 2.17.1