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 11 AutomationTabTracker::AutomationTabTracker(IPC::Message::Sender* automation) 12 : AutomationResourceTracker<NavigationController*>(automation) { 13 } 14 15 AutomationTabTracker::~AutomationTabTracker() { 16 } 17 18 void 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 31 void 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 40 void 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 65 base::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