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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cssstyleselector.cpp

?? It is WEB browser core module with source code. Very good!
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
    m_matchedRuleCount = 0;
    firstRuleIndex = lastRuleIndex = -1;
    if (!rules || !element) return;

    // We need to collect the rules for id, class, tag, and everything else into a buffer and
    // then sort the buffer.
    if (element->hasID())
        matchRulesForList(rules->getIDRules(element->getIDAttribute().implementation()),
                          firstRuleIndex, lastRuleIndex);
    if (element->hasClass()) {
        for (const AtomicStringList* singleClass = element->getClassList();
             singleClass; singleClass = singleClass->next())
            matchRulesForList(rules->getClassRules(singleClass->string().implementation()),
                                                   firstRuleIndex, lastRuleIndex);
    }
    matchRulesForList(rules->getTagRules((void*)(int)localNamePart(element->id())),
                      firstRuleIndex, lastRuleIndex);
    matchRulesForList(rules->getUniversalRules(), firstRuleIndex, lastRuleIndex);

    // If we didn't match any rules, we're done.
    if (m_matchedRuleCount == 0) return;

    // Sort the set of matched rules.
    sortMatchedRules(0, m_matchedRuleCount);

    // Now transfer the set of matched rules over to our list of decls.
    for (unsigned i = 0; i < m_matchedRuleCount; i++)
        addMatchedDeclaration(m_matchedRules[i]->rule()->declaration());
}

void CSSStyleSelector::matchRulesForList(CSSRuleDataList* rules,
                                         int& firstRuleIndex, int& lastRuleIndex)
{
    if (!rules) return;
    for (CSSRuleData* d = rules->first(); d; d = d->next()) {
        CSSStyleRuleImpl* rule = d->rule();
        Q_UINT16 cssTagId = localNamePart(element->id());
        Q_UINT16 tag = localNamePart(d->selector()->tag);
        if ((cssTagId == tag || tag == anyLocalName) && checkSelector(d->selector(), element)) {
            // If the rule has no properties to apply, then ignore it.
            CSSMutableStyleDeclarationImpl* decl = rule->declaration();
            if (!decl || !decl->length()) continue;

            // If we're matching normal rules, set a pseudo bit if
            // we really just matched a pseudo-element.
            if (dynamicPseudo != RenderStyle::NOPSEUDO && pseudoStyle == RenderStyle::NOPSEUDO)
                style->setHasPseudoStyle(dynamicPseudo);
            else {
                // Update our first/last rule indices in the matched rules array.
                lastRuleIndex = m_matchedDeclCount + m_matchedRuleCount;
                if (firstRuleIndex == -1) firstRuleIndex = m_matchedDeclCount + m_matchedRuleCount;

                // Add this rule to our list of matched rules.
                addMatchedRule(d);
            }
        }
    }
}

bool operator >(CSSRuleData& r1, CSSRuleData& r2)
{
    int spec1 = r1.selector()->specificity();
    int spec2 = r2.selector()->specificity();
    return (spec1 == spec2) ? r1.position() > r2.position() : spec1 > spec2;
}
bool operator <=(CSSRuleData& r1, CSSRuleData& r2)
{
    return !(r1 > r2);
}

void CSSStyleSelector::sortMatchedRules(uint start, uint end)
{
    if (start >= end || (end-start == 1))
        return; // Sanity check.

    if (end - start <= 6) {
        // Apply a bubble sort for smaller lists.
        for (uint i = end-1; i > start; i--) {
            bool sorted = true;
            for (uint j = start; j < i; j++) {
                CSSRuleData* elt = m_matchedRules[j];
                CSSRuleData* elt2 = m_matchedRules[j+1];
                if (*elt > *elt2) {
                    sorted = false;
                    m_matchedRules[j] = elt2;
                    m_matchedRules[j+1] = elt;
                }
            }
            if (sorted)
                return;
        }
    }
    else {
        // Peform a merge sort for larger lists.
        uint mid = (start+end)/2;
        sortMatchedRules(start, mid);
        sortMatchedRules(mid, end);

        CSSRuleData* elt = m_matchedRules[mid-1];
        CSSRuleData* elt2 = m_matchedRules[mid];

        // Handle the fast common case (of equal specificity).  The list may already
        // be completely sorted.
        if (*elt <= *elt2)
            return;

        // We have to merge sort.  Ensure our merge buffer is big enough to hold
        // all the items.
        m_tmpRules.resize(end - start);
        uint i1 = start;
        uint i2 = mid;

        elt = m_matchedRules[i1];
        elt2 = m_matchedRules[i2];

        while (i1 < mid || i2 < end) {
            if (i1 < mid && (i2 == end || *elt <= *elt2)) {
                m_tmpRules[m_tmpRuleCount++] = elt;
                i1++;
                if (i1 < mid)
                    elt = m_matchedRules[i1];
            }
            else {
                m_tmpRules[m_tmpRuleCount++] = elt2;
                i2++;
                if (i2 < end)
                    elt2 = m_matchedRules[i2];
            }
        }

        for (uint i = start; i < end; i++)
            m_matchedRules[i] = m_tmpRules[i-start];

        m_tmpRuleCount = 0;
    }
}

