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