| Index: chrome/browser/permissions/permission_dialog_delegate.cc
|
| diff --git a/chrome/browser/permissions/permission_dialog_delegate.cc b/chrome/browser/permissions/permission_dialog_delegate.cc
|
| index 1c1e81cea63b23d579cc1cb2f3d139807811fdd1..d6082290ed37c02b285430e51d1eff0275ce24fe 100644
|
| --- a/chrome/browser/permissions/permission_dialog_delegate.cc
|
| +++ b/chrome/browser/permissions/permission_dialog_delegate.cc
|
| @@ -21,6 +21,7 @@
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/common/chrome_features.h"
|
| #include "components/variations/variations_associated_data.h"
|
| +#include "content/public/browser/navigation_handle.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "jni/PermissionDialogController_jni.h"
|
| #include "jni/PermissionDialogDelegate_jni.h"
|
| @@ -102,14 +103,12 @@ bool PermissionDialogDelegate::RegisterPermissionDialogDelegate(JNIEnv* env) {
|
| return RegisterNativesImpl(env);
|
| }
|
|
|
| -ScopedJavaLocalRef<jobject> PermissionDialogDelegate::CreateJavaDelegate(
|
| - JNIEnv* env) {
|
| +void PermissionDialogDelegate::CreateJavaDelegate(JNIEnv* env) {
|
| std::vector<int> content_settings_types{
|
| infobar_delegate_->content_settings_types()};
|
|
|
| - return Java_PermissionDialogDelegate_create(
|
| - env, reinterpret_cast<uintptr_t>(this),
|
| - tab_->GetJavaObject(),
|
| + j_delegate_.Reset(Java_PermissionDialogDelegate_create(
|
| + env, reinterpret_cast<uintptr_t>(this), tab_->GetJavaObject(),
|
| base::android::ToJavaIntArray(env, content_settings_types).obj(),
|
| ResourceMapper::MapFromChromiumId(infobar_delegate_->GetIconId()),
|
| ConvertUTF16ToJavaString(env, infobar_delegate_->GetMessageText()),
|
| @@ -119,7 +118,7 @@ ScopedJavaLocalRef<jobject> PermissionDialogDelegate::CreateJavaDelegate(
|
| ConvertUTF16ToJavaString(env,
|
| infobar_delegate_->GetButtonLabel(
|
| PermissionInfoBarDelegate::BUTTON_CANCEL)),
|
| - infobar_delegate_->ShouldShowPersistenceToggle());
|
| + infobar_delegate_->ShouldShowPersistenceToggle()));
|
| }
|
|
|
| void PermissionDialogDelegate::Accept(JNIEnv* env,
|
| @@ -164,19 +163,40 @@ void PermissionDialogDelegate::Destroy(JNIEnv* env,
|
| PermissionDialogDelegate::PermissionDialogDelegate(
|
| TabAndroid* tab,
|
| std::unique_ptr<PermissionInfoBarDelegate> infobar_delegate)
|
| - : tab_(tab), infobar_delegate_(std::move(infobar_delegate)) {
|
| + : content::WebContentsObserver(tab->web_contents()),
|
| + tab_(tab),
|
| + infobar_delegate_(std::move(infobar_delegate)) {
|
| DCHECK(tab_);
|
| DCHECK(infobar_delegate_);
|
|
|
| // Create our Java counterpart, which manages our lifetime.
|
| JNIEnv* env = base::android::AttachCurrentThread();
|
| - base::android::ScopedJavaLocalRef<jobject> j_delegate =
|
| - CreateJavaDelegate(env);
|
| + CreateJavaDelegate(env);
|
|
|
| // Send the Java delegate to the Java PermissionDialogController for display.
|
| // The controller takes over lifetime management; when the Java delegate is no
|
| // longer needed it will in turn free the native delegate.
|
| - Java_PermissionDialogController_createDialog(env, j_delegate.obj());
|
| + Java_PermissionDialogController_createDialog(env, j_delegate_.obj());
|
| }
|
|
|
| PermissionDialogDelegate::~PermissionDialogDelegate() {}
|
| +
|
| +void PermissionDialogDelegate::DismissDialog() {
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| + Java_PermissionDialogDelegate_dismissFromNative(env, j_delegate_.obj());
|
| +}
|
| +
|
| +void PermissionDialogDelegate::DidFinishNavigation(
|
| + content::NavigationHandle* navigation_handle) {
|
| + if (!navigation_handle->IsInMainFrame() ||
|
| + !navigation_handle->HasCommitted() ||
|
| + navigation_handle->IsSameDocument()) {
|
| + return;
|
| + }
|
| +
|
| + DismissDialog();
|
| +}
|
| +
|
| +void PermissionDialogDelegate::WebContentsDestroyed() {
|
| + DismissDialog();
|
| +}
|
|
|