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

Unified Diff: components/guest_view/browser/guest_view_manager.cc

Issue 1143333008: Getting rid of more webview memory leaks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments. Created 5 years, 6 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698