void RenderWidget::updateWidgetPosition() { if (!m_widget) return; // FIXME: This doesn't work correctly with transforms. FloatPoint absPos = localToAbsolute(); absPos.move(borderLeft() + paddingLeft(), borderTop() + paddingTop()); int w = width() - borderLeft() - borderRight() - paddingLeft() - paddingRight(); int h = height() - borderTop() - borderBottom() - paddingTop() - paddingBottom(); IntRect newBounds(absPos.x(), absPos.y(), w, h); IntRect oldBounds(m_widget->frameRect()); if (newBounds != oldBounds) { // The widget changed positions. Update the frame geometry. if (checkForRepaintDuringLayout()) { RenderView* v = view(); if (!v->printing()) { // FIXME: do container-relative repaint v->repaintRectangleInViewAndCompositedLayers(oldBounds); v->repaintRectangleInViewAndCompositedLayers(newBounds); } } RenderArena* arena = ref(); element()->ref(); m_widget->setFrameRect(newBounds); element()->deref(); deref(arena); } }
void RenderWidget::updateWidgetPosition() { if (!m_widget) return; int x; int y; absolutePosition(x, y); x += borderLeft() + paddingLeft(); y += borderTop() + paddingTop(); int width = m_width - borderLeft() - borderRight() - paddingLeft() - paddingRight(); int height = m_height - borderTop() - borderBottom() - paddingTop() - paddingBottom(); IntRect newBounds(x, y, width, height); IntRect oldBounds(m_widget->frameGeometry()); if (newBounds != oldBounds) { // The widget changed positions. Update the frame geometry. if (checkForRepaintDuringLayout()) { RenderView* v = view(); if (!v->printing()) { v->repaintViewRectangle(oldBounds); v->repaintViewRectangle(newBounds); } } RenderArena* arena = ref(); element()->ref(); m_widget->setFrameGeometry(newBounds); element()->deref(); deref(arena); } }
void FrameView::performPostLayoutTasks() { if (d->m_firstLayoutCallbackPending) { d->m_firstLayoutCallbackPending = false; m_frame->loader()->didFirstLayout(); } RenderView* root = m_frame->contentRenderer(); root->updateWidgetPositions(); if (m_widgetUpdateSet && d->m_nestedLayoutCount <= 1) { Vector<RenderPartObject*> objectVector; copyToVector(*m_widgetUpdateSet, objectVector); size_t size = objectVector.size(); for (size_t i = 0; i < size; ++i) { RenderPartObject* object = objectVector[i]; object->updateWidget(false); // updateWidget() can destroy the RenderPartObject, so we need to make sure it's // alive by checking if it's still in m_widgetUpdateSet. if (m_widgetUpdateSet->contains(object)) object->updateWidgetPosition(); } m_widgetUpdateSet->clear(); } resumeScheduledEvents(); if (!root->printing()) { IntSize currentSize = IntSize(width(), height()); float currentZoomFactor = root->style()->zoom(); bool resized = !d->m_firstLayout && (currentSize != d->m_lastLayoutSize || currentZoomFactor != d->m_lastZoomFactor); d->m_lastLayoutSize = currentSize; d->m_lastZoomFactor = currentZoomFactor; if (resized) m_frame->sendResizeEvent(); } }