WebCore:
authorhyatt@apple.com <hyatt@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 2 Oct 2008 20:17:08 +0000 (20:17 +0000)
committerhyatt@apple.com <hyatt@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 2 Oct 2008 20:17:08 +0000 (20:17 +0000)
2008-10-02  David Hyatt  <hyatt@apple.com>

        https://bugs.webkit.org/show_bug.cgi?id=21314

        Make scrollBackingStore cross-platform.

        Reviewed by Sam Weinig

        * loader/EmptyClients.h:
        (WebCore::EmptyChromeClient::repaint):
        (WebCore::EmptyChromeClient::scroll):
        * page/Chrome.cpp:
        (WebCore::Chrome::repaint):
        (WebCore::Chrome::scroll):
        * page/Chrome.h:
        * page/ChromeClient.h:
        * page/EventHandler.cpp:
        (WebCore::EventHandler::handleAutoscroll):
        * platform/HostWindow.h:
        * platform/ScrollView.cpp:
        (WebCore::ScrollView::scrollContents):
        (WebCore::ScrollView::addPanScrollIcon):
        (WebCore::ScrollView::removePanScrollIcon):
        * platform/ScrollView.h:
        * platform/gtk/ScrollViewGtk.cpp:
        * platform/qt/ScrollViewQt.cpp:
        (WebCore::ScrollView::ScrollViewPrivate::ScrollViewPrivate):
        (WebCore::ScrollView::~ScrollView):
        * platform/win/ScrollViewWin.cpp:
        (WebCore::ScrollView::ScrollView):
        (WebCore::ScrollView::~ScrollView):

WebKit/gtk:

2008-10-02  David Hyatt  <hyatt@apple.com>

        https://bugs.webkit.org/show_bug.cgi?id=21314

        Make scrollBackingStore cross-platform.

        Reviewed by Sam Weinig

        * WebCoreSupport/ChromeClientGtk.cpp:
        (WebKit::ChromeClient::repaint):
        (WebKit::ChromeClient::scroll):
        * WebCoreSupport/ChromeClientGtk.h:

WebKit/mac:

2008-10-02  David Hyatt  <hyatt@apple.com>

        https://bugs.webkit.org/show_bug.cgi?id=21314

        Make scrollBackingStore cross-platform.

        Reviewed by Sam Weinig

        * WebCoreSupport/WebChromeClient.h:
        * WebCoreSupport/WebChromeClient.mm:
        (WebChromeClient::repaint):
        (WebChromeClient::scroll):

WebKit/qt:

2008-10-02  David Hyatt  <hyatt@apple.com>

        https://bugs.webkit.org/show_bug.cgi?id=21314

        Make scrollBackingStore cross-platform.

        Reviewed by Sam Weinig

        * WebCoreSupport/ChromeClientQt.cpp:
        (WebCore::ChromeClientQt::repaint):
        (WebCore::ChromeClientQt::scroll):
        * WebCoreSupport/ChromeClientQt.h:

WebKit/win:

2008-10-02  David Hyatt  <hyatt@apple.com>

        https://bugs.webkit.org/show_bug.cgi?id=21314

        Make scrollBackingStore cross-platform.

        Reviewed by Sam Weinig

        * WebCoreSupport/WebChromeClient.cpp:
        (WebChromeClient::repaint):
        (WebChromeClient::scroll):
        * WebCoreSupport/WebChromeClient.h:
        * WebView.cpp:
        (WebView::repaint):
        * WebView.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@37204 268f45cc-cd09-0410-ab3c-d52691b4dbfc

26 files changed:
WebCore/ChangeLog
WebCore/loader/EmptyClients.h
WebCore/page/Chrome.cpp
WebCore/page/Chrome.h
WebCore/page/ChromeClient.h
WebCore/page/EventHandler.cpp
WebCore/platform/HostWindow.h
WebCore/platform/ScrollView.cpp
WebCore/platform/ScrollView.h
WebCore/platform/gtk/ScrollViewGtk.cpp
WebCore/platform/qt/ScrollViewQt.cpp
WebCore/platform/win/ScrollViewWin.cpp
WebKit/gtk/ChangeLog
WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp
WebKit/gtk/WebCoreSupport/ChromeClientGtk.h
WebKit/mac/ChangeLog
WebKit/mac/WebCoreSupport/WebChromeClient.h
WebKit/mac/WebCoreSupport/WebChromeClient.mm
WebKit/qt/ChangeLog
WebKit/qt/WebCoreSupport/ChromeClientQt.cpp
WebKit/qt/WebCoreSupport/ChromeClientQt.h
WebKit/win/ChangeLog
WebKit/win/WebCoreSupport/WebChromeClient.cpp
WebKit/win/WebCoreSupport/WebChromeClient.h
WebKit/win/WebView.cpp
WebKit/win/WebView.h

index a1775ccb6fbe484c93ec65ab4c71d6d40e99afac..8ccd1aa810adfcab5aadfb4cc455c0ca6692b9e0 100644 (file)
@@ -1,3 +1,35 @@
+2008-10-02  David Hyatt  <hyatt@apple.com>
+
+        https://bugs.webkit.org/show_bug.cgi?id=21314
+        
+        Make scrollBackingStore cross-platform.
+
+        Reviewed by Sam Weinig
+
+        * loader/EmptyClients.h:
+        (WebCore::EmptyChromeClient::repaint):
+        (WebCore::EmptyChromeClient::scroll):
+        * page/Chrome.cpp:
+        (WebCore::Chrome::repaint):
+        (WebCore::Chrome::scroll):
+        * page/Chrome.h:
+        * page/ChromeClient.h:
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleAutoscroll):
+        * platform/HostWindow.h:
+        * platform/ScrollView.cpp:
+        (WebCore::ScrollView::scrollContents):
+        (WebCore::ScrollView::addPanScrollIcon):
+        (WebCore::ScrollView::removePanScrollIcon):
+        * platform/ScrollView.h:
+        * platform/gtk/ScrollViewGtk.cpp:
+        * platform/qt/ScrollViewQt.cpp:
+        (WebCore::ScrollView::ScrollViewPrivate::ScrollViewPrivate):
+        (WebCore::ScrollView::~ScrollView):
+        * platform/win/ScrollViewWin.cpp:
+        (WebCore::ScrollView::ScrollView):
+        (WebCore::ScrollView::~ScrollView):
+
 2008-10-02  Kevin Ollivier  <kevino@theolliviers.com>
 
         wx build fixes after Frame/ScrollView changes.