void CSSStyleSelector::initElementAndPseudoState(ElementImpl* e)
{
    element = e;
    if (element && element->isHTMLElement())
        htmlElement = static_cast<HTMLElementImpl*>(element);
    else
        htmlElement = 0;
    ::encodedurl = &encodedurl;
    pseudoState = PseudoUnknown;
}

void CSSStyleSelector::initForStyleResolve(ElementImpl* e, RenderStyle* defaultParent)
{
    // set some variables we will need
    pseudoStyle = RenderStyle::NOPSEUDO;

    parentNode = e->parentNode();
    if (defaultParent)
        parentStyle = defaultParent;
    else
        parentStyle = (parentNode && parentNode->renderer()) ? parentNode->renderer()->style() : 0;
    view = element->getDocument()->view();
    isXMLDoc = !element->getDocument()->isHTMLDocument();
    part = element->getDocument()->part();
    settings = part ? part->settings() : 0;
    paintDeviceMetrics = element->getDocument()->paintDeviceMetrics();

    style = 0;

    m_matchedRuleCount = 0;
    m_matchedDeclCount = 0;
    m_tmpRuleCount = 0;

    fontDirty = false;
}

// modified version of the one in kurl.cpp
static void cleanpath(QString &path)
{
    int pos;
    while ( (pos = path.find( "/../" )) != -1 ) {
        int prev = 0;
        if ( pos > 0 )
            prev = path.findRev( "/", pos -1 );
        // don't remove the host, i.e. http://foo.org/../foo.html
        if (prev < 0 || (prev > 3 && path.findRev("://", prev-1) == prev-2))
            path.remove( pos, 3);
        else
            // matching directory found ?
            path.remove( prev, pos- prev + 3 );
    }
    pos = 0;

    // Don't remove "//" from an anchor identifier. -rjw
    // Set refPos to -2 to mean "I haven't looked for the anchor yet".
    // We don't want to waste a function call on the search for the the anchor
    // in the vast majority of cases where there is no "//" in the path.
    int refPos = -2;
    while ( (pos = path.find( "//", pos )) != -1) {
        if (refPos == -2)
            refPos = path.find("#", 0);
        if (refPos > 0 && pos >= refPos)
            break;

        if ( pos == 0 || path[pos-1] != ':' )
            path.remove( pos, 1 );
        else
            pos += 2;
    }
    while ( (pos = path.find( "/./" )) != -1)
        path.remove( pos, 2 );
    //kdDebug() << "checkPseudoState " << path << endl;
}

static void checkPseudoState( DOM::ElementImpl *e, bool checkVisited = true )
{
    if (!e->hasAnchor()) {
        pseudoState = PseudoNone;
        return;
    }

    const AtomicString& attr = e->getAttribute(ATTR_HREF);
    if (attr.isNull()) {
        pseudoState = PseudoNone;
        return;
    }

    if (!checkVisited) {
        pseudoState = PseudoAnyLink;
        return;
    }

    QConstString cu(attr.unicode(), attr.length());
    QString u = cu.string();
    if ( !u.contains("://") ) {
        if ( u[0] == '/' )
            u.prepend(encodedurl->host);
        else if ( u[0] == '#' )
            u.prepend(encodedurl->file);
        else
            u.prepend(encodedurl->path);
        cleanpath( u );
    }
    //completeURL( attr.string() );
    pseudoState = KHTMLFactory::vLinks()->contains( u ) ? PseudoVisited : PseudoLink;
}

#ifdef STYLE_SHARING_STATS
static int fraction = 0;
static int total = 0;
#endif

const int siblingThreshold = 10;

NodeImpl* CSSStyleSelector::locateCousinList(ElementImpl* parent)
{
    if (parent && parent->isHTMLElement()) {
        HTMLElementImpl* p = static_cast<HTMLElementImpl*>(parent);
        if (p->renderer() && !p->inlineStyleDecl() && !p->hasID()) {
            DOM::NodeImpl* r = p->previousSibling();
            int subcount = 0;
            RenderStyle* st = p->renderer()->style();
            while (r) {
                if (r->renderer() && r->renderer()->style() == st)
                    return r->lastChild();
                if (subcount++ == siblingThreshold)
                    return 0;
                r = r->previousSibling();
            }
            if (!r)
                r = locateCousinList(static_cast<ElementImpl*>(parent->parentNode()));
            while (r) {
                if (r->renderer() && r->renderer()->style() == st)
                    return r->lastChild();
                if (subcount++ == siblingThreshold)
                    return 0;
                r = r->previousSibling();
            }
        }
    }
    return 0;
}

