1 | /* |
2 | * Copyright (C) 2012 Motorola Mobility Inc. All rights reserved. |
3 | * |
4 | * Redistribution and use in source and binary forms, with or without |
5 | * modification, are permitted provided that the following conditions are |
6 | * met: |
7 | * |
8 | * 1. Redistributions of source code must retain the above copyright |
9 | * notice, this list of conditions and the following disclaimer. |
10 | * 2. Redistributions in binary form must reproduce the above |
11 | * copyright notice, this list of conditions and the following disclaimer in |
12 | * the documentation and/or other materials provided with the distribution. |
13 | * 3. Neither the name of Motorola Mobility Inc. nor the names of its |
14 | * contributors may be used to endorse or promote products derived from this |
15 | * software without specific prior written permission. |
16 | * |
17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
18 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
19 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
20 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
21 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
22 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
23 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
24 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
25 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
26 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
27 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | */ |
29 | |
30 | #include "config.h" |
31 | #include "DOMCSSNamespace.h" |
32 | |
33 | #include "CSSMarkup.h" |
34 | #include "CSSParser.h" |
35 | #include "CSSPropertyParser.h" |
36 | #include "StyleProperties.h" |
37 | #include <wtf/text/StringBuilder.h> |
38 | #include <wtf/text/WTFString.h> |
39 | |
40 | namespace WebCore { |
41 | |
42 | static String valueWithoutImportant(const String& value) |
43 | { |
44 | if (!value.endsWithIgnoringASCIICase("important" )) |
45 | return value; |
46 | |
47 | String newValue = value; |
48 | int bangIndex = newValue.length() - 9 - 1; |
49 | if (newValue[bangIndex] == ' ') |
50 | bangIndex--; |
51 | newValue = newValue.left(bangIndex); |
52 | |
53 | return newValue; |
54 | } |
55 | |
56 | bool DOMCSSNamespace::supports(Document& document, const String& property, const String& value) |
57 | { |
58 | CSSPropertyID propertyID = cssPropertyID(property.stripWhiteSpace()); |
59 | |
60 | if (propertyID == CSSPropertyInvalid) |
61 | return false; |
62 | |
63 | // CSSParser::parseValue() won't work correctly if !important is present, |
64 | // so just get rid of it. It doesn't matter to supports() if it's actually |
65 | // there or not, provided how it's specified in the value is correct. |
66 | String normalizedValue = value.stripWhiteSpace().simplifyWhiteSpace(); |
67 | normalizedValue = valueWithoutImportant(normalizedValue); |
68 | |
69 | if (normalizedValue.isEmpty()) |
70 | return false; |
71 | |
72 | auto dummyStyle = MutableStyleProperties::create(); |
73 | return CSSParser::parseValue(dummyStyle, propertyID, normalizedValue, false, document) != CSSParser::ParseResult::Error; |
74 | } |
75 | |
76 | bool DOMCSSNamespace::supports(Document& document, const String& conditionText) |
77 | { |
78 | CSSParserContext context(document); |
79 | CSSParser parser(context); |
80 | return parser.parseSupportsCondition(conditionText); |
81 | } |
82 | |
83 | String DOMCSSNamespace::escape(const String& ident) |
84 | { |
85 | StringBuilder builder; |
86 | serializeIdentifier(ident, builder); |
87 | return builder.toString(); |
88 | } |
89 | |
90 | } |
91 | |