summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordtapuska <dtapuska@chromium.org>2016-02-11 16:15:32 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-12 00:16:30 +0000
commit364349a3c0f701a0397ef5ffaaf948ad037fb369 (patch)
treee4af8cac4eca20fdbbf4d1a303922e6eff0ca49e
parent16febb404edc59fb8dbb13a13c68ccecfb5a0bf1 (diff)
downloadchromium_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}
-rw-r--r--cc/input/event_listener_properties.h8
-rw-r--r--cc/layers/layer_impl.cc1
-rw-r--r--cc/trees/layer_tree_host_impl_unittest.cc9
-rw-r--r--content/renderer/gpu/render_widget_compositor.cc4
-rw-r--r--third_party/WebKit/Source/core/frame/EventHandlerRegistry.cpp2
-rw-r--r--third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp4
-rw-r--r--third_party/WebKit/public/platform/WebEventListenerProperties.h5
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