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

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

?? visible_position.cpp

?? It is WEB browser core module with source code. Very good!
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
    long offset = pos.offset();

    if (!node)
        return Position();
    
    if (isAtomicNode(node))
        return pos;

    if (offset >= (long)node->childNodeCount()) {
        do {
            NodeImpl *child = node->lastChild();
            if (!child)
                break;
            node = child;
        } while (!isAtomicNode(node));
        return Position(node, node->caretMaxOffset());
    }
    
    node = node->childNode(offset);
    ASSERT(node);
    while (!isAtomicNode(node)) {
        NodeImpl *child = node->firstChild();
        if (!child)
            break;
        node = child;
    }
    return Position(node, 0);
}

Position VisiblePosition::downstreamDeepEquivalent() const
{
    Position pos = m_deepPosition;
    
    if (pos.isNull() || atEnd(pos))
        return pos;

    Position downstreamTest = pos.downstream(StayInBlock);

    Position current = pos;
    while (!atEnd(current)) {
        current = nextPosition(current);
        if (isCandidate(current)) {
            if (downstreamTest != current.downstream(StayInBlock))
                break;
            pos = current;
        }
    }
    
    return pos;
}

Position VisiblePosition::rangeCompliantEquivalent(const Position &pos)
{
    NodeImpl *node = pos.node();
    if (!node)
        return Position();
    
    // FIXME: This clamps out-of-range values.
    // Instead we should probably assert, and not use such values.

    long offset = pos.offset();
    if (!offsetInCharacters(node->nodeType()) && isAtomicNode(node) && offset > 0)
        return Position(node->parentNode(), node->nodeIndex() + 1);

    return Position(node, kMax(0L, kMin(offset, maxOffset(node))));
}

long VisiblePosition::maxOffset(const NodeImpl *node)
{
    return offsetInCharacters(node->nodeType()) ? (long)static_cast<const CharacterDataImpl *>(node)->length() : (long)node->childNodeCount();
}

bool VisiblePosition::isAtomicNode(const NodeImpl *node)
{
    return node && (!node->hasChildNodes() || (node->id() == ID_OBJECT && node->renderer() && node->renderer()->isReplaced()));
}

QChar VisiblePosition::character() const
{
    Position pos = position();
    NodeImpl *node = pos.node();
    if (!node || !node->isTextNode()) {
        return QChar();
    }
    TextImpl *textNode = static_cast<TextImpl *>(pos.node());
    long offset = pos.offset();
    if ((unsigned)offset >= textNode->length()) {
        return QChar();
    }
    return textNode->data()[offset];
}

bool isEqualIgnoringAffinity(const VisiblePosition &a, const VisiblePosition &b)
{
    bool result = a.m_deepPosition == b.m_deepPosition;
    if (result) {
        // We want to catch cases where positions are equal, but affinities are not, since
        // this is very likely a bug, given the places where this call is used. The difference
        // is very likely due to code that set the affinity on a VisiblePosition "by hand" and 
        // did so incorrectly.
        ASSERT(a.m_affinity == b.m_affinity);
    }
    return result;
}

bool isNotEqualIgnoringAffinity(const VisiblePosition &a, const VisiblePosition &b)
{
    return !isEqualIgnoringAffinity(a, b);
}

void VisiblePosition::debugPosition(const char *msg) const
{
#if 0
    if (isNull())
        fprintf(stderr, "Position [%s]: null\n", msg);
    else
        fprintf(stderr, "Position [%s]: %s [%p] at %d\n", msg, m_deepPosition.node()->nodeName().string().latin1(), m_deepPosition.node(), m_deepPosition.offset());
#endif
}

#ifndef NDEBUG
void VisiblePosition::formatForDebugger(char *buffer, unsigned length) const
{
    m_deepPosition.formatForDebugger(buffer, length);
}
#endif

Range makeRange(const VisiblePosition &start, const VisiblePosition &end)
{
    Position s = start.position();
    Position e = end.position();
    return Range(s.node(), s.offset(), e.node(), e.offset());
}

VisiblePosition startVisiblePosition(const Range &r, EAffinity affinity)
{
    return VisiblePosition(r.startContainer().handle(), r.startOffset(), affinity);
}

