summaryrefslogtreecommitdiffstats
path: root/WebCore/rendering/RenderView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/rendering/RenderView.cpp')
-rw-r--r--WebCore/rendering/RenderView.cpp41
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)