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

Side by Side 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 3 years, 11 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 (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 // Given a starting render_process_id and main_render_frame_id, the 5 // Given a starting render_process_id and main_render_frame_id, the
6 // WebContentsTracker tracks changes to the active RenderFrameHost tree during 6 // WebContentsTracker tracks changes to the active RenderFrameHost tree during
7 // the lifetime of a WebContents instance. This is used when mirroring tab 7 // the lifetime of a WebContents instance. This is used to maintain capture of
8 // video and audio so that user navigations, crashes, iframes, etc., during a 8 // the WebContents's video and audio across page transitions such as user
9 // tab's lifetime allow the capturing code to remain active on the 9 // navigations, crashes, iframes, etc..
10 // current/latest render frame tree.
11 // 10 //
12 // Threading issues: Start(), Stop() and the ChangeCallback are invoked on the 11 // Threading issues: Start(), Stop() and the ChangeCallback must be invoked on
13 // same thread. This can be any thread, and the decision is locked-in by 12 // the same thread. This can be any thread, and the decision is locked-in once
14 // WebContentsTracker when Start() is called. 13 // WebContentsTracker::Start() is called.
15 14
16 #ifndef CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_TRACKER_H_ 15 #ifndef CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_TRACKER_H_
17 #define CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_TRACKER_H_ 16 #define CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_TRACKER_H_
18 17
19 #include "base/callback.h" 18 #include "base/callback.h"
20 #include "base/macros.h" 19 #include "base/macros.h"
21 #include "base/memory/ref_counted.h" 20 #include "base/memory/ref_counted.h"
22 #include "content/common/content_export.h" 21 #include "content/common/content_export.h"
23 #include "content/public/browser/web_contents_observer.h" 22 #include "content/public/browser/web_contents_observer.h"
24 23
25 namespace base { 24 namespace base {
26 class SingleThreadTaskRunner; 25 class SingleThreadTaskRunner;
27 } 26 }
28 27
29 namespace content { 28 namespace content {
30 29
31 class RenderWidgetHost; 30 class RenderWidgetHostView;
32 31
33 class CONTENT_EXPORT WebContentsTracker 32 class CONTENT_EXPORT WebContentsTracker
34 : public base::RefCountedThreadSafe<WebContentsTracker>, 33 : public base::RefCountedThreadSafe<WebContentsTracker>,
35 public WebContentsObserver { 34 public WebContentsObserver {
36 public: 35 public:
37 // If |track_fullscreen_rwh| is true, the ChangeCallback will be run when a 36 // If |track_fullscreen_rwhv| is true, the ChangeCallback will be run when a
38 // WebContents shows/destroys a fullscreen RenderWidgetHost view. If false, 37 // WebContents shows/destroys a fullscreen RenderWidgetHostView. If false,
39 // fullscreen events are ignored. Specify true for video tab capture and 38 // fullscreen events are ignored. Normally, specify true for video capture and
40 // false for audio tab capture. 39 // false for audio capture.
41 explicit WebContentsTracker(bool track_fullscreen_rwh); 40 explicit WebContentsTracker(bool track_fullscreen_rwhv);
42 41
43 // Callback to indicate a new RenderWidgetHost should be targeted for capture. 42 // Callback to indicate a new RenderWidgetHostView should be targeted for
44 // This is also invoked with false to indicate tracking will not continue 43 // capture. This is also invoked with false to indicate tracking will not
45 // (i.e., the WebContents instance was not found or has been destroyed). 44 // continue (i.e., the WebContents instance was not found or has been
45 // destroyed).
46 typedef base::Callback<void(bool was_still_tracking)> ChangeCallback; 46 typedef base::Callback<void(bool was_still_tracking)> ChangeCallback;
47 47
48 // Start tracking. The last-known |render_process_id| and 48 // Start tracking. The last-known |render_process_id| and
49 // |main_render_frame_id| are provided, and |callback| will be run once to 49 // |main_render_frame_id| are provided, and |callback| will be run once to
50 // indicate whether tracking successfully started (this may occur during the 50 // indicate whether tracking successfully started (this may occur during the
51 // invocation of Start(), or in the future). The callback will be invoked on 51 // invocation of Start(), or in the future). The callback will be invoked on
52 // the same thread calling Start(). 52 // the same thread calling Start().
53 virtual void Start(int render_process_id, int main_render_frame_id, 53 virtual void Start(int render_process_id, int main_render_frame_id,
54 const ChangeCallback& callback); 54 const ChangeCallback& callback);
55 55
56 // Stop tracking. Once this method returns, the callback is guaranteed not to 56 // Stop tracking. Once this method returns, the callback is guaranteed not to
57 // be invoked again. 57 // be invoked again.
58 virtual void Stop(); 58 virtual void Stop();
59 59
60 // Current target. This must only be called on the UI BrowserThread. 60 // Returns true if this tracker is still able to continue tracking changes.
61 RenderWidgetHost* GetTargetRenderWidgetHost() const; 61 // This must only be called on the UI BrowserThread.
62 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.
63
64 // Current target view. May return nullptr during certain transient periods.
65 // This must only be called on the UI BrowserThread.
66 RenderWidgetHostView* GetTargetView() const;
62 67
63 // Set a callback that is run whenever the main frame of the WebContents is 68 // Set a callback that is run whenever the main frame of the WebContents is
64 // resized. This method must be called on the same thread that calls 69 // resized. This method must be called on the same thread that calls
65 // Start()/Stop(), and |callback| will be run on that same thread. Calling 70 // Start()/Stop(), and |callback| will be run on that same thread. Calling
66 // the Stop() method guarantees the callback will never be invoked again. 71 // the Stop() method guarantees the callback will never be invoked again.
67 void SetResizeChangeCallback(const base::Closure& callback); 72 void SetResizeChangeCallback(const base::Closure& callback);
68 73
69 protected: 74 protected:
70 friend class base::RefCountedThreadSafe<WebContentsTracker>; 75 friend class base::RefCountedThreadSafe<WebContentsTracker>;
71 ~WebContentsTracker() override; 76 ~WebContentsTracker() override;
72 77
73 private: 78 private:
74 // Determine the target RenderWidgetHost and, if different from that last 79 // Determine the target RenderWidgetHostView and, if different from that last
75 // reported, runs the ChangeCallback on the appropriate thread. If 80 // reported, runs the ChangeCallback on the appropriate thread. If
76 // |force_callback_run| is true, the ChangeCallback is run even if the 81 // |force_callback_run| is true, the ChangeCallback is run even if the
77 // RenderWidgetHost has not changed. 82 // 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.
78 void OnPossibleTargetChange(bool force_callback_run); 83 void OnPossibleTargetChange(bool force_callback_run);
79 84
80 // Called on the thread that Start()/Stop() are called on. Checks whether the 85 // Called on the thread that Start()/Stop() are called on. Checks whether the
81 // callback is still valid and, if so, runs it. 86 // callback is still valid and, if so, runs it.
82 void MaybeDoCallback(bool was_still_tracking); 87 void MaybeDoCallback(bool was_still_tracking);
83 88
84 // Called on the thread that Start()/Stop() are called on. Checks whether the 89 // Called on the thread that Start()/Stop() are called on. Checks whether the
85 // callback is still valid and, if so, runs it to indicate the main frame has 90 // callback is still valid and, if so, runs it to indicate the main frame has
86 // changed in size. 91 // changed in size.
87 void MaybeDoResizeCallback(); 92 void MaybeDoResizeCallback();
88 93
89 // Look-up the current WebContents instance associated with the given 94 // Look-up the current WebContents instance associated with the given
90 // |render_process_id| and |main_render_frame_id| and begin observing it. 95 // |render_process_id| and |main_render_frame_id| and begin observing it.
91 void StartObservingWebContents(int render_process_id, 96 void StartObservingWebContents(int render_process_id,
92 int main_render_frame_id); 97 int main_render_frame_id);
93 98
94 // WebContentsObserver overrides: According to web_contents_observer.h, these 99 // WebContentsObserver overrides: These events indicate that the view of the
95 // two method overrides are all that is necessary to track the set of active 100 // main frame may have changed..
xjz 2017/01/03 19:16:40 nit: s/../.
miu 2017/01/03 21:01:28 Done.
96 // RenderFrameHosts. 101 void RenderFrameCreated(RenderFrameHost* render_frame_host) final;
97 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; 102 void RenderFrameDeleted(RenderFrameHost* render_frame_host) final;
98 void RenderFrameHostChanged(RenderFrameHost* old_host, 103 void RenderFrameHostChanged(RenderFrameHost* old_host,
99 RenderFrameHost* new_host) override; 104 RenderFrameHost* new_host) final;
100 105
101 // WebContentsObserver override to notify the client that the source size has 106 // WebContentsObserver override to notify the client that the source size has
102 // changed. 107 // changed.
103 void MainFrameWasResized(bool width_changed) override; 108 void MainFrameWasResized(bool width_changed) final;
104 109
105 // WebContentsObserver override to notify the client that the capture target 110 // WebContentsObserver override to notify the client that the capture target
106 // has been permanently lost. 111 // has been permanently lost.
107 void WebContentsDestroyed() override; 112 void WebContentsDestroyed() final;
108 113
109 // WebContentsObserver overrides to notify the client that the capture target 114 // WebContentsObserver overrides to notify the client that the capture target
110 // may have changed due to a separate fullscreen widget shown/destroyed. 115 // may have changed due to a separate fullscreen widget shown/destroyed.
111 void DidShowFullscreenWidget() override; 116 void DidShowFullscreenWidget() final;
112 void DidDestroyFullscreenWidget() override; 117 void DidDestroyFullscreenWidget() final;
113 118
114 // If true, the client is interested in the showing/destruction of fullscreen 119 // If true, the client is interested in the showing/destruction of fullscreen
115 // RenderWidgetHosts. 120 // RenderWidgetHostViews.
116 const bool track_fullscreen_rwh_; 121 const bool track_fullscreen_rwhv_;
122
123 // Pointer to the RenderWidgetHostView provided in the last run of
124 // |callback_|. This is used to eliminate duplicate callback runs.
125 RenderWidgetHostView* last_target_view_;
117 126
118 // TaskRunner corresponding to the thread that called Start(). 127 // TaskRunner corresponding to the thread that called Start().
119 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 128 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
120 129
121 // Callback to run when the target RenderWidgetHost has changed. 130 // Callback to run when the target RenderWidgetHostView has changed.
122 ChangeCallback callback_; 131 ChangeCallback callback_;
123 132
124 // Pointer to the RenderWidgetHost provided in the last run of |callback_|. 133 // Callback to run when the target RenderWidgetHostView has resized.
125 // This is used to eliminate duplicate callback runs.
126 RenderWidgetHost* last_target_;
127
128 // Callback to run when the target RenderWidgetHost has resized.
129 base::Closure resize_callback_; 134 base::Closure resize_callback_;
130 135
131 DISALLOW_COPY_AND_ASSIGN(WebContentsTracker); 136 DISALLOW_COPY_AND_ASSIGN(WebContentsTracker);
132 }; 137 };
133 138
134 } // namespace content 139 } // namespace content
135 140
136 #endif // CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_TRACKER_H_ 141 #endif // CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_TRACKER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698