1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/repost_form_warning_controller.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRepostFormWarningController::RepostFormWarningController(
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TabContents* tab_contents)
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : tab_contents_(tab_contents),
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      window_(NULL) {
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationController* controller = &tab_contents->controller();
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::LOAD_START,
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 Source<NavigationController>(controller));
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::TAB_CLOSING,
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 Source<NavigationController>(controller));
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::REPOST_WARNING_SHOWN,
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 Source<NavigationController>(controller));
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRepostFormWarningController::~RepostFormWarningController() {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If we end up here, the constrained window has been closed, so make sure we
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // don't close it again.
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window_ = NULL;
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure everything is cleaned up.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Cancel();
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RepostFormWarningController::Show(
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ConstrainedWindowDelegate* window_delegate) {
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  window_ = tab_contents_->CreateConstrainedDialog(window_delegate);
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RepostFormWarningController::Cancel() {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (tab_contents_) {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    tab_contents_->controller().CancelPendingReload();
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CloseDialog();
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RepostFormWarningController::Continue() {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (tab_contents_) {
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    tab_contents_->controller().ContinuePendingReload();
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // If we reload the page, the dialog will be closed anyway.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RepostFormWarningController::Observe(NotificationType type,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                const NotificationSource& source,
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                const NotificationDetails& details) {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the dialog if we load a page (because reloading might not apply to
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the same page anymore) or if the tab is closed, because then we won't have
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a navigation controller anymore.
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (tab_contents_ &&
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      (type == NotificationType::LOAD_START ||
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       type == NotificationType::TAB_CLOSING ||
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       type == NotificationType::REPOST_WARNING_SHOWN)) {
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DCHECK_EQ(Source<NavigationController>(source).ptr(),
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              &tab_contents_->controller());
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Cancel();
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid RepostFormWarningController::CloseDialog() {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure we won't do anything when |Cancel()| is called again.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab_contents_ = NULL;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (window_) {
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    window_->CloseConstrainedWindow();
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
73