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..7aad57f65561e0c18cb3ea4f10c2690afe6fe854 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 << "\""; |
+ |
+ // Register the cleanup callback for when this view is destroyed. |
+ RegisterViewDestructionCallback(embedder_process_id, |
+ view_instance_id, |
+ base::Bind(view_it->second.cleanup_function, |
+ 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_destruction_callback_map_.find(embedder_process_id); |
+ if (embedder_it == view_destruction_callback_map_.end()) |
+ return; |
+ CallbacksForEachViewID& callbacks_for_embedder = embedder_it->second; |
+ auto view_it = callbacks_for_embedder.find(view_instance_id); |
+ if (view_it == callbacks_for_embedder.end()) |
+ return; |
+ Callbacks& 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,21 @@ GuestViewBase* GuestViewManager::CreateGuestInternal( |
return nullptr; |
} |
- return it->second.Run(owner_web_contents); |
+ return it->second.create_function.Run(owner_web_contents); |
} |
void GuestViewManager::RegisterGuestViewTypes() { |
delegate_->RegisterAdditionalGuestViewTypes(); |
} |
+void GuestViewManager::RegisterViewDestructionCallback( |
+ int embedder_process_id, |
+ int view_instance_id, |
+ const base::Closure& callback) { |
+ view_destruction_callback_map_[embedder_process_id][view_instance_id] |
+ .push_back(callback); |
+} |
+ |
bool GuestViewManager::IsGuestAvailableToContext(GuestViewBase* guest) { |
return delegate_->IsGuestAvailableToContext(guest); |
} |
@@ -277,6 +319,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_destruction_callback_map_.find(embedder_process_id); |
+ if (embedder_it == view_destruction_callback_map_.end()) |
+ return; |
+ CallbacksForEachViewID& callbacks_for_embedder = embedder_it->second; |
+ for (auto& view_pair : callbacks_for_embedder) { |
+ Callbacks& callbacks_for_view = view_pair.second; |
+ for (auto& callback : callbacks_for_view) { |
+ callback.Run(); |
+ } |
+ } |
+ view_destruction_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 +428,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_function, |
+ const GuestViewCleanUpFunction& cleanup_function) |
+ : create_function(create_function), cleanup_function(cleanup_function) {} |
+ |
+GuestViewManager::GuestViewData::~GuestViewData() {} |
+ |
} // namespace guest_view |