普通文本  |  73行  |  2.33 KB

// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/test/automation/automation_handle_tracker.h"

#include "chrome/common/automation_messages.h"
#include "chrome/test/automation/automation_proxy.h"

AutomationResourceProxy::AutomationResourceProxy(
    AutomationHandleTracker* tracker, AutomationMessageSender* sender,
    AutomationHandle handle)
    : handle_(handle),
      tracker_(tracker),
      sender_(sender),
      is_valid_(true) {
      tracker_->Add(this);
}

AutomationResourceProxy::~AutomationResourceProxy() {
  if (tracker_)
    tracker_->Remove(this);
}

AutomationHandleTracker::AutomationHandleTracker() : channel_(NULL) {}

AutomationHandleTracker::~AutomationHandleTracker() {
  // Tell any live objects that the tracker is going away so they don't try to
  // call us when they are being destroyed.
  for (HandleToObjectMap::iterator iter = handle_to_object_.begin();
       iter != handle_to_object_.end(); ++iter) {
    iter->second->Invalidate();
  }
}

void AutomationHandleTracker::Add(AutomationResourceProxy* proxy) {
  base::AutoLock lock(map_lock_);
  handle_to_object_.insert(MapEntry(proxy->handle(), proxy));
}

void AutomationHandleTracker::Remove(AutomationResourceProxy* proxy) {
  base::AutoLock lock(map_lock_);
  HandleToObjectMap::iterator iter = handle_to_object_.find(proxy->handle());
  if (iter != handle_to_object_.end()) {
    AutomationHandle proxy_handle = proxy->handle();
    handle_to_object_.erase(iter);
    if (channel_)
      channel_->Send(new AutomationMsg_HandleUnused(proxy_handle));
  }
}

void AutomationHandleTracker::InvalidateHandle(AutomationHandle handle) {
  // Called in background thread.
  base::AutoLock lock(map_lock_);
  HandleToObjectMap::iterator iter = handle_to_object_.find(handle);
  if (iter != handle_to_object_.end()) {
    scoped_refptr<AutomationResourceProxy> proxy = iter->second;
    handle_to_object_.erase(iter);
    proxy->Invalidate();
  }
}

AutomationResourceProxy* AutomationHandleTracker::GetResource(
    AutomationHandle handle) {
  base::AutoLock lock(map_lock_);
  HandleToObjectMap::iterator iter = handle_to_object_.find(handle);
  if (iter == handle_to_object_.end())
    return NULL;

  iter->second->AddRef();
  return iter->second.get();
}