⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 v8cssstyledeclarationcustom.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
字号:
/* * Copyright (C) 2007-2009 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * *     * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. *     * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. *     * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "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 THE COPYRIGHT * OWNER 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 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#include "config.h"#include "CSSStyleDeclaration.h"#include "CSSValue.h"#include "CSSPrimitiveValue.h"#include "EventTarget.h"#include "V8Binding.h"#include "V8CustomBinding.h"#include "V8Proxy.h"#include <wtf/ASCIICType.h>#include <wtf/PassRefPtr.h>#include <wtf/RefPtr.h>#include <wtf/Vector.h>namespace WebCore {// FIXME: Next two functions look lifted verbatim from JSCSSStyleDeclarationCustom. Please remove duplication.// Check for a CSS prefix.// Passed prefix is all lowercase.// First character of the prefix within the property name may be upper or lowercase.// Other characters in the prefix within the property name must be lowercase.// The prefix within the property name must be followed by a capital letter.static bool hasCSSPropertyNamePrefix(const String& propertyName, const char* prefix){#ifndef NDEBUG    ASSERT(*prefix);    for (const char* p = prefix; *p; ++p)        ASSERT(WTF::isASCIILower(*p));    ASSERT(propertyName.length());#endif    if (WTF::toASCIILower(propertyName[0]) != prefix[0])        return false;    unsigned length = propertyName.length();    for (unsigned i = 1; i < length; ++i) {        if (!prefix[i])            return WTF::isASCIIUpper(propertyName[i]);        if (propertyName[i] != prefix[i])            return false;    }    return false;}// When getting properties on CSSStyleDeclarations, the name used from// Javascript and the actual name of the property are not the same, so// we have to do the following translation.  The translation turns upper// case characters into lower case characters and inserts dashes to// separate words.//// Example: 'backgroundPositionY' -> 'background-position-y'//// Also, certain prefixes such as 'pos', 'css-' and 'pixel-' are stripped// and the hadPixelOrPosPrefix out parameter is used to indicate whether or// not the property name was prefixed with 'pos-' or 'pixel-'.static String cssPropertyName(const String& propertyName, bool& hadPixelOrPosPrefix){    hadPixelOrPosPrefix = false;    unsigned length = propertyName.length();    if (!length)        return String();    Vector<UChar> name;    name.reserveCapacity(length);    unsigned i = 0;    if (hasCSSPropertyNamePrefix(propertyName, "css"))        i += 3;    else if (hasCSSPropertyNamePrefix(propertyName, "pixel")) {        i += 5;        hadPixelOrPosPrefix = true;    } else if (hasCSSPropertyNamePrefix(propertyName, "pos")) {        i += 3;        hadPixelOrPosPrefix = true;    } else if (hasCSSPropertyNamePrefix(propertyName, "webkit")            || hasCSSPropertyNamePrefix(propertyName, "khtml")            || hasCSSPropertyNamePrefix(propertyName, "apple"))        name.append('-');    else if (WTF::isASCIIUpper(propertyName[0]))        return String();    name.append(WTF::toASCIILower(propertyName[i++]));    for (; i < length; ++i) {        UChar c = propertyName[i];        if (!WTF::isASCIIUpper(c))            name.append(c);        else {            name.append('-');            name.append(WTF::toASCIILower(c));        }    }    return String::adopt(name);}NAMED_PROPERTY_GETTER(CSSStyleDeclaration){    INC_STATS("DOM.CSSStyleDeclaration.NamedPropertyGetter");    // First look for API defined attributes on the style declaration object.    if (info.Holder()->HasRealNamedCallbackProperty(name))        return notHandledByInterceptor();    // Search the style declaration.    CSSStyleDeclaration* imp = V8Proxy::ToNativeObject<CSSStyleDeclaration>(V8ClassIndex::CSSSTYLEDECLARATION, info.Holder());    bool hadPixelOrPosPrefix = false;    String propertyName = cssPropertyName(toWebCoreString(name), hadPixelOrPosPrefix);    // Do not handle non-property names.    if (!CSSStyleDeclaration::isPropertyName(propertyName))        return notHandledByInterceptor();    RefPtr<CSSValue> cssValue = imp->getPropertyCSSValue(propertyName);    if (cssValue) {        if (hadPixelOrPosPrefix && cssValue->cssValueType() == CSSValue::CSS_PRIMITIVE_VALUE)            return v8::Number::New(static_cast<CSSPrimitiveValue*>(cssValue.get())->getFloatValue(CSSPrimitiveValue::CSS_PX));        return v8StringOrNull(cssValue->cssText());    }    String result = imp->getPropertyValue(propertyName);    if (result.isNull())        result = "";  // convert null to empty string.    // The 'filter' attribute is made undetectable in KJS/WebKit    // to avoid confusion with IE's filter extension.    if (propertyName == "filter")        return v8UndetectableString(result);    return v8String(result);}NAMED_PROPERTY_SETTER(CSSStyleDeclaration){    INC_STATS("DOM.CSSStyleDeclaration.NamedPropertySetter");    CSSStyleDeclaration* imp = V8Proxy::ToNativeObject<CSSStyleDeclaration>(V8ClassIndex::CSSSTYLEDECLARATION, info.Holder());    bool hadPixelOrPosPrefix = false;    String prop = cssPropertyName(toWebCoreString(name), hadPixelOrPosPrefix);    if (!CSSStyleDeclaration::isPropertyName(prop))        return notHandledByInterceptor();    String propertyValue = valueToStringWithNullCheck(value);    if (hadPixelOrPosPrefix)        propertyValue.append("px");    ExceptionCode ec = 0;    imp->setProperty(prop, propertyValue, ec);    if (ec)        throwError(ec);    return value;}} // namespace WebCore

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -