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

Side by Side Diff: content/browser/media/session/media_session_impl.cc

Issue 2715723002: Fix a crash in MediaSessionServiceImpl due to life time issue (Closed)
Patch Set: addressed nits Created 3 years, 10 months 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/session/media_session_impl.h" 5 #include "content/browser/media/session/media_session_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include "content/browser/media/session/audio_focus_delegate.h" 8 #include "content/browser/media/session/audio_focus_delegate.h"
9 #include "content/browser/media/session/media_session_controller.h" 9 #include "content/browser/media/session/media_session_controller.h"
10 #include "content/browser/media/session/media_session_player_observer.h" 10 #include "content/browser/media/session/media_session_player_observer.h"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 // TODO(zqzhang): refactor MediaSessionImpl, maybe move the interface used to 103 // TODO(zqzhang): refactor MediaSessionImpl, maybe move the interface used to
104 // talk with AudioFocusManager out to a seperate class. The AudioFocusManager 104 // talk with AudioFocusManager out to a seperate class. The AudioFocusManager
105 // unit tests then could mock the interface and abandon audio focus when 105 // unit tests then could mock the interface and abandon audio focus when
106 // WebContents is destroyed. See https://crbug.com/651069 106 // WebContents is destroyed. See https://crbug.com/651069
107 normal_players_.clear(); 107 normal_players_.clear();
108 pepper_players_.clear(); 108 pepper_players_.clear();
109 one_shot_players_.clear(); 109 one_shot_players_.clear();
110 AbandonSystemAudioFocusIfNeeded(); 110 AbandonSystemAudioFocusIfNeeded();
111 } 111 }
112 112
113 void MediaSessionImpl::RenderFrameDeleted(RenderFrameHost* rfh) {
114 if (services_.count(rfh))
115 OnServiceDestroyed(services_[rfh]);
116 }
117
113 void MediaSessionImpl::AddObserver(MediaSessionObserver* observer) { 118 void MediaSessionImpl::AddObserver(MediaSessionObserver* observer) {
114 observers_.AddObserver(observer); 119 observers_.AddObserver(observer);
115 } 120 }
116 121
117 void MediaSessionImpl::RemoveObserver(MediaSessionObserver* observer) { 122 void MediaSessionImpl::RemoveObserver(MediaSessionObserver* observer) {
118 observers_.RemoveObserver(observer); 123 observers_.RemoveObserver(observer);
119 } 124 }
120 125
121 void MediaSessionImpl::NotifyMediaSessionMetadataChange( 126 void MediaSessionImpl::NotifyMediaSessionMetadataChange(
122 const base::Optional<MediaMetadata>& metadata) { 127 const base::Optional<MediaMetadata>& metadata) {
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 572
568 one_shot_players_.insert(PlayerIdentifier(observer, player_id)); 573 one_shot_players_.insert(PlayerIdentifier(observer, player_id));
569 NotifyAboutStateChange(); 574 NotifyAboutStateChange();
570 575
571 return true; 576 return true;
572 } 577 }
573 578
574 // MediaSessionService-related methods 579 // MediaSessionService-related methods
575 580
576 void MediaSessionImpl::OnServiceCreated(MediaSessionServiceImpl* service) { 581 void MediaSessionImpl::OnServiceCreated(MediaSessionServiceImpl* service) {
577 services_[service->GetRenderFrameHost()] = service; 582 RenderFrameHost* rfh = service->GetRenderFrameHost();
583 if (!rfh)
584 return;
585
586 services_[rfh] = service;
578 UpdateRoutedService(); 587 UpdateRoutedService();
579 } 588 }
580 589
581 void MediaSessionImpl::OnServiceDestroyed(MediaSessionServiceImpl* service) { 590 void MediaSessionImpl::OnServiceDestroyed(MediaSessionServiceImpl* service) {
582 services_.erase(service->GetRenderFrameHost()); 591 services_.erase(service->GetRenderFrameHost());
583 if (routed_service_ == service) { 592 if (routed_service_ == service) {
584 routed_service_ = nullptr; 593 routed_service_ = nullptr;
585 UpdateRoutedService(); 594 UpdateRoutedService();
586 } 595 }
587 } 596 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 if (!IsServiceActiveForRenderFrameHost(frame)) 709 if (!IsServiceActiveForRenderFrameHost(frame))
701 continue; 710 continue;
702 best_frame = frame; 711 best_frame = frame;
703 min_depth = depth; 712 min_depth = depth;
704 } 713 }
705 714
706 return best_frame ? services_[best_frame] : nullptr; 715 return best_frame ? services_[best_frame] : nullptr;
707 } 716 }
708 717
709 } // namespace content 718 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/media/session/media_session_impl.h ('k') | content/browser/media/session/media_session_service_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698