index df1e2252ead4303b81d339727e6fe74ff394c6ee..60964713ecd5a7513a0973952faca1e9fb69a442 100644 (file)
@@ -113,7 +113,8 @@ public:
     virtual void scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect) { }
     virtual void updateBackingStore() { }
 
-    virtual void repaint(const IntRect&, bool contentChanged, bool immediate = false) { }
+    virtual void repaint(const IntRect&, bool contentChanged, bool immediate = false, bool repaintContentOnly = false) { }
+    virtual void scroll(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) { }
     virtual IntPoint screenToWindow(const IntPoint& p) const { return p; }
     virtual IntRect windowToScreen(const IntRect& r) const { return r; }
 
index 906ec4786ee5a35b64bbb453192a80f1a8f464e7..13b43a9826e0777116bc3f71b742351e19a686a1 100644 (file)
@@ -76,9 +76,14 @@ Chrome::~Chrome()
     m_client->chromeDestroyed();
 }
 
-void Chrome::repaint(const IntRect& windowRect, bool contentChanged, bool immediate)
+void Chrome::repaint(const IntRect& windowRect, bool contentChanged, bool immediate, bool repaintContentOnly)
 {
-    m_client->repaint(windowRect, contentChanged, immediate);
+    m_client->repaint(windowRect, contentChanged, immediate, repaintContentOnly);
+}
+
+void Chrome::scroll(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect)
+{
+    m_client->scroll(scrollDelta, rectToScroll, clipRect);
 }
 
 IntPoint Chrome::screenToWindow(const IntPoint& point) const
@@ -314,16 +319,6 @@ void Chrome::addToDirtyRegion(const IntRect& rect)
     m_client->addToDirtyRegion(rect);
 }
 
