Home | History | Annotate | Download | only in automation
      1 // Copyright (c) 2006-2008 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/test/automation/automation_handle_tracker.h"
      6 
      7 #include "chrome/common/automation_messages.h"
      8 #include "chrome/test/automation/automation_proxy.h"
      9 
     10 AutomationResourceProxy::AutomationResourceProxy(
     11     AutomationHandleTracker* tracker, AutomationMessageSender* sender,
     12     AutomationHandle handle)
     13     : handle_(handle),
     14       tracker_(tracker),
     15       sender_(sender),
     16       is_valid_(true) {
     17       tracker_->Add(this);
     18 }
     19 
     20 AutomationResourceProxy::~AutomationResourceProxy() {
     21   if (tracker_)
     22     tracker_->Remove(this);
     23 }
     24 
     25 AutomationHandleTracker::AutomationHandleTracker() : channel_(NULL) {}
     26 
     27 AutomationHandleTracker::~AutomationHandleTracker() {
     28   // Tell any live objects that the tracker is going away so they don't try to
     29   // call us when they are being destroyed.
     30   for (HandleToObjectMap::iterator iter = handle_to_object_.begin();
     31        iter != handle_to_object_.end(); ++iter) {
     32     iter->second->Invalidate();
     33   }
     34 }
     35 
     36 void AutomationHandleTracker::Add(AutomationResourceProxy* proxy) {
     37   base::AutoLock lock(map_lock_);
     38   handle_to_object_.insert(MapEntry(proxy->handle(), proxy));
     39 }
     40 
     41 void AutomationHandleTracker::Remove(AutomationResourceProxy* proxy) {
     42   base::AutoLock lock(map_lock_);
     43   HandleToObjectMap::iterator iter = handle_to_object_.find(proxy->handle());
     44   if (iter != handle_to_object_.end()) {
     45     AutomationHandle proxy_handle = proxy->handle();
     46     handle_to_object_.erase(iter);
     47     if (channel_)
     48       channel_->Send(new AutomationMsg_HandleUnused(proxy_handle));
     49   }
     50 }
     51 
     52 void AutomationHandleTracker::InvalidateHandle(AutomationHandle handle) {
     53   // Called in background thread.
     54   base::AutoLock lock(map_lock_);
     55   HandleToObjectMap::iterator iter = handle_to_object_.find(handle);
     56   if (iter != handle_to_object_.end()) {
     57     scoped_refptr<AutomationResourceProxy> proxy = iter->second;
     58     handle_to_object_.erase(iter);
     59     proxy->Invalidate();
     60   }
     61 }
     62 
     63 AutomationResourceProxy* AutomationHandleTracker::GetResource(
     64     AutomationHandle handle) {
     65   base::AutoLock lock(map_lock_);
     66   HandleToObjectMap::iterator iter = handle_to_object_.find(handle);
     67   if (iter == handle_to_object_.end())
     68     return NULL;
     69 
     70   iter->second->AddRef();
     71   return iter->second.get();
     72 }
     73