Chromium Code Reviews| 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 8b7fe9b25216d87d1571e5c9559e67f0830cfab2..97a4da467854414b5123bbfb3ed4fe298a47ada7 100644 |
| --- a/chrome/browser/permissions/permission_dialog_delegate.cc |
| +++ b/chrome/browser/permissions/permission_dialog_delegate.cc |
| @@ -20,12 +20,14 @@ |
| #include "chrome/browser/notifications/notification_permission_infobar_delegate.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/common/chrome_features.h" |
| +#include "chrome/grit/generated_resources.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" |
| #include "ui/android/window_android.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/window_open_disposition.h" |
| using base::android::ConvertUTF16ToJavaString; |
| @@ -40,11 +42,27 @@ const char kModalParamsUserGestureKey[] = "require_gesture"; |
| // static |
| void PermissionDialogDelegate::Create( |
| content::WebContents* web_contents, |
| - ContentSettingsType type, |
| - const GURL& requesting_frame, |
| - bool user_gesture, |
| - Profile* profile, |
| - const PermissionSetCallback& callback) { |
| + PermissionPromptAndroid* permission_prompt) { |
| + DCHECK(web_contents); |
| + |
| + // If we don't have a tab, just act as though the prompt was dismissed. |
| + TabAndroid* tab = TabAndroid::FromWebContents(web_contents); |
| + if (!tab) { |
| + permission_prompt->Closing(); |
| + return; |
| + } |
| + |
| + // Dispatch the dialog to Java, which manages the lifetime of this object. |
| + new PermissionDialogDelegate(tab, nullptr, permission_prompt); |
|
raymes
2017/05/29 04:31:39
nit: /*infobar_delegate=*/nullptr
Timothy Loh
2017/05/29 06:58:20
Done.
|
| +} |
| + |
| +// static |
| +void PermissionDialogDelegate::Create(content::WebContents* web_contents, |
| + ContentSettingsType type, |
| + const GURL& requesting_frame, |
| + bool user_gesture, |
| + Profile* profile, |
| + const PermissionSetCallback& callback) { |
| DCHECK(web_contents); |
| // If we don't have a tab, just act as though the prompt was dismissed. |
| @@ -56,8 +74,10 @@ void PermissionDialogDelegate::Create( |
| // Dispatch the dialog to Java, which manages the lifetime of this object. |
| new PermissionDialogDelegate( |
| - tab, PermissionInfoBarDelegate::CreateDelegate( |
| - type, requesting_frame, user_gesture, profile, callback)); |
| + tab, |
| + PermissionInfoBarDelegate::CreateDelegate( |
| + type, requesting_frame, user_gesture, profile, callback), |
| + nullptr); |
| } |
| // static |
| @@ -81,7 +101,7 @@ void PermissionDialogDelegate::CreateMediaStreamDialog( |
| user_gesture, std::move(request))); |
| // Dispatch the dialog to Java, which manages the lifetime of this object. |
| - new PermissionDialogDelegate(tab, std::move(infobar_delegate)); |
| + new PermissionDialogDelegate(tab, std::move(infobar_delegate), nullptr); |
|
raymes
2017/05/29 04:31:39
nit: /*permission_prompt=*/nullptr
Timothy Loh
2017/05/29 06:58:20
Done.
|
| } |
| // static |
| @@ -104,42 +124,83 @@ bool PermissionDialogDelegate::RegisterPermissionDialogDelegate(JNIEnv* env) { |
| } |
| void PermissionDialogDelegate::CreateJavaDelegate(JNIEnv* env) { |
| + base::android::ScopedJavaLocalRef<jstring> primaryButtonText = |
| + ConvertUTF16ToJavaString(env, |
| + l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW)); |
| + base::android::ScopedJavaLocalRef<jstring> secondaryButtonText = |
| + ConvertUTF16ToJavaString(env, |
| + l10n_util::GetStringUTF16(IDS_PERMISSION_DENY)); |
| + |
| + if (infobar_delegate_) { |
| + std::vector<int> content_settings_types{ |
| + infobar_delegate_->content_settings_types()}; |
| + |
| + 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()), |
| + ConvertUTF16ToJavaString(env, infobar_delegate_->GetLinkText()), |
| + primaryButtonText, secondaryButtonText, |
| + infobar_delegate_->ShouldShowPersistenceToggle())); |
| + return; |
| + } |
| + |
| + // TODO(timloh): Handle grouped media permissions (camera + microphone). |
| + DCHECK_EQ(1u, permission_prompt_->PermissionCount()); |
| + |
| std::vector<int> content_settings_types{ |
| - infobar_delegate_->content_settings_types()}; |
| + permission_prompt_->GetContentSettingType(0)}; |
| 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()), |
| - ConvertUTF16ToJavaString(env, infobar_delegate_->GetLinkText()), |
| - ConvertUTF16ToJavaString(env, infobar_delegate_->GetButtonLabel( |
| - PermissionInfoBarDelegate::BUTTON_OK)), |
| + ResourceMapper::MapFromChromiumId( |
| + permission_prompt_->GetIconIdForPermission(0)), |
| + // TODO(timloh): This is the wrong string. |
| ConvertUTF16ToJavaString(env, |
| - infobar_delegate_->GetButtonLabel( |
| - PermissionInfoBarDelegate::BUTTON_CANCEL)), |
| - infobar_delegate_->ShouldShowPersistenceToggle())); |
| + permission_prompt_->GetMessageTextFragment(0)), |
| + // TODO(timloh): Pass the actual link text for EME. |
| + ConvertUTF16ToJavaString(env, base::string16()), primaryButtonText, |
| + secondaryButtonText, |
| + // TODO(timloh): Hook up the persistence toggle. |
| + false)); |
| } |
| void PermissionDialogDelegate::Accept(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean persist) { |
| - if (infobar_delegate_->ShouldShowPersistenceToggle()) |
| - infobar_delegate_->set_persist(persist); |
| - infobar_delegate_->Accept(); |
| + if (infobar_delegate_) { |
| + if (infobar_delegate_->ShouldShowPersistenceToggle()) |
| + infobar_delegate_->set_persist(persist); |
| + infobar_delegate_->Accept(); |
| + return; |
| + } |
| + |
| + permission_prompt_->Accept(); |
| } |
| void PermissionDialogDelegate::Cancel(JNIEnv* env, |
| const JavaParamRef<jobject>& obj, |
| jboolean persist) { |
| - if (infobar_delegate_->ShouldShowPersistenceToggle()) |
| - infobar_delegate_->set_persist(persist); |
| - infobar_delegate_->Cancel(); |
| + if (infobar_delegate_) { |
| + if (infobar_delegate_->ShouldShowPersistenceToggle()) |
| + infobar_delegate_->set_persist(persist); |
| + infobar_delegate_->Cancel(); |
| + return; |
| + } |
| + |
| + permission_prompt_->Deny(); |
| } |
| void PermissionDialogDelegate::Dismissed(JNIEnv* env, |
| const JavaParamRef<jobject>& obj) { |
| - infobar_delegate_->InfoBarDismissed(); |
| + if (infobar_delegate_) { |
| + infobar_delegate_->InfoBarDismissed(); |
| + return; |
| + } |
| + |
| + permission_prompt_->Closing(); |
| } |
| void PermissionDialogDelegate::LinkClicked(JNIEnv* env, |
| @@ -148,10 +209,14 @@ void PermissionDialogDelegate::LinkClicked(JNIEnv* env, |
| // InfoBarService as an owner() to open the link. That will fail since the |
| // wrapped delegate has no owner (it hasn't been added as an infobar). |
| if (tab_->web_contents()) { |
| - tab_->web_contents()->OpenURL(content::OpenURLParams( |
| - infobar_delegate_->GetLinkURL(), content::Referrer(), |
| - WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, |
| - false)); |
| + if (infobar_delegate_) { |
| + tab_->web_contents()->OpenURL(content::OpenURLParams( |
| + infobar_delegate_->GetLinkURL(), content::Referrer(), |
| + WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, |
| + false)); |
| + } |
| + // TODO(timloh): Show a 'learn more' link in the PermissionRequestManager |
| + // codepath for EME. |
| } |
| } |
| @@ -163,12 +228,15 @@ void PermissionDialogDelegate::Destroy(JNIEnv* env, |
| PermissionDialogDelegate::PermissionDialogDelegate( |
| TabAndroid* tab, |
| - std::unique_ptr<PermissionInfoBarDelegate> infobar_delegate) |
| - : content::WebContentsObserver(tab->web_contents()), |
| - tab_(tab), |
| - infobar_delegate_(std::move(infobar_delegate)) { |
| + std::unique_ptr<PermissionInfoBarDelegate> infobar_delegate, |
| + PermissionPromptAndroid* permission_prompt) |
| + : tab_(tab), |
| + infobar_delegate_(std::move(infobar_delegate)), |
| + permission_prompt_(permission_prompt) { |
| DCHECK(tab_); |
| - DCHECK(infobar_delegate_); |
| + // Only one of the PermissionPromptAndroid and PermissionInfoBarDelegate is |
| + // used, depending on whether the PermissionRequestManager is enabled or not. |
| + DCHECK(!!permission_prompt_ ^ !!infobar_delegate_); |
| // Create our Java counterpart, which manages our lifetime. |
| JNIEnv* env = base::android::AttachCurrentThread(); |