diff options
author | dtapuska <dtapuska@chromium.org> | 2016-02-11 16:15:32 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-12 00:16:30 +0000 |
commit | 364349a3c0f701a0397ef5ffaaf948ad037fb369 (patch) | |
tree | e4af8cac4eca20fdbbf4d1a303922e6eff0ca49e | |
parent | 16febb404edc59fb8dbb13a13c68ccecfb5a0bf1 (diff) | |
download | chromium_src-364349a3c0f701a0397ef5ffaaf948ad037fb369.zip chromium_src-364349a3c0f701a0397ef5ffaaf948ad037fb369.tar.gz chromium_src-364349a3c0f701a0397ef5ffaaf948ad037fb369.tar.bz2 |
Add knowledge about blocking and passive event listeners.
Originally we though we could just get away with assuming blocking
represented blocking and passive. But it is the case when there
are touch event listeners that aren't hit we must fire touch events
to the main thread which aren't really necessarily.
Change this to be an enumeration of kBlockingAndPassive.
BUG=489802
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1686833002
Cr-Commit-Position: refs/heads/master@{#375054}
7 files changed, 28 insertions, 5 deletions
diff --git a/cc/input/event_listener_properties.h b/cc/input/event_listener_properties.h index 2755c6e..6b9141d 100644 --- a/cc/input/event_listener_properties.h +++ b/cc/input/event_listener_properties.h @@ -9,7 +9,13 @@ namespace cc { enum class EventListenerClass { kTouch, kMouseWheel, kNumClasses }; -enum class EventListenerProperties { kNone, kPassive, kBlocking, kMax }; +enum class EventListenerProperties { + kNone, + kPassive, + kBlocking, + kBlockingAndPassive, + kMax +}; } // namespace cc diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc index 804aa66..69ade49 100644 --- a/cc/layers/layer_impl.cc +++ b/cc/layers/layer_impl.cc @@ -544,6 +544,7 @@ InputHandler::ScrollStatus LayerImpl::TryScroll( layer_tree_impl_->event_listener_properties( EventListenerClass::kMouseWheel); if (event_properties == EventListenerProperties::kBlocking || + event_properties == EventListenerProperties::kBlockingAndPassive || (!layer_tree_impl_->settings().use_mouse_wheel_gestures && event_properties == EventListenerProperties::kPassive)) { TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 2ec30fa..f2da25e 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc @@ -740,6 +740,15 @@ TEST_F(LayerTreeHostImplTest, ScrollBlocksOnWheelEventHandlers) { EXPECT_EQ(MainThreadScrollingReason::kEventHandlers, status.main_thread_scrolling_reasons); + host_impl_->active_tree()->set_event_listener_properties( + EventListenerClass::kMouseWheel, + EventListenerProperties::kBlockingAndPassive); + status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), + InputHandler::WHEEL); + EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); + EXPECT_EQ(MainThreadScrollingReason::kEventHandlers, + status.main_thread_scrolling_reasons); + // But gesture scrolls can still be handled. status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), InputHandler::GESTURE); diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc index 64e1c8f..66a8d40 100644 --- a/content/renderer/gpu/render_widget_compositor.cc +++ b/content/renderer/gpu/render_widget_compositor.cc @@ -762,6 +762,10 @@ static_assert(static_cast<cc::EventListenerProperties>( blink::WebEventListenerProperties::Blocking) == cc::EventListenerProperties::kBlocking, "EventListener and WebEventListener enums must match"); +static_assert(static_cast<cc::EventListenerProperties>( + blink::WebEventListenerProperties::BlockingAndPassive) == + cc::EventListenerProperties::kBlockingAndPassive, + "EventListener and WebEventListener enums must match"); void RenderWidgetCompositor::setEventListenerProperties( blink::WebEventListenerClass eventClass, diff --git a/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp b/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp index b889e6c..1e8a73b 100644 --- a/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp +++ b/third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp @@ -40,6 +40,8 @@ inline bool isPointerEventType(const AtomicString& eventType) WebEventListenerProperties webEventListenerProperties(bool hasBlocking, bool hasPassive) { + if (hasBlocking && hasPassive) + return WebEventListenerProperties::BlockingAndPassive; if (hasBlocking) return WebEventListenerProperties::Blocking; if (hasPassive) diff --git a/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp b/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp index e113df1..0a7698d 100644 --- a/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp +++ b/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp @@ -331,7 +331,7 @@ TEST_F(ScrollingCoordinatorTest, touchEventHandlerBoth) navigateTo(m_baseURL + "touch-event-handler-both.html"); forceFullCompositingUpdate(); - ASSERT_EQ(WebEventListenerProperties::Blocking, webLayerTreeView()->eventListenerProperties(WebEventListenerClass::Touch)); + ASSERT_EQ(WebEventListenerProperties::BlockingAndPassive, webLayerTreeView()->eventListenerProperties(WebEventListenerClass::Touch)); } TEST_F(ScrollingCoordinatorTest, wheelEventHandler) @@ -358,7 +358,7 @@ TEST_F(ScrollingCoordinatorTest, wheelEventHandlerBoth) navigateTo(m_baseURL + "wheel-event-handler-both.html"); forceFullCompositingUpdate(); - ASSERT_EQ(WebEventListenerProperties::Blocking, webLayerTreeView()->eventListenerProperties(WebEventListenerClass::MouseWheel)); + ASSERT_EQ(WebEventListenerProperties::BlockingAndPassive, webLayerTreeView()->eventListenerProperties(WebEventListenerClass::MouseWheel)); } TEST_F(ScrollingCoordinatorTest, scrollEventHandler) diff --git a/third_party/WebKit/public/platform/WebEventListenerProperties.h b/third_party/WebKit/public/platform/WebEventListenerProperties.h index 56ec72f..1b2d9a0 100644 --- a/third_party/WebKit/public/platform/WebEventListenerProperties.h +++ b/third_party/WebKit/public/platform/WebEventListenerProperties.h @@ -17,8 +17,9 @@ enum class WebEventListenerClass { // Indicates the variety of event listener types for a given WebEventListenerClass. enum class WebEventListenerProperties { Nothing, // This should be "None"; but None #defined in X11's X.h - Passive, - Blocking, // This indicates >= 1 blocking listener (and >= 0 passive listeners) + Passive, // This indicates solely passive listeners. + Blocking, // This indicates solely blocking listeners. + BlockingAndPassive, // This indicates >= 1 blocking listener and >= 1 passive listeners. }; } // namespace blink |