Changeset 207173 in webkit


Ignore:
Timestamp:
Oct 11, 2016 3:45:22 PM (8 years ago)
Author:
dino@apple.com
Message:

Implement prefers-reduced-motion media query
https://bugs.webkit.org/show_bug.cgi?id=163250
<rdar://problem/28704129>

Reviewed by Simon Fraser.

Source/WebCore:

Implement the prefers-reduced-motion media query, as
described in https://github.com/w3c/csswg-drafts/issues/442.

Tests: fast/media/mq-prefers-reduced-motion-forced-value.html

fast/media/mq-prefers-reduced-motion.html

  • Configurations/WebCoreTestSupport.xcconfig: Link against AppKit and UIKit.
  • css/CSSValueKeywords.in: New keyword for "reduce".
  • css/MediaFeatureNames.h: Add prefers-reduced-motion.
  • css/MediaQueryEvaluator.cpp:

(WebCore::prefersReducedMotionEvaluate):

  • css/MediaQueryExp.cpp:

(WebCore::featureWithValidIdent):
(WebCore::isFeatureValidWithoutValue):

  • platform/Theme.h: New API to detect the system accessibility settings.

(WebCore::Theme::userPrefersReducedMotion):

  • platform/ios/ThemeIOS.h:
  • platform/ios/ThemeIOS.mm:

(WebCore::ThemeIOS::userPrefersReducedMotion):

  • platform/mac/ThemeMac.h:
  • platform/mac/ThemeMac.mm:

(WebCore::ThemeMac::userPrefersReducedMotion):

  • testing/Internals.cpp: Expose the same API to internals, so that

a test can examine the value too.
(WebCore::Internals::userPrefersReducedMotion):

  • testing/Internals.h:
  • testing/Internals.idl:
  • testing/Internals.mm:

(WebCore::Internals::userPrefersReducedMotion):

  • page/Settings.h: New setting to override the system value...
  • page/Settings.in:
  • testing/InternalSettings.cpp: ... plumbed through internals.

(WebCore::InternalSettings::Backup::Backup):
(WebCore::InternalSettings::Backup::restoreTo):
(WebCore::InternalSettings::forcedPrefersReducedMotionValue):
(WebCore::InternalSettings::setForcedPrefersReducedMotionValue):

  • testing/InternalSettings.h:
  • testing/InternalSettings.idl:
  • testing/Internals.cpp:

(WebCore::Internals::userPrefersReducedMotion):

  • testing/Internals.h:
  • testing/Internals.idl:
  • testing/Internals.mm:

(WebCore::Internals::userPrefersReducedMotion):

LayoutTests:

One test checks the system value. The other test overrides
the system values to make sure as much as possible is working.

  • fast/media/mq-prefers-reduced-motion-expected.html: Added.
  • fast/media/mq-prefers-reduced-motion-forced-value-expected.html: Added.
  • fast/media/mq-prefers-reduced-motion-forced-value.html: Added.
  • fast/media/mq-prefers-reduced-motion.html: Added.
