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