168513a70bcd92384395513322f1b801e7bf9c729Steve Block/*
268513a70bcd92384395513322f1b801e7bf9c729Steve Block * Copyright (c) 2010 Google Inc. All rights reserved.
368513a70bcd92384395513322f1b801e7bf9c729Steve Block *
468513a70bcd92384395513322f1b801e7bf9c729Steve Block * Redistribution and use in source and binary forms, with or without
568513a70bcd92384395513322f1b801e7bf9c729Steve Block * modification, are permitted provided that the following conditions are
668513a70bcd92384395513322f1b801e7bf9c729Steve Block * met:
768513a70bcd92384395513322f1b801e7bf9c729Steve Block *
868513a70bcd92384395513322f1b801e7bf9c729Steve Block *     * Redistributions of source code must retain the above copyright
968513a70bcd92384395513322f1b801e7bf9c729Steve Block * notice, this list of conditions and the following disclaimer.
1068513a70bcd92384395513322f1b801e7bf9c729Steve Block *     * Redistributions in binary form must reproduce the above
1168513a70bcd92384395513322f1b801e7bf9c729Steve Block * copyright notice, this list of conditions and the following disclaimer
1268513a70bcd92384395513322f1b801e7bf9c729Steve Block * in the documentation and/or other materials provided with the
1368513a70bcd92384395513322f1b801e7bf9c729Steve Block * distribution.
1468513a70bcd92384395513322f1b801e7bf9c729Steve Block *     * Neither the name of Google Inc. nor the names of its
1568513a70bcd92384395513322f1b801e7bf9c729Steve Block * contributors may be used to endorse or promote products derived from
1668513a70bcd92384395513322f1b801e7bf9c729Steve Block * this software without specific prior written permission.
1768513a70bcd92384395513322f1b801e7bf9c729Steve Block *
1868513a70bcd92384395513322f1b801e7bf9c729Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1968513a70bcd92384395513322f1b801e7bf9c729Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2068513a70bcd92384395513322f1b801e7bf9c729Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2168513a70bcd92384395513322f1b801e7bf9c729Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2268513a70bcd92384395513322f1b801e7bf9c729Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2368513a70bcd92384395513322f1b801e7bf9c729Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2468513a70bcd92384395513322f1b801e7bf9c729Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2568513a70bcd92384395513322f1b801e7bf9c729Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2668513a70bcd92384395513322f1b801e7bf9c729Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2768513a70bcd92384395513322f1b801e7bf9c729Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2868513a70bcd92384395513322f1b801e7bf9c729Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2968513a70bcd92384395513322f1b801e7bf9c729Steve Block */
3068513a70bcd92384395513322f1b801e7bf9c729Steve Block
3168513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "config.h"
3268513a70bcd92384395513322f1b801e7bf9c729Steve Block
3368513a70bcd92384395513322f1b801e7bf9c729Steve Block#ifdef SKIP_STATIC_CONSTRUCTORS_ON_GCC
3468513a70bcd92384395513322f1b801e7bf9c729Steve Block#define CSSPROPERTYSOURCEDATA_HIDE_GLOBALS 1
3568513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif
3668513a70bcd92384395513322f1b801e7bf9c729Steve Block
3768513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "CSSPropertySourceData.h"
3868513a70bcd92384395513322f1b801e7bf9c729Steve Block
3968513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "PlatformString.h"
4068513a70bcd92384395513322f1b801e7bf9c729Steve Block#include <wtf/StaticConstructors.h>
4168513a70bcd92384395513322f1b801e7bf9c729Steve Block#include <wtf/text/StringHash.h>
4268513a70bcd92384395513322f1b801e7bf9c729Steve Block
4368513a70bcd92384395513322f1b801e7bf9c729Steve Blocknamespace WebCore {
4468513a70bcd92384395513322f1b801e7bf9c729Steve Block
4568513a70bcd92384395513322f1b801e7bf9c729Steve BlockSourceRange::SourceRange()
4668513a70bcd92384395513322f1b801e7bf9c729Steve Block    : start(0)
4768513a70bcd92384395513322f1b801e7bf9c729Steve Block    , end(0)
4868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
4968513a70bcd92384395513322f1b801e7bf9c729Steve Block}
5068513a70bcd92384395513322f1b801e7bf9c729Steve Block
5168513a70bcd92384395513322f1b801e7bf9c729Steve BlockSourceRange::SourceRange(unsigned start, unsigned end)
5268513a70bcd92384395513322f1b801e7bf9c729Steve Block    : start(start)
5368513a70bcd92384395513322f1b801e7bf9c729Steve Block    , end(end)
5468513a70bcd92384395513322f1b801e7bf9c729Steve Block{
5568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
5668513a70bcd92384395513322f1b801e7bf9c729Steve Block
5768513a70bcd92384395513322f1b801e7bf9c729Steve BlockCSSPropertySourceData::CSSPropertySourceData(const String& name, const String& value, bool important, bool parsedOk, const SourceRange& range)
5868513a70bcd92384395513322f1b801e7bf9c729Steve Block    : name(name)
5968513a70bcd92384395513322f1b801e7bf9c729Steve Block    , value(value)
6068513a70bcd92384395513322f1b801e7bf9c729Steve Block    , important(important)
6168513a70bcd92384395513322f1b801e7bf9c729Steve Block    , parsedOk(parsedOk)
6268513a70bcd92384395513322f1b801e7bf9c729Steve Block    , range(range)
6368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
6468513a70bcd92384395513322f1b801e7bf9c729Steve Block}
6568513a70bcd92384395513322f1b801e7bf9c729Steve Block
6668513a70bcd92384395513322f1b801e7bf9c729Steve BlockCSSPropertySourceData::CSSPropertySourceData(const CSSPropertySourceData& other)
6768513a70bcd92384395513322f1b801e7bf9c729Steve Block    : name(other.name)
6868513a70bcd92384395513322f1b801e7bf9c729Steve Block    , value(other.value)
6968513a70bcd92384395513322f1b801e7bf9c729Steve Block    , important(other.important)
7068513a70bcd92384395513322f1b801e7bf9c729Steve Block    , parsedOk(other.parsedOk)
7168513a70bcd92384395513322f1b801e7bf9c729Steve Block    , range(other.range)
7268513a70bcd92384395513322f1b801e7bf9c729Steve Block{
7368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
7468513a70bcd92384395513322f1b801e7bf9c729Steve Block
7568513a70bcd92384395513322f1b801e7bf9c729Steve BlockCSSPropertySourceData::CSSPropertySourceData()
7668513a70bcd92384395513322f1b801e7bf9c729Steve Block    : name("")
7768513a70bcd92384395513322f1b801e7bf9c729Steve Block    , value("")
7868513a70bcd92384395513322f1b801e7bf9c729Steve Block    , important(false)
7968513a70bcd92384395513322f1b801e7bf9c729Steve Block    , parsedOk(false)
8068513a70bcd92384395513322f1b801e7bf9c729Steve Block    , range(SourceRange(0, 0))
8168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
8268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
8368513a70bcd92384395513322f1b801e7bf9c729Steve Block
8468513a70bcd92384395513322f1b801e7bf9c729Steve BlockString CSSPropertySourceData::toString() const
8568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
8668513a70bcd92384395513322f1b801e7bf9c729Steve Block    DEFINE_STATIC_LOCAL(String, emptyValue, ("e"));
8768513a70bcd92384395513322f1b801e7bf9c729Steve Block    DEFINE_STATIC_LOCAL(String, importantSuffix, (" !important"));
8868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!name && value == emptyValue)
8968513a70bcd92384395513322f1b801e7bf9c729Steve Block        return String();
9068513a70bcd92384395513322f1b801e7bf9c729Steve Block
9168513a70bcd92384395513322f1b801e7bf9c729Steve Block    String result = name;
9268513a70bcd92384395513322f1b801e7bf9c729Steve Block    result += ": ";
9368513a70bcd92384395513322f1b801e7bf9c729Steve Block    result += value;
9468513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (important)
9568513a70bcd92384395513322f1b801e7bf9c729Steve Block        result += importantSuffix;
9668513a70bcd92384395513322f1b801e7bf9c729Steve Block    result += ";";
9768513a70bcd92384395513322f1b801e7bf9c729Steve Block    return result;
9868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
9968513a70bcd92384395513322f1b801e7bf9c729Steve Block
10068513a70bcd92384395513322f1b801e7bf9c729Steve Blockunsigned CSSPropertySourceData::hash() const
10168513a70bcd92384395513322f1b801e7bf9c729Steve Block{
10268513a70bcd92384395513322f1b801e7bf9c729Steve Block    return StringHash::hash(name) + 3 * StringHash::hash(value) + 7 * important + 13 * parsedOk + 31;
10368513a70bcd92384395513322f1b801e7bf9c729Steve Block}
10468513a70bcd92384395513322f1b801e7bf9c729Steve Block
10568513a70bcd92384395513322f1b801e7bf9c729Steve Block// Global init routines
10668513a70bcd92384395513322f1b801e7bf9c729Steve BlockDEFINE_GLOBAL(CSSPropertySourceData, emptyCSSPropertySourceData, "", "e", false, false)
10768513a70bcd92384395513322f1b801e7bf9c729Steve Block
10868513a70bcd92384395513322f1b801e7bf9c729Steve Block// static
10968513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid CSSPropertySourceData::init()
11068513a70bcd92384395513322f1b801e7bf9c729Steve Block{
11168513a70bcd92384395513322f1b801e7bf9c729Steve Block    static bool initialized;
11268513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!initialized) {
11368513a70bcd92384395513322f1b801e7bf9c729Steve Block        new ((void *) &emptyCSSPropertySourceData) CSSPropertySourceData("", "e", false, false, SourceRange(0, 0));
11468513a70bcd92384395513322f1b801e7bf9c729Steve Block        initialized = true;
11568513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
11668513a70bcd92384395513322f1b801e7bf9c729Steve Block}
11768513a70bcd92384395513322f1b801e7bf9c729Steve Block
11868513a70bcd92384395513322f1b801e7bf9c729Steve Block} // namespace WebCore
119