Diff
Modified: trunk/LayoutTests/ChangeLog (119689 => 119690)
--- trunk/LayoutTests/ChangeLog 2012-06-07 06:54:04 UTC (rev 119689)
+++ trunk/LayoutTests/ChangeLog 2012-06-07 06:57:19 UTC (rev 119690)
@@ -1,3 +1,16 @@
+2012-06-06 Xianzhu Wang <[email protected]>
+
+ Element.getBoundingClientRect() and Element.getClientRects() return incorrect values in frames in a scaled page
+ https://bugs.webkit.org/show_bug.cgi?id=88430
+
+ Reviewed by James Robinson.
+
+ * fast/dom/Element/resources/client-rect-frame.html: Added.
+ * fast/dom/Element/scale-page-bounding-client-rect-in-frame-expected.txt: Added.
+ * fast/dom/Element/scale-page-bounding-client-rect-in-frame.html: Added.
+ * fast/dom/Element/scale-page-client-rects-in-frame-expected.txt: Added.
+ * fast/dom/Element/scale-page-client-rects-in-frame.html: Added.
+
2012-06-06 Sheriff Bot <[email protected]>
Unreviewed, rolling out r119668.
Added: trunk/LayoutTests/fast/dom/Element/resources/client-rect-frame.html (0 => 119690)
--- trunk/LayoutTests/fast/dom/Element/resources/client-rect-frame.html (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/resources/client-rect-frame.html 2012-06-07 06:57:19 UTC (rev 119690)
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<html>
+<body>
+ <div id="div" style="margin-left:60px; margin-top:33px; width:150px; height:110px; background-color:green;"></div>
+</body>
+</html>
Added: trunk/LayoutTests/fast/dom/Element/scale-page-bounding-client-rect-in-frame-expected.txt (0 => 119690)
--- trunk/LayoutTests/fast/dom/Element/scale-page-bounding-client-rect-in-frame-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/scale-page-bounding-client-rect-in-frame-expected.txt 2012-06-07 06:57:19 UTC (rev 119690)
@@ -0,0 +1,2 @@
+
+Pass
Added: trunk/LayoutTests/fast/dom/Element/scale-page-bounding-client-rect-in-frame.html (0 => 119690)
--- trunk/LayoutTests/fast/dom/Element/scale-page-bounding-client-rect-in-frame.html (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/scale-page-bounding-client-rect-in-frame.html 2012-06-07 06:57:19 UTC (rev 119690)
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function testRects()
+{
+ if (!window.layoutTestController || !window.internals)
+ return;
+ layoutTestController.dumpAsText();
+
+ var div = document.getElementById("frame").contentDocument.getElementById("div");
+ var rect = div.getBoundingClientRect();
+ window.internals.settings.setPageScaleFactor(2, 0, 0);
+ var scaledRect = div.getBoundingClientRect();
+
+ var result = document.getElementById("result");
+ if (rect.left == scaledRect.left &&
+ rect.top == scaledRect.top &&
+ rect.right == scaledRect.right &&
+ rect.bottom == scaledRect.bottom)
+ result.innerHTML = "Pass";
+ else
+ result.innerHTML = "Fail";
+
+}
+</script>
+</head>
+
+<body _onload_="testRects();">
+ <iframe id="frame" src="" width="300" height="200"></iframe>
+ <p id="result">This test must be run via DumpRenderTree.</p>
+</body>
+</html>
Added: trunk/LayoutTests/fast/dom/Element/scale-page-client-rects-in-frame-expected.txt (0 => 119690)
--- trunk/LayoutTests/fast/dom/Element/scale-page-client-rects-in-frame-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/scale-page-client-rects-in-frame-expected.txt 2012-06-07 06:57:19 UTC (rev 119690)
@@ -0,0 +1,2 @@
+
+Pass
Added: trunk/LayoutTests/fast/dom/Element/scale-page-client-rects-in-frame.html (0 => 119690)
--- trunk/LayoutTests/fast/dom/Element/scale-page-client-rects-in-frame.html (rev 0)
+++ trunk/LayoutTests/fast/dom/Element/scale-page-client-rects-in-frame.html 2012-06-07 06:57:19 UTC (rev 119690)
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function testRects()
+{
+ if (!window.layoutTestController || !window.internals)
+ return;
+ layoutTestController.dumpAsText();
+
+ var div = document.getElementById("frame").contentDocument.getElementById("div");
+ var rect = div.getClientRects()[0];
+ window.internals.settings.setPageScaleFactor(2, 0, 0);
+ var scaledRect = div.getClientRects()[0];
+
+ var result = document.getElementById("result");
+ if (rect.left == scaledRect.left &&
+ rect.top == scaledRect.top &&
+ rect.right == scaledRect.right &&
+ rect.bottom == scaledRect.bottom)
+ result.innerHTML = "Pass";
+ else
+ result.innerHTML = "Fail";
+
+}
+</script>
+</head>
+
+<body _onload_="testRects();">
+ <iframe id="frame" src="" width="300" height="200"></iframe>
+ <p id="result">This test must be run via DumpRenderTree.</p>
+</body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (119689 => 119690)
--- trunk/Source/WebCore/ChangeLog 2012-06-07 06:54:04 UTC (rev 119689)
+++ trunk/Source/WebCore/ChangeLog 2012-06-07 06:57:19 UTC (rev 119690)
@@ -1,3 +1,33 @@
+2012-06-06 Xianzhu Wang <[email protected]>
+
+ Element.getBoundingClientRect() and Element.getClientRects() return incorrect values in frames in a scaled page
+ https://bugs.webkit.org/show_bug.cgi?id=88430
+
+ Element.getBoudingClientRect() and Element.getClientRects() should not scale back the rects
+ if the element is in a frame because page scale only apply to elements in the main frame.
+
+ Reviewed by James Robinson.
+
+ Tests: fast/dom/Element/scale-page-bounding-client-rect-in-frame.html
+ fast/dom/Element/scale-page-client-rects-in-frame.html
+
+ * dom/Document.cpp:
+ (WebCore):
+ (WebCore::Document::adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale): Extracted from Element.cpp and Range.cpp and fixed issue of pageScale in frames.
+ (WebCore::Document::adjustFloatRectForScrollAndAbsoluteZoomAndFrameScale): Extracted from Element.cpp and fixed issue of pageScale in frames.
+ * dom/Document.h:
+ (WebCore):
+ (Document):
+ * dom/Element.cpp:
+ (WebCore::Element::getClientRects):
+ (WebCore::Element::getBoundingClientRect):
+ * dom/Range.cpp:
+ (WebCore):
+ (WebCore::adjustFloatQuadsForScrollAndAbsoluteZoomAndPageScale): Moved into Document and fixed issue of pageScale in frames.
+ (WebCore::Range::getBorderAndTextQuads):
+ * rendering/RenderObject.h: Removed adjustFloatQuadForPageScale and adjustFloatRectForPageScale because they seem unrelated to RenderObject.
+ (WebCore):
+
2012-06-06 Dana Jansens <[email protected]>
[chromium] In each composited frame, didDraw() should only be called on layers for which willDraw() was called
Modified: trunk/Source/WebCore/dom/Document.cpp (119689 => 119690)
--- trunk/Source/WebCore/dom/Document.cpp 2012-06-07 06:54:04 UTC (rev 119689)
+++ trunk/Source/WebCore/dom/Document.cpp 2012-06-07 06:57:19 UTC (rev 119690)
@@ -6038,4 +6038,38 @@
return node;
}
+void Document::adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(Vector<FloatQuad>& quads, RenderObject* renderer)
+{
+ if (!view())
+ return;
+
+ float inverseFrameScale = 1;
+ if (frame())
+ inverseFrameScale = 1 / frame()->frameScaleFactor();
+
+ LayoutRect visibleContentRect = view()->visibleContentRect();
+ for (size_t i = 0; i < quads.size(); ++i) {
+ quads[i].move(-visibleContentRect.x(), -visibleContentRect.y());
+ adjustFloatQuadForAbsoluteZoom(quads[i], renderer);
+ if (inverseFrameScale != 1)
+ quads[i].scale(inverseFrameScale, inverseFrameScale);
+ }
+}
+
+void Document::adjustFloatRectForScrollAndAbsoluteZoomAndFrameScale(FloatRect& rect, RenderObject* renderer)
+{
+ if (!view())
+ return;
+
+ float inverseFrameScale = 1;
+ if (frame())
+ inverseFrameScale = 1 / frame()->frameScaleFactor();
+
+ LayoutRect visibleContentRect = view()->visibleContentRect();
+ rect.move(-visibleContentRect.x(), -visibleContentRect.y());
+ adjustFloatRectForAbsoluteZoom(rect, renderer);
+ if (inverseFrameScale != 1)
+ rect.scale(inverseFrameScale);
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/dom/Document.h (119689 => 119690)
--- trunk/Source/WebCore/dom/Document.h 2012-06-07 06:54:04 UTC (rev 119689)
+++ trunk/Source/WebCore/dom/Document.h 2012-06-07 06:57:19 UTC (rev 119690)
@@ -83,6 +83,8 @@
class EntityReference;
class Event;
class EventListener;
+class FloatRect;
+class FloatQuad;
class FontData;
class FormAssociatedElement;
class Frame;
@@ -1160,6 +1162,9 @@
Prerenderer* prerenderer() { return m_prerenderer.get(); }
#endif
+ void adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(Vector<FloatQuad>&, RenderObject*);
+ void adjustFloatRectForScrollAndAbsoluteZoomAndFrameScale(FloatRect&, RenderObject*);
+
protected:
Document(Frame*, const KURL&, bool isXHTML, bool isHTML);
Modified: trunk/Source/WebCore/dom/Element.cpp (119689 => 119690)
--- trunk/Source/WebCore/dom/Element.cpp 2012-06-07 06:54:04 UTC (rev 119689)
+++ trunk/Source/WebCore/dom/Element.cpp 2012-06-07 06:57:19 UTC (rev 119690)
@@ -557,21 +557,7 @@
Vector<FloatQuad> quads;
renderBoxModelObject->absoluteQuads(quads);
-
- float pageScale = 1;
- if (Page* page = document()->page())
- pageScale = page->pageScaleFactor();
-
- if (FrameView* view = document()->view()) {
- LayoutRect visibleContentRect = view->visibleContentRect();
- for (size_t i = 0; i < quads.size(); ++i) {
- quads[i].move(-visibleContentRect.x(), -visibleContentRect.y());
- adjustFloatQuadForAbsoluteZoom(quads[i], renderBoxModelObject);
- if (pageScale != 1)
- adjustFloatQuadForPageScale(quads[i], pageScale);
- }
- }
-
+ document()->adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(quads, renderBoxModelObject);
return ClientRectList::create(quads);
}
@@ -602,15 +588,7 @@
for (size_t i = 1; i < quads.size(); ++i)
result.unite(quads[i].boundingBox());
- if (FrameView* view = document()->view()) {
- LayoutRect visibleContentRect = view->visibleContentRect();
- result.move(-visibleContentRect.x(), -visibleContentRect.y());
- }
-
- adjustFloatRectForAbsoluteZoom(result, renderer());
- if (Page* page = document()->page())
- adjustFloatRectForPageScale(result, page->pageScaleFactor());
-
+ document()->adjustFloatRectForScrollAndAbsoluteZoomAndFrameScale(result, renderer());
return ClientRect::create(result);
}
Modified: trunk/Source/WebCore/dom/Range.cpp (119689 => 119690)
--- trunk/Source/WebCore/dom/Range.cpp 2012-06-07 06:54:04 UTC (rev 119689)
+++ trunk/Source/WebCore/dom/Range.cpp 2012-06-07 06:57:19 UTC (rev 119690)
@@ -1940,25 +1940,6 @@
return ClientRect::create(boundingRect());
}
-static void adjustFloatQuadsForScrollAndAbsoluteZoomAndPageScale(Vector<FloatQuad>& quads, Document* document, RenderObject* renderer)
-{
- FrameView* view = document->view();
- if (!view)
- return;
-
- float pageScale = 1;
- if (Page* page = document->page())
- pageScale = page->pageScaleFactor();
-
- LayoutRect visibleContentRect = view->visibleContentRect();
- for (size_t i = 0; i < quads.size(); ++i) {
- quads[i].move(-visibleContentRect.x(), -visibleContentRect.y());
- adjustFloatQuadForAbsoluteZoom(quads[i], renderer);
- if (pageScale != 1)
- adjustFloatQuadForPageScale(quads[i], pageScale);
- }
-}
-
void Range::getBorderAndTextQuads(Vector<FloatQuad>& quads) const
{
Node* startContainer = m_start.container();
@@ -1977,7 +1958,7 @@
if (RenderBoxModelObject* renderBoxModelObject = static_cast<Element*>(node)->renderBoxModelObject()) {
Vector<FloatQuad> elementQuads;
renderBoxModelObject->absoluteQuads(elementQuads);
- adjustFloatQuadsForScrollAndAbsoluteZoomAndPageScale(elementQuads, m_ownerDocument.get(), renderBoxModelObject);
+ m_ownerDocument->adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(elementQuads, renderBoxModelObject);
quads.append(elementQuads);
}
@@ -1990,7 +1971,7 @@
Vector<FloatQuad> textQuads;
renderText->absoluteQuadsForRange(textQuads, startOffset, endOffset);
- adjustFloatQuadsForScrollAndAbsoluteZoomAndPageScale(textQuads, m_ownerDocument.get(), renderText);
+ m_ownerDocument->adjustFloatQuadsForScrollAndAbsoluteZoomAndFrameScale(textQuads, renderText);
quads.append(textQuads);
}
Modified: trunk/Source/WebCore/rendering/RenderObject.h (119689 => 119690)
--- trunk/Source/WebCore/rendering/RenderObject.h 2012-06-07 06:54:04 UTC (rev 119689)
+++ trunk/Source/WebCore/rendering/RenderObject.h 2012-06-07 06:57:19 UTC (rev 119690)
@@ -1214,18 +1214,6 @@
rect.scale(1 / zoom, 1 / zoom);
}
-inline void adjustFloatQuadForPageScale(FloatQuad& quad, float pageScale)
-{
- if (pageScale != 1)
- quad.scale(1 / pageScale, 1 / pageScale);
-}
-
-inline void adjustFloatRectForPageScale(FloatRect& rect, float pageScale)
-{
- if (pageScale != 1)
- rect.scale(1 / pageScale, 1 / pageScale);
-}
-
} // namespace WebCore
#ifndef NDEBUG