Commit 53bcd7d4 authored by bdakin@apple.com's avatar bdakin@apple.com

Fix for <rdar://problem/8944558> Overlay scrollers in overflow areas need to

send notifications appropriate times (showing up, resizing)
-and corresponding-
https://bugs.webkit.org/show_bug.cgi?id=56067

Reviewed by Darin Adler.

The general strategy here is to add a HashSet of ScrollableAreas to the page that 
can be accessed when necessary to send notifications to all ScrollableAreas. In 
turn, all of the ScrollableArea classes that add themselves to the HashSet must 
keep a weak pointer to Page so that they can remove themselves without relying on 
Frames or Renderers to still have references.

Find layers for relevant node and if the layers are in the Page's ScrollableArea 
set, then send the relevant notification.
* page/EventHandler.cpp:
(WebCore::layerForNode):
(WebCore::EventHandler::mouseMoved):
(WebCore::EventHandler::updateMouseEventTargetNode):

When the page is set active or not active, iterate through the Page's 
ScrollableAreas to send hide/show notifications. 
* page/FocusController.cpp:
(WebCore::FocusController::setActive):

When a FrameView is created, add it to the ScrollableArea set. When it's 
destroyed, remove it.
* page/FrameView.cpp:
(WebCore::FrameView::FrameView):
(WebCore::FrameView::~FrameView):

Iterate through the Page's ScrollableAreas to send the paint notification.
(WebCore::FrameView::notifyPageThatContentAreaWillPaint):
* page/FrameView.h:
(WebCore::FrameView::disconnectFromPage):

Add the new ScrollableArea set.
* page/Page.cpp:
(WebCore::Page::~Page):
(WebCore::Page::addScrollableArea):



