web_view_manager.cc 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Copyright (c) 2014 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #include "atom/browser/web_view_manager.h"
  5. #include "atom/browser/atom_browser_context.h"
  6. #include "content/public/browser/render_process_host.h"
  7. #include "content/public/browser/web_contents.h"
  8. namespace atom {
  9. WebViewManager::WebViewManager() {
  10. }
  11. WebViewManager::~WebViewManager() {
  12. }
  13. void WebViewManager::AddGuest(int guest_instance_id,
  14. int element_instance_id,
  15. content::WebContents* embedder,
  16. content::WebContents* web_contents) {
  17. web_contents_embedder_map_[guest_instance_id] = { web_contents, embedder };
  18. // Map the element in embedder to guest.
  19. int owner_process_id = embedder->GetRenderProcessHost()->GetID();
  20. ElementInstanceKey key(owner_process_id, element_instance_id);
  21. element_instance_id_to_guest_map_[key] = guest_instance_id;
  22. }
  23. void WebViewManager::RemoveGuest(int guest_instance_id) {
  24. if (!ContainsKey(web_contents_embedder_map_, guest_instance_id))
  25. return;
  26. web_contents_embedder_map_.erase(guest_instance_id);
  27. // Remove the record of element in embedder too.
  28. for (const auto& element : element_instance_id_to_guest_map_)
  29. if (element.second == guest_instance_id) {
  30. element_instance_id_to_guest_map_.erase(element.first);
  31. break;
  32. }
  33. }
  34. content::WebContents* WebViewManager::GetEmbedder(int guest_instance_id) {
  35. if (ContainsKey(web_contents_embedder_map_, guest_instance_id))
  36. return web_contents_embedder_map_[guest_instance_id].embedder;
  37. else
  38. return nullptr;
  39. }
  40. content::WebContents* WebViewManager::GetGuestByInstanceID(
  41. int owner_process_id,
  42. int element_instance_id) {
  43. ElementInstanceKey key(owner_process_id, element_instance_id);
  44. if (!ContainsKey(element_instance_id_to_guest_map_, key))
  45. return nullptr;
  46. int guest_instance_id = element_instance_id_to_guest_map_[key];
  47. if (ContainsKey(web_contents_embedder_map_, guest_instance_id))
  48. return web_contents_embedder_map_[guest_instance_id].web_contents;
  49. else
  50. return nullptr;
  51. }
  52. bool WebViewManager::ForEachGuest(content::WebContents* embedder_web_contents,
  53. const GuestCallback& callback) {
  54. for (auto& item : web_contents_embedder_map_)
  55. if (item.second.embedder == embedder_web_contents &&
  56. callback.Run(item.second.web_contents))
  57. return true;
  58. return false;
  59. }
  60. // static
  61. WebViewManager* WebViewManager::GetWebViewManager(
  62. content::WebContents* web_contents) {
  63. auto context = web_contents->GetBrowserContext();
  64. if (context) {
  65. auto manager = context->GetGuestManager();
  66. return static_cast<WebViewManager*>(manager);
  67. } else {
  68. return nullptr;
  69. }
  70. }
  71. } // namespace atom