VisiblePosition endVisiblePosition(const Range &r, EAffinity affinity)
{
    return VisiblePosition(r.endContainer().handle(), r.endOffset(), affinity);
}

bool setStart(Range &r, const VisiblePosition &c)
{
    RangeImpl *ri = r.handle();
    if (!ri)
        return false;
    Position p = c.position();
    int code = 0;
    ri->setStart(p.node(), p.offset(), code);
    return code == 0;
}

bool setEnd(Range &r, const VisiblePosition &c)
{
    RangeImpl *ri = r.handle();
    if (!ri)
        return false;
    Position p = c.position();
    int code = 0;
    ri->setEnd(p.node(), p.offset(), code);
    return code == 0;
}

void setAffinityUsingLinePosition(VisiblePosition &pos)
{
    // When not moving across line wrap, make sure to end up with DOWNSTREAM affinity.  
    if (pos.isNotNull() && pos.affinity() == UPSTREAM) {
        VisiblePosition temp(pos);
        temp.setAffinity(DOWNSTREAM);
        if (!visiblePositionsOnDifferentLines(temp, pos))
            pos.setAffinity(DOWNSTREAM);
    }
}

bool visiblePositionsOnDifferentLines(const VisiblePosition &pos1, const VisiblePosition &pos2)
{
    if (pos1.isNull() || pos2.isNull())
        return false;
    if (pos1 == pos2)
        return false;
    
    Position p1 = pos1.deepEquivalent();
    Position p2 = pos2.deepEquivalent();
    RenderObject *r1 = p1.node()->renderer();
    RenderObject *r2 = p2.node()->renderer();
    if (r1->isBlockFlow() || r2->isBlockFlow())
        return r1 == r2 ? false : true;
    InlineBox *b1 = r1 ? r1->inlineBox(p1.offset(), pos1.affinity()) : 0;
    InlineBox *b2 = r2 ? r2->inlineBox(p2.offset(), pos2.affinity()) : 0;
    return (b1 && b2 && b1->root() != b2->root());
}

enum EBlockRelationship { 
    NoBlockRelationship, 
    SameBlockRelationship, 
    PeerBlockRelationship, 
    AncestorBlockRelationship, 
    DescendantBlockRelationship, 
    OtherBlockRelationship 
};

static EBlockRelationship blockRelationship(const VisiblePosition &pos1, const VisiblePosition &pos2)
{
    if (pos1.isNull() || pos2.isNull())
        return NoBlockRelationship;
    if (pos1 == pos2)
        return SameBlockRelationship;

    Position p1 = pos1.deepEquivalent();
    Position p2 = pos2.deepEquivalent();
    NodeImpl *b1 = p1.node()->enclosingBlockFlowElement();
    NodeImpl *b2 = p2.node()->enclosingBlockFlowElement();
    if (!b1 || !b2)
        return NoBlockRelationship;
    if (b1 == b2) 
        return SameBlockRelationship;
    if (b1->parentNode() == b2->parentNode())
        return PeerBlockRelationship;
    if (b2->isAncestor(b1))
        return AncestorBlockRelationship;
    if (b1->isAncestor(b2))
        return DescendantBlockRelationship;
    return OtherBlockRelationship;
}

bool visiblePositionsInDifferentBlocks(const VisiblePosition &pos1, const VisiblePosition &pos2)
{
    switch (blockRelationship(pos1, pos2)) {
        case NoBlockRelationship:
        case SameBlockRelationship:
            return false;
        case PeerBlockRelationship:
        case AncestorBlockRelationship:
        case DescendantBlockRelationship:
        case OtherBlockRelationship:
            return true;
    }
    ASSERT_NOT_REACHED();
    return false;
}

bool isFirstVisiblePositionOnLine(const VisiblePosition &pos)
{
    if (pos.isNull())
        return false;
        
    VisiblePosition previous = pos.previous();
    return previous.isNull() || visiblePositionsOnDifferentLines(pos, previous);
}

bool isFirstVisiblePositionInParagraph(const VisiblePosition &pos)
{
    if (pos.isNull())
        return false;

    return pos.deepEquivalent().upstream(StayInBlock).node()->id() == ID_BR || isFirstVisiblePositionInBlock(pos);
}

