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

Side by Side Diff: chrome/browser/guest_view/guest_view_manager.cc

Issue 298913003: Do not allow GuestViewManager to (re)use an instance ID that was already removed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 6 years, 7 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 #include "chrome/browser/guest_view/guest_view_manager.h" 5 #include "chrome/browser/guest_view/guest_view_manager.h"
6 6
7 #include "base/strings/stringprintf.h" 7 #include "base/strings/stringprintf.h"
8 #include "chrome/browser/extensions/extension_service.h" 8 #include "chrome/browser/extensions/extension_service.h"
9 #include "chrome/browser/guest_view/guest_view_base.h" 9 #include "chrome/browser/guest_view/guest_view_base.h"
10 #include "chrome/browser/guest_view/guest_view_constants.h" 10 #include "chrome/browser/guest_view/guest_view_constants.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 53
54 virtual void WebContentsDestroyed() OVERRIDE { 54 virtual void WebContentsDestroyed() OVERRIDE {
55 delete this; 55 delete this;
56 } 56 }
57 57
58 private: 58 private:
59 DISALLOW_COPY_AND_ASSIGN(GuestWebContentsObserver); 59 DISALLOW_COPY_AND_ASSIGN(GuestWebContentsObserver);
60 }; 60 };
61 61
62 GuestViewManager::GuestViewManager(content::BrowserContext* context) 62 GuestViewManager::GuestViewManager(content::BrowserContext* context)
63 : current_instance_id_(0), 63 : current_instance_id_(0), last_instance_id_removed_(0), context_(context) {
64 context_(context) {} 64 }
65 65
66 GuestViewManager::~GuestViewManager() {} 66 GuestViewManager::~GuestViewManager() {}
67 67
68 // static. 68 // static.
69 GuestViewManager* GuestViewManager::FromBrowserContext( 69 GuestViewManager* GuestViewManager::FromBrowserContext(
70 BrowserContext* context) { 70 BrowserContext* context) {
71 GuestViewManager* guest_manager = 71 GuestViewManager* guest_manager =
72 static_cast<GuestViewManager*>(context->GetUserData( 72 static_cast<GuestViewManager*>(context->GetUserData(
73 guestview::kGuestViewManagerKeyName)); 73 guestview::kGuestViewManagerKeyName));
74 if (!guest_manager) { 74 if (!guest_manager) {
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 GuestViewBase* guest_view = GuestViewBase::FromWebContents(guest); 181 GuestViewBase* guest_view = GuestViewBase::FromWebContents(guest);
182 if (embedder_web_contents != guest_view->embedder_web_contents()) 182 if (embedder_web_contents != guest_view->embedder_web_contents())
183 continue; 183 continue;
184 184
185 if (callback.Run(guest)) 185 if (callback.Run(guest))
186 return true; 186 return true;
187 } 187 }
188 return false; 188 return false;
189 } 189 }
190 190
191 void GuestViewManager::AddGuest(int guest_instance_id, 191 bool GuestViewManager::AddGuest(int guest_instance_id,
192 WebContents* guest_web_contents) { 192 WebContents* guest_web_contents) {
193 DCHECK(guest_web_contents_by_instance_id_.find(guest_instance_id) == 193 CHECK(guest_web_contents_by_instance_id_.find(guest_instance_id) ==
194 guest_web_contents_by_instance_id_.end()); 194 guest_web_contents_by_instance_id_.end());
195 guest_web_contents_by_instance_id_[guest_instance_id] = guest_web_contents; 195 guest_web_contents_by_instance_id_[guest_instance_id] = guest_web_contents;
196 // This will add the RenderProcessHost ID when we get one. 196 // This will add the RenderProcessHost ID when we get one.
197 new GuestWebContentsObserver(guest_web_contents); 197 new GuestWebContentsObserver(guest_web_contents);
198 return true;
198 } 199 }
199 200
200 void GuestViewManager::RemoveGuest(int guest_instance_id) { 201 void GuestViewManager::RemoveGuest(int guest_instance_id) {
201 GuestInstanceMap::iterator it = 202 GuestInstanceMap::iterator it =
202 guest_web_contents_by_instance_id_.find(guest_instance_id); 203 guest_web_contents_by_instance_id_.find(guest_instance_id);
203 DCHECK(it != guest_web_contents_by_instance_id_.end()); 204 DCHECK(it != guest_web_contents_by_instance_id_.end());
204 render_process_host_id_multiset_.erase( 205 render_process_host_id_multiset_.erase(
205 it->second->GetRenderProcessHost()->GetID()); 206 it->second->GetRenderProcessHost()->GetID());
206 guest_web_contents_by_instance_id_.erase(it); 207 guest_web_contents_by_instance_id_.erase(it);
208
209 // All the instance IDs that lie within [0, last_instance_id_removed_]
210 // are invalid.
211 // The remaining sparse invalid ids are kept in |removed_instance_ids_| set.
212 // Following code compacts the set by incrementing
Fady Samuel 2014/05/22 17:41:53 The following code...
lazyboy 2014/05/22 18:34:45 Done.
213 // |last_instance_id_removed_|.
214 if (guest_instance_id == last_instance_id_removed_ + 1) {
215 ++last_instance_id_removed_;
216 // Compact.
217 std::set<int>::iterator iter = removed_instance_ids_.begin();
218 while (iter != removed_instance_ids_.end()) {
219 int instance_id = *iter;
220 if (instance_id != last_instance_id_removed_ + 1)
221 break;
222 ++last_instance_id_removed_;
Fady Samuel 2014/05/22 17:41:53 This line really confuses me. Let's chat about thi
lazyboy 2014/05/22 18:34:45 Hmmm, seems I uploaded the half of it, the check i
223 removed_instance_ids_.erase(iter++);
224 }
225 } else {
226 removed_instance_ids_.insert(guest_instance_id);
227 }
207 } 228 }
208 229
209 void GuestViewManager::AddRenderProcessHostID(int render_process_host_id) { 230 void GuestViewManager::AddRenderProcessHostID(int render_process_host_id) {
210 render_process_host_id_multiset_.insert(render_process_host_id); 231 render_process_host_id_multiset_.insert(render_process_host_id);
211 } 232 }
212 233
213 content::WebContents* GuestViewManager::GetGuestByInstanceID( 234 content::WebContents* GuestViewManager::GetGuestByInstanceID(
214 int guest_instance_id, 235 int guest_instance_id,
215 int embedder_render_process_id) { 236 int embedder_render_process_id) {
216 GuestInstanceMap::const_iterator it = 237 GuestInstanceMap::const_iterator it =
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 return false; 294 return false;
274 295
275 return embedder_render_process_id == 296 return embedder_render_process_id ==
276 guest->GetOpener()->embedder_web_contents()->GetRenderProcessHost()-> 297 guest->GetOpener()->embedder_web_contents()->GetRenderProcessHost()->
277 GetID(); 298 GetID();
278 } 299 }
279 300
280 return embedder_render_process_id == 301 return embedder_render_process_id ==
281 guest->embedder_web_contents()->GetRenderProcessHost()->GetID(); 302 guest->embedder_web_contents()->GetRenderProcessHost()->GetID();
282 } 303 }
OLDNEW
« no previous file with comments | « chrome/browser/guest_view/guest_view_manager.h ('k') | chrome/browser/guest_view/guest_view_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698