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/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/task_runner.h" | 10 #include "base/task_runner.h" |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 IPC_END_MESSAGE_MAP() | 115 IPC_END_MESSAGE_MAP() |
116 return handled; | 116 return handled; |
117 } | 117 } |
118 | 118 |
119 media::BrowserCdm* BrowserCdmManager::GetCdm(int render_frame_id, int cdm_id) { | 119 media::BrowserCdm* BrowserCdmManager::GetCdm(int render_frame_id, int cdm_id) { |
120 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 120 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
121 return cdm_map_.get(GetId(render_frame_id, cdm_id)); | 121 return cdm_map_.get(GetId(render_frame_id, cdm_id)); |
122 } | 122 } |
123 | 123 |
124 void BrowserCdmManager::RenderFrameDeleted(int render_frame_id) { | 124 void BrowserCdmManager::RenderFrameDeleted(int render_frame_id) { |
125 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 125 if (!task_runner_->RunsTasksOnCurrentThread()) { |
126 | 126 task_runner_->PostTask( |
127 std::vector<uint64> ids_to_remove; | 127 FROM_HERE, |
128 for (CdmMap::iterator it = cdm_map_.begin(); it != cdm_map_.end(); ++it) { | 128 base::Bind(&BrowserCdmManager::RemoveAllCdmForFrame, |
129 if (IdBelongsToFrame(it->first, render_frame_id)) | 129 this, render_frame_id)); |
130 ids_to_remove.push_back(it->first); | 130 return; |
131 } | 131 } |
132 | 132 RemoveAllCdmForFrame(render_frame_id); |
133 for (size_t i = 0; i < ids_to_remove.size(); ++i) | |
134 RemoveCdm(ids_to_remove[i]); | |
135 } | 133 } |
136 | 134 |
137 void BrowserCdmManager::OnSessionCreated(int render_frame_id, | 135 void BrowserCdmManager::OnSessionCreated(int render_frame_id, |
138 int cdm_id, | 136 int cdm_id, |
139 uint32 session_id, | 137 uint32 session_id, |
140 const std::string& web_session_id) { | 138 const std::string& web_session_id) { |
141 Send(new CdmMsg_SessionCreated( | 139 Send(new CdmMsg_SessionCreated( |
142 render_frame_id, cdm_id, session_id, web_session_id)); | 140 render_frame_id, cdm_id, session_id, web_session_id)); |
143 } | 141 } |
144 | 142 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 // as GetCdm() will return null. | 336 // as GetCdm() will return null. |
339 DVLOG(1) << "failed to create CDM."; | 337 DVLOG(1) << "failed to create CDM."; |
340 return; | 338 return; |
341 } | 339 } |
342 | 340 |
343 uint64 id = GetId(render_frame_id, cdm_id); | 341 uint64 id = GetId(render_frame_id, cdm_id); |
344 cdm_map_.add(id, cdm.Pass()); | 342 cdm_map_.add(id, cdm.Pass()); |
345 cdm_security_origin_map_[id] = security_origin; | 343 cdm_security_origin_map_[id] = security_origin; |
346 } | 344 } |
347 | 345 |
| 346 void BrowserCdmManager::RemoveAllCdmForFrame(int render_frame_id) { |
| 347 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
| 348 |
| 349 std::vector<uint64> ids_to_remove; |
| 350 for (CdmMap::iterator it = cdm_map_.begin(); it != cdm_map_.end(); ++it) { |
| 351 if (IdBelongsToFrame(it->first, render_frame_id)) |
| 352 ids_to_remove.push_back(it->first); |
| 353 } |
| 354 |
| 355 for (size_t i = 0; i < ids_to_remove.size(); ++i) |
| 356 RemoveCdm(ids_to_remove[i]); |
| 357 } |
| 358 |
348 void BrowserCdmManager::RemoveCdm(uint64 id) { | 359 void BrowserCdmManager::RemoveCdm(uint64 id) { |
349 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | 360 DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
350 | 361 |
351 cdm_map_.erase(id); | 362 cdm_map_.erase(id); |
352 cdm_security_origin_map_.erase(id); | 363 cdm_security_origin_map_.erase(id); |
353 if (cdm_cancel_permission_map_.count(id)) { | 364 if (cdm_cancel_permission_map_.count(id)) { |
354 cdm_cancel_permission_map_[id].Run(); | 365 cdm_cancel_permission_map_[id].Run(); |
355 cdm_cancel_permission_map_.erase(id); | 366 cdm_cancel_permission_map_.erase(id); |
356 } | 367 } |
357 } | 368 } |
(...skipping 16 matching lines...) Expand all Loading... |
374 DLOG(WARNING) << "No CDM found for: " << render_frame_id << ", " << cdm_id; | 385 DLOG(WARNING) << "No CDM found for: " << render_frame_id << ", " << cdm_id; |
375 SendSessionError(render_frame_id, cdm_id, session_id); | 386 SendSessionError(render_frame_id, cdm_id, session_id); |
376 return; | 387 return; |
377 } | 388 } |
378 | 389 |
379 // This could fail, in which case a SessionError will be fired. | 390 // This could fail, in which case a SessionError will be fired. |
380 cdm->CreateSession(session_id, content_type, &init_data[0], init_data.size()); | 391 cdm->CreateSession(session_id, content_type, &init_data[0], init_data.size()); |
381 } | 392 } |
382 | 393 |
383 } // namespace content | 394 } // namespace content |
OLD | NEW |