diff options
Diffstat (limited to 'chrome/browser/automation/automation_resource_tracker.h')
-rw-r--r-- | chrome/browser/automation/automation_resource_tracker.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/chrome/browser/automation/automation_resource_tracker.h b/chrome/browser/automation/automation_resource_tracker.h new file mode 100644 index 0000000..58703e7 --- /dev/null +++ b/chrome/browser/automation/automation_resource_tracker.h @@ -0,0 +1,158 @@ +// Copyright (c) 2010 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. + +#ifndef CHROME_BROWSER_AUTOMATION_AUTOMATION_RESOURCE_TRACKER_H__ +#define CHROME_BROWSER_AUTOMATION_AUTOMATION_RESOURCE_TRACKER_H__ + +#include <map> + +#include "base/basictypes.h" +#include "chrome/common/notification_observer.h" +#include "chrome/common/notification_registrar.h" +#include "chrome/common/notification_type.h" +#include "ipc/ipc_message.h" + +template <class T> class Source; + +// Template trick so that AutomationResourceTracker can be used with non-pointer +// types. +template <class T> +struct AutomationResourceTraits { + typedef T ValueType; +}; + +template <class T> +struct AutomationResourceTraits<T*> { + typedef T ValueType; +}; + +// This class exists for the sole purpose of allowing some of the implementation +// of AutomationResourceTracker to live in a .cc file. +class AutomationResourceTrackerImpl { + public: + explicit AutomationResourceTrackerImpl(IPC::Message::Sender* sender) + : sender_(sender) {} + + virtual ~AutomationResourceTrackerImpl() {} + + // These need to be implemented in AutomationResourceTracker, + // since it needs to call the subclass's type-specific notification + // registration functions. + virtual void AddObserverTypeProxy(void* resource) = 0; + virtual void RemoveObserverTypeProxy(void* resource) = 0; + + int AddImpl(void* resource); + void RemoveImpl(void* resource); + int GenerateHandle(); + bool ContainsResourceImpl(void* resource); + bool ContainsHandleImpl(int handle); + void* GetResourceImpl(int handle); + int GetHandleImpl(void* resource); + void HandleCloseNotification(void* resource); + + protected: + typedef std::map<void*, int> ResourceToHandleMap; + typedef std::map<int, void*> HandleToResourceMap; + ResourceToHandleMap resource_to_handle_; + HandleToResourceMap handle_to_resource_; + + private: + DISALLOW_COPY_AND_ASSIGN(AutomationResourceTrackerImpl); + + IPC::Message::Sender* sender_; +}; + +// This template defines a superclass for an object that wants to track +// a particular kind of application resource (like windows or tabs) for +// automation purposes. The only things that a subclass should need to +// define are AddObserver and RemoveObserver for the given resource's +// close notifications. +template <class T> +class AutomationResourceTracker : public NotificationObserver, + private AutomationResourceTrackerImpl { + public: + explicit AutomationResourceTracker(IPC::Message::Sender* automation) + : AutomationResourceTrackerImpl(automation) {} + + virtual ~AutomationResourceTracker() { + } + + // The implementations for these should call the NotificationService + // to add and remove this object as an observer for the appropriate + // resource closing notification. + virtual void AddObserver(T resource) = 0; + virtual void RemoveObserver(T resource) = 0; + + // Adds the given resource to this tracker, and returns a handle that + // can be used to refer to that resource. If the resource is already + // being tracked, the handle may be the same as one returned previously. + int Add(T resource) { + return AddImpl(resource); + } + + // Removes the given resource from this tracker. If the resource is not + // currently present in the tracker, this is a no-op. + void Remove(T resource) { + RemoveImpl(resource); + } + + // Returns true if this tracker currently tracks the resource pointed to + // by the parameter. + bool ContainsResource(T resource) { + return ContainsResourceImpl(resource); + } + + // Returns true if this tracker currently tracks the given handle. + bool ContainsHandle(int handle) { + return ContainsHandleImpl(handle); + } + + // Returns the resource pointer associated with a given handle, or NULL + // if that handle is not present in the mapping. + T GetResource(int handle) { + return static_cast<T>(GetResourceImpl(handle)); + } + + // Returns the handle associated with a given resource pointer, or 0 if + // the resource is not currently in the mapping. + int GetHandle(T resource) { + return GetHandleImpl(resource); + } + + // NotificationObserver implementation--the only thing that this tracker + // does in response to notifications is to tell the AutomationProxy + // that the associated handle is now invalid. + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + T resource = + Source<typename AutomationResourceTraits<T>::ValueType>(source).ptr(); + + CloseResource(resource); + } + + protected: + // Removes |resource| from the tracker, and handles sending the close + // notification back to the client. This typically should not be called + // directly, unless there is no appropriate notification available + // for the resource type. + void CloseResource(T resource) { + HandleCloseNotification(resource); + } + + NotificationRegistrar registrar_; + + private: + // These proxy calls from the base Impl class to the template's subclss. + virtual void AddObserverTypeProxy(void* resource) { + AddObserver(static_cast<T>(resource)); + } + virtual void RemoveObserverTypeProxy(void* resource) { + RemoveObserver(static_cast<T>(resource)); + } + + DISALLOW_COPY_AND_ASSIGN(AutomationResourceTracker); +}; + +#endif // CHROME_BROWSER_AUTOMATION_AUTOMATION_RESOURCE_TRACKER_H__ |