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