Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(501)

Side by Side Diff: content/browser/media/cdm/browser_cdm_manager.cc

Issue 731793002: BrowserCdmManager: remove CDMs on correct thread on RenderFrameDeleted. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 IPC_MESSAGE_UNHANDLED(handled = false) 114 IPC_MESSAGE_UNHANDLED(handled = false)
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) {
damienv1 2014/11/16 00:00:46 nit: early return feels more natural here. if (!t
gunsch 2014/11/17 16:17:37 Done.
125 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 125 if (task_runner_->RunsTasksOnCurrentThread()) {
126 126 RemoveCdmsForFrame(render_frame_id);
127 std::vector<uint64> ids_to_remove; 127 } else {
128 for (CdmMap::iterator it = cdm_map_.begin(); it != cdm_map_.end(); ++it) { 128 task_runner_->PostTask(
129 if (IdBelongsToFrame(it->first, render_frame_id)) 129 FROM_HERE,
130 ids_to_remove.push_back(it->first); 130 base::Bind(&BrowserCdmManager::RemoveCdmsForFrame,
131 this, render_frame_id));
131 } 132 }
132
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
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::RemoveCdmsForFrame(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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698