summaryrefslogtreecommitdiff
path: root/chromium/weblayer/browser/infobar_container_android.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/weblayer/browser/infobar_container_android.cc')
-rw-r--r--chromium/weblayer/browser/infobar_container_android.cc114
1 files changed, 114 insertions, 0 deletions
diff --git a/chromium/weblayer/browser/infobar_container_android.cc b/chromium/weblayer/browser/infobar_container_android.cc
new file mode 100644
index 00000000000..368ab764ce8
--- /dev/null
+++ b/chromium/weblayer/browser/infobar_container_android.cc
@@ -0,0 +1,114 @@
+// Copyright 2013 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 "weblayer/browser/infobar_container_android.h"
+
+#include "base/android/jni_android.h"
+#include "base/check.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/notreached.h"
+#include "components/infobars/core/infobar.h"
+#include "components/infobars/core/infobar_delegate.h"
+#include "content/public/browser/web_contents.h"
+#include "weblayer/browser/infobar_android.h"
+#include "weblayer/browser/infobar_service.h"
+#include "weblayer/browser/java/jni/InfoBarContainer_jni.h"
+
+using base::android::JavaParamRef;
+
+namespace weblayer {
+
+// InfoBarContainerAndroid ----------------------------------------------------
+
+InfoBarContainerAndroid::InfoBarContainerAndroid(JNIEnv* env, jobject obj)
+ : infobars::InfoBarContainer(NULL),
+ weak_java_infobar_container_(env, obj) {}
+
+InfoBarContainerAndroid::~InfoBarContainerAndroid() {
+ RemoveAllInfoBarsForDestruction();
+}
+
+void InfoBarContainerAndroid::SetWebContents(
+ JNIEnv* env,
+ const JavaParamRef<jobject>& obj,
+ const JavaParamRef<jobject>& web_contents) {
+ weblayer::InfoBarService* infobar_service =
+ web_contents
+ ? weblayer::InfoBarService::FromWebContents(
+ content::WebContents::FromJavaWebContents(web_contents))
+ : nullptr;
+ ChangeInfoBarManager(infobar_service);
+}
+
+void InfoBarContainerAndroid::Destroy(JNIEnv* env,
+ const JavaParamRef<jobject>& obj) {
+ delete this;
+}
+
+void InfoBarContainerAndroid::PlatformSpecificAddInfoBar(
+ infobars::InfoBar* infobar,
+ size_t position) {
+ DCHECK(infobar);
+ InfoBarAndroid* android_bar = static_cast<InfoBarAndroid*>(infobar);
+ if (!android_bar) {
+ // TODO(bulach): CLANK: implement other types of InfoBars.
+ NOTIMPLEMENTED() << "CLANK: infobar identifier "
+ << infobar->delegate()->GetIdentifier();
+ return;
+ }
+
+ AttachJavaInfoBar(android_bar);
+}
+
+void InfoBarContainerAndroid::AttachJavaInfoBar(InfoBarAndroid* android_bar) {
+ if (android_bar->HasSetJavaInfoBar())
+ return;
+ JNIEnv* env = base::android::AttachCurrentThread();
+
+ if (Java_InfoBarContainer_hasInfoBars(
+ env, weak_java_infobar_container_.get(env))) {
+ base::UmaHistogramSparse("InfoBar.Shown.Hidden",
+ android_bar->delegate()->GetIdentifier());
+ infobars::InfoBarDelegate::InfoBarIdentifier identifier =
+ static_cast<infobars::InfoBarDelegate::InfoBarIdentifier>(
+ Java_InfoBarContainer_getTopInfoBarIdentifier(
+ env, weak_java_infobar_container_.get(env)));
+ if (identifier != infobars::InfoBarDelegate::InfoBarIdentifier::INVALID) {
+ base::UmaHistogramSparse("InfoBar.Shown.Hiding", identifier);
+ }
+ } else {
+ base::UmaHistogramSparse("InfoBar.Shown.Visible",
+ android_bar->delegate()->GetIdentifier());
+ }
+
+ base::android::ScopedJavaLocalRef<jobject> java_infobar =
+ android_bar->CreateRenderInfoBar(env);
+ android_bar->SetJavaInfoBar(java_infobar);
+ Java_InfoBarContainer_addInfoBar(env, weak_java_infobar_container_.get(env),
+ java_infobar);
+}
+
+void InfoBarContainerAndroid::PlatformSpecificReplaceInfoBar(
+ infobars::InfoBar* old_infobar,
+ infobars::InfoBar* new_infobar) {
+ static_cast<InfoBarAndroid*>(new_infobar)
+ ->PassJavaInfoBar(static_cast<InfoBarAndroid*>(old_infobar));
+}
+
+void InfoBarContainerAndroid::PlatformSpecificRemoveInfoBar(
+ infobars::InfoBar* infobar) {
+ InfoBarAndroid* android_infobar = static_cast<InfoBarAndroid*>(infobar);
+ android_infobar->CloseJavaInfoBar();
+}
+
+// Native JNI methods ---------------------------------------------------------
+
+static jlong JNI_InfoBarContainer_Init(JNIEnv* env,
+ const JavaParamRef<jobject>& obj) {
+ InfoBarContainerAndroid* infobar_container =
+ new InfoBarContainerAndroid(env, obj);
+ return reinterpret_cast<intptr_t>(infobar_container);
+}
+
+} // namespace weblayer