-void Chrome::scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect)
-{
-    m_client->scrollBackingStore(dx, dy, scrollViewRect, clipRect);
-}
-
-void Chrome::updateBackingStore()
-{
-    m_client->updateBackingStore();
-}
-
 void Chrome::mouseDidMoveOverElement(const HitTestResult& result, unsigned modifierFlags)
 {
     if (result.innerNode()) {
index 79e3d3a4c10aa816af68ac6a9d3bdf8c2f116ca9..50063c6d5d7bac6ec7ca2ee6acaa247a62e5ec85 100644 (file)
@@ -53,7 +53,8 @@ namespace WebCore {
         ChromeClient* client() { return m_client; }
 
         // HostWindow methods.
-        virtual void repaint(const IntRect&, bool contentChanged, bool immediate = false);
+        virtual void repaint(const IntRect&, bool contentChanged, bool immediate = false, bool repaintContentOnly = false);
+        virtual void scroll(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect);
         virtual IntPoint screenToWindow(const IntPoint&) const;
         virtual IntRect windowToScreen(const IntRect&) const;
     
@@ -104,8 +105,6 @@ namespace WebCore {
 
         IntRect windowResizerRect() const;
         void addToDirtyRegion(const IntRect&);
-        void scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect);
-        void updateBackingStore();
 
         void mouseDidMoveOverElement(const HitTestResult&, unsigned modifierFlags);
 
index d2922daea9b10046bd1d51dc3c83c0d9e4d0538c..41b6ba092d04c9c17169cb4f951fdf7a5f1521ec 100644 (file)
@@ -109,15 +109,12 @@ namespace WebCore {
 
         virtual IntRect windowResizerRect() const = 0;
 
-        // The following three methods are deprecated and will be removed once all of the callers have been
-        // eliminated.
+        // This method is deprecated and will be removed once all of the callers have been eliminated.
         virtual void addToDirtyRegion(const IntRect&) = 0;
-        virtual void scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect) = 0;
-        virtual void updateBackingStore() = 0;
-        // End deprecated methods.
 
         // Methods used by HostWindow.
-        virtual void repaint(const IntRect&, bool contentChanged, bool immediate = false) = 0;
+        virtual void repaint(const IntRect&, bool contentChanged, bool immediate = false, bool repaintContentOnly = false) = 0;
+        virtual void scroll(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) = 0;
         virtual IntPoint screenToWindow(const IntPoint&) const = 0;
         virtual IntRect windowToScreen(const IntRect&) const = 0;
         // End methods used by HostWindow.
index a2f08cd7e650086beb9b520155d26944af0f29f2..55ab61747a384d7f51189082862a75693099acb4 100644 (file)
@@ -573,7 +573,7 @@ void EventHandler::handleAutoscroll(RenderObject* renderer)
 #if PLATFORM(WIN)
     if (m_panScrollInProgress) {
         m_panScrollStartPos = currentMousePosition();
-        m_frame->view()->printPanScrollIcon(m_panScrollStartPos);
+        m_frame->view()->addPanScrollIcon(m_panScrollStartPos);
         // If we're not in the top frame we notify it that we are using the panScroll
         if (m_frame != m_frame->page()->mainFrame())
             m_frame->page()->mainFrame()->eventHandler()->setPanScrollInProgress(true);
index f3b11b31c4ff40a2bee1a8eea5918f89b6486eef..19a9561e2be51ee5501b04e479909f942a9f487f 100644 (file)
@@ -42,7 +42,8 @@ public:
     // The repaint method asks the host window to repaint a rect in the window's coordinate space.  The
     // contentChanged boolean indicates whether or not the Web page content actually changed (or if a repaint
     // of unchanged content is being requested).
-    virtual void repaint(const IntRect&, bool contentChanged, bool immediate = false) = 0;
+    virtual void repaint(const IntRect&, bool contentChanged, bool immediate = false, bool repaintContentOnly = false) = 0;
+    virtual void scroll(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) = 0;
 
     // The paint method just causes a synchronous update of the window to happen for platforms that need it (Windows).
     void paint() { repaint(IntRect(), false, true); }
index d13a62c38ec0f6e2d169a4da564dfbdff65fa1dc..d9fa07ea53f8752650e5857408db6a71b24c9a71 100644 (file)
@@ -373,12 +373,44 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset)
     m_inUpdateScrollbars = false;
 }
 
-#if PLATFORM(MAC) || PLATFORM(WX)
-// FIXME: This is just temporary so we can commit a cross-platform version of updateScrollbars.
-void ScrollView::scrollContents(const IntSize&)
+const int panIconSizeLength = 20;
+
+void ScrollView::scrollContents(const IntSize& scrollDelta)
 {
+    // Since scrolling is double buffered, we will be blitting the scroll view's intersection
+    // with the clip rect every time to keep it smooth.
+    IntRect clipRect = static_cast<Widget*>(this)->windowClipRect();
+    IntRect scrollViewRect = convertToContainingWindow(IntRect(0, 0, visibleWidth(), visibleHeight()));
+    IntRect updateRect = clipRect;
+    updateRect.intersect(scrollViewRect);
+
+    // Invalidate the window (not the backing store).
+    hostWindow()->repaint(updateRect, false);
+
+    if (m_drawPanScrollIcon) {
+        int panIconDirtySquareSizeLength = 2 * (panIconSizeLength + max(abs(scrollDelta.width()), abs(scrollDelta.height()))); // We only want to repaint what's necessary
+        IntPoint panIconDirtySquareLocation = IntPoint(m_panScrollIconPoint.x() - (panIconDirtySquareSizeLength / 2), m_panScrollIconPoint.y() - (panIconDirtySquareSizeLength / 2));
+        IntRect panScrollIconDirtyRect = IntRect(panIconDirtySquareLocation , IntSize(panIconDirtySquareSizeLength, panIconDirtySquareSizeLength));
+        panScrollIconDirtyRect.intersect(clipRect);
+        hostWindow()->repaint(panScrollIconDirtyRect, true, true);
+    }
+
+    if (canBlitOnScroll()) { // The main frame can just blit the WebView window
+       // FIXME: Find a way to blit subframes without blitting overlapping content
+       hostWindow()->scroll(-scrollDelta, scrollViewRect, clipRect);
+    } else { 
+       // We need to go ahead and repaint the entire backing store.  Do it now before moving the
+       // plugins.
+       hostWindow()->repaint(updateRect, true, false, true); // Invalidate the backing store and repaint it synchronously
+    }
+
+    // This call will move children with native widgets (plugins) and invalidate them as well.
+    frameRectsChanged();
+
+    // Now update the window (which should do nothing but a blit of the backing store's updateRect and so should
+    // be very fast).
+    hostWindow()->paint();
 }
-#endif
 
 IntPoint ScrollView::windowToContents(const IntPoint& windowPoint) const
 {
@@ -702,6 +734,20 @@ bool ScrollView::isOffscreen() const
     return false;
 }
 
+
+void ScrollView::addPanScrollIcon(const IntPoint& iconPosition)
+{
+    m_drawPanScrollIcon = true;    
+    m_panScrollIconPoint = IntPoint(iconPosition.x() - panIconSizeLength / 2 , iconPosition.y() - panIconSizeLength / 2) ;
+    hostWindow()->repaint(IntRect(m_panScrollIconPoint, IntSize(panIconSizeLength,panIconSizeLength)), true, true);    
+}
+
+void ScrollView::removePanScrollIcon()
+{
+    m_drawPanScrollIcon = false; 
+    hostWindow()->repaint(IntRect(m_panScrollIconPoint, IntSize(panIconSizeLength, panIconSizeLength)), true, true);
+}
+
 #if !PLATFORM(MAC)
 void ScrollView::platformSetCanBlitOnScroll()
 {
index 41095bc911fac5f8f1fabaa32db798751b92d481..84c042bd45617cd915d269567b958a9c723396bc 100644 (file)
@@ -202,14 +202,16 @@ public:
     virtual void hide();
     virtual void setParentVisible(bool);
     
+    // Pan scrolling methods.
+    void addPanScrollIcon(const IntPoint&);
+    void removePanScrollIcon();
+
 protected:
     virtual void repaintContentRectangle(const IntRect&, bool now = false);
     virtual void paintContents(GraphicsContext*, const IntRect& damageRect) = 0;
     
     virtual void contentsResized() = 0;
     virtual void visibleContentsResized() = 0;
-    
-    void updateWindowRect(const IntRect&, bool now = false);
 
 private:
     RefPtr<Scrollbar> m_horizontalScrollbar;
@@ -270,7 +272,7 @@ private:
     NSScrollView<WebCoreFrameScrollView>* scrollView() const;
 #endif
 
-#if !PLATFORM(MAC)
+#if !PLATFORM(MAC) && !PLATFORM(WIN)
 // FIXME: ScrollViewPrivate will eventually be completely gone.
     class ScrollViewPrivate;
     ScrollViewPrivate* m_data;
@@ -281,16 +283,6 @@ private:
 #if !PLATFORM(MAC) && !PLATFORM(WX)
 public:
     void addToDirtyRegion(const IntRect&);
-    void scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect);
-    void updateBackingStore();
-#endif
-
-#if PLATFORM(WIN)
-public:
-    virtual void themeChanged();
-
-    void printPanScrollIcon(const IntPoint&);
-    void removePanScrollIcon();
 #endif
 
 #if PLATFORM(QT)
index 2655aa74714ad98ea4634fcfa1b70fbf0b8037b3..b18fe579e614f73ab368c2ad2e3e14ef3f451465 100644 (file)
@@ -74,8 +74,6 @@ public:
         }
     }
 
