electron_messaging_delegate.cc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "shell/browser/extensions/electron_messaging_delegate.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/functional/callback.h"
  8. #include "base/values.h"
  9. #include "build/build_config.h"
  10. #include "components/prefs/pref_service.h"
  11. #include "content/public/browser/browser_context.h"
  12. #include "content/public/browser/browser_thread.h"
  13. #include "content/public/browser/render_frame_host.h"
  14. #include "content/public/browser/web_contents.h"
  15. #include "electron/shell/common/extensions/api/tabs.h"
  16. #include "extensions/browser/api/messaging/extension_message_port.h"
  17. #include "extensions/browser/api/messaging/native_message_host.h"
  18. #include "extensions/browser/extension_api_frame_id_map.h"
  19. #include "extensions/browser/pref_names.h"
  20. #include "extensions/common/api/messaging/port_id.h"
  21. #include "extensions/common/extension.h"
  22. #include "shell/browser/api/electron_api_web_contents.h"
  23. #include "ui/gfx/native_widget_types.h"
  24. #include "url/gurl.h"
  25. namespace extensions {
  26. ElectronMessagingDelegate::ElectronMessagingDelegate() = default;
  27. ElectronMessagingDelegate::~ElectronMessagingDelegate() = default;
  28. MessagingDelegate::PolicyPermission
  29. ElectronMessagingDelegate::IsNativeMessagingHostAllowed(
  30. content::BrowserContext* browser_context,
  31. const std::string& native_host_name) {
  32. DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  33. return PolicyPermission::DISALLOW;
  34. }
  35. std::optional<base::Value::Dict> ElectronMessagingDelegate::MaybeGetTabInfo(
  36. content::WebContents* web_contents) {
  37. if (web_contents) {
  38. auto* api_contents = electron::api::WebContents::From(web_contents);
  39. if (api_contents) {
  40. api::tabs::Tab tab;
  41. tab.id = api_contents->ID();
  42. tab.url = api_contents->GetURL().spec();
  43. tab.title = base::UTF16ToUTF8(api_contents->GetTitle());
  44. tab.audible = api_contents->IsCurrentlyAudible();
  45. return tab.ToValue();
  46. }
  47. }
  48. return std::nullopt;
  49. }
  50. content::WebContents* ElectronMessagingDelegate::GetWebContentsByTabId(
  51. content::BrowserContext* browser_context,
  52. int tab_id) {
  53. auto* contents = electron::api::WebContents::FromID(tab_id);
  54. if (!contents) {
  55. return nullptr;
  56. }
  57. return contents->web_contents();
  58. }
  59. std::unique_ptr<MessagePort> ElectronMessagingDelegate::CreateReceiverForTab(
  60. base::WeakPtr<MessagePort::ChannelDelegate> channel_delegate,
  61. const std::string& extension_id,
  62. const PortId& receiver_port_id,
  63. content::WebContents* receiver_contents,
  64. int receiver_frame_id,
  65. const std::string& receiver_document_id) {
  66. // Frame ID -1 is every frame in the tab.
  67. bool include_child_frames =
  68. receiver_frame_id == -1 && receiver_document_id.empty();
  69. content::RenderFrameHost* receiver_rfh = nullptr;
  70. if (include_child_frames) {
  71. // The target is the active outermost main frame of the WebContents.
  72. receiver_rfh = receiver_contents->GetPrimaryMainFrame();
  73. } else if (!receiver_document_id.empty()) {
  74. ExtensionApiFrameIdMap::DocumentId document_id =
  75. ExtensionApiFrameIdMap::DocumentIdFromString(receiver_document_id);
  76. // Return early for invalid documentIds.
  77. if (!document_id)
  78. return nullptr;
  79. receiver_rfh =
  80. ExtensionApiFrameIdMap::Get()->GetRenderFrameHostByDocumentId(
  81. document_id);
  82. // If both |document_id| and |receiver_frame_id| are provided they
  83. // should find the same RenderFrameHost, if not return early.
  84. if (receiver_frame_id != -1 &&
  85. ExtensionApiFrameIdMap::GetRenderFrameHostById(
  86. receiver_contents, receiver_frame_id) != receiver_rfh) {
  87. return nullptr;
  88. }
  89. } else {
  90. DCHECK_GT(receiver_frame_id, -1);
  91. receiver_rfh = ExtensionApiFrameIdMap::GetRenderFrameHostById(
  92. receiver_contents, receiver_frame_id);
  93. }
  94. if (!receiver_rfh)
  95. return nullptr;
  96. return std::make_unique<ExtensionMessagePort>(
  97. channel_delegate, receiver_port_id, extension_id, receiver_rfh,
  98. include_child_frames);
  99. }
  100. std::unique_ptr<MessagePort>
  101. ElectronMessagingDelegate::CreateReceiverForNativeApp(
  102. content::BrowserContext* browser_context,
  103. base::WeakPtr<MessagePort::ChannelDelegate> channel_delegate,
  104. content::RenderFrameHost* source,
  105. const std::string& extension_id,
  106. const PortId& receiver_port_id,
  107. const std::string& native_app_name,
  108. bool allow_user_level,
  109. std::string* error_out) {
  110. return nullptr;
  111. }
  112. void ElectronMessagingDelegate::QueryIncognitoConnectability(
  113. content::BrowserContext* context,
  114. const Extension* target_extension,
  115. content::WebContents* source_contents,
  116. const GURL& source_url,
  117. base::OnceCallback<void(bool)> callback) {
  118. DCHECK(context->IsOffTheRecord());
  119. std::move(callback).Run(false);
  120. }
  121. } // namespace extensions