亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cssstyleselector.cpp

?? linux下開源瀏覽器WebKit的源碼,市面上的很多商用瀏覽器都是移植自WebKit
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
class CSSRuleSet {public:    CSSRuleSet();    ~CSSRuleSet();        typedef HashMap<AtomicStringImpl*, CSSRuleDataList*> AtomRuleMap;        void addRulesFromSheet(CSSStyleSheet*, const MediaQueryEvaluator&, CSSStyleSelector* = 0);        void addRule(CSSStyleRule* rule, CSSSelector* sel);    void addToRuleSet(AtomicStringImpl* key, AtomRuleMap& map,                      CSSStyleRule* rule, CSSSelector* sel);        CSSRuleDataList* getIDRules(AtomicStringImpl* key) { return m_idRules.get(key); }    CSSRuleDataList* getClassRules(AtomicStringImpl* key) { return m_classRules.get(key); }    CSSRuleDataList* getTagRules(AtomicStringImpl* key) { return m_tagRules.get(key); }    CSSRuleDataList* getUniversalRules() { return m_universalRules; }    public:    AtomRuleMap m_idRules;    AtomRuleMap m_classRules;    AtomRuleMap m_tagRules;    CSSRuleDataList* m_universalRules;    unsigned m_ruleCount;};static CSSRuleSet* defaultStyle;static CSSRuleSet* defaultQuirksStyle;static CSSRuleSet* defaultPrintStyle;static CSSRuleSet* defaultViewSourceStyle;static CSSStyleSheet* simpleDefaultStyleSheet;RenderStyle* CSSStyleSelector::s_styleNotYetAvailable;static PseudoState pseudoState;static void loadFullDefaultStyle();static void loadSimpleDefaultStyle();// FIXME: It would be nice to use some mechanism that guarantees this is in sync with the real UA stylesheet.static const char* simpleUserAgentStyleSheet = "html,body,div{display:block}body{margin:8px}div:focus,span:focus{outline:auto 5px -webkit-focus-ring-color}";static bool elementCanUseSimpleDefaultStyle(Element* e){    return e->hasTagName(htmlTag) || e->hasTagName(bodyTag) || e->hasTagName(divTag) || e->hasTagName(spanTag) || e->hasTagName(brTag);}static const MediaQueryEvaluator& screenEval(){    DEFINE_STATIC_LOCAL(const MediaQueryEvaluator, staticScreenEval, ("screen"));    return staticScreenEval;}static const MediaQueryEvaluator& printEval(){    DEFINE_STATIC_LOCAL(const MediaQueryEvaluator, staticPrintEval, ("print"));    return staticPrintEval;}CSSStyleSelector::CSSStyleSelector(Document* doc, const String& userStyleSheet, StyleSheetList* styleSheets, CSSStyleSheet* mappedElementSheet, bool strictParsing, bool matchAuthorAndUserStyles)    : m_backgroundData(BackgroundFillLayer)    , m_checker(doc, strictParsing)    , m_fontSelector(CSSFontSelector::create(doc)){    init();    m_matchAuthorAndUserStyles = matchAuthorAndUserStyles;        Element* root = doc->documentElement();    if (!defaultStyle) {        if (!root || elementCanUseSimpleDefaultStyle(root))            loadSimpleDefaultStyle();        else            loadFullDefaultStyle();    }    m_userStyle = 0;    // construct document root element default style. this is needed    // to evaluate media queries that contain relative constraints, like "screen and (max-width: 10em)"    // This is here instead of constructor, because when constructor is run,    // document doesn't have documentElement    // NOTE: this assumes that element that gets passed to styleForElement -call    // is always from the document that owns the style selector    FrameView* view = doc->view();    if (view)        m_medium = new MediaQueryEvaluator(view->mediaType());    else        m_medium = new MediaQueryEvaluator("all");    if (root)        m_rootDefaultStyle = styleForElement(root, 0, false, true); // dont ref, because the RenderStyle is allocated from global heap    if (m_rootDefaultStyle && view) {        delete m_medium;        m_medium = new MediaQueryEvaluator(view->mediaType(), view->frame(), m_rootDefaultStyle.get());    }    // FIXME: This sucks! The user sheet is reparsed every time!    if (!userStyleSheet.isEmpty()) {        m_userSheet = CSSStyleSheet::create(doc);        m_userSheet->parseString(userStyleSheet, strictParsing);        m_userStyle = new CSSRuleSet();        m_userStyle->addRulesFromSheet(m_userSheet.get(), *m_medium, this);    }    // add stylesheets from document    m_authorStyle = new CSSRuleSet();        // Add rules from elments like SVG's <font-face>    if (mappedElementSheet)        m_authorStyle->addRulesFromSheet(mappedElementSheet, *m_medium, this);    unsigned length = styleSheets->length();    for (unsigned i = 0; i < length; i++) {        StyleSheet* sheet = styleSheets->item(i);        if (sheet->isCSSStyleSheet() && !sheet->disabled())            m_authorStyle->addRulesFromSheet(static_cast<CSSStyleSheet*>(sheet), *m_medium, this);    }}// This is a simplified style setting function for keyframe stylesvoid CSSStyleSelector::addKeyframeStyle(PassRefPtr<WebKitCSSKeyframesRule> rule){    AtomicString s(rule->name());    m_keyframesRuleMap.add(s.impl(), rule);}void CSSStyleSelector::init(){    m_element = 0;    m_matchedDecls.clear();    m_ruleList = 0;    m_rootDefaultStyle = 0;    m_medium = 0;}CSSStyleSelector::~CSSStyleSelector(){    m_fontSelector->clearDocument();    delete m_medium;    delete m_authorStyle;    delete m_userStyle;    deleteAllValues(m_viewportDependentMediaQueryResults);    m_keyframesRuleMap.clear();}static CSSStyleSheet* parseUASheet(const String& str){    CSSStyleSheet* sheet = CSSStyleSheet::create().releaseRef(); // leak the sheet on purpose    sheet->parseString(str);    return sheet;}static CSSStyleSheet* parseUASheet(const char* characters, unsigned size){    return parseUASheet(String(characters, size));}static void loadFullDefaultStyle(){    if (simpleDefaultStyleSheet) {        ASSERT(defaultStyle);        delete defaultStyle;        delete simpleDefaultStyleSheet;        defaultStyle = new CSSRuleSet;        simpleDefaultStyleSheet = 0;    } else {        ASSERT(!defaultStyle);        defaultStyle = new CSSRuleSet;        defaultPrintStyle = new CSSRuleSet;        defaultQuirksStyle = new CSSRuleSet;    }    // Strict-mode rules.    String defaultRules = String(html4UserAgentStyleSheet, sizeof(html4UserAgentStyleSheet)) + theme()->extraDefaultStyleSheet();    CSSStyleSheet* defaultSheet = parseUASheet(defaultRules);    defaultStyle->addRulesFromSheet(defaultSheet, screenEval());    defaultPrintStyle->addRulesFromSheet(defaultSheet, printEval());    // Quirks-mode rules.    String quirksRules = String(quirksUserAgentStyleSheet, sizeof(quirksUserAgentStyleSheet)) + theme()->extraQuirksStyleSheet();    CSSStyleSheet* quirksSheet = parseUASheet(quirksRules);    defaultQuirksStyle->addRulesFromSheet(quirksSheet, screenEval());}static void loadSimpleDefaultStyle(){    ASSERT(!defaultStyle);    ASSERT(!simpleDefaultStyleSheet);        defaultStyle = new CSSRuleSet;    defaultPrintStyle = new CSSRuleSet;    defaultQuirksStyle = new CSSRuleSet;    simpleDefaultStyleSheet = parseUASheet(simpleUserAgentStyleSheet, strlen(simpleUserAgentStyleSheet));    defaultStyle->addRulesFromSheet(simpleDefaultStyleSheet, screenEval());        // No need to initialize quirks sheet yet as there are no quirk rules for elements allowed in simple default style.}    static void loadViewSourceStyle(){    ASSERT(!defaultViewSourceStyle);    defaultViewSourceStyle = new CSSRuleSet;    defaultViewSourceStyle->addRulesFromSheet(parseUASheet(sourceUserAgentStyleSheet, sizeof(sourceUserAgentStyleSheet)), screenEval());}void CSSStyleSelector::addMatchedDeclaration(CSSMutableStyleDeclaration* decl){    if (!decl->hasVariableDependentValue()) {        m_matchedDecls.append(decl);        return;    }    // See if we have already resolved the variables in this declaration.    CSSMutableStyleDeclaration* resolvedDecl = m_resolvedVariablesDeclarations.get(decl).get();    if (resolvedDecl) {        m_matchedDecls.append(resolvedDecl);        return;    }    // If this declaration has any variables in it, then we need to make a cloned    // declaration with as many variables resolved as possible for this style selector's media.    RefPtr<CSSMutableStyleDeclaration> newDecl = CSSMutableStyleDeclaration::create(decl->parentRule());    m_matchedDecls.append(newDecl.get());    m_resolvedVariablesDeclarations.set(decl, newDecl);    HashSet<String> usedBlockVariables;    resolveVariablesForDeclaration(decl, newDecl.get(), usedBlockVariables);}void CSSStyleSelector::resolveVariablesForDeclaration(CSSMutableStyleDeclaration* decl, CSSMutableStyleDeclaration* newDecl, HashSet<String>& usedBlockVariables){    // Now iterate over the properties in the original declaration.  As we resolve variables we'll end up    // mutating the new declaration (possibly expanding shorthands).  The new declaration has no m_node    // though, so it can't mistakenly call setChanged on anything.    CSSMutableStyleDeclaration::const_iterator end = decl->end();    for (CSSMutableStyleDeclaration::const_iterator it = decl->begin(); it != end; ++it) {        const CSSProperty& current = *it;        if (!current.value()->isVariableDependentValue()) {            // We can just add the parsed property directly.            newDecl->addParsedProperty(current);            continue;        }        CSSValueList* valueList = static_cast<CSSVariableDependentValue*>(current.value())->valueList();        if (!valueList)            continue;        CSSParserValueList resolvedValueList;        unsigned s = valueList->length();        bool fullyResolved = true;        for (unsigned i = 0; i < s; ++i) {            CSSValue* val = valueList->item(i);            CSSPrimitiveValue* primitiveValue = val->isPrimitiveValue() ? static_cast<CSSPrimitiveValue*>(val) : 0;            if (primitiveValue && primitiveValue->isVariable()) {                CSSVariablesRule* rule = m_variablesMap.get(primitiveValue->getStringValue());                if (!rule || !rule->variables()) {                    fullyResolved = false;                    break;                }                                if (current.id() == CSSPropertyWebkitVariableDeclarationBlock && s == 1) {                    fullyResolved = false;                    if (!usedBlockVariables.contains(primitiveValue->getStringValue())) {                        CSSMutableStyleDeclaration* declBlock = rule->variables()->getParsedVariableDeclarationBlock(primitiveValue->getStringValue());                        if (declBlock) {                            usedBlockVariables.add(primitiveValue->getStringValue());                            resolveVariablesForDeclaration(declBlock, newDecl, usedBlockVariables);                        }                    }                }                CSSValueList* resolvedVariable = rule->variables()->getParsedVariable(primitiveValue->getStringValue());                if (!resolvedVariable) {                    fullyResolved = false;                    break;                }                unsigned valueSize = resolvedVariable->length();                for (unsigned j = 0; j < valueSize; ++j)                    resolvedValueList.addValue(resolvedVariable->item(j)->parserValue());            } else                resolvedValueList.addValue(val->parserValue());        }                if (!fullyResolved)            continue;        // We now have a fully resolved new value list.  We want the parser to use this value list        // and parse our new declaration.        CSSParser(m_checker.m_strictParsing).parsePropertyWithResolvedVariables(current.id(), current.isImportant(), newDecl, &resolvedValueList);    }}void CSSStyleSelector::matchRules(CSSRuleSet* rules, int& firstRuleIndex, int& lastRuleIndex){    m_matchedRules.clear();    if (!rules || !m_element)        return;        // We need to collect the rules for id, class, tag, and everything else into a buffer and    // then sort the buffer.    if (m_element->hasID())        matchRulesForList(rules->getIDRules(m_element->getIDAttribute().impl()), firstRuleIndex, lastRuleIndex);    if (m_element->hasClass()) {        ASSERT(m_styledElement);        const ClassNames& classNames = m_styledElement->classNames();        size_t size = classNames.size();        for (size_t i = 0; i < size; ++i)            matchRulesForList(rules->getClassRules(classNames[i].impl()), firstRuleIndex, lastRuleIndex);    }    matchRulesForList(rules->getTagRules(m_element->localName().impl()), firstRuleIndex, lastRuleIndex);    matchRulesForList(rules->getUniversalRules(), firstRuleIndex, lastRuleIndex);        // If we didn't match any rules, we're done.    if (m_matchedRules.isEmpty())        return;        // Sort the set of matched rules.    sortMatchedRules(0, m_matchedRules.size());        // Now transfer the set of matched rules over to our list of decls.    if (!m_checker.m_collectRulesOnly) {        for (unsigned i = 0; i < m_matchedRules.size(); i++)            addMatchedDeclaration(m_matchedRules[i]->rule()->declaration());    } else {        for (unsigned i = 0; i < m_matchedRules.size(); i++) {            if (!m_ruleList)                m_ruleList = CSSRuleList::create();            m_ruleList->append(m_matchedRules[i]->rule());        }    }}void CSSStyleSelector::matchRulesForList(CSSRuleDataList* rules, int& firstRuleIndex, int& lastRuleIndex){

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产综合久久精品性色| 国产黄色成人av| 欧美中文字幕不卡| 亚洲一区二三区| 欧美精品视频www在线观看| 五月综合激情网| 日韩亚洲欧美成人一区| 国产河南妇女毛片精品久久久| 国产日本一区二区| 色婷婷av一区| 免费在线一区观看| 久久精品人人做人人综合| 不卡的看片网站| 亚洲成人av一区| 精品国产乱码久久久久久牛牛| 国产在线看一区| 中文字幕日本不卡| 欧美狂野另类xxxxoooo| 国产精品综合在线视频| 最新日韩在线视频| 欧美精品电影在线播放| 激情欧美日韩一区二区| 亚洲色图一区二区三区| 日韩一区二区三区免费观看| 国产精品一级二级三级| 亚洲一线二线三线久久久| 日韩欧美一卡二卡| 99久久精品免费看国产| 日韩中文欧美在线| 国产精品乱码久久久久久| 欧美日韩国产区一| 成人久久久精品乱码一区二区三区| 亚洲一区影音先锋| 国产欧美日产一区| 日韩一区二区高清| 一本大道综合伊人精品热热| 精品一区二区三区在线播放| 亚洲欧美日韩在线| 国产亚洲一区二区三区| 欧美理论在线播放| 91亚洲精品久久久蜜桃网站| 久久99精品久久只有精品| 一区二区三区在线观看动漫| 欧美精品一区男女天堂| 欧美视频在线观看一区| 97精品超碰一区二区三区| 美国毛片一区二区| 亚洲一区二区三区视频在线| 中文字幕+乱码+中文字幕一区| 欧美美女喷水视频| 在线免费观看视频一区| 成人手机在线视频| 国产毛片一区二区| 麻豆国产精品视频| 日韩高清电影一区| 亚洲一区二区三区自拍| 国产精品乱人伦| 欧美激情自拍偷拍| 久久综合九色综合97婷婷| 日韩一区二区三区高清免费看看| 色激情天天射综合网| 国产91丝袜在线观看| 九色|91porny| 麻豆精品一区二区三区| 日本午夜一本久久久综合| 亚洲午夜久久久久久久久电影网| 中文字幕中文字幕一区| 国产精品久久久久天堂| 国产亚洲欧洲997久久综合| 精品国产青草久久久久福利| 日韩欧美三级在线| 日韩视频免费观看高清完整版| 在线播放视频一区| 3d成人动漫网站| 91精品一区二区三区久久久久久| 欧美视频中文一区二区三区在线观看| 91丨九色丨蝌蚪丨老版| 色综合激情久久| 欧美在线高清视频| 欧美日韩成人一区| 欧美一级黄色片| 欧美成人三级电影在线| 精品国产1区二区| 国产三区在线成人av| 久久这里只有精品视频网| 久久婷婷国产综合精品青草| 国产三级一区二区| 中文字幕中文字幕一区二区| 亚洲欧美偷拍另类a∨色屁股| 亚洲欧美色图小说| 亚洲成人黄色影院| 日韩高清国产一区在线| 黄页视频在线91| 成人黄色片在线观看| 在线观看免费视频综合| 欧美日本视频在线| 精品99一区二区三区| 中文字幕不卡在线| 亚洲综合激情另类小说区| 日本在线观看不卡视频| 国产呦萝稀缺另类资源| 99精品国产热久久91蜜凸| 欧美视频在线一区二区三区| 日韩一区二区在线看| 国产欧美一区二区三区在线看蜜臀 | 国产成人精品亚洲午夜麻豆| a4yy欧美一区二区三区| 欧美视频中文字幕| 精品国产乱子伦一区| 国产精品国产三级国产专播品爱网| 亚洲乱码一区二区三区在线观看| 亚洲福利视频一区| 国产在线视频一区二区三区| 99re亚洲国产精品| 51精品国自产在线| 国产日韩三级在线| 亚洲一区二区三区四区五区黄 | 一区二区三区四区在线播放| 蜜桃视频在线观看一区二区| 国产91精品在线观看| 欧美三级视频在线播放| 欧美精品一区二区三区在线播放 | 久久久九九九九| 亚洲国产日韩精品| 国产精品99久久久久久宅男| 91美女片黄在线| 精品国产乱码久久久久久浪潮| 亚洲女性喷水在线观看一区| 精品一区二区国语对白| 91精品福利视频| 国产视频一区不卡| 日本成人中文字幕在线视频| 91丨九色丨蝌蚪富婆spa| 日韩欧美国产1| 亚洲自拍欧美精品| 豆国产96在线|亚洲| 欧美大片在线观看| 亚洲成人动漫av| 色综合中文综合网| 久久99国产精品尤物| 欧美色区777第一页| 国产精品久久看| 国模娜娜一区二区三区| 欧美日韩在线播| 伊人婷婷欧美激情| 91亚洲精品久久久蜜桃网站| 国产欧美日韩久久| 精久久久久久久久久久| 欧美一区二区在线视频| 亚洲一区国产视频| 91豆麻精品91久久久久久| 国产精品久久久久久久蜜臀| 国产激情偷乱视频一区二区三区| 欧美不卡一二三| 人人超碰91尤物精品国产| 欧美三级日韩三级| 亚洲国产日韩精品| 欧美日韩色综合| 亚洲成人资源网| 欧美最猛黑人xxxxx猛交| 亚洲日本电影在线| 一本色道久久综合亚洲精品按摩| 欧美—级在线免费片| 成人一道本在线| 中文字幕精品一区二区精品绿巨人| 国产一区激情在线| 久久久久久久久久久久久久久99| 精品一区二区三区影院在线午夜| 日韩精品自拍偷拍| 久草精品在线观看| 精品国产伦一区二区三区免费| 久久精品国产99国产精品| 日韩一区二区视频| 激情av综合网| 国产精品久久久久永久免费观看 | 久久久久久毛片| 成人综合日日夜夜| 国产精品无人区| 一本久道久久综合中文字幕| 一区二区理论电影在线观看| 欧美日韩国产一区| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美一区二区久久| 国产一区二区伦理| 国产精品色噜噜| 91黄色免费网站| 日本亚洲电影天堂| 国产亚洲精品资源在线26u| 成人黄色免费短视频| 一区二区三区在线免费播放| 欧美顶级少妇做爰| 国产一区二区女| 亚洲精品欧美综合四区| 欧美精品日韩精品| 国产一区二区不卡在线| 18欧美乱大交hd1984| 777亚洲妇女| 国产高清不卡二三区| 一区二区三区蜜桃网| 日韩欧美aaaaaa|