-    void scrollBackingStore(const IntSize& scrollDelta);
-
     static void adjustmentChanged(GtkAdjustment*, gpointer);
 
     ScrollView* view;
@@ -84,35 +82,6 @@ public:
     GtkAdjustment* verticalAdjustment;
 };
 
-void ScrollView::ScrollViewPrivate::scrollBackingStore(const IntSize& scrollDelta)
-{
-    // Since scrolling is double buffered, we will be blitting the scroll view's intersection
-    // with the clip rect every time to keep it smooth.
-    IntRect clipRect = view->windowClipRect();
-    IntRect scrollViewRect = view->convertToContainingWindow(IntRect(0, 0, view->visibleWidth(), view->visibleHeight()));
-
-    IntRect updateRect = clipRect;
-    updateRect.intersect(scrollViewRect);
-
-    //FIXME update here?
-
-    if (view->canBlitOnScroll()) // The main frame can just blit the WebView window
-       // FIXME: Find a way to blit subframes without blitting overlapping content
-       view->scrollBackingStore(-scrollDelta.width(), -scrollDelta.height(), scrollViewRect, clipRect);
-    else  {
-       // We need to go ahead and repaint the entire backing store.  Do it now before moving the
-       // plugins.
-       view->addToDirtyRegion(updateRect);
-       view->updateBackingStore();
-    }
-
-    view->frameRectsChanged();
-
-    // Now update the window (which should do nothing but a blit of the backing store's updateRect and so should
-    // be very fast).
-    invalidate();
-}
-
 void ScrollView::ScrollViewPrivate::adjustmentChanged(GtkAdjustment* adjustment, gpointer _that)
 {
     ScrollViewPrivate* that = reinterpret_cast<ScrollViewPrivate*>(_that);
@@ -243,24 +212,4 @@ void ScrollView::addToDirtyRegion(const IntRect& containingWindowRect)
     page->chrome()->addToDirtyRegion(containingWindowRect);
 }
 
-void ScrollView::scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect)
-{
-    ASSERT(isFrameView());
-    const FrameView* frameView = static_cast<const FrameView*>(this);
-    Page* page = frameView->frame() ? frameView->frame()->page() : 0;
-    if (!page)
-        return;
-    page->chrome()->scrollBackingStore(dx, dy, scrollViewRect, clipRect);
-}
-
-void ScrollView::updateBackingStore()
-{
-    ASSERT(isFrameView());
-    const FrameView* frameView = static_cast<const FrameView*>(this);
-    Page* page = frameView->frame() ? frameView->frame()->page() : 0;
-    if (!page)
-        return;
-    page->chrome()->updateBackingStore();
-}
-
 }
index e79380945df4158fcda824e0383a9905ce64c585..835d5ee406a989628b89614a66ee1538609567aa 100644 (file)
@@ -68,7 +68,6 @@ public:
     ScrollViewPrivate(ScrollView* view)
       : m_view(view)
       , m_platformWidgets(0)
-      , m_inUpdateScrollbars(false)
     {
     }
 
@@ -76,34 +75,10 @@ public:
     {
     }
 
-    void scrollBackingStore(const IntSize& scrollDelta);
-
     ScrollView* m_view;
     int  m_platformWidgets;
 };
 
