Home | History | Annotate | Download | only in automation
      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