Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5288)

Unified Diff: chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc

Issue 2603493003: Close the email confirmation dialog when its web contents are killed. (Closed)
Patch Set: Fix compile Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
diff --git a/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc b/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
index cf9b6dc3dccdb2c46a1d346b6775ec2ddd0f1783..06732fd8a7a6c168696bb1591838b4c4b51a27a6 100644
--- a/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
+++ b/chrome/browser/ui/webui/signin/signin_email_confirmation_dialog.cc
@@ -9,10 +9,13 @@
#include "base/json/json_reader.h"
#include "base/json/json_writer.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/signin/signin_email_confirmation_ui.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/browser_resources.h"
#include "chrome/grit/generated_resources.h"
#include "content/public/browser/user_metrics.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_message_handler.h"
#include "ui/base/l10n/l10n_util.h"
@@ -32,18 +35,30 @@ const char kActionCancel[] = "cancel";
const char kActionCreateNewUser[] = "createNewUser";
const char kActionStartSync[] = "startSync";
-class EmailConfirmationHandler : public content::WebUIMessageHandler {
+} // namespace
+
+class SigninEmailConfirmationDialog::DialogWebContentsObserver
+ : public content::WebContentsObserver {
public:
- EmailConfirmationHandler();
- ~EmailConfirmationHandler() override;
- void RegisterMessages() override;
-};
+ DialogWebContentsObserver(content::WebContents* web_contents,
+ SigninEmailConfirmationDialog* dialog)
+ : content::WebContentsObserver(web_contents),
+ signin_email_confirmation_dialog_(dialog) {}
+ ~DialogWebContentsObserver() override {}
+
+ private:
+ void WebContentsDestroyed() override {
+ // The dialog is already closed. No need to call CloseDialog() again.
+ // NOTE: |this| is deleted after |ResetDialogObserver| returns.
+ signin_email_confirmation_dialog_->ResetDialogObserver();
+ }
-EmailConfirmationHandler::EmailConfirmationHandler() {}
-EmailConfirmationHandler::~EmailConfirmationHandler() {}
-void EmailConfirmationHandler::RegisterMessages() {}
+ void RenderProcessGone(base::TerminationStatus status) override {
+ signin_email_confirmation_dialog_->CloseDialog();
+ }
-} // namespace
+ SigninEmailConfirmationDialog* signin_email_confirmation_dialog_;
+};
SigninEmailConfirmationDialog::SigninEmailConfirmationDialog(
content::WebContents* contents,
@@ -55,8 +70,7 @@ SigninEmailConfirmationDialog::SigninEmailConfirmationDialog(
profile_(profile),
last_email_(last_email),
new_email_(new_email),
- callback_(callback),
- dialog_delegate_(NULL) {}
+ callback_(callback) {}
SigninEmailConfirmationDialog::~SigninEmailConfirmationDialog() {}
@@ -71,16 +85,45 @@ void SigninEmailConfirmationDialog::AskForConfirmation(
base::UserMetricsAction("Signin_Show_ImportDataPrompt"));
SigninEmailConfirmationDialog* dialog = new SigninEmailConfirmationDialog(
contents, profile, last_email, email, callback);
- dialog->Show();
+ dialog->ShowDialog();
}
-void SigninEmailConfirmationDialog::Show() {
+void SigninEmailConfirmationDialog::ShowDialog() {
gfx::Size minSize(kDialogWidth, kDialogMinHeight);
gfx::Size maxSize(kDialogWidth, kDialogMaxHeight);
- dialog_delegate_ = ShowConstrainedWebDialogWithAutoResize(
- profile_, this, web_contents_, minSize, maxSize);
+ ConstrainedWebDialogDelegate* dialog_delegate =
+ ShowConstrainedWebDialogWithAutoResize(profile_, this, web_contents_,
+ minSize, maxSize);
+
+ content::WebContents* dialog_web_contents = dialog_delegate->GetWebContents();
+ dialog_observer_.reset(
+ new DialogWebContentsObserver(dialog_web_contents, this));
}
+void SigninEmailConfirmationDialog::CloseDialog() {
+ content::WebContents* dialog_web_contents = GetDialogWebContents();
+ if (dialog_web_contents == nullptr)
+ return;
+ content::WebUI* web_ui = dialog_web_contents->GetWebUI();
+ if (web_ui) {
+ SigninEmailConfirmationUI* signin_email_confirmation_ui =
+ static_cast<SigninEmailConfirmationUI*>(web_ui->GetController());
+ if (signin_email_confirmation_ui)
+ signin_email_confirmation_ui->Close();
+ }
+}
+
+void SigninEmailConfirmationDialog::ResetDialogObserver() {
+ dialog_observer_.reset();
+}
+
+content::WebContents* SigninEmailConfirmationDialog::GetDialogWebContents()
+ const {
+ return dialog_observer_.get() ? dialog_observer_->web_contents() : nullptr;
+}
+
+// ui::WebDialogDelegate implementation
+
ui::ModalType SigninEmailConfirmationDialog::GetDialogModalType() const {
return ui::MODAL_TYPE_WINDOW;
}
@@ -94,9 +137,7 @@ GURL SigninEmailConfirmationDialog::GetDialogContentURL() const {
}
void SigninEmailConfirmationDialog::GetWebUIMessageHandlers(
- std::vector<content::WebUIMessageHandler*>* handlers) const {
- handlers->push_back(new EmailConfirmationHandler());
-}
+ std::vector<content::WebUIMessageHandler*>* handlers) const {}
void SigninEmailConfirmationDialog::GetDialogSize(gfx::Size* size) const {
// Avoid setting a dialog size in here as this dialog auto-resizes (see

Powered by Google App Engine
This is Rietveld 408576698