Index: chrome/browser/ui/app_modal_dialogs/message_box_handler.cc |
diff --git a/chrome/browser/ui/app_modal_dialogs/message_box_handler.cc b/chrome/browser/ui/app_modal_dialogs/message_box_handler.cc |
index 09870d4beb977333173a63a2227db42dab4b5125..861d0731d66fe057c3ffab6c4d4d39f20ca1435f 100644 |
--- a/chrome/browser/ui/app_modal_dialogs/message_box_handler.cc |
+++ b/chrome/browser/ui/app_modal_dialogs/message_box_handler.cc |
@@ -49,6 +49,8 @@ class ChromeJavaScriptDialogCreator : public content::JavaScriptDialogCreator { |
const string16& title, |
bool is_alert); |
+ void CancelPendingDialogs(content::DialogDelegate* delegate); |
+ |
// Mapping between the JavaScriptDialogDelegates and their extra data. The key |
// is a void* because the pointer is just a cookie and is never dereferenced. |
typedef std::map<void*, ChromeJavaScriptDialogExtraData> |
@@ -138,6 +140,7 @@ void ChromeJavaScriptDialogCreator::RunBeforeUnloadDialog( |
void ChromeJavaScriptDialogCreator::ResetJavaScriptState( |
content::JavaScriptDialogDelegate* delegate) { |
+ CancelPendingDialogs(delegate); |
javascript_dialog_extra_data_.erase(delegate); |
} |
@@ -168,6 +171,16 @@ string16 ChromeJavaScriptDialogCreator::GetTitle(TitleType title_type, |
return string16(); |
} |
+void ChromeJavaScriptDialogCreator::CancelPendingDialogs( |
+ content::DialogDelegate* delegate) { |
+ AppModalDialogQueue* queue = AppModalDialogQueue::GetInstance(); |
+ for (AppModalDialogQueue::iterator i = queue->begin(); |
+ i != queue->end(); ++i) { |
+ if ((*i)->delegate() == delegate) |
+ (*i)->Invalidate(); |
+ } |
+} |
+ |
//------------------------------------------------------------------------------ |
content::JavaScriptDialogCreator* GetJavaScriptDialogCreatorInstance() { |