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