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

Side by Side Diff: components/guest_view/browser/guest_view_manager.h

Issue 1232603002: This patch improves the way that GuestViewManager tracks the destruction of GuestView embedders. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comment by kalman@. Created 5 years, 5 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 COMPONENTS_GUEST_VIEW_BROWSER_GUEST_VIEW_MANAGER_H_ 5 #ifndef COMPONENTS_GUEST_VIEW_BROWSER_GUEST_VIEW_MANAGER_H_
6 #define COMPONENTS_GUEST_VIEW_BROWSER_GUEST_VIEW_MANAGER_H_ 6 #define COMPONENTS_GUEST_VIEW_BROWSER_GUEST_VIEW_MANAGER_H_
7 7
8 #include <map> 8 #include <map>
9 #include <set>
9 #include <vector> 10 #include <vector>
10 11
11 #include "base/bind.h" 12 #include "base/bind.h"
12 #include "base/gtest_prod_util.h" 13 #include "base/gtest_prod_util.h"
13 #include "base/lazy_instance.h" 14 #include "base/lazy_instance.h"
14 #include "base/macros.h" 15 #include "base/macros.h"
16 #include "base/memory/weak_ptr.h"
15 #include "content/public/browser/browser_plugin_guest_manager.h" 17 #include "content/public/browser/browser_plugin_guest_manager.h"
16 #include "content/public/browser/site_instance.h" 18 #include "content/public/browser/site_instance.h"
17 #include "content/public/browser/web_contents.h" 19 #include "content/public/browser/web_contents.h"
18 20
19 class GURL; 21 class GURL;
20 22
21 namespace content { 23 namespace content {
22 class BrowserContext; 24 class BrowserContext;
23 class WebContents; 25 class WebContents;
24 } // namespace content 26 } // namespace content
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 bool ForEachGuest(content::WebContents* owner_web_contents, 127 bool ForEachGuest(content::WebContents* owner_web_contents,
126 const GuestCallback& callback) override; 128 const GuestCallback& callback) override;
127 content::WebContents* GetFullPageGuest( 129 content::WebContents* GetFullPageGuest(
128 content::WebContents* embedder_web_contents) override; 130 content::WebContents* embedder_web_contents) override;
129 131
130 protected: 132 protected:
131 friend class GuestViewBase; 133 friend class GuestViewBase;
132 friend class GuestViewEvent; 134 friend class GuestViewEvent;
133 friend class GuestViewMessageFilter; 135 friend class GuestViewMessageFilter;
134 136
137 class EmbedderRenderProcessHostObserver;
138
135 // These methods are virtual so that they can be overriden in tests. 139 // These methods are virtual so that they can be overriden in tests.
136 140
137 virtual void AddGuest(int guest_instance_id, 141 virtual void AddGuest(int guest_instance_id,
138 content::WebContents* guest_web_contents); 142 content::WebContents* guest_web_contents);
139 virtual void RemoveGuest(int guest_instance_id); 143 virtual void RemoveGuest(int guest_instance_id);
140 144
141 // This method is called when the embedder process with ID 145 // This method is called when the embedder process with ID
142 // |embedder_process_id| is about to be destroyed. 146 // |embedder_process_id| has been destroyed.
143 virtual void EmbedderWillBeDestroyed(int embedder_process_id); 147 virtual void EmbedderProcessDestroyed(int embedder_process_id);
144 148
145 // Called when a GuestView has been created in JavaScript. 149 // Called when a GuestView has been created in JavaScript.
146 virtual void ViewCreated(int embedder_process_id, 150 virtual void ViewCreated(int embedder_process_id,
147 int view_instance_id, 151 int view_instance_id,
148 const std::string& view_type); 152 const std::string& view_type);
149 153
150 // Called when a GuestView has been garbage collected in JavaScript. 154 // Called when a GuestView has been garbage collected in JavaScript.
151 virtual void ViewGarbageCollected(int embedder_process_id, 155 virtual void ViewGarbageCollected(int embedder_process_id,
152 int view_instance_id); 156 int view_instance_id);
153 157
158 // Calls all destruction callbacks registered for the GuestView identified by
159 // |embedder_process_id| and |view_instance_id|.
160 void CallViewDestructionCallbacks(int embedder_process_id,
161 int view_instance_id);
162
163 // Calls all destruction callbacks registered for GuestViews in the embedder
164 // with ID |embedder_process_id|.
165 void CallViewDestructionCallbacks(int embedder_process_id);
166
154 // Creates a guest of the provided |view_type|. 167 // Creates a guest of the provided |view_type|.
155 GuestViewBase* CreateGuestInternal(content::WebContents* owner_web_contents, 168 GuestViewBase* CreateGuestInternal(content::WebContents* owner_web_contents,
156 const std::string& view_type); 169 const std::string& view_type);
157 170
158 // Adds GuestView types to the GuestView registry. 171 // Adds GuestView types to the GuestView registry.
159 void RegisterGuestViewTypes(); 172 void RegisterGuestViewTypes();
160 173
161 // Indicates whether the provided |guest| can be used in the context it has 174 // Indicates whether the provided |guest| can be used in the context it has
162 // been created. 175 // been created.
163 bool IsGuestAvailableToContext(GuestViewBase* guest); 176 bool IsGuestAvailableToContext(GuestViewBase* guest);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 221
209 using GuestInstanceIDMap = std::map<ElementInstanceKey, int>; 222 using GuestInstanceIDMap = std::map<ElementInstanceKey, int>;
210 GuestInstanceIDMap instance_id_map_; 223 GuestInstanceIDMap instance_id_map_;
211 224
212 // The reverse map of GuestInstanceIDMap. 225 // The reverse map of GuestInstanceIDMap.
213 using GuestInstanceIDReverseMap = std::map<int, ElementInstanceKey>; 226 using GuestInstanceIDReverseMap = std::map<int, ElementInstanceKey>;
214 GuestInstanceIDReverseMap reverse_instance_id_map_; 227 GuestInstanceIDReverseMap reverse_instance_id_map_;
215 228
216 using GuestViewCreateFunction = 229 using GuestViewCreateFunction =
217 base::Callback<GuestViewBase*(content::WebContents*)>; 230 base::Callback<GuestViewBase*(content::WebContents*)>;
218 using GuestViewCleanUpFunction = base::Callback<void(int, int)>; 231 using GuestViewCleanUpFunction =
232 base::Callback<void(content::BrowserContext*, int, int)>;
219 struct GuestViewData { 233 struct GuestViewData {
220 GuestViewData(const GuestViewCreateFunction& create_function, 234 GuestViewData(const GuestViewCreateFunction& create_function,
221 const GuestViewCleanUpFunction& cleanup_function); 235 const GuestViewCleanUpFunction& cleanup_function);
222 ~GuestViewData(); 236 ~GuestViewData();
223 const GuestViewCreateFunction create_function; 237 const GuestViewCreateFunction create_function;
224 const GuestViewCleanUpFunction cleanup_function; 238 const GuestViewCleanUpFunction cleanup_function;
225 }; 239 };
226 using GuestViewMethodMap = std::map<std::string, GuestViewData>; 240 using GuestViewMethodMap = std::map<std::string, GuestViewData>;
227 GuestViewMethodMap guest_view_registry_; 241 GuestViewMethodMap guest_view_registry_;
228 242
229 int current_instance_id_; 243 int current_instance_id_;
230 244
231 // Any instance ID whose number not greater than this was removed via 245 // Any instance ID whose number not greater than this was removed via
232 // RemoveGuest. 246 // RemoveGuest.
233 // This is used so that we don't have store all removed instance IDs in 247 // This is used so that we don't have store all removed instance IDs in
234 // |removed_instance_ids_|. 248 // |removed_instance_ids_|.
235 int last_instance_id_removed_; 249 int last_instance_id_removed_;
236 // The remaining instance IDs that are greater than 250 // The remaining instance IDs that are greater than
237 // |last_instance_id_removed_| are kept here. 251 // |last_instance_id_removed_| are kept here.
238 std::set<int> removed_instance_ids_; 252 std::set<int> removed_instance_ids_;
239 253
240 content::BrowserContext* context_; 254 content::BrowserContext* context_;
241 255
242 scoped_ptr<GuestViewManagerDelegate> delegate_; 256 scoped_ptr<GuestViewManagerDelegate> delegate_;
243 257
258 // This tracks which GuestView embedders are currently being observed.
259 std::set<int> embedders_observed_;
260
244 // |view_destruction_callback_map_| maps from embedder process ID to view ID 261 // |view_destruction_callback_map_| maps from embedder process ID to view ID
245 // to a vector of callback functions to be called when that view is destroyed. 262 // to a vector of callback functions to be called when that view is destroyed.
246 using Callbacks = std::vector<base::Closure> ; 263 using Callbacks = std::vector<base::Closure> ;
247 using CallbacksForEachViewID = std::map<int, Callbacks> ; 264 using CallbacksForEachViewID = std::map<int, Callbacks> ;
248 using CallbacksForEachEmbedderID = std::map<int, CallbacksForEachViewID> ; 265 using CallbacksForEachEmbedderID = std::map<int, CallbacksForEachViewID> ;
249 CallbacksForEachEmbedderID view_destruction_callback_map_; 266 CallbacksForEachEmbedderID view_destruction_callback_map_;
250 267
268 // This is used to ensure that an EmbedderRenderProcessHostObserver will not
269 // call into this GuestViewManager after it has been destroyed.
270 base::WeakPtrFactory<GuestViewManager> weak_ptr_factory_;
271
251 DISALLOW_COPY_AND_ASSIGN(GuestViewManager); 272 DISALLOW_COPY_AND_ASSIGN(GuestViewManager);
252 }; 273 };
253 274
254 } // namespace guest_view 275 } // namespace guest_view
255 276
256 #endif // COMPONETS_GUEST_VIEW_BROWSER_GUEST_VIEW_MANAGER_H_ 277 #endif // COMPONETS_GUEST_VIEW_BROWSER_GUEST_VIEW_MANAGER_H_
OLDNEW
« no previous file with comments | « components/guest_view/browser/guest_view_base.cc ('k') | components/guest_view/browser/guest_view_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698