| 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 |