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

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

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 #ifndef CHROME_BROWSER_EXTENSIONS_API_TAB_CAPTURE_OFFSCREEN_PRESENTATION_H_ 5 #ifndef CHROME_BROWSER_EXTENSIONS_API_TAB_CAPTURE_OFFSCREEN_PRESENTATION_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_TAB_CAPTURE_OFFSCREEN_PRESENTATION_H_ 6 #define CHROME_BROWSER_EXTENSIONS_API_TAB_CAPTURE_OFFSCREEN_PRESENTATION_H_
7 7
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/memory/scoped_vector.h" 11 #include "base/memory/scoped_vector.h"
12 #include "base/time/time.h" 12 #include "base/time/time.h"
13 #include "base/timer/timer.h" 13 #include "base/timer/timer.h"
14 #include "content/public/browser/web_contents_delegate.h" 14 #include "content/public/browser/web_contents_delegate.h"
15 #include "content/public/browser/web_contents_observer.h" 15 #include "content/public/browser/web_contents_observer.h"
16 #include "content/public/browser/web_contents_user_data.h" 16 #include "content/public/browser/web_contents_user_data.h"
17 #include "ui/gfx/geometry/size.h" 17 #include "ui/gfx/geometry/size.h"
18 18
19 class Profile; 19 class Profile;
20 20
21 namespace extensions { 21 namespace extensions {
22 22
23 // TODO(miu): This file and classes should be renamed, as this implementation
24 // has expanded in scope to be used for all off-screen tabs.
25
23 class OffscreenPresentation; // Forward declaration. See below. 26 class OffscreenPresentation; // Forward declaration. See below.
24 27
25 // Creates, owns, and manages all OffscreenPresentation instances created by the 28 // Creates, owns, and manages all OffscreenPresentation instances created by the
26 // same extension background page. When the extension background page's 29 // same extension background page. When the extension background page's
27 // WebContents is about to be destroyed, its associated 30 // WebContents is about to be destroyed, its associated
28 // OffscreenPresentationsOwner and all of its OffscreenPresentation instances 31 // OffscreenPresentationsOwner and all of its OffscreenPresentation instances
29 // are destroyed. 32 // are destroyed.
30 // 33 //
31 // Usage: 34 // Usage:
32 // 35 //
33 // OffscreenPresentationsOwner::Get(extension_contents) 36 // OffscreenPresentationsOwner::Get(extension_contents)
34 // ->FindOrStartPresentation(start_url, presentation_id, size); 37 // ->StartPresentation(start_url, size);
35 // 38 //
36 // This class operates exclusively on the UI thread and so is not thread-safe. 39 // This class operates exclusively on the UI thread and so is not thread-safe.
37 class OffscreenPresentationsOwner 40 class OffscreenPresentationsOwner
38 : protected content::WebContentsUserData<OffscreenPresentationsOwner> { 41 : protected content::WebContentsUserData<OffscreenPresentationsOwner> {
39 public: 42 public:
40 ~OffscreenPresentationsOwner() override; 43 ~OffscreenPresentationsOwner() override;
41 44
42 // Returns the OffscreenPresentationsOwner instance associated with the given 45 // Returns the OffscreenPresentationsOwner instance associated with the given
43 // extension background page's WebContents. Never returns nullptr. 46 // extension background page's WebContents. Never returns nullptr.
44 static OffscreenPresentationsOwner* Get( 47 static OffscreenPresentationsOwner* Get(
45 content::WebContents* extension_web_contents); 48 content::WebContents* extension_web_contents);
46 49
47 // Find a presentation, keyed by |start_url| and |presentation_id|. If found, 50 // Instantiate a new off-screen tab and navigate it to |start_url|. The new
48 // return it. Otherwise, instantiate a new one and return that. If too many 51 // tab's main frame will start out with the given |initial_size| in DIP
49 // presentations have already been started, this method returns nullptr. 52 // coordinates. If too many off-screen tabs have already been started, this
50 OffscreenPresentation* FindOrStartPresentation( 53 // method returns nullptr.
54 OffscreenPresentation* StartPresentation(
51 const GURL& start_url, 55 const GURL& start_url,
52 const std::string& presentation_id,
53 const gfx::Size& initial_size); 56 const gfx::Size& initial_size);
54 57
58 // Retrieve an existing instance by its ID. If not found, this method returns
59 // nullptr.
60 OffscreenPresentation* FindByOffscreenTabId(
61 const std::string& offscreen_tab_id) const;
62
55 protected: 63 protected:
56 friend class OffscreenPresentation; 64 friend class OffscreenPresentation;
57 65
58 // Accessor to the extension background page's WebContents. 66 // Accessor to the extension background page's WebContents.
59 content::WebContents* extension_web_contents() const { 67 content::WebContents* extension_web_contents() const {
60 return extension_web_contents_; 68 return extension_web_contents_;
61 } 69 }
62 70
63 // Shuts down and destroys the |presentation|. 71 // Shuts down and destroys the |presentation|.
64 void ClosePresentation(OffscreenPresentation* presentation); 72 void ClosePresentation(OffscreenPresentation* presentation);
65 73
66 private: 74 private:
67 friend class content::WebContentsUserData<OffscreenPresentationsOwner>; 75 friend class content::WebContentsUserData<OffscreenPresentationsOwner>;
68 76
69 explicit OffscreenPresentationsOwner(content::WebContents* contents); 77 explicit OffscreenPresentationsOwner(content::WebContents* contents);
70 78
71 // Returns the OffscreenPresentation that matches the given |start_url| and 79 // Returns a unique, random ID that no other OffscreenPresentation has.
72 // |presentation_id|, or nullptr if not found. 80 std::string CreateUniqueRandomId() const;
73 OffscreenPresentation* FindPresentation(
74 const GURL& start_url, const std::string& presentation_id) const;
75 81
76 content::WebContents* const extension_web_contents_; 82 content::WebContents* const extension_web_contents_;
77 ScopedVector<OffscreenPresentation> presentations_; 83 ScopedVector<OffscreenPresentation> presentations_;
78 84
79 DISALLOW_COPY_AND_ASSIGN(OffscreenPresentationsOwner); 85 DISALLOW_COPY_AND_ASSIGN(OffscreenPresentationsOwner);
80 }; 86 };
81 87
82 // Owns and controls a WebContents instance containing a presentation page. 88 // Owns and controls a WebContents instance containing a presentation page.
83 // Since the presentation page does not interact with the user in any direct 89 // Since the presentation page does not interact with the user in any direct
84 // way, the WebContents is not attached to any Browser window/UI, and all input 90 // way, the WebContents is not attached to any Browser window/UI, and all input
(...skipping 12 matching lines...) Expand all
97 // 3. Automatically, when the extension background page's WebContents is 103 // 3. Automatically, when the extension background page's WebContents is
98 // destroyed. 104 // destroyed.
99 // 105 //
100 // This class operates exclusively on the UI thread and so is not thread-safe. 106 // This class operates exclusively on the UI thread and so is not thread-safe.
101 class OffscreenPresentation : protected content::WebContentsDelegate, 107 class OffscreenPresentation : protected content::WebContentsDelegate,
102 protected content::WebContentsObserver { 108 protected content::WebContentsObserver {
103 public: 109 public:
104 ~OffscreenPresentation() final; 110 ~OffscreenPresentation() final;
105 111
106 const GURL& start_url() const { return start_url_; } 112 const GURL& start_url() const { return start_url_; }
107 const std::string& presentation_id() const { return presentation_id_; } 113 const std::string& id() const { return id_; }
108 114
109 // The presentation page's WebContents instance. 115 // The presentation page's WebContents instance.
110 content::WebContents* web_contents() const { 116 content::WebContents* web_contents() const {
111 return presentation_web_contents_.get(); 117 return presentation_web_contents_.get();
112 } 118 }
113 119
114 protected: 120 protected:
115 friend class OffscreenPresentationsOwner; 121 friend class OffscreenPresentationsOwner;
116 122
117 OffscreenPresentation(OffscreenPresentationsOwner* owner, 123 OffscreenPresentation(OffscreenPresentationsOwner* owner,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 // Called by |capture_poll_timer_| to automatically destroy this 183 // Called by |capture_poll_timer_| to automatically destroy this
178 // OffscreenPresentation when the capturer count returns to zero. 184 // OffscreenPresentation when the capturer count returns to zero.
179 void DieIfContentCaptureEnded(); 185 void DieIfContentCaptureEnded();
180 186
181 OffscreenPresentationsOwner* const owner_; 187 OffscreenPresentationsOwner* const owner_;
182 188
183 // The starting URL for this presentation, which may or may not match the 189 // The starting URL for this presentation, which may or may not match the
184 // current WebContents URL if navigations have occurred. 190 // current WebContents URL if navigations have occurred.
185 const GURL start_url_; 191 const GURL start_url_;
186 192
187 // The presentation ID used to help uniquely identify this instance. 193 // An ID used to uniquely identify this instance.
188 const std::string presentation_id_; 194 const std::string id_;
189 195
190 // A non-shared off-the-record profile based on the profile of the extension 196 // A non-shared off-the-record profile based on the profile of the extension
191 // background page. 197 // background page.
192 const scoped_ptr<Profile> profile_; 198 const scoped_ptr<Profile> profile_;
193 199
194 // The WebContents containing the offscreen presentation page. 200 // The WebContents containing the offscreen presentation page.
195 scoped_ptr<content::WebContents> presentation_web_contents_; 201 scoped_ptr<content::WebContents> presentation_web_contents_;
196 202
197 // The time at which Start() finished creating |presentation_web_contents_|. 203 // The time at which Start() finished creating |presentation_web_contents_|.
198 base::TimeTicks start_time_; 204 base::TimeTicks start_time_;
(...skipping 12 matching lines...) Expand all
211 // This is false until after the Start() method is called, and capture of the 217 // This is false until after the Start() method is called, and capture of the
212 // |presentation_web_contents_| is first detected. 218 // |presentation_web_contents_| is first detected.
213 bool content_capture_was_detected_; 219 bool content_capture_was_detected_;
214 220
215 DISALLOW_COPY_AND_ASSIGN(OffscreenPresentation); 221 DISALLOW_COPY_AND_ASSIGN(OffscreenPresentation);
216 }; 222 };
217 223
218 } // namespace extensions 224 } // namespace extensions
219 225
220 #endif // CHROME_BROWSER_EXTENSIONS_API_TAB_CAPTURE_OFFSCREEN_PRESENTATION_H_ 226 #endif // CHROME_BROWSER_EXTENSIONS_API_TAB_CAPTURE_OFFSCREEN_PRESENTATION_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698