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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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. .../website/SingleCategorySettings.java | 21 ++++++++++++-
  8. .../preferences/pref_service_bridge.cc | 31 +++++++++++++++++++
  9. .../preferences/PrefServiceBridge.java | 10 ++++++
  10. .../strings/android_chrome_strings.grd | 6 ++++
  11. 6 files changed, 77 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. @@ -32,6 +32,13 @@
  28. android:title="@string/website_settings_category_notifications_quiet"
  29. android:defaultValue="false"
  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.settings.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.settings.ChromeBaseCheckBoxPreference
  40. android:key="notifications_vibrate"
  41. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
  42. --- a/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
  43. +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategorySettings.java
  44. @@ -130,6 +130,7 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
  45. // Keys for category-specific preferences (toggle, link, button etc.), dynamically shown.
  46. public static final String THIRD_PARTY_COOKIES_TOGGLE_KEY = "third_party_cookies";
  47. + public static final String COOKIES_SESSION_ONLY_TOGGLE_KEY = "cookies_session_only";
  48. public static final String NOTIFICATIONS_VIBRATE_TOGGLE_KEY = "notifications_vibrate";
  49. public static final String NOTIFICATIONS_QUIET_UI_TOGGLE_KEY = "notifications_quiet_ui";
  50. public static final String EXPLAIN_PROTECTED_MEDIA_KEY = "protected_content_learn_more";
  51. @@ -478,6 +479,7 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
  52. if (type == SiteSettingsCategory.Type.COOKIES) {
  53. updateThirdPartyCookiesCheckBox();
  54. + updateCookiesSessionOnlyCheckBox();
  55. } else if (type == SiteSettingsCategory.Type.NOTIFICATIONS) {
  56. updateNotificationsSecondaryControls();
  57. }
  58. @@ -516,6 +518,8 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
  59. int setting = (int) newValue;
  60. WebsitePreferenceBridge.setContentSetting(mCategory.getContentSettingsType(), setting);
  61. getInfoForOrigins();
  62. + } else if (COOKIES_SESSION_ONLY_TOGGLE_KEY.equals(preference.getKey())) {
  63. + PrefServiceBridge.getInstance().setCookiesSessionOnlyEnabled((boolean) newValue);
  64. } else if (THIRD_PARTY_COOKIES_TOGGLE_KEY.equals(preference.getKey())) {
  65. PrefServiceBridge.getInstance().setBoolean(
  66. Pref.BLOCK_THIRD_PARTY_COOKIES, ((boolean) newValue));
  67. @@ -829,6 +833,8 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
  68. TriStateSiteSettingsPreference triStateToggle =
  69. (TriStateSiteSettingsPreference) screen.findPreference(TRI_STATE_TOGGLE_KEY);
  70. Preference thirdPartyCookies = screen.findPreference(THIRD_PARTY_COOKIES_TOGGLE_KEY);
  71. + Preference cookiesSessionOnly = getPreferenceScreen().findPreference(
  72. + COOKIES_SESSION_ONLY_TOGGLE_KEY);
  73. Preference notificationsVibrate = screen.findPreference(NOTIFICATIONS_VIBRATE_TOGGLE_KEY);
  74. Preference notificationsQuietUi = screen.findPreference(NOTIFICATIONS_QUIET_UI_TOGGLE_KEY);
  75. Preference explainProtectedMediaKey = screen.findPreference(EXPLAIN_PROTECTED_MEDIA_KEY);
  76. @@ -861,6 +867,7 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
  77. if (hideSecondaryToggles) {
  78. screen.removePreference(thirdPartyCookies);
  79. + screen.removePreference(cookiesSessionOnly);
  80. screen.removePreference(notificationsVibrate);
  81. screen.removePreference(notificationsQuietUi);
  82. screen.removePreference(explainProtectedMediaKey);
  83. @@ -872,12 +879,15 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
  84. return;
  85. }
  86. - // Configure/hide the third-party cookies toggle, as needed.
  87. + // Configure/hide the third-party cookies toggle and session-only cookie toggle, as needed.
  88. if (mCategory.showSites(SiteSettingsCategory.Type.COOKIES)) {
  89. thirdPartyCookies.setOnPreferenceChangeListener(this);
  90. updateThirdPartyCookiesCheckBox();
  91. + cookiesSessionOnly.setOnPreferenceChangeListener(this);
  92. + updateCookiesSessionOnlyCheckBox();
  93. } else {
  94. screen.removePreference(thirdPartyCookies);
  95. + screen.removePreference(cookiesSessionOnly);
  96. }
  97. // Configure/hide the notifications secondary controls, as needed.
  98. @@ -992,6 +1002,15 @@ public class SingleCategorySettings extends PreferenceFragmentCompat
  99. }
  100. }
  101. + private void updateCookiesSessionOnlyCheckBox() {
  102. + ChromeBaseCheckBoxPreference cookiesSessionOnlyPref = (ChromeBaseCheckBoxPreference)
  103. + getPreferenceScreen().findPreference(COOKIES_SESSION_ONLY_TOGGLE_KEY);
  104. + cookiesSessionOnlyPref.setChecked(
  105. + PrefServiceBridge.getInstance().isCookiesSessionOnlyEnabled());
  106. + cookiesSessionOnlyPref.setEnabled(WebsitePreferenceBridge.isCategoryEnabled(
  107. + ContentSettingsType.COOKIES));
  108. + }
  109. +
  110. private void updateThirdPartyCookiesCheckBox() {
  111. ChromeBaseCheckBoxPreference thirdPartyCookiesPref =
  112. (ChromeBaseCheckBoxPreference) getPreferenceScreen().findPreference(
  113. diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc
  114. --- a/chrome/browser/android/preferences/pref_service_bridge.cc
  115. +++ b/chrome/browser/android/preferences/pref_service_bridge.cc
  116. @@ -13,10 +13,17 @@
  117. #include "chrome/browser/android/preferences/prefs.h"
  118. #include "chrome/browser/preferences/jni_headers/PrefServiceBridge_jni.h"
  119. #include "chrome/browser/profiles/profile_manager.h"
  120. +#include "components/content_settings/core/browser/host_content_settings_map.h"
  121. +#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
  122. +//#include "components/content_settings/core/common/content_settings_types.h"
  123. #include "components/prefs/pref_service.h"
  124. namespace {
  125. +Profile* GetOriginalProfile() {
  126. + return ProfileManager::GetActiveUserProfile()->GetOriginalProfile();
  127. +}
  128. +
  129. PrefService* GetPrefService() {
  130. return ProfileManager::GetActiveUserProfile()
  131. ->GetOriginalProfile()
  132. @@ -84,3 +91,27 @@ static jboolean JNI_PrefServiceBridge_IsManagedPreference(
  133. return GetPrefService()->IsManagedPreference(
  134. PrefServiceBridge::GetPrefNameExposedToJava(j_pref_index));
  135. }
  136. +static jboolean JNI_PrefServiceBridge_GetCookiesSessionOnlyEnabled(
  137. + JNIEnv* env,
  138. + const base::android::JavaParamRef<jobject>& obj) {
  139. + HostContentSettingsMap* host_content_settings_map =
  140. + HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
  141. + auto value = host_content_settings_map->GetDefaultContentSetting(ContentSettingsType::COOKIES, nullptr);
  142. + auto enabled = CONTENT_SETTING_SESSION_ONLY == value;
  143. + LOG(INFO) << "GetCookiesSessionOnly := " << enabled << " (raw_value = " << value << ")";
  144. + return enabled;
  145. +}
  146. +
  147. +static void JNI_PrefServiceBridge_SetCookiesSessionOnlyEnabled(
  148. + JNIEnv* env,
  149. + const base::android::JavaParamRef<jobject>& obj,
  150. + jboolean enabled) {
  151. + HostContentSettingsMap* host_content_settings_map =
  152. + HostContentSettingsMapFactory::GetForProfile(GetOriginalProfile());
  153. + LOG(INFO) << "SetCookiesSessionOnly -> " << (enabled ? "true" : "false") <<
  154. + "; false -> setting_allow: " << CONTENT_SETTING_ALLOW <<
  155. + "; true -> session_only: " << CONTENT_SETTING_SESSION_ONLY;
  156. + host_content_settings_map->SetDefaultContentSetting(
  157. + ContentSettingsType::COOKIES,
  158. + enabled ? CONTENT_SETTING_SESSION_ONLY : CONTENT_SETTING_ALLOW);
  159. +}
  160. diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
  161. --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
  162. +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
  163. @@ -82,6 +82,13 @@ public class PrefServiceBridge {
  164. PrefServiceBridgeJni.get().setString(preference, value);
  165. }
  166. + public boolean isCookiesSessionOnlyEnabled() {
  167. + return PrefServiceBridgeJni.get().getCookiesSessionOnlyEnabled(PrefServiceBridge.this);
  168. + }
  169. + public void setCookiesSessionOnlyEnabled(boolean enabled) {
  170. + PrefServiceBridgeJni.get().setCookiesSessionOnlyEnabled(PrefServiceBridge.this, enabled);
  171. + }
  172. +
  173. /**
  174. * @param preference The name of the preference.
  175. * @return Whether the specified preference is managed.
  176. @@ -97,6 +104,8 @@ public class PrefServiceBridge {
  177. @NativeMethods
  178. interface Natives {
  179. + boolean getCookiesSessionOnlyEnabled(PrefServiceBridge caller);
  180. + void setCookiesSessionOnlyEnabled(PrefServiceBridge caller, boolean enabled);
  181. boolean getBoolean(int preference);
  182. void setBoolean(int preference, boolean value);
  183. int getInteger(int preference);
  184. @@ -106,3 +115,4 @@ public class PrefServiceBridge {
  185. boolean isManagedPreference(int preference);
  186. }
  187. }
  188. +
  189. diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
  190. --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
  191. +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
  192. @@ -814,6 +814,12 @@ Your Google account may have other forms of browsing history like searches and a
  193. <message name="IDS_BLOCK_THIRD_PARTY_COOKIES_SUMMARY" desc="Summary text for Block Third Party Cookies preference">
  194. Prevent third-party websites from saving and reading cookie data
  195. </message>
  196. + <message name="IDS_ALLOW_COOKIES_SESSION_ONLY_TITLE" desc="Title for Allow Cookies Session Only preference">
  197. + Keep cookies only until you quit your browser
  198. + </message>
  199. + <message name="IDS_ALLOW_COOKIES_SESSION_ONLY_SUMMARY" desc="Summary text for Allow Session Only Cookies preference">
  200. + When enabled, all cookies will be erased when the browsing session is over
  201. + </message>
  202. <message name="IDS_JAVASCRIPT_PERMISSION_TITLE" desc="Title of the permission to run javascript [CHAR-LIMIT=32]">
  203. JavaScript
  204. </message>
  205. --
  206. 2.17.1