diff options
Diffstat (limited to 'chromium/components/content_settings/android')
6 files changed, 294 insertions, 2 deletions
diff --git a/chromium/components/content_settings/android/BUILD.gn b/chromium/components/content_settings/android/BUILD.gn index 05939eea464..1c5229bc235 100644 --- a/chromium/components/content_settings/android/BUILD.gn +++ b/chromium/components/content_settings/android/BUILD.gn @@ -5,28 +5,43 @@ import("//build/config/android/rules.gni") generate_jni("content_settings_jni_headers") { - sources = [ "java/src/org/chromium/components/content_settings/ContentSettingsFeatureList.java" ] + sources = [ + "java/src/org/chromium/components/content_settings/ContentSettingsFeatureList.java", + "java/src/org/chromium/components/content_settings/CookieControlsBridge.java", + ] } android_library("java") { sources = [ "java/src/org/chromium/components/content_settings/ContentSettingsFeatureList.java", + "java/src/org/chromium/components/content_settings/CookieControlsBridge.java", "java/src/org/chromium/components/content_settings/CookieControlsObserver.java", ] deps = [ ":content_settings_enums_java", "//base:base_java", "//base:jni_java", + "//components/embedder_support/android:browser_context_java", + "//content/public/android:content_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } source_set("android") { - sources = [ "content_settings_feature_list.cc" ] + sources = [ + "content_settings_feature_list.cc", + "cookie_controls_bridge.cc", + "cookie_controls_bridge.h", + ] deps = [ ":content_settings_jni_headers", "//base", + "//components/content_settings/browser/ui", + "//components/content_settings/core/browser", "//components/content_settings/core/common", + "//components/embedder_support/android:browser_context", + "//components/permissions", + "//content/public/browser", ] } @@ -45,3 +60,9 @@ java_cpp_enum("content_settings_enums_javagen") { ] visibility = [ ":*" ] # Depend on through :content_settings_enums_java } + +java_cpp_strings("java_pref_names_srcjar") { + sources = [ "//components/content_settings/core/common/pref_names.cc" ] + + template = "java_templates/PrefNames.java.tmpl" +} diff --git a/chromium/components/content_settings/android/DEPS b/chromium/components/content_settings/android/DEPS new file mode 100644 index 00000000000..d722cb7774c --- /dev/null +++ b/chromium/components/content_settings/android/DEPS @@ -0,0 +1,6 @@ +include_rules = [ + "+components/embedder_support/android", + "+components/permissions", + "+content/public/android", + "+content/public/browser", +] diff --git a/chromium/components/content_settings/android/cookie_controls_bridge.cc b/chromium/components/content_settings/android/cookie_controls_bridge.cc new file mode 100644 index 00000000000..6c243e8e07e --- /dev/null +++ b/chromium/components/content_settings/android/cookie_controls_bridge.cc @@ -0,0 +1,106 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/content_settings/android/cookie_controls_bridge.h" + +#include <memory> + +#include "components/content_settings/android/content_settings_jni_headers/CookieControlsBridge_jni.h" +#include "components/content_settings/core/browser/cookie_settings.h" +#include "components/embedder_support/android/browser_context/browser_context_handle.h" +#include "components/permissions/permissions_client.h" +#include "content/public/browser/browser_context.h" + +namespace content_settings { + +using base::android::JavaParamRef; + +CookieControlsBridge::CookieControlsBridge( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + const base::android::JavaParamRef<jobject>& jweb_contents_android, + const base::android::JavaParamRef<jobject>& + joriginal_browser_context_handle) + : jobject_(obj) { + content::WebContents* web_contents = + content::WebContents::FromJavaWebContents(jweb_contents_android); + content::BrowserContext* original_context = + browser_context::BrowserContextFromJavaHandle( + joriginal_browser_context_handle); + auto* permissions_client = permissions::PermissionsClient::Get(); + controller_ = std::make_unique<CookieControlsController>( + permissions_client->GetCookieSettings(web_contents->GetBrowserContext()), + original_context ? permissions_client->GetCookieSettings(original_context) + : nullptr); + observer_.Add(controller_.get()); + controller_->Update(web_contents); +} + +void CookieControlsBridge::OnStatusChanged( + CookieControlsStatus new_status, + CookieControlsEnforcement new_enforcement, + int blocked_cookies) { + if (status_ != new_status || enforcement_ != new_enforcement) { + status_ = new_status; + enforcement_ = new_enforcement; + JNIEnv* env = base::android::AttachCurrentThread(); + // Only call status callback if status has changed + Java_CookieControlsBridge_onCookieBlockingStatusChanged( + env, jobject_, static_cast<int>(status_), + static_cast<int>(enforcement_)); + } + + OnBlockedCookiesCountChanged(blocked_cookies); +} + +void CookieControlsBridge::OnBlockedCookiesCountChanged(int blocked_cookies) { + // The blocked cookie count changes quite frequently, so avoid unnecessary + // UI updates if possible. + if (blocked_cookies_ == blocked_cookies) + return; + + blocked_cookies_ = blocked_cookies; + JNIEnv* env = base::android::AttachCurrentThread(); + Java_CookieControlsBridge_onBlockedCookiesCountChanged( + env, jobject_, blocked_cookies_.value_or(0)); +} + +void CookieControlsBridge::SetThirdPartyCookieBlockingEnabledForSite( + JNIEnv* env, + bool block_cookies) { + controller_->OnCookieBlockingEnabledForSite(block_cookies); +} + +void CookieControlsBridge::OnUiClosing(JNIEnv* env) { + controller_->OnUiClosing(); +} + +CookieControlsBridge::~CookieControlsBridge() = default; + +void CookieControlsBridge::Destroy(JNIEnv* env, + const JavaParamRef<jobject>& obj) { + delete this; +} + +jboolean JNI_CookieControlsBridge_IsCookieControlsEnabled( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& jbrowser_context_handle) { + content::BrowserContext* context = + browser_context::BrowserContextFromJavaHandle(jbrowser_context_handle); + return permissions::PermissionsClient::Get() + ->GetCookieSettings(context) + ->IsCookieControlsEnabled(); +} + +static jlong JNI_CookieControlsBridge_Init( + JNIEnv* env, + const JavaParamRef<jobject>& obj, + const base::android::JavaParamRef<jobject>& jweb_contents_android, + const base::android::JavaParamRef<jobject>& + joriginal_browser_context_handle) { + return reinterpret_cast<intptr_t>(new CookieControlsBridge( + env, obj, jweb_contents_android, joriginal_browser_context_handle)); +} + +} // namespace content_settings diff --git a/chromium/components/content_settings/android/cookie_controls_bridge.h b/chromium/components/content_settings/android/cookie_controls_bridge.h new file mode 100644 index 00000000000..f22a0905bd6 --- /dev/null +++ b/chromium/components/content_settings/android/cookie_controls_bridge.h @@ -0,0 +1,59 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_CONTENT_SETTINGS_ANDROID_COOKIE_CONTROLS_BRIDGE_H_ +#define COMPONENTS_CONTENT_SETTINGS_ANDROID_COOKIE_CONTROLS_BRIDGE_H_ + +#include "base/android/jni_weak_ref.h" +#include "base/optional.h" +#include "components/content_settings/browser/ui/cookie_controls_controller.h" +#include "components/content_settings/browser/ui/cookie_controls_view.h" +#include "components/content_settings/core/common/cookie_controls_status.h" + +namespace content_settings { + +// Communicates between CookieControlsController (C++ backend) and PageInfoView +// (Java UI). +class CookieControlsBridge : public CookieControlsView { + public: + // Creates a CookeControlsBridge for interaction with a + // CookieControlsController. + CookieControlsBridge( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + const base::android::JavaParamRef<jobject>& jweb_contents_android, + const base::android::JavaParamRef<jobject>& + joriginal_browser_context_handle); + + ~CookieControlsBridge() override; + + // Called by the Java counterpart when it is getting garbage collected. + void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); + + void SetThirdPartyCookieBlockingEnabledForSite(JNIEnv* env, + bool block_cookies); + + void OnUiClosing(JNIEnv* env); + + // CookieControlsView: + void OnStatusChanged(CookieControlsStatus status, + CookieControlsEnforcement enforcement, + int blocked_cookies) override; + void OnBlockedCookiesCountChanged(int blocked_cookies) override; + + private: + base::android::ScopedJavaGlobalRef<jobject> jobject_; + CookieControlsStatus status_ = CookieControlsStatus::kUninitialized; + CookieControlsEnforcement enforcement_ = + CookieControlsEnforcement::kNoEnforcement; + base::Optional<int> blocked_cookies_; + std::unique_ptr<CookieControlsController> controller_; + ScopedObserver<CookieControlsController, CookieControlsView> observer_{this}; + + DISALLOW_COPY_AND_ASSIGN(CookieControlsBridge); +}; + +} // namespace content_settings + +#endif // COMPONENTS_CONTENT_SETTINGS_ANDROID_COOKIE_CONTROLS_BRIDGE_H_ diff --git a/chromium/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java b/chromium/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java new file mode 100644 index 00000000000..2e23b96ba65 --- /dev/null +++ b/chromium/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java @@ -0,0 +1,86 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.content_settings; + +import androidx.annotation.Nullable; + +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; +import org.chromium.base.annotations.NativeMethods; +import org.chromium.components.embedder_support.browser_context.BrowserContextHandle; +import org.chromium.content_public.browser.WebContents; + +/** + * Communicates between CookieControlsController (C++ backend) and PageInfoView (Java UI). + */ +@JNINamespace("content_settings") +public class CookieControlsBridge { + private long mNativeCookieControlsBridge; + private CookieControlsObserver mObserver; + + /** + * Initializes a CookieControlsBridge instance. + * @param observer An observer to call with updates from the cookie controller. + * @param webContents The WebContents instance to observe. + * @param originalBrowserContext The "original" browser context. In Chrome, this corresponds to + * the regular profile when webContents is incognito. + */ + public CookieControlsBridge(CookieControlsObserver observer, WebContents webContents, + @Nullable BrowserContextHandle originalBrowserContext) { + mObserver = observer; + mNativeCookieControlsBridge = CookieControlsBridgeJni.get().init( + CookieControlsBridge.this, webContents, originalBrowserContext); + } + + public void setThirdPartyCookieBlockingEnabledForSite(boolean blockCookies) { + if (mNativeCookieControlsBridge != 0) { + CookieControlsBridgeJni.get().setThirdPartyCookieBlockingEnabledForSite( + mNativeCookieControlsBridge, blockCookies); + } + } + + public void onUiClosing() { + if (mNativeCookieControlsBridge != 0) { + CookieControlsBridgeJni.get().onUiClosing(mNativeCookieControlsBridge); + } + } + + /** + * Destroys the native counterpart of this class. + */ + public void destroy() { + if (mNativeCookieControlsBridge != 0) { + CookieControlsBridgeJni.get().destroy( + mNativeCookieControlsBridge, CookieControlsBridge.this); + mNativeCookieControlsBridge = 0; + } + } + + public static boolean isCookieControlsEnabled(BrowserContextHandle handle) { + return CookieControlsBridgeJni.get().isCookieControlsEnabled(handle); + } + + @CalledByNative + private void onCookieBlockingStatusChanged( + @CookieControlsStatus int status, @CookieControlsEnforcement int enforcement) { + mObserver.onCookieBlockingStatusChanged(status, enforcement); + } + + @CalledByNative + private void onBlockedCookiesCountChanged(int blockedCookies) { + mObserver.onBlockedCookiesCountChanged(blockedCookies); + } + + @NativeMethods + interface Natives { + long init(CookieControlsBridge caller, WebContents webContents, + BrowserContextHandle originalContextHandle); + void destroy(long nativeCookieControlsBridge, CookieControlsBridge caller); + void setThirdPartyCookieBlockingEnabledForSite( + long nativeCookieControlsBridge, boolean blockCookies); + void onUiClosing(long nativeCookieControlsBridge); + boolean isCookieControlsEnabled(BrowserContextHandle browserContextHandle); + } +} diff --git a/chromium/components/content_settings/android/java_templates/PrefNames.java.tmpl b/chromium/components/content_settings/android/java_templates/PrefNames.java.tmpl new file mode 100644 index 00000000000..0fc897821bb --- /dev/null +++ b/chromium/components/content_settings/android/java_templates/PrefNames.java.tmpl @@ -0,0 +1,14 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.content_settings; + +/** Contains content settings related preference names (keys). */ +public final class PrefNames {{ + +{NATIVE_STRINGS} + + // Prevents instantiation. + private PrefNames() {{}} +}} |