15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/automation/automation_handle_tracker.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/automation_messages.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/automation/automation_proxy.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AutomationResourceProxy::AutomationResourceProxy( 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationHandleTracker* tracker, AutomationMessageSender* sender, 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationHandle handle) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : handle_(handle), 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker_(tracker), 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sender_(sender), 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_valid_(true) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker_->Add(this); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AutomationResourceProxy::~AutomationResourceProxy() { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tracker_) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracker_->Remove(this); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AutomationHandleTracker::AutomationHandleTracker() : channel_(NULL) {} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AutomationHandleTracker::~AutomationHandleTracker() { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell any live objects that the tracker is going away so they don't try to 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // call us when they are being destroyed. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (HandleToObjectMap::iterator iter = handle_to_object_.begin(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != handle_to_object_.end(); ++iter) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter->second->Invalidate(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutomationHandleTracker::Add(AutomationResourceProxy* proxy) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(map_lock_); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle_to_object_.insert(MapEntry(proxy->handle(), proxy)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutomationHandleTracker::Remove(AutomationResourceProxy* proxy) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(map_lock_); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleToObjectMap::iterator iter = handle_to_object_.find(proxy->handle()); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != handle_to_object_.end()) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationHandle proxy_handle = proxy->handle(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle_to_object_.erase(iter); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (channel_) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) channel_->Send(new AutomationMsg_HandleUnused(proxy_handle)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AutomationHandleTracker::InvalidateHandle(AutomationHandle handle) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called in background thread. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(map_lock_); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleToObjectMap::iterator iter = handle_to_object_.find(handle); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter != handle_to_object_.end()) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<AutomationResourceProxy> proxy = iter->second; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle_to_object_.erase(iter); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proxy->Invalidate(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AutomationResourceProxy* AutomationHandleTracker::GetResource( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutomationHandle handle) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock lock(map_lock_); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleToObjectMap::iterator iter = handle_to_object_.find(handle); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == handle_to_object_.end()) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter->second->AddRef(); 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return iter->second.get(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 73