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