| Index: content/renderer/media/media_devices_event_dispatcher.h
 | 
| diff --git a/content/renderer/media/media_devices_event_dispatcher.h b/content/renderer/media/media_devices_event_dispatcher.h
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..c5e241e482e481119049fd7bb9e18777d8d00df8
 | 
| --- /dev/null
 | 
| +++ b/content/renderer/media/media_devices_event_dispatcher.h
 | 
| @@ -0,0 +1,111 @@
 | 
| +// Copyright 2016 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 CONTENT_RENDERER_MEDIA_MEDIA_DEVICES_EVENT_DISPATCHER_H_
 | 
| +#define CONTENT_RENDERER_MEDIA_MEDIA_DEVICES_EVENT_DISPATCHER_H_
 | 
| +
 | 
| +#include <stdint.h>
 | 
| +
 | 
| +#include <utility>
 | 
| +#include <vector>
 | 
| +
 | 
| +#include "base/macros.h"
 | 
| +#include "base/memory/weak_ptr.h"
 | 
| +#include "base/threading/thread_checker.h"
 | 
| +#include "content/common/content_export.h"
 | 
| +#include "content/common/media/media_devices.h"
 | 
| +#include "content/common/media/media_devices.mojom.h"
 | 
| +#include "content/public/renderer/render_frame_observer.h"
 | 
| +#include "content/public/renderer/render_frame_observer_tracker.h"
 | 
| +
 | 
| +namespace url {
 | 
| +class Origin;
 | 
| +}
 | 
| +
 | 
| +namespace content {
 | 
| +
 | 
| +// This class implements the logic for managing media device-change
 | 
| +// subscriptions on the renderer process. It manages the generation of
 | 
| +// subscription IDs and  handles the interaction with the Mojo objects that
 | 
| +// communicate with the  browser process. There is at most one instance of this
 | 
| +// class per frame.
 | 
| +class CONTENT_EXPORT MediaDevicesEventDispatcher
 | 
| +    : public RenderFrameObserver,
 | 
| +      public RenderFrameObserverTracker<MediaDevicesEventDispatcher>,
 | 
| +      public base::SupportsWeakPtr<MediaDevicesEventDispatcher> {
 | 
| + public:
 | 
| +  using SubscriptionId = uint32_t;
 | 
| +  using SubscriptionIdList = std::vector<SubscriptionId>;
 | 
| +  using DevicesChangedCallback =
 | 
| +      base::Callback<void(MediaDeviceType, const MediaDeviceInfoArray&)>;
 | 
| +
 | 
| +  // Returns a weak pointer to the MediaDevicesEventDispatcher for the given
 | 
| +  // |render_frame|.
 | 
| +  static base::WeakPtr<MediaDevicesEventDispatcher> GetForRenderFrame(
 | 
| +      RenderFrame* render_frame);
 | 
| +
 | 
| +  ~MediaDevicesEventDispatcher() override;
 | 
| +
 | 
| +  // Register a callback for device-change notifications for a given device
 | 
| +  // type. Returns a subscription ID that can be used to cancel the
 | 
| +  // subscription.
 | 
| +  SubscriptionId SubscribeDeviceChangeNotifications(
 | 
| +      MediaDeviceType type,
 | 
| +      const url::Origin& security_origin,
 | 
| +      const DevicesChangedCallback& callback);
 | 
| +
 | 
| +  // Cancels a subscription identified with |subscription_id| to device-change
 | 
| +  // notifications for device type |type|. If no subscription identified with
 | 
| +  // |subscription_id| exists for device type |type|, this function returns
 | 
| +  // without side effects.
 | 
| +  void UnsubscribeDeviceChangeNotifications(MediaDeviceType type,
 | 
| +                                            SubscriptionId subscription_id);
 | 
| +
 | 
| +  // Register a callback for device-change notifications for any device type.
 | 
| +  // Returns a list of subscription IDs that can be used to cancel the
 | 
| +  // subscriptions.
 | 
| +  SubscriptionIdList SubscribeDeviceChangeNotifications(
 | 
| +      const url::Origin& security_origin,
 | 
| +      const DevicesChangedCallback& callback);
 | 
| +
 | 
| +  // Cancels subscriptions identified by |subscription_ids| to device-change
 | 
| +  // notifications for all device types. This is implemented by invoking the
 | 
| +  // single-parameter version of UnsubscribeDeviceChangeNotifications() for all
 | 
| +  // device types.
 | 
| +  void UnsubscribeDeviceChangeNotifications(
 | 
| +      const SubscriptionIdList& subscription_ids);
 | 
| +
 | 
| +  // Dispatches an event notification to all registered callbacks for device
 | 
| +  // type |type|. Should be invoked only by an object that detects changes in
 | 
| +  // the set of media devices.
 | 
| +  void DispatchDevicesChangedEvent(MediaDeviceType type,
 | 
| +                                   const MediaDeviceInfoArray& device_infos);
 | 
| +
 | 
| +  // RenderFrameObserver override.
 | 
| +  void OnDestruct() override;
 | 
| +
 | 
| +  void SetMediaDevicesDispatcherForTesting(
 | 
| +      ::mojom::MediaDevicesDispatcherHostPtr media_devices_dispatcher);
 | 
| +
 | 
| + private:
 | 
| +  explicit MediaDevicesEventDispatcher(RenderFrame* render_frame);
 | 
| +
 | 
| +  const ::mojom::MediaDevicesDispatcherHostPtr& GetMediaDevicesDispatcher();
 | 
| +
 | 
| +  SubscriptionId current_id_;
 | 
| +
 | 
| +  using Subscription = std::pair<SubscriptionId, DevicesChangedCallback>;
 | 
| +  using SubscriptionList = std::vector<Subscription>;
 | 
| +  SubscriptionList device_change_subscriptions_[NUM_MEDIA_DEVICE_TYPES];
 | 
| +
 | 
| +  ::mojom::MediaDevicesDispatcherHostPtr media_devices_dispatcher_;
 | 
| +
 | 
| +  base::ThreadChecker thread_checker_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(MediaDevicesEventDispatcher);
 | 
| +};
 | 
| +
 | 
| +}  // namespace content
 | 
| +
 | 
| +#endif  // CONTENT_RENDERER_MEDIA_MEDIA_DEVICES_EVENT_DISPATCHER_H_
 | 
| 
 |