blob: dce9797fd11cf6328772cccdd1c09fc4d02b1358 [file] [log] [blame]
// Copyright 2014 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef COBALT_CSS_PARSER_PROPERTY_DECLARATION_H_
#define COBALT_CSS_PARSER_PROPERTY_DECLARATION_H_
#include <vector>
#include "base/memory/scoped_ptr.h"
#include "cobalt/css_parser/trivial_string_piece.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/cssom/property_value.h"
namespace cobalt {
namespace css_parser {
// A helper used in YYSTYPE to hold together the name, value, and importance
// of the property. Note that data is stored as a list of name/value pairs
// because shorthand properties (e.g. 'transition') may result in multiple
// non-shorthand properties being declared simultaneously.
struct PropertyDeclaration {
// Shortcut constructor for when there is only one name/value pair to set.
// This will be used for the case of non-shorthand properties.
PropertyDeclaration(cssom::PropertyKey key,
const scoped_refptr<cssom::PropertyValue>& value,
bool is_important)
: is_important(is_important) {
property_values.push_back(PropertyKeyValuePair(key, value));
}
// Shorthand properties will construct an empty PropertyDeclaration object
// using this constructor object and then populate it manually.
explicit PropertyDeclaration(bool is_important)
: is_important(is_important) {}
void Apply(cssom::CSSDeclarationData* declaration_data) {
for (PropertyKeyValuePairList::const_iterator iter =
property_values.begin();
iter != property_values.end(); ++iter) {
if (declaration_data->IsSupportedPropertyKey(iter->key)) {
declaration_data->SetPropertyValueAndImportance(iter->key, iter->value,
is_important);
} else {
unsupported_property_keys.push_back(iter->key);
}
}
}
struct PropertyKeyValuePair {
PropertyKeyValuePair(cssom::PropertyKey key,
const scoped_refptr<cssom::PropertyValue>& value)
: key(key), value(value) {}
cssom::PropertyKey key;
scoped_refptr<cssom::PropertyValue> value;
};
typedef std::vector<PropertyKeyValuePair> PropertyKeyValuePairList;
typedef std::vector<cssom::PropertyKey> PropertyKeyList;
PropertyKeyValuePairList property_values;
bool is_important;
PropertyKeyList unsupported_property_keys;
};
} // namespace css_parser
} // namespace cobalt
#endif // COBALT_CSS_PARSER_PROPERTY_DECLARATION_H_