OLD | NEW |
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 "chrome/browser/extensions/api/tab_capture/offscreen_presentation.h" | 5 #include "chrome/browser/extensions/api/tab_capture/offscreen_presentation.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h" | 10 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h" |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 OffscreenPresentationsOwner::~OffscreenPresentationsOwner() {} | 131 OffscreenPresentationsOwner::~OffscreenPresentationsOwner() {} |
132 | 132 |
133 // static | 133 // static |
134 OffscreenPresentationsOwner* OffscreenPresentationsOwner::Get( | 134 OffscreenPresentationsOwner* OffscreenPresentationsOwner::Get( |
135 content::WebContents* extension_web_contents) { | 135 content::WebContents* extension_web_contents) { |
136 // CreateForWebContents() really means "create if not exists." | 136 // CreateForWebContents() really means "create if not exists." |
137 CreateForWebContents(extension_web_contents); | 137 CreateForWebContents(extension_web_contents); |
138 return FromWebContents(extension_web_contents); | 138 return FromWebContents(extension_web_contents); |
139 } | 139 } |
140 | 140 |
141 OffscreenPresentation* OffscreenPresentationsOwner::FindOrStartPresentation( | 141 OffscreenPresentation* OffscreenPresentationsOwner::StartPresentation( |
142 const GURL& start_url, | 142 const GURL& start_url, |
143 const std::string& presentation_id, | 143 const std::string& presentation_id, |
144 const gfx::Size& initial_size) { | 144 const gfx::Size& initial_size) { |
145 OffscreenPresentation* presentation = | |
146 FindPresentation(start_url, presentation_id); | |
147 if (presentation) { | |
148 DVLOG(1) << "Returning already-running OffscreenPresentation for start_url=" | |
149 << presentation->start_url(); | |
150 return presentation; | |
151 } | |
152 | |
153 if (presentations_.size() >= kMaxPresentationsPerExtension) | 145 if (presentations_.size() >= kMaxPresentationsPerExtension) |
154 return nullptr; // Maximum number of presentations reached. | 146 return nullptr; // Maximum number of presentations reached. |
155 | 147 |
156 presentation = new OffscreenPresentation(this, start_url, presentation_id); | 148 presentations_.push_back( |
157 presentations_.push_back(presentation); | 149 new OffscreenPresentation(this, start_url, presentation_id)); |
158 presentation->Start(initial_size); | 150 presentations_.back()->Start(initial_size); |
159 return presentation; | 151 return presentations_.back(); |
160 } | 152 } |
161 | 153 |
162 void OffscreenPresentationsOwner::ClosePresentation( | 154 void OffscreenPresentationsOwner::ClosePresentation( |
163 OffscreenPresentation* presentation) { | 155 OffscreenPresentation* presentation) { |
164 const auto it = | 156 const auto it = |
165 std::find(presentations_.begin(), presentations_.end(), presentation); | 157 std::find(presentations_.begin(), presentations_.end(), presentation); |
166 if (it != presentations_.end()) | 158 if (it != presentations_.end()) |
167 presentations_.erase(it); | 159 presentations_.erase(it); |
168 } | 160 } |
169 | 161 |
170 OffscreenPresentation* OffscreenPresentationsOwner::FindPresentation( | |
171 const GURL& start_url, const std::string& presentation_id) const { | |
172 for (OffscreenPresentation* presentation : presentations_) { | |
173 if (presentation->start_url() == start_url && | |
174 presentation->presentation_id() == presentation_id) | |
175 return presentation; | |
176 } | |
177 return nullptr; | |
178 } | |
179 | |
180 OffscreenPresentation::OffscreenPresentation(OffscreenPresentationsOwner* owner, | 162 OffscreenPresentation::OffscreenPresentation(OffscreenPresentationsOwner* owner, |
181 const GURL& start_url, | 163 const GURL& start_url, |
182 const std::string& id) | 164 const std::string& id) |
183 : owner_(owner), | 165 : owner_(owner), |
184 start_url_(start_url), | 166 start_url_(start_url), |
185 presentation_id_(id), | 167 presentation_id_(id), |
186 profile_(Profile::FromBrowserContext( | 168 profile_(Profile::FromBrowserContext( |
187 owner->extension_web_contents()->GetBrowserContext()) | 169 owner->extension_web_contents()->GetBrowserContext()) |
188 ->CreateOffTheRecordProfile()), | 170 ->CreateOffTheRecordProfile()), |
189 capture_poll_timer_(false, false), | 171 capture_poll_timer_(false, false), |
(...skipping 22 matching lines...) Expand all Loading... |
212 #endif | 194 #endif |
213 | 195 |
214 // Set initial size, if specified. | 196 // Set initial size, if specified. |
215 if (!initial_size.IsEmpty()) | 197 if (!initial_size.IsEmpty()) |
216 ResizeWebContents(presentation_web_contents_.get(), initial_size); | 198 ResizeWebContents(presentation_web_contents_.get(), initial_size); |
217 | 199 |
218 // Mute audio output. When tab capture starts, the audio will be | 200 // Mute audio output. When tab capture starts, the audio will be |
219 // automatically unmuted, but will be captured into the MediaStream. | 201 // automatically unmuted, but will be captured into the MediaStream. |
220 presentation_web_contents_->SetAudioMuted(true); | 202 presentation_web_contents_->SetAudioMuted(true); |
221 | 203 |
| 204 // TODO(imcheng): If |presentation_id_| is not empty, register it with the |
| 205 // PresentationRouter. http://crbug.com/513859 |
| 206 if (!presentation_id_.empty()) { |
| 207 NOTIMPLEMENTED() |
| 208 << "Register with PresentationRouter, id=" << presentation_id_; |
| 209 } |
| 210 |
222 // Navigate to the initial URL of the presentation. | 211 // Navigate to the initial URL of the presentation. |
223 content::NavigationController::LoadURLParams load_params(start_url_); | 212 content::NavigationController::LoadURLParams load_params(start_url_); |
224 load_params.should_replace_current_entry = true; | 213 load_params.should_replace_current_entry = true; |
225 load_params.should_clear_history_list = true; | 214 load_params.should_clear_history_list = true; |
226 presentation_web_contents_->GetController().LoadURLWithParams(load_params); | 215 presentation_web_contents_->GetController().LoadURLWithParams(load_params); |
227 | 216 |
228 start_time_ = base::TimeTicks::Now(); | 217 start_time_ = base::TimeTicks::Now(); |
229 DieIfContentCaptureEnded(); | 218 DieIfContentCaptureEnded(); |
230 } | 219 } |
231 | 220 |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 DCHECK_EQ(presentation_web_contents_.get(), contents); | 363 DCHECK_EQ(presentation_web_contents_.get(), contents); |
375 | 364 |
376 // This method is being called to check whether an extension is permitted to | 365 // This method is being called to check whether an extension is permitted to |
377 // capture the page. Verify that the request is being made by the extension | 366 // capture the page. Verify that the request is being made by the extension |
378 // that spawned this OffscreenPresentation. | 367 // that spawned this OffscreenPresentation. |
379 | 368 |
380 // Find the extension ID associated with the extension background page's | 369 // Find the extension ID associated with the extension background page's |
381 // WebContents. | 370 // WebContents. |
382 content::BrowserContext* const extension_browser_context = | 371 content::BrowserContext* const extension_browser_context = |
383 owner_->extension_web_contents()->GetBrowserContext(); | 372 owner_->extension_web_contents()->GetBrowserContext(); |
384 std::string extension_id; | 373 const extensions::Extension* const extension = |
385 for (const ExtensionHost* host : | 374 ProcessManager::Get(extension_browser_context)-> |
386 ProcessManager::Get(extension_browser_context)->background_hosts()) { | 375 GetExtensionForWebContents(owner_->extension_web_contents()); |
387 if (host->host_contents() == owner_->extension_web_contents()) { | 376 const std::string extension_id = extension ? extension->id() : ""; |
388 extension_id = host->extension_id(); | 377 LOG_IF(DFATAL, extension_id.empty()) |
389 break; | 378 << "Extension that started this OffscreenPresentation was not found."; |
390 } | |
391 } | |
392 | 379 |
393 // If verified, allow any tab capture audio/video devices that were requested. | 380 // If verified, allow any tab capture audio/video devices that were requested. |
394 extensions::TabCaptureRegistry* const tab_capture_registry = | 381 extensions::TabCaptureRegistry* const tab_capture_registry = |
395 extensions::TabCaptureRegistry::Get(extension_browser_context); | 382 extensions::TabCaptureRegistry::Get(extension_browser_context); |
396 content::MediaStreamDevices devices; | 383 content::MediaStreamDevices devices; |
397 if (tab_capture_registry && tab_capture_registry->VerifyRequest( | 384 if (tab_capture_registry && tab_capture_registry->VerifyRequest( |
398 request.render_process_id, | 385 request.render_process_id, |
399 request.render_frame_id, | 386 request.render_frame_id, |
400 extension_id)) { | 387 extension_id)) { |
401 if (request.audio_type == content::MEDIA_TAB_AUDIO_CAPTURE) { | 388 if (request.audio_type == content::MEDIA_TAB_AUDIO_CAPTURE) { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 | 455 |
469 // Schedule the timer to check again in a second. | 456 // Schedule the timer to check again in a second. |
470 capture_poll_timer_.Start( | 457 capture_poll_timer_.Start( |
471 FROM_HERE, | 458 FROM_HERE, |
472 base::TimeDelta::FromSeconds(kPollIntervalInSeconds), | 459 base::TimeDelta::FromSeconds(kPollIntervalInSeconds), |
473 base::Bind(&OffscreenPresentation::DieIfContentCaptureEnded, | 460 base::Bind(&OffscreenPresentation::DieIfContentCaptureEnded, |
474 base::Unretained(this))); | 461 base::Unretained(this))); |
475 } | 462 } |
476 | 463 |
477 } // namespace extensions | 464 } // namespace extensions |
OLD | NEW |