bool isFirstVisiblePositionInBlock(const VisiblePosition &pos)
{
    if (pos.isNull())
        return false;

    Position upstream = pos.deepEquivalent().upstream(StayInBlock);
    return upstream.node()->isBlockFlow() && upstream.offset() == 0;
}

bool isFirstVisiblePositionInNode(const VisiblePosition &pos, const NodeImpl *node)
{
    if (pos.isNull())
        return false;
        
    VisiblePosition previous = pos.previous();
    return previous.isNull() || !previous.deepEquivalent().node()->isAncestor(node);
}

bool isLastVisiblePositionOnLine(const VisiblePosition &pos)
{
    if (pos.isNull())
        return false;
        
    VisiblePosition next = pos.next();
    return next.isNull() || visiblePositionsOnDifferentLines(pos, next);
}

bool isLastVisiblePositionInParagraph(const VisiblePosition &pos)
{
    if (pos.isNull())
        return false;

    return pos.deepEquivalent().downstream(StayInBlock).node()->id() == ID_BR || isLastVisiblePositionInBlock(pos);
}

bool isLastVisiblePositionInBlock(const VisiblePosition &pos)
{
    if (pos.isNull())
        return false;
        
    VisiblePosition next = pos.next();
    if (next.isNull())
        return true;
    
    switch (blockRelationship(pos, next)) {
        case NoBlockRelationship:
        case SameBlockRelationship:
        case AncestorBlockRelationship:
            return false;
        case OtherBlockRelationship:
        case PeerBlockRelationship:
        case DescendantBlockRelationship:
            return true;
    }
    ASSERT_NOT_REACHED();
    return false;
}

