1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/google/core/browser/google_url_tracker_map_entry.h"
6
7#include "components/google/core/browser/google_url_tracker.h"
8#include "components/infobars/core/infobar.h"
9
10GoogleURLTrackerMapEntry::GoogleURLTrackerMapEntry(
11    GoogleURLTracker* google_url_tracker,
12    infobars::InfoBarManager* infobar_manager,
13    scoped_ptr<GoogleURLTrackerNavigationHelper> navigation_helper)
14    : google_url_tracker_(google_url_tracker),
15      infobar_manager_(infobar_manager),
16      infobar_delegate_(NULL),
17      navigation_helper_(navigation_helper.Pass()),
18      observing_(false) {
19  DCHECK(infobar_manager_);
20}
21
22GoogleURLTrackerMapEntry::~GoogleURLTrackerMapEntry() {
23  if (observing_)
24    infobar_manager_->RemoveObserver(this);
25}
26
27void GoogleURLTrackerMapEntry::SetInfoBarDelegate(
28    GoogleURLTrackerInfoBarDelegate* infobar_delegate) {
29  DCHECK(!infobar_delegate_);
30
31  // Transfer ownership of |navigation_helper_| to the infobar delegate as the
32  // infobar delegate has need of it after this object has been destroyed in
33  // the case where the user accepts the new Google URL.
34  infobar_delegate->set_navigation_helper(navigation_helper_.Pass());
35  infobar_delegate_ = infobar_delegate;
36  infobar_manager_->AddObserver(this);
37  observing_ = true;
38}
39
40void GoogleURLTrackerMapEntry::Close(bool redo_search) {
41  if (infobar_delegate_) {
42    infobar_delegate_->Close(redo_search);
43  } else {
44    // WARNING: |infobar_manager_| may point to a deleted object.  Do not
45    // dereference it!  See GoogleURLTracker::OnTabClosed().
46    google_url_tracker_->DeleteMapEntryForManager(infobar_manager_);
47  }
48  // WARNING: At this point |this| has been deleted!
49}
50
51void GoogleURLTrackerMapEntry::OnInfoBarRemoved(infobars::InfoBar* infobar,
52                                                bool animate) {
53  DCHECK(infobar_delegate_);
54  if (infobar->delegate() == infobar_delegate_) {
55    google_url_tracker_->DeleteMapEntryForManager(infobar_manager_);
56    // WARNING: At this point |this| has been deleted!
57  }
58}
59
60void GoogleURLTrackerMapEntry::OnManagerShuttingDown(
61    infobars::InfoBarManager* manager) {
62  DCHECK(observing_);
63  DCHECK_EQ(infobar_manager_, manager);
64  manager->RemoveObserver(this);
65  observing_ = false;
66}
67