| 
									
										
										
										
											2014-10-31 11:17:05 -07:00
										 |  |  | // Copyright (c) 2014 GitHub, Inc.
 | 
					
						
							| 
									
										
										
										
											2014-10-22 22:55:13 +08:00
										 |  |  | // Use of this source code is governed by the MIT license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-04 15:17:28 -08:00
										 |  |  | #include "atom/browser/web_view_manager.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-22 22:55:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 23:08:48 +08:00
										 |  |  | #include "atom/browser/atom_browser_context.h"
 | 
					
						
							| 
									
										
										
										
											2017-12-18 13:46:23 +11:00
										 |  |  | #include "content/public/browser/render_frame_host.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-25 20:52:42 +08:00
										 |  |  | #include "content/public/browser/render_process_host.h"
 | 
					
						
							| 
									
										
										
										
											2016-05-25 10:28:35 -07:00
										 |  |  | #include "content/public/browser/web_contents.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-22 22:55:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace atom { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | WebViewManager::WebViewManager() {} | 
					
						
							| 
									
										
										
										
											2014-10-22 22:55:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  | WebViewManager::~WebViewManager() {} | 
					
						
							| 
									
										
										
										
											2014-10-22 22:55:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 23:08:48 +08:00
										 |  |  | void WebViewManager::AddGuest(int guest_instance_id, | 
					
						
							| 
									
										
										
										
											2014-12-09 14:38:43 -08:00
										 |  |  |                               int element_instance_id, | 
					
						
							| 
									
										
										
										
											2014-10-23 23:08:48 +08:00
										 |  |  |                               content::WebContents* embedder, | 
					
						
							| 
									
										
										
										
											2015-09-03 06:17:58 +05:30
										 |  |  |                               content::WebContents* web_contents) { | 
					
						
							| 
									
										
										
										
											2018-04-17 21:55:30 -04:00
										 |  |  |   web_contents_embedder_map_[guest_instance_id] = {web_contents, embedder}; | 
					
						
							| 
									
										
										
										
											2014-12-09 14:38:43 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Map the element in embedder to guest.
 | 
					
						
							| 
									
										
										
										
											2017-12-18 13:46:23 +11:00
										 |  |  |   int owner_process_id = embedder->GetMainFrame()->GetProcess()->GetID(); | 
					
						
							| 
									
										
										
										
											2015-04-21 18:56:08 +08:00
										 |  |  |   ElementInstanceKey key(owner_process_id, element_instance_id); | 
					
						
							| 
									
										
										
										
											2014-12-09 14:38:43 -08:00
										 |  |  |   element_instance_id_to_guest_map_[key] = guest_instance_id; | 
					
						
							| 
									
										
										
										
											2014-10-23 23:08:48 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebViewManager::RemoveGuest(int guest_instance_id) { | 
					
						
							| 
									
										
										
										
											2016-11-30 16:30:03 +09:00
										 |  |  |   if (!base::ContainsKey(web_contents_embedder_map_, guest_instance_id)) | 
					
						
							| 
									
										
										
										
											2014-12-15 11:22:14 -08:00
										 |  |  |     return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-06 20:31:05 +05:30
										 |  |  |   web_contents_embedder_map_.erase(guest_instance_id); | 
					
						
							| 
									
										
										
										
											2015-02-04 14:58:03 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-09 14:38:43 -08:00
										 |  |  |   // Remove the record of element in embedder too.
 | 
					
						
							|  |  |  |   for (const auto& element : element_instance_id_to_guest_map_) | 
					
						
							|  |  |  |     if (element.second == guest_instance_id) { | 
					
						
							|  |  |  |       element_instance_id_to_guest_map_.erase(element.first); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-10-23 23:08:48 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-25 10:13:12 -07:00
										 |  |  | content::WebContents* WebViewManager::GetEmbedder(int guest_instance_id) { | 
					
						
							| 
									
										
										
										
											2016-11-30 16:30:03 +09:00
										 |  |  |   if (base::ContainsKey(web_contents_embedder_map_, guest_instance_id)) | 
					
						
							| 
									
										
										
										
											2016-05-25 10:13:12 -07:00
										 |  |  |     return web_contents_embedder_map_[guest_instance_id].embedder; | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     return nullptr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-07 07:43:26 -08:00
										 |  |  | content::WebContents* WebViewManager::GetGuestByInstanceID( | 
					
						
							| 
									
										
										
										
											2015-04-21 18:56:08 +08:00
										 |  |  |     int owner_process_id, | 
					
						
							| 
									
										
										
										
											2014-12-09 14:38:43 -08:00
										 |  |  |     int element_instance_id) { | 
					
						
							| 
									
										
										
										
											2015-04-21 18:56:08 +08:00
										 |  |  |   ElementInstanceKey key(owner_process_id, element_instance_id); | 
					
						
							| 
									
										
										
										
											2016-11-30 16:30:03 +09:00
										 |  |  |   if (!base::ContainsKey(element_instance_id_to_guest_map_, key)) | 
					
						
							| 
									
										
										
										
											2014-12-09 14:38:43 -08:00
										 |  |  |     return nullptr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int guest_instance_id = element_instance_id_to_guest_map_[key]; | 
					
						
							| 
									
										
										
										
											2016-11-30 16:30:03 +09:00
										 |  |  |   if (base::ContainsKey(web_contents_embedder_map_, guest_instance_id)) | 
					
						
							| 
									
										
										
										
											2015-08-06 20:31:05 +05:30
										 |  |  |     return web_contents_embedder_map_[guest_instance_id].web_contents; | 
					
						
							| 
									
										
										
										
											2014-10-23 23:08:48 +08:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2014-12-07 07:43:26 -08:00
										 |  |  |     return nullptr; | 
					
						
							| 
									
										
										
										
											2014-10-22 22:55:13 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool WebViewManager::ForEachGuest(content::WebContents* embedder_web_contents, | 
					
						
							|  |  |  |                                   const GuestCallback& callback) { | 
					
						
							| 
									
										
										
										
											2015-08-06 20:31:05 +05:30
										 |  |  |   for (auto& item : web_contents_embedder_map_) | 
					
						
							| 
									
										
										
										
											2014-10-23 23:08:48 +08:00
										 |  |  |     if (item.second.embedder == embedder_web_contents && | 
					
						
							|  |  |  |         callback.Run(item.second.web_contents)) | 
					
						
							|  |  |  |       return true; | 
					
						
							| 
									
										
										
										
											2014-10-22 22:55:13 +08:00
										 |  |  |   return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-25 10:13:12 -07:00
										 |  |  | // static
 | 
					
						
							| 
									
										
										
										
											2016-05-25 10:20:00 -07:00
										 |  |  | WebViewManager* WebViewManager::GetWebViewManager( | 
					
						
							|  |  |  |     content::WebContents* web_contents) { | 
					
						
							| 
									
										
										
										
											2018-04-17 15:41:47 -07:00
										 |  |  |   auto* context = web_contents->GetBrowserContext(); | 
					
						
							| 
									
										
										
										
											2016-05-25 10:13:12 -07:00
										 |  |  |   if (context) { | 
					
						
							| 
									
										
										
										
											2018-04-17 15:41:47 -07:00
										 |  |  |     auto* manager = context->GetGuestManager(); | 
					
						
							| 
									
										
										
										
											2016-05-25 10:22:43 -07:00
										 |  |  |     return static_cast<WebViewManager*>(manager); | 
					
						
							| 
									
										
										
										
											2016-05-25 10:13:12 -07:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     return nullptr; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-22 22:55:13 +08:00
										 |  |  | }  // namespace atom
 |