Title: [119690] trunk
Revision
119690
Author
[email protected]
Date
2012-06-06 23:57:19 -0700 (Wed, 06 Jun 2012)

Log Message

Element.getBoundingClientRect() and Element.getClientRects() return incorrect values in frames in a scaled page
https://bugs.webkit.org/show_bug.cgi?id=88430

Source/WebCore:

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):

LayoutTests:

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.

Modified Paths

Added Paths

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
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to