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