Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / google / google_url_tracker_map_entry.cc
1 // Copyright (c) 2012 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 "chrome/browser/google/google_url_tracker_map_entry.h"
6
7 #include "chrome/browser/chrome_notification_types.h"
8 #include "chrome/browser/google/google_url_tracker.h"
9 #include "chrome/browser/google/google_url_tracker_infobar_delegate.h"
10 #include "components/infobars/core/infobar.h"
11 #include "content/public/browser/notification_details.h"
12 #include "content/public/browser/notification_source.h"
13
14
15 GoogleURLTrackerMapEntry::GoogleURLTrackerMapEntry(
16     GoogleURLTracker* google_url_tracker,
17     InfoBarService* infobar_service,
18     const content::NavigationController* navigation_controller)
19     : google_url_tracker_(google_url_tracker),
20       infobar_service_(infobar_service),
21       infobar_delegate_(NULL),
22       navigation_controller_(navigation_controller) {
23 }
24
25 GoogleURLTrackerMapEntry::~GoogleURLTrackerMapEntry() {
26 }
27
28 void GoogleURLTrackerMapEntry::Observe(
29     int type,
30     const content::NotificationSource& source,
31     const content::NotificationDetails& details) {
32   DCHECK(infobar_delegate_);
33   DCHECK_EQ(chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, type);
34   DCHECK_EQ(infobar_service_, content::Source<InfoBarService>(source).ptr());
35   if (content::Details<infobars::InfoBar::RemovedDetails>(
36           details)->first->delegate() == infobar_delegate_) {
37     google_url_tracker_->DeleteMapEntryForService(infobar_service_);
38     // WARNING: At this point |this| has been deleted!
39   }
40 }
41
42 void GoogleURLTrackerMapEntry::SetInfoBarDelegate(
43     GoogleURLTrackerInfoBarDelegate* infobar_delegate) {
44   DCHECK(!infobar_delegate_);
45   infobar_delegate_ = infobar_delegate;
46   registrar_.Add(this, chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
47                  content::Source<InfoBarService>(infobar_service_));
48 }
49
50 void GoogleURLTrackerMapEntry::Close(bool redo_search) {
51   if (infobar_delegate_) {
52     infobar_delegate_->Close(redo_search);
53   } else {
54     // WARNING: |infobar_service_| may point to a deleted object.  Do not
55     // dereference it!  See GoogleURLTracker::OnTabClosed().
56     google_url_tracker_->DeleteMapEntryForService(infobar_service_);
57   }
58   // WARNING: At this point |this| has been deleted!
59 }