-void ScrollView::ScrollViewPrivate::scrollBackingStore(const IntSize& scrollDelta)
-{
-    // Since scrolling is double buffered, we will be blitting the scroll view's intersection
-    // with the clip rect every time to keep it smooth.
-    IntRect clipRect = m_view->windowClipRect();
-    IntRect scrollViewRect = m_view->convertToContainingWindow(IntRect(0, 0, m_view->visibleWidth(), m_view->visibleHeight()));
-
-    IntRect updateRect = clipRect;
-    updateRect.intersect(scrollViewRect);
-
-    if (m_view->canBlitOnScroll() && !m_view->root()->hasNativeWidgets()) {
-       m_view->scrollBackingStore(-scrollDelta.width(), -scrollDelta.height(),
-                                  scrollViewRect, clipRect);
-    } else  {
-       // We need to go ahead and repaint the entire backing store.
-       m_view->addToDirtyRegion(updateRect);
-       m_view->updateBackingStore();
-    }
-
-    m_view->frameRectsChanged();
-}
-
 ScrollView::ScrollView()
     : m_data(new ScrollViewPrivate(this))
 {
@@ -112,14 +87,10 @@ ScrollView::ScrollView()
 
 ScrollView::~ScrollView()
 {
+    destroy();
     delete m_data;
 }
 
-void ScrollView::scrollContents(const IntSize& size)
-{
-    m_data->scrollBackingStore(size);
-}
-
 void ScrollView::platformAddChild(Widget* child)
 {
     root()->incrementNativeWidgetCount();
@@ -141,26 +112,6 @@ void ScrollView::addToDirtyRegion(const IntRect& containingWindowRect)
     page->chrome()->addToDirtyRegion(containingWindowRect);
 }
 
-void ScrollView::scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect)
-{
-    ASSERT(isFrameView());
-    const FrameView* frameView = static_cast<const FrameView*>(this);
-    Page* page = frameView->frame() ? frameView->frame()->page() : 0;
-    if (!page)
-        return;
-    page->chrome()->scrollBackingStore(dx, dy, scrollViewRect, clipRect);
-}
-
-void ScrollView::updateBackingStore()
-{
-    ASSERT(isFrameView());
-    const FrameView* frameView = static_cast<const FrameView*>(this);
-    Page* page = frameView->frame() ? frameView->frame()->page() : 0;
-    if (!page)
-        return;
-    page->chrome()->updateBackingStore();
-}
-
 void ScrollView::incrementNativeWidgetCount()
 {
     ++m_data->m_platformWidgets;
index ad5db067c793b90b389459f915616e511cbef9e5..c0f7c088863a8354eb21ffe6063a10691e49a864 100644 (file)
@@ -54,60 +54,7 @@ using namespace std;
 
 namespace WebCore {
 
-class ScrollView::ScrollViewPrivate {
-public:
-    ScrollViewPrivate(ScrollView* view)
-        : m_view(view)
-    {
-    }
-
-    void scrollBackingStore(const IntSize& scrollDelta);
-
-    ScrollView* m_view;
-};
-
-const int panIconSizeLength = 20;
-
-void ScrollView::ScrollViewPrivate::scrollBackingStore(const IntSize& scrollDelta)
-{
-    // Since scrolling is double buffered, we will be blitting the scroll view's intersection
-    // with the clip rect every time to keep it smooth.
-    HWND containingWindowHandle = m_view->containingWindow();
-    IntRect clipRect = static_cast<Widget*>(m_view)->windowClipRect();
-    IntRect scrollViewRect = m_view->convertToContainingWindow(IntRect(0, 0, m_view->visibleWidth(), m_view->visibleHeight()));
-    IntRect updateRect = clipRect;
-    updateRect.intersect(scrollViewRect);
-    RECT r = updateRect;
-    ::InvalidateRect(containingWindowHandle, &r, false);
-
-    if (m_view->m_drawPanScrollIcon) {
-        int panIconDirtySquareSizeLength = 2 * (panIconSizeLength + max(abs(scrollDelta.width()), abs(scrollDelta.height()))); // We only want to repaint what's necessary
-        IntPoint panIconDirtySquareLocation = IntPoint(m_view->m_panScrollIconPoint.x() - (panIconDirtySquareSizeLength / 2), m_view->m_panScrollIconPoint.y() - (panIconDirtySquareSizeLength / 2));
-        IntRect panScrollIconDirtyRect = IntRect(panIconDirtySquareLocation , IntSize(panIconDirtySquareSizeLength, panIconDirtySquareSizeLength));
-        
-        m_view->updateWindowRect(panScrollIconDirtyRect);
-    }
-
-    if (m_view->canBlitOnScroll()) // The main frame can just blit the WebView window
-       // FIXME: Find a way to blit subframes without blitting overlapping content
-       m_view->scrollBackingStore(-scrollDelta.width(), -scrollDelta.height(), scrollViewRect, clipRect);
-    else  {
-       // We need to go ahead and repaint the entire backing store.  Do it now before moving the
-       // plugins.
-       m_view->addToDirtyRegion(updateRect);
-       m_view->updateBackingStore();
-    }
-
-    // This call will move child HWNDs (plugins) and invalidate them as well.
-    m_view->frameRectsChanged();
-
-    // Now update the window (which should do nothing but a blit of the backing store's updateRect and so should
-    // be very fast).
-    ::UpdateWindow(containingWindowHandle);
-}
-
 ScrollView::ScrollView()
-    : m_data(new ScrollViewPrivate(this))
 {
     init();
 }
@@ -115,7 +62,6 @@ ScrollView::ScrollView()
 ScrollView::~ScrollView()
 {
     destroy();
-    delete m_data;
 }
 
 void ScrollView::platformAddChild(Widget*)
@@ -126,47 +72,6 @@ void ScrollView::platformRemoveChild(Widget*)
 {
 }
 
-void ScrollView::updateWindowRect(const IntRect& rect, bool now)
-{
-    RECT containingWindowRectWin = rect;
-    HWND containingWindowHandle = containingWindow();
-
-    ::InvalidateRect(containingWindowHandle, &containingWindowRectWin, false);
-      
-    // Cache the dirty spot.
-    addToDirtyRegion(rect);
-
-    if (now)
-        ::UpdateWindow(containingWindowHandle);
-}
-
-void ScrollView::printPanScrollIcon(const IntPoint& iconPosition)
-{
-    m_drawPanScrollIcon = true;    
-    m_panScrollIconPoint = IntPoint(iconPosition.x() - panIconSizeLength / 2 , iconPosition.y() - panIconSizeLength / 2) ;
-
-    updateWindowRect(IntRect(m_panScrollIconPoint, IntSize(panIconSizeLength,panIconSizeLength)), true);    
-}
-
-void ScrollView::removePanScrollIcon()
-{
-    m_drawPanScrollIcon = false; 
-
-    updateWindowRect(IntRect(m_panScrollIconPoint, IntSize(panIconSizeLength, panIconSizeLength)), true);
-}
-
-void ScrollView::themeChanged()
-{
-    ScrollbarTheme::nativeTheme()->themeChanged();
-    theme()->themeChanged();
-    invalidate();
-}
-
-void ScrollView::scrollContents(const IntSize& size)
-{
-    m_data->scrollBackingStore(size);
-}
-
 void ScrollView::addToDirtyRegion(const IntRect& containingWindowRect)
 {
     ASSERT(isFrameView());
@@ -177,24 +82,4 @@ void ScrollView::addToDirtyRegion(const IntRect& containingWindowRect)
     page->chrome()->addToDirtyRegion(containingWindowRect);
 }
 
-void ScrollView::scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect)
-{
-    ASSERT(isFrameView());
-    const FrameView* frameView = static_cast<const FrameView*>(this);
-    Page* page = frameView->frame() ? frameView->frame()->page() : 0;
-    if (!page)
-        return;
-    page->chrome()->scrollBackingStore(dx, dy, scrollViewRect, clipRect);
-}
-
-void ScrollView::updateBackingStore()
-{
-    ASSERT(isFrameView());
-    const FrameView* frameView = static_cast<const FrameView*>(this);
-    Page* page = frameView->frame() ? frameView->frame()->page() : 0;
-    if (!page)
-        return;
-    page->chrome()->updateBackingStore();
-}
-
 } // namespace WebCore
