- Fix for <rdar://problem/
4707489> After timers fix, crash below RenderLayer::autoscroll after moving/destroying active <input type="text">
and <rdar://problem/
4707519> After timers fix, crash below RenderLayer::autoscroll after moving/destroying active textarea
* rendering/RenderLayer.cpp: (WebCore::RenderLayer::~RenderLayer): If the renderer is being autoscrolled, then stop the autoscroll timer.
* rendering/RenderListBox.cpp: (WebCore::RenderListBox::~RenderListBox): ditto.
* page/Frame.cpp: Added getter and setter for the renderer being autoscrolled.
(WebCore::Frame::handleAutoscroll):
(WebCore::Frame::autoscrollTimerFired):
(WebCore::Frame::autoscrollRenderer):
(WebCore::Frame::setAutoscrollRenderer):
(WebCore::Frame::stopAutoscrollTimer):
* page/Frame.h:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@16833
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2006-10-05 Adele Peterson <adele@apple.com>
+
+ Reviewed by Maciej.
+
+ - Fix for <rdar://problem/4707489> After timers fix, crash below RenderLayer::autoscroll after moving/destroying active <input type="text">
+ and <rdar://problem/4707519> After timers fix, crash below RenderLayer::autoscroll after moving/destroying active textarea
+
+ * rendering/RenderLayer.cpp: (WebCore::RenderLayer::~RenderLayer): If the renderer is being autoscrolled, then stop the autoscroll timer.
+ * rendering/RenderListBox.cpp: (WebCore::RenderListBox::~RenderListBox): ditto.
+
+ * page/Frame.cpp: Added getter and setter for the renderer being autoscrolled.
+ (WebCore::Frame::handleAutoscroll):
+ (WebCore::Frame::autoscrollTimerFired):
+ (WebCore::Frame::autoscrollRenderer):
+ (WebCore::Frame::setAutoscrollRenderer):
+ (WebCore::Frame::stopAutoscrollTimer):
+ * page/Frame.h:
+
2006-10-05 Don Gibson <dgibson77@gmail.com>
Reviewed by Eric.
{
if (d->m_autoscrollTimer.isActive())
return;
- d->m_autoscrollRenderer = renderer;
+ setAutoscrollRenderer(renderer);
startAutoscrollTimer();
}
stopAutoscrollTimer();
return;
}
- if (d->m_autoscrollRenderer) {
- d->m_autoscrollRenderer->autoscroll();
+ if (RenderObject* r = autoscrollRenderer()) {
+ r->autoscroll();
}
}
+RenderObject* Frame::autoscrollRenderer() const
+{
+ return d->m_autoscrollRenderer;
+}
+
+void Frame::setAutoscrollRenderer(RenderObject* renderer)
+{
+ d->m_autoscrollRenderer = renderer;
+}
+
RenderObject::NodeInfo Frame::nodeInfoAtPoint(const IntPoint& point, bool allowShadowContent)
{
RenderObject::NodeInfo nodeInfo(true, true);
void Frame::stopAutoscrollTimer()
{
- d->m_autoscrollRenderer = 0;
+ setAutoscrollRenderer(0);
d->m_autoscrollTimer.stop();
}
void replaceContentsWithScriptResult(const KURL& url);
- void disconnectOwnerElement();
+ void disconnectOwnerElement();
- void setNeedsReapplyStyles();
+ void setNeedsReapplyStyles();
+
+ void stopAutoscrollTimer();
+ RenderObject* autoscrollRenderer() const;
protected:
virtual void startRedirectionTimer();
void handleAutoscroll(RenderObject*);
void startAutoscrollTimer();
- void stopAutoscrollTimer();
+ void setAutoscrollRenderer(RenderObject*);
private:
void emitLoadEvent();
RenderLayer::~RenderLayer()
{
+ // If this layer is being autoscrolled, stop the autoscroll timer
+ if (m_object && m_object->document() && m_object->document()->frame() && m_object->document()->frame()->autoscrollRenderer() == m_object)
+ m_object->document()->frame()->stopAutoscrollTimer();
+
destroyScrollbar(HorizontalScrollbar);
destroyScrollbar(VerticalScrollbar);
RenderListBox::~RenderListBox()
{
+ // If this list box is being autoscrolled, stop the autoscroll timer
+ if (document() && document()->frame() && document()->frame()->autoscrollRenderer() == this)
+ document()->frame()->stopAutoscrollTimer();
+
if (m_vBar && m_vBar->isWidget()) {
element()->document()->view()->removeChild(static_cast<PlatformScrollbar*>(m_vBar));
m_vBar->deref();