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

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: 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 DCHECK(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());
Fady Samuel 2014/05/22 15:02:13 Make this a CHECK instead of a DCHECK because it h
lazyboy 2014/05/22 15:59:31 Done.
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 if (guest_instance_id == last_instance_id_removed_ + 1) {
Fady Samuel 2014/05/22 15:02:13 This code is hard to read. Could you please commen
lazyboy 2014/05/22 15:59:31 There's a note in last_instance_id_removed_ in .h
210 ++last_instance_id_removed_;
211 // Compact.
212 std::set<int>::iterator iter = removed_instance_ids_.begin();
213 while (iter != removed_instance_ids_.end()) {
214 int instance_id = *iter;
215 if (instance_id != last_instance_id_removed_ + 1)
216 break;
217 ++last_instance_id_removed_;
218 removed_instance_ids_.erase(iter++);
219 }
220 } else {
221 removed_instance_ids_.insert(guest_instance_id);
222 }
207 } 223 }
208 224
209 void GuestViewManager::AddRenderProcessHostID(int render_process_host_id) { 225 void GuestViewManager::AddRenderProcessHostID(int render_process_host_id) {
210 render_process_host_id_multiset_.insert(render_process_host_id); 226 render_process_host_id_multiset_.insert(render_process_host_id);
211 } 227 }
212 228
213 content::WebContents* GuestViewManager::GetGuestByInstanceID( 229 content::WebContents* GuestViewManager::GetGuestByInstanceID(
214 int guest_instance_id, 230 int guest_instance_id,
215 int embedder_render_process_id) { 231 int embedder_render_process_id) {
216 GuestInstanceMap::const_iterator it = 232 GuestInstanceMap::const_iterator it =
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 return false; 289 return false;
274 290
275 return embedder_render_process_id == 291 return embedder_render_process_id ==
276 guest->GetOpener()->embedder_web_contents()->GetRenderProcessHost()-> 292 guest->GetOpener()->embedder_web_contents()->GetRenderProcessHost()->
277 GetID(); 293 GetID();
278 } 294 }
279 295
280 return embedder_render_process_id == 296 return embedder_render_process_id ==
281 guest->embedder_web_contents()->GetRenderProcessHost()->GetID(); 297 guest->embedder_web_contents()->GetRenderProcessHost()->GetID();
282 } 298 }
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