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

📄 renderview.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}#endifvoid RenderView::setSelection(RenderObject* start, int startPos, RenderObject* end, int endPos){    // Make sure both our start and end objects are defined.    // Check www.msnbc.com and try clicking around to find the case where this happened.    if ((start && !end) || (end && !start))        return;    // Just return if the selection hasn't changed.    if (m_selectionStart == start && m_selectionStartPos == startPos &&        m_selectionEnd == end && m_selectionEndPos == endPos)        return;    // Record the old selected objects.  These will be used later    // when we compare against the new selected objects.    int oldStartPos = m_selectionStartPos;    int oldEndPos = m_selectionEndPos;    // Objects each have a single selection rect to examine.    typedef HashMap<RenderObject*, RenderSelectionInfo*> SelectedObjectMap;    SelectedObjectMap oldSelectedObjects;    SelectedObjectMap newSelectedObjects;    // Blocks contain selected objects and fill gaps between them, either on the left, right, or in between lines and blocks.    // In order to get the repaint rect right, we have to examine left, middle, and right rects individually, since otherwise    // the union of those rects might remain the same even when changes have occurred.    typedef HashMap<RenderBlock*, RenderBlockSelectionInfo*> SelectedBlockMap;    SelectedBlockMap oldSelectedBlocks;    SelectedBlockMap newSelectedBlocks;    RenderObject* os = m_selectionStart;    RenderObject* stop = rendererAfterPosition(m_selectionEnd, m_selectionEndPos);    while (os && os != stop) {        if ((os->canBeSelectionLeaf() || os == m_selectionStart || os == m_selectionEnd) && os->selectionState() != SelectionNone) {            // Blocks are responsible for painting line gaps and margin gaps.  They must be examined as well.            oldSelectedObjects.set(os, new RenderSelectionInfo(os, true));            RenderBlock* cb = os->containingBlock();            while (cb && !cb->isRenderView()) {                RenderBlockSelectionInfo* blockInfo = oldSelectedBlocks.get(cb);                if (blockInfo)                    break;                oldSelectedBlocks.set(cb, new RenderBlockSelectionInfo(cb));                cb = cb->containingBlock();            }        }        os = os->nextInPreOrder();    }    // Now clear the selection.    SelectedObjectMap::iterator oldObjectsEnd = oldSelectedObjects.end();    for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i)        i->first->setSelectionState(SelectionNone);    // set selection start and end    m_selectionStart = start;    m_selectionStartPos = startPos;    m_selectionEnd = end;    m_selectionEndPos = endPos;    // Update the selection status of all objects between m_selectionStart and m_selectionEnd    if (start && start == end)        start->setSelectionState(SelectionBoth);    else {        if (start)            start->setSelectionState(SelectionStart);        if (end)            end->setSelectionState(SelectionEnd);    }    RenderObject* o = start;    stop = rendererAfterPosition(end, endPos);    while (o && o != stop) {        if (o != start && o != end && o->canBeSelectionLeaf())            o->setSelectionState(SelectionInside);        o = o->nextInPreOrder();    }    // Now that the selection state has been updated for the new objects, walk them again and    // put them in the new objects list.    o = start;    while (o && o != stop) {        if ((o->canBeSelectionLeaf() || o == start || o == end) && o->selectionState() != SelectionNone) {            newSelectedObjects.set(o, new RenderSelectionInfo(o, true));            RenderBlock* cb = o->containingBlock();            while (cb && !cb->isRenderView()) {                RenderBlockSelectionInfo* blockInfo = newSelectedBlocks.get(cb);                if (blockInfo)                    break;                newSelectedBlocks.set(cb, new RenderBlockSelectionInfo(cb));                cb = cb->containingBlock();            }        }        o = o->nextInPreOrder();    }    if (!m_frameView) {        // We built the maps, but we aren't going to use them.        // We need to delete the values, otherwise they'll all leak!        deleteAllValues(oldSelectedObjects);        deleteAllValues(newSelectedObjects);        deleteAllValues(oldSelectedBlocks);        deleteAllValues(newSelectedBlocks);        return;    }    // Have any of the old selected objects changed compared to the new selection?    for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i) {        RenderObject* obj = i->first;        RenderSelectionInfo* newInfo = newSelectedObjects.get(obj);        RenderSelectionInfo* oldInfo = i->second;        if (!newInfo || oldInfo->rect() != newInfo->rect() || oldInfo->state() != newInfo->state() ||            (m_selectionStart == obj && oldStartPos != m_selectionStartPos) ||            (m_selectionEnd == obj && oldEndPos != m_selectionEndPos)) {            oldInfo->repaint();            if (newInfo) {                newInfo->repaint();                newSelectedObjects.remove(obj);                delete newInfo;            }        }        delete oldInfo;    }    // Any new objects that remain were not found in the old objects dict, and so they need to be updated.    SelectedObjectMap::iterator newObjectsEnd = newSelectedObjects.end();    for (SelectedObjectMap::iterator i = newSelectedObjects.begin(); i != newObjectsEnd; ++i) {        RenderSelectionInfo* newInfo = i->second;        newInfo->repaint();        delete newInfo;    }    // Have any of the old blocks changed?    SelectedBlockMap::iterator oldBlocksEnd = oldSelectedBlocks.end();    for (SelectedBlockMap::iterator i = oldSelectedBlocks.begin(); i != oldBlocksEnd; ++i) {        RenderBlock* block = i->first;        RenderBlockSelectionInfo* newInfo = newSelectedBlocks.get(block);        RenderBlockSelectionInfo* oldInfo = i->second;        if (!newInfo || oldInfo->rects() != newInfo->rects() || oldInfo->state() != newInfo->state()) {            oldInfo->repaint();            if (newInfo) {                newInfo->repaint();                newSelectedBlocks.remove(block);                delete newInfo;            }        }        delete oldInfo;    }    // Any new blocks that remain were not found in the old blocks dict, and so they need to be updated.    SelectedBlockMap::iterator newBlocksEnd = newSelectedBlocks.end();    for (SelectedBlockMap::iterator i = newSelectedBlocks.begin(); i != newBlocksEnd; ++i) {        RenderBlockSelectionInfo* newInfo = i->second;        newInfo->repaint();        delete newInfo;    }}void RenderView::clearSelection(){    setSelection(0, -1, 0, -1);}void RenderView::selectionStartEnd(int& startPos, int& endPos) const{    startPos = m_selectionStartPos;    endPos = m_selectionEndPos;}bool RenderView::printing() const{    return document()->printing();}void RenderView::updateWidgetPositions(){    RenderWidgetSet::iterator end = m_widgets.end();    for (RenderWidgetSet::iterator it = m_widgets.begin(); it != end; ++it)        (*it)->updateWidgetPosition();}void RenderView::addWidget(RenderWidget* o){    m_widgets.add(o);}void RenderView::removeWidget(RenderWidget* o){    m_widgets.remove(o);}IntRect RenderView::viewRect() const{    if (printing())        return IntRect(0, 0, width(), height());    if (m_frameView)        return m_frameView->visibleContentRect();    return IntRect();}int RenderView::docHeight() const{    int h = height();    int lowestPos = lowestPosition();    if (lowestPos > h)        h = lowestPos;    // FIXME: This doesn't do any margin collapsing.    // Instead of this dh computation we should keep the result    // when we call RenderBlock::layout.    int dh = 0;    for (RenderBox* c = firstChildBox(); c; c = c->nextSiblingBox())        dh += c->height() + c->marginTop() + c->marginBottom();    if (dh > h)        h = dh;    return h;}int RenderView::docWidth() const{    int w = width();    int rightmostPos = rightmostPosition();    if (rightmostPos > w)        w = rightmostPos;        for (RenderBox* c = firstChildBox(); c; c = c->nextSiblingBox()) {        int dw = c->width() + c->marginLeft() + c->marginRight();        if (dw > w)            w = dw;    }    return w;}int RenderView::viewHeight() const{    int height = 0;    if (!printing() && m_frameView) {        height = m_frameView->layoutHeight();        height = m_frameView->useFixedLayout() ? ceilf(style()->effectiveZoom() * float(height)) : height;    }    return height;}int RenderView::viewWidth() const{    int width = 0;    if (!printing() && m_frameView) {        width = m_frameView->layoutWidth();        width = m_frameView->useFixedLayout() ? ceilf(style()->effectiveZoom() * float(width)) : width;    }    return width;}float RenderView::zoomFactor() const{    if (m_frameView->frame() && m_frameView->frame()->shouldApplyPageZoom())        return m_frameView->frame()->zoomFactor();    return 1.0f;}// The idea here is to take into account what object is moving the pagination point, and// thus choose the best place to chop it.void RenderView::setBestTruncatedAt(int y, RenderBoxModelObject* forRenderer, bool forcedBreak){    // Nobody else can set a page break once we have a forced break.    if (m_forcedPageBreak)        return;    // Forced breaks always win over unforced breaks.    if (forcedBreak) {        m_forcedPageBreak = true;        m_bestTruncatedAt = y;        return;    }    // Prefer the widest object that tries to move the pagination point    IntRect boundingBox = forRenderer->borderBoundingBox();    if (boundingBox.width() > m_truncatorWidth) {        m_truncatorWidth = boundingBox.width();        m_bestTruncatedAt = y;    }}void RenderView::pushLayoutState(RenderObject* root){    ASSERT(!doingFullRepaint());    ASSERT(m_layoutStateDisableCount == 0);    ASSERT(m_layoutState == 0);    m_layoutState = new (renderArena()) LayoutState(root);}void RenderView::updateHitTestResult(HitTestResult& result, const IntPoint& point){    if (result.innerNode())        return;    Node* node = document()->documentElement();    if (node) {        result.setInnerNode(node);        if (!result.innerNonSharedNode())            result.setInnerNonSharedNode(node);        result.setLocalPoint(point);    }}#if USE(ACCELERATED_COMPOSITING)bool RenderView::usesCompositing() const{    return m_compositor && m_compositor->inCompositingMode();}RenderLayerCompositor* RenderView::compositor(){    if (!m_compositor)        m_compositor.set(new RenderLayerCompositor(this));    return m_compositor.get();}#endifvoid RenderView::didMoveOnscreen(){#if USE(ACCELERATED_COMPOSITING)    if (m_compositor)        m_compositor->didMoveOnscreen();#endif}void RenderView::willMoveOffscreen(){#if USE(ACCELERATED_COMPOSITING)    if (m_compositor)        m_compositor->willMoveOffscreen();#endif}} // namespace WebCore

⌨️ 快捷键说明

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