- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / test / automation / automation_handle_tracker.cc
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 }