bool CSSStyleSelector::canShareStyleWithElement(NodeImpl* n)
{
    if (n->isHTMLElement()) {
        bool mouseInside = element->renderer() ? element->renderer()->mouseInside() : false;
        HTMLElementImpl* s = static_cast<HTMLElementImpl*>(n);
        if (s->renderer() && (s->id() == element->id()) && !s->hasID() &&
            (s->hasClass() == element->hasClass()) && !s->inlineStyleDecl() &&
            (s->hasMappedAttributes() == htmlElement->hasMappedAttributes()) &&
            (s->hasAnchor() == element->hasAnchor()) &&
            !s->renderer()->style()->affectedByAttributeSelectors() &&
            (s->renderer()->mouseInside() == mouseInside) &&
            (s->active() == element->active()) &&
            (s->focused() == element->focused())) {
            bool classesMatch = true;
            if (s->hasClass()) {
                const AtomicString& class1 = element->getAttribute(ATTR_CLASS);
                const AtomicString& class2 = s->getAttribute(ATTR_CLASS);
                classesMatch = (class1 == class2);
            }

            if (classesMatch) {
                bool mappedAttrsMatch = true;
                if (s->hasMappedAttributes())
                    mappedAttrsMatch = s->htmlAttributes()->mapsEquivalent(htmlElement->htmlAttributes());
                if (mappedAttrsMatch) {
                    bool anchorsMatch = true;
                    if (s->hasAnchor()) {
                        // We need to check to see if the visited state matches.
                        QColor linkColor = element->getDocument()->linkColor();
                        QColor visitedColor = element->getDocument()->visitedLinkColor();
                        if (pseudoState == PseudoUnknown)
                            checkPseudoState(element, s->renderer()->style()->pseudoState() != PseudoAnyLink ||
                                             linkColor != visitedColor);
                        anchorsMatch = (pseudoState == s->renderer()->style()->pseudoState());
                    }

                    if (anchorsMatch)
                        return true;
                }
            }
        }
    }
    return false;
}

