LayoutTests/ChangeLog

 12011-09-20 Alpha Lam <hclam@chromium.org>
 2
 3 https://bugs.webkit.org/show_bug.cgi?id=68081
 4 Add layout test for page scale and scrolling.
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Add tests to cover the following cases:
 9 1. Scale and scroll window
 10 2. Scale and scroll document.body
 11 3. Scale and scroll iframe's contentWindow
 12 4. Scale and scroll iframe's contentDocument.body
 13
 14 * fast/events/scale-and-scroll-body-expected.png: Added.
 15 * fast/events/scale-and-scroll-body-expected.txt: Added.
 16 * fast/events/scale-and-scroll-body.html: Added.
 17 * fast/events/scale-and-scroll-iframe-body-expected.png: Added.
 18 * fast/events/scale-and-scroll-iframe-body-expected.txt: Added.
 19 * fast/events/scale-and-scroll-iframe-body.html: Added.
 20 * fast/events/scale-and-scroll-iframe-window-expected.png: Added.
 21 * fast/events/scale-and-scroll-iframe-window-expected.txt: Added.
 22 * fast/events/scale-and-scroll-iframe-window.html: Added.
 23 * fast/events/scale-and-scroll-window-expected.png: Added.
 24 * fast/events/scale-and-scroll-window-expected.txt: Added.
 25 * fast/events/scale-and-scroll-window.html: Added.
 26
1272011-09-19 Zsolt Fehér <feherzs@inf.u-szeged.hu>
228
329 Unreviewed Qt gardening.

LayoutTests/fast/events/scale-and-scroll-body-expected.png


Added

434dfbc3a727bff1e469fa8598d27863

LayoutTests/fast/events/scale-and-scroll-body-expected.txt

 1PASS window.document.body.scrollTop is 100
 2PASS window.document.body.scrollLeft is 100
 3PASS window.scrollX is 100
 4PASS window.scrollY is 100
 5

LayoutTests/fast/events/scale-and-scroll-body.html

 1<html>
 2<head>
 3 <style>
 4 ::-webkit-scrollbar {
 5 width: 0px;
 6 height: 0px;
 7 }
 8 </style>
 9 <script>
 10 window.enablePixelTesting = true;
 11
 12 function scroll() {
 13 // The page scale, as set by EventSender.scalePageBy should not be apparent
 14 // to javascript. So, we expect scrolling to (100,100) to be page coordinates, rather
 15 // than device pixels.
 16 document.body.scrollLeft = 100;
 17 document.body.scrollTop = 100;
 18
 19 shouldBe("window.document.body.scrollTop", "100");
 20 shouldBe("window.document.body.scrollLeft", "100");
 21 shouldBe("window.scrollX", "100");
 22 shouldBe("window.scrollY", "100");
 23 }
 24
 25 function scaleWithEventSender() {
 26 var scaleFactor = 2.0;
 27 var scaleOffset = 0;
 28 if (window.eventSender) {
 29 eventSender.scalePageBy(scaleFactor, scaleOffset, scaleOffset);
 30 }
 31 }
 32
 33 function test() {
 34 scaleWithEventSender();
 35 scroll();
 36 }
 37 </script>
 38 <script src="../js/resources/js-test-pre.js"></script>
 39</head>
 40<body style="width:2000px; height:2000px; margin:0px;" onload="test();">
 41 <div style="left:0; top:0; width:100px; height:100px; position:absolute; background:yellow;"></div>
 42 <div style="left:100px; top:0; width:100px; height:100px; position:absolute; background:green;"></div>
 43 <div style="left:200px; top:0; width:100px; height:100px; position:absolute; background:blue;"></div>
 44
 45 <div style="left:0; top:100px; width:100px; height:100px; position:absolute; background: green;"></div>
 46 <div style="left:100px; top:100px; width:100px; height:100px; position:absolute; background:blue;"></div>
 47 <div style="left:200px; top:100px; width:100px; height:100px; position:absolute; background:yellow;"></div>
 48
 49 <div id="console"></div>
 50</body>
 51</html>

LayoutTests/fast/events/scale-and-scroll-iframe-body-expected.png


Added

2fbcd8b524cd1ca33fe5e988bd12dce1

LayoutTests/fast/events/scale-and-scroll-iframe-body-expected.txt

 1
 2PASS frame.contentDocument.body.scrollTop is 100
 3PASS frame.contentDocument.body.scrollLeft is 100
 4PASS frame.contentWindow.scrollX is 100
 5PASS frame.contentWindow.scrollY is 100
 6

