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

Unified Diff: content/browser/media/capture/web_contents_video_capture_device.cc

Issue 514073002: Fix for ~ContentCaptureSubscription() after BrowserThreads are torn down. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/media/capture/web_contents_video_capture_device.cc
diff --git a/content/browser/media/capture/web_contents_video_capture_device.cc b/content/browser/media/capture/web_contents_video_capture_device.cc
index 2ddeb2b9eedbd5e960dbf5108edfb2ae7ed53481..654b8dcc0ff4ed89486fe74539b8e88971e8183c 100644
--- a/content/browser/media/capture/web_contents_video_capture_device.cc
+++ b/content/browser/media/capture/web_contents_video_capture_device.cc
@@ -371,7 +371,7 @@ ContentCaptureSubscription::ContentCaptureSubscription(
&delivery_log_),
capture_callback_(capture_callback),
timer_(true, true) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>(
source.GetView());
@@ -399,7 +399,13 @@ ContentCaptureSubscription::ContentCaptureSubscription(
}
ContentCaptureSubscription::~ContentCaptureSubscription() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ // If the BrowserThreads have been torn down, then the browser is in the final
+ // stages of exiting and it is dangerous to take any further action. We must
+ // return early. http://crbug.com/396413
+ if (!BrowserThread::IsMessageLoopValid(BrowserThread::UI))
miu 2014/08/28 01:59:56 This is the fix: Calling RenderViewHost::FromID(..
+ return;
+
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (kAcceleratedSubscriberIsSupported) {
RenderViewHost* source = RenderViewHost::FromID(render_process_id_,
render_view_id_);
@@ -416,7 +422,7 @@ void ContentCaptureSubscription::Observe(
int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK_EQ(NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE, type);
RenderWidgetHostImpl* rwh =
@@ -455,7 +461,7 @@ void ContentCaptureSubscription::Observe(
}
void ContentCaptureSubscription::OnTimer() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
TRACE_EVENT0("mirroring", "ContentCaptureSubscription::OnTimer");
scoped_refptr<media::VideoFrame> frame;
@@ -575,18 +581,13 @@ WebContentsCaptureMachine::WebContentsCaptureMachine(int render_process_id,
fullscreen_widget_id_(MSG_ROUTING_NONE),
weak_ptr_factory_(this) {}
-WebContentsCaptureMachine::~WebContentsCaptureMachine() {
- BrowserThread::PostBlockingPoolTask(
- FROM_HERE,
- base::Bind(&DeleteOnWorkerThread, base::Passed(&render_thread_),
- base::Bind(&base::DoNothing)));
-}
+WebContentsCaptureMachine::~WebContentsCaptureMachine() {}
bool WebContentsCaptureMachine::Start(
const scoped_refptr<ThreadSafeCaptureOracle>& oracle_proxy,
const media::VideoCaptureParams& params) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK(!started_);
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK(!weak_ptr_factory_.HasWeakPtrs()); // Should not be started.
DCHECK(oracle_proxy.get());
oracle_proxy_ = oracle_proxy;
@@ -605,12 +606,11 @@ bool WebContentsCaptureMachine::Start(
return false;
}
- started_ = true;
return true;
}
void WebContentsCaptureMachine::Stop(const base::Closure& callback) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
subscription_.reset();
if (web_contents()) {
web_contents()->DecrementCapturerCount();
@@ -623,12 +623,12 @@ void WebContentsCaptureMachine::Stop(const base::Closure& callback) {
// The render thread cannot be stopped on the UI thread, so post a message
// to the thread pool used for blocking operations.
- BrowserThread::PostBlockingPoolTask(
- FROM_HERE,
- base::Bind(&DeleteOnWorkerThread, base::Passed(&render_thread_),
- callback));
-
- started_ = false;
+ if (render_thread_.get()) {
+ BrowserThread::PostBlockingPoolTask(
+ FROM_HERE,
+ base::Bind(&DeleteOnWorkerThread, base::Passed(&render_thread_),
+ callback));
+ }
}
void WebContentsCaptureMachine::Capture(
@@ -636,7 +636,7 @@ void WebContentsCaptureMachine::Capture(
const scoped_refptr<media::VideoFrame>& target,
const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback&
deliver_frame_cb) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
RenderWidgetHost* rwh = GetTarget();
RenderWidgetHostViewBase* view =
@@ -683,7 +683,7 @@ void WebContentsCaptureMachine::Capture(
}
gfx::Size WebContentsCaptureMachine::ComputeOptimalTargetSize() const {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
gfx::Size optimal_size = oracle_proxy_->GetCaptureSize();
@@ -714,7 +714,7 @@ gfx::Size WebContentsCaptureMachine::ComputeOptimalTargetSize() const {
}
bool WebContentsCaptureMachine::StartObservingWebContents() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
// Look-up the RenderFrameHost and, from that, the WebContents that wraps it.
// If successful, begin observing the WebContents instance.
@@ -743,7 +743,7 @@ bool WebContentsCaptureMachine::StartObservingWebContents() {
}
void WebContentsCaptureMachine::WebContentsDestroyed() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
subscription_.reset();
web_contents()->DecrementCapturerCount();
@@ -751,7 +751,7 @@ void WebContentsCaptureMachine::WebContentsDestroyed() {
}
RenderWidgetHost* WebContentsCaptureMachine::GetTarget() const {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!web_contents())
return NULL;
@@ -774,7 +774,7 @@ void WebContentsCaptureMachine::DidCopyFromBackingStore(
deliver_frame_cb,
bool success,
const SkBitmap& bitmap) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
base::TimeTicks now = base::TimeTicks::Now();
DCHECK(render_thread_.get());
@@ -797,7 +797,7 @@ void WebContentsCaptureMachine::DidCopyFromCompositingSurfaceToVideoFrame(
const RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback&
deliver_frame_cb,
bool success) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
base::TimeTicks now = base::TimeTicks::Now();
if (success) {
@@ -810,7 +810,7 @@ void WebContentsCaptureMachine::DidCopyFromCompositingSurfaceToVideoFrame(
}
void WebContentsCaptureMachine::RenewFrameSubscription() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
// Always destroy the old subscription before creating a new one.
subscription_.reset();
@@ -839,7 +839,7 @@ WebContentsVideoCaptureDevice::~WebContentsVideoCaptureDevice() {
// static
media::VideoCaptureDevice* WebContentsVideoCaptureDevice::Create(
const std::string& device_id) {
- // Parse device_id into render_process_id and render_view_id.
+ // Parse device_id into render_process_id and main_render_frame_id.
int render_process_id = -1;
int main_render_frame_id = -1;
if (!WebContentsCaptureUtil::ExtractTabCaptureTarget(

Powered by Google App Engine
This is Rietveld 408576698