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