LayoutTests/fast/events/scale-and-scroll-iframe-body.html

 1<html>
 2<head>
 3 <style>
 4 ::-webkit-scrollbar {
 5 width: 0px;
 6 height: 0px;
 7 }
 8 </style>
 9 <script>
 10 window.enablePixelTesting = true;
 11
 12 function scroll() {
 13 window.scrollTo(0, 100);
 14 var frame = document.getElementById('frame');
 15 frame.contentDocument.body.scrollTop = 100;
 16 frame.contentDocument.body.scrollLeft = 100;
 17
 18 shouldBe("frame.contentDocument.body.scrollTop", "100");
 19 shouldBe("frame.contentDocument.body.scrollLeft", "100");
 20 shouldBe("frame.contentWindow.scrollX", "100");
 21 shouldBe("frame.contentWindow.scrollY", "100");
 22 }
 23
 24 function scaleWithEventSender() {
 25 var scaleFactor = 0.5;
 26 var scaleOffset = 0;
 27 if (window.eventSender) {
 28 eventSender.scalePageBy(scaleFactor, scaleOffset, scaleOffset);
 29 }
 30 }
 31
 32 function test() {
 33 scaleWithEventSender();
 34 scroll();
 35 }
 36 </script>
 37 <script src="../js/resources/js-test-pre.js"></script>
 38</head>
 39<body onload="test();" style="height: 2000px">
 40 <iframe id="frame" style="width:400px; height: 400px; position: absolute; top: 100px;"></iframe>
 41 <div id="console"></div>
 42
 43 <script>
 44 var frame = document.getElementById('frame');
 45 var doc = frame.contentDocument.open();
 46 doc.write("<div style='left:0; top:0; width:100px; height:100px; position:absolute; background:yellow;'></div>");
 47 doc.write("<div style='left:100px; top:0; width:100px; height:100px; position:absolute; background:green;'></div>");
 48 doc.write("<div style='left:200px; top:0; width:100px; height:100px; position:absolute; background:blue;'></div>");
 49 doc.write("<div style='left:300px; top:0; width:100px; height:100px; position:absolute; background:green;'></div>");
 50 doc.write("<div style='left:400px; top:0; width:100px; height:100px; position:absolute; background:blue;'></div>");
 51
 52 doc.write("<div style='left:0; top:100px; width:100px; height:100px; position:absolute; background: green;'></div>");
 53 doc.write("<div style='left:100px; top:100px; width:100px; height:100px; position:absolute; background:blue;'></div>");
 54 doc.write("<div style='left:200px; top:100px; width:100px; height:100px; position:absolute; background:green;'></div>");
 55 doc.write("<div style='left:300px; top:100px; width:100px; height:100px; position:absolute; background:blue;'></div>");
 56 doc.write("<div style='left:400px; top:100px; width:100px; height:100px; position:absolute; background:green;'></div>");
 57 doc.close();
 58 frame.contentDocument.body.style.width = "2000px";
 59 frame.contentDocument.body.style.height = "2000px";
 60 </script>
 61</body>
 62</html>

LayoutTests/fast/events/scale-and-scroll-iframe-window-expected.png


Added

2fbcd8b524cd1ca33fe5e988bd12dce1

LayoutTests/fast/events/scale-and-scroll-iframe-window-expected.txt

 1PASS frame.contentDocument.body.scrollTop is 100
 2PASS frame.contentDocument.body.scrollLeft is 100
 3PASS frame.contentWindow.scrollX is 100
 4PASS frame.contentWindow.scrollY is 100
 5