RenderStyle* CSSStyleSelector::locateSharedStyle()
{
    if (htmlElement && !htmlElement->inlineStyleDecl() && !htmlElement->hasID() &&
        !htmlElement->getDocument()->usesSiblingRules()) {
        // Check previous siblings.
        int count = 0;
        DOM::NodeImpl* n;
        for (n = element->previousSibling(); n && !n->isElementNode(); n = n->previousSibling());
        while (n) {
            if (canShareStyleWithElement(n))
                return n->renderer()->style();
            if (count++ == siblingThreshold)
                return 0;
            for (n = n->previousSibling(); n && !n->isElementNode(); n = n->previousSibling());
        }
        if (!n)
            n = locateCousinList(static_cast<ElementImpl*>(element->parentNode()));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品夜色噜噜亚洲aⅴ| 蜜桃视频一区二区三区| 日日欢夜夜爽一区| 国产精品原创巨作av| 欧美日韩国产一区| 国产精品女同互慰在线看| 午夜精品久久久久影视| 成人动漫一区二区| 精品日韩欧美一区二区| 丝袜诱惑亚洲看片| 日本伦理一区二区| 中文字幕乱码日本亚洲一区二区| 日韩va亚洲va欧美va久久| 色噜噜久久综合| 国产精品久久久久久户外露出 | 亚洲欧美日韩系列| 国模少妇一区二区三区| 制服视频三区第一页精品| 亚洲女人的天堂| av成人免费在线| 国产拍欧美日韩视频二区| 免费看欧美美女黄的网站| 91福利在线看| 亚洲精品老司机| 色婷婷av一区二区| 亚洲欧美日韩久久| 99国产精品视频免费观看| 国产精品久久综合| 懂色av一区二区三区蜜臀| 国产午夜精品一区二区三区视频| 美日韩黄色大片| 欧美一区欧美二区| 久久成人精品无人区| 91精品国产综合久久精品图片| 亚洲国产成人91porn| 欧美视频中文字幕| 亚洲成人免费电影| 欧美一三区三区四区免费在线看| 天天做天天摸天天爽国产一区| 欧美在线高清视频| 亚洲高清一区二区三区| 欧美日韩在线三级| 日韩制服丝袜先锋影音| 日韩一区二区免费在线观看| 日本一不卡视频| 精品av久久707| 国产乱码精品一区二区三| 亚洲国产精品成人久久综合一区| 大胆欧美人体老妇| 中文字幕一区二区三区四区| 91福利视频在线| 亚洲国产精品嫩草影院| 日韩三级中文字幕| 国产成人一区二区精品非洲| 中文字幕一区二区三区乱码在线| 91丨porny丨蝌蚪视频| 一区二区三区国产精华| 欧美一二三区在线观看| 国产精品一二三| 亚洲色欲色欲www| 欧美日韩久久久久久| 国产呦萝稀缺另类资源| 国产精品久久久久影院亚瑟| 欧美在线影院一区二区| 麻豆国产精品777777在线| 中文字幕+乱码+中文字幕一区| 色综合天天综合在线视频| 日韩高清在线电影| 亚洲国产精品高清| 91麻豆精品国产91久久久久久 | 成人精品在线视频观看| 亚洲一区成人在线| 亚洲一区在线观看免费观看电影高清| 91精品国产综合久久婷婷香蕉| 黄色小说综合网站| 一区二区三区国产精品| 2023国产一二三区日本精品2022| 97久久久精品综合88久久| 热久久免费视频| 国产精品久久99| 欧美va在线播放| 在线观看不卡视频| 国产成人综合亚洲网站| 午夜欧美一区二区三区在线播放| 国产欧美一区二区精品忘忧草| 欧美日韩国产乱码电影| 成人性生交大片免费看视频在线| 亚洲一区二区在线视频| 国产目拍亚洲精品99久久精品 | 波多野结衣精品在线| 日本欧美久久久久免费播放网| 国产精品久久久久婷婷| 久久九九久久九九| 91精品啪在线观看国产60岁| 91蝌蚪porny| 国产成人精品影视| 激情综合网av| 琪琪一区二区三区| 成人性生交大合| 精品在线播放午夜| 日韩成人一区二区三区在线观看| 亚洲女同女同女同女同女同69| 国产日产欧美一区| 精品国产免费人成电影在线观看四季| 欧美无人高清视频在线观看| www.亚洲精品| 成人开心网精品视频| 国产91精品在线观看| 激情成人综合网| 麻豆精品在线播放| 日本一区中文字幕| 青青草国产精品97视觉盛宴| 午夜私人影院久久久久| 一区二区三区四区在线播放| 国产精品久久免费看| 欧美国产综合一区二区| 国产日韩欧美精品在线| 26uuu久久综合| 亚洲精品一区二区三区精华液 | 欧美在线一区二区三区| 色8久久人人97超碰香蕉987| 91免费在线视频观看| 91在线观看免费视频| 9色porny自拍视频一区二区| 成人毛片在线观看| 91国产免费观看| 欧美日韩国产精品自在自线| 8x8x8国产精品| 欧美一级在线视频| 精品国产免费久久| 国产欧美va欧美不卡在线 | 欧美大肚乱孕交hd孕妇| 日韩三级中文字幕| 国产区在线观看成人精品 | 91久久国产综合久久| 一本大道av一区二区在线播放| 色美美综合视频| 欧美一区二区三区视频在线| 欧美精品一区二区三区四区| 久久午夜色播影院免费高清| 中日韩av电影| 午夜天堂影视香蕉久久| 精彩视频一区二区三区| av电影天堂一区二区在线| 欧美在线综合视频| 久久中文字幕电影| 亚洲色图欧美在线| 美女网站色91| 91亚洲男人天堂| 91精品久久久久久久91蜜桃| 久久精品视频一区二区三区| 成人av在线一区二区三区| 国产乱人伦偷精品视频不卡| 国产一区二区伦理| 大美女一区二区三区| 日本国产一区二区| 久久精品一区四区| 亚洲综合视频在线观看| 国内久久精品视频| 色狠狠色狠狠综合| 久久在线观看免费| 亚洲bdsm女犯bdsm网站| 国产精品911| 91精品免费在线| 综合欧美一区二区三区| 麻豆精品视频在线| 在线免费观看视频一区| 国产亚洲一区二区在线观看| 亚洲成人av电影在线| 经典一区二区三区| 欧美挠脚心视频网站| 国产欧美日韩精品在线| 日韩激情在线观看| 91免费视频网| 国产欧美一区二区在线观看| 午夜精品视频在线观看| 99精品1区2区| 国产欧美日韩综合| 美洲天堂一区二卡三卡四卡视频| 色综合色狠狠综合色| 国产午夜亚洲精品理论片色戒| 三级成人在线视频| 欧美艳星brazzers| 国产精品网站在线播放| 国产在线精品视频| 精品久久久久久久久久久院品网| 亚洲黄一区二区三区| 成人免费福利片| 久久久蜜桃精品| 精品一区二区在线看| 日韩一区二区电影在线| 舔着乳尖日韩一区| 欧美日韩一区二区在线观看| 综合av第一页| 成人高清免费在线播放| 久久精品欧美一区二区三区麻豆| 麻豆成人久久精品二区三区小说| 欧美肥妇free| 捆绑调教美女网站视频一区| 欧美一区二区三区免费大片|