bool isLastVisiblePositionInNode(const VisiblePosition &pos, const NodeImpl *node)
{
    if (pos.isNull())
        return false;
        
    VisiblePosition next = pos.next();
    return next.isNull() || !next.deepEquivalent().node()->isAncestor(node);
}

}  // namespace DOM

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品免费aⅴ片在线观看| 99视频精品全部免费在线| 欧美综合天天夜夜久久| 亚洲欧美一区二区三区国产精品| 不卡视频在线观看| 亚洲欧美日韩小说| 欧美亚洲国产一区二区三区| 亚洲成人av中文| 日韩视频免费观看高清完整版在线观看 | 一个色在线综合| 亚洲欧洲成人自拍| 丁香亚洲综合激情啪啪综合| 精品国产伦一区二区三区免费| 精品一区二区免费在线观看| 国产亚洲自拍一区| 91片黄在线观看| 亚洲成人动漫一区| 精品国产欧美一区二区| 成人国产精品免费观看| 亚洲欧美日韩综合aⅴ视频| 91成人在线精品| 免费成人在线网站| 欧美激情中文字幕| 在线观看91精品国产入口| 日韩高清在线不卡| 久久久久久久av麻豆果冻| 一本到不卡免费一区二区| 婷婷夜色潮精品综合在线| 久久你懂得1024| 91色九色蝌蚪| 免费看黄色91| 亚洲欧美激情在线| 日韩欧美精品三级| 91视频你懂的| 国产一区二区免费视频| 日韩美女视频19| 日韩午夜在线观看视频| 91免费国产在线| 精品在线视频一区| 一区二区三区精品| 久久久久青草大香线综合精品| 色噜噜狠狠色综合欧洲selulu| 久久精品国产99国产精品| 亚洲激情综合网| 欧美精品一区二区三区蜜桃视频| 一本高清dvd不卡在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲欧美电影院| 国产亚洲欧洲997久久综合| 欧美精品 国产精品| 99久久夜色精品国产网站| 麻豆成人久久精品二区三区红| 亚洲精品日韩综合观看成人91| 久久久三级国产网站| 在线一区二区三区| 风间由美一区二区三区在线观看 | 亚洲综合一区在线| 久久午夜免费电影| 精品视频在线视频| 色综合天天综合网天天看片| 国产成人亚洲精品狼色在线| 肉肉av福利一精品导航| 亚洲综合一区二区| 亚洲欧美色综合| 中文字幕日韩一区二区| 久久久国产精品麻豆| 欧美成人vr18sexvr| 日韩一卡二卡三卡| 在线播放国产精品二区一二区四区| 91在线观看成人| 成人动漫在线一区| 国产1区2区3区精品美女| 精品无码三级在线观看视频| 日本不卡在线视频| 日韩高清不卡一区二区三区| 亚洲成av人片一区二区梦乃| 亚洲午夜久久久久久久久久久| 亚洲欧美日本韩国| 亚洲毛片av在线| 亚洲精品五月天| 亚洲国产视频网站| 亚洲成人资源网| 香蕉久久夜色精品国产使用方法| 亚洲国产三级在线| 日本va欧美va欧美va精品| 日韩vs国产vs欧美| 久久国产免费看| 国产成人免费在线观看不卡| 国产aⅴ综合色| 成人av在线播放网站| av资源网一区| 一本色道久久综合精品竹菊| 欧美午夜精品免费| 欧美二区在线观看| 精品久久久影院| 久久九九99视频| 国产精品久久久久精k8| 亚洲美女一区二区三区| 亚洲狠狠爱一区二区三区| 日日夜夜一区二区| 国模大尺度一区二区三区| 高清成人免费视频| 在线区一区二视频| 欧美一区二区精品| 国产欧美一区二区精品忘忧草| 国产精品九色蝌蚪自拍| 一个色综合网站| 乱中年女人伦av一区二区| 国产成人在线电影| 久久精品99国产精品| 成人黄色在线看| 欧美色男人天堂| 久久久国产精品麻豆| 一区二区三区在线影院| 久久精品国产久精国产爱| 成人av一区二区三区| 欧美日韩日日摸| 国产欧美一区二区精品婷婷| 亚洲一区二区在线视频| 激情都市一区二区| 91麻豆精品秘密| 日韩视频免费直播| 亚洲欧美另类综合偷拍| 狠狠色综合播放一区二区| 色婷婷av一区二区三区gif| 欧美变态tickling挠脚心| 最新不卡av在线| 久久www免费人成看片高清| 色综合久久天天| 精品国精品国产| 亚洲午夜精品久久久久久久久| 国产福利电影一区二区三区| 欧美日韩国产免费一区二区 | 97se亚洲国产综合自在线| 91精品国模一区二区三区| 亚洲欧美国产高清| 国产精品自拍av| 91.com视频| 亚洲激情五月婷婷| 国产麻豆精品theporn| 91麻豆精品国产| 亚洲黄一区二区三区| 国产馆精品极品| 欧美哺乳videos| 午夜电影网一区| 色8久久精品久久久久久蜜| 国产欧美日韩麻豆91| 久久99国产精品免费网站| 欧美三级资源在线| 136国产福利精品导航| 激情综合网天天干| 91精品国模一区二区三区| 亚洲一二三专区| 在线视频欧美精品| 亚洲欧美日韩电影| 97精品国产97久久久久久久久久久久| 26uuuu精品一区二区| 日本欧美一区二区三区| 欧美日韩精品欧美日韩精品一| 亚洲精品一卡二卡| 99久久精品国产麻豆演员表| 中文欧美字幕免费| 国产精品一品二品| 国产亚洲一区二区三区| 国产精品99久久久久久久vr | 不卡av在线网| 久久久久久久av麻豆果冻| 国产一区二区视频在线播放| 欧美成人性战久久| 久久激情综合网| 日韩午夜激情电影| 久久精品免费观看| 日韩欧美的一区| 狠狠狠色丁香婷婷综合激情| 国产午夜精品久久久久久免费视| 久久99国产精品久久99| 精品国产一区二区三区av性色| 国产真实精品久久二三区| 日韩精品一区二| 国产精品1区二区.| 中文字幕国产一区| 91美女片黄在线| 亚洲成人一区二区| 日韩欧美久久久| 国产精品一二三四五| 国产精品蜜臀在线观看| 色天天综合久久久久综合片| 亚洲一级二级三级在线免费观看| 69堂成人精品免费视频| 蜜臀91精品一区二区三区| 久久免费看少妇高潮| bt7086福利一区国产| 亚洲欧美在线视频| 欧美亚洲综合久久| 日本不卡的三区四区五区| 26uuu另类欧美| av成人老司机| 天堂久久一区二区三区| 久久久久国产一区二区三区四区 | 亚洲午夜私人影院|