Commit 8d1d4b62 authored by Clark DuVall's avatar Clark DuVall Committed by Commit Bot

Remove dependency on TabAndroid in permissions classes

This will make it easier to move these into //components/permissions.

Bug: 1025609
Change-Id: Ic0745279a303c447beac0c3072dd59e494a15d1f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2065620
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Reviewed-by: default avatarAndy Paicu <andypaicu@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Cr-Commit-Position: refs/heads/master@{#743998}
parent e3546a69
......@@ -13,16 +13,15 @@ import org.chromium.chrome.browser.permissions.AndroidPermissionRequester;
import org.chromium.chrome.browser.settings.SettingsLauncher;
import org.chromium.chrome.browser.settings.website.SingleCategorySettings;
import org.chromium.chrome.browser.settings.website.SiteSettingsCategory;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.ui.base.WindowAndroid;
/**
* An infobar used for prompting the user to grant a web API permission.
*/
public class PermissionInfoBar
extends ConfirmInfoBar implements AndroidPermissionRequester.RequestDelegate {
/** The tab which this infobar will be displayed upon. */
protected final Tab mTab;
/** The window which this infobar will be displayed upon. */
protected final WindowAndroid mWindow;
/** The content settings types corresponding to the permission requested in this infobar. */
protected int[] mContentSettingsTypes;
......@@ -42,12 +41,12 @@ public class PermissionInfoBar
/** The secondary text shown below the message in the expanded state. */
private String mDescription;
protected PermissionInfoBar(Tab tab, int[] contentSettingsTypes, int iconDrawableId,
String compactMessage, String compactLinkText, String message, String description,
String primaryButtonText, String secondaryButtonText) {
protected PermissionInfoBar(WindowAndroid window, int[] contentSettingsTypes,
int iconDrawableId, String compactMessage, String compactLinkText, String message,
String description, String primaryButtonText, String secondaryButtonText) {
super(iconDrawableId, R.color.infobar_icon_drawable_color, null /* iconBitmap */, message,
null /* linkText */, primaryButtonText, secondaryButtonText);
mTab = tab;
mWindow = window;
mContentSettingsTypes = contentSettingsTypes;
mManageButtonLastClicked = false;
mIsExpanded = false;
......@@ -88,7 +87,7 @@ public class PermissionInfoBar
// requestAndroidPermissions will call back into this class to finalize the action if it
// returns true.
if (AndroidPermissionRequester.requestAndroidPermissions(
mTab, mContentSettingsTypes.clone(), this)) {
mWindow, mContentSettingsTypes.clone(), this)) {
return;
}
} else {
......@@ -137,7 +136,7 @@ public class PermissionInfoBar
/**
* Creates and begins the process for showing a PermissionInfoBar.
* @param tab The owning tab for the infobar.
* @param window The window this infobar will be displayed upon.
* @param contentSettingsTypes The list of ContentSettingTypes being requested by this infobar.
* @param enumeratedIconId ID corresponding to the icon that will be shown for the infobar.
* The ID must have been mapped using the ResourceMapper class
......@@ -150,12 +149,12 @@ public class PermissionInfoBar
* @param buttonManage String to display on the Manage button.
*/
@CalledByNative
private static PermissionInfoBar create(Tab tab, int[] contentSettingsTypes,
private static PermissionInfoBar create(WindowAndroid window, int[] contentSettingsTypes,
int enumeratedIconId, String compactMessage, String compactLinkText, String message,
String description, String buttonOk, String buttonManage) {
int drawableId = ResourceId.mapToDrawableId(enumeratedIconId);
PermissionInfoBar infoBar = new PermissionInfoBar(tab, contentSettingsTypes, drawableId,
PermissionInfoBar infoBar = new PermissionInfoBar(window, contentSettingsTypes, drawableId,
compactMessage, compactLinkText, message, description, buttonOk, buttonManage);
return infoBar;
......
......@@ -15,7 +15,6 @@ import androidx.annotation.StringRes;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.metrics.WebApkUma;
import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.webapps.WebApkActivity;
import org.chromium.components.content_settings.ContentSettingsType;
import org.chromium.ui.base.PermissionCallback;
......@@ -89,9 +88,8 @@ public class AndroidPermissionRequester {
* If true is returned, this method will asynchronously request the necessary permissions using
* a dialog, running methods on the RequestDelegate when the user has made a decision.
*/
public static boolean requestAndroidPermissions(
final Tab tab, final int[] contentSettingsTypes, final RequestDelegate delegate) {
final WindowAndroid windowAndroid = tab.getWindowAndroid();
public static boolean requestAndroidPermissions(final WindowAndroid windowAndroid,
final int[] contentSettingsTypes, final RequestDelegate delegate) {
if (windowAndroid == null) return false;
final SparseArray<String[]> contentSettingsTypesToPermissionsMap =
......@@ -149,7 +147,9 @@ public class AndroidPermissionRequester {
+ deniedContentSettings;
showMissingPermissionDialog(activity, deniedStringId,
() -> requestAndroidPermissions(tab, contentSettingsTypes, delegate),
()
-> requestAndroidPermissions(
windowAndroid, contentSettingsTypes, delegate),
delegate::onAndroidPermissionCanceled);
} else if (deniedContentSettings.isEmpty()) {
delegate.onAndroidPermissionAccepted();
......
......@@ -5,13 +5,12 @@
package org.chromium.chrome.browser.permissions;
import android.annotation.SuppressLint;
import android.app.Activity;
import androidx.annotation.IntDef;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.tab.TabImpl;
import org.chromium.ui.modaldialog.DialogDismissalCause;
import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.modaldialog.ModalDialogProperties;
......@@ -138,7 +137,7 @@ public class PermissionDialogController
assert mState == State.NOT_SHOWING;
mDialogDelegate = mRequestQueue.remove(0);
ChromeActivity activity = ((TabImpl) mDialogDelegate.getTab()).getActivity();
Activity activity = mDialogDelegate.getWindow().getActivity().get();
// It's possible for the activity to be null if we reach here just after the user
// backgrounds the browser and cleanup has happened. In that case, we can't show a prompt,
......@@ -158,8 +157,7 @@ public class PermissionDialogController
return;
}
mModalDialogManager =
((TabImpl) mDialogDelegate.getTab()).getActivity().getModalDialogManager();
mModalDialogManager = mDialogDelegate.getWindow().getModalDialogManager();
mDialogModel = PermissionDialogModel.getModel(this, mDialogDelegate);
mModalDialogManager.showDialog(mDialogModel, ModalDialogManager.ModalDialogType.TAB);
mState = State.PROMPT_OPEN;
......@@ -205,7 +203,7 @@ public class PermissionDialogController
// no system level permissions need to be requested, so just run the
// accept callback.
mState = State.REQUEST_ANDROID_PERMISSIONS;
if (!AndroidPermissionRequester.requestAndroidPermissions(mDialogDelegate.getTab(),
if (!AndroidPermissionRequester.requestAndroidPermissions(mDialogDelegate.getWindow(),
mDialogDelegate.getContentSettingsTypes(),
PermissionDialogController.this)) {
onAndroidPermissionAccepted();
......
......@@ -7,7 +7,7 @@ package org.chromium.chrome.browser.permissions;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.browser.ResourceId;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.ui.base.WindowAndroid;
/**
* Delegate class for modal permission dialogs. Contains all of the data displayed in a prompt,
......@@ -24,8 +24,8 @@ public class PermissionDialogDelegate {
/** The controller for this class */
private PermissionDialogController mDialogController;
/** The tab for which to create the dialog. */
private Tab mTab;
/** The window for which to create the dialog. */
private WindowAndroid mWindow;
/** The icon to display in the dialog. */
private int mDrawableId;
......@@ -42,8 +42,8 @@ public class PermissionDialogDelegate {
/** The {@link ContentSettingsType}s requested in this dialog. */
private int[] mContentSettingsTypes;
public Tab getTab() {
return mTab;
public WindowAndroid getWindow() {
return mWindow;
}
public int[] getContentSettingsTypes() {
......@@ -105,7 +105,7 @@ public class PermissionDialogDelegate {
* Called from C++ by |nativeDelegatePtr| to instantiate this class.
*
* @param nativeDelegatePtr The native counterpart that this object owns.
* @param tab The tab to create the dialog for.
* @param window The window to create the dialog for.
* @param contentSettingsTypes The content settings types requested by this dialog.
* @param iconResourceId The id of the icon to display in the dialog.
* @param message The message to display in the dialog.
......@@ -113,21 +113,21 @@ public class PermissionDialogDelegate {
* @param secondaryTextButton The text to display on the primary button.
*/
@CalledByNative
private static PermissionDialogDelegate create(long nativeDelegatePtr, Tab tab,
private static PermissionDialogDelegate create(long nativeDelegatePtr, WindowAndroid window,
int[] contentSettingsTypes, int enumeratedIconId, String message,
String primaryButtonText, String secondaryButtonText) {
return new PermissionDialogDelegate(nativeDelegatePtr, tab, contentSettingsTypes,
return new PermissionDialogDelegate(nativeDelegatePtr, window, contentSettingsTypes,
enumeratedIconId, message, primaryButtonText, secondaryButtonText);
}
/**
* Upon construction, this class takes ownership of the passed in native delegate.
*/
private PermissionDialogDelegate(long nativeDelegatePtr, Tab tab, int[] contentSettingsTypes,
int enumeratedIconId, String message, String primaryButtonText,
String secondaryButtonText) {
private PermissionDialogDelegate(long nativeDelegatePtr, WindowAndroid window,
int[] contentSettingsTypes, int enumeratedIconId, String message,
String primaryButtonText, String secondaryButtonText) {
mNativeDelegatePtr = nativeDelegatePtr;
mTab = tab;
mWindow = window;
mContentSettingsTypes = contentSettingsTypes;
mDrawableId = ResourceId.mapToDrawableId(enumeratedIconId);
mMessageText = message;
......
......@@ -12,7 +12,6 @@ import android.view.View;
import android.widget.TextView;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.tab.TabImpl;
import org.chromium.ui.modaldialog.ModalDialogProperties;
import org.chromium.ui.modelutil.PropertyModel;
......@@ -22,7 +21,8 @@ import org.chromium.ui.modelutil.PropertyModel;
class PermissionDialogModel {
public static PropertyModel getModel(
ModalDialogProperties.Controller controller, PermissionDialogDelegate delegate) {
Context context = ((TabImpl) delegate.getTab()).getActivity();
Context context = delegate.getWindow().getActivity().get();
assert context != null;
LayoutInflater inflater = LayoutInflater.from(context);
View customView = inflater.inflate(R.layout.permission_dialog, null);
......
......@@ -13,9 +13,6 @@
#include "chrome/android/chrome_jni_headers/PermissionDialogController_jni.h"
#include "chrome/android/chrome_jni_headers/PermissionDialogDelegate_jni.h"
#include "chrome/browser/android/resource_mapper.h"
#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_features.h"
#include "chrome/grit/generated_resources.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/web_contents.h"
......@@ -30,19 +27,19 @@ void PermissionDialogDelegate::Create(
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) {
// If we don't have a window, just act as though the prompt was dismissed.
if (!web_contents->GetTopLevelNativeWindow()) {
permission_prompt->Closing();
return;
}
// Dispatch the dialog to Java, which manages the lifetime of this object.
new PermissionDialogDelegate(tab, permission_prompt);
new PermissionDialogDelegate(web_contents, permission_prompt);
}
void PermissionDialogDelegate::CreateJavaDelegate(JNIEnv* env,
TabAndroid* tab) {
void PermissionDialogDelegate::CreateJavaDelegate(
JNIEnv* env,
content::WebContents* web_contents) {
base::android::ScopedJavaLocalRef<jstring> primaryButtonText =
ConvertUTF16ToJavaString(env,
l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW));
......@@ -57,7 +54,8 @@ void PermissionDialogDelegate::CreateJavaDelegate(JNIEnv* env,
}
j_delegate_.Reset(Java_PermissionDialogDelegate_create(
env, reinterpret_cast<uintptr_t>(this), tab->GetJavaObject(),
env, reinterpret_cast<uintptr_t>(this),
web_contents->GetTopLevelNativeWindow()->GetJavaObject(),
base::android::ToJavaIntArray(env, content_settings_types),
ResourceMapper::MapFromChromiumId(permission_prompt_->GetIconId()),
ConvertUTF16ToJavaString(env, permission_prompt_->GetMessageText()),
......@@ -85,16 +83,15 @@ void PermissionDialogDelegate::Destroy(JNIEnv* env,
}
PermissionDialogDelegate::PermissionDialogDelegate(
TabAndroid* tab,
content::WebContents* web_contents,
PermissionPromptAndroid* permission_prompt)
: content::WebContentsObserver(tab->web_contents()),
: content::WebContentsObserver(web_contents),
permission_prompt_(permission_prompt) {
DCHECK(tab);
DCHECK(permission_prompt_);
// Create our Java counterpart, which manages our lifetime.
JNIEnv* env = base::android::AttachCurrentThread();
CreateJavaDelegate(env, tab);
CreateJavaDelegate(env, web_contents);
// Send the Java delegate to the Java PermissionDialogController for display.
// The controller takes over lifetime management; when the Java delegate is no
......
......@@ -10,7 +10,6 @@
#include "base/android/scoped_java_ref.h"
#include "base/callback.h"
#include "base/macros.h"
#include "chrome/browser/media/webrtc/media_stream_devices_controller.h"
#include "chrome/browser/permissions/permission_prompt_android.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "components/permissions/permission_util.h"
......@@ -21,7 +20,6 @@ using base::android::JavaParamRef;
namespace content {
class WebContents;
}
class TabAndroid;
// Delegate class for displaying a permission prompt as a modal dialog. Used as
// the native to Java interface to allow Java to communicate the user's
......@@ -46,12 +44,11 @@ class PermissionDialogDelegate : public content::WebContentsObserver {
void Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj);
private:
PermissionDialogDelegate(
TabAndroid* tab,
PermissionPromptAndroid* permission_prompt);
PermissionDialogDelegate(content::WebContents* web_contents,
PermissionPromptAndroid* permission_prompt);
~PermissionDialogDelegate() override;
void CreateJavaDelegate(JNIEnv* env, TabAndroid* tab);
void CreateJavaDelegate(JNIEnv* env, content::WebContents* web_contents);
// On navigation or page destruction, hide the dialog.
void DismissDialog();
......
......@@ -14,6 +14,8 @@
#include "chrome/browser/android/resource_mapper.h"
#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/permissions/grouped_permission_infobar_delegate_android.h"
#include "content/public/browser/web_contents.h"
#include "ui/android/window_android.h"
namespace {
......@@ -23,7 +25,7 @@ using base::android::ScopedJavaLocalRef;
ScopedJavaLocalRef<jobject> CreateRenderInfoBarHelper(
JNIEnv* env,
int enumerated_icon_id,
const JavaRef<jobject>& tab,
const JavaRef<jobject>& window,
const base::string16& compact_message_text,
const base::string16& compact_link_text,
const base::string16& message_text,
......@@ -47,7 +49,7 @@ ScopedJavaLocalRef<jobject> CreateRenderInfoBarHelper(
ScopedJavaLocalRef<jintArray> content_settings_types =
base::android::ToJavaIntArray(env, content_settings);
return Java_PermissionInfoBar_create(
env, tab, content_settings_types, enumerated_icon_id,
env, window, content_settings_types, enumerated_icon_id,
compact_message_text_java, compact_link_text_java, message_text_java,
description_text_java, ok_button_text_java, cancel_button_text_java);
}
......@@ -82,9 +84,10 @@ GroupedPermissionInfoBar::CreateRenderInfoBar(JNIEnv* env) {
}
return CreateRenderInfoBarHelper(
env, permission_icon, GetTab()->GetJavaObject(), compact_message_text,
compact_link_text, message_text, description_text, ok_button_text,
cancel_button_text, content_settings_types);
env, permission_icon,
GetTab()->web_contents()->GetTopLevelNativeWindow()->GetJavaObject(),
compact_message_text, compact_link_text, message_text, description_text,
ok_button_text, cancel_button_text, content_settings_types);
}
GroupedPermissionInfoBarDelegate* GroupedPermissionInfoBar::GetDelegate() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment