| Index: content/browser/gamepad/gamepad_service.h
 | 
| diff --git a/content/browser/gamepad/gamepad_service.h b/content/browser/gamepad/gamepad_service.h
 | 
| index 94620b34b60f901c8b1bfb4865d3092eeb313ee8..60081884228fd400b360f60f69b7fb74fc51c127 100644
 | 
| --- a/content/browser/gamepad/gamepad_service.h
 | 
| +++ b/content/browser/gamepad/gamepad_service.h
 | 
| @@ -5,6 +5,8 @@
 | 
|  #ifndef CONTENT_BROWSER_GAMEPAD_GAMEPAD_SERVICE_H
 | 
|  #define CONTENT_BROWSER_GAMEPAD_GAMEPAD_SERVICE_H
 | 
|  
 | 
| +#include <set>
 | 
| +
 | 
|  #include "base/basictypes.h"
 | 
|  #include "base/callback_forward.h"
 | 
|  #include "base/memory/scoped_ptr.h"
 | 
| @@ -13,8 +15,13 @@
 | 
|  #include "base/threading/thread_checker.h"
 | 
|  #include "content/common/content_export.h"
 | 
|  
 | 
| +namespace blink {
 | 
| +class WebGamepad;
 | 
| +}
 | 
| +
 | 
|  namespace content {
 | 
|  
 | 
| +class GamepadConsumer;
 | 
|  class GamepadDataFetcher;
 | 
|  class GamepadProvider;
 | 
|  class GamepadServiceTestConstructor;
 | 
| @@ -30,14 +37,28 @@ class CONTENT_EXPORT GamepadService {
 | 
|  
 | 
|    // Increments the number of users of the provider. The Provider is running
 | 
|    // when there's > 0 users, and is paused when the count drops to 0.
 | 
| +  // consumer is registered to listen for gamepad connections. If this is the
 | 
| +  // first time it is added to the set of consumers it will be treated
 | 
| +  // specially: it will not be informed about connections before a new user
 | 
| +  // gesture is observed at which point it will be notified for every connected
 | 
| +  // gamepads.
 | 
|    //
 | 
|    // Must be called on the I/O thread.
 | 
| -  void AddConsumer();
 | 
| +  void ConsumerBecameActive(GamepadConsumer* consumer);
 | 
|  
 | 
| -  // Removes a consumer. Should be matched with an AddConsumer call.
 | 
| +  // Decrements the number of users of the provider. consumer will not be
 | 
| +  // informed about connections until it's added back via ConsumerBecameActive.
 | 
| +  // Must be matched with a ConsumerBecameActive call.
 | 
|    //
 | 
|    // Must be called on the I/O thread.
 | 
| -  void RemoveConsumer();
 | 
| +  void ConsumerBecameInactive(GamepadConsumer* consumer);
 | 
| +
 | 
| +  // Decrements the number of users of the provider and removes consumer from
 | 
| +  // the set of consumers. Should be matched with a a ConsumerBecameActive
 | 
| +  // call.
 | 
| +  //
 | 
| +  // Must be called on the I/O thread.
 | 
| +  void RemoveConsumer(GamepadConsumer* consumer);
 | 
|  
 | 
|    // Registers the given closure for calling when the user has interacted with
 | 
|    // the device. This callback will only be issued once. Should only be called
 | 
| @@ -52,6 +73,12 @@ class CONTENT_EXPORT GamepadService {
 | 
|    // Stop/join with the background thread in GamepadProvider |provider_|.
 | 
|    void Terminate();
 | 
|  
 | 
| +  // Called on IO thread when a gamepad is connected.
 | 
| +  void OnGamepadConnected(int index, const blink::WebGamepad& pad);
 | 
| +
 | 
| +  // Called on IO thread when a gamepad is disconnected.
 | 
| +  void OnGamepadDisconnected(int index, const blink::WebGamepad& pad);
 | 
| +
 | 
|   private:
 | 
|    friend struct DefaultSingletonTraits<GamepadService>;
 | 
|    friend class GamepadServiceTestConstructor;
 | 
| @@ -64,11 +91,34 @@ class CONTENT_EXPORT GamepadService {
 | 
|  
 | 
|    virtual ~GamepadService();
 | 
|  
 | 
| -  int num_readers_;
 | 
| +  void OnUserGesture();
 | 
| +
 | 
| +  struct ConsumerInfo {
 | 
| +    ConsumerInfo(GamepadConsumer* consumer)
 | 
| +        : consumer(consumer),
 | 
| +          did_observe_user_gesture(false) {
 | 
| +    }
 | 
| +
 | 
| +    bool operator<(const ConsumerInfo& other) const {
 | 
| +      return consumer < other.consumer;
 | 
| +    }
 | 
| +
 | 
| +    GamepadConsumer* consumer;
 | 
| +    mutable bool is_active;
 | 
| +    mutable bool did_observe_user_gesture;
 | 
| +  };
 | 
| +
 | 
|    scoped_ptr<GamepadProvider> provider_;
 | 
|  
 | 
|    base::ThreadChecker thread_checker_;
 | 
|  
 | 
| +  typedef std::set<ConsumerInfo> ConsumerSet;
 | 
| +  ConsumerSet consumers_;
 | 
| +
 | 
| +  int num_active_consumers_;
 | 
| +
 | 
| +  bool gesture_callback_pending_;
 | 
| +
 | 
|    DISALLOW_COPY_AND_ASSIGN(GamepadService);
 | 
|  };
 | 
|  
 | 
| 
 |