Chromium Code Reviews| Index: components/guest_view/browser/guest_view_manager.cc |
| diff --git a/components/guest_view/browser/guest_view_manager.cc b/components/guest_view/browser/guest_view_manager.cc |
| index 04cc220531bf8291e9ac0c789180fe93d7ac3d77..ae3cd2cbe24da941577dea5ba58cd290b70b1986 100644 |
| --- a/components/guest_view/browser/guest_view_manager.cc |
| +++ b/components/guest_view/browser/guest_view_manager.cc |
| @@ -245,6 +245,40 @@ void GuestViewManager::RemoveGuest(int guest_instance_id) { |
| } |
| } |
| +void GuestViewManager::ViewCreated(int embedder_process_id, |
| + int view_instance_id, |
| + const std::string& view_type) { |
| + if (guest_view_registry_.empty()) |
| + RegisterGuestViewTypes(); |
| + auto view_it = guest_view_registry_.find(view_type); |
| + CHECK(view_it != guest_view_registry_.end()) << |
| + "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
|
| + |
| + // Register the cleanup callback for when this view is destroyed. |
| + RegisterViewCallback(embedder_process_id, |
| + view_instance_id, |
| + base::Bind(view_it->second.clean_up, |
| + embedder_process_id, |
| + view_instance_id)); |
| +} |
| + |
| +void GuestViewManager::ViewGarbageCollected(int embedder_process_id, |
| + int view_instance_id) { |
| + // Find and call any callbacks associated with the view that has been garbage |
| + // collected. |
| + auto embedder_it = view_callback_map_.find(embedder_process_id); |
| + if (embedder_it == view_callback_map_.end()) |
| + return; |
| + 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
|
| + auto view_it = callbacks_for_embedder.find(view_instance_id); |
| + if (view_it == callbacks_for_embedder.end()) |
| + return; |
| + auto& callbacks_for_view = view_it->second; |
| + for (auto& callback : callbacks_for_view) |
| + callback.Run(); |
| + callbacks_for_embedder.erase(view_it); |
| +} |
| + |
| GuestViewBase* GuestViewManager::CreateGuestInternal( |
| content::WebContents* owner_web_contents, |
| const std::string& view_type) { |
| @@ -257,13 +291,19 @@ GuestViewBase* GuestViewManager::CreateGuestInternal( |
| return nullptr; |
| } |
| - return it->second.Run(owner_web_contents); |
| + return it->second.create.Run(owner_web_contents); |
| } |
| void GuestViewManager::RegisterGuestViewTypes() { |
| delegate_->RegisterAdditionalGuestViewTypes(); |
| } |
| +void GuestViewManager::RegisterViewCallback(int embedder_process_id, |
| + int view_instance_id, |
| + const base::Closure& callback) { |
| + view_callback_map_[embedder_process_id][view_instance_id].push_back(callback); |
| +} |
| + |
| bool GuestViewManager::IsGuestAvailableToContext(GuestViewBase* guest) { |
| return delegate_->IsGuestAvailableToContext(guest); |
| } |
| @@ -277,6 +317,22 @@ void GuestViewManager::DispatchEvent(const std::string& event_name, |
| delegate_->DispatchEvent(event_name, args.Pass(), guest, instance_id); |
| } |
| +void GuestViewManager::EmbedderWillBeDestroyed(int embedder_process_id) { |
| + // Find and call any callbacks associated with the embedder that is being |
| + // destroyed. |
| + auto embedder_it = view_callback_map_.find(embedder_process_id); |
| + if (embedder_it == view_callback_map_.end()) |
| + return; |
| + auto& callbacks_for_embedder = embedder_it->second; |
| + for (auto& view_pair : callbacks_for_embedder) { |
| + auto& callbacks_for_view = view_pair.second; |
| + for (auto& callback : callbacks_for_view) { |
| + callback.Run(); |
| + } |
| + } |
| + view_callback_map_.erase(embedder_it); |
| +} |
| + |
| content::WebContents* GuestViewManager::GetGuestByInstanceID( |
| int guest_instance_id) { |
| auto it = guest_web_contents_by_instance_id_.find(guest_instance_id); |
| @@ -370,7 +426,14 @@ bool GuestViewManager::ElementInstanceKey::operator<( |
| bool GuestViewManager::ElementInstanceKey::operator==( |
| const GuestViewManager::ElementInstanceKey& other) const { |
| return (embedder_process_id == other.embedder_process_id) && |
| - (element_instance_id == other.element_instance_id); |
| + (element_instance_id == other.element_instance_id); |
| } |
| +GuestViewManager::GuestViewData::GuestViewData( |
| + const GuestViewCreateFunction& create, |
| + const GuestViewCleanUpFunction& clean_up) |
| + : create(create), clean_up(clean_up) {} |
| + |
| +GuestViewManager::GuestViewData::~GuestViewData() {} |
| + |
| } // namespace guest_view |