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; |