Changeset 56208 in webkit


Ignore:
Timestamp:
Mar 18, 2010 9:51:35 PM (14 years ago)
Author:
eric@webkit.org
Message:

2010-03-18 Joe Ligman <joseph.ligman@nokia.com>

Reviewed by Simon Hausmann.

[Qt] New API scrollRecursively has several problems.
https://bugs.webkit.org/show_bug.cgi?id=35873

Remove scrollRecursively from the Qt 4.7 API
Update the internal API to accept a hit test position
for nested scrolling

  • Api/qwebframe.cpp: (webframe_scrollOverflow): (qtwebkit_webframe_scrollRecursively):
  • Api/qwebframe.h:
  • Api/qwebframe_p.h:
  • tests/qwebframe/tst_qwebframe.cpp:
Location:
trunk/WebKit/qt
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKit/qt/Api/qwebframe.cpp

    r56141 r56208  
    267267}
    268268
     269static bool webframe_scrollOverflow(WebCore::Frame* frame, int dx, int dy, const QPoint& pos)
     270{
     271    if (!frame || !frame->document() || !frame->eventHandler())
     272        return false;
     273
     274    Node* node = frame->document()->elementFromPoint(pos.x(), pos.y());
     275    if (!node)
     276        return false;
     277
     278    RenderObject* renderer = node->renderer();
     279    if (!renderer)
     280        return false;
     281
     282    if (renderer->isListBox())
     283        return false;
     284
     285    RenderLayer* renderLayer = renderer->enclosingLayer();
     286    if (!renderLayer)
     287        return false;
     288
     289    bool scrolledHorizontal = false;
     290    bool scrolledVertical = false;
     291
     292    if (dx > 0)
     293        scrolledHorizontal = renderLayer->scroll(ScrollRight, ScrollByPixel, dx);
     294    else if (dx < 0)
     295        scrolledHorizontal = renderLayer->scroll(ScrollLeft, ScrollByPixel, qAbs(dx));
     296
     297    if (dy > 0)
     298        scrolledVertical = renderLayer->scroll(ScrollDown, ScrollByPixel, dy);
     299    else if (dy < 0)
     300        scrolledVertical = renderLayer->scroll(ScrollUp, ScrollByPixel, qAbs(dy));
     301
     302    return (scrolledHorizontal || scrolledVertical);
     303}
     304
     305
     306/*!
     307  \internal
     308  Scrolls nested frames starting at this frame, \a dx pixels to the right
     309  and \a dy pixels downward. Both \a dx and \a dy may be negative. First attempts
     310  to scroll elements with CSS overflow at position pos, followed by this frame. If this
     311  frame doesn't scroll, attempts to scroll the parent
     312*/
     313void QWEBKIT_EXPORT qtwebkit_webframe_scrollRecursively(QWebFrame* qFrame, int dx, int dy, const QPoint& pos)
     314{
     315    Frame* frame = QWebFramePrivate::core(qFrame);
     316
     317    if (!frame || !frame->view())
     318        return;
     319   
     320    if (!webframe_scrollOverflow(frame, dx, dy, pos)) {
     321        do {
     322            bool scrolledHorizontal = false;
     323            bool scrolledVertical = false;
     324           
     325            IntSize scrollOffset = frame->view()->scrollOffset();
     326            IntPoint maxScrollOffset = frame->view()->maximumScrollPosition();
     327
     328            if (dx > 0) // scroll right
     329                scrolledHorizontal = scrollOffset.width() < maxScrollOffset.x();
     330            else if (dx < 0) // scroll left
     331                scrolledHorizontal = scrollOffset.width() > 0;
     332
     333            if (dy > 0) // scroll down
     334                scrolledVertical = scrollOffset.height() < maxScrollOffset.y();
     335            else if (dy < 0) //scroll up
     336                scrolledVertical = scrollOffset.height() > 0;
     337
     338            if (scrolledHorizontal || scrolledVertical) {
     339                frame->view()->scrollBy(IntSize(dx, dy));
     340                return;
     341            }
     342           
     343            frame = frame->tree()->parent();
     344        } while (frame && frame->view());
     345    }
     346}
     347
     348
    269349QWebFrameData::QWebFrameData(WebCore::Page* parentPage, WebCore::Frame* parentFrame,
    270350                             WebCore::HTMLFrameOwnerElement* ownerFrameElement,
     
    428508        painter->restore();
    429509    }
    430 }
    431 
    432 bool QWebFramePrivate::scrollOverflow(int dx, int dy)
    433 {
    434     if (!frame || !frame->document() || !frame->eventHandler())
    435         return false;
    436 
    437     Node* node = frame->document()->focusedNode();
    438     if (!node)
    439         node = frame->document()->elementFromPoint(frame->eventHandler()->currentMousePosition().x(),
    440                                                    frame->eventHandler()->currentMousePosition().y());
    441     if (!node)
    442         return false;
    443 
    444     RenderObject* renderer = node->renderer();
    445     if (!renderer)
    446         return false;
    447 
    448     if (renderer->isListBox())
    449         return false;
    450 
    451     RenderLayer* renderLayer = renderer->enclosingLayer();
    452     if (!renderLayer)
    453         return false;
    454 
    455     bool scrolledHorizontal = false;
    456     bool scrolledVertical = false;
    457 
    458     if (dx > 0)
    459         scrolledHorizontal = renderLayer->scroll(ScrollRight, ScrollByPixel, dx);
    460     else if (dx < 0)
    461         scrolledHorizontal = renderLayer->scroll(ScrollLeft, ScrollByPixel, qAbs(dx));
    462 
    463     if (dy > 0)
    464         scrolledVertical = renderLayer->scroll(ScrollDown, ScrollByPixel, dy);
    465     else if (dy < 0)
    466         scrolledVertical = renderLayer->scroll(ScrollUp, ScrollByPixel, qAbs(dy));
    467 
    468     return (scrolledHorizontal || scrolledVertical);
    469510}
    470511
     
    11081149
    11091150/*!
    1110   \since 4.7
    1111   Scrolls nested frames starting at this frame, \a dx pixels to the right
    1112   and \a dy pixels downward. Both \a dx and \a dy may be negative. First attempts
    1113   to scroll elements with CSS overflow followed by this frame. If this
    1114   frame doesn't scroll, attempts to scroll the parent
    1115 
    1116   \sa QWebFrame::scroll
    1117 */
    1118 bool QWebFrame::scrollRecursively(int dx, int dy)
    1119 {
    1120     bool scrolledHorizontal = false;
    1121     bool scrolledVertical = false;
    1122     bool scrolledOverflow = d->scrollOverflow(dx, dy);
    1123 
    1124     if (!scrolledOverflow) {
    1125         Frame* frame = d->frame;
    1126         if (!frame || !frame->view())
    1127             return false;
    1128 
    1129         do {
    1130             IntSize scrollOffset = frame->view()->scrollOffset();
    1131             IntPoint maxScrollOffset = frame->view()->maximumScrollPosition();
    1132 
    1133             if (dx > 0) // scroll right
    1134                 scrolledHorizontal = scrollOffset.width() < maxScrollOffset.x();
    1135             else if (dx < 0) // scroll left
    1136                 scrolledHorizontal = scrollOffset.width() > 0;
    1137 
    1138             if (dy > 0) // scroll down
    1139                 scrolledVertical = scrollOffset.height() < maxScrollOffset.y();
    1140             else if (dy < 0) //scroll up
    1141                 scrolledVertical = scrollOffset.height() > 0;
    1142 
    1143             if (scrolledHorizontal || scrolledVertical) {
    1144                 frame->view()->scrollBy(IntSize(dx, dy));
    1145                 return true;
    1146             }
    1147             frame = frame->tree()->parent();
    1148         } while (frame && frame->view());
    1149     }
    1150     return (scrolledHorizontal || scrolledVertical || scrolledOverflow);
    1151 }
    1152 
    1153 bool QWEBKIT_EXPORT qtwebkit_webframe_scrollRecursively(QWebFrame* qFrame, int dx, int dy)
    1154 {
    1155     return qFrame->scrollRecursively(dx, dy);
    1156 }
    1157 
    1158 /*!
    11591151  \property QWebFrame::scrollPosition
    11601152  \since 4.5
  • trunk/WebKit/qt/Api/qwebframe.h

    r55978 r56208  
    157157
    158158    void scroll(int, int);
    159     bool scrollRecursively(int, int);
    160159    QPoint scrollPosition() const;
    161160    void setScrollPosition(const QPoint &pos);
  • trunk/WebKit/qt/Api/qwebframe_p.h

    r56141 r56208  
    8989#endif
    9090
    91     bool scrollOverflow(int dx, int dy);
    92 
    9391    QWebFrame *q;
    9492    Qt::ScrollBarPolicy horizontalScrollBarPolicy;
  • trunk/WebKit/qt/ChangeLog

    r56184 r56208  
     12010-03-18  Joe Ligman  <joseph.ligman@nokia.com>
     2
     3        Reviewed by Simon Hausmann.
     4
     5        [Qt] New API scrollRecursively has several problems.
     6        https://bugs.webkit.org/show_bug.cgi?id=35873
     7
     8        Remove scrollRecursively from the Qt 4.7 API
     9        Update the internal API to accept a hit test position
     10        for nested scrolling
     11
     12        * Api/qwebframe.cpp:
     13        (webframe_scrollOverflow):
     14        (qtwebkit_webframe_scrollRecursively):
     15        * Api/qwebframe.h:
     16        * Api/qwebframe_p.h:
     17        * tests/qwebframe/tst_qwebframe.cpp:
     18
    1192010-03-18  Antti Koivisto  <koivisto@iki.fi>
    220
  • trunk/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp

    r54857 r56208  
    588588    void evaluateWillCauseRepaint();
    589589    void qObjectWrapperWithSameIdentity();
    590     void scrollRecursively();
    591590    void introspectQtMethods_data();
    592591    void introspectQtMethods();
     
    28562855}
    28572856
    2858 void tst_QWebFrame::scrollRecursively()
    2859 {
    2860     // The test content is
    2861     // a nested frame set
    2862     // The main frame scrolls
    2863     // and has two children
    2864     // an iframe and a div overflow
    2865     // both scroll
    2866     QWebView webView;
    2867     QWebPage* webPage = webView.page();
    2868     QSignalSpy loadSpy(webPage, SIGNAL(loadFinished(bool)));
    2869     QUrl url = QUrl("qrc:///testiframe.html");
    2870     webPage->mainFrame()->load(url);
    2871     QTRY_COMPARE(loadSpy.count(), 1);
    2872 
    2873     QList<QWebFrame*> children =  webPage->mainFrame()->childFrames();
    2874     QVERIFY(children.count() == 1);
    2875 
    2876     // 1st test
    2877     // call scrollRecursively over mainframe
    2878     // verify scrolled
    2879     // verify scroll postion changed
    2880     QPoint scrollPosition(webPage->mainFrame()->scrollPosition());
    2881     QVERIFY(webPage->mainFrame()->scrollRecursively(10, 10));
    2882     QVERIFY(scrollPosition != webPage->mainFrame()->scrollPosition());
    2883 
    2884     // 2nd test
    2885     // call scrollRecursively over child iframe
    2886     // verify scrolled
    2887     // verify child scroll position changed
    2888     // verify parent's scroll position did not change
    2889     scrollPosition = webPage->mainFrame()->scrollPosition();
    2890     QPoint childScrollPosition = children.at(0)->scrollPosition();
    2891     QVERIFY(children.at(0)->scrollRecursively(10, 10));
    2892     QVERIFY(scrollPosition == webPage->mainFrame()->scrollPosition());
    2893     QVERIFY(childScrollPosition != children.at(0)->scrollPosition());
    2894 
    2895     // 3rd test
    2896     // call scrollRecursively over div overflow
    2897     // verify scrolled == true
    2898     // verify parent and child frame's scroll postion did not change
    2899     QWebElement div = webPage->mainFrame()->documentElement().findFirst("#content1");
    2900     QMouseEvent evpres(QEvent::MouseMove, div.geometry().center(), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
    2901     webPage->event(&evpres);
    2902     scrollPosition = webPage->mainFrame()->scrollPosition();
    2903     childScrollPosition = children.at(0)->scrollPosition();
    2904     QVERIFY(webPage->mainFrame()->scrollRecursively(5, 5));
    2905     QVERIFY(childScrollPosition == children.at(0)->scrollPosition());
    2906     QVERIFY(scrollPosition == webPage->mainFrame()->scrollPosition());
    2907 
    2908     // 4th test
    2909     // call scrollRecursively twice over childs iframe
    2910     // verify scrolled == true first time
    2911     // verify parent's scroll == true second time
    2912     // verify parent and childs scroll position changed
    2913     childScrollPosition = children.at(0)->scrollPosition();
    2914     QVERIFY(children.at(0)->scrollRecursively(-10, -10));
    2915     QVERIFY(childScrollPosition != children.at(0)->scrollPosition());
    2916     scrollPosition = webPage->mainFrame()->scrollPosition();
    2917     QVERIFY(children.at(0)->scrollRecursively(-10, -10));
    2918     QVERIFY(scrollPosition != webPage->mainFrame()->scrollPosition());
    2919 
    2920 }
    2921 
    29222857void tst_QWebFrame::introspectQtMethods_data()
    29232858{
Note: See TracChangeset for help on using the changeset viewer.