LayoutTests/fast/events/scale-and-scroll-iframe-window.html

 1<html>
 2<head>
 3 <style>
 4 ::-webkit-scrollbar {
 5 width: 0px;
 6 height: 0px;
 7 }
 8 </style>
 9 <script>
 10 window.enablePixelTesting = true;
 11
 12 function scroll() {
 13 window.scrollTo(0, 100);
 14 var frame = document.getElementById('frame');
 15 frame.contentWindow.scrollTo(100,100);
 16
 17 shouldBe("frame.contentDocument.body.scrollTop", "100");
 18 shouldBe("frame.contentDocument.body.scrollLeft", "100");
 19 shouldBe("frame.contentWindow.scrollX", "100");
 20 shouldBe("frame.contentWindow.scrollY", "100");
 21 }
 22
 23 function scaleWithEventSender() {
 24 var scaleFactor = 0.5;
 25 var scaleOffset = 0;
 26 if (window.eventSender) {
 27 eventSender.scalePageBy(scaleFactor, scaleOffset, scaleOffset);
 28 }
 29 }
 30
 31 function test() {
 32 scaleWithEventSender();
 33 scroll();
 34 }
 35 </script>
 36 <script src="../js/resources/js-test-pre.js"></script>
 37</head>
 38<body onload="test();" style="height: 2000px">
 39 <div id="console"></div>
 40 <iframe id="frame" style="width:400px; height: 400px; position: absolute; top: 100px;"></iframe>
 41
 42 <script>
 43 var frame = document.getElementById('frame');
 44 var doc = frame.contentDocument.open();
 45 doc.write("<div style='left:0; top:0; width:100px; height:100px; position:absolute; background:yellow;'></div>");
 46 doc.write("<div style='left:100px; top:0; width:100px; height:100px; position:absolute; background:green;'></div>");
 47 doc.write("<div style='left:200px; top:0; width:100px; height:100px; position:absolute; background:blue;'></div>");
 48 doc.write("<div style='left:300px; top:0; width:100px; height:100px; position:absolute; background:green;'></div>");
 49 doc.write("<div style='left:400px; top:0; width:100px; height:100px; position:absolute; background:blue;'></div>");
 50
 51 doc.write("<div style='left:0; top:100px; width:100px; height:100px; position:absolute; background: green;'></div>");
 52 doc.write("<div style='left:100px; top:100px; width:100px; height:100px; position:absolute; background:blue;'></div>");
 53 doc.write("<div style='left:200px; top:100px; width:100px; height:100px; position:absolute; background:green;'></div>");
 54 doc.write("<div style='left:300px; top:100px; width:100px; height:100px; position:absolute; background:blue;'></div>");
 55 doc.write("<div style='left:400px; top:100px; width:100px; height:100px; position:absolute; background:green;'></div>");
 56 doc.close();
 57 frame.contentDocument.body.style.width = "2000px";
 58 frame.contentDocument.body.style.height = "2000px";
 59 </script>
 60</body>
 61</html>

LayoutTests/fast/events/scale-and-scroll-window-expected.png


Added

434dfbc3a727bff1e469fa8598d27863

LayoutTests/fast/events/scale-and-scroll-window-expected.txt

 1PASS window.document.body.scrollTop is 100
 2PASS window.document.body.scrollLeft is 100
 3PASS window.scrollX is 100
 4PASS window.scrollY is 100
 5

LayoutTests/fast/events/scale-and-scroll-window.html

 1<html>
 2<head>
 3 <style>
 4 ::-webkit-scrollbar {
 5 width: 0px;
 6 height: 0px;
 7 }
 8 </style>
 9 <script>
 10 window.enablePixelTesting = true;
 11
 12 function scroll() {
 13 // The page scale, as set by EventSender.scalePageBy should not be apparent
 14 // to javascript. So, we expect scrolling to (100,100) to be page coordinates, rather
 15 // than device pixels.
 16 window.scrollTo(100,100);
 17
 18 shouldBe("window.document.body.scrollTop", "100");
 19 shouldBe("window.document.body.scrollLeft", "100");
 20 shouldBe("window.scrollX", "100");
 21 shouldBe("window.scrollY", "100");
 22 }
 23
 24 function scaleWithEventSender() {
 25 var scaleFactor = 2.0;
 26 var scaleOffset = 0;
 27 if (window.eventSender) {
 28 eventSender.scalePageBy(scaleFactor, scaleOffset, scaleOffset);
 29 }
 30 }
 31
 32 function test() {
 33 scaleWithEventSender();
 34 scroll();
 35 }
 36 </script>
 37 <script src="../js/resources/js-test-pre.js"></script>
 38</head>
 39<body style="width:2000px; height:2000px; margin:0px;" onload="test();">
 40 <div style="left:0; top:0; width:100px; height:100px; position:absolute; background:yellow;"></div>
 41 <div style="left:100px; top:0; width:100px; height:100px; position:absolute; background:green;"></div>
 42 <div style="left:200px; top:0; width:100px; height:100px; position:absolute; background:blue;"></div>
 43
 44 <div style="left:0; top:100px; width:100px; height:100px; position:absolute; background: green;"></div>
 45 <div style="left:100px; top:100px; width:100px; height:100px; position:absolute; background:blue;"></div>
 46 <div style="left:200px; top:100px; width:100px; height:100px; position:absolute; background:yellow;"></div>
 47
 48 <div id="console"></div>
 49</body>
 50</html>

