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

Unified Diff: content/browser/media/capture/web_contents_tracker.h

Issue 2602923002: Tab capture: Tracking continues after renderer crash. (Closed)
Patch Set: Fix assumption about when view is valid. Created 4 years 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_tracker.h
diff --git a/content/browser/media/capture/web_contents_tracker.h b/content/browser/media/capture/web_contents_tracker.h
index aacbfcfd41f4ac4e837f1ff176b3cacc1477ae5b..49701aada99d86cf6710734ded27d164dea00f51 100644
--- a/content/browser/media/capture/web_contents_tracker.h
+++ b/content/browser/media/capture/web_contents_tracker.h
@@ -4,14 +4,13 @@
//
// Given a starting render_process_id and main_render_frame_id, the
// WebContentsTracker tracks changes to the active RenderFrameHost tree during
-// the lifetime of a WebContents instance. This is used when mirroring tab
-// video and audio so that user navigations, crashes, iframes, etc., during a
-// tab's lifetime allow the capturing code to remain active on the
-// current/latest render frame tree.
+// the lifetime of a WebContents instance. This is used to maintain capture of
+// the WebContents's video and audio across page transitions such as user
+// navigations, crashes, iframes, etc..
//
-// Threading issues: Start(), Stop() and the ChangeCallback are invoked on the
-// same thread. This can be any thread, and the decision is locked-in by
-// WebContentsTracker when Start() is called.
+// Threading issues: Start(), Stop() and the ChangeCallback must be invoked on
+// the same thread. This can be any thread, and the decision is locked-in once
+// WebContentsTracker::Start() is called.
#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_TRACKER_H_
#define CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_TRACKER_H_
@@ -28,21 +27,22 @@ class SingleThreadTaskRunner;
namespace content {
-class RenderWidgetHost;
+class RenderWidgetHostView;
class CONTENT_EXPORT WebContentsTracker
: public base::RefCountedThreadSafe<WebContentsTracker>,
public WebContentsObserver {
public:
- // If |track_fullscreen_rwh| is true, the ChangeCallback will be run when a
- // WebContents shows/destroys a fullscreen RenderWidgetHost view. If false,
- // fullscreen events are ignored. Specify true for video tab capture and
- // false for audio tab capture.
- explicit WebContentsTracker(bool track_fullscreen_rwh);
-
- // Callback to indicate a new RenderWidgetHost should be targeted for capture.
- // This is also invoked with false to indicate tracking will not continue
- // (i.e., the WebContents instance was not found or has been destroyed).
+ // If |track_fullscreen_rwhv| is true, the ChangeCallback will be run when a
+ // WebContents shows/destroys a fullscreen RenderWidgetHostView. If false,
+ // fullscreen events are ignored. Normally, specify true for video capture and
+ // false for audio capture.
+ explicit WebContentsTracker(bool track_fullscreen_rwhv);
+
+ // Callback to indicate a new RenderWidgetHostView should be targeted for
+ // capture. This is also invoked with false to indicate tracking will not
+ // continue (i.e., the WebContents instance was not found or has been
+ // destroyed).
typedef base::Callback<void(bool was_still_tracking)> ChangeCallback;
// Start tracking. The last-known |render_process_id| and
@@ -57,8 +57,13 @@ class CONTENT_EXPORT WebContentsTracker
// be invoked again.
virtual void Stop();
- // Current target. This must only be called on the UI BrowserThread.
- RenderWidgetHost* GetTargetRenderWidgetHost() const;
+ // Returns true if this tracker is still able to continue tracking changes.
+ // This must only be called on the UI BrowserThread.
+ bool is_still_tracking() const { return !!web_contents(); }
xjz 2017/01/03 19:16:40 nit: DCHECK_CURRENTLY_ON(BrowserThread::UI);?
miu 2017/01/03 21:01:28 We generally don't add these for inline accessors.
+
+ // Current target view. May return nullptr during certain transient periods.
+ // This must only be called on the UI BrowserThread.
+ RenderWidgetHostView* GetTargetView() const;
// Set a callback that is run whenever the main frame of the WebContents is
// resized. This method must be called on the same thread that calls
@@ -71,8 +76,8 @@ class CONTENT_EXPORT WebContentsTracker
~WebContentsTracker() override;
private:
- // Determine the target RenderWidgetHost and, if different from that last
- // reported, runs the ChangeCallback on the appropriate thread. If
+ // Determine the target RenderWidgetHostView and, if different from that last
+ // reported, runs the ChangeCallback on the appropriate thread. If
// |force_callback_run| is true, the ChangeCallback is run even if the
// RenderWidgetHost has not changed.
xjz 2017/01/03 19:16:40 nit: s/RenderWidgetHost/RenderWidgetHostView
miu 2017/01/03 21:01:28 Done. Good catch.
void OnPossibleTargetChange(bool force_callback_run);
@@ -91,41 +96,41 @@ class CONTENT_EXPORT WebContentsTracker
void StartObservingWebContents(int render_process_id,
int main_render_frame_id);
- // WebContentsObserver overrides: According to web_contents_observer.h, these
- // two method overrides are all that is necessary to track the set of active
- // RenderFrameHosts.
- void RenderFrameDeleted(RenderFrameHost* render_frame_host) override;
+ // WebContentsObserver overrides: These events indicate that the view of the
+ // main frame may have changed..
xjz 2017/01/03 19:16:40 nit: s/../.
miu 2017/01/03 21:01:28 Done.
+ void RenderFrameCreated(RenderFrameHost* render_frame_host) final;
+ void RenderFrameDeleted(RenderFrameHost* render_frame_host) final;
void RenderFrameHostChanged(RenderFrameHost* old_host,
- RenderFrameHost* new_host) override;
+ RenderFrameHost* new_host) final;
// WebContentsObserver override to notify the client that the source size has
// changed.
- void MainFrameWasResized(bool width_changed) override;
+ void MainFrameWasResized(bool width_changed) final;
// WebContentsObserver override to notify the client that the capture target
// has been permanently lost.
- void WebContentsDestroyed() override;
+ void WebContentsDestroyed() final;
// WebContentsObserver overrides to notify the client that the capture target
// may have changed due to a separate fullscreen widget shown/destroyed.
- void DidShowFullscreenWidget() override;
- void DidDestroyFullscreenWidget() override;
+ void DidShowFullscreenWidget() final;
+ void DidDestroyFullscreenWidget() final;
// If true, the client is interested in the showing/destruction of fullscreen
- // RenderWidgetHosts.
- const bool track_fullscreen_rwh_;
+ // RenderWidgetHostViews.
+ const bool track_fullscreen_rwhv_;
+
+ // Pointer to the RenderWidgetHostView provided in the last run of
+ // |callback_|. This is used to eliminate duplicate callback runs.
+ RenderWidgetHostView* last_target_view_;
// TaskRunner corresponding to the thread that called Start().
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
- // Callback to run when the target RenderWidgetHost has changed.
+ // Callback to run when the target RenderWidgetHostView has changed.
ChangeCallback callback_;
- // Pointer to the RenderWidgetHost provided in the last run of |callback_|.
- // This is used to eliminate duplicate callback runs.
- RenderWidgetHost* last_target_;
-
- // Callback to run when the target RenderWidgetHost has resized.
+ // Callback to run when the target RenderWidgetHostView has resized.
base::Closure resize_callback_;
DISALLOW_COPY_AND_ASSIGN(WebContentsTracker);

Powered by Google App Engine
This is Rietveld 408576698