Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "components/guest_view/browser/guest_view_manager.h" | 5 #include "components/guest_view/browser/guest_view_manager.h" |
| 6 | 6 |
| 7 #include "base/macros.h" | 7 #include "base/macros.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "components/guest_view/browser/guest_view_base.h" | 9 #include "components/guest_view/browser/guest_view_base.h" |
| 10 #include "components/guest_view/browser/guest_view_manager_delegate.h" | 10 #include "components/guest_view/browser/guest_view_manager_delegate.h" |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 238 if (instance_id != last_instance_id_removed_ + 1) | 238 if (instance_id != last_instance_id_removed_ + 1) |
| 239 break; | 239 break; |
| 240 ++last_instance_id_removed_; | 240 ++last_instance_id_removed_; |
| 241 removed_instance_ids_.erase(iter++); | 241 removed_instance_ids_.erase(iter++); |
| 242 } | 242 } |
| 243 } else { | 243 } else { |
| 244 removed_instance_ids_.insert(guest_instance_id); | 244 removed_instance_ids_.insert(guest_instance_id); |
| 245 } | 245 } |
| 246 } | 246 } |
| 247 | 247 |
| 248 void GuestViewManager::ViewCreated(int embedder_process_id, | |
| 249 int view_instance_id, | |
| 250 const std::string& view_type) { | |
| 251 if (guest_view_registry_.empty()) | |
| 252 RegisterGuestViewTypes(); | |
| 253 auto view_it = guest_view_registry_.find(view_type); | |
| 254 CHECK(view_it != guest_view_registry_.end()) << | |
| 255 "Invalid GuestView created of type \"" << view_type << "\""; | |
|
lazyboy
2015/06/05 23:09:55
Duplicate GuestView created of type ...
paulmeyer
2015/06/08 17:53:58
This CHECK isn't checking for duplicates. It check
| |
| 256 | |
| 257 // Register the cleanup callback for when this view is destroyed. | |
| 258 RegisterViewCallback(embedder_process_id, | |
| 259 view_instance_id, | |
| 260 base::Bind(view_it->second.clean_up, | |
| 261 embedder_process_id, | |
| 262 view_instance_id)); | |
| 263 } | |
| 264 | |
| 265 void GuestViewManager::ViewGarbageCollected(int embedder_process_id, | |
| 266 int view_instance_id) { | |
| 267 // Find and call any callbacks associated with the view that has been garbage | |
| 268 // collected. | |
| 269 auto embedder_it = view_callback_map_.find(embedder_process_id); | |
| 270 if (embedder_it == view_callback_map_.end()) | |
| 271 return; | |
| 272 auto& callbacks_for_embedder = embedder_it->second; | |
|
lazyboy
2015/06/05 23:09:55
I'm already lost here with auto-s :)
I'd highly en
paulmeyer
2015/06/08 17:53:58
Hahaha, Good call. I am using quite a lot of autos
| |
| 273 auto view_it = callbacks_for_embedder.find(view_instance_id); | |
| 274 if (view_it == callbacks_for_embedder.end()) | |
| 275 return; | |
| 276 auto& callbacks_for_view = view_it->second; | |
| 277 for (auto& callback : callbacks_for_view) | |
| 278 callback.Run(); | |
| 279 callbacks_for_embedder.erase(view_it); | |
| 280 } | |
| 281 | |
| 248 GuestViewBase* GuestViewManager::CreateGuestInternal( | 282 GuestViewBase* GuestViewManager::CreateGuestInternal( |
| 249 content::WebContents* owner_web_contents, | 283 content::WebContents* owner_web_contents, |
| 250 const std::string& view_type) { | 284 const std::string& view_type) { |
| 251 if (guest_view_registry_.empty()) | 285 if (guest_view_registry_.empty()) |
| 252 RegisterGuestViewTypes(); | 286 RegisterGuestViewTypes(); |
| 253 | 287 |
| 254 auto it = guest_view_registry_.find(view_type); | 288 auto it = guest_view_registry_.find(view_type); |
| 255 if (it == guest_view_registry_.end()) { | 289 if (it == guest_view_registry_.end()) { |
| 256 NOTREACHED(); | 290 NOTREACHED(); |
| 257 return nullptr; | 291 return nullptr; |
| 258 } | 292 } |
| 259 | 293 |
| 260 return it->second.Run(owner_web_contents); | 294 return it->second.create.Run(owner_web_contents); |
| 261 } | 295 } |
| 262 | 296 |
| 263 void GuestViewManager::RegisterGuestViewTypes() { | 297 void GuestViewManager::RegisterGuestViewTypes() { |
| 264 delegate_->RegisterAdditionalGuestViewTypes(); | 298 delegate_->RegisterAdditionalGuestViewTypes(); |
| 265 } | 299 } |
| 266 | 300 |
| 301 void GuestViewManager::RegisterViewCallback(int embedder_process_id, | |
| 302 int view_instance_id, | |
| 303 const base::Closure& callback) { | |
| 304 view_callback_map_[embedder_process_id][view_instance_id].push_back(callback); | |
| 305 } | |
| 306 | |
| 267 bool GuestViewManager::IsGuestAvailableToContext(GuestViewBase* guest) { | 307 bool GuestViewManager::IsGuestAvailableToContext(GuestViewBase* guest) { |
| 268 return delegate_->IsGuestAvailableToContext(guest); | 308 return delegate_->IsGuestAvailableToContext(guest); |
| 269 } | 309 } |
| 270 | 310 |
| 271 void GuestViewManager::DispatchEvent(const std::string& event_name, | 311 void GuestViewManager::DispatchEvent(const std::string& event_name, |
| 272 scoped_ptr<base::DictionaryValue> args, | 312 scoped_ptr<base::DictionaryValue> args, |
| 273 GuestViewBase* guest, | 313 GuestViewBase* guest, |
| 274 int instance_id) { | 314 int instance_id) { |
| 275 // TODO(fsamuel): GuestViewManager should probably do something more useful | 315 // TODO(fsamuel): GuestViewManager should probably do something more useful |
| 276 // here like log an error if the event could not be dispatched. | 316 // here like log an error if the event could not be dispatched. |
| 277 delegate_->DispatchEvent(event_name, args.Pass(), guest, instance_id); | 317 delegate_->DispatchEvent(event_name, args.Pass(), guest, instance_id); |
| 278 } | 318 } |
| 279 | 319 |
| 320 void GuestViewManager::EmbedderWillBeDestroyed(int embedder_process_id) { | |
| 321 // Find and call any callbacks associated with the embedder that is being | |
| 322 // destroyed. | |
| 323 auto embedder_it = view_callback_map_.find(embedder_process_id); | |
| 324 if (embedder_it == view_callback_map_.end()) | |
| 325 return; | |
| 326 auto& callbacks_for_embedder = embedder_it->second; | |
| 327 for (auto& view_pair : callbacks_for_embedder) { | |
| 328 auto& callbacks_for_view = view_pair.second; | |
| 329 for (auto& callback : callbacks_for_view) { | |
| 330 callback.Run(); | |
| 331 } | |
| 332 } | |
| 333 view_callback_map_.erase(embedder_it); | |
| 334 } | |
| 335 | |
| 280 content::WebContents* GuestViewManager::GetGuestByInstanceID( | 336 content::WebContents* GuestViewManager::GetGuestByInstanceID( |
| 281 int guest_instance_id) { | 337 int guest_instance_id) { |
| 282 auto it = guest_web_contents_by_instance_id_.find(guest_instance_id); | 338 auto it = guest_web_contents_by_instance_id_.find(guest_instance_id); |
| 283 if (it == guest_web_contents_by_instance_id_.end()) | 339 if (it == guest_web_contents_by_instance_id_.end()) |
| 284 return nullptr; | 340 return nullptr; |
| 285 return it->second; | 341 return it->second; |
| 286 } | 342 } |
| 287 | 343 |
| 288 bool GuestViewManager::CanEmbedderAccessInstanceIDMaybeKill( | 344 bool GuestViewManager::CanEmbedderAccessInstanceIDMaybeKill( |
| 289 int embedder_render_process_id, | 345 int embedder_render_process_id, |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 363 const GuestViewManager::ElementInstanceKey& other) const { | 419 const GuestViewManager::ElementInstanceKey& other) const { |
| 364 if (embedder_process_id != other.embedder_process_id) | 420 if (embedder_process_id != other.embedder_process_id) |
| 365 return embedder_process_id < other.embedder_process_id; | 421 return embedder_process_id < other.embedder_process_id; |
| 366 | 422 |
| 367 return element_instance_id < other.element_instance_id; | 423 return element_instance_id < other.element_instance_id; |
| 368 } | 424 } |
| 369 | 425 |
| 370 bool GuestViewManager::ElementInstanceKey::operator==( | 426 bool GuestViewManager::ElementInstanceKey::operator==( |
| 371 const GuestViewManager::ElementInstanceKey& other) const { | 427 const GuestViewManager::ElementInstanceKey& other) const { |
| 372 return (embedder_process_id == other.embedder_process_id) && | 428 return (embedder_process_id == other.embedder_process_id) && |
| 373 (element_instance_id == other.element_instance_id); | 429 (element_instance_id == other.element_instance_id); |
| 374 } | 430 } |
| 375 | 431 |
| 432 GuestViewManager::GuestViewData::GuestViewData( | |
| 433 const GuestViewCreateFunction& create, | |
| 434 const GuestViewCleanUpFunction& clean_up) | |
| 435 : create(create), clean_up(clean_up) {} | |
| 436 | |
| 437 GuestViewManager::GuestViewData::~GuestViewData() {} | |
| 438 | |
| 376 } // namespace guest_view | 439 } // namespace guest_view |
| OLD | NEW |