index 0e29c03ec5bb3b7ebafa6f3fdb83f8016f726333..e997ef69c5468757c9434308dbae9038da561bfe 100644 (file)
@@ -1,3 +1,16 @@
+2008-10-02  David Hyatt  <hyatt@apple.com>
+
+        https://bugs.webkit.org/show_bug.cgi?id=21314
+        
+        Make scrollBackingStore cross-platform.
+
+        Reviewed by Sam Weinig
+
+        * WebCoreSupport/ChromeClientGtk.cpp:
+        (WebKit::ChromeClient::repaint):
+        (WebKit::ChromeClient::scroll):
+        * WebCoreSupport/ChromeClientGtk.h:
+
 2008-10-01  David Hyatt  <hyatt@apple.com>
 
         https://bugs.webkit.org/show_bug.cgi?id=21282
index 95526256a530f98da505fa5621e5c797ece5e997..461ffbf63a4fda27ec142a5eb2089f03597d59f1 100644 (file)
@@ -259,9 +259,10 @@ IntRect ChromeClient::windowResizerRect() const
     return IntRect();
 }
 
-void ChromeClient::repaint(const WebCore::IntRect& windowRect, bool contentChanged, bool immediate)
+void ChromeClient::repaint(const IntRect& windowRect, bool contentChanged, bool immediate, bool repaintContentOnly)
 {
-    if (!m_webView)
+    // Since we have no backing store, we do nothing if repaintContentOnly is set.
+    if (!m_webView || repaintContentOnly)
         return;
 
     GdkRectangle rect = windowRect;
@@ -276,6 +277,11 @@ void ChromeClient::repaint(const WebCore::IntRect& windowRect, bool contentChang
     }
 }
 
+void ChromeClient::scroll(const IntSize& delta, const IntRect& scrollViewRect, const IntRect& clipRect)
+{
+    notImplemented();
+}
+
 IntRect ChromeClient::windowToScreen(const IntRect& rect) const
 {
     notImplemented();
@@ -293,16 +299,6 @@ void ChromeClient::addToDirtyRegion(const IntRect&)
     notImplemented();
 }
 
-void ChromeClient::scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect)
-{
-    notImplemented();
-}
-
-void ChromeClient::updateBackingStore()
-{
-    notImplemented();
-}
-
 void ChromeClient::mouseDidMoveOverElement(const HitTestResult& hit, unsigned modifierFlags)
 {
     // check if the element is a link...
index 3e914eede74cda761cbd1f092b07de06c58b7772..e104c144c9aabcd76a3d82a9dd0169b36ce9f3e3 100644 (file)
@@ -84,10 +84,9 @@ namespace WebKit {
 
         virtual WebCore::IntRect windowResizerRect() const;
         virtual void addToDirtyRegion(const WebCore::IntRect&);
-        virtual void scrollBackingStore(int dx, int dy, const WebCore::IntRect& scrollViewRect, const WebCore::IntRect& clipRect);
-        virtual void updateBackingStore();
-
-        virtual void repaint(const WebCore::IntRect&, bool contentChanged, bool immediate = false);
+        
+        virtual void repaint(const WebCore::IntRect&, bool contentChanged, bool immediate = false, bool repaintContentOnly = false);
+        virtual void scroll(const WebCore::IntSize& scrollDelta, const WebCore::IntRect& rectToScroll, const WebCore::IntRect& clipRect);
         virtual WebCore::IntPoint screenToWindow(const WebCore::IntPoint&) const;
         virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&) const;
 
index 832bf06ebe1b67613219058edc6ac1a4787fa546..14fefe3ac34470456783796b7e2f64991c0aafd6 100644 (file)
@@ -1,3 +1,16 @@
+2008-10-02  David Hyatt  <hyatt@apple.com>
+
+        https://bugs.webkit.org/show_bug.cgi?id=21314
+        
+        Make scrollBackingStore cross-platform.
+
+        Reviewed by Sam Weinig
+
+        * WebCoreSupport/WebChromeClient.h:
+        * WebCoreSupport/WebChromeClient.mm:
+        (WebChromeClient::repaint):
+        (WebChromeClient::scroll):
+
 2008-10-01  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by Darin Adler and Cameron Zwarich.
index c74c53abac89de4932e1f13318133ce22fe3ce77..b89d50d4e47b1134120453652d6db888c0da97c5 100644 (file)
@@ -89,10 +89,9 @@ public:
     
     virtual WebCore::IntRect windowResizerRect() const;
     virtual void addToDirtyRegion(const WebCore::IntRect&);
-    virtual void scrollBackingStore(int dx, int dy, const WebCore::IntRect& scrollViewRect, const WebCore::IntRect& clipRect);
-    virtual void updateBackingStore();
-    
-    virtual void repaint(const WebCore::IntRect&, bool contentChanged, bool immediate = false);
+
+    virtual void repaint(const WebCore::IntRect&, bool contentChanged, bool immediate = false, bool repaintContentOnly = false);
+    virtual void scroll(const WebCore::IntSize& scrollDelta, const WebCore::IntRect& rectToScroll, const WebCore::IntRect& clipRect);
     virtual WebCore::IntPoint screenToWindow(const WebCore::IntPoint&) const;
     virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&) const;
 
index 42e8cc603674a5b99e1fcf0039016b0a606ce750..24cd6e11b924a4123738723c612b45d9d1d788ac 100644 (file)
@@ -404,7 +404,11 @@ IntRect WebChromeClient::windowResizerRect() const
 }
 
 // Host window methods are really only needed once we have a viewless Mac Webkit.
-void WebChromeClient::repaint(const IntRect&, bool, bool)
+void WebChromeClient::repaint(const IntRect&, bool, bool, bool)
+{
+}
+
+void WebChromeClient::scroll(const IntSize&, const IntRect&, const IntRect&)
 {
 }
 
