[EME][Mac] SecureStop left on disk in Private Browsing mode.
[WebKit-https.git] / Source / WebCore / platform / graphics / avfoundation / objc / CDMSessionMediaSourceAVFObjC.mm
1 /*
2  * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "CDMSessionMediaSourceAVFObjC.h"
28
29 #if ENABLE(LEGACY_ENCRYPTED_MEDIA) && ENABLE(MEDIA_SOURCE)
30
31 #import "CDMPrivateMediaSourceAVFObjC.h"
32 #import "FileSystem.h"
33 #import "WebCoreNSErrorExtras.h"
34 #import <AVFoundation/AVError.h>
35
36 namespace WebCore {
37
38 CDMSessionMediaSourceAVFObjC::CDMSessionMediaSourceAVFObjC(CDMPrivateMediaSourceAVFObjC& cdm, CDMSessionClient* client)
39     : m_cdm(&cdm)
40     , m_client(client)
41 {
42 }
43
44 CDMSessionMediaSourceAVFObjC::~CDMSessionMediaSourceAVFObjC()
45 {
46     if (m_cdm)
47         m_cdm->invalidateSession(this);
48 }
49
50 void CDMSessionMediaSourceAVFObjC::layerDidReceiveError(AVSampleBufferDisplayLayer *, NSError *error, bool& shouldIgnore)
51 {
52     if (!m_client)
53         return;
54
55     unsigned long code = mediaKeyErrorSystemCode(error);
56
57     // FIXME(142246): Remove the following once <rdar://problem/20027434> is resolved.
58     shouldIgnore = m_stopped && code == 12785;
59     if (!shouldIgnore)
60         m_client->sendError(CDMSessionClient::MediaKeyErrorDomain, code);
61 }
62
63 void CDMSessionMediaSourceAVFObjC::rendererDidReceiveError(AVSampleBufferAudioRenderer *, NSError *error, bool& shouldIgnore)
64 {
65     if (!m_client)
66         return;
67
68     unsigned long code = mediaKeyErrorSystemCode(error);
69
70     // FIXME(142246): Remove the following once <rdar://problem/20027434> is resolved.
71     shouldIgnore = m_stopped && code == 12785;
72     if (!shouldIgnore)
73         m_client->sendError(CDMSessionClient::MediaKeyErrorDomain, code);
74 }
75
76
77 void CDMSessionMediaSourceAVFObjC::addSourceBuffer(SourceBufferPrivateAVFObjC* sourceBuffer)
78 {
79     ASSERT(!m_sourceBuffers.contains(sourceBuffer));
80     ASSERT(sourceBuffer);
81
82     addParser(sourceBuffer->parser());
83
84     m_sourceBuffers.append(sourceBuffer);
85     sourceBuffer->registerForErrorNotifications(this);
86 }
87
88 void CDMSessionMediaSourceAVFObjC::removeSourceBuffer(SourceBufferPrivateAVFObjC* sourceBuffer)
89 {
90     ASSERT(m_sourceBuffers.contains(sourceBuffer));
91     ASSERT(sourceBuffer);
92
93     removeParser(sourceBuffer->parser());
94
95     sourceBuffer->unregisterForErrorNotifications(this);
96     m_sourceBuffers.remove(m_sourceBuffers.find(sourceBuffer));
97 }
98
99 String CDMSessionMediaSourceAVFObjC::storagePath() const
100 {
101     if (!m_client)
102         return emptyString();
103
104     String storageDirectory = m_client->mediaKeysStorageDirectory();
105     if (storageDirectory.isEmpty())
106         return emptyString();
107
108     return pathByAppendingComponent(storageDirectory, "SecureStop.plist");
109 }
110
111 }
112
113 #endif // ENABLE(LEGACY_ENCRYPTED_MEDIA) && ENABLE(MEDIA_SOURCE)