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 |