@@ -423,14 +427,6 @@ void WebChromeClient::addToDirtyRegion(const IntRect&)
 {
 }
 
-void WebChromeClient::scrollBackingStore(int, int, const IntRect&, const IntRect&)
-{
-}
-
-void WebChromeClient::updateBackingStore()
-{
-}
-
 void WebChromeClient::mouseDidMoveOverElement(const HitTestResult& result, unsigned modifierFlags)
 {
     WebElementDictionary *element = [[WebElementDictionary alloc] initWithHitTestResult:result];
index f5c6bfd787aeebec8a9cba105b0cf4c221b549e3..6d37a49dca0f97635ccc7c9983a587e2c8942110 100644 (file)
@@ -1,3 +1,16 @@
+2008-10-02  David Hyatt  <hyatt@apple.com>
+
+        https://bugs.webkit.org/show_bug.cgi?id=21314
+        
+        Make scrollBackingStore cross-platform.
+
+        Reviewed by Sam Weinig
+
+        * WebCoreSupport/ChromeClientQt.cpp:
+        (WebCore::ChromeClientQt::repaint):
+        (WebCore::ChromeClientQt::scroll):
+        * WebCoreSupport/ChromeClientQt.h:
+
 2008-10-01  David Hyatt  <hyatt@apple.com>
         
         https://bugs.webkit.org/show_bug.cgi?id=21282
index 169a2b92ee7b6c7050c38afc3dc97c8b8c03fa21..bc509839ad18438f314021a18dd26a057147db9e 100644 (file)
@@ -296,7 +296,7 @@ IntRect ChromeClientQt::windowResizerRect() const
     return IntRect();
 }
 
-void ChromeClientQt::repaint(const IntRect& windowRect, bool contentChanged, bool)
+void ChromeClientQt::repaint(const IntRect& windowRect, bool contentChanged, bool immediate, bool repaintContentOnly)
 {
     // No double buffer, so only update the QWidget if content changed.
     if (contentChanged) {
@@ -310,10 +310,19 @@ void ChromeClientQt::repaint(const IntRect& windowRect, bool contentChanged, boo
             emit m_webPage->repaintRequested(windowRect);
     }
 
-    // FIXME: There is no "immediate" support.  This should be done always whenever the flag
+    // FIXME: There is no "immediate" support for window painting.  This should be done always whenever the flag
     // is set.
 }
 
+void ChromeClientQt::scroll(const IntSize& delta, const IntRect& scrollViewRect, const IntRect& clipRect)
+{
+    QWidget* view = m_webPage->view();
+    if (view)
+        view->scroll(delta.x(), delta.y(), scrollViewRect);
+    else
+        emit m_webPage->scrollRequested(delta.x(), delta.y(), scrollViewRect);
+}
+
 IntRect ChromeClientQt::windowToScreen(const IntRect& rect) const
 {
     notImplemented();
@@ -338,15 +347,6 @@ void ChromeClientQt::addToDirtyRegion(const IntRect& r)
         emit m_webPage->repaintRequested(r);
 }
 
-void ChromeClientQt::scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect)
-{
-    QWidget* view = m_webPage->view();
-    if (view)
-        view->scroll(dx, dy, scrollViewRect);
-    else
-        emit m_webPage->scrollRequested(dx, dy, scrollViewRect);
-}
-
 void ChromeClientQt::updateBackingStore()
 {
 }
index 3ff3e9c22eed8aec47725159f5669cbdd42e6d4e..3fff6e4cad11e06ee17d3142cc134d8b29bb7fde 100644 (file)
@@ -100,10 +100,9 @@ namespace WebCore {
         virtual bool tabsToLinks() const;
         virtual IntRect windowResizerRect() const;
         virtual void addToDirtyRegion(const IntRect&);
-        virtual void scrollBackingStore(int, int, const IntRect&, const IntRect&);
-        virtual void updateBackingStore();
 
-        virtual void repaint(const IntRect&, bool contentChanged, bool immediate = false);
+        virtual void repaint(const IntRect&, bool contentChanged, bool immediate = false, bool repaintContentOnly = false);
+        virtual void scroll(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect);
         virtual IntPoint screenToWindow(const IntPoint&) const;
         virtual IntRect windowToScreen(const IntRect&) const;
     
index 308c1885e378c0a345098128c3e522629e151d56..99b814cae492716d7aaeca3b86209eda24ba1d78 100644 (file)
@@ -1,3 +1,19 @@
+2008-10-02  David Hyatt  <hyatt@apple.com>
+
+        https://bugs.webkit.org/show_bug.cgi?id=21314
+        
+        Make scrollBackingStore cross-platform.
+
+        Reviewed by Sam Weinig
+
+        * WebCoreSupport/WebChromeClient.cpp:
+        (WebChromeClient::repaint):
+        (WebChromeClient::scroll):
+        * WebCoreSupport/WebChromeClient.h:
+        * WebView.cpp:
+        (WebView::repaint):
+        * WebView.h:
+
 2008-10-01  David Hyatt  <hyatt@apple.com>
 
         https://bugs.webkit.org/show_bug.cgi?id=21298
index c498a170aeacfd5a347b8ef43fafcd76bcaa9a7c..33eb7da84d5511b9a5dbf544af2f0f29ec271dd9 100644 (file)
@@ -417,10 +417,17 @@ IntRect WebChromeClient::windowResizerRect() const
     return intRect;
 }
 
