diff options
Diffstat (limited to 'WebCore/rendering/RenderView.cpp')
-rw-r--r-- | WebCore/rendering/RenderView.cpp | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/WebCore/rendering/RenderView.cpp b/WebCore/rendering/RenderView.cpp index 094abfd..a95ffdd 100644 --- a/WebCore/rendering/RenderView.cpp +++ b/WebCore/rendering/RenderView.cpp @@ -31,6 +31,7 @@ #include "RenderLayer.h" #include "RenderSelectionInfo.h" #include "RenderWidget.h" +#include "RenderWidgetProtector.h" #include "TransformState.h" #if USE(ACCELERATED_COMPOSITING) @@ -52,6 +53,10 @@ RenderView::RenderView(Node* node, FrameView* view) , m_selectionEndPos(-1) , m_printImages(true) , m_maximalOutlineSize(0) + , m_bestTruncatedAt(0) + , m_truncatorWidth(0) + , m_minimumColumnHeight(0) + , m_forcedPageBreak(false) , m_layoutState(0) , m_layoutStateDisableCount(0) { @@ -577,9 +582,29 @@ bool RenderView::printing() const void RenderView::updateWidgetPositions() { - RenderWidgetSet::iterator end = m_widgets.end(); - for (RenderWidgetSet::iterator it = m_widgets.begin(); it != end; ++it) - (*it)->updateWidgetPosition(); + // updateWidgetPosition() can possibly cause layout to be re-entered (via plug-ins running + // scripts in response to NPP_SetWindow, for example), so we need to keep the Widgets + // alive during enumeration. + + size_t size = m_widgets.size(); + + Vector<RenderWidget*> renderWidgets; + renderWidgets.reserveCapacity(size); + + RenderWidgetSet::const_iterator end = m_widgets.end(); + for (RenderWidgetSet::const_iterator it = m_widgets.begin(); it != end; ++it) { + renderWidgets.uncheckedAppend(*it); + (*it)->ref(); + } + + for (size_t i = 0; i < size; ++i) + renderWidgets[i]->updateWidgetPosition(); + + for (size_t i = 0; i < size; ++i) + renderWidgets[i]->widgetPositionsUpdated(); + + for (size_t i = 0; i < size; ++i) + renderWidgets[i]->deref(renderArena()); } void RenderView::addWidget(RenderWidget* o) @@ -722,6 +747,16 @@ bool RenderView::usesCompositing() const return m_compositor && m_compositor->inCompositingMode(); } +void RenderView::compositingStateChanged(bool) +{ + Element* elt = document()->ownerElement(); + if (!elt) + return; + + // Trigger a recalcStyle in the parent document, to update compositing in that document. + elt->setNeedsStyleRecalc(SyntheticStyleChange); +} + RenderLayerCompositor* RenderView::compositor() { if (!m_compositor) |