diff options
Diffstat (limited to 'Source/WebCore/css/MediaQuery.cpp')
-rw-r--r-- | Source/WebCore/css/MediaQuery.cpp | 112 |
1 files changed, 43 insertions, 69 deletions
diff --git a/Source/WebCore/css/MediaQuery.cpp b/Source/WebCore/css/MediaQuery.cpp index 39304d8f8..13d775696 100644 --- a/Source/WebCore/css/MediaQuery.cpp +++ b/Source/WebCore/css/MediaQuery.cpp @@ -16,7 +16,7 @@ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR @@ -29,7 +29,6 @@ #include "config.h" #include "MediaQuery.h" -#include "MediaQueryExp.h" #include <wtf/text/StringBuilder.h> namespace WebCore { @@ -37,86 +36,62 @@ namespace WebCore { // http://dev.w3.org/csswg/cssom/#serialize-a-media-query String MediaQuery::serialize() const { - StringBuilder result; - if (!m_ignored) { - switch (m_restrictor) { - case MediaQuery::Only: - result.append("only "); - break; - case MediaQuery::Not: - result.append("not "); - break; - case MediaQuery::None: - break; - } - - if (m_expressions->isEmpty()) { - result.append(m_mediaType); - return result.toString(); - } - - if (m_mediaType != "all" || m_restrictor != None) { - result.append(m_mediaType); - result.append(" and "); - } - - result.append(m_expressions->at(0)->serialize()); - for (size_t i = 1; i < m_expressions->size(); ++i) { - result.append(" and "); - result.append(m_expressions->at(i)->serialize()); - } - } else { + if (m_ignored) { // If query is invalid, serialized text should turn into "not all". - result.append("not all"); + return ASCIILiteral("not all"); + } + + bool shouldOmitMediaType = false; + StringBuilder result; + switch (m_restrictor) { + case MediaQuery::Only: + result.appendLiteral("only "); + break; + case MediaQuery::Not: + result.appendLiteral("not "); + break; + case MediaQuery::None: + shouldOmitMediaType = !m_expressions.isEmpty() && m_mediaType == "all"; + break; + } + bool needsAnd = false; + if (!shouldOmitMediaType) { + result.append(m_mediaType); + needsAnd = true; + } + for (auto& expression : m_expressions) { + if (needsAnd) + result.appendLiteral(" and "); + result.append(expression.serialize()); + needsAnd = true; } return result.toString(); } -MediaQuery::MediaQuery(Restrictor r, const String& mediaType, PassOwnPtr<ExpressionVector> exprs) - : m_restrictor(r) - , m_mediaType(mediaType.lower()) - , m_expressions(exprs) - , m_ignored(false) +MediaQuery::MediaQuery(Restrictor restrictor, const String& mediaType, Vector<MediaQueryExpression>&& expressions) + : m_restrictor(restrictor) + , m_mediaType(mediaType.convertToASCIILowercase()) + , m_expressions(WTFMove(expressions)) { - if (!m_expressions) { - m_expressions = adoptPtr(new ExpressionVector); - return; - } - - std::sort(m_expressions->begin(), m_expressions->end(), [](const OwnPtr<MediaQueryExp>& a, const OwnPtr<MediaQueryExp>& b) { - return codePointCompare(a->serialize(), b->serialize()) < 0; + std::sort(m_expressions.begin(), m_expressions.end(), [](auto& a, auto& b) { + return codePointCompare(a.serialize(), b.serialize()) < 0; }); - // remove all duplicated expressions + // Remove all duplicated expressions. String key; - for (int i = m_expressions->size() - 1; i >= 0; --i) { + for (int i = m_expressions.size() - 1; i >= 0; --i) { - // if not all of the expressions is valid the media query must be ignored. + // If any expression is invalid the media query must be ignored. if (!m_ignored) - m_ignored = !m_expressions->at(i)->isValid(); + m_ignored = !m_expressions[i].isValid(); - if (m_expressions->at(i)->serialize() == key) - m_expressions->remove(i); + if (m_expressions[i].serialize() == key) + m_expressions.remove(i); else - key = m_expressions->at(i)->serialize(); + key = m_expressions[i].serialize(); } } -MediaQuery::MediaQuery(const MediaQuery& o) - : m_restrictor(o.m_restrictor) - , m_mediaType(o.m_mediaType) - , m_expressions(adoptPtr(new ExpressionVector(o.m_expressions->size()))) - , m_ignored(o.m_ignored) - , m_serializationCache(o.m_serializationCache) -{ - for (unsigned i = 0; i < m_expressions->size(); ++i) - (*m_expressions)[i] = o.m_expressions->at(i)->copy(); -} - -MediaQuery::~MediaQuery() -{ -} - // http://dev.w3.org/csswg/cssom/#compare-media-queries bool MediaQuery::operator==(const MediaQuery& other) const { @@ -124,11 +99,10 @@ bool MediaQuery::operator==(const MediaQuery& other) const } // http://dev.w3.org/csswg/cssom/#serialize-a-list-of-media-queries -String MediaQuery::cssText() const +const String& MediaQuery::cssText() const { if (m_serializationCache.isNull()) - const_cast<MediaQuery*>(this)->m_serializationCache = serialize(); - + m_serializationCache = serialize(); return m_serializationCache; } |