Commit 63da8e09 authored by bokan@chromium.org's avatar bokan@chromium.org

Updated hover media feature to comply updated media queries spec

The spec (http://dev.w3.org/csswg/mediaqueries-4/#hover)  for the hover
media query has added keywords for the feature's value. This CL updates
the media query keywords to propertly parse and evaluate the feature;
however, it remains only sparsely implemented. The hover (and pointer)
media queries currently only produce non-false output for touchscreen
devices. The plumbing work to actually produce the correct results in
all cases will be done in a future CL.

BUG=136119

Review URL: https://codereview.chromium.org/451113002

git-svn-id: svn://svn.chromium.org/blink/trunk@180006 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 1aecadaa
......@@ -9,8 +9,9 @@ Query "(pointer:coARse)": false
Query "(pointer:bogusvalue)": false
Query "(pointer:fine)": false
Query "(hover)": false
Query "(hover:0)": false
Query "(hover:1)": false
Query "(hover:none)": false
Query "(hover:hover)": false
Query "(hover:on-demand)": false
Query "(hover:bogusvalue)": false
------------- with touch screen -------------
Query "(pointer)": true
......@@ -20,8 +21,9 @@ Query "(pointer:coarse)": true
Query "(pointer:coARse)": true
Query "(pointer:bogusvalue)": false
Query "(pointer:fine)": false
Query "(hover)": false
Query "(hover:0)": true
Query "(hover:1)": false
Query "(hover)": true
Query "(hover:none)": false
Query "(hover:hover)": false
Query "(hover:on-demand)": true
Query "(hover:bogusvalue)": false
......@@ -23,8 +23,9 @@
"(pointer:bogusvalue)",
"(pointer:fine)",
"(hover)",
"(hover:0)",
"(hover:1)",
"(hover:none)",
"(hover:hover)",
"(hover:on-demand)",
"(hover:bogusvalue)" ];
for (var index=0; index < queries.length; index++) {
log("Query &quot;" + queries[index] + "&quot: " +
......
......@@ -891,6 +891,11 @@ alphabetic
coarse
fine
// (hover:) media feature
// none
on-demand
hover
// blend modes
// normal
multiply
......
......@@ -53,6 +53,7 @@
#include "core/rendering/compositing/RenderLayerCompositor.h"
#include "core/rendering/style/RenderStyle.h"
#include "platform/PlatformScreen.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "platform/geometry/FloatRect.h"
#include "wtf/HashMap.h"
......@@ -527,15 +528,28 @@ static bool hoverMediaFeatureEval(const MediaQueryExpValue& value, MediaFeatureP
if (pointer == MediaValues::UnknownPointer)
return false;
float number = 1;
if (value.isValid()) {
if (!numberValue(value, number))
// FIXME: Remove the old code once we're sure this doesn't break anything significant.
if (RuntimeEnabledFeatures::hoverMediaQueryKeywordsEnabled()) {
if (!value.isValid())
return pointer != MediaValues::NoPointer;
if (!value.isID)
return false;
}
return (pointer == MediaValues::NoPointer && !number)
|| (pointer == MediaValues::TouchPointer && !number)
|| (pointer == MediaValues::MousePointer && number == 1);
return (pointer == MediaValues::NoPointer && value.id == CSSValueNone)
|| (pointer == MediaValues::TouchPointer && value.id == CSSValueOnDemand)
|| (pointer == MediaValues::MousePointer && value.id == CSSValueHover);
} else {
float number = 1;
if (value.isValid()) {
if (!numberValue(value, number))
return false;
}
return (pointer == MediaValues::NoPointer && !number)
|| (pointer == MediaValues::TouchPointer && !number)
|| (pointer == MediaValues::MousePointer && number == 1);
}
}
static bool pointerMediaFeatureEval(const MediaQueryExpValue& value, MediaFeaturePrefix, const MediaValues& mediaValues)
......
......@@ -44,8 +44,9 @@ TestCase screenTestCases[] = {
{"tv and (scan: progressive)", 0},
{"(pointer: coarse)", 0},
{"(pointer: fine)", 1},
{"(hover: 1)", 1},
{"(hover: 0)", 0},
{"(hover: hover)", 1},
{"(hover: on-demand)", 0},
{"(hover: none)", 0},
{0, 0} // Do not remove the terminator line.
};
......
......@@ -35,6 +35,7 @@
#include "core/css/CSSPrimitiveValue.h"
#include "core/html/parser/HTMLParserIdioms.h"
#include "platform/Decimal.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "wtf/text/StringBuffer.h"
#include "wtf/text/StringBuilder.h"
......@@ -49,6 +50,7 @@ static inline bool featureWithCSSValueID(const String& mediaFeature, const CSSPa
return mediaFeature == orientationMediaFeature
|| mediaFeature == pointerMediaFeature
|| (mediaFeature == hoverMediaFeature && RuntimeEnabledFeatures::hoverMediaQueryKeywordsEnabled())
|| mediaFeature == scanMediaFeature;
}
......@@ -60,6 +62,9 @@ static inline bool featureWithValidIdent(const String& mediaFeature, CSSValueID
if (mediaFeature == pointerMediaFeature)
return ident == CSSValueNone || ident == CSSValueCoarse || ident == CSSValueFine;
if (mediaFeature == hoverMediaFeature && RuntimeEnabledFeatures::hoverMediaQueryKeywordsEnabled())
return ident == CSSValueNone || ident == CSSValueOnDemand || ident == CSSValueHover;
if (mediaFeature == scanMediaFeature)
return ident == CSSValueInterlace || ident == CSSValueProgressive;
......@@ -148,7 +153,7 @@ static inline bool featureWithZeroOrOne(const String& mediaFeature, const CSSPar
return false;
return mediaFeature == gridMediaFeature
|| mediaFeature == hoverMediaFeature;
|| (mediaFeature == hoverMediaFeature && !RuntimeEnabledFeatures::hoverMediaQueryKeywordsEnabled());
}
static inline bool featureWithAspectRatio(const String& mediaFeature)
......
......@@ -141,6 +141,9 @@ TargetedStyleRecalc status=stable
// touchscreen) in ApplyWebPreferences.
Touch status=stable
// Temporary setting to allow easy rollback of change to hover media feature.
HoverMediaQueryKeywords status=stable
TouchIconLoading
ThreadedParserDataReceiver status=experimental
UserSelectAll status=experimental
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment