1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef CONTENT_BROWSER_MEDIA_CDM_BROWSER_CDM_MANAGER_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define CONTENT_BROWSER_MEDIA_CDM_BROWSER_CDM_MANAGER_H_
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <map>
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string>
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <vector>
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/basictypes.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/callback.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/containers/scoped_ptr_hash_map.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/common/content_export.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/common/media/cdm_messages_enums.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/browser_message_filter.h"
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ipc/ipc_message.h"
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// TODO(xhwang): Drop this when KeyError is moved to a common header.
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "media/base/media_keys.h"
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "url/gurl.h"
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace media {
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class BrowserCdm;
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace content {
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// This class manages all CDM objects. It receives control operations from the
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// the render process, and forwards them to corresponding CDM object. Callbacks
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// from CDM objects are converted to IPCs and then sent to the render process.
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass CONTENT_EXPORT BrowserCdmManager : public BrowserMessageFilter {
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns the BrowserCdmManager associated with the |render_process_id|.
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns NULL if no BrowserCdmManager is associated.
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static BrowserCdmManager* FromProcess(int render_process_id);
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Constructs the BrowserCdmManager for |render_process_id| which runs on
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |task_runner|.
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If |task_runner| is not NULL, all CDM messages are posted to it. Otherwise,
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // all messages are posted to the browser UI thread.
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BrowserCdmManager(int render_process_id,
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const scoped_refptr<base::TaskRunner>& task_runner);
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // BrowserMessageFilter implementations.
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnDestruct() const OVERRIDE;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual base::TaskRunner* OverrideTaskRunnerForMessage(
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const IPC::Message& message) OVERRIDE;
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  media::BrowserCdm* GetCdm(int render_frame_id, int cdm_id);
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Notifies that the render frame has been deleted so that all CDMs belongs
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // to this render frame needs to be destroyed as well. This is needed because
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // in some cases (e.g. fast termination of the renderer), the message to
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // destroy the CDM will not be received.
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void RenderFrameDeleted(int render_frame_id);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  friend class base::RefCountedThreadSafe<BrowserCdmManager>;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  friend class base::DeleteHelper<BrowserCdmManager>;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~BrowserCdmManager();
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // CDM callbacks.
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnSessionCreated(int render_frame_id,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        int cdm_id,
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        uint32 session_id,
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        const std::string& web_session_id);
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnSessionMessage(int render_frame_id,
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        int cdm_id,
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        uint32 session_id,
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        const std::vector<uint8>& message,
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        const GURL& destination_url);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnSessionReady(int render_frame_id, int cdm_id, uint32 session_id);
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnSessionClosed(int render_frame_id, int cdm_id, uint32 session_id);
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnSessionError(int render_frame_id,
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      int cdm_id,
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      uint32 session_id,
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      media::MediaKeys::KeyError error_code,
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      uint32 system_code);
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Message handlers.
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnInitializeCdm(int render_frame_id,
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       int cdm_id,
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       const std::string& key_system,
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       const GURL& frame_url);
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnCreateSession(int render_frame_id,
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       int cdm_id,
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       uint32 session_id,
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       CdmHostMsg_CreateSession_ContentType content_type,
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       const std::vector<uint8>& init_data);
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnUpdateSession(int render_frame_id,
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       int cdm_id,
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       uint32 session_id,
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       const std::vector<uint8>& response);
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnReleaseSession(int render_frame_id,
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        int cdm_id, uint32 session_id);
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnDestroyCdm(int render_frame_id, int cdm_id);
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SendSessionError(int render_frame_id, int cdm_id, uint32 session_id);
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Adds a new CDM identified by |cdm_id| for the given |key_system| and
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |security_origin|.
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AddCdm(int render_frame_id,
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              int cdm_id,
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              const std::string& key_system,
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              const GURL& security_origin);
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Removes the CDM with the specified id.
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void RemoveCdm(uint64 id);
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // If |permitted| is false, it does nothing but send
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |CdmMsg_SessionError| IPC message.
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The primary use case is infobar permission callback, i.e., when infobar
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // can decide user's intention either from interacting with the actual info
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // bar or from the saved preference.
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void CreateSessionIfPermitted(int render_frame_id,
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                int cdm_id,
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                uint32 session_id,
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                const std::string& content_type,
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                const std::vector<uint8>& init_data,
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                bool permitted);
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const int render_process_id_;
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TaskRunner to dispatch all CDM messages to. If it's NULL, all messages are
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // dispatched to the browser UI thread.
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<base::TaskRunner> task_runner_;
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The key in the following maps is a combination of |render_frame_id| and
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |cdm_id|.
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Map of managed BrowserCdms.
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef base::ScopedPtrHashMap<uint64, media::BrowserCdm> CdmMap;
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CdmMap cdm_map_;
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Map of CDM's security origin.
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::map<uint64, GURL> cdm_security_origin_map_;
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Map of callbacks to cancel the permission request.
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::map<uint64, base::Closure> cdm_cancel_permission_map_;
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserCdmManager);
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace content
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // CONTENT_BROWSER_MEDIA_CDM_BROWSER_CDM_MANAGER_H_
151