From 2002cb3c1637b9580d30b539109fe0fb2d47a91f Mon Sep 17 00:00:00 2001 From: Julie Jeongeun Kim Date: Fri, 17 Jan 2020 11:37:29 +0000 Subject: [PATCH] Move InputMsg_SetFocus to mojo This CL changes InputMsg_SetFocus so that it is implemented in the RemoteFrame interface since it is only got through RenderFrameProxy. It also introduces FakeRemoteFrame to use RemoteFrame on render_frame_host_manager_unittest.cc. Bug: 1039256 Change-Id: If7d1d2971fabf3c64777281b1bf5eedfa9fcf5c7 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1989714 Commit-Queue: Julie Kim Reviewed-by: Dave Tapuska Reviewed-by: Kentaro Hara Reviewed-by: Kinuko Yasuda Reviewed-by: Ken Rockot Cr-Commit-Position: refs/heads/master@{#732808} --- content/browser/frame_host/frame_tree.cc | 2 +- .../frame_host/render_frame_host_impl.cc | 1 - .../render_frame_host_manager_unittest.cc | 80 ++++++++++++------- .../frame_host/render_frame_proxy_host.cc | 5 ++ .../frame_host/render_frame_proxy_host.h | 3 + .../renderer_host/render_widget_host_impl.cc | 1 - content/common/input_messages.h | 10 --- content/public/test/fake_remote_frame.cc | 62 ++++++++++++++ content/public/test/fake_remote_frame.h | 68 ++++++++++++++++ content/renderer/render_frame_proxy.cc | 5 -- content/renderer/render_frame_proxy.h | 1 - content/renderer/render_view_impl.cc | 6 -- content/renderer/render_view_impl.h | 4 - content/test/BUILD.gn | 2 + ipc/ipc_message_start.h | 1 - ipc/trace_ipc_message.cc | 5 +- .../blink/public/mojom/frame/frame.mojom | 3 + .../blink/renderer/core/frame/remote_frame.cc | 6 ++ .../blink/renderer/core/frame/remote_frame.h | 1 + 19 files changed, 202 insertions(+), 64 deletions(-) create mode 100644 content/public/test/fake_remote_frame.cc create mode 100644 content/public/test/fake_remote_frame.h diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc index 4d8a6d34e30736..770bbc6c676fc3 100644 --- a/content/browser/frame_host/frame_tree.cc +++ b/content/browser/frame_host/frame_tree.cc @@ -489,7 +489,7 @@ void FrameTree::SetPageFocus(SiteInstance* instance, bool is_focused) { if (instance != root_manager->current_frame_host()->GetSiteInstance()) { RenderFrameProxyHost* proxy = root_manager->GetRenderFrameProxyHost(instance); - proxy->Send(new InputMsg_SetFocus(proxy->GetRoutingID(), is_focused)); + proxy->GetAssociatedRemoteFrame()->SetPageFocus(is_focused); } } diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 2f068b83d4bd63..26a897809e0e08 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc @@ -1641,7 +1641,6 @@ PageVisibilityState RenderFrameHostImpl::GetVisibilityState() { } bool RenderFrameHostImpl::Send(IPC::Message* message) { - DCHECK(IPC_MESSAGE_ID_CLASS(message->type()) != InputMsgStart); return GetProcess()->Send(message); } diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc index 0c37caba65f03b..771b1890e41ce1 100644 --- a/content/browser/frame_host/render_frame_host_manager_unittest.cc +++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc @@ -50,6 +50,7 @@ #include "content/public/common/url_constants.h" #include "content/public/common/url_utils.h" #include "content/public/test/fake_local_frame.h" +#include "content/public/test/fake_remote_frame.h" #include "content/public/test/mock_render_process_host.h" #include "content/public/test/test_utils.h" #include "content/test/mock_widget_input_handler.h" @@ -73,20 +74,6 @@ namespace content { namespace { -// Helper to check that the provided RenderProcessHost received exactly one -// page focus message with the provided focus and routing ID values. -void VerifyPageFocusMessage(MockRenderProcessHost* rph, - bool expected_focus, - int expected_routing_id) { - const IPC::Message* message = - rph->sink().GetUniqueMessageMatching(InputMsg_SetFocus::ID); - EXPECT_TRUE(message); - EXPECT_EQ(expected_routing_id, message->routing_id()); - InputMsg_SetFocus::Param params; - EXPECT_TRUE(InputMsg_SetFocus::Read(message, ¶ms)); - EXPECT_EQ(expected_focus, std::get<0>(params)); -} - // VerifyPageFocusMessage from the mojo input handler. void VerifyPageFocusMessage(TestRenderWidgetHost* twh, bool expected_focus) { MockWidgetInputHandler::MessageVector events = @@ -2288,6 +2275,21 @@ TEST_F(RenderFrameHostManagerTest, TraverseComplexOpenerChain) { nodes_with_back_links.end()); } +// Stub out remote frame mojo binding. Intercepts calls to SetPageFocus +// and marks the message as received. +class PageFocusRemoteFrame : public content::FakeRemoteFrame { + public: + explicit PageFocusRemoteFrame(RenderFrameProxyHost* render_frame_proxy_host) { + Init(render_frame_proxy_host->GetRemoteAssociatedInterfacesTesting()); + } + + void SetPageFocus(bool is_focused) override { set_page_focus_ = is_focused; } + bool IsPageFocused() { return set_page_focus_; } + + private: + bool set_page_focus_ = false; +}; + // Check that when a window is focused/blurred, the message that sets // page-level focus updates is sent to each process involved in rendering the // current page. @@ -2343,8 +2345,18 @@ TEST_F(RenderFrameHostManagerTest, PageFocusPropagatesToSubframeProcesses) { false /* is_renderer_init */, nullptr /* blob_url_loader_factory */); TestRenderFrameHost* host1 = static_cast(NavigateToEntry(child1, &entryB)); + + // The main frame should have proxies for B. + RenderFrameProxyHost* proxyB = + root->render_manager()->GetRenderFrameProxyHost(host1->GetSiteInstance()); + EXPECT_TRUE(proxyB); + + // Create PageFocusRemoteFrame to intercept SetPageFocus to RemoteFrame. + PageFocusRemoteFrame remote_frame1(proxyB); + TestRenderFrameHost* host2 = static_cast(NavigateToEntry(child2, &entryB)); + child1->DidNavigateFrame(host1, true /* was_caused_by_user_gesture */, false /* is_same_document_navigation */, blink::FramePolicy()); @@ -2360,6 +2372,15 @@ TEST_F(RenderFrameHostManagerTest, PageFocusPropagatesToSubframeProcesses) { false /* is_renderer_init */, nullptr /* blob_url_loader_factory */); TestRenderFrameHost* host3 = static_cast(NavigateToEntry(child3, &entryC)); + + // The main frame should have proxies for C. + RenderFrameProxyHost* proxyC = + root->render_manager()->GetRenderFrameProxyHost(host3->GetSiteInstance()); + EXPECT_TRUE(proxyC); + + // Create PageFocusRemoteFrame to intercept SetPageFocus to RemoteFrame. + PageFocusRemoteFrame remote_frame3(proxyC); + child3->DidNavigateFrame(host3, true /* was_caused_by_user_gesture */, false /* is_same_document_navigation */, blink::FramePolicy()); @@ -2371,13 +2392,6 @@ TEST_F(RenderFrameHostManagerTest, PageFocusPropagatesToSubframeProcesses) { EXPECT_NE(host3->GetProcess(), main_test_rfh()->GetProcess()); EXPECT_NE(host3->GetProcess(), host1->GetProcess()); - // The main frame should have proxies for B and C. - RenderFrameProxyHost* proxyB = - root->render_manager()->GetRenderFrameProxyHost(host1->GetSiteInstance()); - EXPECT_TRUE(proxyB); - RenderFrameProxyHost* proxyC = - root->render_manager()->GetRenderFrameProxyHost(host3->GetSiteInstance()); - EXPECT_TRUE(proxyC); base::RunLoop().RunUntilIdle(); // Focus the main page, and verify that the focus message was sent to all @@ -2390,8 +2404,8 @@ TEST_F(RenderFrameHostManagerTest, PageFocusPropagatesToSubframeProcesses) { main_test_rfh()->GetRenderWidgetHost()->Focus(); base::RunLoop().RunUntilIdle(); VerifyPageFocusMessage(main_test_rfh()->GetRenderWidgetHost(), true); - VerifyPageFocusMessage(host1->GetProcess(), true, proxyB->GetRoutingID()); - VerifyPageFocusMessage(host3->GetProcess(), true, proxyC->GetRoutingID()); + EXPECT_TRUE(remote_frame1.IsPageFocused()); + EXPECT_TRUE(remote_frame3.IsPageFocused()); // Similarly, simulate focus loss on main page, and verify that the focus // message was sent to all processes. @@ -2401,8 +2415,8 @@ TEST_F(RenderFrameHostManagerTest, PageFocusPropagatesToSubframeProcesses) { main_test_rfh()->GetRenderWidgetHost()->Blur(); base::RunLoop().RunUntilIdle(); VerifyPageFocusMessage(main_test_rfh()->GetRenderWidgetHost(), false); - VerifyPageFocusMessage(host1->GetProcess(), false, proxyB->GetRoutingID()); - VerifyPageFocusMessage(host3->GetProcess(), false, proxyC->GetRoutingID()); + EXPECT_FALSE(remote_frame1.IsPageFocused()); + EXPECT_FALSE(remote_frame3.IsPageFocused()); } // Check that page-level focus state is preserved across subframe navigations. @@ -2458,19 +2472,25 @@ TEST_F(RenderFrameHostManagerTest, false /* is_renderer_init */, nullptr /* blob_url_loader_factory */); TestRenderFrameHost* hostC = static_cast(NavigateToEntry(child, &entryC)); + + // The main frame should now have a proxy for C. + RenderFrameProxyHost* proxyC = + root->render_manager()->GetRenderFrameProxyHost(hostC->GetSiteInstance()); + EXPECT_TRUE(proxyC); + + // Create PageFocusRemoteFrame to intercept SetPageFocus to RemoteFrame. + PageFocusRemoteFrame remote_frame(proxyC); + child->DidNavigateFrame(hostC, true /* was_caused_by_user_gesture */, false /* is_same_document_navigation */, blink::FramePolicy()); - // The main frame should now have a proxy for C. - RenderFrameProxyHost* proxy = - root->render_manager()->GetRenderFrameProxyHost(hostC->GetSiteInstance()); - EXPECT_TRUE(proxy); + base::RunLoop().RunUntilIdle(); // Since the B->C navigation happened while the current page was focused, // page focus should propagate to the new subframe process. Check that // process C received the proper focus message. - VerifyPageFocusMessage(hostC->GetProcess(), true, proxy->GetRoutingID()); + EXPECT_TRUE(remote_frame.IsPageFocused()); } // Checks that a restore navigation to a WebUI works. diff --git a/content/browser/frame_host/render_frame_proxy_host.cc b/content/browser/frame_host/render_frame_proxy_host.cc index 05c67bc453dc31..453bee4854cca1 100644 --- a/content/browser/frame_host/render_frame_proxy_host.cc +++ b/content/browser/frame_host/render_frame_proxy_host.cc @@ -593,4 +593,9 @@ void RenderFrameProxyHost::OnPrintCrossProcessSubframe(const gfx::Rect& rect, rfh->delegate()->PrintCrossProcessSubframe(rect, document_cookie, rfh); } +blink::AssociatedInterfaceProvider* +RenderFrameProxyHost::GetRemoteAssociatedInterfacesTesting() { + return GetRemoteAssociatedInterfaces(); +} + } // namespace content diff --git a/content/browser/frame_host/render_frame_proxy_host.h b/content/browser/frame_host/render_frame_proxy_host.h index ea41cfa11eea25..8e3c35a4648307 100644 --- a/content/browser/frame_host/render_frame_proxy_host.h +++ b/content/browser/frame_host/render_frame_proxy_host.h @@ -145,6 +145,9 @@ class RenderFrameProxyHost : public IPC::Listener, void DidFocusFrame() override; void CheckCompleted() override; + CONTENT_EXPORT blink::AssociatedInterfaceProvider* + GetRemoteAssociatedInterfacesTesting(); + private: // IPC Message handlers. void OnDetach(); diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index cb19c7f0fb1fbd..5903e48135ff28 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -600,7 +600,6 @@ bool RenderWidgetHostImpl::OnMessageReceived(const IPC::Message &msg) { } bool RenderWidgetHostImpl::Send(IPC::Message* msg) { - DCHECK(IPC_MESSAGE_ID_CLASS(msg->type()) != InputMsgStart); return process_->Send(msg); } diff --git a/content/common/input_messages.h b/content/common/input_messages.h index 55134b98924519..cb3488b36c6ee0 100644 --- a/content/common/input_messages.h +++ b/content/common/input_messages.h @@ -42,12 +42,6 @@ #undef IPC_MESSAGE_EXPORT #define IPC_MESSAGE_EXPORT CONTENT_EXPORT -#ifdef IPC_MESSAGE_START -#error IPC_MESSAGE_START -#endif - -#define IPC_MESSAGE_START InputMsgStart - IPC_ENUM_TRAITS_MAX_VALUE(content::InputEventAckSource, content::InputEventAckSource::MAX_FROM_RENDERER) IPC_ENUM_TRAITS_MAX_VALUE( @@ -154,8 +148,4 @@ IPC_STRUCT_TRAITS_BEGIN(content::SyntheticPointerActionListParams) IPC_STRUCT_TRAITS_MEMBER(params) IPC_STRUCT_TRAITS_END() -// TODO(dtapuska): Remove this as only OOPIF uses this -IPC_MESSAGE_ROUTED1(InputMsg_SetFocus, - bool /* enable */) - #endif // CONTENT_COMMON_INPUT_MESSAGES_H_ diff --git a/content/public/test/fake_remote_frame.cc b/content/public/test/fake_remote_frame.cc new file mode 100644 index 00000000000000..481e04f2c5824f --- /dev/null +++ b/content/public/test/fake_remote_frame.cc @@ -0,0 +1,62 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/public/test/fake_remote_frame.h" + +namespace content { + +FakeRemoteFrame::FakeRemoteFrame() = default; + +FakeRemoteFrame::~FakeRemoteFrame() = default; + +void FakeRemoteFrame::Init(blink::AssociatedInterfaceProvider* provider) { + provider->OverrideBinderForTesting( + blink::mojom::RemoteFrame::Name_, + base::BindRepeating(&FakeRemoteFrame::BindFrameHostReceiver, + base::Unretained(this))); +} + +void FakeRemoteFrame::WillEnterFullscreen() {} + +void FakeRemoteFrame::AddReplicatedContentSecurityPolicies( + std::vector headers) {} + +void FakeRemoteFrame::ResetReplicatedContentSecurityPolicy() {} + +void FakeRemoteFrame::EnforceInsecureNavigationsSet( + const std::vector& set) {} + +void FakeRemoteFrame::SetReplicatedOrigin( + const url::Origin& origin, + bool is_potentially_trustworthy_unique_origin) {} + +void FakeRemoteFrame::DispatchLoadEventForFrameOwner() {} + +void FakeRemoteFrame::Collapse(bool collapsed) {} + +void FakeRemoteFrame::Focus() {} + +void FakeRemoteFrame::SetHadStickyUserActivationBeforeNavigation(bool value) {} + +void FakeRemoteFrame::SetNeedsOcclusionTracking(bool needs_tracking) {} + +void FakeRemoteFrame::BubbleLogicalScroll( + blink::mojom::ScrollDirection direction, + ui::input_types::ScrollGranularity granularity) {} + +void FakeRemoteFrame::UpdateUserActivationState( + blink::mojom::UserActivationUpdateType) {} + +void FakeRemoteFrame::SetEmbeddingToken( + const base::UnguessableToken& embedding_token) {} + +void FakeRemoteFrame::SetPageFocus(bool is_focused) {} + +void FakeRemoteFrame::FakeRemoteFrame::BindFrameHostReceiver( + mojo::ScopedInterfaceEndpointHandle handle) { + receiver_.Bind(mojo::PendingAssociatedReceiver( + std::move(handle))); +} + +} // namespace content diff --git a/content/public/test/fake_remote_frame.h b/content/public/test/fake_remote_frame.h new file mode 100644 index 00000000000000..008ece561e8bd9 --- /dev/null +++ b/content/public/test/fake_remote_frame.h @@ -0,0 +1,68 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_PUBLIC_TEST_FAKE_REMOTE_FRAME_H_ +#define CONTENT_PUBLIC_TEST_FAKE_REMOTE_FRAME_H_ + +#include "mojo/public/cpp/bindings/associated_receiver.h" +#include "services/network/public/mojom/content_security_policy.mojom.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" +#include "third_party/blink/public/mojom/frame/frame.mojom.h" +#include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h" +#include "ui/events/types/scroll_types.h" + +namespace base { +class UnguessableToken; +} + +namespace url { +class Origin; +} // namespace url + +namespace content { + +// This class implements a RemoteFrame that can be attached to the +// AssociatedInterfaceProvider so that it will be called when the browser +// normally sends a request to the renderer process. But for a unittest +// setup it can be intercepted by this class. +class FakeRemoteFrame : public blink::mojom::RemoteFrame { + public: + FakeRemoteFrame(); + ~FakeRemoteFrame() override; + + void Init(blink::AssociatedInterfaceProvider* provider); + + // blink::mojom::RemoteFrame overrides: + void WillEnterFullscreen() override; + void AddReplicatedContentSecurityPolicies( + std::vector headers) + override; + void ResetReplicatedContentSecurityPolicy() override; + void EnforceInsecureNavigationsSet(const std::vector& set) override; + void SetReplicatedOrigin( + const url::Origin& origin, + bool is_potentially_trustworthy_unique_origin) override; + void DispatchLoadEventForFrameOwner() override; + void Collapse(bool collapsed) final; + void Focus() override; + void SetHadStickyUserActivationBeforeNavigation(bool value) override; + void SetNeedsOcclusionTracking(bool needs_tracking) override; + void BubbleLogicalScroll( + blink::mojom::ScrollDirection direction, + ui::input_types::ScrollGranularity granularity) override; + void UpdateUserActivationState( + blink::mojom::UserActivationUpdateType) override; + void SetEmbeddingToken( + const base::UnguessableToken& embedding_token) override; + void SetPageFocus(bool is_focused) override; + + private: + void BindFrameHostReceiver(mojo::ScopedInterfaceEndpointHandle handle); + + mojo::AssociatedReceiver receiver_{this}; +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_TEST_FAKE_REMOTE_FRAME_H_ diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc index 9fc9f0c8c61ce1..5ad62b2aeb0eea 100644 --- a/content/renderer/render_frame_proxy.cc +++ b/content/renderer/render_frame_proxy.cc @@ -428,7 +428,6 @@ bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { OnEnforceInsecureRequestPolicy) IPC_MESSAGE_HANDLER(FrameMsg_SetFrameOwnerProperties, OnSetFrameOwnerProperties) - IPC_MESSAGE_HANDLER(InputMsg_SetFocus, OnSetPageFocus) IPC_MESSAGE_HANDLER(FrameMsg_DidUpdateVisualProperties, OnDidUpdateVisualProperties) IPC_MESSAGE_HANDLER(FrameMsg_EnableAutoResize, OnEnableAutoResize) @@ -512,10 +511,6 @@ void RenderFrameProxy::OnSetFrameOwnerProperties( ConvertFrameOwnerPropertiesToWebFrameOwnerProperties(properties)); } -void RenderFrameProxy::OnSetPageFocus(bool is_focused) { - render_view_->SetFocus(is_focused); -} - void RenderFrameProxy::OnTransferUserActivationFrom(int32_t source_routing_id) { RenderFrameProxy* source_proxy = RenderFrameProxy::FromRoutingID(source_routing_id); diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h index eed8a17b20fccb..f43ea3e05541df 100644 --- a/content/renderer/render_frame_proxy.h +++ b/content/renderer/render_frame_proxy.h @@ -241,7 +241,6 @@ class CONTENT_EXPORT RenderFrameProxy : public IPC::Listener, void OnDidUpdateName(const std::string& name, const std::string& unique_name); void OnEnforceInsecureRequestPolicy(blink::WebInsecureRequestPolicy policy); void OnSetFrameOwnerProperties(const FrameOwnerProperties& properties); - void OnSetPageFocus(bool is_focused); void OnTransferUserActivationFrom(int32_t source_routing_id); void OnScrollRectToVisible(const gfx::Rect& rect_to_scroll, const blink::WebScrollIntoViewParams& params); diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 23ea7af344a1ea..29a955a17734ea 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -1956,12 +1956,6 @@ void RenderViewImpl::OnSetInsidePortal(bool inside_portal) { webview()->SetInsidePortal(inside_portal); } -void RenderViewImpl::SetFocus(bool enable) { - // This is only called from RenderFrameProxy. - CHECK(!webview()->MainFrame()->IsWebLocalFrame()); - webview()->SetFocus(enable); -} - void RenderViewImpl::PageScaleFactorChanged(float page_scale_factor) { if (!webview()) return; diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index a6768059fb7e91..383d73a59f993f 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h @@ -189,10 +189,6 @@ class CONTENT_EXPORT RenderViewImpl : public blink::WebViewClient, void PropagatePageZoomToNewlyAttachedFrame(bool use_zoom_for_dsf, float device_scale_factor); - // Sets page-level focus in this view and notifies plugins and Blink's - // FocusController. - void SetFocus(bool enable); - // Starts a timer to send an UpdateState message on behalf of |frame|, if the // timer isn't already running. This allows multiple state changing events to // be coalesced into one update. diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 8f66d6f75ecc7c..03da3f78e8a9f9 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn @@ -118,6 +118,8 @@ jumbo_static_library("test_support") { "../public/test/fake_download_item.h", "../public/test/fake_local_frame.cc", "../public/test/fake_local_frame.h", + "../public/test/fake_remote_frame.cc", + "../public/test/fake_remote_frame.h", "../public/test/fake_service_worker_context.cc", "../public/test/fake_service_worker_context.h", "../public/test/fake_speech_recognition_manager.cc", diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h index 64aaa9a1c346cf..eddd5b29e14127 100644 --- a/ipc/ipc_message_start.h +++ b/ipc/ipc_message_start.h @@ -17,7 +17,6 @@ enum IPCMessageStart { PageMsgStart, ViewMsgStart, WidgetMsgStart, - InputMsgStart, TestMsgStart, WorkerMsgStart, NaClMsgStart, diff --git a/ipc/trace_ipc_message.cc b/ipc/trace_ipc_message.cc index eba6c63dad429d..d1c968ea66c011 100644 --- a/ipc/trace_ipc_message.cc +++ b/ipc/trace_ipc_message.cc @@ -34,9 +34,6 @@ void WriteIpcMessageIdAsProtozero(uint32_t message_id, case WidgetMsgStart: message_class = ChromeLegacyIpc::CLASS_WIDGET; break; - case InputMsgStart: - message_class = ChromeLegacyIpc::CLASS_INPUT; - break; case TestMsgStart: message_class = ChromeLegacyIpc::CLASS_TEST; break; @@ -126,4 +123,4 @@ void WriteIpcMessageIdAsProtozero(uint32_t message_id, legacy_ipc->set_message_line(IPC_MESSAGE_ID_LINE(message_id)); } -} // namespace IPC \ No newline at end of file +} // namespace IPC diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom index 0efa35112be237..93d6237e88cf3b 100644 --- a/third_party/blink/public/mojom/frame/frame.mojom +++ b/third_party/blink/public/mojom/frame/frame.mojom @@ -299,4 +299,7 @@ interface RemoteFrame { // set the embedding token. This token uniquely specifies the relationship // between a frame and its parent. SetEmbeddingToken(mojo_base.mojom.UnguessableToken embedding_token); + + // Sets page-level focus and notifies FocusController. + SetPageFocus(bool is_focused); }; diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc index 191fdfa46bb147..4d99722e177b91 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.cc +++ b/third_party/blink/renderer/core/frame/remote_frame.cc @@ -8,6 +8,8 @@ #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/platform/interface_registry.h" +#include "third_party/blink/public/web/web_frame.h" +#include "third_party/blink/public/web/web_view.h" #include "third_party/blink/renderer/bindings/core/v8/window_proxy.h" #include "third_party/blink/renderer/bindings/core/v8/window_proxy_manager.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" @@ -398,6 +400,10 @@ void RemoteFrame::SetEmbeddingToken( To(owner)->SetEmbeddingToken(embedding_token); } +void RemoteFrame::SetPageFocus(bool is_focused) { + WebFrame::FromFrame(this)->View()->SetFocus(is_focused); +} + bool RemoteFrame::IsIgnoredForHitTest() const { HTMLFrameOwnerElement* owner = DeprecatedLocalOwner(); if (!owner || !owner->GetLayoutObject()) diff --git a/third_party/blink/renderer/core/frame/remote_frame.h b/third_party/blink/renderer/core/frame/remote_frame.h index 59f45f1859834f..c86c18ebacfeec 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.h +++ b/third_party/blink/renderer/core/frame/remote_frame.h @@ -111,6 +111,7 @@ class CORE_EXPORT RemoteFrame final : public Frame, mojom::blink::UserActivationUpdateType) override; void SetEmbeddingToken( const base::UnguessableToken& embedding_token) override; + void SetPageFocus(bool is_focused) override; private: // Frame protected overrides: