OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "extensions/browser/guest_view/guest_view_manager.h" | 5 #include "extensions/browser/guest_view/guest_view_manager.h" |
6 | 6 |
7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
8 #include "content/public/browser/browser_context.h" | 8 #include "content/public/browser/browser_context.h" |
9 #include "content/public/browser/render_frame_host.h" | 9 #include "content/public/browser/render_frame_host.h" |
10 #include "content/public/browser/render_process_host.h" | 10 #include "content/public/browser/render_process_host.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 content::WebContents* GuestViewManager::GetGuestByInstanceIDSafely( | 63 content::WebContents* GuestViewManager::GetGuestByInstanceIDSafely( |
64 int guest_instance_id, | 64 int guest_instance_id, |
65 int embedder_render_process_id) { | 65 int embedder_render_process_id) { |
66 if (!CanEmbedderAccessInstanceIDMaybeKill(embedder_render_process_id, | 66 if (!CanEmbedderAccessInstanceIDMaybeKill(embedder_render_process_id, |
67 guest_instance_id)) { | 67 guest_instance_id)) { |
68 return nullptr; | 68 return nullptr; |
69 } | 69 } |
70 return GetGuestByInstanceID(guest_instance_id); | 70 return GetGuestByInstanceID(guest_instance_id); |
71 } | 71 } |
72 | 72 |
73 void GuestViewManager::AttachGuest( | 73 void GuestViewManager::AttachGuest(int embedder_process_id, |
74 int embedder_render_process_id, | 74 int element_instance_id, |
75 int embedder_routing_id, | 75 int guest_instance_id, |
76 int element_instance_id, | 76 const base::DictionaryValue& attach_params) { |
77 int guest_instance_id, | 77 auto guest_view = GuestViewBase::From(embedder_process_id, guest_instance_id); |
78 const base::DictionaryValue& attach_params) { | 78 if (!guest_view) |
79 content::WebContents* guest_web_contents = | |
80 GetGuestByInstanceIDSafely(guest_instance_id, embedder_render_process_id); | |
81 if (!guest_web_contents) | |
82 return; | 79 return; |
83 | 80 |
84 auto guest_view = GuestViewBase::FromWebContents(guest_web_contents); | 81 ElementInstanceKey key(embedder_process_id, element_instance_id); |
85 DCHECK(guest_view); | |
86 | |
87 auto rvh = content::RenderViewHost::FromID(embedder_render_process_id, | |
88 embedder_routing_id); | |
89 // We need to check that rvh is not nullptr because there may be a race | |
90 // between AttachGuest and destroying the embedder (i.e. when the embedder is | |
91 // destroyed immediately after the guest is created). | |
92 if (!rvh) | |
93 return; | |
94 auto owner_web_contents = content::WebContents::FromRenderViewHost(rvh); | |
95 if (!owner_web_contents) | |
96 return; | |
97 ElementInstanceKey key(owner_web_contents, element_instance_id); | |
98 | |
99 auto it = instance_id_map_.find(key); | 82 auto it = instance_id_map_.find(key); |
| 83 // If there is an existing guest attached to the element, then destroy the |
| 84 // existing guest. |
100 if (it != instance_id_map_.end()) { | 85 if (it != instance_id_map_.end()) { |
101 int old_guest_instance_id = it->second; | 86 int old_guest_instance_id = it->second; |
102 // Reattachment to the same guest is not currently supported. | |
103 if (old_guest_instance_id == guest_instance_id) | 87 if (old_guest_instance_id == guest_instance_id) |
104 return; | 88 return; |
105 | 89 |
106 auto old_guest_web_contents = | 90 auto old_guest_view = GuestViewBase::From(embedder_process_id, |
107 GetGuestByInstanceIDSafely(old_guest_instance_id, | 91 old_guest_instance_id); |
108 embedder_render_process_id); | |
109 if (!old_guest_web_contents) | |
110 return; | |
111 | |
112 auto old_guest_view = | |
113 GuestViewBase::FromWebContents(old_guest_web_contents); | |
114 | |
115 old_guest_view->Destroy(); | 92 old_guest_view->Destroy(); |
116 } | 93 } |
117 instance_id_map_[key] = guest_instance_id; | 94 instance_id_map_[key] = guest_instance_id; |
118 reverse_instance_id_map_[guest_instance_id] = key; | 95 reverse_instance_id_map_[guest_instance_id] = key; |
119 guest_view->SetAttachParams(attach_params); | 96 guest_view->SetAttachParams(attach_params); |
120 } | 97 } |
121 | 98 |
122 void GuestViewManager::DetachGuest(GuestViewBase* guest, | 99 void GuestViewManager::DetachGuest(GuestViewBase* guest) { |
123 int element_instance_id) { | |
124 if (!guest->attached()) | 100 if (!guest->attached()) |
125 return; | 101 return; |
126 | 102 |
127 ElementInstanceKey key(guest->owner_web_contents(), element_instance_id); | 103 auto reverse_it = reverse_instance_id_map_.find(guest->guest_instance_id()); |
128 auto it = instance_id_map_.find(key); | 104 if (reverse_it == reverse_instance_id_map_.end()) |
129 // There's nothing to do if this key does not exist in the map. | |
130 if (it == instance_id_map_.end()) | |
131 return; | 105 return; |
132 | 106 |
133 int guest_instance_id = it->second; | 107 const ElementInstanceKey& key = reverse_it->second; |
134 instance_id_map_.erase(key); | |
135 | 108 |
136 auto reverse_it = reverse_instance_id_map_.find(guest->guest_instance_id()); | 109 auto it = instance_id_map_.find(key); |
137 DCHECK(reverse_it != reverse_instance_id_map_.end()); | 110 DCHECK(it != instance_id_map_.end()); |
138 DCHECK(reverse_it->second == key); | 111 |
139 reverse_instance_id_map_.erase(guest_instance_id); | 112 reverse_instance_id_map_.erase(reverse_it); |
| 113 instance_id_map_.erase(it); |
140 } | 114 } |
141 | 115 |
142 int GuestViewManager::GetNextInstanceID() { | 116 int GuestViewManager::GetNextInstanceID() { |
143 return ++current_instance_id_; | 117 return ++current_instance_id_; |
144 } | 118 } |
145 | 119 |
146 void GuestViewManager::CreateGuest(const std::string& view_type, | 120 void GuestViewManager::CreateGuest(const std::string& view_type, |
147 content::WebContents* owner_web_contents, | 121 content::WebContents* owner_web_contents, |
148 const base::DictionaryValue& create_params, | 122 const base::DictionaryValue& create_params, |
149 const WebContentsCreatedCallback& callback) { | 123 const WebContentsCreatedCallback& callback) { |
(...skipping 13 matching lines...) Expand all Loading... |
163 if (!guest) | 137 if (!guest) |
164 return nullptr; | 138 return nullptr; |
165 content::WebContents::CreateParams guest_create_params(create_params); | 139 content::WebContents::CreateParams guest_create_params(create_params); |
166 guest_create_params.guest_delegate = guest; | 140 guest_create_params.guest_delegate = guest; |
167 auto guest_web_contents = WebContents::Create(guest_create_params); | 141 auto guest_web_contents = WebContents::Create(guest_create_params); |
168 guest->InitWithWebContents(base::DictionaryValue(), guest_web_contents); | 142 guest->InitWithWebContents(base::DictionaryValue(), guest_web_contents); |
169 return guest_web_contents; | 143 return guest_web_contents; |
170 } | 144 } |
171 | 145 |
172 content::WebContents* GuestViewManager::GetGuestByInstanceID( | 146 content::WebContents* GuestViewManager::GetGuestByInstanceID( |
173 content::WebContents* owner_web_contents, | 147 int owner_process_id, |
174 int element_instance_id) { | 148 int element_instance_id) { |
175 int guest_instance_id = GetGuestInstanceIDForElementID(owner_web_contents, | 149 int guest_instance_id = GetGuestInstanceIDForElementID(owner_process_id, |
176 element_instance_id); | 150 element_instance_id); |
177 if (guest_instance_id == guestview::kInstanceIDNone) | 151 if (guest_instance_id == guestview::kInstanceIDNone) |
178 return nullptr; | 152 return nullptr; |
179 | 153 |
180 return GetGuestByInstanceID(guest_instance_id); | 154 return GetGuestByInstanceID(guest_instance_id); |
181 } | 155 } |
182 | 156 |
183 int GuestViewManager::GetGuestInstanceIDForElementID( | 157 int GuestViewManager::GetGuestInstanceIDForElementID(int owner_process_id, |
184 content::WebContents* owner_web_contents, | 158 int element_instance_id) { |
185 int element_instance_id) { | |
186 auto iter = instance_id_map_.find( | 159 auto iter = instance_id_map_.find( |
187 ElementInstanceKey(owner_web_contents, element_instance_id)); | 160 ElementInstanceKey(owner_process_id, element_instance_id)); |
188 if (iter == instance_id_map_.end()) | 161 if (iter == instance_id_map_.end()) |
189 return guestview::kInstanceIDNone; | 162 return guestview::kInstanceIDNone; |
190 return iter->second; | 163 return iter->second; |
191 } | 164 } |
192 | 165 |
193 SiteInstance* GuestViewManager::GetGuestSiteInstance( | 166 SiteInstance* GuestViewManager::GetGuestSiteInstance( |
194 const GURL& guest_site) { | 167 const GURL& guest_site) { |
195 for (const auto& guest : guest_web_contents_by_instance_id_) { | 168 for (const auto& guest : guest_web_contents_by_instance_id_) { |
196 if (guest.second->GetSiteInstance()->GetSiteURL() == guest_site) | 169 if (guest.second->GetSiteInstance()->GetSiteURL() == guest_site) |
197 return guest.second->GetSiteInstance(); | 170 return guest.second->GetSiteInstance(); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 | 280 |
308 auto guest_view = GuestViewBase::FromWebContents(it->second); | 281 auto guest_view = GuestViewBase::FromWebContents(it->second); |
309 if (!guest_view) | 282 if (!guest_view) |
310 return false; | 283 return false; |
311 | 284 |
312 return embedder_render_process_id == | 285 return embedder_render_process_id == |
313 guest_view->owner_web_contents()->GetRenderProcessHost()->GetID(); | 286 guest_view->owner_web_contents()->GetRenderProcessHost()->GetID(); |
314 } | 287 } |
315 | 288 |
316 } // namespace extensions | 289 } // namespace extensions |
OLD | NEW |