| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/media/cdm/browser_cdm_manager.h" | 5 #include "content/browser/media/cdm/browser_cdm_manager.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "content/common/media/cdm_messages.h" | 8 #include "content/common/media/cdm_messages.h" |
| 9 #include "content/public/browser/content_browser_client.h" | 9 #include "content/public/browser/content_browser_client.h" |
| 10 #include "content/public/browser/render_frame_host.h" | 10 #include "content/public/browser/render_frame_host.h" |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 } | 148 } |
| 149 | 149 |
| 150 std::map<int, GURL>::const_iterator iter = | 150 std::map<int, GURL>::const_iterator iter = |
| 151 cdm_security_origin_map_.find(cdm_id); | 151 cdm_security_origin_map_.find(cdm_id); |
| 152 if (iter == cdm_security_origin_map_.end()) { | 152 if (iter == cdm_security_origin_map_.end()) { |
| 153 NOTREACHED(); | 153 NOTREACHED(); |
| 154 OnSessionError(cdm_id, session_id, MediaKeys::kUnknownError, 0); | 154 OnSessionError(cdm_id, session_id, MediaKeys::kUnknownError, 0); |
| 155 return; | 155 return; |
| 156 } | 156 } |
| 157 | 157 |
| 158 base::Closure cancel_callback; | 158 GetContentClient()->browser()->RequestPermission( |
| 159 GetContentClient()->browser()->RequestProtectedMediaIdentifierPermission( | 159 content::PERMISSION_PROTECTED_MEDIA, |
| 160 web_contents_, | 160 web_contents_, |
| 161 -1, |
| 161 iter->second, | 162 iter->second, |
| 163 true, |
| 162 base::Bind(&BrowserCdmManager::CreateSessionIfPermitted, | 164 base::Bind(&BrowserCdmManager::CreateSessionIfPermitted, |
| 163 weak_ptr_factory_.GetWeakPtr(), | 165 weak_ptr_factory_.GetWeakPtr(), |
| 164 cdm_id, | 166 cdm_id, |
| 165 session_id, | 167 session_id, |
| 166 mime_type, | 168 mime_type, |
| 167 init_data), | 169 init_data)); |
| 168 &cancel_callback); | |
| 169 if (!cancel_callback.is_null()) | |
| 170 cdm_cancel_permision_map_[cdm_id] = cancel_callback; | |
| 171 } | 170 } |
| 172 | 171 |
| 173 void BrowserCdmManager::OnUpdateSession( | 172 void BrowserCdmManager::OnUpdateSession( |
| 174 int cdm_id, | 173 int cdm_id, |
| 175 uint32 session_id, | 174 uint32 session_id, |
| 176 const std::vector<uint8>& response) { | 175 const std::vector<uint8>& response) { |
| 177 BrowserCdm* cdm = GetCdm(cdm_id); | 176 BrowserCdm* cdm = GetCdm(cdm_id); |
| 178 if (!cdm) { | 177 if (!cdm) { |
| 179 DLOG(WARNING) << "No CDM for ID " << cdm_id << " found"; | 178 DLOG(WARNING) << "No CDM for ID " << cdm_id << " found"; |
| 180 OnSessionError(cdm_id, session_id, MediaKeys::kUnknownError, 0); | 179 OnSessionError(cdm_id, session_id, MediaKeys::kUnknownError, 0); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 205 void BrowserCdmManager::OnDestroyCdm(int cdm_id) { | 204 void BrowserCdmManager::OnDestroyCdm(int cdm_id) { |
| 206 BrowserCdm* cdm = GetCdm(cdm_id); | 205 BrowserCdm* cdm = GetCdm(cdm_id); |
| 207 if (!cdm) | 206 if (!cdm) |
| 208 return; | 207 return; |
| 209 | 208 |
| 210 CancelAllPendingSessionCreations(cdm_id); | 209 CancelAllPendingSessionCreations(cdm_id); |
| 211 RemoveCdm(cdm_id); | 210 RemoveCdm(cdm_id); |
| 212 } | 211 } |
| 213 | 212 |
| 214 void BrowserCdmManager::CancelAllPendingSessionCreations(int cdm_id) { | 213 void BrowserCdmManager::CancelAllPendingSessionCreations(int cdm_id) { |
| 215 if (cdm_cancel_permision_map_.count(cdm_id)) { | 214 if (cdm_cancel_permision_set_.find(cdm_id) |
| 216 cdm_cancel_permision_map_[cdm_id].Run(); | 215 != cdm_cancel_permision_set_.end()) { |
| 217 cdm_cancel_permision_map_.erase(cdm_id); | 216 std::map<int, GURL>::const_iterator iter = |
| 217 cdm_security_origin_map_.find(cdm_id); |
| 218 if (iter == cdm_security_origin_map_.end()) { |
| 219 NOTREACHED(); |
| 220 return; |
| 221 } |
| 222 GetContentClient()->browser()->CancelPermissionRequest( |
| 223 content::PERMISSION_PROTECTED_MEDIA, |
| 224 web_contents_, -1, iter->second); |
| 225 cdm_cancel_permision_set_.erase(cdm_id); |
| 218 } | 226 } |
| 219 } | 227 } |
| 220 | 228 |
| 221 void BrowserCdmManager::AddCdm(int cdm_id, | 229 void BrowserCdmManager::AddCdm(int cdm_id, |
| 222 const std::string& key_system, | 230 const std::string& key_system, |
| 223 const GURL& security_origin) { | 231 const GURL& security_origin) { |
| 224 DCHECK(!GetCdm(cdm_id)); | 232 DCHECK(!GetCdm(cdm_id)); |
| 225 base::WeakPtr<BrowserCdmManager> weak_this = weak_ptr_factory_.GetWeakPtr(); | 233 base::WeakPtr<BrowserCdmManager> weak_this = weak_ptr_factory_.GetWeakPtr(); |
| 226 scoped_ptr<BrowserCdm> cdm(media::CreateBrowserCdm( | 234 scoped_ptr<BrowserCdm> cdm(media::CreateBrowserCdm( |
| 227 key_system, | 235 key_system, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 242 cdm_security_origin_map_[cdm_id] = security_origin; | 250 cdm_security_origin_map_[cdm_id] = security_origin; |
| 243 } | 251 } |
| 244 | 252 |
| 245 void BrowserCdmManager::RemoveCdm(int cdm_id) { | 253 void BrowserCdmManager::RemoveCdm(int cdm_id) { |
| 246 // TODO(xhwang): Detach CDM from the player it's set to. In prefixed | 254 // TODO(xhwang): Detach CDM from the player it's set to. In prefixed |
| 247 // EME implementation the current code is fine because we always destroy the | 255 // EME implementation the current code is fine because we always destroy the |
| 248 // player before we destroy the DrmBridge. This will not always be the case | 256 // player before we destroy the DrmBridge. This will not always be the case |
| 249 // in unprefixed EME implementation. | 257 // in unprefixed EME implementation. |
| 250 cdm_map_.erase(cdm_id); | 258 cdm_map_.erase(cdm_id); |
| 251 cdm_security_origin_map_.erase(cdm_id); | 259 cdm_security_origin_map_.erase(cdm_id); |
| 252 cdm_cancel_permision_map_.erase(cdm_id); | 260 cdm_cancel_permision_set_.erase(cdm_id); |
| 253 } | 261 } |
| 254 | 262 |
| 255 int BrowserCdmManager::RoutingID() { | 263 int BrowserCdmManager::RoutingID() { |
| 256 return render_frame_host_->GetRoutingID(); | 264 return render_frame_host_->GetRoutingID(); |
| 257 } | 265 } |
| 258 | 266 |
| 259 bool BrowserCdmManager::Send(IPC::Message* msg) { | 267 bool BrowserCdmManager::Send(IPC::Message* msg) { |
| 260 return render_frame_host_->Send(msg); | 268 return render_frame_host_->Send(msg); |
| 261 } | 269 } |
| 262 | 270 |
| 263 void BrowserCdmManager::CreateSessionIfPermitted( | 271 void BrowserCdmManager::CreateSessionIfPermitted( |
| 264 int cdm_id, | 272 int cdm_id, |
| 265 uint32 session_id, | 273 uint32 session_id, |
| 266 const std::string& content_type, | 274 const std::string& content_type, |
| 267 const std::vector<uint8>& init_data, | 275 const std::vector<uint8>& init_data, |
| 268 bool permitted) { | 276 bool permitted) { |
| 269 cdm_cancel_permision_map_.erase(cdm_id); | 277 cdm_cancel_permision_set_.erase(cdm_id); |
| 270 if (!permitted) { | 278 if (!permitted) { |
| 271 OnSessionError(cdm_id, session_id, MediaKeys::kUnknownError, 0); | 279 OnSessionError(cdm_id, session_id, MediaKeys::kUnknownError, 0); |
| 272 return; | 280 return; |
| 273 } | 281 } |
| 274 | 282 |
| 275 BrowserCdm* cdm = GetCdm(cdm_id); | 283 BrowserCdm* cdm = GetCdm(cdm_id); |
| 276 if (!cdm) { | 284 if (!cdm) { |
| 277 DLOG(WARNING) << "No CDM for ID: " << cdm_id << " found"; | 285 DLOG(WARNING) << "No CDM for ID: " << cdm_id << " found"; |
| 278 OnSessionError(cdm_id, session_id, MediaKeys::kUnknownError, 0); | 286 OnSessionError(cdm_id, session_id, MediaKeys::kUnknownError, 0); |
| 279 return; | 287 return; |
| 280 } | 288 } |
| 281 | 289 |
| 282 // This could fail, in which case a SessionError will be fired. | 290 // This could fail, in which case a SessionError will be fired. |
| 283 cdm->CreateSession(session_id, content_type, &init_data[0], init_data.size()); | 291 cdm->CreateSession(session_id, content_type, &init_data[0], init_data.size()); |
| 284 } | 292 } |
| 285 | 293 |
| 286 } // namespace content | 294 } // namespace content |
| OLD | NEW |