OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 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 // This file defines a mapping between Automation Proxy objects and | |
6 // their associated app-side handles. | |
7 | |
8 #ifndef CHROME_TEST_AUTOMATION_AUTOMATION_HANDLE_TRACKER_H__ | |
9 #define CHROME_TEST_AUTOMATION_AUTOMATION_HANDLE_TRACKER_H__ | |
10 | |
11 #include <map> | |
12 | |
13 #include "base/basictypes.h" | |
14 #include "base/memory/ref_counted.h" | |
15 #include "base/synchronization/lock.h" | |
16 #include "ipc/ipc_channel.h" | |
17 | |
18 // This represents a value that the app's AutomationProvider returns | |
19 // when asked for a resource (like a window or tab). | |
20 typedef int AutomationHandle; | |
21 | |
22 class AutomationHandleTracker; | |
23 class AutomationMessageSender; | |
24 | |
25 class AutomationResourceProxy | |
26 : public base::RefCountedThreadSafe<AutomationResourceProxy> { | |
27 public: | |
28 AutomationResourceProxy(AutomationHandleTracker* tracker, | |
29 AutomationMessageSender* sender, | |
30 AutomationHandle handle); | |
31 | |
32 // Marks this proxy object as no longer valid; this generally means | |
33 // that the corresponding resource on the app side is gone. | |
34 void Invalidate() { | |
35 is_valid_ = false; | |
36 tracker_ = NULL; | |
37 } | |
38 | |
39 bool is_valid() const { return is_valid_; } | |
40 | |
41 // Returns the handle that the app has generated to refer to this resource. | |
42 AutomationHandle handle() { return handle_; } | |
43 | |
44 protected: | |
45 friend class AutomationHandleTracker; | |
46 friend class base::RefCountedThreadSafe<AutomationResourceProxy>; | |
47 | |
48 virtual ~AutomationResourceProxy(); | |
49 | |
50 AutomationHandle handle_; | |
51 | |
52 // Not owned by us, owned by the AutomationProxy object. May be NULL if the | |
53 // tracker has been destroyed (and hence the object is invalid). | |
54 AutomationHandleTracker* tracker_; | |
55 | |
56 // Not owned by us. | |
57 AutomationMessageSender* sender_; | |
58 | |
59 private: | |
60 // True if the resource that this object is a proxy for on the app side | |
61 // still exists. | |
62 bool is_valid_; | |
63 | |
64 DISALLOW_COPY_AND_ASSIGN(AutomationResourceProxy); | |
65 }; | |
66 | |
67 // This class keeps track of the mapping between AutomationHandles and | |
68 // AutomationResourceProxy objects. This is important because (1) multiple | |
69 // AutomationResourceProxy objects can be generated for the same handle | |
70 // (2) handles can be invalidated by the app, and all the associated | |
71 // proxy objects then need to be invalidated, and (3) when a handle is no | |
72 // longer being used on this end, we need to tell the app that it can | |
73 // discard the handle. | |
74 class AutomationHandleTracker { | |
75 public: | |
76 explicit AutomationHandleTracker(); | |
77 ~AutomationHandleTracker(); | |
78 | |
79 // Adds the specified proxy object to the tracker. | |
80 void Add(AutomationResourceProxy* proxy); | |
81 | |
82 // Removes a given proxy object from the mapping, and unregisters the | |
83 // handle on the app side if this was the last proxy object that was using | |
84 // that handle. This is a no-op if the proxy object is not currently | |
85 // in the tracker. | |
86 void Remove(AutomationResourceProxy* proxy); | |
87 | |
88 // Marks all proxy objects related to a given handle invalid. This is | |
89 // used when a resource (like a window) on the app side is closed, meaning | |
90 // that no further operations can be completed using the handle that | |
91 // identified that resource. | |
92 void InvalidateHandle(AutomationHandle handle); | |
93 | |
94 AutomationResourceProxy* GetResource(AutomationHandle handle); | |
95 | |
96 void put_channel(IPC::Channel* channel) { | |
97 channel_ = channel; | |
98 } | |
99 | |
100 private: | |
101 typedef | |
102 std::map<AutomationHandle, scoped_refptr<AutomationResourceProxy> > | |
103 HandleToObjectMap; | |
104 typedef std::pair<AutomationHandle, AutomationResourceProxy*> MapEntry; | |
105 | |
106 HandleToObjectMap handle_to_object_; | |
107 | |
108 base::Lock map_lock_; | |
109 IPC::Channel* channel_; | |
110 DISALLOW_COPY_AND_ASSIGN(AutomationHandleTracker); | |
111 }; | |
112 | |
113 #endif // CHROME_TEST_AUTOMATION_AUTOMATION_HANDLE_TRACKER_H__ | |
OLD | NEW |