| Index: Source/core/css/MediaList.cpp
|
| diff --git a/Source/core/css/MediaList.cpp b/Source/core/css/MediaList.cpp
|
| index ebaa05ba9a9db25a3e98523954e854e13f573e22..9ce772ff9740d40184f407813df0074840b65229 100644
|
| --- a/Source/core/css/MediaList.cpp
|
| +++ b/Source/core/css/MediaList.cpp
|
| @@ -120,68 +120,60 @@ static String parseMediaDescriptor(const String& string)
|
| return string.left(i);
|
| }
|
|
|
| -bool MediaQuerySet::parse(const String& mediaString)
|
| +PassOwnPtr<MediaQuery> MediaQuerySet::parseMediaQuery(const String& queryString)
|
| {
|
| CSSParser parser(CSSStrictMode);
|
| + OwnPtr<MediaQuery> parsedQuery = parser.parseMediaQuery(queryString);
|
| +
|
| + if (parsedQuery)
|
| + return parsedQuery.release();
|
| +
|
| + if (m_fallbackToDescriptor) {
|
| + String medium = parseMediaDescriptor(queryString);
|
| + if (!medium.isNull())
|
| + return adoptPtr(new MediaQuery(MediaQuery::None, medium, nullptr));
|
| + }
|
| +
|
| + return adoptPtr(new MediaQuery(MediaQuery::None, "not all", nullptr));
|
| +}
|
| +
|
| +bool MediaQuerySet::parse(const String& mediaString)
|
| +{
|
| + if (mediaString.isEmpty()) {
|
| + m_queries.clear();
|
| + return true;
|
| + }
|
|
|
| - Vector<OwnPtr<MediaQuery> > result;
|
| Vector<String> list;
|
| - mediaString.split(',', list);
|
| + // FIXME: This is too simple as it shouldn't split when the ',' is inside
|
| + // other allowed matching pairs such as (), [], {}, "", and ''.
|
| + mediaString.split(',', /* allowEmptyEntries */ true, list);
|
| +
|
| + Vector<OwnPtr<MediaQuery> > result;
|
| + result.reserveInitialCapacity(list.size());
|
| +
|
| for (unsigned i = 0; i < list.size(); ++i) {
|
| - String medium = list[i].stripWhiteSpace();
|
| - if (medium.isEmpty()) {
|
| - if (!m_fallbackToDescriptor)
|
| - return false;
|
| - continue;
|
| - }
|
| - OwnPtr<MediaQuery> mediaQuery = parser.parseMediaQuery(medium);
|
| - if (!mediaQuery) {
|
| - if (!m_fallbackToDescriptor)
|
| - return false;
|
| - String mediaDescriptor = parseMediaDescriptor(medium);
|
| - if (mediaDescriptor.isNull())
|
| - continue;
|
| - mediaQuery = adoptPtr(new MediaQuery(MediaQuery::None, mediaDescriptor, nullptr));
|
| - }
|
| - result.append(mediaQuery.release());
|
| - }
|
| - // ",,,," falls straight through, but is not valid unless fallback
|
| - if (!m_fallbackToDescriptor && list.isEmpty()) {
|
| - String strippedMediaString = mediaString.stripWhiteSpace();
|
| - if (!strippedMediaString.isEmpty())
|
| - return false;
|
| + String queryString = list[i].stripWhiteSpace();
|
| + if (OwnPtr<MediaQuery> parsedQuery = parseMediaQuery(queryString))
|
| + result.uncheckedAppend(parsedQuery.release());
|
| }
|
| +
|
| m_queries.swap(result);
|
| return true;
|
| }
|
|
|
| bool MediaQuerySet::add(const String& queryString)
|
| {
|
| - CSSParser parser(CSSStrictMode);
|
| -
|
| - OwnPtr<MediaQuery> parsedQuery = parser.parseMediaQuery(queryString);
|
| - if (!parsedQuery && m_fallbackToDescriptor) {
|
| - String medium = parseMediaDescriptor(queryString);
|
| - if (!medium.isNull())
|
| - parsedQuery = adoptPtr(new MediaQuery(MediaQuery::None, medium, nullptr));
|
| + if (OwnPtr<MediaQuery> parsedQuery = parseMediaQuery(queryString)) {
|
| + m_queries.append(parsedQuery.release());
|
| + return true;
|
| }
|
| - if (!parsedQuery)
|
| - return false;
|
| -
|
| - m_queries.append(parsedQuery.release());
|
| - return true;
|
| + return false;
|
| }
|
|
|
| bool MediaQuerySet::remove(const String& queryStringToRemove)
|
| {
|
| - CSSParser parser(CSSStrictMode);
|
| -
|
| - OwnPtr<MediaQuery> parsedQuery = parser.parseMediaQuery(queryStringToRemove);
|
| - if (!parsedQuery && m_fallbackToDescriptor) {
|
| - String medium = parseMediaDescriptor(queryStringToRemove);
|
| - if (!medium.isNull())
|
| - parsedQuery = adoptPtr(new MediaQuery(MediaQuery::None, medium, nullptr));
|
| - }
|
| + OwnPtr<MediaQuery> parsedQuery = parseMediaQuery(queryStringToRemove);
|
| if (!parsedQuery)
|
| return false;
|
|
|
|
|