1// Copyright (c) 2011 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/automation/automation_tab_tracker.h"
6
7#include "content/browser/tab_contents/navigation_controller.h"
8#include "content/common/notification_source.h"
9#include "content/common/notification_type.h"
10
11AutomationTabTracker::AutomationTabTracker(IPC::Message::Sender* automation)
12    : AutomationResourceTracker<NavigationController*>(automation) {
13}
14
15AutomationTabTracker::~AutomationTabTracker() {
16}
17
18void AutomationTabTracker::AddObserver(NavigationController* resource) {
19  // This tab could either be a regular tab or an external tab
20  // Register for both notifications.
21  registrar_.Add(this, NotificationType::TAB_CLOSING,
22                 Source<NavigationController>(resource));
23  registrar_.Add(this, NotificationType::EXTERNAL_TAB_CLOSED,
24                 Source<NavigationController>(resource));
25  // We also want to know about navigations so we can keep track of the last
26  // navigation time.
27  registrar_.Add(this, NotificationType::LOAD_STOP,
28                 Source<NavigationController>(resource));
29}
30
31void AutomationTabTracker::RemoveObserver(NavigationController* resource) {
32  registrar_.Remove(this, NotificationType::TAB_CLOSING,
33                    Source<NavigationController>(resource));
34  registrar_.Remove(this, NotificationType::EXTERNAL_TAB_CLOSED,
35                    Source<NavigationController>(resource));
36  registrar_.Remove(this, NotificationType::LOAD_STOP,
37                    Source<NavigationController>(resource));
38}
39
40void AutomationTabTracker::Observe(NotificationType type,
41                                   const NotificationSource& source,
42                                   const NotificationDetails& details) {
43  switch (type.value) {
44    case NotificationType::LOAD_STOP:
45      last_navigation_times_[Source<NavigationController>(source).ptr()] =
46          base::Time::Now();
47      return;
48    case NotificationType::EXTERNAL_TAB_CLOSED:
49    case NotificationType::TAB_CLOSING:
50      {
51        std::map<NavigationController*, base::Time>::iterator iter =
52            last_navigation_times_.find(
53                Source<NavigationController>(source).ptr());
54        if (iter != last_navigation_times_.end())
55          last_navigation_times_.erase(iter);
56      }
57      break;
58    default:
59      NOTREACHED();
60  }
61  AutomationResourceTracker<NavigationController*>::Observe(type, source,
62                                                            details);
63}
64
65base::Time AutomationTabTracker::GetLastNavigationTime(int handle) {
66  if (ContainsHandle(handle)) {
67    NavigationController* controller = GetResource(handle);
68    if (controller) {
69      std::map<NavigationController*, base::Time>::const_iterator iter =
70          last_navigation_times_.find(controller);
71      if (iter != last_navigation_times_.end())
72        return iter->second;
73    }
74  }
75  return base::Time();
76}
77