| Index: chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java b/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java
|
| index d38dc9b3f037a8e1b40ff6c7ab74d08d726a0701..fcb0b97720223e83e05dfcaf40bb90f6da28f6c8 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java
|
| @@ -89,6 +89,7 @@ public class PermissionDialogController implements AndroidPermissionRequester.Re
|
| */
|
| private void queueDialog(PermissionDialogDelegate delegate) {
|
| mRequestQueue.add(delegate);
|
| + delegate.setDialogController(this);
|
| scheduleDisplay();
|
| }
|
|
|
| @@ -101,6 +102,11 @@ public class PermissionDialogController implements AndroidPermissionRequester.Re
|
| return mDialog;
|
| }
|
|
|
| + @VisibleForTesting
|
| + public int getQueueLengthForTesting() {
|
| + return mRequestQueue.size();
|
| + }
|
| +
|
| @Override
|
| public void onAndroidPermissionAccepted() {
|
| mDialogDelegate.onAccept(mSwitchView.isChecked());
|
| @@ -193,9 +199,10 @@ public class PermissionDialogController implements AndroidPermissionRequester.Re
|
| mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
|
| @Override
|
| public void onDismiss(DialogInterface dialog) {
|
| - // For some reason this is ocassionally null. See crbug.com/708562.
|
| + // Null if dismiss initiated by C++, or for some unknown reason (crbug.com/708562).
|
| if (mDialogDelegate == null) {
|
| scheduleDisplay();
|
| + return;
|
| }
|
|
|
| mDialog = null;
|
| @@ -253,6 +260,19 @@ public class PermissionDialogController implements AndroidPermissionRequester.Re
|
| return fullString;
|
| }
|
|
|
| + public void dismissFromNative(PermissionDialogDelegate delegate) {
|
| + if (mDialogDelegate == delegate) {
|
| + mDialogDelegate = null;
|
| + AlertDialog dialog = mDialog;
|
| + mDialog = null;
|
| + dialog.dismiss();
|
| + } else {
|
| + assert mRequestQueue.contains(delegate);
|
| + mRequestQueue.remove(delegate);
|
| + }
|
| + delegate.destroy();
|
| + }
|
| +
|
| private void destroyDelegate() {
|
| mDialogDelegate.destroy();
|
| mDialogDelegate = null;
|
|
|