diff --git a/dom/events/EventListenerManager.cpp b/dom/events/EventListenerManager.cpp index f708c3a5bc8d..f41c5c4cc167 100644 --- a/dom/events/EventListenerManager.cpp +++ b/dom/events/EventListenerManager.cpp @@ -686,6 +686,21 @@ EventListenerManager::ListenerCanHandle(const Listener* aListener, return aListener->mEventMessage == aEventMessage; } +static bool +DefaultToPassiveTouchListeners() +{ + static bool sDefaultToPassiveTouchListeners = false; + static bool sIsPrefCached = false; + + if (!sIsPrefCached) { + sIsPrefCached = true; + Preferences::AddBoolVarCache(&sDefaultToPassiveTouchListeners, + "dom.event.default_to_passive_touch_listeners"); + } + + return sDefaultToPassiveTouchListeners; +} + void EventListenerManager::AddEventListenerByType( EventListenerHolder aListenerHolder, @@ -702,7 +717,8 @@ EventListenerManager::AddEventListenerByType( EventListenerFlags flags = aFlags; if (aPassive.WasPassed()) { flags.mPassive = aPassive.Value(); - } else if (message == eTouchStart || message == eTouchMove) { + } else if ((message == eTouchStart || message == eTouchMove) && + mIsMainThreadELM && DefaultToPassiveTouchListeners()) { nsCOMPtr node; nsCOMPtr win; if ((win = GetTargetAsInnerWindow()) || diff --git a/gfx/layers/apz/test/mochitest/test_group_touchevents.html b/gfx/layers/apz/test/mochitest/test_group_touchevents.html index 781a5afe20c4..2dc9cdad8e65 100644 --- a/gfx/layers/apz/test/mochitest/test_group_touchevents.html +++ b/gfx/layers/apz/test/mochitest/test_group_touchevents.html @@ -76,7 +76,8 @@ var subtests = [ ["apz.test.fails_with_native_injection", isWindows]]}, {'file': 'helper_tap_default_passive.html', 'prefs': [["apz.content_response_timeout", 24 * 60 * 60 * 1000], - ["apz.test.fails_with_native_injection", isWindows]]}, + ["apz.test.fails_with_native_injection", isWindows], + ["dom.event.default_to_passive_touch_listeners", true]]}, // Simple test to exercise touch-action CSS property {'file': 'helper_touch_action.html', 'prefs': touch_action_prefs}, diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 9546bf55914b..d0e2cbae95ad 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -5917,3 +5917,7 @@ pref("layers.omtp.dump-capture", false); // a content to view. This is mostly intended to prevent infinite // loops with faulty converters involved. pref("general.document_open_conversion_depth_limit", 20); + +// If true, touchstart and touchmove listeners on window, document, +// documentElement and document.body are passive by default. +pref("dom.event.default_to_passive_touch_listeners", false);