Location:
trunk
Files:
4 added
21 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r207172 r207173  
     12016-10-11  Dean Jackson  <dino@apple.com>
     2
     3        Implement prefers-reduced-motion media query
     4        https://bugs.webkit.org/show_bug.cgi?id=163250
     5        <rdar://problem/28704129>
     6
     7        Reviewed by Simon Fraser.
     8
     9        One test checks the system value. The other test overrides
     10        the system values to make sure as much as possible is working.
     11
     12        * fast/media/mq-prefers-reduced-motion-expected.html: Added.
     13        * fast/media/mq-prefers-reduced-motion-forced-value-expected.html: Added.
     14        * fast/media/mq-prefers-reduced-motion-forced-value.html: Added.
     15        * fast/media/mq-prefers-reduced-motion.html: Added.
     16
    1172016-10-11  Ryan Haddad  <ryanhaddad@apple.com>
    218
  • trunk/Source/WebCore/ChangeLog

    r207170 r207173  
     12016-10-11  Dean Jackson  <dino@apple.com>
     2
     3        Implement prefers-reduced-motion media query
     4        https://bugs.webkit.org/show_bug.cgi?id=163250
     5        <rdar://problem/28704129>
     6
     7        Reviewed by Simon Fraser.
     8
     9        Implement the prefers-reduced-motion media query, as
     10        described in https://github.com/w3c/csswg-drafts/issues/442.
     11
     12        Tests: fast/media/mq-prefers-reduced-motion-forced-value.html
     13               fast/media/mq-prefers-reduced-motion.html
     14
     15        * Configurations/WebCoreTestSupport.xcconfig: Link against AppKit and UIKit.
     16
     17        * css/CSSValueKeywords.in: New keyword for "reduce".
     18
     19        * css/MediaFeatureNames.h: Add prefers-reduced-motion.
     20        * css/MediaQueryEvaluator.cpp:
     21        (WebCore::prefersReducedMotionEvaluate):
     22        * css/MediaQueryExp.cpp:
     23        (WebCore::featureWithValidIdent):
     24        (WebCore::isFeatureValidWithoutValue):
     25
     26        * platform/Theme.h: New API to detect the system accessibility settings.
     27        (WebCore::Theme::userPrefersReducedMotion):
     28        * platform/ios/ThemeIOS.h:
     29        * platform/ios/ThemeIOS.mm:
     30        (WebCore::ThemeIOS::userPrefersReducedMotion):
     31        * platform/mac/ThemeMac.h:
     32        * platform/mac/ThemeMac.mm:
     33        (WebCore::ThemeMac::userPrefersReducedMotion):
     34
     35        * testing/Internals.cpp: Expose the same API to internals, so that
     36        a test can examine the value too.
     37        (WebCore::Internals::userPrefersReducedMotion):
     38        * testing/Internals.h:
     39        * testing/Internals.idl:
     40        * testing/Internals.mm:
     41        (WebCore::Internals::userPrefersReducedMotion):
     42
     43        * page/Settings.h: New setting to override the system value...
     44        * page/Settings.in:
     45
     46        * testing/InternalSettings.cpp: ... plumbed through internals.
     47        (WebCore::InternalSettings::Backup::Backup):
     48        (WebCore::InternalSettings::Backup::restoreTo):
     49        (WebCore::InternalSettings::forcedPrefersReducedMotionValue):
     50        (WebCore::InternalSettings::setForcedPrefersReducedMotionValue):
     51        * testing/InternalSettings.h:
     52        * testing/InternalSettings.idl:
     53        * testing/Internals.cpp:
     54        (WebCore::Internals::userPrefersReducedMotion):
     55        * testing/Internals.h:
     56        * testing/Internals.idl:
     57        * testing/Internals.mm:
     58        (WebCore::Internals::userPrefersReducedMotion):
     59
     60
    1612016-10-10  Ryosuke Niwa  <rniwa@webkit.org>
    262
  • trunk/Source/WebCore/Configurations/WebCoreTestSupport.xcconfig

    r204879 r207173  
    5050GCC_SYMBOLS_PRIVATE_EXTERN = YES;
    5151OTHER_LDFLAGS = $(ASAN_OTHER_LDFLAGS);
    52 OTHER_LDFLAGS[sdk=iphoneos*] = $(ASAN_OTHER_LDFLAGS) -lAccessibility -F$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/PhonyWebKitLegacy;
    53 OTHER_LDFLAGS[sdk=iphonesimulator*] = $(ASAN_OTHER_LDFLAGS) -lAccessibility -F$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/PhonyWebKitLegacy;
     52OTHER_LDFLAGS[sdk=macos*] = $(ASAN_OTHER_LDFLAGS) -framework AppKit;
     53OTHER_LDFLAGS[sdk=iphoneos*] = $(ASAN_OTHER_LDFLAGS) -framework UIKit -lAccessibility -F$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/PhonyWebKitLegacy;
     54OTHER_LDFLAGS[sdk=iphonesimulator*] = $(ASAN_OTHER_LDFLAGS) -framework UIKit -lAccessibility -F$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/PhonyWebKitLegacy;
    5455SECT_ORDER_FLAGS = ;
  • trunk/Source/WebCore/css/CSSValueKeywords.in

    r206181 r207173  
    13051305rec2020
    13061306
     1307// prefers-reduced-motion
     1308reduce
     1309
    13071310#if defined(ENABLE_CSS_GRID_LAYOUT) && ENABLE_CSS_GRID_LAYOUT
    13081311// auto-repeat
  • trunk/Source/WebCore/css/MediaFeatureNames.h

    r201441 r207173  
    7070    macro(orientation, "orientation") \
    7171    macro(pointer, "pointer") \
     72    macro(prefersReducedMotion, "prefers-reduced-motion") \
    7273    macro(resolution, "resolution") \
    7374    macro(transform2d, "-webkit-transform-2d") \
  • trunk/Source/WebCore/css/MediaQueryEvaluator.cpp

    r205905 r207173  
    5050#include "Settings.h"
    5151#include "StyleResolver.h"
     52#include "Theme.h"
    5253#include <wtf/HashMap.h>
    5354
     
    656657}
    657658
     659static bool prefersReducedMotionEvaluate(CSSValue* value, const CSSToLengthConversionData&, Frame& frame, MediaFeaturePrefix)
     660{
     661#if USE(NEW_THEME)
     662    bool userPrefersReducedMotion = platformTheme()->userPrefersReducedMotion();
     663#else
     664    bool userPrefersReducedMotion = false;
     665#endif
     666
     667    if (frame.settings().forcedPrefersReducedMotionValue() == Settings::ForcedPrefersReducedMotionValue::On)
     668        userPrefersReducedMotion = true;
     669    else if (frame.settings().forcedPrefersReducedMotionValue() == Settings::ForcedPrefersReducedMotionValue::Off)
     670        userPrefersReducedMotion = false;
     671
     672    if (!value)
     673        return userPrefersReducedMotion;
     674
     675    return downcast<CSSPrimitiveValue>(*value).getValueID() == (userPrefersReducedMotion ? CSSValueReduce : CSSValueDefault);
     676}
     677
    658678// Use this function instead of calling add directly to avoid inlining.
    659679static void add(MediaQueryFunctionMap& map, AtomicStringImpl* key, MediaQueryFunction value)
  • trunk/Source/WebCore/css/MediaQueryExp.cpp

    r205368 r207173  
    5151    || mediaFeature == MediaFeatureNames::hover
    5252    || mediaFeature == MediaFeatureNames::invertedColors
    53     || mediaFeature == MediaFeatureNames::pointer;
    54 }
    55    
     53    || mediaFeature == MediaFeatureNames::pointer
     54    || mediaFeature == MediaFeatureNames::prefersReducedMotion;
     55}
     56
    5657static inline bool featureWithValidDensity(const String& mediaFeature, const CSSParserToken& token)
    5758{
     
    229230#endif
    230231        || mediaFeature == MediaFeatureNames::pointer
     232        || mediaFeature == MediaFeatureNames::prefersReducedMotion
    231233        || mediaFeature == MediaFeatureNames::devicePixelRatio
    232234        || mediaFeature == MediaFeatureNames::resolution
  • trunk/Source/WebCore/page/Settings.h

    r206811 r207173  
    9999    void pageDestroyed() { m_page = nullptr; }
    100100
     101    enum class ForcedPrefersReducedMotionValue { System, On, Off };
     102    static const Settings::ForcedPrefersReducedMotionValue defaultForcedPrefersReducedMotionValue = ForcedPrefersReducedMotionValue::System;
     103
    101104    WEBCORE_EXPORT void setStandardFontFamily(const AtomicString&, UScriptCode = USCRIPT_COMMON);
    102105    WEBCORE_EXPORT const AtomicString& standardFontFamily(UScriptCode = USCRIPT_COMMON) const;
  • trunk/Source/WebCore/page/Settings.in

    r207159 r207173  
    284284quickTimePluginReplacementEnabled initial=defaultQuickTimePluginReplacementEnabled
    285285youTubeFlashPluginReplacementEnabled initial=defaultYouTubeFlashPluginReplacementEnabled
     286
     287forcedPrefersReducedMotionValue type=ForcedPrefersReducedMotionValue, initial=defaultForcedPrefersReducedMotionValue
  • trunk/Source/WebCore/platform/Theme.h

    r189830 r207173  
    111111    virtual void drawNamedImage(const String&, GraphicsContext&, const FloatRect&) const;
    112112
     113    virtual bool userPrefersReducedMotion() const { return false; }
     114
    113115    // This method is called once, from RenderTheme::adjustDefaultStyleSheet(), to let each platform adjust
    114116    // the default CSS rules in html.css.
  • trunk/Source/WebCore/platform/ios/ThemeIOS.h

    r185731 r207173  
    3535    ThemeIOS() { }
    3636    virtual ~ThemeIOS() { }
     37
     38    bool userPrefersReducedMotion() const override;
    3739};
    3840
  • trunk/Source/WebCore/platform/ios/ThemeIOS.mm

    r161589 r207173  
    2929#import "GraphicsContext.h"
    3030#import "ScrollView.h"
     31#import "SoftLinking.h"
    3132#include <wtf/NeverDestroyed.h>
    3233#include <wtf/StdLibExtras.h>
     34
     35SOFT_LINK_FRAMEWORK(UIKit)
     36SOFT_LINK(UIKit, UIAccessibilityIsReduceMotionEnabled, BOOL, (void), ())
    3337
    3438using namespace std;
     
    4448}
    4549
     50bool ThemeIOS::userPrefersReducedMotion() const
     51{
     52    return UIAccessibilityIsReduceMotionEnabled();
    4653}
     54
     55}
  • trunk/Source/WebCore/platform/mac/ThemeMac.h

    r197563 r207173  
    5656    void inflateControlPaintRect(ControlPart, const ControlStates&, FloatRect&, float zoomFactor) const override;
    5757
     58    bool userPrefersReducedMotion() const override;
     59
    5860    // FIXME: Once RenderThemeMac is converted over to use Theme then this can be internal to ThemeMac.
    5961    static NSView* ensuredView(ScrollView*, const ControlStates&, bool useUnparentedView = false);
  • trunk/Source/WebCore/platform/mac/ThemeMac.mm

    r202927 r207173  
    871871}
    872872
    873 }
     873bool ThemeMac::userPrefersReducedMotion() const
     874{
     875#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200
     876    return [[NSWorkspace sharedWorkspace] accessibilityDisplayShouldReduceMotion];
     877#else
     878    return false;
     879#endif
     880}
     881
     882}
  • trunk/Source/WebCore/testing/InternalSettings.cpp

    r206843 r207173  
    116116    , m_systemLayoutDirection(settings.systemLayoutDirection())
    117117    , m_pdfImageCachingPolicy(settings.pdfImageCachingPolicy())
     118    , m_forcedPrefersReducedMotionValue(settings.forcedPrefersReducedMotionValue())
    118119{
    119120}
     
    195196    settings.setSystemLayoutDirection(m_systemLayoutDirection);
    196197    settings.setPdfImageCachingPolicy(m_pdfImageCachingPolicy);
     198    settings.setForcedPrefersReducedMotionValue(m_forcedPrefersReducedMotionValue);
    197199    Settings::setAllowsAnySSLCertificate(false);
    198200}
     
    680682}
    681683
     684InternalSettings::ForcedPrefersReducedMotionValue InternalSettings::forcedPrefersReducedMotionValue() const
     685{
     686    switch (settings()->forcedPrefersReducedMotionValue()) {
     687    case Settings::ForcedPrefersReducedMotionValue::System:
     688        return InternalSettings::ForcedPrefersReducedMotionValue::System;
     689    case Settings::ForcedPrefersReducedMotionValue::On:
     690        return InternalSettings::ForcedPrefersReducedMotionValue::On;
     691    case Settings::ForcedPrefersReducedMotionValue::Off:
     692        return InternalSettings::ForcedPrefersReducedMotionValue::Off;
     693    }
     694}
     695
     696void InternalSettings::setForcedPrefersReducedMotionValue(InternalSettings::ForcedPrefersReducedMotionValue value)
     697{
     698    switch (value) {
     699    case InternalSettings::ForcedPrefersReducedMotionValue::System:
     700        settings()->setForcedPrefersReducedMotionValue(Settings::ForcedPrefersReducedMotionValue::System);
     701        break;
     702    case InternalSettings::ForcedPrefersReducedMotionValue::On:
     703        settings()->setForcedPrefersReducedMotionValue(Settings::ForcedPrefersReducedMotionValue::On);
     704        break;
     705    case InternalSettings::ForcedPrefersReducedMotionValue::Off:
     706        settings()->setForcedPrefersReducedMotionValue(Settings::ForcedPrefersReducedMotionValue::Off);
     707        break;
     708    }
     709}
     710
    682711// If you add to this list, make sure that you update the Backup class for test reproducability!
    683712
  • trunk/Source/WebCore/testing/InternalSettings.h

    r206843 r207173  
    116116        TextDirection m_systemLayoutDirection;
    117117        PDFImageCachingPolicy m_pdfImageCachingPolicy;
     118        Settings::ForcedPrefersReducedMotionValue m_forcedPrefersReducedMotionValue;
    118119    };
    119120
     
    175176    void setVariationFontsEnabled(bool, ExceptionCode&);
    176177
     178    enum class ForcedPrefersReducedMotionValue { System, On, Off };
     179    ForcedPrefersReducedMotionValue forcedPrefersReducedMotionValue() const;
     180    void setForcedPrefersReducedMotionValue(ForcedPrefersReducedMotionValue);
     181
    177182    static void setAllowsAnySSLCertificate(bool);
    178183
  • trunk/Source/WebCore/testing/InternalSettings.idl

    r207150 r207173  
    2424 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2525 */
     26
     27enum ForcedPrefersReducedMotionValue { "system", "on", "off" };
    2628
    2729[
     
    9092    [MayThrowLegacyException] void setVariationFontsEnabled(boolean enabled);
    9193
     94    attribute ForcedPrefersReducedMotionValue forcedPrefersReducedMotionValue;
     95
    9296    void setInputEventsEnabled(boolean enabled);
    9397};
  • trunk/Source/WebCore/testing/Internals.cpp

    r207005 r207173  
    33793379}
    33803380
     3381#if !PLATFORM(COCOA)
     3382bool Internals::userPrefersReducedMotion() const
     3383{
     3384    return false;
     3385}
     3386#endif
     3387
    33813388} // namespace WebCore
  • trunk/Source/WebCore/testing/Internals.h

    r206856 r207173  
    496496    void setUserInterfaceLayoutDirection(UserInterfaceLayoutDirection);
    497497
     498    bool userPrefersReducedMotion() const;
     499
    498500private:
    499501    explicit Internals(Document&);
  • trunk/Source/WebCore/testing/Internals.idl

    r206856 r207173  
    467467
    468468    void setUserInterfaceLayoutDirection(UserInterfaceLayoutDirection userInterfaceLayoutDirection);
    469 };
     469
     470    boolean userPrefersReducedMotion();
     471};
  • trunk/Source/WebCore/testing/Internals.mm

    r199539 r207173  
    3333#include "Frame.h"
    3434
     35#if PLATFORM(IOS)
     36#import <UIKit/UIKit.h>
     37#endif
     38
    3539namespace WebCore {
    3640
     
    4044}
    4145
     46#if PLATFORM(COCOA)
     47bool Internals::userPrefersReducedMotion() const
     48{
     49#if PLATFORM(IOS)
     50    return UIAccessibilityIsReduceMotionEnabled();
     51#elif PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200
     52    return [[NSWorkspace sharedWorkspace] accessibilityDisplayShouldReduceMotion];
     53#else
     54    return false;
     55#endif
    4256}
     57#endif
     58
     59}
Note: See TracChangeset for help on using the changeset viewer.