OLD | NEW |
---|---|
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 when mirroring tab |
8 // video and audio so that user navigations, crashes, iframes, etc., during a | 8 // video and audio so that user navigations, crashes, iframes, etc., during a |
9 // tab's lifetime allow the capturing code to remain active on the | 9 // tab's lifetime allow the capturing code to remain active on the |
10 // current/latest render frame tree. | 10 // current/latest render frame tree. |
(...skipping 24 matching lines...) Expand all Loading... | |
35 public: | 35 public: |
36 // If |track_fullscreen_rwh| is true, the ChangeCallback will be run when a | 36 // If |track_fullscreen_rwh| is true, the ChangeCallback will be run when a |
37 // WebContents shows/destroys a fullscreen RenderWidgetHost view. If false, | 37 // WebContents shows/destroys a fullscreen RenderWidgetHost view. If false, |
38 // fullscreen events are ignored. Specify true for video tab capture and | 38 // fullscreen events are ignored. Specify true for video tab capture and |
39 // false for audio tab capture. | 39 // false for audio tab capture. |
40 explicit WebContentsTracker(bool track_fullscreen_rwh); | 40 explicit WebContentsTracker(bool track_fullscreen_rwh); |
41 | 41 |
42 // Callback to indicate a new RenderWidgetHost should be targeted for capture. | 42 // Callback to indicate a new RenderWidgetHost should be targeted for capture. |
43 // This is also invoked with NULL to indicate tracking will not continue | 43 // This is also invoked with NULL to indicate tracking will not continue |
44 // (i.e., the WebContents instance was not found or has been destroyed). | 44 // (i.e., the WebContents instance was not found or has been destroyed). |
45 // | |
46 // WARNING: It is only safe to dereference |rwh| on the UI BrowserThread, and | |
47 // only if the Start() method was called on the UI BrowserThread. Otherwise, | |
48 // this pointer could be invalid at the time the callback is run. | |
Wez
2015/05/15 00:55:42
This warning makes ThreadingKitty sad. >.<
miu
2015/05/15 21:14:01
Acknowledged.
| |
45 typedef base::Callback<void(RenderWidgetHost* rwh)> ChangeCallback; | 49 typedef base::Callback<void(RenderWidgetHost* rwh)> ChangeCallback; |
46 | 50 |
47 // Start tracking. The last-known |render_process_id| and | 51 // Start tracking. The last-known |render_process_id| and |
48 // |main_render_frame_id| are provided, and |callback| will be run once to | 52 // |main_render_frame_id| are provided, and |callback| will be run once to |
49 // indicate the current capture target (this may occur during the invocation | 53 // indicate the current capture target (this may occur during the invocation |
50 // of Start(), or in the future). The callback will be invoked on the same | 54 // of Start(), or in the future). The callback will be invoked on the same |
51 // thread calling Start(). | 55 // thread calling Start(). |
52 virtual void Start(int render_process_id, int main_render_frame_id, | 56 virtual void Start(int render_process_id, int main_render_frame_id, |
53 const ChangeCallback& callback); | 57 const ChangeCallback& callback); |
54 | 58 |
55 // Stop tracking. Once this method returns, the callback is guaranteed not to | 59 // Stop tracking. Once this method returns, the callback is guaranteed not to |
56 // be invoked again. | 60 // be invoked again. |
57 virtual void Stop(); | 61 virtual void Stop(); |
58 | 62 |
59 // Current target. This must only be called on the UI BrowserThread. | 63 // Current target. This must only be called on the UI BrowserThread. |
60 RenderWidgetHost* GetTargetRenderWidgetHost() const; | 64 RenderWidgetHost* GetTargetRenderWidgetHost() const; |
61 | 65 |
66 // Set a callback that is run whenever the main frame of the WebContents is | |
67 // resized. This method must be called on the same thread that calls | |
68 // Start()/Stop(), and |callback| will be run on that same thread. Calling | |
69 // the Stop() method guarantees the callback will never be invoked again. | |
70 void SetResizeChangeCallback(const ChangeCallback& callback); | |
71 | |
62 protected: | 72 protected: |
63 friend class base::RefCountedThreadSafe<WebContentsTracker>; | 73 friend class base::RefCountedThreadSafe<WebContentsTracker>; |
64 ~WebContentsTracker() override; | 74 ~WebContentsTracker() override; |
65 | 75 |
66 private: | 76 private: |
67 // Determine the target RenderWidgetHost and, if different from that last | 77 // Determine the target RenderWidgetHost and, if different from that last |
68 // reported, runs the ChangeCallback on the appropriate thread. If | 78 // reported, runs the ChangeCallback on the appropriate thread. If |
69 // |force_callback_run| is true, the ChangeCallback is run even if the | 79 // |force_callback_run| is true, the ChangeCallback is run even if the |
70 // RenderWidgetHost has not changed. | 80 // RenderWidgetHost has not changed. |
71 void OnPossibleTargetChange(bool force_callback_run); | 81 void OnPossibleTargetChange(bool force_callback_run); |
72 | 82 |
73 // Called on the thread that Start()/Stop() are called on. Checks whether the | 83 // Called on the thread that Start()/Stop() are called on. Checks whether the |
74 // callback is still valid and, if so, runs it. | 84 // callback is still valid and, if so, runs it. |
75 void MaybeDoCallback(RenderWidgetHost* rwh); | 85 void MaybeDoCallback(RenderWidgetHost* rwh); |
76 | 86 |
87 // Called on the thread that Start()/Stop() are called on. Checks whether the | |
88 // callback is still valid and, if so, runs it to indicate the main frame has | |
89 // changed in size. | |
90 void MaybeDoResizeCallback(RenderWidgetHost* rwh); | |
91 | |
77 // Look-up the current WebContents instance associated with the given | 92 // Look-up the current WebContents instance associated with the given |
78 // |render_process_id| and |main_render_frame_id| and begin observing it. | 93 // |render_process_id| and |main_render_frame_id| and begin observing it. |
79 void StartObservingWebContents(int render_process_id, | 94 void StartObservingWebContents(int render_process_id, |
80 int main_render_frame_id); | 95 int main_render_frame_id); |
81 | 96 |
82 // WebContentsObserver overrides: According to web_contents_observer.h, these | 97 // WebContentsObserver overrides: According to web_contents_observer.h, these |
83 // two method overrides are all that is necessary to track the set of active | 98 // two method overrides are all that is necessary to track the set of active |
84 // RenderFrameHosts. | 99 // RenderFrameHosts. |
85 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; | 100 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; |
86 void RenderFrameHostChanged(RenderFrameHost* old_host, | 101 void RenderFrameHostChanged(RenderFrameHost* old_host, |
87 RenderFrameHost* new_host) override; | 102 RenderFrameHost* new_host) override; |
88 | 103 |
104 // WebContentsObserver override to notify the client that the source size has | |
105 // changed. | |
106 void MainFrameWasResized(bool width_changed) override; | |
107 | |
89 // WebContentsObserver override to notify the client that the capture target | 108 // WebContentsObserver override to notify the client that the capture target |
90 // has been permanently lost. | 109 // has been permanently lost. |
91 void WebContentsDestroyed() override; | 110 void WebContentsDestroyed() override; |
92 | 111 |
93 // WebContentsObserver overrides to notify the client that the capture target | 112 // WebContentsObserver overrides to notify the client that the capture target |
94 // may have changed due to a separate fullscreen widget shown/destroyed. | 113 // may have changed due to a separate fullscreen widget shown/destroyed. |
95 void DidShowFullscreenWidget(int routing_id) override; | 114 void DidShowFullscreenWidget(int routing_id) override; |
96 void DidDestroyFullscreenWidget(int routing_id) override; | 115 void DidDestroyFullscreenWidget(int routing_id) override; |
97 | 116 |
98 // If true, the client is interested in the showing/destruction of fullscreen | 117 // If true, the client is interested in the showing/destruction of fullscreen |
99 // RenderWidgetHosts. | 118 // RenderWidgetHosts. |
100 const bool track_fullscreen_rwh_; | 119 const bool track_fullscreen_rwh_; |
101 | 120 |
102 // TaskRunner corresponding to the thread that called Start(). | 121 // TaskRunner corresponding to the thread that called Start(). |
103 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 122 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
104 | 123 |
105 // Callback to run when the target RenderWidgetHost has changed. | 124 // Callback to run when the target RenderWidgetHost has changed. |
106 ChangeCallback callback_; | 125 ChangeCallback callback_; |
107 | 126 |
108 // Pointer to the RenderWidgetHost provided in the last run of |callback_|. | 127 // Pointer to the RenderWidgetHost provided in the last run of |callback_|. |
109 // This is used to eliminate duplicate callback runs. | 128 // This is used to eliminate duplicate callback runs. |
110 RenderWidgetHost* last_target_; | 129 RenderWidgetHost* last_target_; |
111 | 130 |
131 // Callback to run when the target RenderWidgetHost has resized. | |
132 ChangeCallback resize_callback_; | |
133 | |
112 DISALLOW_COPY_AND_ASSIGN(WebContentsTracker); | 134 DISALLOW_COPY_AND_ASSIGN(WebContentsTracker); |
113 }; | 135 }; |
114 | 136 |
115 } // namespace content | 137 } // namespace content |
116 | 138 |
117 #endif // CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_TRACKER_H_ | 139 #endif // CONTENT_BROWSER_MEDIA_CAPTURE_WEB_CONTENTS_TRACKER_H_ |
OLD | NEW |