Source/WebCore/ChangeLog

 12011-09-20 Alpha Lam <hclam@chromium.org>
 2
 3 https://bugs.webkit.org/show_bug.cgi?id=68081
 4 Fix scroll in page scaling mode.
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 The following things are done in this patch:
 9 1. Rename Frame::pageScaleFactor() to Frame::frameScaleFactor() to better
 10 reflect its purpose.
 11 2. Frame::frameScaleFactor() returns the scale factor of this frame with
 12 respect to the container. So for the main frame it'll return the scale
 13 factor of the page, inner frames will return 1.0
 14 3. scrollBy(), scrollX() and scrollY() to take into account of the frame
 15 scale factor, causing incorrect coordinates reported to Javascript.
 16
 17 Tests: fast/events/scale-and-scroll-body.html
 18 fast/events/scale-and-scroll-iframe-body.html
 19 fast/events/scale-and-scroll-iframe-window.html
 20 fast/events/scale-and-scroll-window.html
 21
 22 * html/HTMLBodyElement.cpp:
 23 (WebCore::adjustForZoom):
 24 (WebCore::HTMLBodyElement::setScrollLeft):
 25 (WebCore::HTMLBodyElement::setScrollTop):
 26 * loader/HistoryController.cpp:
 27 (WebCore::HistoryController::saveScrollPositionAndViewStateToItem):
 28 * page/DOMWindow.cpp:
 29 (WebCore::DOMWindow::scrollX):
 30 (WebCore::DOMWindow::scrollY):
 31 (WebCore::DOMWindow::scrollTo):
 32 * page/Frame.cpp:
 33 (WebCore::Frame::frameScaleFactor): Return page's scale factor if this is
 34 main frame, otherwise 1.0
 35 * page/Frame.h:
 36 * page/FrameView.cpp:
 37 (WebCore::FrameView::applyOverflowToViewport):
 38 (WebCore::FrameView::scrollXForFixedPosition):
 39 (WebCore::FrameView::scrollYForFixedPosition):
 40
1412011-09-19 Ademar de Souza Reis Jr. <ademar.reis@openbossa.org>
242
343 Unreviewed: dos2unix on bindings/js/JSExceptionBase.h

Source/WebCore/html/HTMLBodyElement.cpp

@@void HTMLBodyElement::setVLink(const String& value)
267267static int adjustForZoom(int value, Document* document)
268268{
269269 Frame* frame = document->frame();
270  float zoomFactor = frame->pageZoomFactor() * frame->pageScaleFactor();
 270 float zoomFactor = frame->pageZoomFactor() * frame->frameScaleFactor();
271271 if (zoomFactor == 1)
272272 return value;
273273 // Needed because of truncation (rather than rounding) when scaling up.

@@void HTMLBodyElement::setScrollLeft(int scrollLeft)
295295 FrameView* view = frame->view();
296296 if (!view)
297297 return;
298  view->setScrollPosition(IntPoint(static_cast<int>(scrollLeft * frame->pageZoomFactor() * frame->pageScaleFactor()), view->scrollY()));
 298 view->setScrollPosition(IntPoint(static_cast<int>(scrollLeft * frame->pageZoomFactor() * frame->frameScaleFactor()), view->scrollY()));
299299}
300300
301301int HTMLBodyElement::scrollTop()

@@void HTMLBodyElement::setScrollTop(int scrollTop)
317317 FrameView* view = frame->view();
318318 if (!view)
319319 return;
320  view->setScrollPosition(IntPoint(view->scrollX(), static_cast<int>(scrollTop * frame->pageZoomFactor() * frame->pageScaleFactor())));
 320 view->setScrollPosition(IntPoint(view->scrollX(), static_cast<int>(scrollTop * frame->pageZoomFactor() * frame->frameScaleFactor())));
321321}
322322
323323int HTMLBodyElement::scrollHeight()

Source/WebCore/loader/HistoryController.cpp

@@void HistoryController::saveScrollPositionAndViewStateToItem(HistoryItem* item)
8686 else
8787 item->setScrollPoint(m_frame->view()->scrollPosition());
8888
89  item->setPageScaleFactor(m_frame->pageScaleFactor());
 89 item->setPageScaleFactor(m_frame->frameScaleFactor());
9090
9191 // FIXME: It would be great to work out a way to put this code in WebCore instead of calling through to the client.
9292 m_frame->loader()->client()->saveViewStateToItem(item);

Source/WebCore/page/DOMWindow.cpp

@@int DOMWindow::scrollX() const
11431143
11441144 m_frame->document()->updateLayoutIgnorePendingStylesheets();
11451145
1146  return static_cast<int>(view->scrollX() / m_frame->pageZoomFactor());
 1146 return static_cast<int>(view->scrollX() / (m_frame->pageZoomFactor() * m_frame->frameScaleFactor()));
11471147}
11481148
11491149int DOMWindow::scrollY() const

