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

Side by Side Diff: chrome/browser/extensions/api/tab_capture/offscreen_presentation.cc

Issue 1221483002: New tabCapture.captureOffscreenTab API, initially for Presentation API 1UA mode (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Register off-screen tabs as presentations via separate private API. Created 5 years, 2 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 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 "base/rand_util.h"
11 #include "base/strings/string_number_conversions.h"
10 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h" 12 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h"
11 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/browser/ui/web_contents_sizer.h" 14 #include "chrome/browser/ui/web_contents_sizer.h"
13 #include "content/public/browser/render_widget_host_view.h" 15 #include "content/public/browser/render_widget_host_view.h"
14 #include "content/public/browser/web_contents.h" 16 #include "content/public/browser/web_contents.h"
15 #include "extensions/browser/extension_host.h" 17 #include "extensions/browser/extension_host.h"
16 #include "extensions/browser/process_manager.h" 18 #include "extensions/browser/process_manager.h"
17 19
18 #if defined(USE_AURA) 20 #if defined(USE_AURA)
19 #include "base/memory/weak_ptr.h" 21 #include "base/memory/weak_ptr.h"
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 OffscreenPresentationsOwner::~OffscreenPresentationsOwner() {} 133 OffscreenPresentationsOwner::~OffscreenPresentationsOwner() {}
132 134
133 // static 135 // static
134 OffscreenPresentationsOwner* OffscreenPresentationsOwner::Get( 136 OffscreenPresentationsOwner* OffscreenPresentationsOwner::Get(
135 content::WebContents* extension_web_contents) { 137 content::WebContents* extension_web_contents) {
136 // CreateForWebContents() really means "create if not exists." 138 // CreateForWebContents() really means "create if not exists."
137 CreateForWebContents(extension_web_contents); 139 CreateForWebContents(extension_web_contents);
138 return FromWebContents(extension_web_contents); 140 return FromWebContents(extension_web_contents);
139 } 141 }
140 142
141 OffscreenPresentation* OffscreenPresentationsOwner::FindOrStartPresentation( 143 OffscreenPresentation* OffscreenPresentationsOwner::StartPresentation(
142 const GURL& start_url, 144 const GURL& start_url,
143 const std::string& presentation_id,
144 const gfx::Size& initial_size) { 145 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) 146 if (presentations_.size() >= kMaxPresentationsPerExtension)
154 return nullptr; // Maximum number of presentations reached. 147 return nullptr; // Maximum number of presentations reached.
155 148
156 presentation = new OffscreenPresentation(this, start_url, presentation_id); 149 presentations_.push_back(new OffscreenPresentation(
157 presentations_.push_back(presentation); 150 this,
158 presentation->Start(initial_size); 151 start_url,
159 return presentation; 152 CreateUniqueRandomId()));
153 presentations_.back()->Start(initial_size);
154 return presentations_.back();
155 }
156
157 OffscreenPresentation* OffscreenPresentationsOwner::FindByOffscreenTabId(
158 const std::string& offscreen_tab_id) const {
159 for (OffscreenPresentation* p : presentations_) {
160 if (p->id() == offscreen_tab_id)
161 return p;
162 }
163 return nullptr;
160 } 164 }
161 165
162 void OffscreenPresentationsOwner::ClosePresentation( 166 void OffscreenPresentationsOwner::ClosePresentation(
163 OffscreenPresentation* presentation) { 167 OffscreenPresentation* presentation) {
164 const auto it = 168 const auto it =
165 std::find(presentations_.begin(), presentations_.end(), presentation); 169 std::find(presentations_.begin(), presentations_.end(), presentation);
166 if (it != presentations_.end()) 170 if (it != presentations_.end())
167 presentations_.erase(it); 171 presentations_.erase(it);
168 } 172 }
169 173
170 OffscreenPresentation* OffscreenPresentationsOwner::FindPresentation( 174 std::string OffscreenPresentationsOwner::CreateUniqueRandomId() const {
171 const GURL& start_url, const std::string& presentation_id) const { 175 while (true) {
not at google - send to devlin 2015/10/02 01:17:26 Curious: what is the advantage in generating a ran
miu 2015/10/02 18:58:21 No longer applicable.
172 for (OffscreenPresentation* presentation : presentations_) { 176 const uint64 random_number = base::RandUint64();
173 if (presentation->start_url() == start_url && 177 const std::string candidate_id =
174 presentation->presentation_id() == presentation_id) 178 base::HexEncode(&random_number, sizeof(random_number));
175 return presentation; 179 if (!FindByOffscreenTabId(candidate_id))
180 return candidate_id;
176 } 181 }
177 return nullptr;
178 } 182 }
179 183
180 OffscreenPresentation::OffscreenPresentation(OffscreenPresentationsOwner* owner, 184 OffscreenPresentation::OffscreenPresentation(OffscreenPresentationsOwner* owner,
181 const GURL& start_url, 185 const GURL& start_url,
182 const std::string& id) 186 const std::string& id)
183 : owner_(owner), 187 : owner_(owner),
184 start_url_(start_url), 188 start_url_(start_url),
185 presentation_id_(id), 189 id_(id),
186 profile_(Profile::FromBrowserContext( 190 profile_(Profile::FromBrowserContext(
187 owner->extension_web_contents()->GetBrowserContext()) 191 owner->extension_web_contents()->GetBrowserContext())
188 ->CreateOffTheRecordProfile()), 192 ->CreateOffTheRecordProfile()),
189 capture_poll_timer_(false, false), 193 capture_poll_timer_(false, false),
190 content_capture_was_detected_(false) { 194 content_capture_was_detected_(false) {
191 DCHECK(profile_); 195 DCHECK(profile_);
192 } 196 }
193 197
194 OffscreenPresentation::~OffscreenPresentation() { 198 OffscreenPresentation::~OffscreenPresentation() {
195 DVLOG(1) << "Destroying OffscreenPresentation for start_url=" 199 DVLOG(1) << "Destroying OffscreenPresentation for start_url="
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 DCHECK_EQ(presentation_web_contents_.get(), contents); 378 DCHECK_EQ(presentation_web_contents_.get(), contents);
375 379
376 // This method is being called to check whether an extension is permitted to 380 // 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 381 // capture the page. Verify that the request is being made by the extension
378 // that spawned this OffscreenPresentation. 382 // that spawned this OffscreenPresentation.
379 383
380 // Find the extension ID associated with the extension background page's 384 // Find the extension ID associated with the extension background page's
381 // WebContents. 385 // WebContents.
382 content::BrowserContext* const extension_browser_context = 386 content::BrowserContext* const extension_browser_context =
383 owner_->extension_web_contents()->GetBrowserContext(); 387 owner_->extension_web_contents()->GetBrowserContext();
384 std::string extension_id; 388 const extensions::Extension* const extension =
385 for (const ExtensionHost* host : 389 ProcessManager::Get(extension_browser_context)->
386 ProcessManager::Get(extension_browser_context)->background_hosts()) { 390 GetExtensionForWebContents(owner_->extension_web_contents());
387 if (host->host_contents() == owner_->extension_web_contents()) { 391 const std::string extension_id = extension ? extension->id() : "";
388 extension_id = host->extension_id(); 392 LOG_IF(DFATAL, extension_id.empty())
389 break; 393 << "Extension that started this OffscreenPresentation was not found.";
390 }
391 }
392 394
393 // If verified, allow any tab capture audio/video devices that were requested. 395 // If verified, allow any tab capture audio/video devices that were requested.
394 extensions::TabCaptureRegistry* const tab_capture_registry = 396 extensions::TabCaptureRegistry* const tab_capture_registry =
395 extensions::TabCaptureRegistry::Get(extension_browser_context); 397 extensions::TabCaptureRegistry::Get(extension_browser_context);
396 content::MediaStreamDevices devices; 398 content::MediaStreamDevices devices;
397 if (tab_capture_registry && tab_capture_registry->VerifyRequest( 399 if (tab_capture_registry && tab_capture_registry->VerifyRequest(
398 request.render_process_id, 400 request.render_process_id,
399 request.render_frame_id, 401 request.render_frame_id,
400 extension_id)) { 402 extension_id)) {
401 if (request.audio_type == content::MEDIA_TAB_AUDIO_CAPTURE) { 403 if (request.audio_type == content::MEDIA_TAB_AUDIO_CAPTURE) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 470
469 // Schedule the timer to check again in a second. 471 // Schedule the timer to check again in a second.
470 capture_poll_timer_.Start( 472 capture_poll_timer_.Start(
471 FROM_HERE, 473 FROM_HERE,
472 base::TimeDelta::FromSeconds(kPollIntervalInSeconds), 474 base::TimeDelta::FromSeconds(kPollIntervalInSeconds),
473 base::Bind(&OffscreenPresentation::DieIfContentCaptureEnded, 475 base::Bind(&OffscreenPresentation::DieIfContentCaptureEnded,
474 base::Unretained(this))); 476 base::Unretained(this)));
475 } 477 }
476 478
477 } // namespace extensions 479 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698