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

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

Issue 921473006: GuestView: Fix message routing across embedder navigations (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updated comments CQ'ing Created 5 years, 10 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: extensions/browser/guest_view/guest_view_manager.cc
diff --git a/extensions/browser/guest_view/guest_view_manager.cc b/extensions/browser/guest_view/guest_view_manager.cc
index 8f6b0dc0bfd27a03ed5d412b3f431aa0adf106a7..b7ddae913cb8c7fbf2a050471b3d5b70b9b56817 100644
--- a/extensions/browser/guest_view/guest_view_manager.cc
+++ b/extensions/browser/guest_view/guest_view_manager.cc
@@ -11,6 +11,7 @@
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/user_metrics.h"
#include "content/public/browser/web_contents_observer.h"
+#include "content/public/common/child_process_host.h"
#include "content/public/common/result_codes.h"
#include "content/public/common/url_constants.h"
#include "extensions/browser/extension_system.h"
@@ -70,48 +71,25 @@ content::WebContents* GuestViewManager::GetGuestByInstanceIDSafely(
return GetGuestByInstanceID(guest_instance_id);
}
-void GuestViewManager::AttachGuest(
- int embedder_render_process_id,
- int embedder_routing_id,
- int element_instance_id,
- int guest_instance_id,
- const base::DictionaryValue& attach_params) {
- content::WebContents* guest_web_contents =
- GetGuestByInstanceIDSafely(guest_instance_id, embedder_render_process_id);
- if (!guest_web_contents)
- return;
-
- auto guest_view = GuestViewBase::FromWebContents(guest_web_contents);
- DCHECK(guest_view);
-
- auto rvh = content::RenderViewHost::FromID(embedder_render_process_id,
- embedder_routing_id);
- // We need to check that rvh is not nullptr because there may be a race
- // between AttachGuest and destroying the embedder (i.e. when the embedder is
- // destroyed immediately after the guest is created).
- if (!rvh)
- return;
- auto owner_web_contents = content::WebContents::FromRenderViewHost(rvh);
- if (!owner_web_contents)
+void GuestViewManager::AttachGuest(int embedder_process_id,
+ int element_instance_id,
+ int guest_instance_id,
+ const base::DictionaryValue& attach_params) {
+ auto guest_view = GuestViewBase::From(embedder_process_id, guest_instance_id);
+ if (!guest_view)
return;
- ElementInstanceKey key(owner_web_contents, element_instance_id);
+ ElementInstanceKey key(embedder_process_id, element_instance_id);
auto it = instance_id_map_.find(key);
+ // If there is an existing guest attached to the element, then destroy the
+ // existing guest.
if (it != instance_id_map_.end()) {
int old_guest_instance_id = it->second;
- // Reattachment to the same guest is not currently supported.
if (old_guest_instance_id == guest_instance_id)
return;
- auto old_guest_web_contents =
- GetGuestByInstanceIDSafely(old_guest_instance_id,
- embedder_render_process_id);
- if (!old_guest_web_contents)
- return;
-
- auto old_guest_view =
- GuestViewBase::FromWebContents(old_guest_web_contents);
-
+ auto old_guest_view = GuestViewBase::From(embedder_process_id,
+ old_guest_instance_id);
old_guest_view->Destroy();
}
instance_id_map_[key] = guest_instance_id;
@@ -119,24 +97,21 @@ void GuestViewManager::AttachGuest(
guest_view->SetAttachParams(attach_params);
}
-void GuestViewManager::DetachGuest(GuestViewBase* guest,
- int element_instance_id) {
+void GuestViewManager::DetachGuest(GuestViewBase* guest) {
if (!guest->attached())
return;
- ElementInstanceKey key(guest->owner_web_contents(), element_instance_id);
- auto it = instance_id_map_.find(key);
- // There's nothing to do if this key does not exist in the map.
- if (it == instance_id_map_.end())
+ auto reverse_it = reverse_instance_id_map_.find(guest->guest_instance_id());
+ if (reverse_it == reverse_instance_id_map_.end())
return;
- int guest_instance_id = it->second;
- instance_id_map_.erase(key);
+ const ElementInstanceKey& key = reverse_it->second;
- auto reverse_it = reverse_instance_id_map_.find(guest->guest_instance_id());
- DCHECK(reverse_it != reverse_instance_id_map_.end());
- DCHECK(reverse_it->second == key);
- reverse_instance_id_map_.erase(guest_instance_id);
+ auto it = instance_id_map_.find(key);
+ DCHECK(it != instance_id_map_.end());
+
+ reverse_instance_id_map_.erase(reverse_it);
+ instance_id_map_.erase(it);
}
int GuestViewManager::GetNextInstanceID() {
@@ -170,9 +145,9 @@ content::WebContents* GuestViewManager::CreateGuestWithWebContentsParams(
}
content::WebContents* GuestViewManager::GetGuestByInstanceID(
- content::WebContents* owner_web_contents,
+ int owner_process_id,
int element_instance_id) {
- int guest_instance_id = GetGuestInstanceIDForElementID(owner_web_contents,
+ int guest_instance_id = GetGuestInstanceIDForElementID(owner_process_id,
element_instance_id);
if (guest_instance_id == guestview::kInstanceIDNone)
return nullptr;
@@ -180,11 +155,10 @@ content::WebContents* GuestViewManager::GetGuestByInstanceID(
return GetGuestByInstanceID(guest_instance_id);
}
-int GuestViewManager::GetGuestInstanceIDForElementID(
- content::WebContents* owner_web_contents,
- int element_instance_id) {
+int GuestViewManager::GetGuestInstanceIDForElementID(int owner_process_id,
+ int element_instance_id) {
auto iter = instance_id_map_.find(
- ElementInstanceKey(owner_web_contents, element_instance_id));
+ ElementInstanceKey(owner_process_id, element_instance_id));
if (iter == instance_id_map_.end())
return guestview::kInstanceIDNone;
return iter->second;
@@ -313,4 +287,30 @@ bool GuestViewManager::CanEmbedderAccessInstanceID(
guest_view->owner_web_contents()->GetRenderProcessHost()->GetID();
}
+GuestViewManager::ElementInstanceKey::ElementInstanceKey()
+ : embedder_process_id(content::ChildProcessHost::kInvalidUniqueID),
+ element_instance_id(content::ChildProcessHost::kInvalidUniqueID) {
+}
+
+GuestViewManager::ElementInstanceKey::ElementInstanceKey(
+ int embedder_process_id,
+ int element_instance_id)
+ : embedder_process_id(embedder_process_id),
+ element_instance_id(element_instance_id) {
+}
+
+bool GuestViewManager::ElementInstanceKey::operator<(
+ const GuestViewManager::ElementInstanceKey& other) const {
+ if (embedder_process_id != other.embedder_process_id)
+ return embedder_process_id < other.embedder_process_id;
+
+ return element_instance_id < other.element_instance_id;
+}
+
+bool GuestViewManager::ElementInstanceKey::operator==(
+ const GuestViewManager::ElementInstanceKey& other) const {
+ return (embedder_process_id == other.embedder_process_id) &&
+ (element_instance_id == other.element_instance_id);
+}
+
} // namespace extensions
« no previous file with comments | « extensions/browser/guest_view/guest_view_manager.h ('k') | extensions/browser/guest_view/guest_view_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698