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

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: 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..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

Powered by Google App Engine
This is Rietveld 408576698