summaryrefslogtreecommitdiff
path: root/chromium/components/content_settings/android
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/content_settings/android')
-rw-r--r--chromium/components/content_settings/android/BUILD.gn25
-rw-r--r--chromium/components/content_settings/android/DEPS6
-rw-r--r--chromium/components/content_settings/android/cookie_controls_bridge.cc106
-rw-r--r--chromium/components/content_settings/android/cookie_controls_bridge.h59
-rw-r--r--chromium/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java86
-rw-r--r--chromium/components/content_settings/android/java_templates/PrefNames.java.tmpl14
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() {{}}
+}}