// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/repost_form_warning_controller.h" #include "content/browser/tab_contents/tab_contents.h" #include "content/common/notification_source.h" RepostFormWarningController::RepostFormWarningController( TabContents* tab_contents) : tab_contents_(tab_contents), window_(NULL) { NavigationController* controller = &tab_contents->controller(); registrar_.Add(this, NotificationType::LOAD_START, Source(controller)); registrar_.Add(this, NotificationType::TAB_CLOSING, Source(controller)); registrar_.Add(this, NotificationType::REPOST_WARNING_SHOWN, Source(controller)); } RepostFormWarningController::~RepostFormWarningController() { // If we end up here, the constrained window has been closed, so make sure we // don't close it again. window_ = NULL; // Make sure everything is cleaned up. Cancel(); } void RepostFormWarningController::Show( ConstrainedWindowDelegate* window_delegate) { window_ = tab_contents_->CreateConstrainedDialog(window_delegate); } void RepostFormWarningController::Cancel() { if (tab_contents_) { tab_contents_->controller().CancelPendingReload(); CloseDialog(); } } void RepostFormWarningController::Continue() { if (tab_contents_) { tab_contents_->controller().ContinuePendingReload(); // If we reload the page, the dialog will be closed anyway. } } void RepostFormWarningController::Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { // Close the dialog if we load a page (because reloading might not apply to // the same page anymore) or if the tab is closed, because then we won't have // a navigation controller anymore. if (tab_contents_ && (type == NotificationType::LOAD_START || type == NotificationType::TAB_CLOSING || type == NotificationType::REPOST_WARNING_SHOWN)) { DCHECK_EQ(Source(source).ptr(), &tab_contents_->controller()); Cancel(); } } void RepostFormWarningController::CloseDialog() { // Make sure we won't do anything when |Cancel()| is called again. tab_contents_ = NULL; if (window_) { window_->CloseConstrainedWindow(); } }