Changeset 56208 in webkit
- Timestamp:
- Mar 18, 2010 9:51:35 PM (14 years ago)
- Location:
- trunk/WebKit/qt
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebKit/qt/Api/qwebframe.cpp
r56141 r56208 267 267 } 268 268 269 static 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 */ 313 void 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 269 349 QWebFrameData::QWebFrameData(WebCore::Page* parentPage, WebCore::Frame* parentFrame, 270 350 WebCore::HTMLFrameOwnerElement* ownerFrameElement, … … 428 508 painter->restore(); 429 509 } 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);469 510 } 470 511 … … 1108 1149 1109 1150 /*! 1110 \since 4.71111 Scrolls nested frames starting at this frame, \a dx pixels to the right1112 and \a dy pixels downward. Both \a dx and \a dy may be negative. First attempts1113 to scroll elements with CSS overflow followed by this frame. If this1114 frame doesn't scroll, attempts to scroll the parent1115 1116 \sa QWebFrame::scroll1117 */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 right1134 scrolledHorizontal = scrollOffset.width() < maxScrollOffset.x();1135 else if (dx < 0) // scroll left1136 scrolledHorizontal = scrollOffset.width() > 0;1137 1138 if (dy > 0) // scroll down1139 scrolledVertical = scrollOffset.height() < maxScrollOffset.y();1140 else if (dy < 0) //scroll up1141 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 /*!1159 1151 \property QWebFrame::scrollPosition 1160 1152 \since 4.5 -
trunk/WebKit/qt/Api/qwebframe.h
r55978 r56208 157 157 158 158 void scroll(int, int); 159 bool scrollRecursively(int, int);160 159 QPoint scrollPosition() const; 161 160 void setScrollPosition(const QPoint &pos); -
trunk/WebKit/qt/Api/qwebframe_p.h
r56141 r56208 89 89 #endif 90 90 91 bool scrollOverflow(int dx, int dy);92 93 91 QWebFrame *q; 94 92 Qt::ScrollBarPolicy horizontalScrollBarPolicy; -
trunk/WebKit/qt/ChangeLog
r56184 r56208 1 2010-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 1 19 2010-03-18 Antti Koivisto <koivisto@iki.fi> 2 20 -
trunk/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp
r54857 r56208 588 588 void evaluateWillCauseRepaint(); 589 589 void qObjectWrapperWithSameIdentity(); 590 void scrollRecursively();591 590 void introspectQtMethods_data(); 592 591 void introspectQtMethods(); … … 2856 2855 } 2857 2856 2858 void tst_QWebFrame::scrollRecursively()2859 {2860 // The test content is2861 // a nested frame set2862 // The main frame scrolls2863 // and has two children2864 // an iframe and a div overflow2865 // both scroll2866 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 test2877 // call scrollRecursively over mainframe2878 // verify scrolled2879 // verify scroll postion changed2880 QPoint scrollPosition(webPage->mainFrame()->scrollPosition());2881 QVERIFY(webPage->mainFrame()->scrollRecursively(10, 10));2882 QVERIFY(scrollPosition != webPage->mainFrame()->scrollPosition());2883 2884 // 2nd test2885 // call scrollRecursively over child iframe2886 // verify scrolled2887 // verify child scroll position changed2888 // verify parent's scroll position did not change2889 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 test2896 // call scrollRecursively over div overflow2897 // verify scrolled == true2898 // verify parent and child frame's scroll postion did not change2899 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 test2909 // call scrollRecursively twice over childs iframe2910 // verify scrolled == true first time2911 // verify parent's scroll == true second time2912 // verify parent and childs scroll position changed2913 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 2922 2857 void tst_QWebFrame::introspectQtMethods_data() 2923 2858 {
Note: See TracChangeset
for help on using the changeset viewer.