Add JNI interface to content_extraction.InnerText

Change-Id: I919d0ffe4551d0941302b5a78f80f582658c7150
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5254314
Reviewed-by: Scott Violet <[email protected]>
Commit-Queue: Salvador Guerrero Ramos <[email protected]>
Reviewed-by: Tommy Nyquist <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1258102}
diff --git a/chrome/browser/content_extraction/android/inner_text_bridge.cc b/chrome/browser/content_extraction/android/inner_text_bridge.cc
new file mode 100644
index 0000000..fcf4521
--- /dev/null
+++ b/chrome/browser/content_extraction/android/inner_text_bridge.cc
@@ -0,0 +1,51 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/callback_android.h"
+#include "base/functional/callback_forward.h"
+#include "base/types/optional_ref.h"
+#include "chrome/browser/content_extraction/android/jni_headers/InnerTextBridge_jni.h"
+#include "chrome/browser/content_extraction/inner_text.h"
+#include "content/public/browser/render_frame_host.h"
+
+using ::base::android::JavaParamRef;
+
+namespace {
+void OnGotInnerText(
+    base::OnceCallback<void(const base::optional_ref<const std::string>)>
+        optional_string_callback,
+    std::unique_ptr<content_extraction::InnerTextResult> inner_text) {
+  if (!optional_string_callback) {
+    return;
+  }
+
+  if (!inner_text) {
+    std::move(optional_string_callback).Run(base::optional_ref<std::string>());
+  } else {
+    std::move(optional_string_callback).Run(inner_text->inner_text);
+  }
+}
+}  // namespace
+
+void JNI_InnerTextBridge_GetInnerText(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jrender_frame_host,
+    const JavaParamRef<jobject>& jcallback) {
+  CHECK(jcallback);
+  auto* render_frame_host =
+      content::RenderFrameHost::FromJavaRenderFrameHost(jrender_frame_host);
+  if (!render_frame_host) {
+    base::android::RunOptionalStringCallbackAndroid(
+        jcallback, base::optional_ref<std::string>());
+    return;
+  }
+
+  auto callback =
+      base::BindOnce(&base::android::RunOptionalStringCallbackAndroid,
+                     base::android::ScopedJavaGlobalRef<jobject>(jcallback));
+
+  content_extraction::GetInnerText(
+      *render_frame_host, std::nullopt,
+      base::BindOnce(&OnGotInnerText, std::move(callback)));
+}