-void WebChromeClient::repaint(const IntRect& windowRect, bool contentChanged, bool immediate)
+void WebChromeClient::repaint(const IntRect& windowRect, bool contentChanged, bool immediate, bool repaintContentOnly)
 {
     ASSERT(core(m_webView->topLevelFrame()));
-    m_webView->repaint(windowRect, contentChanged, immediate);
+    m_webView->repaint(windowRect, contentChanged, immediate, repaintContentOnly);
+}
+
+void WebChromeClient::scroll(const IntSize& delta, const IntRect& scrollViewRect, const IntRect& clipRect)
+{
+    ASSERT(core(m_webView->topLevelFrame()));
+
+    m_webView->scrollBackingStore(core(m_webView->topLevelFrame())->view(), delta.x(), delta.y(), scrollViewRect, clipRect);
 }
 
 IntRect WebChromeClient::windowToScreen(const IntRect& rect) const
@@ -457,20 +464,6 @@ void WebChromeClient::addToDirtyRegion(const IntRect& dirtyRect)
     m_webView->addToDirtyRegion(dirtyRect);
 }
 
-void WebChromeClient::scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect)
-{
-    ASSERT(core(m_webView->topLevelFrame()));
-
-    m_webView->scrollBackingStore(core(m_webView->topLevelFrame())->view(), dx, dy, scrollViewRect, clipRect);
-}
-
-void WebChromeClient::updateBackingStore()
-{
-    ASSERT(core(m_webView->topLevelFrame()));
-
-    m_webView->updateBackingStore(core(m_webView->topLevelFrame())->view(), 0, false);
-}
-
 void WebChromeClient::mouseDidMoveOverElement(const HitTestResult& result, unsigned modifierFlags)
 {
     COMPtr<IWebUIDelegate> uiDelegate;
index 86e18e72bf612ab73c1b25f179f74141c2aede78..51aec71a0be11d5191fa349ddd3744f9305acbb3 100644 (file)
@@ -92,13 +92,12 @@ public:
     virtual bool tabsToLinks() const;
     virtual WebCore::IntRect windowResizerRect() const;
 
-    virtual void repaint(const WebCore::IntRect&, bool contentChanged, bool immediate = false);
+    virtual void repaint(const WebCore::IntRect&, bool contentChanged, bool immediate = false, bool repaintContentOnly = false);
+    virtual void scroll(const WebCore::IntSize& scrollDelta, const WebCore::IntRect& rectToScroll, const WebCore::IntRect& clipRect);
     virtual WebCore::IntPoint screenToWindow(const WebCore::IntPoint& p) const;
     virtual WebCore::IntRect windowToScreen(const WebCore::IntRect& r) const;
 
     virtual void addToDirtyRegion(const WebCore::IntRect&);
-    virtual void scrollBackingStore(int dx, int dy, const WebCore::IntRect& scrollViewRect, const WebCore::IntRect& clipRect);
-    virtual void updateBackingStore();
 
     virtual void mouseDidMoveOverElement(const WebCore::HitTestResult&, unsigned modifierFlags);
 
index 73f41a1145e280ea6df17928bb02ddee2c6a7411..38bcc2659eef23057350ec4248d9f5baa367de36 100644 (file)
 #include <WebCore/PluginInfoStore.h>
 #include <WebCore/PluginView.h>
 #include <WebCore/ProgressTracker.h>
+#include <WebCore/RenderTheme.h>
 #include <WebCore/ResourceHandle.h>
 #include <WebCore/ResourceHandleClient.h>
+#include <WebCore/ScrollbarTheme.h>
 #include <WebCore/SelectionController.h>
 #include <WebCore/Settings.h>
 #include <WebCore/SimpleFontData.h>
@@ -621,14 +623,20 @@ void WebView::close()
     deleteBackingStore();
 }
 
-void WebView::repaint(const WebCore::IntRect& windowRect, bool contentChanged, bool immediate)
+void WebView::repaint(const WebCore::IntRect& windowRect, bool contentChanged, bool immediate, bool repaintContentOnly)
 {
-    RECT rect = windowRect;
-    ::InvalidateRect(m_viewWindow, &rect, false);
+    if (!repaintContentOnly) {
+        RECT rect = windowRect;
+        ::InvalidateRect(m_viewWindow, &rect, false);
+    }
     if (contentChanged)
         addToDirtyRegion(windowRect);
-    if (immediate)
-        ::UpdateWindow(m_viewWindow);
+    if (immediate) {
+        if (repaintContentOnly)
+            updateBackingStore();
+        else
+            ::UpdateWindow(m_viewWindow);
+    }
 }
 
 void WebView::deleteBackingStore()
@@ -1804,7 +1812,11 @@ static LRESULT CALLBACK WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, L
         case WM_XP_THEMECHANGED:
             if (Frame* coreFrame = core(mainFrameImpl)) {
                 webView->deleteBackingStore();
-                coreFrame->view()->themeChanged();
+                theme()->themeChanged();
+                ScrollbarTheme::nativeTheme()->themeChanged();
+                RECT windowRect;
+                ::GetClientRect(m_viewWindow, &windowRect);
+                ::InvalidateRect(m_viewWindow, &windowRect, false);
             }
             break;
         case WM_MOUSEACTIVATE:
index e16fdff056b87381c9472fa36aef04c02f3a8dda..df3503261fd703a96d3bfa93109ec9b5ee115422 100644 (file)
@@ -709,9 +709,9 @@ public:
     void addToDirtyRegion(const WebCore::IntRect&);
     void addToDirtyRegion(HRGN);
     void scrollBackingStore(WebCore::FrameView*, int dx, int dy, const WebCore::IntRect& scrollViewRect, const WebCore::IntRect& clipRect);
-    void updateBackingStore(WebCore::FrameView*, HDC, bool backingStoreCompletelyDirty);
+    void updateBackingStore(WebCore::FrameView*, HDC = 0, bool backingStoreCompletelyDirty = false);
     void deleteBackingStore();
-    void repaint(const WebCore::IntRect&, bool contentChanged, bool immediate = false);
+    void repaint(const WebCore::IntRect&, bool contentChanged, bool immediate = false, bool repaintContentOnly = false);
     void frameRect(RECT* rect);
     void closeWindow();
     void closeWindowSoon();