Skip to content

Commit

Permalink
Enable ScopedObservation for RenderWidgetHost::InputEventObserver
Browse files Browse the repository at this point in the history
Provide a specialization for base::ScopedObservation, since the
add / remove methods for InputEventObserver are not named in the
way that ScopedObservation expects.

Bug: 1480496, 1472386
Change-Id: Ifa614f34ad94ced84588799dc46818e58d12b29c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4953774
Reviewed-by: Alexander Timin <altimin@chromium.org>
Commit-Queue: Frank Liberato <liberato@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1214582}
  • Loading branch information
liberato-at-chromium authored and Chromium LUCI CQ committed Oct 25, 2023
1 parent ba05cdc commit 2eaedee
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
2 changes: 2 additions & 0 deletions content/browser/renderer_host/render_widget_host_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -992,6 +992,8 @@ class CONTENT_EXPORT RenderWidgetHostImpl
ShorterDelayInputEventAckTimeout);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
AddAndRemoveInputEventObserver);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
ScopedObservationWithInputEventObserver);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
AddAndRemoveImeInputEventObserver);
FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest,
Expand Down
31 changes: 31 additions & 0 deletions content/browser/renderer_host/render_widget_host_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2351,6 +2351,37 @@ TEST_F(RenderWidgetHostTest, AddAndRemoveInputEventObserver) {
&event_latency_metadata);
}

TEST_F(RenderWidgetHostTest, ScopedObservationWithInputEventObserver) {
// Verify that the specialization of `ScopedObserverationTraits` correctly
// adds and removes InputEventObservers.
MockInputEventObserver observer;
base::ScopedObservation<RenderWidgetHost,
RenderWidgetHost::InputEventObserver>
scoped_observation(&observer);

// Add InputEventObserver.
scoped_observation.Observe(host_.get());

// Confirm OnInputEvent is triggered.
NativeWebKeyboardEvent native_event(WebInputEvent::Type::kChar, 0,
GetNextSimulatedEventTime());
ui::LatencyInfo latency_info = ui::LatencyInfo();
ui::EventLatencyMetadata event_latency_metadata;
EXPECT_CALL(observer, OnInputEvent(_)).Times(1);
host_->DispatchInputEventWithLatencyInfo(native_event, &latency_info,
&event_latency_metadata);

// Remove InputEventObserver.
scoped_observation.Reset();

// Confirm InputEventObserver is removed.
EXPECT_CALL(observer, OnInputEvent(_)).Times(0);
latency_info = ui::LatencyInfo();
event_latency_metadata = ui::EventLatencyMetadata();
host_->DispatchInputEventWithLatencyInfo(native_event, &latency_info,
&event_latency_metadata);
}

#if BUILDFLAG(IS_ANDROID)
TEST_F(RenderWidgetHostTest, AddAndRemoveImeInputEventObserver) {
MockInputEventObserver observer;
Expand Down
18 changes: 18 additions & 0 deletions content/public/browser/render_widget_host.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include "base/functional/callback.h"
#include "base/i18n/rtl.h"
#include "base/scoped_observation_traits.h"
#include "build/build_config.h"
#include "content/common/content_export.h"
#include "content/public/common/drop_data.h"
Expand Down Expand Up @@ -344,4 +345,21 @@ class CONTENT_EXPORT RenderWidgetHost {

} // namespace content

namespace base {
template <>
struct ScopedObservationTraits<content::RenderWidgetHost,
content::RenderWidgetHost::InputEventObserver> {
static void AddObserver(
content::RenderWidgetHost* rwh,
content::RenderWidgetHost::InputEventObserver* observer) {
rwh->AddInputEventObserver(observer);
}
static void RemoveObserver(
content::RenderWidgetHost* rwh,
content::RenderWidgetHost::InputEventObserver* observer) {
rwh->RemoveInputEventObserver(observer);
}
};
} // namespace base

#endif // CONTENT_PUBLIC_BROWSER_RENDER_WIDGET_HOST_H_

0 comments on commit 2eaedee

Please sign in to comment.