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 AutomationResourceProxy(AutomationHandleTracker * tracker,AutomationMessageSender * sender,AutomationHandle handle)10AutomationResourceProxy::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 ~AutomationResourceProxy()20AutomationResourceProxy::~AutomationResourceProxy() { 21 if (tracker_) 22 tracker_->Remove(this); 23 } 24 AutomationHandleTracker()25AutomationHandleTracker::AutomationHandleTracker() : channel_(NULL) {} 26 ~AutomationHandleTracker()27AutomationHandleTracker::~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 Add(AutomationResourceProxy * proxy)36void AutomationHandleTracker::Add(AutomationResourceProxy* proxy) { 37 base::AutoLock lock(map_lock_); 38 handle_to_object_.insert(MapEntry(proxy->handle(), proxy)); 39 } 40 Remove(AutomationResourceProxy * proxy)41void 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 InvalidateHandle(AutomationHandle handle)52void 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 GetResource(AutomationHandle handle)63AutomationResourceProxy* 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