tab_modal_confirm_dialog_delegate.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_modal_confirm_dialog_delegate.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
8fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "content/public/browser/navigation_controller.h"
9fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "content/public/browser/notification_source.h"
10fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "content/public/browser/web_contents.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochusing content::NavigationController;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17fb250657ef40d7500f20882d5c9909c1013367d3Ben MurdochTabModalConfirmDialogDelegate::TabModalConfirmDialogDelegate(
18fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    WebContents* web_contents)
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : close_delegate_(NULL),
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      closing_(false) {
21fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  NavigationController* controller = &web_contents->GetController();
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  registrar_.Add(this, content::NOTIFICATION_LOAD_START,
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                 content::Source<NavigationController>(controller));
24fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  registrar_.Add(this, chrome::NOTIFICATION_TAB_CLOSING,
25fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch                 content::Source<NavigationController>(controller));
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabModalConfirmDialogDelegate::~TabModalConfirmDialogDelegate() {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we end up here, the window has been closed, so make sure we don't close
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it again.
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  close_delegate_ = NULL;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure everything is cleaned up.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cancel();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabModalConfirmDialogDelegate::Cancel() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (closing_)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Make sure we won't do anything when another action occurs.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  closing_ = true;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnCanceled();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloseDialog();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabModalConfirmDialogDelegate::Accept() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (closing_)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Make sure we won't do anything when another action occurs.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  closing_ = true;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnAccepted();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CloseDialog();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void TabModalConfirmDialogDelegate::LinkClicked(
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WindowOpenDisposition disposition) {
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (closing_)
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return;
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Make sure we won't do anything when another action occurs.
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  closing_ = true;
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  OnLinkClicked(disposition);
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CloseDialog();
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochvoid TabModalConfirmDialogDelegate::Observe(
65fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    int type,
66fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    const content::NotificationSource& source,
67fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    const content::NotificationDetails& details) {
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Close the dialog if we load a page (because the action might not apply to
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // the same page anymore) or if the tab is closed.
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (type == content::NOTIFICATION_LOAD_START ||
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      type == chrome::NOTIFICATION_TAB_CLOSING) {
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    Close();
73fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  } else {
74fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    NOTREACHED();
75fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  }
76fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch}
77fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void TabModalConfirmDialogDelegate::Close() {
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (closing_)
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return;
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Make sure we won't do anything when another action occurs.
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  closing_ = true;
83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  OnClosed();
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CloseDialog();
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Image* TabModalConfirmDialogDelegate::GetIcon() {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 TabModalConfirmDialogDelegate::GetAcceptButtonTitle() {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_OK);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 TabModalConfirmDialogDelegate::GetCancelButtonTitle() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_CANCEL);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)string16 TabModalConfirmDialogDelegate::GetLinkText() const {
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return string16();
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* TabModalConfirmDialogDelegate::GetAcceptButtonIcon() {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* TabModalConfirmDialogDelegate::GetCancelButtonIcon() {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabModalConfirmDialogDelegate::OnAccepted() {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabModalConfirmDialogDelegate::OnCanceled() {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void TabModalConfirmDialogDelegate::OnLinkClicked(
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    WindowOpenDisposition disposition) {
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void TabModalConfirmDialogDelegate::OnClosed() {
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabModalConfirmDialogDelegate::CloseDialog() {
125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (close_delegate_)
126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    close_delegate_->CloseDialog();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
128