Index: chrome/browser/guest_view/chrome_guest_view_message_filter.cc |
diff --git a/chrome/browser/guest_view/chrome_guest_view_message_filter.cc b/chrome/browser/guest_view/chrome_guest_view_message_filter.cc |
index 378beea4347da7adade867d0fbbc4f3059e92e03..9d33f088b4b1a823f9453ba876d6b758bdda4973 100644 |
--- a/chrome/browser/guest_view/chrome_guest_view_message_filter.cc |
+++ b/chrome/browser/guest_view/chrome_guest_view_message_filter.cc |
@@ -5,8 +5,16 @@ |
#include "chrome/browser/guest_view/chrome_guest_view_message_filter.h" |
#include "chrome/browser/guest_view/chrome_guest_view_manager_delegate.h" |
+#include "components/framelet/browser/framelet_guest.h" |
+#include "components/framelet/common/framelet_constants.h" |
+#include "components/framelet/common/framelet_messages.h" |
#include "components/guest_view/browser/guest_view_manager.h" |
+#include "components/guest_view/common/guest_view_constants.h" |
+#include "content/public/browser/render_frame_host.h" |
+#include "content/public/browser/web_contents.h" |
+#include "ipc/ipc_message_macros.h" |
#include "ipc/ipc_message_start.h" |
+#include "ui/gfx/geometry/size.h" |
namespace chrome { |
@@ -43,8 +51,79 @@ void ChromeGuestViewMessageFilter::OverrideThreadForMessage( |
bool ChromeGuestViewMessageFilter::OnMessageReceived( |
const IPC::Message& message) { |
- // TODO(fsamuel): Receive Chrome specific IPCs here. |
- return GuestViewMessageFilterBase::OnMessageReceived(message); |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(ChromeGuestViewMessageFilter, message); |
+ IPC_MESSAGE_HANDLER(FrameletGuestViewHostMsg_CreateFrameletGuest, |
+ OnCreateFrameletGuest); |
+ IPC_MESSAGE_UNHANDLED( |
+ handled = GuestViewMessageFilterBase::OnMessageReceived(message)); |
+ IPC_END_MESSAGE_MAP(); |
+ return handled; |
+} |
+ |
+void ChromeGuestViewMessageFilter::OnCreateFrameletGuest( |
+ int render_frame_id, |
+ const std::string& view_id, |
+ int element_instance_id, |
+ const gfx::Size& element_size) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ auto manager = GetOrCreateGuestViewManager(); |
+ |
+ auto rfh = |
+ content::RenderFrameHost::FromID(render_process_id_, render_frame_id); |
+ auto embedder_web_contents = content::WebContents::FromRenderFrameHost(rfh); |
+ if (!embedder_web_contents) |
+ return; |
+ |
+ guest_view::GuestViewManager::WebContentsCreatedCallback callback = |
+ base::Bind( |
+ &ChromeGuestViewMessageFilter:: |
+ FrameletGuestCreatedCallback, |
+ this, |
+ element_instance_id, |
+ render_process_id_, |
+ render_frame_id, |
+ element_size); |
+ |
+ base::DictionaryValue create_params; |
+ create_params.SetString(framelet::kViewId, view_id); |
+ create_params.SetInteger(guest_view::kElementWidth, element_size.width()); |
+ create_params.SetInteger(guest_view::kElementHeight, element_size.height()); |
+ manager->CreateGuest(guest_view::FrameletGuest::Type, |
+ embedder_web_contents, |
+ create_params, |
+ callback); |
+} |
+ |
+void ChromeGuestViewMessageFilter::FrameletGuestCreatedCallback( |
+ int element_instance_id, |
+ int embedder_render_process_id, |
+ int embedder_render_frame_id, |
+ const gfx::Size& element_size, |
+ content::WebContents* web_contents) { |
+ auto guest_view = guest_view::FrameletGuest::FromWebContents(web_contents); |
+ if (!guest_view) |
+ return; |
+ |
+ int guest_instance_id = guest_view->guest_instance_id(); |
+ auto rfh = content::RenderFrameHost::FromID(embedder_render_process_id, |
+ embedder_render_frame_id); |
+ if (!rfh) |
+ return; |
+ |
+ base::DictionaryValue attach_params; |
+ attach_params.SetInteger(guest_view::kElementWidth, element_size.width()); |
+ attach_params.SetInteger(guest_view::kElementHeight, element_size.height()); |
+ auto manager = |
+ guest_view::GuestViewManager::FromBrowserContext(browser_context_); |
+ CHECK(manager); |
+ manager->AttachGuest(embedder_render_process_id, |
+ element_instance_id, |
+ guest_instance_id, |
+ attach_params); |
+ |
+ rfh->Send( |
+ new FrameletGuestViewMsg_CreateFrameletGuestACK(element_instance_id)); |
} |
guest_view::GuestViewManager* |