diff --git a/build/bromite_patches_list.txt b/build/bromite_patches_list.txt index b2c1490c..9efce2ba 100644 --- a/build/bromite_patches_list.txt +++ b/build/bromite_patches_list.txt @@ -146,4 +146,5 @@ Block-gateway-attacks-via-websockets.patch Enable-prefetch-privacy-changes-by-default.patch Enable-reduced-referrer-granularity-by-default.patch Restore-duet-flags.patch +Session-only-cookies-support.patch Automated-domain-substitution.patch diff --git a/build/patches/Session-only-cookies-support.patch b/build/patches/Session-only-cookies-support.patch new file mode 100644 index 00000000..a1bbbf66 --- /dev/null +++ b/build/patches/Session-only-cookies-support.patch @@ -0,0 +1,708 @@ +From: uazo +Date: Thu, 6 Aug 2020 14:02:57 +0000 +Subject: Session only cookies v2 + +--- + base/android/application_status_listener.cc | 1 + + base/android/application_status_listener.h | 3 +- + .../org/chromium/base/ApplicationStatus.java | 4 ++ + .../chrome/browser/ApplicationLifetime.java | 3 ++ + .../availability/availability_prober.cc | 1 + + .../four_state_cookie_settings_preference.xml | 7 ++++ + .../ContentSettingsResources.java | 9 +++++ + .../FourStateCookieSettingsPreference.java | 17 +++++++- + .../site_settings/SingleCategorySettings.java | 30 ++++++++++++++ + .../site_settings/SingleWebsiteSettings.java | 40 ++++++++++++++----- + .../site_settings/SiteSettings.java | 9 +++++ + .../strings/android/site_settings.grdp | 8 +++- + .../translations/browser_ui_strings_it.xtb | 2 + + .../core/browser/content_settings_registry.cc | 0 + .../scheduler/responsiveness/calculator.cc | 1 + + .../base/application_state_mojom_traits.cc | 7 +++- + .../public/mojom/base/application_state.mojom | 1 + + services/network/cookie_manager.cc | 14 +++++++ + services/network/cookie_manager.h | 3 ++ + services/network/network_context.cc | 17 ++++++++ + .../network/public/mojom/cookie_manager.mojom | 3 ++ + .../network/session_cleanup_cookie_store.cc | 39 ++++++++++++++++++ + .../network/session_cleanup_cookie_store.h | 9 +++++ + 23 files changed, 212 insertions(+), 16 deletions(-) + mode change 100644 => 100755 base/android/application_status_listener.cc + mode change 100644 => 100755 base/android/application_status_listener.h + mode change 100644 => 100755 base/android/java/src/org/chromium/base/ApplicationStatus.java + mode change 100644 => 100755 chrome/android/java/src/org/chromium/chrome/browser/ApplicationLifetime.java + mode change 100644 => 100755 chrome/browser/availability/availability_prober.cc + mode change 100644 => 100755 components/browser_ui/site_settings/android/java/res/layout/four_state_cookie_settings_preference.xml + mode change 100644 => 100755 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/ContentSettingsResources.java + mode change 100644 => 100755 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/FourStateCookieSettingsPreference.java + mode change 100644 => 100755 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java + mode change 100644 => 100755 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleWebsiteSettings.java + mode change 100644 => 100755 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettings.java + mode change 100644 => 100755 components/browser_ui/strings/android/site_settings.grdp + mode change 100644 => 100755 components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb + mode change 100644 => 100755 components/content_settings/core/browser/content_settings_registry.cc + mode change 100644 => 100755 content/browser/scheduler/responsiveness/calculator.cc + mode change 100644 => 100755 mojo/public/cpp/base/application_state_mojom_traits.cc + mode change 100644 => 100755 mojo/public/mojom/base/application_state.mojom + mode change 100644 => 100755 services/network/cookie_manager.cc + mode change 100644 => 100755 services/network/cookie_manager.h + mode change 100644 => 100755 services/network/network_context.cc + mode change 100644 => 100755 services/network/public/mojom/cookie_manager.mojom + mode change 100644 => 100755 services/network/session_cleanup_cookie_store.cc + mode change 100644 => 100755 services/network/session_cleanup_cookie_store.h + +diff --git a/base/android/application_status_listener.cc b/base/android/application_status_listener.cc +old mode 100644 +new mode 100755 +--- a/base/android/application_status_listener.cc ++++ b/base/android/application_status_listener.cc +@@ -84,6 +84,7 @@ void ApplicationStatusListener::NotifyApplicationStateChange( + switch (state) { + case APPLICATION_STATE_UNKNOWN: + case APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES: ++ case APPLICATION_STATE_EXITING: + break; + case APPLICATION_STATE_HAS_RUNNING_ACTIVITIES: + RecordAction(UserMetricsAction("Android.LifeCycle.HasRunningActivities")); +diff --git a/base/android/application_status_listener.h b/base/android/application_status_listener.h +old mode 100644 +new mode 100755 +--- a/base/android/application_status_listener.h ++++ b/base/android/application_status_listener.h +@@ -30,7 +30,8 @@ enum ApplicationState { + APPLICATION_STATE_HAS_RUNNING_ACTIVITIES = 1, + APPLICATION_STATE_HAS_PAUSED_ACTIVITIES = 2, + APPLICATION_STATE_HAS_STOPPED_ACTIVITIES = 3, +- APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES = 4 ++ APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES = 4, ++ APPLICATION_STATE_EXITING = 5 + }; + + // A native helper class to listen to state changes of the Android +diff --git a/base/android/java/src/org/chromium/base/ApplicationStatus.java b/base/android/java/src/org/chromium/base/ApplicationStatus.java +old mode 100644 +new mode 100755 +--- a/base/android/java/src/org/chromium/base/ApplicationStatus.java ++++ b/base/android/java/src/org/chromium/base/ApplicationStatus.java +@@ -661,6 +661,10 @@ public class ApplicationStatus { + return ApplicationState.HAS_DESTROYED_ACTIVITIES; + } + ++ public static void sendOnApplicationStateChange(int newState) { ++ ApplicationStatusJni.get().onApplicationStateChange(newState); ++ } ++ + @NativeMethods + interface Natives { + // Called to notify the native side of state changes. +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ApplicationLifetime.java b/chrome/android/java/src/org/chromium/chrome/browser/ApplicationLifetime.java +old mode 100644 +new mode 100755 +--- a/chrome/android/java/src/org/chromium/chrome/browser/ApplicationLifetime.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/ApplicationLifetime.java +@@ -6,6 +6,7 @@ package org.chromium.chrome.browser; + + import org.chromium.base.ObserverList; + import org.chromium.base.annotations.CalledByNative; ++import org.chromium.base.ApplicationStatus; + + /** + * Watches for when Chrome is told to restart itself. +@@ -42,6 +43,8 @@ public class ApplicationLifetime { + + @CalledByNative + public static void terminate(boolean restart) { ++ ApplicationStatus.sendOnApplicationStateChange(org.chromium.mojo_base.mojom.ApplicationState.APPLICATION_STATE_EXITING); ++ + for (Observer observer : sObservers) { + observer.onTerminate(restart); + } +diff --git a/chrome/browser/availability/availability_prober.cc b/chrome/browser/availability/availability_prober.cc +old mode 100644 +new mode 100755 +--- a/chrome/browser/availability/availability_prober.cc ++++ b/chrome/browser/availability/availability_prober.cc +@@ -205,6 +205,7 @@ bool IsInForeground(base::android::ApplicationState state) { + case base::android::APPLICATION_STATE_HAS_PAUSED_ACTIVITIES: + case base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES: + case base::android::APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES: ++ case base::android::APPLICATION_STATE_EXITING: + return false; + } + } +diff --git a/components/browser_ui/site_settings/android/java/res/layout/four_state_cookie_settings_preference.xml b/components/browser_ui/site_settings/android/java/res/layout/four_state_cookie_settings_preference.xml +old mode 100644 +new mode 100755 +--- a/components/browser_ui/site_settings/android/java/res/layout/four_state_cookie_settings_preference.xml ++++ b/components/browser_ui/site_settings/android/java/res/layout/four_state_cookie_settings_preference.xml +@@ -25,6 +25,13 @@ + app:primaryText="@string/website_settings_category_cookie_allow_title" + app:descriptionText="@string/website_settings_category_cookie_allow_addition" /> + ++ ++ + + +- ++ ++ Session Only Cookies ++ ++ ++ Cookies are availables until the browser is closed. ++ + ++ + + Allow sites to run JavaScript (recommended) + +diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb +old mode 100644 +new mode 100755 +--- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb ++++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb +@@ -238,4 +238,6 @@ + Gestito dai genitori + Accesso al microfono + Blocca se il sito mostra annunci invasivi o fuorvianti (consigliato) ++Solo cookies di sessione ++Mantieni i cookies per la sessione corrente. + +\ No newline at end of file +diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc +old mode 100644 +new mode 100755 +diff --git a/content/browser/scheduler/responsiveness/calculator.cc b/content/browser/scheduler/responsiveness/calculator.cc +old mode 100644 +new mode 100755 +--- a/content/browser/scheduler/responsiveness/calculator.cc ++++ b/content/browser/scheduler/responsiveness/calculator.cc +@@ -331,6 +331,7 @@ void Calculator::OnApplicationStateChanged( + is_application_visible_ = false; + break; + case base::android::APPLICATION_STATE_UNKNOWN: ++ case base::android::APPLICATION_STATE_EXITING: + break; // Keep in previous state. + } + } +diff --git a/mojo/public/cpp/base/application_state_mojom_traits.cc b/mojo/public/cpp/base/application_state_mojom_traits.cc +old mode 100644 +new mode 100755 +--- a/mojo/public/cpp/base/application_state_mojom_traits.cc ++++ b/mojo/public/cpp/base/application_state_mojom_traits.cc +@@ -22,6 +22,8 @@ mojo_base::mojom::ApplicationState EnumTraits< + return mojo_base::mojom::ApplicationState::HAS_STOPPED_ACTIVITIES; + case base::android::APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES: + return mojo_base::mojom::ApplicationState::HAS_DESTROYED_ACTIVITIES; ++ case base::android::APPLICATION_STATE_EXITING: ++ return mojo_base::mojom::ApplicationState::APPLICATION_STATE_EXITING; + } + NOTREACHED(); + return mojo_base::mojom::ApplicationState::UNKNOWN; +@@ -52,7 +54,10 @@ bool EnumTraitsSetCookieAccessDelegate( + std::make_unique(cookie_access_delegate_type, + &cookie_settings_)); ++ if(session_cleanup_cookie_store_) { ++ session_cleanup_cookie_store_->SetDefaultDeleteCookiePredicate( ++ cookie_settings_.CreateDeleteCookieOnExitPredicate()); ++ } + } + + CookieManager::~CookieManager() { +@@ -73,6 +77,16 @@ CookieManager::~CookieManager() { + cookie_store_->SetCookieAccessDelegate(nullptr); + } + ++void CookieManager::DeleteSessionCookies() ++{ ++ // anonymous profile doesn't have a session_cleanup_cookie_store ++ if (session_cleanup_cookie_store_) { ++ session_cleanup_cookie_store_->DeleteSessionCookies( ++ cookie_settings_.CreateDeleteCookieOnExitPredicate()); ++ } ++} ++ ++ + void CookieManager::AddReceiver( + mojo::PendingReceiver receiver) { + receivers_.Add(this, std::move(receiver)); +diff --git a/services/network/cookie_manager.h b/services/network/cookie_manager.h +old mode 100644 +new mode 100755 +--- a/services/network/cookie_manager.h ++++ b/services/network/cookie_manager.h +@@ -101,6 +101,9 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) CookieManager + // Causes the next call to GetCookieList to crash the process. + static void CrashOnGetCookieList(); + ++ // launch session_cleanup_cookie_store_() ++ void DeleteSessionCookies() override; ++ + private: + // State associated with a CookieChangeListener. + struct ListenerRegistration { +diff --git a/services/network/network_context.cc b/services/network/network_context.cc +old mode 100644 +new mode 100755 +--- a/services/network/network_context.cc ++++ b/services/network/network_context.cc +@@ -289,12 +289,23 @@ class NetworkContextApplicationStatusListener + } + + void Notify(base::android::ApplicationState state) override { ++ if(cookie_manager_) { ++ if(state == base::android::APPLICATION_STATE_EXITING) { ++ cookie_manager_->DeleteSessionCookies(); ++ } ++ } ++ + if (callback_) + callback_.Run(state); + } + ++ void SetCookieManager(CookieManager* cookie_manager) { ++ cookie_manager_ = cookie_manager; ++ } ++ + private: + ApplicationStateChangeCallback callback_; ++ CookieManager* cookie_manager_; + }; + #endif + +@@ -2106,6 +2117,12 @@ URLRequestContextOwner NetworkContext::MakeURLRequestContext() { + std::move(session_cleanup_cookie_store), + std::move(params_->cookie_manager_params)); + ++#if defined(OS_ANDROID) ++ ++ (static_cast(app_status_listener_.get()))->SetCookieManager(cookie_manager_.get()); ++ ++#endif ++ + if (cert_net_fetcher_) + cert_net_fetcher_->SetURLRequestContext(result.url_request_context.get()); + +diff --git a/services/network/public/mojom/cookie_manager.mojom b/services/network/public/mojom/cookie_manager.mojom +old mode 100644 +new mode 100755 +--- a/services/network/public/mojom/cookie_manager.mojom ++++ b/services/network/public/mojom/cookie_manager.mojom +@@ -361,4 +361,7 @@ interface CookieManager { + // the caller with a callback when settings have been updated. + SetStorageAccessGrantSettings( + array settings) => (); ++ ++ // launch session_cleanup_cookie_store_() ++ DeleteSessionCookies(); + }; +diff --git a/services/network/session_cleanup_cookie_store.cc b/services/network/session_cleanup_cookie_store.cc +old mode 100644 +new mode 100755 +--- a/services/network/session_cleanup_cookie_store.cc ++++ b/services/network/session_cleanup_cookie_store.cc +@@ -49,6 +49,11 @@ SessionCleanupCookieStore::~SessionCleanupCookieStore() { + "SessionCleanupCookieStore"); + } + ++void SessionCleanupCookieStore::SetDefaultDeleteCookiePredicate(DeleteCookiePredicate delete_cookie_predicate) ++{ ++ delete_cookie_predicate_ = delete_cookie_predicate; ++} ++ + void SessionCleanupCookieStore::DeleteSessionCookies( + DeleteCookiePredicate delete_cookie_predicate) { + using CookieOrigin = net::SQLitePersistentCookieStore::CookieOrigin; +@@ -137,6 +142,40 @@ void SessionCleanupCookieStore::OnLoad( + ++cookies_per_origin_[origin]; + } + ++#if defined(OS_ANDROID) ++ // In android delete session cookies is never called because it's in dtor(), launch now at restart ++ using CookieOrigin = net::SQLitePersistentCookieStore::CookieOrigin; ++ if (!force_keep_session_state_ && delete_cookie_predicate_) ++ { ++ std::list session_only_cookies; ++ ++ auto cookies_filtered = ++ std::remove_if( ++ cookies.begin(), ++ cookies.end(), ++ [this,&session_only_cookies](const auto& entry) { ++ bool mustRemoved = false; ++ CookieOrigin origin(entry->Domain(), entry->IsSecure()); ++ if(cookies_per_origin_cleared_[origin] == false) ++ { ++ mustRemoved = delete_cookie_predicate_.Run(origin.first, origin.second); ++ } ++ if( mustRemoved ) session_only_cookies.push_back(origin); ++ return mustRemoved; ++ }); ++ ++ cookies.erase(cookies_filtered, cookies.end()); ++ ++ // We need to remove session by origin once ++ for (const auto& cookie : cookies) { ++ CookieOrigin origin(cookie->Domain(), cookie->IsSecure()); ++ cookies_per_origin_cleared_[origin] = true; ++ } ++ ++ persistent_store_->DeleteAllInList(session_only_cookies); ++ } ++#endif ++ + std::move(loaded_callback).Run(std::move(cookies)); + } + +diff --git a/services/network/session_cleanup_cookie_store.h b/services/network/session_cleanup_cookie_store.h +old mode 100644 +new mode 100755 +--- a/services/network/session_cleanup_cookie_store.h ++++ b/services/network/session_cleanup_cookie_store.h +@@ -59,6 +59,11 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) SessionCleanupCookieStore + // |delete_cookie_predicate| returns true for. + void DeleteSessionCookies(DeleteCookiePredicate delete_cookie_predicate); + ++ // Used on android to force deletion of session cookies ++ using CookiesPerOriginClearedMap = ++ std::map; ++ void SetDefaultDeleteCookiePredicate(DeleteCookiePredicate delete_cookie_predicate); ++ + protected: + ~SessionCleanupCookieStore() override; + +@@ -80,6 +85,10 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) SessionCleanupCookieStore + + net::NetLogWithSource net_log_; + ++ // Used on android to force deletion of session cookies ++ DeleteCookiePredicate delete_cookie_predicate_; ++ CookiesPerOriginClearedMap cookies_per_origin_cleared_; ++ + DISALLOW_COPY_AND_ASSIGN(SessionCleanupCookieStore); + }; + +-- +2.17.1 +