1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_RENDERER_MEDIA_WEBCONTENTDECRYPTIONMODULE_IMPL_H_
6#define CONTENT_RENDERER_MEDIA_WEBCONTENTDECRYPTIONMODULE_IMPL_H_
7
8#include <string>
9
10#include "base/memory/ref_counted.h"
11#include "base/memory/scoped_ptr.h"
12#include "base/strings/string16.h"
13#include "third_party/WebKit/public/platform/WebContentDecryptionModule.h"
14
15namespace blink {
16#if defined(ENABLE_PEPPER_CDMS)
17class WebLocalFrame;
18#endif
19class WebSecurityOrigin;
20}
21
22namespace media {
23class Decryptor;
24class MediaKeys;
25}
26
27namespace content {
28
29class CdmSessionAdapter;
30#if defined(ENABLE_BROWSER_CDMS)
31class RendererCdmManager;
32#endif
33class WebContentDecryptionModuleSessionImpl;
34
35class WebContentDecryptionModuleImpl
36    : public blink::WebContentDecryptionModule {
37 public:
38  static WebContentDecryptionModuleImpl* Create(
39#if defined(ENABLE_PEPPER_CDMS)
40      blink::WebLocalFrame* frame,
41#elif defined(ENABLE_BROWSER_CDMS)
42      RendererCdmManager* manager,
43#endif
44      const blink::WebSecurityOrigin& security_origin,
45      const base::string16& key_system);
46
47  virtual ~WebContentDecryptionModuleImpl();
48
49  // Returns the Decryptor associated with this CDM. May be NULL if no
50  // Decryptor associated with the MediaKeys object.
51  // TODO(jrummell): Figure out lifetimes, as WMPI may still use the decryptor
52  // after WebContentDecryptionModule is freed. http://crbug.com/330324
53  media::Decryptor* GetDecryptor();
54
55#if defined(ENABLE_BROWSER_CDMS)
56  // Returns the CDM ID associated with this object. May be kInvalidCdmId if no
57  // CDM ID is associated, such as when Clear Key is used.
58  int GetCdmId() const;
59#endif  // defined(ENABLE_BROWSER_CDMS)
60
61  // blink::WebContentDecryptionModule implementation.
62  virtual blink::WebContentDecryptionModuleSession* createSession();
63  // TODO(jrummell): Remove this method once blink updated.
64  virtual blink::WebContentDecryptionModuleSession* createSession(
65      blink::WebContentDecryptionModuleSession::Client* client);
66
67  virtual void setServerCertificate(
68      const uint8* server_certificate,
69      size_t server_certificate_length,
70      blink::WebContentDecryptionModuleResult result);
71
72 private:
73  // Takes reference to |adapter|.
74  WebContentDecryptionModuleImpl(scoped_refptr<CdmSessionAdapter> adapter);
75
76  scoped_refptr<CdmSessionAdapter> adapter_;
77
78  DISALLOW_COPY_AND_ASSIGN(WebContentDecryptionModuleImpl);
79};
80
81// Allow typecasting from blink type as this is the only implementation.
82inline WebContentDecryptionModuleImpl* ToWebContentDecryptionModuleImpl(
83    blink::WebContentDecryptionModule* cdm) {
84  return static_cast<WebContentDecryptionModuleImpl*>(cdm);
85}
86
87}  // namespace content
88
89#endif  // CONTENT_RENDERER_MEDIA_WEBCONTENTDECRYPTIONMODULE_IMPL_H_
90