OLD | NEW |
1 /* | 1 /* |
2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) | 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2004, 2006, 2010, 2012 Apple Inc. All rights reserved. | 3 * Copyright (C) 2004, 2006, 2010, 2012 Apple Inc. All rights reserved. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 * and are consistent with those of media queries used in CSS. | 48 * and are consistent with those of media queries used in CSS. |
49 * | 49 * |
50 * HTML5 (at the moment of writing still work in progress) references the Media
Queries | 50 * HTML5 (at the moment of writing still work in progress) references the Media
Queries |
51 * specification directly and thus updates the rules for HTML. | 51 * specification directly and thus updates the rules for HTML. |
52 * | 52 * |
53 * CSS 2.1 Spec (http://www.w3.org/TR/CSS21/media.html) | 53 * CSS 2.1 Spec (http://www.w3.org/TR/CSS21/media.html) |
54 * CSS 3 Media Queries Spec (http://www.w3.org/TR/css3-mediaqueries/) | 54 * CSS 3 Media Queries Spec (http://www.w3.org/TR/css3-mediaqueries/) |
55 */ | 55 */ |
56 | 56 |
57 MediaQuerySet::MediaQuerySet() | 57 MediaQuerySet::MediaQuerySet() |
58 : m_parserMode(MediaQueryNormalMode) | 58 : m_lastLine(0) |
59 , m_lastLine(0) | |
60 { | 59 { |
61 } | 60 } |
62 | 61 |
63 MediaQuerySet::MediaQuerySet(const String& mediaString, MediaQueryParserMode mod
e) | |
64 : m_parserMode(mode) | |
65 , m_lastLine(0) | |
66 { | |
67 set(mediaString); | |
68 } | |
69 | |
70 MediaQuerySet::MediaQuerySet(const MediaQuerySet& o) | 62 MediaQuerySet::MediaQuerySet(const MediaQuerySet& o) |
71 : RefCounted<MediaQuerySet>() | 63 : RefCounted<MediaQuerySet>() |
72 , m_parserMode(o.m_parserMode) | |
73 , m_lastLine(o.m_lastLine) | 64 , m_lastLine(o.m_lastLine) |
74 , m_queries(o.m_queries.size()) | 65 , m_queries(o.m_queries.size()) |
75 { | 66 { |
76 for (unsigned i = 0; i < m_queries.size(); ++i) | 67 for (unsigned i = 0; i < m_queries.size(); ++i) |
77 m_queries[i] = o.m_queries[i]->copy(); | 68 m_queries[i] = o.m_queries[i]->copy(); |
78 } | 69 } |
79 | 70 |
80 MediaQuerySet::~MediaQuerySet() | 71 MediaQuerySet::~MediaQuerySet() |
81 { | 72 { |
82 } | 73 } |
83 | 74 |
84 PassOwnPtr<MediaQuery> MediaQuerySet::parseMediaQuery(const String& queryString,
MediaQueryParserMode mode) | 75 PassRefPtr<MediaQuerySet> MediaQuerySet::create(const String& mediaString) |
85 { | 76 { |
| 77 if (mediaString.isEmpty()) |
| 78 return MediaQuerySet::create(); |
| 79 |
86 CSSParser parser(CSSStrictMode); | 80 CSSParser parser(CSSStrictMode); |
87 OwnPtr<MediaQuery> parsedQuery = parser.parseMediaQuery(queryString); | 81 return parser.parseMediaQueryList(mediaString); |
88 | |
89 if (parsedQuery) | |
90 return parsedQuery.release(); | |
91 | |
92 switch (mode) { | |
93 case MediaQueryNormalMode: | |
94 return adoptPtr(new MediaQuery(MediaQuery::None, "not all", nullptr)); | |
95 case MediaQueryStrictMode: | |
96 break; | |
97 default: | |
98 ASSERT_NOT_REACHED(); | |
99 break; | |
100 } | |
101 return nullptr; | |
102 } | |
103 | |
104 void MediaQuerySet::parseMediaQueryList(const String& mediaString, MediaQueryPar
serMode mode, Vector<OwnPtr<MediaQuery> >& result) | |
105 { | |
106 if (mediaString.isEmpty()) { | |
107 result.clear(); | |
108 return; | |
109 } | |
110 | |
111 Vector<String> list; | |
112 // FIXME: This is too simple as it shouldn't split when the ',' is inside | |
113 // other allowed matching pairs such as (), [], {}, "", and ''. | |
114 mediaString.split(',', /* allowEmptyEntries */ true, list); | |
115 | |
116 result.reserveInitialCapacity(list.size()); | |
117 | |
118 for (unsigned i = 0; i < list.size(); ++i) { | |
119 String queryString = list[i].stripWhiteSpace(); | |
120 OwnPtr<MediaQuery> parsedQuery = parseMediaQuery(queryString, mode); | |
121 if (parsedQuery) | |
122 result.uncheckedAppend(parsedQuery.release()); | |
123 } | |
124 } | 82 } |
125 | 83 |
126 bool MediaQuerySet::set(const String& mediaString) | 84 bool MediaQuerySet::set(const String& mediaString) |
127 { | 85 { |
128 Vector<OwnPtr<MediaQuery> > result; | 86 RefPtr<MediaQuerySet> result = create(mediaString); |
129 parseMediaQueryList(mediaString, parserMode(), result); | 87 m_queries.swap(result->m_queries); |
130 m_queries.swap(result); | |
131 return true; | 88 return true; |
132 } | 89 } |
133 | 90 |
134 bool MediaQuerySet::add(const String& queryString) | 91 bool MediaQuerySet::add(const String& queryString) |
135 { | 92 { |
136 // To "parse a media query" for a given string means to follow "the parse | 93 // To "parse a media query" for a given string means to follow "the parse |
137 // a media query list" steps and return "null" if more than one media query | 94 // a media query list" steps and return "null" if more than one media query |
138 // is returned, or else the returned media query. | 95 // is returned, or else the returned media query. |
139 Vector<OwnPtr<MediaQuery> > queries; | 96 RefPtr<MediaQuerySet> result = create(queryString); |
140 parseMediaQueryList(queryString, MediaQueryStrictMode, queries); | |
141 | 97 |
142 // Only continue if exactly one media query is found, as described above. | 98 // Only continue if exactly one media query is found, as described above. |
143 if (queries.size() != 1) | 99 if (result->m_queries.size() != 1) |
144 return true; | 100 return true; |
145 | 101 |
146 OwnPtr<MediaQuery> newQuery = queries[0].release(); | 102 OwnPtr<MediaQuery> newQuery = result->m_queries[0].release(); |
147 ASSERT(newQuery); | 103 ASSERT(newQuery); |
148 | 104 |
149 // If comparing with any of the media queries in the collection of media | 105 // If comparing with any of the media queries in the collection of media |
150 // queries returns true terminate these steps. | 106 // queries returns true terminate these steps. |
151 for (size_t i = 0; i < m_queries.size(); ++i) { | 107 for (size_t i = 0; i < m_queries.size(); ++i) { |
152 MediaQuery* query = m_queries[i].get(); | 108 MediaQuery* query = m_queries[i].get(); |
153 if (*query == *newQuery) | 109 if (*query == *newQuery) |
154 return true; | 110 return true; |
155 } | 111 } |
156 | 112 |
157 m_queries.append(newQuery.release()); | 113 m_queries.append(newQuery.release()); |
158 return true; | 114 return true; |
159 } | 115 } |
160 | 116 |
161 bool MediaQuerySet::remove(const String& queryStringToRemove) | 117 bool MediaQuerySet::remove(const String& queryStringToRemove) |
162 { | 118 { |
163 // To "parse a media query" for a given string means to follow "the parse | 119 // To "parse a media query" for a given string means to follow "the parse |
164 // a media query list" steps and return "null" if more than one media query | 120 // a media query list" steps and return "null" if more than one media query |
165 // is returned, or else the returned media query. | 121 // is returned, or else the returned media query. |
166 Vector<OwnPtr<MediaQuery> > queries; | 122 RefPtr<MediaQuerySet> result = create(queryStringToRemove); |
167 parseMediaQueryList(queryStringToRemove, MediaQueryStrictMode, queries); | |
168 | 123 |
169 // Only continue if exactly one media query is found, as described above. | 124 // Only continue if exactly one media query is found, as described above. |
170 if (queries.size() != 1) | 125 if (result->m_queries.size() != 1) |
171 return true; | 126 return true; |
172 | 127 |
173 OwnPtr<MediaQuery> newQuery = queries[0].release(); | 128 OwnPtr<MediaQuery> newQuery = result->m_queries[0].release(); |
174 ASSERT(newQuery); | 129 ASSERT(newQuery); |
175 | 130 |
176 // Remove any media query from the collection of media queries for which | 131 // Remove any media query from the collection of media queries for which |
177 // comparing with the media query returns true. | 132 // comparing with the media query returns true. |
178 bool found = false; | 133 bool found = false; |
179 for (size_t i = 0; i < m_queries.size(); ++i) { | 134 for (size_t i = 0; i < m_queries.size(); ++i) { |
180 MediaQuery* query = m_queries[i].get(); | 135 MediaQuery* query = m_queries[i].get(); |
181 if (*query == *newQuery) { | 136 if (*query == *newQuery) { |
182 m_queries.remove(i); | 137 m_queries.remove(i); |
183 --i; | 138 --i; |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(cssV
alue); | 302 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(cssV
alue); |
348 if (primitiveValue->isDotsPerInch() || primitiveValue->isDot
sPerCentimeter()) | 303 if (primitiveValue->isDotsPerInch() || primitiveValue->isDot
sPerCentimeter()) |
349 addResolutionWarningMessageToConsole(document, mediaQuer
ySet->mediaText(), primitiveValue); | 304 addResolutionWarningMessageToConsole(document, mediaQuer
ySet->mediaText(), primitiveValue); |
350 } | 305 } |
351 } | 306 } |
352 } | 307 } |
353 } | 308 } |
354 } | 309 } |
355 | 310 |
356 } | 311 } |
OLD | NEW |