git-svn-id: svn://svn.chromium.org/blink/trunk@81209 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 56c89da5
2011-03-15 Beth Dakin <bdakin@apple.com>
Reviewed by Darin Adler.
Fix for <rdar://problem/8944558> Overlay scrollers in overflow areas need to
send notifications appropriate times (showing up, resizing)
-and corresponding-
https://bugs.webkit.org/show_bug.cgi?id=56067
The general strategy here is to add a HashSet of ScrollableAreas to the page that
can be accessed when necessary to send notifications to all ScrollableAreas. In
turn, all of the ScrollableArea classes that add themselves to the HashSet must
keep a weak pointer to Page so that they can remove themselves without relying on
Frames or Renderers to still have references.
Find layers for relevant node and if the layers are in the Page's ScrollableArea
set, then send the relevant notification.
* page/EventHandler.cpp:
(WebCore::layerForNode):
(WebCore::EventHandler::mouseMoved):
(WebCore::EventHandler::updateMouseEventTargetNode):
When the page is set active or not active, iterate through the Page's
ScrollableAreas to send hide/show notifications.
* page/FocusController.cpp:
(WebCore::FocusController::setActive):
When a FrameView is created, add it to the ScrollableArea set. When it's
destroyed, remove it.
* page/FrameView.cpp:
(WebCore::FrameView::FrameView):
(WebCore::FrameView::~FrameView):
Iterate through the Page's ScrollableAreas to send the paint notification.
(WebCore::FrameView::notifyPageThatContentAreaWillPaint):
* page/FrameView.h:
(WebCore::FrameView::disconnectFromPage):
Add the new ScrollableArea set.
* page/Page.cpp:
(WebCore::Page::~Page):
(WebCore::Page::addScrollableArea):
(WebCore::Page::removeScrollableArea):
(WebCore::Page::containsScrollableArea):
* page/Page.h:
(WebCore::Page::scrollableAreaSet):
notifyPageThatContentAreaWillPaint() is a dummy function implemented in FrameView.
* platform/ScrollView.cpp:
(WebCore::ScrollView::notifyPageThatContentAreaWillPaint):
Call notifyPageThatContentAreaWillPaint() instead of calling
contentAreaWillPaint() just for the ScrollView.
(WebCore::ScrollView::paint):
* platform/ScrollView.h:
Add/remove ScrollableAreas to the set. Add new disconnectFromPage().
* platform/ScrollableArea.h:
(WebCore::ScrollableArea::disconnectFromPage):
* rendering/RenderDataGrid.cpp:
(WebCore::RenderDataGrid::RenderDataGrid):
(WebCore::RenderDataGrid::~RenderDataGrid):
* rendering/RenderDataGrid.h:
(WebCore::RenderDataGrid::disconnectFromPage):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::RenderLayer):
(WebCore::RenderLayer::~RenderLayer):
* rendering/RenderLayer.h:
(WebCore::RenderLayer::disconnectFromPage):
* rendering/RenderListBox.cpp:
(WebCore::RenderListBox::RenderListBox):
(WebCore::RenderListBox::~RenderListBox):
* rendering/RenderListBox.h:
(WebCore::RenderListBox::disconnectFromPage):
Should have implemented this ScrollableArea-interface function a while ago.
(WebCore::RenderLayer::currentMousePosition):
2011-03-15 Brady Eidson <beidson@apple.com> 2011-03-15 Brady Eidson <beidson@apple.com>
Reviewed by Sam Weinig. Reviewed by Sam Weinig.
......
...@@ -1452,6 +1452,22 @@ bool EventHandler::handleMouseDoubleClickEvent(const PlatformMouseEvent& mouseEv ...@@ -1452,6 +1452,22 @@ bool EventHandler::handleMouseDoubleClickEvent(const PlatformMouseEvent& mouseEv
return swallowMouseUpEvent || swallowClickEvent || swallowMouseReleaseEvent; return swallowMouseUpEvent || swallowClickEvent || swallowMouseReleaseEvent;
} }
static RenderLayer* layerForNode(Node* node)
{
if (!node)
return 0;
RenderObject* renderer = node->renderer();
if (!renderer)
return 0;
RenderLayer* layer = renderer->enclosingLayer();
if (!layer)
return 0;
return layer;
}
bool EventHandler::mouseMoved(const PlatformMouseEvent& event) bool EventHandler::mouseMoved(const PlatformMouseEvent& event)
{ {
HitTestResult hoveredNode = HitTestResult(IntPoint()); HitTestResult hoveredNode = HitTestResult(IntPoint());
...@@ -1461,6 +1477,11 @@ bool EventHandler::mouseMoved(const PlatformMouseEvent& event) ...@@ -1461,6 +1477,11 @@ bool EventHandler::mouseMoved(const PlatformMouseEvent& event)
if (!page) if (!page)
return result; return result;
if (RenderLayer* layer = layerForNode(hoveredNode.innerNode())) {
if (page->containsScrollableArea(layer))
layer->scrollAnimator()->mouseMovedInContentArea();
}
if (FrameView* frameView = m_frame->view()) if (FrameView* frameView = m_frame->view())
frameView->scrollAnimator()->mouseMovedInContentArea(); frameView->scrollAnimator()->mouseMovedInContentArea();
...@@ -1871,21 +1892,32 @@ void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo ...@@ -1871,21 +1892,32 @@ void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo
// Fire mouseout/mouseover if the mouse has shifted to a different node. // Fire mouseout/mouseover if the mouse has shifted to a different node.
if (fireMouseOverOut) { if (fireMouseOverOut) {
// FIXME: This code will only correctly handle transitions between frames with scrollbars, RenderLayer* layerForLastNode = layerForNode(m_lastNodeUnderMouse.get());
// not transitions between overflow regions, or transitions between two frames RenderLayer* layerForNodeUnderMouse = layerForNode(m_nodeUnderMouse.get());
// that don't have scrollbars contained within a frame that does. Page* page = m_frame->page();
if (m_lastNodeUnderMouse && (!m_nodeUnderMouse || m_nodeUnderMouse->document() != m_frame->document())) { if (m_lastNodeUnderMouse && (!m_nodeUnderMouse || m_nodeUnderMouse->document() != m_frame->document())) {
// The mouse has moved between frames.
if (Frame* frame = m_lastNodeUnderMouse->document()->frame()) { if (Frame* frame = m_lastNodeUnderMouse->document()->frame()) {
if (FrameView* frameView = frame->view()) if (FrameView* frameView = frame->view())
frameView->scrollAnimator()->mouseExitedContentArea(); frameView->scrollAnimator()->mouseExitedContentArea();
} }
} else if (page && (layerForLastNode && (!layerForNodeUnderMouse || layerForNodeUnderMouse != layerForLastNode))) {
// The mouse has moved between layers.
if (page->containsScrollableArea(layerForLastNode))
layerForLastNode->scrollAnimator()->mouseExitedContentArea();
} }
if (m_nodeUnderMouse && (!m_lastNodeUnderMouse || m_lastNodeUnderMouse->document() != m_frame->document())) { if (m_nodeUnderMouse && (!m_lastNodeUnderMouse || m_lastNodeUnderMouse->document() != m_frame->document())) {
// The mouse has moved between frames.
if (Frame* frame = m_nodeUnderMouse->document()->frame()) { if (Frame* frame = m_nodeUnderMouse->document()->frame()) {
if (FrameView* frameView = frame->view()) if (FrameView* frameView = frame->view())
frameView->scrollAnimator()->mouseEnteredContentArea(); frameView->scrollAnimator()->mouseEnteredContentArea();
} }
} else if (page && (layerForNodeUnderMouse && (!layerForLastNode || layerForNodeUnderMouse != layerForLastNode))) {
// The mouse has moved between layers.
if (page->containsScrollableArea(layerForNodeUnderMouse))
layerForNodeUnderMouse->scrollAnimator()->mouseEnteredContentArea();
} }
if (m_lastNodeUnderMouse && m_lastNodeUnderMouse->document() != m_frame->document()) { if (m_lastNodeUnderMouse && m_lastNodeUnderMouse->document() != m_frame->document()) {
......
...@@ -410,11 +410,16 @@ void FocusController::setActive(bool active) ...@@ -410,11 +410,16 @@ void FocusController::setActive(bool active)
view->updateLayoutAndStyleIfNeededRecursive(); view->updateLayoutAndStyleIfNeededRecursive();
view->updateControlTints(); view->updateControlTints();
} }
// FIXME: This should propogate to all ScrollableAreas.
if (!active) if (const HashSet<ScrollableArea*>* scrollableAreas = m_page->scrollableAreaSet()) {
view->scrollAnimator()->contentAreaDidHide(); HashSet<ScrollableArea*>::const_iterator end = scrollableAreas->end();
else for (HashSet<ScrollableArea*>::const_iterator it = scrollableAreas->begin(); it != end; ++it) {
view->scrollAnimator()->contentAreaDidShow(); if (!active)
(*it)->scrollAnimator()->contentAreaDidHide();
else
(*it)->scrollAnimator()->contentAreaDidShow();
}
}
} }
focusedOrMainFrame()->selection()->pageActivationChanged(); focusedOrMainFrame()->selection()->pageActivationChanged();
......
...@@ -136,6 +136,13 @@ FrameView::FrameView(Frame* frame) ...@@ -136,6 +136,13 @@ FrameView::FrameView(Frame* frame)
, m_scrollCorner(0) , m_scrollCorner(0)
{ {
init(); init();
if (m_frame) {
if (Page* page = m_frame->page()) {
m_page = page;
m_page->addScrollableArea(this);
}
}
} }
PassRefPtr<FrameView> FrameView::create(Frame* frame) PassRefPtr<FrameView> FrameView::create(Frame* frame)
...@@ -176,6 +183,9 @@ FrameView::~FrameView() ...@@ -176,6 +183,9 @@ FrameView::~FrameView()
ASSERT(!m_scrollCorner); ASSERT(!m_scrollCorner);
ASSERT(m_actionScheduler->isEmpty()); ASSERT(m_actionScheduler->isEmpty());
if (m_page)
m_page->removeScrollableArea(this);
if (m_frame) { if (m_frame) {
ASSERT(m_frame->view() != this || !m_frame->contentRenderer()); ASSERT(m_frame->view() != this || !m_frame->contentRenderer());
RenderPart* renderer = m_frame->ownerRenderer(); RenderPart* renderer = m_frame->ownerRenderer();
...@@ -2055,6 +2065,18 @@ bool FrameView::shouldSuspendScrollAnimations() const ...@@ -2055,6 +2065,18 @@ bool FrameView::shouldSuspendScrollAnimations() const
return m_frame->loader()->state() != FrameStateComplete; return m_frame->loader()->state() != FrameStateComplete;
} }
void FrameView::notifyPageThatContentAreaWillPaint() const
{
Page* page = m_frame->page();
const HashSet<ScrollableArea*>* scrollableAreas = page->scrollableAreaSet();
if (!scrollableAreas)
return;
HashSet<ScrollableArea*>::const_iterator end = scrollableAreas->end();
for (HashSet<ScrollableArea*>::const_iterator it = scrollableAreas->begin(); it != end; ++it)
(*it)->scrollAnimator()->contentAreaWillPaint();
}
#if ENABLE(DASHBOARD_SUPPORT) #if ENABLE(DASHBOARD_SUPPORT)
void FrameView::updateDashboardRegions() void FrameView::updateDashboardRegions()
{ {
......
...@@ -319,6 +319,9 @@ private: ...@@ -319,6 +319,9 @@ private:
virtual void scrollTo(const IntSize&); virtual void scrollTo(const IntSize&);
virtual void didCompleteRubberBand(const IntSize&) const; virtual void didCompleteRubberBand(const IntSize&) const;
virtual void notifyPageThatContentAreaWillPaint() const;
virtual void disconnectFromPage() { m_page = 0; }
void deferredRepaintTimerFired(Timer<FrameView>*); void deferredRepaintTimerFired(Timer<FrameView>*);
void doDeferredRepaints(); void doDeferredRepaints();
void updateDeferredRepaintDelay(); void updateDeferredRepaintDelay();
...@@ -418,6 +421,8 @@ private: ...@@ -418,6 +421,8 @@ private:
// Renderer to hold our custom scroll corner. // Renderer to hold our custom scroll corner.
RenderScrollbarPart* m_scrollCorner; RenderScrollbarPart* m_scrollCorner;
Page* m_page;
static double s_deferredRepaintDelay; static double s_deferredRepaintDelay;
static double s_initialDeferredRepaintDelayDuringLoading; static double s_initialDeferredRepaintDelayDuringLoading;
static double s_maxDeferredRepaintDelayDuringLoading; static double s_maxDeferredRepaintDelayDuringLoading;
......
...@@ -191,6 +191,12 @@ Page::~Page() ...@@ -191,6 +191,12 @@ Page::~Page()
for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
frame->pageDestroyed(); frame->pageDestroyed();
if (m_scrollableAreaSet) {
ScrollableAreaSet::const_iterator end = m_scrollableAreaSet->end();
for (ScrollableAreaSet::const_iterator it = m_scrollableAreaSet->begin(); it != end; ++it)
(*it)->disconnectFromPage();
}
m_editorClient->pageDestroyed(); m_editorClient->pageDestroyed();
InspectorInstrumentation::inspectedPageDestroyed(this); InspectorInstrumentation::inspectedPageDestroyed(this);
...@@ -892,6 +898,27 @@ void Page::didStopPlugin(HaltablePlugin* obj) ...@@ -892,6 +898,27 @@ void Page::didStopPlugin(HaltablePlugin* obj)
m_pluginHalter->didStopPlugin(obj); m_pluginHalter->didStopPlugin(obj);
} }
void Page::addScrollableArea(ScrollableArea* scrollableArea)
{
if (!m_scrollableAreaSet)
m_scrollableAreaSet = adoptPtr(new ScrollableAreaSet);
m_scrollableAreaSet->add(scrollableArea);
}
void Page::removeScrollableArea(ScrollableArea* scrollableArea)
{
if (!m_scrollableAreaSet)
return;
m_scrollableAreaSet->remove(scrollableArea);
}
bool Page::containsScrollableArea(ScrollableArea* scrollableArea) const
{
if (!m_scrollableAreaSet)
return false;
return m_scrollableAreaSet->contains(scrollableArea);
}
#if !ASSERT_DISABLED #if !ASSERT_DISABLED
void Page::checkFrameCountConsistency() const void Page::checkFrameCountConsistency() const
{ {
......
...@@ -70,6 +70,7 @@ namespace WebCore { ...@@ -70,6 +70,7 @@ namespace WebCore {
class ProgressTracker; class ProgressTracker;
class RenderTheme; class RenderTheme;
class VisibleSelection; class VisibleSelection;
class ScrollableArea;
class SelectionController; class SelectionController;
class Settings; class Settings;
class SharedGraphicsContext3D; class SharedGraphicsContext3D;
...@@ -279,6 +280,12 @@ namespace WebCore { ...@@ -279,6 +280,12 @@ namespace WebCore {
void setJavaScriptURLsAreAllowed(bool); void setJavaScriptURLsAreAllowed(bool);
bool javaScriptURLsAreAllowed() const; bool javaScriptURLsAreAllowed() const;
typedef HashSet<ScrollableArea*> ScrollableAreaSet;
void addScrollableArea(ScrollableArea*);
void removeScrollableArea(ScrollableArea*);
bool containsScrollableArea(ScrollableArea*) const;
const ScrollableAreaSet* scrollableAreaSet() const { return m_scrollableAreaSet.get(); }
// Don't allow more than a certain number of frames in a page. // Don't allow more than a certain number of frames in a page.
// This seems like a reasonable upper bound, and otherwise mutually // This seems like a reasonable upper bound, and otherwise mutually
// recursive frameset pages can quickly bring the program to its knees // recursive frameset pages can quickly bring the program to its knees
...@@ -386,6 +393,8 @@ namespace WebCore { ...@@ -386,6 +393,8 @@ namespace WebCore {
ViewportArguments m_viewportArguments; ViewportArguments m_viewportArguments;
double m_minimumTimerInterval; double m_minimumTimerInterval;
OwnPtr<ScrollableAreaSet> m_scrollableAreaSet;
}; };
} // namespace WebCore } // namespace WebCore
......
...@@ -327,6 +327,10 @@ void ScrollView::didCompleteRubberBand(const IntSize&) const ...@@ -327,6 +327,10 @@ void ScrollView::didCompleteRubberBand(const IntSize&) const
{ {
} }
void ScrollView::notifyPageThatContentAreaWillPaint() const
{
}
void ScrollView::setScrollOffset(const IntPoint& offset) void ScrollView::setScrollOffset(const IntPoint& offset)
{ {
int horizontalOffset = offset.x(); int horizontalOffset = offset.x();
...@@ -917,7 +921,7 @@ void ScrollView::paint(GraphicsContext* context, const IntRect& rect) ...@@ -917,7 +921,7 @@ void ScrollView::paint(GraphicsContext* context, const IntRect& rect)
if (context->paintingDisabled() && !context->updatingControlTints()) if (context->paintingDisabled() && !context->updatingControlTints())
return; return;
scrollAnimator()->contentAreaWillPaint(); notifyPageThatContentAreaWillPaint();
IntRect documentDirtyRect = rect; IntRect documentDirtyRect = rect;
documentDirtyRect.intersect(frameRect()); documentDirtyRect.intersect(frameRect());
......
...@@ -62,6 +62,7 @@ public: ...@@ -62,6 +62,7 @@ public:
virtual int scrollPosition(Scrollbar*) const; virtual int scrollPosition(Scrollbar*) const;
virtual void setScrollOffset(const IntPoint&); virtual void setScrollOffset(const IntPoint&);
virtual void didCompleteRubberBand(const IntSize&) const; virtual void didCompleteRubberBand(const IntSize&) const;
virtual void notifyPageThatContentAreaWillPaint() const;
// NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea. // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea.
virtual void scrollTo(const IntSize& newOffset); virtual void scrollTo(const IntSize& newOffset);
......
...@@ -117,6 +117,8 @@ public: ...@@ -117,6 +117,8 @@ public:
virtual void didCompleteRubberBand(const IntSize&) const { ASSERT_NOT_REACHED(); } virtual void didCompleteRubberBand(const IntSize&) const { ASSERT_NOT_REACHED(); }
virtual bool shouldSuspendScrollAnimations() const { return true; } virtual bool shouldSuspendScrollAnimations() const { return true; }
virtual void disconnectFromPage() { }
private: private:
// NOTE: Only called from the ScrollAnimator. // NOTE: Only called from the ScrollAnimator.
friend class ScrollAnimator; friend class ScrollAnimator;
......
...@@ -46,10 +46,16 @@ static const int cDefaultWidth = 300; ...@@ -46,10 +46,16 @@ static const int cDefaultWidth = 300;
RenderDataGrid::RenderDataGrid(Element* elt) RenderDataGrid::RenderDataGrid(Element* elt)
: RenderBlock(elt) : RenderBlock(elt)
{ {
if (Page* page = frame()->page()) {
m_page = page;
m_page->addScrollableArea(this);
}
} }
RenderDataGrid::~RenderDataGrid() RenderDataGrid::~RenderDataGrid()
{ {
if (m_page)
m_page->removeScrollableArea(this);
} }
void RenderDataGrid::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) void RenderDataGrid::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
......
...@@ -79,7 +79,11 @@ private: ...@@ -79,7 +79,11 @@ private:
virtual IntPoint convertFromContainingViewToScrollbar(const Scrollbar*, const IntPoint&) const; virtual IntPoint convertFromContainingViewToScrollbar(const Scrollbar*, const IntPoint&) const;
virtual bool shouldSuspendScrollAnimations() const; virtual bool shouldSuspendScrollAnimations() const;
virtual void disconnectFromPage() { m_page = 0; }
RefPtr<Scrollbar> m_vBar; RefPtr<Scrollbar> m_vBar;
Page* m_page;
}; };
} }
......
...@@ -188,6 +188,13 @@ RenderLayer::RenderLayer(RenderBoxModelObject* renderer) ...@@ -188,6 +188,13 @@ RenderLayer::RenderLayer(RenderBoxModelObject* renderer)
m_visibleContentStatusDirty = false; m_visibleContentStatusDirty = false;
m_hasVisibleContent = renderer->style()->visibility() == VISIBLE; m_hasVisibleContent = renderer->style()->visibility() == VISIBLE;
} }
if (Frame* frame = renderer->frame()) {
if (Page* page = frame->page()) {
m_page = page;
m_page->addScrollableArea(this);
}
}
} }
RenderLayer::~RenderLayer() RenderLayer::~RenderLayer()
...@@ -197,6 +204,9 @@ RenderLayer::~RenderLayer() ...@@ -197,6 +204,9 @@ RenderLayer::~RenderLayer()
frame->eventHandler()->resizeLayerDestroyed(); frame->eventHandler()->resizeLayerDestroyed();
} }
if (m_page)
m_page->removeScrollableArea(this);
destroyScrollbar(HorizontalScrollbar); destroyScrollbar(HorizontalScrollbar);
destroyScrollbar(VerticalScrollbar); destroyScrollbar(VerticalScrollbar);
...@@ -1786,6 +1796,11 @@ bool RenderLayer::shouldSuspendScrollAnimations() const ...@@ -1786,6 +1796,11 @@ bool RenderLayer::shouldSuspendScrollAnimations() const
return view->frameView()->shouldSuspendScrollAnimations(); return view->frameView()->shouldSuspendScrollAnimations();
} }
IntPoint RenderLayer::currentMousePosition() const
{
return renderer()->frame() ? renderer()->frame()->eventHandler()->currentMousePosition() : IntPoint();
}
IntSize RenderLayer::scrollbarOffset(const Scrollbar* scrollbar) const IntSize RenderLayer::scrollbarOffset(const Scrollbar* scrollbar) const
{ {
RenderBox* box = renderBox(); RenderBox* box = renderBox();
......
...@@ -525,8 +525,11 @@ private: ...@@ -525,8 +525,11 @@ private:
virtual IntSize contentsSize() const; virtual IntSize contentsSize() const;
virtual int visibleHeight() const; virtual int visibleHeight() const;
virtual int visibleWidth() const; virtual int visibleWidth() const;
virtual IntPoint currentMousePosition() const;
virtual bool shouldSuspendScrollAnimations() const; virtual bool shouldSuspendScrollAnimations() const;
virtual void disconnectFromPage() { m_page = 0; }
// NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea. // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea.
void scrollTo(int x, int y); void scrollTo(int x, int y);
...@@ -700,6 +703,8 @@ private: ...@@ -700,6 +703,8 @@ private:
#if USE(ACCELERATED_COMPOSITING) #if USE(ACCELERATED_COMPOSITING)
OwnPtr<RenderLayerBacking> m_backing; OwnPtr<RenderLayerBacking> m_backing;
#endif #endif
Page* m_page;
}; };
} // namespace WebCore } // namespace WebCore
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment