| Index: chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc
|
| diff --git a/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..52ede1f6ecdca95fa44e0fda2167126b8d3edbba
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc
|
| @@ -0,0 +1,121 @@
|
| +// Copyright 2015 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/ui/autofill/save_card_bubble_controller_impl.h"
|
| +
|
| +#include "chrome/browser/ui/autofill/save_card_bubble_view.h"
|
| +#include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/browser_finder.h"
|
| +#include "chrome/browser/ui/browser_window.h"
|
| +#include "chrome/browser/ui/location_bar/location_bar.h"
|
| +#include "content/public/browser/navigation_details.h"
|
| +
|
| +DEFINE_WEB_CONTENTS_USER_DATA_KEY(autofill::SaveCardBubbleControllerImpl);
|
| +
|
| +namespace {
|
| +
|
| +// Number of seconds the bubble and icon will survive navigations, starting
|
| +// from when the bubble is shown.
|
| +// TODO(bondd): Share with ManagePasswordsUIController.
|
| +const int kSurviveNavigationSeconds = 5;
|
| +
|
| +} // namespace
|
| +
|
| +namespace autofill {
|
| +
|
| +SaveCardBubbleControllerImpl::SaveCardBubbleControllerImpl(
|
| + content::WebContents* web_contents)
|
| + : content::WebContentsObserver(web_contents),
|
| + save_card_bubble_view_(nullptr) {
|
| + DCHECK(web_contents);
|
| +}
|
| +
|
| +SaveCardBubbleControllerImpl::~SaveCardBubbleControllerImpl() {
|
| + if (save_card_bubble_view_)
|
| + save_card_bubble_view_->ControllerGone();
|
| +}
|
| +
|
| +void SaveCardBubbleControllerImpl::SetCallback(
|
| + const base::Closure& save_card_callback) {
|
| + save_card_callback_ = save_card_callback;
|
| +}
|
| +
|
| +void SaveCardBubbleControllerImpl::ShowBubble() {
|
| + DCHECK(!save_card_callback_.is_null());
|
| +
|
| + // Need to create location bar icon before bubble, otherwise bubble will be
|
| + // unanchored.
|
| + UpdateIcon();
|
| +
|
| + Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
|
| + save_card_bubble_view_ =
|
| + browser->window()->ShowSaveCreditCardBubble(web_contents(), this);
|
| + DCHECK(save_card_bubble_view_);
|
| +
|
| + // Update icon after creating |save_card_bubble_view_| so that icon will show
|
| + // its "toggled on" state.
|
| + UpdateIcon();
|
| +
|
| + timer_.reset(new base::ElapsedTimer());
|
| +}
|
| +
|
| +bool SaveCardBubbleControllerImpl::IsIconVisible() const {
|
| + return !save_card_callback_.is_null();
|
| +}
|
| +
|
| +bool SaveCardBubbleControllerImpl::IsIconToggled() const {
|
| + return !!save_card_bubble_view_;
|
| +}
|
| +
|
| +SaveCardBubbleView* SaveCardBubbleControllerImpl::save_card_bubble_view()
|
| + const {
|
| + return save_card_bubble_view_;
|
| +}
|
| +
|
| +void SaveCardBubbleControllerImpl::OnSaveButton() {
|
| + save_card_callback_.Run();
|
| + save_card_callback_.Reset();
|
| +}
|
| +
|
| +void SaveCardBubbleControllerImpl::OnCancelButton() {
|
| + save_card_callback_.Reset();
|
| +}
|
| +
|
| +void SaveCardBubbleControllerImpl::OnBubbleClosed() {
|
| + save_card_bubble_view_ = nullptr;
|
| + UpdateIcon();
|
| +}
|
| +
|
| +void SaveCardBubbleControllerImpl::UpdateIcon() {
|
| + Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
|
| + LocationBar* location_bar = browser->window()->GetLocationBar();
|
| + location_bar->UpdateSaveCreditCardIcon();
|
| +}
|
| +
|
| +void SaveCardBubbleControllerImpl::DidNavigateMainFrame(
|
| + const content::LoadCommittedDetails& details,
|
| + const content::FrameNavigateParams& params) {
|
| + // Nothing to do if there's no bubble available.
|
| + if (save_card_callback_.is_null())
|
| + return;
|
| +
|
| + // Don't react to in-page (fragment) navigations.
|
| + if (details.is_in_page)
|
| + return;
|
| +
|
| + // Don't do anything if a navigation occurs before a user could reasonably
|
| + // interact with the bubble.
|
| + if (timer_->Elapsed() <
|
| + base::TimeDelta::FromSeconds(kSurviveNavigationSeconds))
|
| + return;
|
| +
|
| + // Otherwise, get rid of the bubble and icon.
|
| + save_card_callback_.Reset();
|
| + if (save_card_bubble_view_)
|
| + save_card_bubble_view_->Close();
|
| + else
|
| + UpdateIcon();
|
| +}
|
| +
|
| +} // namespace autofill
|
|
|