@@int DOMWindow::scrollY() const
11571157
11581158 m_frame->document()->updateLayoutIgnorePendingStylesheets();
11591159
1160  return static_cast<int>(view->scrollY() / m_frame->pageZoomFactor());
 1160 return static_cast<int>(view->scrollY() / (m_frame->pageZoomFactor() * m_frame->frameScaleFactor()));
11611161}
11621162
11631163bool DOMWindow::closed() const

@@void DOMWindow::scrollTo(int x, int y) const
13841384 if (!view)
13851385 return;
13861386
1387  int zoomedX = static_cast<int>(x * m_frame->pageZoomFactor());
1388  int zoomedY = static_cast<int>(y * m_frame->pageZoomFactor());
 1387 int zoomedX = static_cast<int>(x * m_frame->pageZoomFactor() * m_frame->frameScaleFactor());
 1388 int zoomedY = static_cast<int>(y * m_frame->pageZoomFactor() * m_frame->frameScaleFactor());
13891389 view->setScrollPosition(IntPoint(zoomedX, zoomedY));
13901390}
13911391

Source/WebCore/page/Frame.cpp

@@void Frame::setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor
10231023 page->backForward()->markPagesForFullStyleRecalc();
10241024}
10251025
1026 float Frame::pageScaleFactor() const
 1026float Frame::frameScaleFactor() const
10271027{
10281028 Page* page = this->page();
1029  if (!page)
 1029
 1030 // Main frame is scaled with respect to he container but inner frames are not scaled with respect to the main frame.
 1031 if (!page || page->mainFrame() != this)
10301032 return 1;
10311033 return page->pageScaleFactor();
10321034}

Source/WebCore/page/Frame.h

@@namespace WebCore {
161161 float textZoomFactor() const { return m_textZoomFactor; }
162162 void setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor);
163163
164  // Convenience helper method that grabs the pageScaleFactor from Page.
165  float pageScaleFactor() const;
 164 // Scale factor of this frame with respect to the container.
 165 float frameScaleFactor() const;
166166
167167#if USE(ACCELERATED_COMPOSITING)
168168 void deviceOrPageScaleFactorChanged();

Source/WebCore/page/FrameView.cpp

@@void FrameView::applyOverflowToViewport(RenderObject* o, ScrollbarMode& hMode, S
525525 // use the root element.
526526
527527 // To combat the inability to scroll on a page with overflow:hidden on the root when scaled, disregard hidden when
528  // there is a pageScaleFactor that is greater than one on the main frame.
 528 // there is a frameScaleFactor that is greater than one on the main frame.
529529
530  bool overrideHidden = m_frame->page() && m_frame->page()->mainFrame() == m_frame && m_frame->pageScaleFactor() > 1;
 530 bool overrideHidden = m_frame->page() && m_frame->page()->mainFrame() == m_frame && m_frame->frameScaleFactor() > 1;
531531
532532 switch (o->style()->overflowX()) {
533533 case OHIDDEN:

@@LayoutUnit FrameView::scrollXForFixedPosition() const
13491349 if (!m_frame)
13501350 return x;
13511351
1352  float pageScaleFactor = m_frame->pageScaleFactor();
 1352 float frameScaleFactor = m_frame->frameScaleFactor();
13531353
13541354 // When the page is scaled, the scaled "viewport" with respect to which fixed object are positioned
13551355 // doesn't move as fast as the content view, so that when the content is scrolled all the way to the
13561356 // end, the bottom of the scaled "viewport" touches the bottom of the real viewport.
1357  float dragFactor = (contentsWidth() - visibleContentWidth * pageScaleFactor) / maxX;
 1357 float dragFactor = (contentsWidth() - visibleContentWidth * frameScaleFactor) / maxX;
13581358
1359  return x * dragFactor / pageScaleFactor;
 1359 return x * dragFactor / frameScaleFactor;
13601360}
13611361
13621362LayoutUnit FrameView::scrollYForFixedPosition() const

@@LayoutUnit FrameView::scrollYForFixedPosition() const
13841384 if (!m_frame)
13851385 return y;
13861386
1387  float pageScaleFactor = m_frame->pageScaleFactor();
1388  float dragFactor = (contentsHeight() - visibleContentHeight * pageScaleFactor) / maxY;
 1387 float frameScaleFactor = m_frame->frameScaleFactor();
 1388 float dragFactor = (contentsHeight() - visibleContentHeight * frameScaleFactor) / maxY;
13891389
1390  return y * dragFactor / pageScaleFactor;
 1390 return y * dragFactor / frameScaleFactor;
13911391}
13921392
13931393LayoutSize FrameView::scrollOffsetForFixedPosition() const