Subpixel layout: Change Element.offset* client* scroll* return type to double.
authorzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 May 2014 23:13:52 +0000 (23:13 +0000)
committerzalan@apple.com <zalan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 14 May 2014 23:13:52 +0000 (23:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=132895

Reviewed by Simon Fraser.

Source/WebCore:
This patch changes Element.offset*, Element.client* and Element.scroll* APIs return
type from long to double to match the latest CSSOM View Module spec[1].
Element.offset* and Element.client* do return subpixel values from now on.
Element.scroll* still return integral values as the scrolling code hasn't adopted to subpixel rendering yet.

subpixelCSSOMElementMetricsEnabled setting is added to be able to turn this feature on/off
from WK2 preferences. It toggles the return value from subpixel to floored integral.
It does not change layout/rendering behavior.

Reference list of what other browsers do:
IE: http://blogs.msdn.com/b/ie/archive/2012/02/17/sub-pixel-rendering-and-the-css-object-model.aspx
Blink: http://www.chromestatus.com/features/5497402177880064
Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=825607

[1] http://www.w3.org/TR/2013/WD-cssom-view-20131217/

Test: cssom/subpixel-offsetleft-top-width-height-values.html

* dom/Element.cpp:
(WebCore::localZoomForRenderer):
(WebCore::adjustForLocalZoom):
(WebCore::convertToNonSubpixelValueIfNeeded):
(WebCore::Element::offsetLeft):
(WebCore::Element::offsetTop):
(WebCore::Element::offsetWidth):
(WebCore::Element::offsetHeight):
(WebCore::Element::clientLeft):
(WebCore::Element::clientTop):
(WebCore::Element::clientWidth):
(WebCore::Element::clientHeight):
(WebCore::Element::scrollLeft):
(WebCore::Element::scrollTop):
(WebCore::Element::setScrollLeft):
(WebCore::Element::setScrollTop):
(WebCore::Element::scrollWidth):
(WebCore::Element::scrollHeight):
* dom/Element.h:
* dom/Element.idl:
* html/HTMLBodyElement.cpp:
(WebCore::adjustForZoom):
(WebCore::HTMLBodyElement::scrollLeft):
(WebCore::HTMLBodyElement::setScrollLeft):
(WebCore::HTMLBodyElement::scrollTop):
(WebCore::HTMLBodyElement::setScrollTop):
(WebCore::HTMLBodyElement::scrollHeight):
(WebCore::HTMLBodyElement::scrollWidth):
* html/HTMLBodyElement.h:
* page/Settings.in:

Source/WebKit2:
This patch changes Element.offset*, Element.client* and Element.scroll* APIs return
type from long to double to match the latest CSSOM View Module spec[1].
Element.offset* and Element.client* do return subpixel values from now on.
Element.scroll* still return integral values as the scrolling code hasn't adopted to subpixel rendering yet.

subpixelCSSOMElementMetricsEnabled setting is added to be able to turn this feature on/off
from WK2 preferences. It toggles the return value from subpixel to floored integral.
It does not change layout/rendering behavior.

Reference list of what other browsers do:
IE: http://blogs.msdn.com/b/ie/archive/2012/02/17/sub-pixel-rendering-and-the-css-object-model.aspx
Blink: http://www.chromestatus.com/features/5497402177880064
Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=825607

[1] http://www.w3.org/TR/2013/WD-cssom-view-20131217/

* Shared/WebPreferencesStore.h:
* UIProcess/API/C/WKPreferences.cpp:
(WKPreferencesSetSubpixelCSSOMElementMetricsEnabled):
(WKPreferencesGetSubpixelCSSOMElementMetricsEnabled):
* UIProcess/API/C/WKPreferencesRefPrivate.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::updatePreferences):

LayoutTests:
Some test cases expect integral values, so the test content is updated accordingly.
It mostly means adding Math.round() before comparing values in order to match pixelSnappedIntRect()
functionality.

* css3/calc/simple-calcs-prefixed.html: changed file format from Windows to Unix.
* css3/calc/simple-calcs.html: changed file format from Windows to Unix.
* cssom/subpixel-offsetleft-top-width-height-values-expected.txt: Added.
* cssom/subpixel-offsetleft-top-width-height-values.html: Added.
* editing/selection/drag-start-event-client-x-y.html: use floor as we compare the return value to a truncated integer.
* editing/selection/mixed-editability-10.html:
* fast/css/zoom-in-length-round-trip.html:
* fast/dom/non-numeric-values-numeric-parameters-expected.txt:
* fast/dom/script-tests/non-numeric-values-numeric-parameters.js:
* fast/forms/basic-buttons.html:
* js/dom/dom-static-property-for-in-iteration-expected.txt:
* platform/mac/fast/scrolling/scroll-div-latched-div.html:
* platform/mac/fast/scrolling/scroll-div-latched-mainframe.html:
* platform/mac/fast/scrolling/scroll-select-bottom-test.html:
* platform/mac/fast/scrolling/scroll-select-latched-mainframe.html:
* platform/mac/fast/scrolling/scroll-select-latched-select.html:
* resources/check-layout.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@168868 268f45cc-cd09-0410-ab3c-d52691b4dbfc

30 files changed:
LayoutTests/ChangeLog
LayoutTests/css3/calc/simple-calcs-prefixed.html
LayoutTests/css3/calc/simple-calcs.html
LayoutTests/cssom/subpixel-offsetleft-top-width-height-values-expected.txt [new file with mode: 0644]
LayoutTests/cssom/subpixel-offsetleft-top-width-height-values.html [new file with mode: 0644]
LayoutTests/editing/selection/drag-start-event-client-x-y.html
LayoutTests/editing/selection/mixed-editability-10.html
LayoutTests/fast/css/zoom-in-length-round-trip.html
LayoutTests/fast/dom/non-numeric-values-numeric-parameters-expected.txt
LayoutTests/fast/dom/script-tests/non-numeric-values-numeric-parameters.js
LayoutTests/fast/forms/basic-buttons.html
LayoutTests/js/dom/dom-static-property-for-in-iteration-expected.txt
LayoutTests/platform/mac/fast/scrolling/scroll-div-latched-div.html
LayoutTests/platform/mac/fast/scrolling/scroll-div-latched-mainframe.html
LayoutTests/platform/mac/fast/scrolling/scroll-select-bottom-test.html
LayoutTests/platform/mac/fast/scrolling/scroll-select-latched-mainframe.html
LayoutTests/platform/mac/fast/scrolling/scroll-select-latched-select.html
LayoutTests/resources/check-layout.js
Source/WebCore/ChangeLog
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/Element.h
Source/WebCore/dom/Element.idl
Source/WebCore/html/HTMLBodyElement.cpp
Source/WebCore/html/HTMLBodyElement.h
Source/WebCore/page/Settings.in
Source/WebKit2/ChangeLog
Source/WebKit2/Shared/WebPreferencesStore.h
Source/WebKit2/UIProcess/API/C/WKPreferences.cpp
Source/WebKit2/UIProcess/API/C/WKPreferencesRefPrivate.h
Source/WebKit2/WebProcess/WebPage/WebPage.cpp

index 48bd38e..bbf09c5 100644 (file)
@@ -1,3 +1,32 @@
+2014-05-14  Zalan Bujtas  <zalan@apple.com>
+
+        Subpixel layout: Change Element.offset* client* scroll* return type to double.
+        https://bugs.webkit.org/show_bug.cgi?id=132895
+
+        Reviewed by Simon Fraser.
+
+        Some test cases expect integral values, so the test content is updated accordingly.
+        It mostly means adding Math.round() before comparing values in order to match pixelSnappedIntRect()
+        functionality.
+
+        * css3/calc/simple-calcs-prefixed.html: changed file format from Windows to Unix.
+        * css3/calc/simple-calcs.html: changed file format from Windows to Unix.
+        * cssom/subpixel-offsetleft-top-width-height-values-expected.txt: Added.
+        * cssom/subpixel-offsetleft-top-width-height-values.html: Added.
+        * editing/selection/drag-start-event-client-x-y.html: use floor as we compare the return value to a truncated integer.
+        * editing/selection/mixed-editability-10.html:
+        * fast/css/zoom-in-length-round-trip.html:
+        * fast/dom/non-numeric-values-numeric-parameters-expected.txt:
+        * fast/dom/script-tests/non-numeric-values-numeric-parameters.js:
+        * fast/forms/basic-buttons.html:
+        * js/dom/dom-static-property-for-in-iteration-expected.txt:
+        * platform/mac/fast/scrolling/scroll-div-latched-div.html:
+        * platform/mac/fast/scrolling/scroll-div-latched-mainframe.html:
+        * platform/mac/fast/scrolling/scroll-select-bottom-test.html:
+        * platform/mac/fast/scrolling/scroll-select-latched-mainframe.html:
+        * platform/mac/fast/scrolling/scroll-select-latched-select.html:
+        * resources/check-layout.js:
+
 2014-05-14  Carlos Alberto Lopez Perez  <clopez@igalia.com>
 
         [GTK] Unreviewed GTK gardening.
index 4f57869..cb5559f 100644 (file)
@@ -104,10 +104,10 @@ for (var child = test.firstChild; child; child = child.nextSibling) {
     for (var z = 0; z < zoomLevels.length; z++) {
         var zoom = zoomLevels[z];
         document.body.style.zoom = zoom;
-        var width = element.offsetWidth;
+        var width = Math.round(element.offsetWidth);
         if (width != 100)
             error.push("@zoom=" + zoom + " expected width of 100, but was " + width);
-        var height = element.offsetHeight;
+        var height = Math.round(element.offsetHeight);
         if (height != 100)
             error.push("@zoom=" + zoom + " expected height of 100, but was " + height);
     }
index fc0d560..bc34f73 100644 (file)
@@ -101,10 +101,10 @@ for (var child = test.firstChild; child; child = child.nextSibling) {
     for (var z = 0; z < zoomLevels.length; z++) {
         var zoom = zoomLevels[z];
         document.body.style.zoom = zoom;
-        var width = element.offsetWidth;
+        var width = Math.round(element.offsetWidth);
         if (width != 100)
             error.push("@zoom=" + zoom + " expected width of 100, but was " + width);
-        var height = element.offsetHeight;
+        var height = Math.round(element.offsetHeight);
         if (height != 100)
             error.push("@zoom=" + zoom + " expected height of 100, but was " + height);
     }
diff --git a/LayoutTests/cssom/subpixel-offsetleft-top-width-height-values-expected.txt b/LayoutTests/cssom/subpixel-offsetleft-top-width-height-values-expected.txt
new file mode 100644 (file)
index 0000000..80121ad
--- /dev/null
@@ -0,0 +1,801 @@
+offsetTop:0.00 offsetLeft:0.00 offsetWidth:0.09 offsetHeight:0.09
+clientTop:0.05 clientLeft:0.05 clientWidth:0.00 clientHeight:0.00
+offsetTop:0.19 offsetLeft:0.09 offsetWidth:0.19 offsetHeight:0.19
+clientTop:0.05 clientLeft:0.05 clientWidth:0.09 clientHeight:0.09
+offsetTop:0.39 offsetLeft:0.39 offsetWidth:0.28 offsetHeight:0.28
+clientTop:0.05 clientLeft:0.05 clientWidth:0.19 clientHeight:0.19
+offsetTop:0.59 offsetLeft:0.89 offsetWidth:0.39 offsetHeight:0.39
+clientTop:0.05 clientLeft:0.05 clientWidth:0.30 clientHeight:0.30
+offsetTop:0.80 offsetLeft:1.59 offsetWidth:0.48 offsetHeight:0.48
+clientTop:0.05 clientLeft:0.05 clientWidth:0.39 clientHeight:0.39
+offsetTop:1.00 offsetLeft:2.50 offsetWidth:0.59 offsetHeight:0.59
+clientTop:0.05 clientLeft:0.05 clientWidth:0.50 clientHeight:0.50
+offsetTop:1.19 offsetLeft:3.59 offsetWidth:0.69 offsetHeight:0.69
+clientTop:0.05 clientLeft:0.05 clientWidth:0.59 clientHeight:0.59
+offsetTop:1.39 offsetLeft:4.89 offsetWidth:0.78 offsetHeight:0.78
+clientTop:0.05 clientLeft:0.05 clientWidth:0.69 clientHeight:0.69
+offsetTop:1.59 offsetLeft:6.39 offsetWidth:0.89 offsetHeight:0.89
+clientTop:0.05 clientLeft:0.05 clientWidth:0.80 clientHeight:0.80
+offsetTop:1.80 offsetLeft:8.09 offsetWidth:0.98 offsetHeight:0.98
+clientTop:0.05 clientLeft:0.05 clientWidth:0.89 clientHeight:0.89
+offsetTop:2.00 offsetLeft:10.00 offsetWidth:1.09 offsetHeight:1.09
+clientTop:0.05 clientLeft:0.05 clientWidth:1.00 clientHeight:1.00
+offsetTop:2.19 offsetLeft:12.09 offsetWidth:1.19 offsetHeight:1.19
+clientTop:0.05 clientLeft:0.05 clientWidth:1.09 clientHeight:1.09
+offsetTop:2.39 offsetLeft:14.39 offsetWidth:1.28 offsetHeight:1.28
+clientTop:0.05 clientLeft:0.05 clientWidth:1.19 clientHeight:1.19
+offsetTop:2.59 offsetLeft:16.89 offsetWidth:1.39 offsetHeight:1.39
+clientTop:0.05 clientLeft:0.05 clientWidth:1.30 clientHeight:1.30
+offsetTop:2.80 offsetLeft:19.59 offsetWidth:1.48 offsetHeight:1.48
+clientTop:0.05 clientLeft:0.05 clientWidth:1.39 clientHeight:1.39
+offsetTop:3.00 offsetLeft:22.50 offsetWidth:1.59 offsetHeight:1.59
+clientTop:0.05 clientLeft:0.05 clientWidth:1.50 clientHeight:1.50
+offsetTop:3.19 offsetLeft:25.59 offsetWidth:1.69 offsetHeight:1.69
+clientTop:0.05 clientLeft:0.05 clientWidth:1.59 clientHeight:1.59
+offsetTop:3.39 offsetLeft:28.89 offsetWidth:1.78 offsetHeight:1.78
+clientTop:0.05 clientLeft:0.05 clientWidth:1.69 clientHeight:1.69
+offsetTop:3.59 offsetLeft:32.39 offsetWidth:1.89 offsetHeight:1.89
+clientTop:0.05 clientLeft:0.05 clientWidth:1.80 clientHeight:1.80
+offsetTop:3.80 offsetLeft:36.09 offsetWidth:1.98 offsetHeight:1.98
+clientTop:0.05 clientLeft:0.05 clientWidth:1.89 clientHeight:1.89
+offsetTop:2.00 offsetLeft:0.30 offsetWidth:2.13 offsetHeight:2.13
+clientTop:0.06 clientLeft:0.06 clientWidth:2.00 clientHeight:2.00
+offsetTop:2.39 offsetLeft:2.39 offsetWidth:2.22 offsetHeight:2.22
+clientTop:0.06 clientLeft:0.06 clientWidth:2.09 clientHeight:2.09
+offsetTop:2.80 offsetLeft:4.69 offsetWidth:2.31 offsetHeight:2.31
+clientTop:0.06 clientLeft:0.06 clientWidth:2.19 clientHeight:2.19
+offsetTop:3.19 offsetLeft:7.19 offsetWidth:2.42 offsetHeight:2.42
+clientTop:0.06 clientLeft:0.06 clientWidth:2.30 clientHeight:2.30
+offsetTop:3.59 offsetLeft:9.89 offsetWidth:2.52 offsetHeight:2.52
+clientTop:0.06 clientLeft:0.06 clientWidth:2.39 clientHeight:2.39
+offsetTop:4.00 offsetLeft:12.80 offsetWidth:2.63 offsetHeight:2.63
+clientTop:0.06 clientLeft:0.06 clientWidth:2.50 clientHeight:2.50
+offsetTop:4.39 offsetLeft:15.89 offsetWidth:2.72 offsetHeight:2.72
+clientTop:0.06 clientLeft:0.06 clientWidth:2.59 clientHeight:2.59
+offsetTop:4.80 offsetLeft:19.19 offsetWidth:2.81 offsetHeight:2.81
+clientTop:0.06 clientLeft:0.06 clientWidth:2.69 clientHeight:2.69
+offsetTop:5.19 offsetLeft:22.69 offsetWidth:2.92 offsetHeight:2.92
+clientTop:0.06 clientLeft:0.06 clientWidth:2.80 clientHeight:2.80
+offsetTop:5.59 offsetLeft:26.39 offsetWidth:3.02 offsetHeight:3.02
+clientTop:0.06 clientLeft:0.06 clientWidth:2.89 clientHeight:2.89
+offsetTop:6.00 offsetLeft:30.30 offsetWidth:3.13 offsetHeight:3.13
+clientTop:0.06 clientLeft:0.06 clientWidth:3.00 clientHeight:3.00
+offsetTop:6.39 offsetLeft:34.39 offsetWidth:3.22 offsetHeight:3.22
+clientTop:0.06 clientLeft:0.06 clientWidth:3.09 clientHeight:3.09
+offsetTop:6.80 offsetLeft:38.69 offsetWidth:3.31 offsetHeight:3.31
+clientTop:0.06 clientLeft:0.06 clientWidth:3.19 clientHeight:3.19
+offsetTop:7.19 offsetLeft:43.19 offsetWidth:3.42 offsetHeight:3.42
+clientTop:0.06 clientLeft:0.06 clientWidth:3.30 clientHeight:3.30
+offsetTop:7.59 offsetLeft:47.89 offsetWidth:3.52 offsetHeight:3.52
+clientTop:0.06 clientLeft:0.06 clientWidth:3.39 clientHeight:3.39
+offsetTop:8.00 offsetLeft:52.80 offsetWidth:3.63 offsetHeight:3.63
+clientTop:0.06 clientLeft:0.06 clientWidth:3.50 clientHeight:3.50
+offsetTop:8.39 offsetLeft:57.89 offsetWidth:3.72 offsetHeight:3.72
+clientTop:0.06 clientLeft:0.06 clientWidth:3.59 clientHeight:3.59
+offsetTop:8.80 offsetLeft:63.19 offsetWidth:3.81 offsetHeight:3.81
+clientTop:0.06 clientLeft:0.06 clientWidth:3.69 clientHeight:3.69
+offsetTop:9.19 offsetLeft:68.69 offsetWidth:3.92 offsetHeight:3.92
+clientTop:0.06 clientLeft:0.06 clientWidth:3.80 clientHeight:3.80
+offsetTop:9.59 offsetLeft:74.39 offsetWidth:4.02 offsetHeight:4.02
+clientTop:0.06 clientLeft:0.06 clientWidth:3.89 clientHeight:3.89
+offsetTop:8.00 offsetLeft:0.80 offsetWidth:4.19 offsetHeight:4.19
+clientTop:0.09 clientLeft:0.09 clientWidth:4.00 clientHeight:4.00
+offsetTop:8.59 offsetLeft:4.89 offsetWidth:4.28 offsetHeight:4.28
+clientTop:0.09 clientLeft:0.09 clientWidth:4.09 clientHeight:4.09
+offsetTop:9.19 offsetLeft:9.19 offsetWidth:4.38 offsetHeight:4.38
+clientTop:0.09 clientLeft:0.09 clientWidth:4.19 clientHeight:4.19
+offsetTop:9.80 offsetLeft:13.69 offsetWidth:4.48 offsetHeight:4.48
+clientTop:0.09 clientLeft:0.09 clientWidth:4.30 clientHeight:4.30
+offsetTop:10.39 offsetLeft:18.39 offsetWidth:4.58 offsetHeight:4.58
+clientTop:0.09 clientLeft:0.09 clientWidth:4.39 clientHeight:4.39
+offsetTop:11.00 offsetLeft:23.30 offsetWidth:4.69 offsetHeight:4.69
+clientTop:0.09 clientLeft:0.09 clientWidth:4.50 clientHeight:4.50
+offsetTop:11.59 offsetLeft:28.39 offsetWidth:4.78 offsetHeight:4.78
+clientTop:0.09 clientLeft:0.09 clientWidth:4.59 clientHeight:4.59
+offsetTop:12.19 offsetLeft:33.69 offsetWidth:4.88 offsetHeight:4.88
+clientTop:0.09 clientLeft:0.09 clientWidth:4.69 clientHeight:4.69
+offsetTop:12.80 offsetLeft:39.19 offsetWidth:4.98 offsetHeight:4.98
+clientTop:0.09 clientLeft:0.09 clientWidth:4.80 clientHeight:4.80
+offsetTop:13.39 offsetLeft:44.89 offsetWidth:5.08 offsetHeight:5.08
+clientTop:0.09 clientLeft:0.09 clientWidth:4.89 clientHeight:4.89
+offsetTop:14.00 offsetLeft:50.80 offsetWidth:5.19 offsetHeight:5.19
+clientTop:0.09 clientLeft:0.09 clientWidth:5.00 clientHeight:5.00
+offsetTop:14.59 offsetLeft:56.89 offsetWidth:5.28 offsetHeight:5.28
+clientTop:0.09 clientLeft:0.09 clientWidth:5.09 clientHeight:5.09
+offsetTop:15.19 offsetLeft:63.19 offsetWidth:5.38 offsetHeight:5.38
+clientTop:0.09 clientLeft:0.09 clientWidth:5.19 clientHeight:5.19
+offsetTop:15.80 offsetLeft:69.69 offsetWidth:5.48 offsetHeight:5.48
+clientTop:0.09 clientLeft:0.09 clientWidth:5.30 clientHeight:5.30
+offsetTop:16.39 offsetLeft:76.39 offsetWidth:5.58 offsetHeight:5.58
+clientTop:0.09 clientLeft:0.09 clientWidth:5.39 clientHeight:5.39
+offsetTop:17.00 offsetLeft:83.30 offsetWidth:5.69 offsetHeight:5.69
+clientTop:0.09 clientLeft:0.09 clientWidth:5.50 clientHeight:5.50
+offsetTop:17.59 offsetLeft:90.39 offsetWidth:5.78 offsetHeight:5.78
+clientTop:0.09 clientLeft:0.09 clientWidth:5.59 clientHeight:5.59
+offsetTop:18.19 offsetLeft:97.69 offsetWidth:5.88 offsetHeight:5.88
+clientTop:0.09 clientLeft:0.09 clientWidth:5.69 clientHeight:5.69
+offsetTop:18.80 offsetLeft:105.19 offsetWidth:5.98 offsetHeight:5.98
+clientTop:0.09 clientLeft:0.09 clientWidth:5.80 clientHeight:5.80
+offsetTop:19.39 offsetLeft:112.89 offsetWidth:6.08 offsetHeight:6.08
+clientTop:0.09 clientLeft:0.09 clientWidth:5.89 clientHeight:5.89
+offsetTop:18.00 offsetLeft:1.50 offsetWidth:6.25 offsetHeight:6.25
+clientTop:0.13 clientLeft:0.13 clientWidth:6.00 clientHeight:6.00
+offsetTop:18.80 offsetLeft:7.59 offsetWidth:6.34 offsetHeight:6.34
+clientTop:0.13 clientLeft:0.13 clientWidth:6.09 clientHeight:6.09
+offsetTop:19.59 offsetLeft:13.89 offsetWidth:6.44 offsetHeight:6.44
+clientTop:0.13 clientLeft:0.13 clientWidth:6.19 clientHeight:6.19
+offsetTop:20.39 offsetLeft:20.39 offsetWidth:6.55 offsetHeight:6.55
+clientTop:0.13 clientLeft:0.13 clientWidth:6.30 clientHeight:6.30
+offsetTop:21.19 offsetLeft:27.09 offsetWidth:6.64 offsetHeight:6.64
+clientTop:0.13 clientLeft:0.13 clientWidth:6.39 clientHeight:6.39
+offsetTop:22.00 offsetLeft:34.00 offsetWidth:6.75 offsetHeight:6.75
+clientTop:0.13 clientLeft:0.13 clientWidth:6.50 clientHeight:6.50
+offsetTop:22.80 offsetLeft:41.09 offsetWidth:6.84 offsetHeight:6.84
+clientTop:0.13 clientLeft:0.13 clientWidth:6.59 clientHeight:6.59
+offsetTop:23.59 offsetLeft:48.39 offsetWidth:6.94 offsetHeight:6.94
+clientTop:0.13 clientLeft:0.13 clientWidth:6.69 clientHeight:6.69
+offsetTop:24.39 offsetLeft:55.89 offsetWidth:7.05 offsetHeight:7.05
+clientTop:0.13 clientLeft:0.13 clientWidth:6.80 clientHeight:6.80
+offsetTop:25.19 offsetLeft:63.59 offsetWidth:7.14 offsetHeight:7.14
+clientTop:0.13 clientLeft:0.13 clientWidth:6.89 clientHeight:6.89
+offsetTop:26.00 offsetLeft:71.50 offsetWidth:7.25 offsetHeight:7.25
+clientTop:0.13 clientLeft:0.13 clientWidth:7.00 clientHeight:7.00
+offsetTop:26.80 offsetLeft:79.59 offsetWidth:7.34 offsetHeight:7.34
+clientTop:0.13 clientLeft:0.13 clientWidth:7.09 clientHeight:7.09
+offsetTop:27.59 offsetLeft:87.89 offsetWidth:7.44 offsetHeight:7.44
+clientTop:0.13 clientLeft:0.13 clientWidth:7.19 clientHeight:7.19
+offsetTop:28.39 offsetLeft:96.39 offsetWidth:7.55 offsetHeight:7.55
+clientTop:0.13 clientLeft:0.13 clientWidth:7.30 clientHeight:7.30
+offsetTop:29.19 offsetLeft:105.09 offsetWidth:7.64 offsetHeight:7.64
+clientTop:0.13 clientLeft:0.13 clientWidth:7.39 clientHeight:7.39
+offsetTop:30.00 offsetLeft:114.00 offsetWidth:7.75 offsetHeight:7.75
+clientTop:0.13 clientLeft:0.13 clientWidth:7.50 clientHeight:7.50
+offsetTop:30.80 offsetLeft:123.09 offsetWidth:7.84 offsetHeight:7.84
+clientTop:0.13 clientLeft:0.13 clientWidth:7.59 clientHeight:7.59
+offsetTop:31.59 offsetLeft:132.39 offsetWidth:7.94 offsetHeight:7.94
+clientTop:0.13 clientLeft:0.13 clientWidth:7.69 clientHeight:7.69
+offsetTop:32.39 offsetLeft:141.89 offsetWidth:8.05 offsetHeight:8.05
+clientTop:0.13 clientLeft:0.13 clientWidth:7.80 clientHeight:7.80
+offsetTop:33.19 offsetLeft:151.59 offsetWidth:8.14 offsetHeight:8.14
+clientTop:0.13 clientLeft:0.13 clientWidth:7.89 clientHeight:7.89
+offsetTop:32.00 offsetLeft:2.39 offsetWidth:8.28 offsetHeight:8.28
+clientTop:0.14 clientLeft:0.14 clientWidth:8.00 clientHeight:8.00
+offsetTop:33.00 offsetLeft:10.50 offsetWidth:8.38 offsetHeight:8.38
+clientTop:0.14 clientLeft:0.14 clientWidth:8.09 clientHeight:8.09
+offsetTop:34.00 offsetLeft:18.80 offsetWidth:8.47 offsetHeight:8.47
+clientTop:0.14 clientLeft:0.14 clientWidth:8.19 clientHeight:8.19
+offsetTop:35.00 offsetLeft:27.30 offsetWidth:8.58 offsetHeight:8.58
+clientTop:0.14 clientLeft:0.14 clientWidth:8.30 clientHeight:8.30
+offsetTop:36.00 offsetLeft:36.00 offsetWidth:8.67 offsetHeight:8.67
+clientTop:0.14 clientLeft:0.14 clientWidth:8.39 clientHeight:8.39
+offsetTop:37.00 offsetLeft:44.89 offsetWidth:8.78 offsetHeight:8.78
+clientTop:0.14 clientLeft:0.14 clientWidth:8.50 clientHeight:8.50
+offsetTop:38.00 offsetLeft:54.00 offsetWidth:8.88 offsetHeight:8.88
+clientTop:0.14 clientLeft:0.14 clientWidth:8.59 clientHeight:8.59
+offsetTop:39.00 offsetLeft:63.30 offsetWidth:8.97 offsetHeight:8.97
+clientTop:0.14 clientLeft:0.14 clientWidth:8.69 clientHeight:8.69
+offsetTop:40.00 offsetLeft:72.80 offsetWidth:9.08 offsetHeight:9.08
+clientTop:0.14 clientLeft:0.14 clientWidth:8.80 clientHeight:8.80
+offsetTop:41.00 offsetLeft:82.50 offsetWidth:9.17 offsetHeight:9.17
+clientTop:0.14 clientLeft:0.14 clientWidth:8.89 clientHeight:8.89
+offsetTop:42.00 offsetLeft:92.39 offsetWidth:9.28 offsetHeight:9.28
+clientTop:0.14 clientLeft:0.14 clientWidth:9.00 clientHeight:9.00
+offsetTop:43.00 offsetLeft:102.50 offsetWidth:9.38 offsetHeight:9.38
+clientTop:0.14 clientLeft:0.14 clientWidth:9.09 clientHeight:9.09
+offsetTop:44.00 offsetLeft:112.80 offsetWidth:9.47 offsetHeight:9.47
+clientTop:0.14 clientLeft:0.14 clientWidth:9.19 clientHeight:9.19
+offsetTop:45.00 offsetLeft:123.30 offsetWidth:9.58 offsetHeight:9.58
+clientTop:0.14 clientLeft:0.14 clientWidth:9.30 clientHeight:9.30
+offsetTop:46.00 offsetLeft:134.00 offsetWidth:9.67 offsetHeight:9.67
+clientTop:0.14 clientLeft:0.14 clientWidth:9.39 clientHeight:9.39
+offsetTop:47.00 offsetLeft:144.89 offsetWidth:9.78 offsetHeight:9.78
+clientTop:0.14 clientLeft:0.14 clientWidth:9.50 clientHeight:9.50
+offsetTop:48.00 offsetLeft:156.00 offsetWidth:9.88 offsetHeight:9.88
+clientTop:0.14 clientLeft:0.14 clientWidth:9.59 clientHeight:9.59
+offsetTop:49.00 offsetLeft:167.30 offsetWidth:9.97 offsetHeight:9.97
+clientTop:0.14 clientLeft:0.14 clientWidth:9.69 clientHeight:9.69
+offsetTop:50.00 offsetLeft:178.80 offsetWidth:10.08 offsetHeight:10.08
+clientTop:0.14 clientLeft:0.14 clientWidth:9.80 clientHeight:9.80
+offsetTop:51.00 offsetLeft:190.50 offsetWidth:10.17 offsetHeight:10.17
+clientTop:0.14 clientLeft:0.14 clientWidth:9.89 clientHeight:9.89
+offsetTop:50.00 offsetLeft:3.50 offsetWidth:10.34 offsetHeight:10.34
+clientTop:0.17 clientLeft:0.17 clientWidth:10.00 clientHeight:10.00
+offsetTop:51.19 offsetLeft:13.59 offsetWidth:10.44 offsetHeight:10.44
+clientTop:0.17 clientLeft:0.17 clientWidth:10.09 clientHeight:10.09
+offsetTop:52.39 offsetLeft:23.89 offsetWidth:10.53 offsetHeight:10.53
+clientTop:0.17 clientLeft:0.17 clientWidth:10.19 clientHeight:10.19
+offsetTop:53.59 offsetLeft:34.39 offsetWidth:10.64 offsetHeight:10.64
+clientTop:0.17 clientLeft:0.17 clientWidth:10.30 clientHeight:10.30
+offsetTop:54.80 offsetLeft:45.09 offsetWidth:10.73 offsetHeight:10.73
+clientTop:0.17 clientLeft:0.17 clientWidth:10.39 clientHeight:10.39
+offsetTop:56.00 offsetLeft:56.00 offsetWidth:10.84 offsetHeight:10.84
+clientTop:0.17 clientLeft:0.17 clientWidth:10.50 clientHeight:10.50
+offsetTop:57.19 offsetLeft:67.09 offsetWidth:10.94 offsetHeight:10.94
+clientTop:0.17 clientLeft:0.17 clientWidth:10.59 clientHeight:10.59
+offsetTop:58.39 offsetLeft:78.39 offsetWidth:11.03 offsetHeight:11.03
+clientTop:0.17 clientLeft:0.17 clientWidth:10.69 clientHeight:10.69
+offsetTop:59.59 offsetLeft:89.89 offsetWidth:11.14 offsetHeight:11.14
+clientTop:0.17 clientLeft:0.17 clientWidth:10.80 clientHeight:10.80
+offsetTop:60.80 offsetLeft:101.59 offsetWidth:11.23 offsetHeight:11.23
+clientTop:0.17 clientLeft:0.17 clientWidth:10.89 clientHeight:10.89
+offsetTop:62.00 offsetLeft:113.50 offsetWidth:11.34 offsetHeight:11.34
+clientTop:0.17 clientLeft:0.17 clientWidth:11.00 clientHeight:11.00
+offsetTop:63.19 offsetLeft:125.59 offsetWidth:11.44 offsetHeight:11.44
+clientTop:0.17 clientLeft:0.17 clientWidth:11.09 clientHeight:11.09
+offsetTop:64.39 offsetLeft:137.89 offsetWidth:11.53 offsetHeight:11.53
+clientTop:0.17 clientLeft:0.17 clientWidth:11.19 clientHeight:11.19
+offsetTop:65.59 offsetLeft:150.39 offsetWidth:11.64 offsetHeight:11.64
+clientTop:0.17 clientLeft:0.17 clientWidth:11.30 clientHeight:11.30
+offsetTop:66.80 offsetLeft:163.09 offsetWidth:11.73 offsetHeight:11.73
+clientTop:0.17 clientLeft:0.17 clientWidth:11.39 clientHeight:11.39
+offsetTop:68.00 offsetLeft:176.00 offsetWidth:11.84 offsetHeight:11.84
+clientTop:0.17 clientLeft:0.17 clientWidth:11.50 clientHeight:11.50
+offsetTop:69.19 offsetLeft:189.09 offsetWidth:11.94 offsetHeight:11.94
+clientTop:0.17 clientLeft:0.17 clientWidth:11.59 clientHeight:11.59
+offsetTop:70.39 offsetLeft:202.39 offsetWidth:12.03 offsetHeight:12.03
+clientTop:0.17 clientLeft:0.17 clientWidth:11.69 clientHeight:11.69
+offsetTop:71.59 offsetLeft:215.89 offsetWidth:12.14 offsetHeight:12.14
+clientTop:0.17 clientLeft:0.17 clientWidth:11.80 clientHeight:11.80
+offsetTop:72.80 offsetLeft:229.59 offsetWidth:12.23 offsetHeight:12.23
+clientTop:0.17 clientLeft:0.17 clientWidth:11.89 clientHeight:11.89
+offsetTop:72.00 offsetLeft:4.80 offsetWidth:12.38 offsetHeight:12.38
+clientTop:0.19 clientLeft:0.19 clientWidth:12.00 clientHeight:12.00
+offsetTop:73.39 offsetLeft:16.89 offsetWidth:12.47 offsetHeight:12.47
+clientTop:0.19 clientLeft:0.19 clientWidth:12.09 clientHeight:12.09
+offsetTop:74.80 offsetLeft:29.19 offsetWidth:12.56 offsetHeight:12.56
+clientTop:0.19 clientLeft:0.19 clientWidth:12.19 clientHeight:12.19
+offsetTop:76.19 offsetLeft:41.69 offsetWidth:12.67 offsetHeight:12.67
+clientTop:0.19 clientLeft:0.19 clientWidth:12.30 clientHeight:12.30
+offsetTop:77.59 offsetLeft:54.39 offsetWidth:12.77 offsetHeight:12.77
+clientTop:0.19 clientLeft:0.19 clientWidth:12.39 clientHeight:12.39
+offsetTop:79.00 offsetLeft:67.30 offsetWidth:12.88 offsetHeight:12.88
+clientTop:0.19 clientLeft:0.19 clientWidth:12.50 clientHeight:12.50
+offsetTop:80.39 offsetLeft:80.39 offsetWidth:12.97 offsetHeight:12.97
+clientTop:0.19 clientLeft:0.19 clientWidth:12.59 clientHeight:12.59
+offsetTop:81.80 offsetLeft:93.69 offsetWidth:13.06 offsetHeight:13.06
+clientTop:0.19 clientLeft:0.19 clientWidth:12.69 clientHeight:12.69
+offsetTop:83.19 offsetLeft:107.19 offsetWidth:13.17 offsetHeight:13.17
+clientTop:0.19 clientLeft:0.19 clientWidth:12.80 clientHeight:12.80
+offsetTop:84.59 offsetLeft:120.89 offsetWidth:13.27 offsetHeight:13.27
+clientTop:0.19 clientLeft:0.19 clientWidth:12.89 clientHeight:12.89
+offsetTop:86.00 offsetLeft:134.80 offsetWidth:13.38 offsetHeight:13.38
+clientTop:0.19 clientLeft:0.19 clientWidth:13.00 clientHeight:13.00
+offsetTop:87.39 offsetLeft:148.89 offsetWidth:13.47 offsetHeight:13.47
+clientTop:0.19 clientLeft:0.19 clientWidth:13.09 clientHeight:13.09
+offsetTop:88.80 offsetLeft:163.19 offsetWidth:13.56 offsetHeight:13.56
+clientTop:0.19 clientLeft:0.19 clientWidth:13.19 clientHeight:13.19
+offsetTop:90.19 offsetLeft:177.69 offsetWidth:13.67 offsetHeight:13.67
+clientTop:0.19 clientLeft:0.19 clientWidth:13.30 clientHeight:13.30
+offsetTop:91.59 offsetLeft:192.39 offsetWidth:13.77 offsetHeight:13.77
+clientTop:0.19 clientLeft:0.19 clientWidth:13.39 clientHeight:13.39
+offsetTop:93.00 offsetLeft:207.30 offsetWidth:13.88 offsetHeight:13.88
+clientTop:0.19 clientLeft:0.19 clientWidth:13.50 clientHeight:13.50
+offsetTop:94.39 offsetLeft:222.39 offsetWidth:13.97 offsetHeight:13.97
+clientTop:0.19 clientLeft:0.19 clientWidth:13.59 clientHeight:13.59
+offsetTop:95.80 offsetLeft:237.69 offsetWidth:14.06 offsetHeight:14.06
+clientTop:0.19 clientLeft:0.19 clientWidth:13.69 clientHeight:13.69
+offsetTop:97.19 offsetLeft:253.19 offsetWidth:14.17 offsetHeight:14.17
+clientTop:0.19 clientLeft:0.19 clientWidth:13.80 clientHeight:13.80
+offsetTop:98.59 offsetLeft:268.89 offsetWidth:14.27 offsetHeight:14.27
+clientTop:0.19 clientLeft:0.19 clientWidth:13.89 clientHeight:13.89
+offsetTop:98.00 offsetLeft:6.30 offsetWidth:14.44 offsetHeight:14.44
+clientTop:0.22 clientLeft:0.22 clientWidth:14.00 clientHeight:14.00
+offsetTop:99.59 offsetLeft:20.39 offsetWidth:14.53 offsetHeight:14.53
+clientTop:0.22 clientLeft:0.22 clientWidth:14.09 clientHeight:14.09
+offsetTop:101.19 offsetLeft:34.69 offsetWidth:14.63 offsetHeight:14.63
+clientTop:0.22 clientLeft:0.22 clientWidth:14.19 clientHeight:14.19
+offsetTop:102.80 offsetLeft:49.19 offsetWidth:14.73 offsetHeight:14.73
+clientTop:0.22 clientLeft:0.22 clientWidth:14.30 clientHeight:14.30
+offsetTop:104.39 offsetLeft:63.89 offsetWidth:14.83 offsetHeight:14.83
+clientTop:0.22 clientLeft:0.22 clientWidth:14.39 clientHeight:14.39
+offsetTop:106.00 offsetLeft:78.80 offsetWidth:14.94 offsetHeight:14.94
+clientTop:0.22 clientLeft:0.22 clientWidth:14.50 clientHeight:14.50
+offsetTop:107.59 offsetLeft:93.89 offsetWidth:15.03 offsetHeight:15.03
+clientTop:0.22 clientLeft:0.22 clientWidth:14.59 clientHeight:14.59
+offsetTop:109.19 offsetLeft:109.19 offsetWidth:15.13 offsetHeight:15.13
+clientTop:0.22 clientLeft:0.22 clientWidth:14.69 clientHeight:14.69
+offsetTop:110.80 offsetLeft:124.69 offsetWidth:15.23 offsetHeight:15.23
+clientTop:0.22 clientLeft:0.22 clientWidth:14.80 clientHeight:14.80
+offsetTop:112.39 offsetLeft:140.39 offsetWidth:15.33 offsetHeight:15.33
+clientTop:0.22 clientLeft:0.22 clientWidth:14.89 clientHeight:14.89
+offsetTop:114.00 offsetLeft:156.30 offsetWidth:15.44 offsetHeight:15.44
+clientTop:0.22 clientLeft:0.22 clientWidth:15.00 clientHeight:15.00
+offsetTop:115.59 offsetLeft:172.39 offsetWidth:15.53 offsetHeight:15.53
+clientTop:0.22 clientLeft:0.22 clientWidth:15.09 clientHeight:15.09
+offsetTop:117.19 offsetLeft:188.69 offsetWidth:15.63 offsetHeight:15.63
+clientTop:0.22 clientLeft:0.22 clientWidth:15.19 clientHeight:15.19
+offsetTop:118.80 offsetLeft:205.19 offsetWidth:15.73 offsetHeight:15.73
+clientTop:0.22 clientLeft:0.22 clientWidth:15.30 clientHeight:15.30
+offsetTop:120.39 offsetLeft:221.89 offsetWidth:15.83 offsetHeight:15.83
+clientTop:0.22 clientLeft:0.22 clientWidth:15.39 clientHeight:15.39
+offsetTop:122.00 offsetLeft:238.80 offsetWidth:15.94 offsetHeight:15.94
+clientTop:0.22 clientLeft:0.22 clientWidth:15.50 clientHeight:15.50
+offsetTop:123.59 offsetLeft:255.89 offsetWidth:16.03 offsetHeight:16.03
+clientTop:0.22 clientLeft:0.22 clientWidth:15.59 clientHeight:15.59
+offsetTop:125.19 offsetLeft:273.19 offsetWidth:16.13 offsetHeight:16.13
+clientTop:0.22 clientLeft:0.22 clientWidth:15.69 clientHeight:15.69
+offsetTop:126.80 offsetLeft:290.69 offsetWidth:16.23 offsetHeight:16.23
+clientTop:0.22 clientLeft:0.22 clientWidth:15.80 clientHeight:15.80
+offsetTop:128.39 offsetLeft:308.39 offsetWidth:16.33 offsetHeight:16.33
+clientTop:0.22 clientLeft:0.22 clientWidth:15.89 clientHeight:15.89
+offsetTop:128.00 offsetLeft:8.00 offsetWidth:16.50 offsetHeight:16.50
+clientTop:0.25 clientLeft:0.25 clientWidth:16.00 clientHeight:16.00
+offsetTop:129.80 offsetLeft:24.09 offsetWidth:16.59 offsetHeight:16.59
+clientTop:0.25 clientLeft:0.25 clientWidth:16.09 clientHeight:16.09
+offsetTop:131.59 offsetLeft:40.39 offsetWidth:16.69 offsetHeight:16.69
+clientTop:0.25 clientLeft:0.25 clientWidth:16.19 clientHeight:16.19
+offsetTop:133.39 offsetLeft:56.89 offsetWidth:16.80 offsetHeight:16.80
+clientTop:0.25 clientLeft:0.25 clientWidth:16.30 clientHeight:16.30
+offsetTop:135.19 offsetLeft:73.59 offsetWidth:16.89 offsetHeight:16.89
+clientTop:0.25 clientLeft:0.25 clientWidth:16.39 clientHeight:16.39
+offsetTop:137.00 offsetLeft:90.50 offsetWidth:17.00 offsetHeight:17.00
+clientTop:0.25 clientLeft:0.25 clientWidth:16.50 clientHeight:16.50
+offsetTop:138.80 offsetLeft:107.59 offsetWidth:17.09 offsetHeight:17.09
+clientTop:0.25 clientLeft:0.25 clientWidth:16.59 clientHeight:16.59
+offsetTop:140.59 offsetLeft:124.89 offsetWidth:17.19 offsetHeight:17.19
+clientTop:0.25 clientLeft:0.25 clientWidth:16.69 clientHeight:16.69
+offsetTop:142.39 offsetLeft:142.39 offsetWidth:17.30 offsetHeight:17.30
+clientTop:0.25 clientLeft:0.25 clientWidth:16.80 clientHeight:16.80
+offsetTop:144.19 offsetLeft:160.09 offsetWidth:17.39 offsetHeight:17.39
+clientTop:0.25 clientLeft:0.25 clientWidth:16.89 clientHeight:16.89
+offsetTop:146.00 offsetLeft:178.00 offsetWidth:17.50 offsetHeight:17.50
+clientTop:0.25 clientLeft:0.25 clientWidth:17.00 clientHeight:17.00
+offsetTop:147.80 offsetLeft:196.09 offsetWidth:17.59 offsetHeight:17.59
+clientTop:0.25 clientLeft:0.25 clientWidth:17.09 clientHeight:17.09
+offsetTop:149.59 offsetLeft:214.39 offsetWidth:17.69 offsetHeight:17.69
+clientTop:0.25 clientLeft:0.25 clientWidth:17.19 clientHeight:17.19
+offsetTop:151.39 offsetLeft:232.89 offsetWidth:17.80 offsetHeight:17.80
+clientTop:0.25 clientLeft:0.25 clientWidth:17.30 clientHeight:17.30
+offsetTop:153.19 offsetLeft:251.59 offsetWidth:17.89 offsetHeight:17.89
+clientTop:0.25 clientLeft:0.25 clientWidth:17.39 clientHeight:17.39
+offsetTop:155.00 offsetLeft:270.50 offsetWidth:18.00 offsetHeight:18.00
+clientTop:0.25 clientLeft:0.25 clientWidth:17.50 clientHeight:17.50
+offsetTop:156.80 offsetLeft:289.59 offsetWidth:18.09 offsetHeight:18.09
+clientTop:0.25 clientLeft:0.25 clientWidth:17.59 clientHeight:17.59
+offsetTop:158.59 offsetLeft:308.89 offsetWidth:18.19 offsetHeight:18.19
+clientTop:0.25 clientLeft:0.25 clientWidth:17.69 clientHeight:17.69
+offsetTop:160.39 offsetLeft:328.39 offsetWidth:18.30 offsetHeight:18.30
+clientTop:0.25 clientLeft:0.25 clientWidth:17.80 clientHeight:17.80
+offsetTop:162.19 offsetLeft:348.09 offsetWidth:18.39 offsetHeight:18.39
+clientTop:0.25 clientLeft:0.25 clientWidth:17.89 clientHeight:17.89
+offsetTop:162.00 offsetLeft:9.89 offsetWidth:18.53 offsetHeight:18.53
+clientTop:0.27 clientLeft:0.27 clientWidth:18.00 clientHeight:18.00
+offsetTop:164.00 offsetLeft:28.00 offsetWidth:18.63 offsetHeight:18.63
+clientTop:0.27 clientLeft:0.27 clientWidth:18.09 clientHeight:18.09
+offsetTop:166.00 offsetLeft:46.30 offsetWidth:18.72 offsetHeight:18.72
+clientTop:0.27 clientLeft:0.27 clientWidth:18.19 clientHeight:18.19
+offsetTop:168.00 offsetLeft:64.80 offsetWidth:18.83 offsetHeight:18.83
+clientTop:0.27 clientLeft:0.27 clientWidth:18.30 clientHeight:18.30
+offsetTop:170.00 offsetLeft:83.50 offsetWidth:18.92 offsetHeight:18.92
+clientTop:0.27 clientLeft:0.27 clientWidth:18.39 clientHeight:18.39
+offsetTop:172.00 offsetLeft:102.39 offsetWidth:19.03 offsetHeight:19.03
+clientTop:0.27 clientLeft:0.27 clientWidth:18.50 clientHeight:18.50
+offsetTop:174.00 offsetLeft:121.50 offsetWidth:19.13 offsetHeight:19.13
+clientTop:0.27 clientLeft:0.27 clientWidth:18.59 clientHeight:18.59
+offsetTop:176.00 offsetLeft:140.80 offsetWidth:19.22 offsetHeight:19.22
+clientTop:0.27 clientLeft:0.27 clientWidth:18.69 clientHeight:18.69
+offsetTop:178.00 offsetLeft:160.30 offsetWidth:19.33 offsetHeight:19.33
+clientTop:0.27 clientLeft:0.27 clientWidth:18.80 clientHeight:18.80
+offsetTop:180.00 offsetLeft:180.00 offsetWidth:19.42 offsetHeight:19.42
+clientTop:0.27 clientLeft:0.27 clientWidth:18.89 clientHeight:18.89
+offsetTop:182.00 offsetLeft:199.89 offsetWidth:19.53 offsetHeight:19.53
+clientTop:0.27 clientLeft:0.27 clientWidth:19.00 clientHeight:19.00
+offsetTop:184.00 offsetLeft:220.00 offsetWidth:19.63 offsetHeight:19.63
+clientTop:0.27 clientLeft:0.27 clientWidth:19.09 clientHeight:19.09
+offsetTop:186.00 offsetLeft:240.30 offsetWidth:19.72 offsetHeight:19.72
+clientTop:0.27 clientLeft:0.27 clientWidth:19.19 clientHeight:19.19
+offsetTop:188.00 offsetLeft:260.80 offsetWidth:19.83 offsetHeight:19.83
+clientTop:0.27 clientLeft:0.27 clientWidth:19.30 clientHeight:19.30
+offsetTop:190.00 offsetLeft:281.50 offsetWidth:19.92 offsetHeight:19.92
+clientTop:0.27 clientLeft:0.27 clientWidth:19.39 clientHeight:19.39
+offsetTop:192.00 offsetLeft:302.39 offsetWidth:20.03 offsetHeight:20.03
+clientTop:0.27 clientLeft:0.27 clientWidth:19.50 clientHeight:19.50
+offsetTop:194.00 offsetLeft:323.50 offsetWidth:20.13 offsetHeight:20.13
+clientTop:0.27 clientLeft:0.27 clientWidth:19.59 clientHeight:19.59
+offsetTop:196.00 offsetLeft:344.80 offsetWidth:20.22 offsetHeight:20.22
+clientTop:0.27 clientLeft:0.27 clientWidth:19.69 clientHeight:19.69
+offsetTop:198.00 offsetLeft:366.30 offsetWidth:20.33 offsetHeight:20.33
+clientTop:0.27 clientLeft:0.27 clientWidth:19.80 clientHeight:19.80
+offsetTop:200.00 offsetLeft:388.00 offsetWidth:20.42 offsetHeight:20.42
+clientTop:0.27 clientLeft:0.27 clientWidth:19.89 clientHeight:19.89
+offsetTop:200.00 offsetLeft:12.00 offsetWidth:20.59 offsetHeight:20.59
+clientTop:0.30 clientLeft:0.30 clientWidth:20.00 clientHeight:20.00
+offsetTop:202.19 offsetLeft:32.09 offsetWidth:20.69 offsetHeight:20.69
+clientTop:0.30 clientLeft:0.30 clientWidth:20.09 clientHeight:20.09
+offsetTop:204.39 offsetLeft:52.39 offsetWidth:20.78 offsetHeight:20.78
+clientTop:0.30 clientLeft:0.30 clientWidth:20.19 clientHeight:20.19
+offsetTop:206.59 offsetLeft:72.89 offsetWidth:20.89 offsetHeight:20.89
+clientTop:0.30 clientLeft:0.30 clientWidth:20.30 clientHeight:20.30
+offsetTop:208.80 offsetLeft:93.59 offsetWidth:20.98 offsetHeight:20.98
+clientTop:0.30 clientLeft:0.30 clientWidth:20.39 clientHeight:20.39
+offsetTop:211.00 offsetLeft:114.50 offsetWidth:21.09 offsetHeight:21.09
+clientTop:0.30 clientLeft:0.30 clientWidth:20.50 clientHeight:20.50
+offsetTop:213.19 offsetLeft:135.59 offsetWidth:21.19 offsetHeight:21.19
+clientTop:0.30 clientLeft:0.30 clientWidth:20.59 clientHeight:20.59
+offsetTop:215.39 offsetLeft:156.89 offsetWidth:21.28 offsetHeight:21.28
+clientTop:0.30 clientLeft:0.30 clientWidth:20.69 clientHeight:20.69
+offsetTop:217.59 offsetLeft:178.39 offsetWidth:21.39 offsetHeight:21.39
+clientTop:0.30 clientLeft:0.30 clientWidth:20.80 clientHeight:20.80
+offsetTop:219.80 offsetLeft:200.09 offsetWidth:21.48 offsetHeight:21.48
+clientTop:0.30 clientLeft:0.30 clientWidth:20.89 clientHeight:20.89
+offsetTop:222.00 offsetLeft:222.00 offsetWidth:21.59 offsetHeight:21.59
+clientTop:0.30 clientLeft:0.30 clientWidth:21.00 clientHeight:21.00
+offsetTop:224.19 offsetLeft:244.09 offsetWidth:21.69 offsetHeight:21.69
+clientTop:0.30 clientLeft:0.30 clientWidth:21.09 clientHeight:21.09
+offsetTop:226.39 offsetLeft:266.39 offsetWidth:21.78 offsetHeight:21.78
+clientTop:0.30 clientLeft:0.30 clientWidth:21.19 clientHeight:21.19
+offsetTop:228.59 offsetLeft:288.89 offsetWidth:21.89 offsetHeight:21.89
+clientTop:0.30 clientLeft:0.30 clientWidth:21.30 clientHeight:21.30
+offsetTop:230.80 offsetLeft:311.59 offsetWidth:21.98 offsetHeight:21.98
+clientTop:0.30 clientLeft:0.30 clientWidth:21.39 clientHeight:21.39
+offsetTop:233.00 offsetLeft:334.50 offsetWidth:22.09 offsetHeight:22.09
+clientTop:0.30 clientLeft:0.30 clientWidth:21.50 clientHeight:21.50
+offsetTop:235.19 offsetLeft:357.59 offsetWidth:22.19 offsetHeight:22.19
+clientTop:0.30 clientLeft:0.30 clientWidth:21.59 clientHeight:21.59
+offsetTop:237.39 offsetLeft:380.89 offsetWidth:22.28 offsetHeight:22.28
+clientTop:0.30 clientLeft:0.30 clientWidth:21.69 clientHeight:21.69
+offsetTop:239.59 offsetLeft:404.39 offsetWidth:22.39 offsetHeight:22.39
+clientTop:0.30 clientLeft:0.30 clientWidth:21.80 clientHeight:21.80
+offsetTop:241.80 offsetLeft:428.09 offsetWidth:22.48 offsetHeight:22.48
+clientTop:0.30 clientLeft:0.30 clientWidth:21.89 clientHeight:21.89
+offsetTop:242.00 offsetLeft:14.30 offsetWidth:22.63 offsetHeight:22.63
+clientTop:0.31 clientLeft:0.31 clientWidth:22.00 clientHeight:22.00
+offsetTop:244.39 offsetLeft:36.39 offsetWidth:22.72 offsetHeight:22.72
+clientTop:0.31 clientLeft:0.31 clientWidth:22.09 clientHeight:22.09
+offsetTop:246.80 offsetLeft:58.69 offsetWidth:22.81 offsetHeight:22.81
+clientTop:0.31 clientLeft:0.31 clientWidth:22.19 clientHeight:22.19
+offsetTop:249.19 offsetLeft:81.19 offsetWidth:22.92 offsetHeight:22.92
+clientTop:0.31 clientLeft:0.31 clientWidth:22.30 clientHeight:22.30
+offsetTop:251.59 offsetLeft:103.89 offsetWidth:23.02 offsetHeight:23.02
+clientTop:0.31 clientLeft:0.31 clientWidth:22.39 clientHeight:22.39
+offsetTop:254.00 offsetLeft:126.80 offsetWidth:23.13 offsetHeight:23.13
+clientTop:0.31 clientLeft:0.31 clientWidth:22.50 clientHeight:22.50
+offsetTop:256.39 offsetLeft:149.89 offsetWidth:23.22 offsetHeight:23.22
+clientTop:0.31 clientLeft:0.31 clientWidth:22.59 clientHeight:22.59
+offsetTop:258.80 offsetLeft:173.19 offsetWidth:23.31 offsetHeight:23.31
+clientTop:0.31 clientLeft:0.31 clientWidth:22.69 clientHeight:22.69
+offsetTop:261.19 offsetLeft:196.69 offsetWidth:23.42 offsetHeight:23.42
+clientTop:0.31 clientLeft:0.31 clientWidth:22.80 clientHeight:22.80
+offsetTop:263.59 offsetLeft:220.39 offsetWidth:23.52 offsetHeight:23.52
+clientTop:0.31 clientLeft:0.31 clientWidth:22.89 clientHeight:22.89
+offsetTop:266.00 offsetLeft:244.30 offsetWidth:23.63 offsetHeight:23.63
+clientTop:0.31 clientLeft:0.31 clientWidth:23.00 clientHeight:23.00
+offsetTop:268.39 offsetLeft:268.39 offsetWidth:23.72 offsetHeight:23.72
+clientTop:0.31 clientLeft:0.31 clientWidth:23.09 clientHeight:23.09
+offsetTop:270.80 offsetLeft:292.69 offsetWidth:23.81 offsetHeight:23.81
+clientTop:0.31 clientLeft:0.31 clientWidth:23.19 clientHeight:23.19
+offsetTop:273.19 offsetLeft:317.19 offsetWidth:23.92 offsetHeight:23.92
+clientTop:0.31 clientLeft:0.31 clientWidth:23.30 clientHeight:23.30
+offsetTop:275.59 offsetLeft:341.89 offsetWidth:24.02 offsetHeight:24.02
+clientTop:0.31 clientLeft:0.31 clientWidth:23.39 clientHeight:23.39
+offsetTop:278.00 offsetLeft:366.80 offsetWidth:24.13 offsetHeight:24.13
+clientTop:0.31 clientLeft:0.31 clientWidth:23.50 clientHeight:23.50
+offsetTop:280.39 offsetLeft:391.89 offsetWidth:24.22 offsetHeight:24.22
+clientTop:0.31 clientLeft:0.31 clientWidth:23.59 clientHeight:23.59
+offsetTop:282.80 offsetLeft:417.19 offsetWidth:24.31 offsetHeight:24.31
+clientTop:0.31 clientLeft:0.31 clientWidth:23.69 clientHeight:23.69
+offsetTop:285.19 offsetLeft:442.69 offsetWidth:24.42 offsetHeight:24.42
+clientTop:0.31 clientLeft:0.31 clientWidth:23.80 clientHeight:23.80
+offsetTop:287.59 offsetLeft:468.39 offsetWidth:24.52 offsetHeight:24.52
+clientTop:0.31 clientLeft:0.31 clientWidth:23.89 clientHeight:23.89
+offsetTop:288.00 offsetLeft:16.80 offsetWidth:24.69 offsetHeight:24.69
+clientTop:0.34 clientLeft:0.34 clientWidth:24.00 clientHeight:24.00
+offsetTop:290.59 offsetLeft:40.89 offsetWidth:24.78 offsetHeight:24.78
+clientTop:0.34 clientLeft:0.34 clientWidth:24.09 clientHeight:24.09
+offsetTop:293.19 offsetLeft:65.19 offsetWidth:24.88 offsetHeight:24.88
+clientTop:0.34 clientLeft:0.34 clientWidth:24.19 clientHeight:24.19
+offsetTop:295.80 offsetLeft:89.69 offsetWidth:24.98 offsetHeight:24.98
+clientTop:0.34 clientLeft:0.34 clientWidth:24.30 clientHeight:24.30
+offsetTop:298.39 offsetLeft:114.39 offsetWidth:25.08 offsetHeight:25.08
+clientTop:0.34 clientLeft:0.34 clientWidth:24.39 clientHeight:24.39
+offsetTop:301.00 offsetLeft:139.30 offsetWidth:25.19 offsetHeight:25.19
+clientTop:0.34 clientLeft:0.34 clientWidth:24.50 clientHeight:24.50
+offsetTop:303.59 offsetLeft:164.39 offsetWidth:25.28 offsetHeight:25.28
+clientTop:0.34 clientLeft:0.34 clientWidth:24.59 clientHeight:24.59
+offsetTop:306.19 offsetLeft:189.69 offsetWidth:25.38 offsetHeight:25.38
+clientTop:0.34 clientLeft:0.34 clientWidth:24.69 clientHeight:24.69
+offsetTop:308.80 offsetLeft:215.19 offsetWidth:25.48 offsetHeight:25.48
+clientTop:0.34 clientLeft:0.34 clientWidth:24.80 clientHeight:24.80
+offsetTop:311.39 offsetLeft:240.89 offsetWidth:25.58 offsetHeight:25.58
+clientTop:0.34 clientLeft:0.34 clientWidth:24.89 clientHeight:24.89
+offsetTop:314.00 offsetLeft:266.80 offsetWidth:25.69 offsetHeight:25.69
+clientTop:0.34 clientLeft:0.34 clientWidth:25.00 clientHeight:25.00
+offsetTop:316.59 offsetLeft:292.89 offsetWidth:25.78 offsetHeight:25.78
+clientTop:0.34 clientLeft:0.34 clientWidth:25.09 clientHeight:25.09
+offsetTop:319.19 offsetLeft:319.19 offsetWidth:25.88 offsetHeight:25.88
+clientTop:0.34 clientLeft:0.34 clientWidth:25.19 clientHeight:25.19
+offsetTop:321.80 offsetLeft:345.69 offsetWidth:25.98 offsetHeight:25.98
+clientTop:0.34 clientLeft:0.34 clientWidth:25.30 clientHeight:25.30
+offsetTop:324.39 offsetLeft:372.39 offsetWidth:26.08 offsetHeight:26.08
+clientTop:0.34 clientLeft:0.34 clientWidth:25.39 clientHeight:25.39
+offsetTop:327.00 offsetLeft:399.30 offsetWidth:26.19 offsetHeight:26.19
+clientTop:0.34 clientLeft:0.34 clientWidth:25.50 clientHeight:25.50
+offsetTop:329.59 offsetLeft:426.39 offsetWidth:26.28 offsetHeight:26.28
+clientTop:0.34 clientLeft:0.34 clientWidth:25.59 clientHeight:25.59
+offsetTop:332.19 offsetLeft:453.69 offsetWidth:26.38 offsetHeight:26.38
+clientTop:0.34 clientLeft:0.34 clientWidth:25.69 clientHeight:25.69
+offsetTop:334.80 offsetLeft:481.19 offsetWidth:26.48 offsetHeight:26.48
+clientTop:0.34 clientLeft:0.34 clientWidth:25.80 clientHeight:25.80
+offsetTop:337.39 offsetLeft:508.89 offsetWidth:26.58 offsetHeight:26.58
+clientTop:0.34 clientLeft:0.34 clientWidth:25.89 clientHeight:25.89
+offsetTop:338.00 offsetLeft:19.50 offsetWidth:26.75 offsetHeight:26.75
+clientTop:0.38 clientLeft:0.38 clientWidth:26.00 clientHeight:26.00
+offsetTop:340.80 offsetLeft:45.59 offsetWidth:26.84 offsetHeight:26.84
+clientTop:0.38 clientLeft:0.38 clientWidth:26.09 clientHeight:26.09
+offsetTop:343.59 offsetLeft:71.89 offsetWidth:26.94 offsetHeight:26.94
+clientTop:0.38 clientLeft:0.38 clientWidth:26.19 clientHeight:26.19
+offsetTop:346.39 offsetLeft:98.39 offsetWidth:27.05 offsetHeight:27.05
+clientTop:0.38 clientLeft:0.38 clientWidth:26.30 clientHeight:26.30
+offsetTop:349.19 offsetLeft:125.09 offsetWidth:27.14 offsetHeight:27.14
+clientTop:0.38 clientLeft:0.38 clientWidth:26.39 clientHeight:26.39
+offsetTop:352.00 offsetLeft:152.00 offsetWidth:27.25 offsetHeight:27.25
+clientTop:0.38 clientLeft:0.38 clientWidth:26.50 clientHeight:26.50
+offsetTop:354.80 offsetLeft:179.09 offsetWidth:27.34 offsetHeight:27.34
+clientTop:0.38 clientLeft:0.38 clientWidth:26.59 clientHeight:26.59
+offsetTop:357.59 offsetLeft:206.39 offsetWidth:27.44 offsetHeight:27.44
+clientTop:0.38 clientLeft:0.38 clientWidth:26.69 clientHeight:26.69
+offsetTop:360.39 offsetLeft:233.89 offsetWidth:27.55 offsetHeight:27.55
+clientTop:0.38 clientLeft:0.38 clientWidth:26.80 clientHeight:26.80
+offsetTop:363.19 offsetLeft:261.59 offsetWidth:27.64 offsetHeight:27.64
+clientTop:0.38 clientLeft:0.38 clientWidth:26.89 clientHeight:26.89
+offsetTop:366.00 offsetLeft:289.50 offsetWidth:27.75 offsetHeight:27.75
+clientTop:0.38 clientLeft:0.38 clientWidth:27.00 clientHeight:27.00
+offsetTop:368.80 offsetLeft:317.59 offsetWidth:27.84 offsetHeight:27.84
+clientTop:0.38 clientLeft:0.38 clientWidth:27.09 clientHeight:27.09
+offsetTop:371.59 offsetLeft:345.89 offsetWidth:27.94 offsetHeight:27.94
+clientTop:0.38 clientLeft:0.38 clientWidth:27.19 clientHeight:27.19
+offsetTop:374.39 offsetLeft:374.39 offsetWidth:28.05 offsetHeight:28.05
+clientTop:0.38 clientLeft:0.38 clientWidth:27.30 clientHeight:27.30
+offsetTop:377.19 offsetLeft:403.09 offsetWidth:28.14 offsetHeight:28.14
+clientTop:0.38 clientLeft:0.38 clientWidth:27.39 clientHeight:27.39
+offsetTop:380.00 offsetLeft:432.00 offsetWidth:28.25 offsetHeight:28.25
+clientTop:0.38 clientLeft:0.38 clientWidth:27.50 clientHeight:27.50
+offsetTop:382.80 offsetLeft:461.09 offsetWidth:28.34 offsetHeight:28.34
+clientTop:0.38 clientLeft:0.38 clientWidth:27.59 clientHeight:27.59
+offsetTop:385.59 offsetLeft:490.39 offsetWidth:28.44 offsetHeight:28.44
+clientTop:0.38 clientLeft:0.38 clientWidth:27.69 clientHeight:27.69
+offsetTop:388.39 offsetLeft:519.89 offsetWidth:28.55 offsetHeight:28.55
+clientTop:0.38 clientLeft:0.38 clientWidth:27.80 clientHeight:27.80
+offsetTop:391.19 offsetLeft:549.59 offsetWidth:28.64 offsetHeight:28.64
+clientTop:0.38 clientLeft:0.38 clientWidth:27.89 clientHeight:27.89
+offsetTop:392.00 offsetLeft:22.39 offsetWidth:28.78 offsetHeight:28.78
+clientTop:0.39 clientLeft:0.39 clientWidth:28.00 clientHeight:28.00
+offsetTop:395.00 offsetLeft:50.50 offsetWidth:28.88 offsetHeight:28.88
+clientTop:0.39 clientLeft:0.39 clientWidth:28.09 clientHeight:28.09
+offsetTop:398.00 offsetLeft:78.80 offsetWidth:28.97 offsetHeight:28.97
+clientTop:0.39 clientLeft:0.39 clientWidth:28.19 clientHeight:28.19
+offsetTop:401.00 offsetLeft:107.30 offsetWidth:29.08 offsetHeight:29.08
+clientTop:0.39 clientLeft:0.39 clientWidth:28.30 clientHeight:28.30
+offsetTop:404.00 offsetLeft:136.00 offsetWidth:29.17 offsetHeight:29.17
+clientTop:0.39 clientLeft:0.39 clientWidth:28.39 clientHeight:28.39
+offsetTop:407.00 offsetLeft:164.89 offsetWidth:29.28 offsetHeight:29.28
+clientTop:0.39 clientLeft:0.39 clientWidth:28.50 clientHeight:28.50
+offsetTop:410.00 offsetLeft:194.00 offsetWidth:29.38 offsetHeight:29.38
+clientTop:0.39 clientLeft:0.39 clientWidth:28.59 clientHeight:28.59
+offsetTop:413.00 offsetLeft:223.30 offsetWidth:29.47 offsetHeight:29.47
+clientTop:0.39 clientLeft:0.39 clientWidth:28.69 clientHeight:28.69
+offsetTop:416.00 offsetLeft:252.80 offsetWidth:29.58 offsetHeight:29.58
+clientTop:0.39 clientLeft:0.39 clientWidth:28.80 clientHeight:28.80
+offsetTop:419.00 offsetLeft:282.50 offsetWidth:29.67 offsetHeight:29.67
+clientTop:0.39 clientLeft:0.39 clientWidth:28.89 clientHeight:28.89
+offsetTop:422.00 offsetLeft:312.39 offsetWidth:29.78 offsetHeight:29.78
+clientTop:0.39 clientLeft:0.39 clientWidth:29.00 clientHeight:29.00
+offsetTop:425.00 offsetLeft:342.50 offsetWidth:29.88 offsetHeight:29.88
+clientTop:0.39 clientLeft:0.39 clientWidth:29.09 clientHeight:29.09
+offsetTop:428.00 offsetLeft:372.80 offsetWidth:29.97 offsetHeight:29.97
+clientTop:0.39 clientLeft:0.39 clientWidth:29.19 clientHeight:29.19
+offsetTop:431.00 offsetLeft:403.30 offsetWidth:30.08 offsetHeight:30.08
+clientTop:0.39 clientLeft:0.39 clientWidth:29.30 clientHeight:29.30
+offsetTop:434.00 offsetLeft:434.00 offsetWidth:30.17 offsetHeight:30.17
+clientTop:0.39 clientLeft:0.39 clientWidth:29.39 clientHeight:29.39
+offsetTop:437.00 offsetLeft:464.89 offsetWidth:30.28 offsetHeight:30.28
+clientTop:0.39 clientLeft:0.39 clientWidth:29.50 clientHeight:29.50
+offsetTop:440.00 offsetLeft:496.00 offsetWidth:30.38 offsetHeight:30.38
+clientTop:0.39 clientLeft:0.39 clientWidth:29.59 clientHeight:29.59
+offsetTop:443.00 offsetLeft:527.30 offsetWidth:30.47 offsetHeight:30.47
+clientTop:0.39 clientLeft:0.39 clientWidth:29.69 clientHeight:29.69
+offsetTop:446.00 offsetLeft:558.80 offsetWidth:30.58 offsetHeight:30.58
+clientTop:0.39 clientLeft:0.39 clientWidth:29.80 clientHeight:29.80
+offsetTop:449.00 offsetLeft:590.50 offsetWidth:30.67 offsetHeight:30.67
+clientTop:0.39 clientLeft:0.39 clientWidth:29.89 clientHeight:29.89
+offsetTop:450.00 offsetLeft:25.50 offsetWidth:30.84 offsetHeight:30.84
+clientTop:0.42 clientLeft:0.42 clientWidth:30.00 clientHeight:30.00
+offsetTop:453.19 offsetLeft:55.59 offsetWidth:30.94 offsetHeight:30.94
+clientTop:0.42 clientLeft:0.42 clientWidth:30.09 clientHeight:30.09
+offsetTop:456.39 offsetLeft:85.89 offsetWidth:31.03 offsetHeight:31.03
+clientTop:0.42 clientLeft:0.42 clientWidth:30.19 clientHeight:30.19
+offsetTop:459.59 offsetLeft:116.39 offsetWidth:31.14 offsetHeight:31.14
+clientTop:0.42 clientLeft:0.42 clientWidth:30.30 clientHeight:30.30
+offsetTop:462.80 offsetLeft:147.09 offsetWidth:31.23 offsetHeight:31.23
+clientTop:0.42 clientLeft:0.42 clientWidth:30.39 clientHeight:30.39
+offsetTop:466.00 offsetLeft:178.00 offsetWidth:31.34 offsetHeight:31.34
+clientTop:0.42 clientLeft:0.42 clientWidth:30.50 clientHeight:30.50
+offsetTop:469.19 offsetLeft:209.09 offsetWidth:31.44 offsetHeight:31.44
+clientTop:0.42 clientLeft:0.42 clientWidth:30.59 clientHeight:30.59
+offsetTop:472.39 offsetLeft:240.39 offsetWidth:31.53 offsetHeight:31.53
+clientTop:0.42 clientLeft:0.42 clientWidth:30.69 clientHeight:30.69
+offsetTop:475.59 offsetLeft:271.89 offsetWidth:31.64 offsetHeight:31.64
+clientTop:0.42 clientLeft:0.42 clientWidth:30.80 clientHeight:30.80
+offsetTop:478.80 offsetLeft:303.59 offsetWidth:31.73 offsetHeight:31.73
+clientTop:0.42 clientLeft:0.42 clientWidth:30.89 clientHeight:30.89
+offsetTop:482.00 offsetLeft:335.50 offsetWidth:31.84 offsetHeight:31.84
+clientTop:0.42 clientLeft:0.42 clientWidth:31.00 clientHeight:31.00
+offsetTop:485.19 offsetLeft:367.59 offsetWidth:31.94 offsetHeight:31.94
+clientTop:0.42 clientLeft:0.42 clientWidth:31.09 clientHeight:31.09
+offsetTop:488.39 offsetLeft:399.89 offsetWidth:32.03 offsetHeight:32.03
+clientTop:0.42 clientLeft:0.42 clientWidth:31.19 clientHeight:31.19
+offsetTop:491.59 offsetLeft:432.39 offsetWidth:32.14 offsetHeight:32.14
+clientTop:0.42 clientLeft:0.42 clientWidth:31.30 clientHeight:31.30
+offsetTop:494.80 offsetLeft:465.09 offsetWidth:32.23 offsetHeight:32.23
+clientTop:0.42 clientLeft:0.42 clientWidth:31.39 clientHeight:31.39
+offsetTop:498.00 offsetLeft:498.00 offsetWidth:32.34 offsetHeight:32.34
+clientTop:0.42 clientLeft:0.42 clientWidth:31.50 clientHeight:31.50
+offsetTop:501.19 offsetLeft:531.09 offsetWidth:32.44 offsetHeight:32.44
+clientTop:0.42 clientLeft:0.42 clientWidth:31.59 clientHeight:31.59
+offsetTop:504.39 offsetLeft:564.39 offsetWidth:32.53 offsetHeight:32.53
+clientTop:0.42 clientLeft:0.42 clientWidth:31.69 clientHeight:31.69
+offsetTop:507.59 offsetLeft:597.89 offsetWidth:32.64 offsetHeight:32.64
+clientTop:0.42 clientLeft:0.42 clientWidth:31.80 clientHeight:31.80
+offsetTop:510.80 offsetLeft:631.59 offsetWidth:32.73 offsetHeight:32.73
+clientTop:0.42 clientLeft:0.42 clientWidth:31.89 clientHeight:31.89
+offsetTop:512.00 offsetLeft:28.80 offsetWidth:32.88 offsetHeight:32.88
+clientTop:0.44 clientLeft:0.44 clientWidth:32.00 clientHeight:32.00
+offsetTop:515.39 offsetLeft:60.89 offsetWidth:32.97 offsetHeight:32.97
+clientTop:0.44 clientLeft:0.44 clientWidth:32.09 clientHeight:32.09
+offsetTop:518.80 offsetLeft:93.19 offsetWidth:33.06 offsetHeight:33.06
+clientTop:0.44 clientLeft:0.44 clientWidth:32.19 clientHeight:32.19
+offsetTop:522.19 offsetLeft:125.69 offsetWidth:33.17 offsetHeight:33.17
+clientTop:0.44 clientLeft:0.44 clientWidth:32.30 clientHeight:32.30
+offsetTop:525.59 offsetLeft:158.39 offsetWidth:33.27 offsetHeight:33.27
+clientTop:0.44 clientLeft:0.44 clientWidth:32.39 clientHeight:32.39
+offsetTop:529.00 offsetLeft:191.30 offsetWidth:33.38 offsetHeight:33.38
+clientTop:0.44 clientLeft:0.44 clientWidth:32.50 clientHeight:32.50
+offsetTop:532.39 offsetLeft:224.39 offsetWidth:33.47 offsetHeight:33.47
+clientTop:0.44 clientLeft:0.44 clientWidth:32.59 clientHeight:32.59
+offsetTop:535.80 offsetLeft:257.69 offsetWidth:33.56 offsetHeight:33.56
+clientTop:0.44 clientLeft:0.44 clientWidth:32.69 clientHeight:32.69
+offsetTop:539.19 offsetLeft:291.19 offsetWidth:33.67 offsetHeight:33.67
+clientTop:0.44 clientLeft:0.44 clientWidth:32.80 clientHeight:32.80
+offsetTop:542.59 offsetLeft:324.89 offsetWidth:33.77 offsetHeight:33.77
+clientTop:0.44 clientLeft:0.44 clientWidth:32.89 clientHeight:32.89
+offsetTop:546.00 offsetLeft:358.80 offsetWidth:33.88 offsetHeight:33.88
+clientTop:0.44 clientLeft:0.44 clientWidth:33.00 clientHeight:33.00
+offsetTop:549.39 offsetLeft:392.89 offsetWidth:33.97 offsetHeight:33.97
+clientTop:0.44 clientLeft:0.44 clientWidth:33.09 clientHeight:33.09
+offsetTop:552.80 offsetLeft:427.19 offsetWidth:34.06 offsetHeight:34.06
+clientTop:0.44 clientLeft:0.44 clientWidth:33.19 clientHeight:33.19
+offsetTop:556.19 offsetLeft:461.69 offsetWidth:34.17 offsetHeight:34.17
+clientTop:0.44 clientLeft:0.44 clientWidth:33.30 clientHeight:33.30
+offsetTop:559.59 offsetLeft:496.39 offsetWidth:34.27 offsetHeight:34.27
+clientTop:0.44 clientLeft:0.44 clientWidth:33.39 clientHeight:33.39
+offsetTop:563.00 offsetLeft:531.30 offsetWidth:34.38 offsetHeight:34.38
+clientTop:0.44 clientLeft:0.44 clientWidth:33.50 clientHeight:33.50
+offsetTop:566.39 offsetLeft:566.39 offsetWidth:34.47 offsetHeight:34.47
+clientTop:0.44 clientLeft:0.44 clientWidth:33.59 clientHeight:33.59
+offsetTop:569.80 offsetLeft:601.69 offsetWidth:34.56 offsetHeight:34.56
+clientTop:0.44 clientLeft:0.44 clientWidth:33.69 clientHeight:33.69
+offsetTop:573.19 offsetLeft:637.19 offsetWidth:34.67 offsetHeight:34.67
+clientTop:0.44 clientLeft:0.44 clientWidth:33.80 clientHeight:33.80
+offsetTop:576.59 offsetLeft:672.89 offsetWidth:34.77 offsetHeight:34.77
+clientTop:0.44 clientLeft:0.44 clientWidth:33.89 clientHeight:33.89
+offsetTop:578.00 offsetLeft:32.30 offsetWidth:34.94 offsetHeight:34.94
+clientTop:0.47 clientLeft:0.47 clientWidth:34.00 clientHeight:34.00
+offsetTop:581.59 offsetLeft:66.39 offsetWidth:35.03 offsetHeight:35.03
+clientTop:0.47 clientLeft:0.47 clientWidth:34.09 clientHeight:34.09
+offsetTop:585.19 offsetLeft:100.69 offsetWidth:35.13 offsetHeight:35.13
+clientTop:0.47 clientLeft:0.47 clientWidth:34.19 clientHeight:34.19
+offsetTop:588.80 offsetLeft:135.19 offsetWidth:35.23 offsetHeight:35.23
+clientTop:0.47 clientLeft:0.47 clientWidth:34.30 clientHeight:34.30
+offsetTop:592.39 offsetLeft:169.89 offsetWidth:35.33 offsetHeight:35.33
+clientTop:0.47 clientLeft:0.47 clientWidth:34.39 clientHeight:34.39
+offsetTop:596.00 offsetLeft:204.80 offsetWidth:35.44 offsetHeight:35.44
+clientTop:0.47 clientLeft:0.47 clientWidth:34.50 clientHeight:34.50
+offsetTop:599.59 offsetLeft:239.89 offsetWidth:35.53 offsetHeight:35.53
+clientTop:0.47 clientLeft:0.47 clientWidth:34.59 clientHeight:34.59
+offsetTop:603.19 offsetLeft:275.19 offsetWidth:35.63 offsetHeight:35.63
+clientTop:0.47 clientLeft:0.47 clientWidth:34.69 clientHeight:34.69
+offsetTop:606.80 offsetLeft:310.69 offsetWidth:35.73 offsetHeight:35.73
+clientTop:0.47 clientLeft:0.47 clientWidth:34.80 clientHeight:34.80
+offsetTop:610.39 offsetLeft:346.39 offsetWidth:35.83 offsetHeight:35.83
+clientTop:0.47 clientLeft:0.47 clientWidth:34.89 clientHeight:34.89
+offsetTop:614.00 offsetLeft:382.30 offsetWidth:35.94 offsetHeight:35.94
+clientTop:0.47 clientLeft:0.47 clientWidth:35.00 clientHeight:35.00
+offsetTop:617.59 offsetLeft:418.39 offsetWidth:36.03 offsetHeight:36.03
+clientTop:0.47 clientLeft:0.47 clientWidth:35.09 clientHeight:35.09
+offsetTop:621.19 offsetLeft:454.69 offsetWidth:36.13 offsetHeight:36.13
+clientTop:0.47 clientLeft:0.47 clientWidth:35.19 clientHeight:35.19
+offsetTop:624.80 offsetLeft:491.19 offsetWidth:36.23 offsetHeight:36.23
+clientTop:0.47 clientLeft:0.47 clientWidth:35.30 clientHeight:35.30
+offsetTop:628.39 offsetLeft:527.89 offsetWidth:36.33 offsetHeight:36.33
+clientTop:0.47 clientLeft:0.47 clientWidth:35.39 clientHeight:35.39
+offsetTop:632.00 offsetLeft:564.80 offsetWidth:36.44 offsetHeight:36.44
+clientTop:0.47 clientLeft:0.47 clientWidth:35.50 clientHeight:35.50
+offsetTop:635.59 offsetLeft:601.89 offsetWidth:36.53 offsetHeight:36.53
+clientTop:0.47 clientLeft:0.47 clientWidth:35.59 clientHeight:35.59
+offsetTop:639.19 offsetLeft:639.19 offsetWidth:36.63 offsetHeight:36.63
+clientTop:0.47 clientLeft:0.47 clientWidth:35.69 clientHeight:35.69
+offsetTop:642.80 offsetLeft:676.69 offsetWidth:36.73 offsetHeight:36.73
+clientTop:0.47 clientLeft:0.47 clientWidth:35.80 clientHeight:35.80
+offsetTop:646.39 offsetLeft:714.39 offsetWidth:36.83 offsetHeight:36.83
+clientTop:0.47 clientLeft:0.47 clientWidth:35.89 clientHeight:35.89
+offsetTop:648.00 offsetLeft:36.00 offsetWidth:37.00 offsetHeight:37.00
+clientTop:0.50 clientLeft:0.50 clientWidth:36.00 clientHeight:36.00
+offsetTop:651.80 offsetLeft:72.09 offsetWidth:37.09 offsetHeight:37.09
+clientTop:0.50 clientLeft:0.50 clientWidth:36.09 clientHeight:36.09
+offsetTop:655.59 offsetLeft:108.39 offsetWidth:37.19 offsetHeight:37.19
+clientTop:0.50 clientLeft:0.50 clientWidth:36.19 clientHeight:36.19
+offsetTop:659.39 offsetLeft:144.89 offsetWidth:37.30 offsetHeight:37.30
+clientTop:0.50 clientLeft:0.50 clientWidth:36.30 clientHeight:36.30
+offsetTop:663.19 offsetLeft:181.59 offsetWidth:37.39 offsetHeight:37.39
+clientTop:0.50 clientLeft:0.50 clientWidth:36.39 clientHeight:36.39
+offsetTop:667.00 offsetLeft:218.50 offsetWidth:37.50 offsetHeight:37.50
+clientTop:0.50 clientLeft:0.50 clientWidth:36.50 clientHeight:36.50
+offsetTop:670.80 offsetLeft:255.59 offsetWidth:37.59 offsetHeight:37.59
+clientTop:0.50 clientLeft:0.50 clientWidth:36.59 clientHeight:36.59
+offsetTop:674.59 offsetLeft:292.89 offsetWidth:37.69 offsetHeight:37.69
+clientTop:0.50 clientLeft:0.50 clientWidth:36.69 clientHeight:36.69
+offsetTop:678.39 offsetLeft:330.39 offsetWidth:37.80 offsetHeight:37.80
+clientTop:0.50 clientLeft:0.50 clientWidth:36.80 clientHeight:36.80
+offsetTop:682.19 offsetLeft:368.09 offsetWidth:37.89 offsetHeight:37.89
+clientTop:0.50 clientLeft:0.50 clientWidth:36.89 clientHeight:36.89
+offsetTop:686.00 offsetLeft:406.00 offsetWidth:38.00 offsetHeight:38.00
+clientTop:0.50 clientLeft:0.50 clientWidth:37.00 clientHeight:37.00
+offsetTop:689.80 offsetLeft:444.09 offsetWidth:38.09 offsetHeight:38.09
+clientTop:0.50 clientLeft:0.50 clientWidth:37.09 clientHeight:37.09
+offsetTop:693.59 offsetLeft:482.39 offsetWidth:38.19 offsetHeight:38.19
+clientTop:0.50 clientLeft:0.50 clientWidth:37.19 clientHeight:37.19
+offsetTop:697.39 offsetLeft:520.89 offsetWidth:38.30 offsetHeight:38.30
+clientTop:0.50 clientLeft:0.50 clientWidth:37.30 clientHeight:37.30
+offsetTop:701.19 offsetLeft:559.59 offsetWidth:38.39 offsetHeight:38.39
+clientTop:0.50 clientLeft:0.50 clientWidth:37.39 clientHeight:37.39
+offsetTop:705.00 offsetLeft:598.50 offsetWidth:38.50 offsetHeight:38.50
+clientTop:0.50 clientLeft:0.50 clientWidth:37.50 clientHeight:37.50
+offsetTop:708.80 offsetLeft:637.59 offsetWidth:38.59 offsetHeight:38.59
+clientTop:0.50 clientLeft:0.50 clientWidth:37.59 clientHeight:37.59
+offsetTop:712.59 offsetLeft:676.89 offsetWidth:38.69 offsetHeight:38.69
+clientTop:0.50 clientLeft:0.50 clientWidth:37.69 clientHeight:37.69
+offsetTop:716.39 offsetLeft:716.39 offsetWidth:38.80 offsetHeight:38.80
+clientTop:0.50 clientLeft:0.50 clientWidth:37.80 clientHeight:37.80
+offsetTop:720.19 offsetLeft:756.09 offsetWidth:38.89 offsetHeight:38.89
+clientTop:0.50 clientLeft:0.50 clientWidth:37.89 clientHeight:37.89
+offsetTop:722.00 offsetLeft:39.89 offsetWidth:39.03 offsetHeight:39.03
+clientTop:0.52 clientLeft:0.52 clientWidth:38.00 clientHeight:38.00
+offsetTop:726.00 offsetLeft:78.00 offsetWidth:39.13 offsetHeight:39.13
+clientTop:0.52 clientLeft:0.52 clientWidth:38.09 clientHeight:38.09
+offsetTop:730.00 offsetLeft:116.30 offsetWidth:39.22 offsetHeight:39.22
+clientTop:0.52 clientLeft:0.52 clientWidth:38.19 clientHeight:38.19
+offsetTop:734.00 offsetLeft:154.80 offsetWidth:39.33 offsetHeight:39.33
+clientTop:0.52 clientLeft:0.52 clientWidth:38.30 clientHeight:38.30
+offsetTop:738.00 offsetLeft:193.50 offsetWidth:39.42 offsetHeight:39.42
+clientTop:0.52 clientLeft:0.52 clientWidth:38.39 clientHeight:38.39
+offsetTop:742.00 offsetLeft:232.39 offsetWidth:39.53 offsetHeight:39.53
+clientTop:0.52 clientLeft:0.52 clientWidth:38.50 clientHeight:38.50
+offsetTop:746.00 offsetLeft:271.50 offsetWidth:39.63 offsetHeight:39.63
+clientTop:0.52 clientLeft:0.52 clientWidth:38.59 clientHeight:38.59
+offsetTop:750.00 offsetLeft:310.80 offsetWidth:39.72 offsetHeight:39.72
+clientTop:0.52 clientLeft:0.52 clientWidth:38.69 clientHeight:38.69
+offsetTop:754.00 offsetLeft:350.30 offsetWidth:39.83 offsetHeight:39.83
+clientTop:0.52 clientLeft:0.52 clientWidth:38.80 clientHeight:38.80
+offsetTop:758.00 offsetLeft:390.00 offsetWidth:39.92 offsetHeight:39.92
+clientTop:0.52 clientLeft:0.52 clientWidth:38.89 clientHeight:38.89
+offsetTop:762.00 offsetLeft:429.89 offsetWidth:40.03 offsetHeight:40.03
+clientTop:0.52 clientLeft:0.52 clientWidth:39.00 clientHeight:39.00
+offsetTop:766.00 offsetLeft:470.00 offsetWidth:40.13 offsetHeight:40.13
+clientTop:0.52 clientLeft:0.52 clientWidth:39.09 clientHeight:39.09
+offsetTop:770.00 offsetLeft:510.30 offsetWidth:40.22 offsetHeight:40.22
+clientTop:0.52 clientLeft:0.52 clientWidth:39.19 clientHeight:39.19
+offsetTop:774.00 offsetLeft:550.80 offsetWidth:40.33 offsetHeight:40.33
+clientTop:0.52 clientLeft:0.52 clientWidth:39.30 clientHeight:39.30
+offsetTop:778.00 offsetLeft:591.50 offsetWidth:40.42 offsetHeight:40.42
+clientTop:0.52 clientLeft:0.52 clientWidth:39.39 clientHeight:39.39
+offsetTop:782.00 offsetLeft:632.39 offsetWidth:40.53 offsetHeight:40.53
+clientTop:0.52 clientLeft:0.52 clientWidth:39.50 clientHeight:39.50
+offsetTop:786.00 offsetLeft:673.50 offsetWidth:40.63 offsetHeight:40.63
+clientTop:0.52 clientLeft:0.52 clientWidth:39.59 clientHeight:39.59
+offsetTop:790.00 offsetLeft:714.80 offsetWidth:40.72 offsetHeight:40.72
+clientTop:0.52 clientLeft:0.52 clientWidth:39.69 clientHeight:39.69
+offsetTop:794.00 offsetLeft:756.30 offsetWidth:40.83 offsetHeight:40.83
+clientTop:0.52 clientLeft:0.52 clientWidth:39.80 clientHeight:39.80
+offsetTop:798.00 offsetLeft:798.00 offsetWidth:40.92 offsetHeight:40.92
+clientTop:0.52 clientLeft:0.52 clientWidth:39.89 clientHeight:39.89
+
diff --git a/LayoutTests/cssom/subpixel-offsetleft-top-width-height-values.html b/LayoutTests/cssom/subpixel-offsetleft-top-width-height-values.html
new file mode 100644 (file)
index 0000000..63f1410
--- /dev/null
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>This tests that offset* and client* can return fractional values.</title>
+<style>
+div { 
+  position: fixed;
+  border-style: solid;
+  border-color: red;
+}
+</style>
+</head>
+<body>
+<script>
+  if (window.testRunner)
+    testRunner.dumpAsText();
+    
+  var container = document.body;
+  w = 0;
+  h = 0;
+  adjustment = 0.1;
+  for (i = 0; i < 20; ++i) {
+    adjustment+=0.1;
+    for (j = 0; j < 20; ++j) {
+      var e = document.createElement("div");
+      e.style.top = (w * i + j * adjustment) + "px";
+      e.style.left = (w * j + i * adjustment) + "px";
+      e.style.width = w + "px";
+      e.style.height = h + "px";
+      e.style.borderWidth = adjustment/4 + "px";
+      container.appendChild(e);
+      w+=0.1;
+      h+=0.1;
+    }
+  }
+  
+  var result = "";
+  var divs = document.getElementsByTagName("div");
+  for (i = 0; i < divs.length; ++i) {
+    var element = divs[i];
+    result+="offsetTop:" + element.offsetTop.toFixed(2) + " offsetLeft:" + element.offsetLeft.toFixed(2) + " offsetWidth:" + element.offsetWidth.toFixed(2) + " offsetHeight:" + element.offsetHeight.toFixed(2) + "</br> clientTop:" + element.clientTop.toFixed(2) + " clientLeft:" + element.clientLeft.toFixed(2) + " clientWidth:" + element.clientWidth.toFixed(2) + " clientHeight:" + element.clientHeight.toFixed(2) + "</br>";
+  }
+  document.body.innerHTML = result;  
+</script>
+</body>
+</html>
\ No newline at end of file
index ffbf5c2..b25545d 100644 (file)
 
             dragStartHandler: function(dragStart, dragDistance) {
                 var resultElement = document.getElementById("result");
-                shouldBe(resultElement, "clientX", dragStart.x, event.clientX);
-                shouldBe(resultElement, "clientY", dragStart.y, event.clientY);
-                shouldBe(resultElement, "pageX", dragStart.x, event.pageX);
-                shouldBe(resultElement, "pageY", dragStart.y, event.pageY);
+                shouldBe(resultElement, "clientX", Math.floor(dragStart.x), event.clientX);
+                shouldBe(resultElement, "clientY", Math.floor(dragStart.y), event.clientY);
+                shouldBe(resultElement, "pageX", Math.floor(dragStart.x), event.pageX);
+                shouldBe(resultElement, "pageY", Math.floor(dragStart.y), event.pageY);
             },
 
             runTest: function() {
@@ -57,7 +57,7 @@
                     testRunner.dumpAsText();
                 
                 var element = document.getElementById("draggable");
-                var dragStart = { x: element.offsetLeft + element.offsetWidth / 2, y:  element.offsetTop + 1.0 };
+                var dragStart = { x: Math.round(element.offsetLeft) + Math.round(element.offsetWidth) / 2, y:  Math.round(element.offsetTop) + 1.0 };
                 var dragDistance = 10.0;
                 element.ondragstart = this.dragStartHandler.bind(this, dragStart, dragDistance);
                 
index cfd3124..d60113f 100644 (file)
@@ -55,8 +55,8 @@ function runTest(x, y, elem, offset, refpos) {
     var anchorOffset = selection.anchorOffset;
 
     var coord = caretCoordinates();
-    var anchorString = "Anchor (" + anchorNode + ", " + anchorOffset + " caret[" + coord.x + "," + coord.y + "] refpos=" + refpos + ")";
-    var anchorCorrect = anchorNode == elem && anchorOffset == offset && coord.x == refpos;
+    var anchorString = "Anchor (" + anchorNode + ", " + anchorOffset + " caret[" + coord.x + "," + coord.y + "] refpos=" + Math.round(refpos) + ")";
+    var anchorCorrect = anchorNode == elem && anchorOffset == offset && coord.x == Math.round(refpos);
     if (anchorCorrect)
         log(anchorString + " is correct.");
     else
index f87ff2c..d9bd8aa 100644 (file)
@@ -29,8 +29,8 @@
     
     for (zoom = 100; zoom <= 200; zoom += 1) {
         containerStyle.setProperty("zoom", zoom / 100);
-        if (target.offsetWidth != 1 || target.offsetHeight != 10) {
-            if (hasSubpixelSupport && (target.offsetWidth == 1 || target.offsetWidth == 2) && (target.offsetHeight == 10 || target.offsetHeight == 11))
+        if (Math.round(target.offsetWidth) != 1 || Math.round(target.offsetHeight) != 10) {
+            if (hasSubpixelSupport && (Math.round(target.offsetWidth) == 1 || Math.round(target.offsetWidth) == 2) && (Math.round(target.offsetHeight) == 10 || Math.round(target.offsetHeight) == 11))
                 continue; // With subpixel layout and pixel snapping we extend the box with one pixel at certain zoom levels.
             failed = true;
             log("FAIL at " + zoom + "% magnification: 1 mapped to " + target.offsetWidth + " and 10 mapped to " + target.offsetHeight + ".");
index 36f38da..7b5d1af 100644 (file)
@@ -23,8 +23,8 @@ PASS nonNumericPolicy('document.elementFromPoint(x, 0)') is 'any type allowed'
 PASS nonNumericPolicy('document.elementFromPoint(0, x)') is 'any type allowed'
 PASS nonNumericPolicy('document.body.scrollByLines(x)') is 'any type allowed'
 PASS nonNumericPolicy('document.body.scrollByPages(x)') is 'any type allowed'
-PASS nonNumericPolicy('document.body.scrollLeft = x') is 'any type allowed'
-PASS nonNumericPolicy('document.body.scrollTop = x') is 'any type allowed'
+PASS nonNumericPolicy('document.body.scrollLeft = x') is 'mixed'
+PASS nonNumericPolicy('document.body.scrollTop = x') is 'mixed'
 PASS nonNumericPolicy('document.images.item(x)') is 'any type allowed'
 PASS nonNumericPolicy('document.createElement("input").setSelectionRange(x, 0)') is 'any type allowed'
 PASS nonNumericPolicy('document.createElement("input").setSelectionRange(0, x)') is 'any type allowed'
index 8bccf5d..d35f341 100644 (file)
@@ -226,8 +226,8 @@ shouldBe("nonNumericPolicy('document.elementFromPoint(0, x)')", "'any type allow
 
 shouldBe("nonNumericPolicy('document.body.scrollByLines(x)')", "'any type allowed'");
 shouldBe("nonNumericPolicy('document.body.scrollByPages(x)')", "'any type allowed'");
-shouldBe("nonNumericPolicy('document.body.scrollLeft = x')", "'any type allowed'");
-shouldBe("nonNumericPolicy('document.body.scrollTop = x')", "'any type allowed'");
+shouldBe("nonNumericPolicy('document.body.scrollLeft = x')", "'mixed'");
+shouldBe("nonNumericPolicy('document.body.scrollTop = x')", "'mixed'");
 
 // History
 
@@ -392,8 +392,8 @@ Here are other examples of numeric types in function parameters and settable att
 ../../../../WebCore/html/HTMLAppletElement.idl:                 attribute [ConvertFromString] long vspace;
 ../../../../WebCore/html/HTMLAreaElement.idl:        attribute long tabIndex;
 ../../../../WebCore/html/HTMLBaseFontElement.idl:        attribute long size;
-../../../../WebCore/html/HTMLBodyElement.idl:                 attribute long scrollLeft;
-../../../../WebCore/html/HTMLBodyElement.idl:                 attribute long scrollTop;
+../../../../WebCore/html/HTMLBodyElement.idl:                 attribute float scrollLeft;
+../../../../WebCore/html/HTMLBodyElement.idl:                 attribute float scrollTop;
 ../../../../WebCore/html/HTMLButtonElement.idl:                 attribute  long                 tabIndex;
 ../../../../WebCore/html/HTMLCanvasElement.idl:        attribute long width;
 ../../../../WebCore/html/HTMLCanvasElement.idl:        attribute long height;
index 1ff9824..6b78def 100644 (file)
@@ -43,8 +43,8 @@ function printSize(tagname, cell)
         var thisRow = thisCell.parentNode;
 
         button.parentNode.nextSibling.innerHTML = 
-            "(" + button.offsetHeight + ", " + button.offsetWidth + ") " +
-            "(" + button.clientHeight + ", " + button.clientWidth + ")";
+            "(" + Math.round(button.offsetHeight) + ", " + Math.round(button.offsetWidth) + ") " +
+            "(" + Math.round(button.clientHeight) + ", " + Math.round(button.clientWidth) + ")";
     }
 }
 
index 36a4bb1..77465b1 100644 (file)
@@ -52,7 +52,6 @@ PASS a["offsetLeft"] is 8
 PASS a["offsetTop"] is 774
 PASS a["offsetWidth"] is 39
 PASS a["offsetHeight"] is 18
-PASS a["offsetParent"] is [object HTMLBodyElement]
 PASS a["clientLeft"] is 0
 PASS a["clientTop"] is 0
 PASS a["clientWidth"] is 0
@@ -61,6 +60,7 @@ PASS a["scrollLeft"] is 0
 PASS a["scrollTop"] is 0
 PASS a["scrollWidth"] is 0
 PASS a["scrollHeight"] is 0
+PASS a["offsetParent"] is [object HTMLBodyElement]
 PASS a["className"] is 
 PASS a["classList"] is 
 PASS a["dataset"] is [object DOMStringMap]
index 2969da8..f64711b 100644 (file)
@@ -69,7 +69,7 @@ function scrollTest() {
     // Scroll the #source until we reach the #target.
     var startPosX = divTarget.offsetLeft + 20;
     debug("div display height = " + divTarget.clientHeight);
-    var startPosY = divTarget.offsetTop + divTarget.clientHeight - 42; // One wheel turn before end.
+    var startPosY = Math.round(divTarget.offsetTop) + Math.round(divTarget.clientHeight) - 42; // One wheel turn before end.
     eventSender.mouseMoveTo(startPosX, startPosY); // Make sure we are just outside the iFrame
     debug("Mouse moved to (" + startPosX + ", " + startPosY + ")");
     eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'began', 'none', true);
index c43feae..c904d3b 100644 (file)
@@ -66,8 +66,8 @@ function scrollTest() {
     divScrollPositionBefore = divTarget.scrollTop;
 
     // Scroll the #source until we reach the #target.
-    var startPosX = divTarget.offsetLeft + 20;
-    var startPosY = divTarget.offsetTop - 42; // Slightly more than one wheel scroll away from the IFrame
+    var startPosX = Math.round(divTarget.offsetLeft) + 20;
+    var startPosY = Math.round(divTarget.offsetTop) - 42; // Slightly more than one wheel scroll away from the IFrame
     eventSender.mouseMoveTo(startPosX, startPosY); // Make sure we are just outside the iFrame
     debug("Mouse moved to (" + startPosX + ", " + startPosY + ")");
     eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'began', 'none', true);
index ab11c25..956dcc0 100644 (file)
@@ -71,7 +71,7 @@ function scrollTest() {
     // Scroll the #source until we reach the #target.
     var startPosX = selectTarget.offsetLeft + 20;
     debug("div display height = " + selectTarget.clientHeight);
-    var startPosY = selectTarget.offsetTop + selectTarget.clientHeight + clientInset - 2; // Very near top (accounting for top content inset).
+    var startPosY = Math.round(selectTarget.offsetTop) + Math.round(selectTarget.clientHeight) + clientInset - 2; // Very near top (accounting for top content inset).
     eventSender.mouseMoveTo(startPosX, startPosY);
     debug("Mouse moved to (" + startPosX + ", " + startPosY + ")");
     eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'began', 'none', true);
index 2d7a465..34ecb1e 100644 (file)
@@ -66,8 +66,8 @@ function scrollTest() {
     selectScrollPositionBefore = selectTarget.scrollTop;
 
     // Scroll the #source until we reach the #target.
-    var startPosX = selectTarget.offsetLeft + 20;
-    var startPosY = selectTarget.offsetTop - 42; // Slightly more than one wheel scroll away from the IFrame
+    var startPosX = Math.round(selectTarget.offsetLeft) + 20;
+    var startPosY = Math.round(selectTarget.offsetTop) - 42; // Slightly more than one wheel scroll away from the IFrame
     eventSender.mouseMoveTo(startPosX, startPosY); // Make sure we are just outside the iFrame
     debug("Mouse moved to (" + startPosX + ", " + startPosY + ")");
     eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'began', 'none', true);
index 9722846..123e2a9 100644 (file)
@@ -67,9 +67,9 @@ function scrollTest() {
     selectScrollPositionBefore = selectTarget.scrollTop;
 
     // Scroll the #source until we reach the #target.
-    var startPosX = selectTarget.offsetLeft + 20;
+    var startPosX = Math.round(selectTarget.offsetLeft) + 20;
     debug("div display height = " + selectTarget.clientHeight);
-    var startPosY = selectTarget.offsetTop + selectTarget.clientHeight - 42; // One wheel turn before end.
+    var startPosY = Math.round(selectTarget.offsetTop) + Math.round(selectTarget.clientHeight) - 42; // One wheel turn before end.
     eventSender.mouseMoveTo(startPosX, startPosY); // Make sure we are just outside the iFrame
     debug("Mouse moved to (" + startPosX + ", " + startPosY + ")");
     eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'began', 'none', true);
index 05e6afd..16873f8 100644 (file)
@@ -37,63 +37,63 @@ function checkExpectedValues(node, failures)
     var output = { checked: false };
     var expectedWidth = checkAttribute(output, node, "data-expected-width");
     if (expectedWidth) {
-        if (node.offsetWidth != parseInt(expectedWidth))
+        if (Math.round(node.offsetWidth) != parseInt(expectedWidth))
             failures.push("Expected " + expectedWidth + " for width, but got " + node.offsetWidth + ". ");
     }
 
     var expectedHeight = checkAttribute(output, node, "data-expected-height");
     if (expectedHeight) {
-        if (node.offsetHeight != parseInt(expectedHeight))
+        if (Math.round(node.offsetHeight) != parseInt(expectedHeight))
             failures.push("Expected " + expectedHeight + " for height, but got " + node.offsetHeight + ". ");
     }
 
     var expectedOffset = checkAttribute(output, node, "data-offset-x");
     if (expectedOffset) {
-        if (node.offsetLeft != parseInt(expectedOffset))
+        if (Math.round(node.offsetLeft) != parseInt(expectedOffset))
             failures.push("Expected " + expectedOffset + " for offsetLeft, but got " + node.offsetLeft + ". ");
     }
 
     var expectedOffset = checkAttribute(output, node, "data-offset-y");
     if (expectedOffset) {
-        if (node.offsetTop != parseInt(expectedOffset))
+        if (Math.round(node.offsetTop) != parseInt(expectedOffset))
             failures.push("Expected " + expectedOffset + " for offsetTop, but got " + node.offsetTop + ". ");
     }
 
     var expectedWidth = checkAttribute(output, node, "data-expected-client-width");
     if (expectedWidth) {
-        if (node.clientWidth != parseInt(expectedWidth))
+        if (Math.round(node.clientWidth) != parseInt(expectedWidth))
             failures.push("Expected " + expectedWidth + " for clientWidth, but got " + node.clientWidth + ". ");
     }
 
     var expectedHeight = checkAttribute(output, node, "data-expected-client-height");
     if (expectedHeight) {
-        if (node.clientHeight != parseInt(expectedHeight))
+        if (Math.round(node.clientHeight) != parseInt(expectedHeight))
             failures.push("Expected " + expectedHeight + " for clientHeight, but got " + node.clientHeight + ". ");
     }
 
     var expectedWidth = checkAttribute(output, node, "data-expected-scroll-width");
     if (expectedWidth) {
-        if (node.scrollWidth != parseInt(expectedWidth))
+        if (Math.round(node.scrollWidth) != parseInt(expectedWidth))
             failures.push("Expected " + expectedWidth + " for scrollWidth, but got " + node.scrollWidth + ". ");
     }
 
     var expectedHeight = checkAttribute(output, node, "data-expected-scroll-height");
     if (expectedHeight) {
-        if (node.scrollHeight != parseInt(expectedHeight))
+        if (Math.round(node.scrollHeight) != parseInt(expectedHeight))
             failures.push("Expected " + expectedHeight + " for scrollHeight, but got " + node.scrollHeight + ". ");
     }
 
     var expectedOffset = checkAttribute(output, node, "data-total-x");
     if (expectedOffset) {
         var totalLeft = node.clientLeft + node.offsetLeft;
-        if (totalLeft != parseInt(expectedOffset))
+        if (Math.round(totalLeft) != parseInt(expectedOffset))
             failures.push("Expected " + expectedOffset + " for clientLeft+offsetLeft, but got " + totalLeft + ", clientLeft: " + node.clientLeft + ", offsetLeft: " + node.offsetLeft + ". ");
     }
 
     var expectedOffset = checkAttribute(output, node, "data-total-y");
     if (expectedOffset) {
         var totalTop = node.clientTop + node.offsetTop;
-        if (totalTop != parseInt(expectedOffset))
+        if (Math.round(totalTop) != parseInt(expectedOffset))
             failures.push("Expected " + expectedOffset + " for clientTop+offsetTop, but got " + totalTop + ", clientTop: " + node.clientTop + ", + offsetTop: " + node.offsetTop + ". ");
     }
 
index fdbf2f2..4f180c9 100644 (file)
@@ -1,3 +1,59 @@
+2014-05-14  Zalan Bujtas  <zalan@apple.com>
+
+        Subpixel layout: Change Element.offset* client* scroll* return type to double.
+        https://bugs.webkit.org/show_bug.cgi?id=132895
+
+        Reviewed by Simon Fraser.
+
+        This patch changes Element.offset*, Element.client* and Element.scroll* APIs return
+        type from long to double to match the latest CSSOM View Module spec[1].
+        Element.offset* and Element.client* do return subpixel values from now on.
+        Element.scroll* still return integral values as the scrolling code hasn't adopted to subpixel rendering yet.
+
+        subpixelCSSOMElementMetricsEnabled setting is added to be able to turn this feature on/off
+        from WK2 preferences. It toggles the return value from subpixel to floored integral.
+        It does not change layout/rendering behavior.
+
+        Reference list of what other browsers do:
+        IE: http://blogs.msdn.com/b/ie/archive/2012/02/17/sub-pixel-rendering-and-the-css-object-model.aspx
+        Blink: http://www.chromestatus.com/features/5497402177880064
+        Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=825607
+
+        [1] http://www.w3.org/TR/2013/WD-cssom-view-20131217/
+
+        Test: cssom/subpixel-offsetleft-top-width-height-values.html
+
+        * dom/Element.cpp:
+        (WebCore::localZoomForRenderer):
+        (WebCore::adjustForLocalZoom):
+        (WebCore::convertToNonSubpixelValueIfNeeded):
+        (WebCore::Element::offsetLeft):
+        (WebCore::Element::offsetTop):
+        (WebCore::Element::offsetWidth):
+        (WebCore::Element::offsetHeight):
+        (WebCore::Element::clientLeft):
+        (WebCore::Element::clientTop):
+        (WebCore::Element::clientWidth):
+        (WebCore::Element::clientHeight):
+        (WebCore::Element::scrollLeft):
+        (WebCore::Element::scrollTop):
+        (WebCore::Element::setScrollLeft):
+        (WebCore::Element::setScrollTop):
+        (WebCore::Element::scrollWidth):
+        (WebCore::Element::scrollHeight):
+        * dom/Element.h:
+        * dom/Element.idl:
+        * html/HTMLBodyElement.cpp:
+        (WebCore::adjustForZoom):
+        (WebCore::HTMLBodyElement::scrollLeft):
+        (WebCore::HTMLBodyElement::setScrollLeft):
+        (WebCore::HTMLBodyElement::scrollTop):
+        (WebCore::HTMLBodyElement::setScrollTop):
+        (WebCore::HTMLBodyElement::scrollHeight):
+        (WebCore::HTMLBodyElement::scrollWidth):
+        * html/HTMLBodyElement.h:
+        * page/Settings.in:
+
 2014-05-14  Brady Eidson  <beidson@apple.com>
 
         Implement NSSharingServiceDelegate method "transitionImageForShareItem"
index 049fb4a..bbeab58 100644 (file)
@@ -621,16 +621,16 @@ void Element::scrollByPages(int pages)
     scrollByUnits(pages, ScrollByPage);
 }
 
-static float localZoomForRenderer(RenderElement* renderer)
+static double localZoomForRenderer(const RenderElement& renderer)
 {
     // FIXME: This does the wrong thing if two opposing zooms are in effect and canceled each
     // other out, but the alternative is that we'd have to crawl up the whole render tree every
     // time (or store an additional bit in the RenderStyle to indicate that a zoom was specified).
-    float zoomFactor = 1;
-    if (renderer->style().effectiveZoom() != 1) {
+    double zoomFactor = 1;
+    if (renderer.style().effectiveZoom() != 1) {
         // Need to find the nearest enclosing RenderElement that set up
         // a differing zoom, and then we divide our result by it to eliminate the zoom.
-        RenderElement* prev = renderer;
+        const RenderElement* prev = &renderer;
         for (RenderElement* curr = prev->parent(); curr; curr = curr->parent()) {
             if (curr->style().effectiveZoom() != prev->style().effectiveZoom()) {
                 zoomFactor = prev->style().zoom();
@@ -644,57 +644,63 @@ static float localZoomForRenderer(RenderElement* renderer)
     return zoomFactor;
 }
 
-static int adjustForLocalZoom(LayoutUnit value, RenderElement* renderer)
+static double adjustForLocalZoom(LayoutUnit value, const RenderElement& renderer)
 {
-    float zoomFactor = localZoomForRenderer(renderer);
+    double zoomFactor = localZoomForRenderer(renderer);
     if (zoomFactor == 1)
-        return value;
+        return value.toDouble();
 #if ENABLE(SUBPIXEL_LAYOUT)
-    return lroundf(value / zoomFactor);
+    return value.toDouble() / zoomFactor;
 #else
     // Needed because computeLengthInt truncates (rather than rounds) when scaling up.
     if (zoomFactor > 1)
         ++value;
-    return static_cast<int>(value / zoomFactor);
+    return value.toDouble() / zoomFactor;
 #endif
 }
 
-int Element::offsetLeft()
+static double convertToNonSubpixelValueIfNeeded(double value, const Document& document)
+{
+    return document.settings() && !document.settings()->subpixelCSSOMElementMetricsEnabled() ? floor(value) : value;
+}
+
+double Element::offsetLeft()
 {
     document().updateLayoutIgnorePendingStylesheets();
     if (RenderBoxModelObject* renderer = renderBoxModelObject())
-        return adjustForLocalZoom(renderer->pixelSnappedOffsetLeft(), renderer);
+        return convertToNonSubpixelValueIfNeeded(adjustForLocalZoom(renderer->offsetLeft(), *renderer), renderer->document());
     return 0;
 }
 
-int Element::offsetTop()
+double Element::offsetTop()
 {
     document().updateLayoutIgnorePendingStylesheets();
     if (RenderBoxModelObject* renderer = renderBoxModelObject())
-        return adjustForLocalZoom(renderer->pixelSnappedOffsetTop(), renderer);
+        return convertToNonSubpixelValueIfNeeded(adjustForLocalZoom(renderer->offsetTop(), *renderer), renderer->document());
     return 0;
 }
 
-int Element::offsetWidth()
+double Element::offsetWidth()
 {
     document().updateLayoutIgnorePendingStylesheets();
-    if (RenderBoxModelObject* renderer = renderBoxModelObject())
+    if (RenderBoxModelObject* renderer = renderBoxModelObject()) {
 #if ENABLE(SUBPIXEL_LAYOUT)
-        return adjustLayoutUnitForAbsoluteZoom(renderer->pixelSnappedOffsetWidth(), *renderer).round();
+        return convertToNonSubpixelValueIfNeeded(adjustLayoutUnitForAbsoluteZoom(renderer->offsetWidth(), *renderer).toDouble(), renderer->document());
 #else
-        return adjustForAbsoluteZoom(renderer->pixelSnappedOffsetWidth(), *renderer);
+        return adjustForAbsoluteZoom(renderer->offsetWidth(), *renderer);
 #endif
+    }
     return 0;
 }
 
-int Element::offsetHeight()
+double Element::offsetHeight()
 {
     document().updateLayoutIgnorePendingStylesheets();
     if (RenderBoxModelObject* renderer = renderBoxModelObject())
 #if ENABLE(SUBPIXEL_LAYOUT)
-        return adjustLayoutUnitForAbsoluteZoom(renderer->pixelSnappedOffsetHeight(), *renderer).round();
+        return convertToNonSubpixelValueIfNeeded(adjustLayoutUnitForAbsoluteZoom(renderer->offsetHeight(), *renderer).toDouble(), renderer->document());
 #else
-        return adjustForAbsoluteZoom(renderer->pixelSnappedOffsetHeight(), *renderer);
+        return adjustForAbsoluteZoom(renderer->offsetHeight(), *renderer);
 #endif
     return 0;
 }
@@ -719,25 +725,33 @@ Element* Element::offsetParent()
     return offsetParent->element();
 }
 
-int Element::clientLeft()
+double Element::clientLeft()
 {
     document().updateLayoutIgnorePendingStylesheets();
 
     if (RenderBox* renderer = renderBox())
-        return adjustForAbsoluteZoom(roundToInt(renderer->clientLeft()), *renderer);
+#if ENABLE(SUBPIXEL_LAYOUT)
+        return convertToNonSubpixelValueIfNeeded(adjustLayoutUnitForAbsoluteZoom(renderer->clientLeft(), *renderer).toDouble(), renderer->document());
+#else
+        return adjustForAbsoluteZoom(renderer->clientLeft(), *renderer);
+#endif
     return 0;
 }
 
-int Element::clientTop()
+double Element::clientTop()
 {
     document().updateLayoutIgnorePendingStylesheets();
 
     if (RenderBox* renderer = renderBox())
-        return adjustForAbsoluteZoom(roundToInt(renderer->clientTop()), *renderer);
+#if ENABLE(SUBPIXEL_LAYOUT)
+        return convertToNonSubpixelValueIfNeeded(adjustLayoutUnitForAbsoluteZoom(renderer->clientTop(), *renderer).toDouble(), renderer->document());
+#else
+        return adjustForAbsoluteZoom(renderer->clientTop(), *renderer);
+#endif
     return 0;
 }
 
-int Element::clientWidth()
+double Element::clientWidth()
 {
     document().updateLayoutIgnorePendingStylesheets();
 
@@ -753,14 +767,14 @@ int Element::clientWidth()
     
     if (RenderBox* renderer = renderBox())
 #if ENABLE(SUBPIXEL_LAYOUT)
-        return adjustLayoutUnitForAbsoluteZoom(renderer->pixelSnappedClientWidth(), *renderer).round();
+        return convertToNonSubpixelValueIfNeeded(adjustLayoutUnitForAbsoluteZoom(renderer->clientWidth(), *renderer).toDouble(), renderer->document());
 #else
-        return adjustForAbsoluteZoom(renderer->pixelSnappedClientWidth(), *renderer);
+        return adjustForAbsoluteZoom(renderer->clientWidth(), *renderer);
 #endif
     return 0;
 }
 
-int Element::clientHeight()
+double Element::clientHeight()
 {
     document().updateLayoutIgnorePendingStylesheets();
 
@@ -776,14 +790,14 @@ int Element::clientHeight()
 
     if (RenderBox* renderer = renderBox())
 #if ENABLE(SUBPIXEL_LAYOUT)
-        return adjustLayoutUnitForAbsoluteZoom(renderer->pixelSnappedClientHeight(), *renderer).round();
+        return convertToNonSubpixelValueIfNeeded(adjustLayoutUnitForAbsoluteZoom(renderer->clientHeight(), *renderer).toDouble(), renderer->document());
 #else
-        return adjustForAbsoluteZoom(renderer->pixelSnappedClientHeight(), *renderer);
+        return adjustForAbsoluteZoom(renderer->clientHeight(), *renderer);
 #endif
     return 0;
 }
 
-int Element::scrollLeft()
+double Element::scrollLeft()
 {
     document().updateLayoutIgnorePendingStylesheets();
 
@@ -792,7 +806,7 @@ int Element::scrollLeft()
     return 0;
 }
 
-int Element::scrollTop()
+double Element::scrollTop()
 {
     document().updateLayoutIgnorePendingStylesheets();
 
@@ -801,29 +815,29 @@ int Element::scrollTop()
     return 0;
 }
 
-void Element::setScrollLeft(int newLeft)
+void Element::setScrollLeft(double newLeft)
 {
     document().updateLayoutIgnorePendingStylesheets();
 
     if (RenderBox* renderer = renderBox()) {
-        renderer->setScrollLeft(static_cast<int>(newLeft * renderer->style().effectiveZoom()));
+        renderer->setScrollLeft(round(newLeft * renderer->style().effectiveZoom()));
         if (auto* scrollableArea = renderer->layer())
             scrollableArea->setScrolledProgrammatically(true);
     }
 }
 
-void Element::setScrollTop(int newTop)
+void Element::setScrollTop(double newTop)
 {
     document().updateLayoutIgnorePendingStylesheets();
 
     if (RenderBox* renderer = renderBox()) {
-        renderer->setScrollTop(static_cast<int>(newTop * renderer->style().effectiveZoom()));
+        renderer->setScrollTop(round(newTop * renderer->style().effectiveZoom()));
         if (auto* scrollableArea = renderer->layer())
             scrollableArea->setScrolledProgrammatically(true);
     }
 }
 
-int Element::scrollWidth()
+double Element::scrollWidth()
 {
     document().updateLayoutIgnorePendingStylesheets();
     if (RenderBox* rend = renderBox())
@@ -831,7 +845,7 @@ int Element::scrollWidth()
     return 0;
 }
 
-int Element::scrollHeight()
+double Element::scrollHeight()
 {
     document().updateLayoutIgnorePendingStylesheets();
     if (RenderBox* rend = renderBox())
index 07ea684..a4cee01 100644 (file)
@@ -206,26 +206,26 @@ public:
     void scrollByLines(int lines);
     void scrollByPages(int pages);
 
-    int offsetLeft();
-    int offsetTop();
-    int offsetWidth();
-    int offsetHeight();
+    double offsetLeft();
+    double offsetTop();
+    double offsetWidth();
+    double offsetHeight();
 
     // FIXME: Replace uses of offsetParent in the platform with calls
     // to the render layer and merge bindingsOffsetParent and offsetParent.
     Element* bindingsOffsetParent();
 
     Element* offsetParent();
-    int clientLeft();
-    int clientTop();
-    int clientWidth();
-    int clientHeight();
-    virtual int scrollLeft();
-    virtual int scrollTop();
-    virtual void setScrollLeft(int);
-    virtual void setScrollTop(int);
-    virtual int scrollWidth();
-    virtual int scrollHeight();
+    double clientLeft();
+    double clientTop();
+    double clientWidth();
+    double clientHeight();
+    virtual double scrollLeft();
+    virtual double scrollTop();
+    virtual void setScrollLeft(double);
+    virtual void setScrollTop(double);
+    virtual double scrollWidth();
+    virtual double scrollHeight();
 
     IntRect boundsInRootViewSpace();
 
index cf1d414..8bfb7b0 100644 (file)
 
     // Common extensions
 
+#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
     readonly attribute long offsetLeft;
     readonly attribute long offsetTop;
     readonly attribute long offsetWidth;
     readonly attribute long offsetHeight;
-    [ImplementedAs=bindingsOffsetParent] readonly attribute Element offsetParent;
     readonly attribute long clientLeft;
     readonly attribute long clientTop;
     readonly attribute long clientWidth;
     attribute long scrollTop;
     readonly attribute long scrollWidth;
     readonly attribute long scrollHeight;
+#else
+    readonly attribute double offsetLeft;
+    readonly attribute double offsetTop;
+    readonly attribute double offsetWidth;
+    readonly attribute double offsetHeight;
+    readonly attribute double clientLeft;
+    readonly attribute double clientTop;
+    readonly attribute double clientWidth;
+    readonly attribute double clientHeight;
+    attribute double scrollLeft;
+    attribute double scrollTop;
+    readonly attribute double scrollWidth;
+    readonly attribute double scrollHeight;
+#endif
+
+    [ImplementedAs=bindingsOffsetParent] readonly attribute Element offsetParent;
 
     void focus();
     void blur();
index d0412e6..c1bcfbc 100644 (file)
@@ -198,18 +198,18 @@ bool HTMLBodyElement::supportsFocus() const
     return hasEditableStyle() || HTMLElement::supportsFocus();
 }
 
-static int adjustForZoom(int value, Frame& frame)
+static double adjustForZoom(int value, const Frame& frame)
 {
-    float zoomFactor = frame.pageZoomFactor() * frame.frameScaleFactor();
+    double zoomFactor = frame.pageZoomFactor() * frame.frameScaleFactor();
     if (zoomFactor == 1)
         return value;
     // Needed because of truncation (rather than rounding) when scaling up.
     if (zoomFactor > 1)
         value++;
-    return static_cast<int>(value / zoomFactor);
+    return value / zoomFactor;
 }
 
-int HTMLBodyElement::scrollLeft()
+double HTMLBodyElement::scrollLeft()
 {
     document().updateLayoutIgnorePendingStylesheets();
     Frame* frame = document().frame();
@@ -218,10 +218,10 @@ int HTMLBodyElement::scrollLeft()
     FrameView* view = frame->view();
     if (!view)
         return 0;
-    return adjustForZoom(view->contentsScrollPosition().x(), *frame);
+    return floor(adjustForZoom(view->contentsScrollPosition().x(), *frame));
 }
 
-void HTMLBodyElement::setScrollLeft(int scrollLeft)
+void HTMLBodyElement::setScrollLeft(double scrollLeft)
 {
     document().updateLayoutIgnorePendingStylesheets();
     Frame* frame = document().frame();
@@ -233,7 +233,7 @@ void HTMLBodyElement::setScrollLeft(int scrollLeft)
     view->setScrollPosition(IntPoint(static_cast<int>(scrollLeft * frame->pageZoomFactor() * frame->frameScaleFactor()), view->scrollY()));
 }
 
-int HTMLBodyElement::scrollTop()
+double HTMLBodyElement::scrollTop()
 {
     document().updateLayoutIgnorePendingStylesheets();
     Frame* frame = document().frame();
@@ -242,10 +242,10 @@ int HTMLBodyElement::scrollTop()
     FrameView* view = frame->view();
     if (!view)
         return 0;
-    return adjustForZoom(view->contentsScrollPosition().y(), *frame);
+    return floor(adjustForZoom(view->contentsScrollPosition().y(), *frame));
 }
 
-void HTMLBodyElement::setScrollTop(int scrollTop)
+void HTMLBodyElement::setScrollTop(double scrollTop)
 {
     document().updateLayoutIgnorePendingStylesheets();
     Frame* frame = document().frame();
@@ -257,7 +257,7 @@ void HTMLBodyElement::setScrollTop(int scrollTop)
     view->setScrollPosition(IntPoint(view->scrollX(), static_cast<int>(scrollTop * frame->pageZoomFactor() * frame->frameScaleFactor())));
 }
 
-int HTMLBodyElement::scrollHeight()
+double HTMLBodyElement::scrollHeight()
 {
     // Update the document's layout.
     document().updateLayoutIgnorePendingStylesheets();
@@ -267,10 +267,10 @@ int HTMLBodyElement::scrollHeight()
     FrameView* view = frame->view();
     if (!view)
         return 0;
-    return adjustForZoom(view->contentsHeight(), *frame);
+    return floor(adjustForZoom(view->contentsHeight(), *frame));
 }
 
-int HTMLBodyElement::scrollWidth()
+double HTMLBodyElement::scrollWidth()
 {
     // Update the document's layout.
     document().updateLayoutIgnorePendingStylesheets();
@@ -280,7 +280,7 @@ int HTMLBodyElement::scrollWidth()
     FrameView* view = frame->view();
     if (!view)
         return 0;
-    return adjustForZoom(view->contentsWidth(), *frame);
+    return floor(adjustForZoom(view->contentsWidth(), *frame));
 }
 
 void HTMLBodyElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const
index 440bd06..405a52e 100644 (file)
@@ -69,14 +69,14 @@ private:
     
     virtual bool supportsFocus() const override;
 
-    virtual int scrollLeft() override;
-    virtual void setScrollLeft(int scrollLeft) override;
+    virtual double scrollLeft() override;
+    virtual void setScrollLeft(double) override;
     
-    virtual int scrollTop() override;
-    virtual void setScrollTop(int scrollTop) override;
+    virtual double scrollTop() override;
+    virtual void setScrollTop(double) override;
     
-    virtual int scrollHeight() override;
-    virtual int scrollWidth() override;
+    virtual double scrollHeight() override;
+    virtual double scrollWidth() override;
     
     virtual void addSubresourceAttributeURLs(ListHashSet<URL>&) const override;
 };
index 2202e01..e3c79b2 100644 (file)
@@ -194,6 +194,8 @@ minimumZoomFontSize type=float, initial=15, conditional=IOS_TEXT_AUTOSIZING
 simpleLineLayoutEnabled initial=true, setNeedsStyleRecalcInAllFrames=1
 simpleLineLayoutDebugBordersEnabled initial=false, setNeedsStyleRecalcInAllFrames=1
 
+subpixelCSSOMElementMetricsEnabled initial=true
+
 mediaSourceEnabled initial=true, conditional=MEDIA_SOURCE
 
 # FIXME: Rename to allowMultiElementImplicitFormSubmission once we upstream the iOS changes to WebView.mm.
index 8726e4d..e9af724 100644 (file)
@@ -1,3 +1,34 @@
+2014-05-14  Zalan Bujtas  <zalan@apple.com>
+
+        Subpixel layout: Change Element.offset* client* scroll* return type to double.
+        https://bugs.webkit.org/show_bug.cgi?id=132895
+
+        Reviewed by Simon Fraser.
+
+        This patch changes Element.offset*, Element.client* and Element.scroll* APIs return
+        type from long to double to match the latest CSSOM View Module spec[1].
+        Element.offset* and Element.client* do return subpixel values from now on.
+        Element.scroll* still return integral values as the scrolling code hasn't adopted to subpixel rendering yet.
+
+        subpixelCSSOMElementMetricsEnabled setting is added to be able to turn this feature on/off
+        from WK2 preferences. It toggles the return value from subpixel to floored integral.
+        It does not change layout/rendering behavior.
+
+        Reference list of what other browsers do:
+        IE: http://blogs.msdn.com/b/ie/archive/2012/02/17/sub-pixel-rendering-and-the-css-object-model.aspx
+        Blink: http://www.chromestatus.com/features/5497402177880064
+        Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=825607
+
+        [1] http://www.w3.org/TR/2013/WD-cssom-view-20131217/
+
+        * Shared/WebPreferencesStore.h:
+        * UIProcess/API/C/WKPreferences.cpp:
+        (WKPreferencesSetSubpixelCSSOMElementMetricsEnabled):
+        (WKPreferencesGetSubpixelCSSOMElementMetricsEnabled):
+        * UIProcess/API/C/WKPreferencesRefPrivate.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::updatePreferences):
+
 2014-05-14  Benjamin Poulain  <bpoulain@apple.com>
 
         [iOS][WK2] Expose the viewport meta tag width on the UIProcess
index 32620ab..fa08b00 100644 (file)
@@ -203,6 +203,7 @@ namespace WebKit {
     macro(ThreadedScrollingEnabled, threadedScrollingEnabled, Bool, bool, true) \
     macro(SimpleLineLayoutEnabled, simpleLineLayoutEnabled, Bool, bool, true) \
     macro(SimpleLineLayoutDebugBordersEnabled, simpleLineLayoutDebugBordersEnabled, Bool, bool, false) \
+    macro(SubpixelCSSOMElementMetricsEnabled, subpixelCSSOMElementMetricsEnabled, Bool, bool, true) \
     macro(BackgroundShouldExtendBeyondPage, backgroundShouldExtendBeyondPage, Bool, bool, false) \
     macro(MediaStreamEnabled, mediaStreamEnabled, Bool, bool, false) \
     macro(UseLegacyTextAlignPositionedElementBehavior, useLegacyTextAlignPositionedElementBehavior, Bool, bool, false) \
index 6a3831f..152a9e4 100644 (file)
@@ -1186,6 +1186,16 @@ bool WKPreferencesGetSimpleLineLayoutDebugBordersEnabled(WKPreferencesRef prefer
     return toImpl(preferencesRef)->simpleLineLayoutDebugBordersEnabled();
 }
 
+void WKPreferencesSetSubpixelCSSOMElementMetricsEnabled(WKPreferencesRef preferencesRef, bool flag)
+{
+    toImpl(preferencesRef)->setSubpixelCSSOMElementMetricsEnabled(flag);
+}
+
+bool WKPreferencesGetSubpixelCSSOMElementMetricsEnabled(WKPreferencesRef preferencesRef)
+{
+    return toImpl(preferencesRef)->subpixelCSSOMElementMetricsEnabled();
+}
+
 void WKPreferencesSetMediaStreamEnabled(WKPreferencesRef preferencesRef, bool enabled)
 {
     toImpl(preferencesRef)->setMediaStreamEnabled(enabled);
index 3200cb2..8ac6902 100644 (file)
@@ -296,6 +296,10 @@ WK_EXPORT bool WKPreferencesGetSimpleLineLayoutEnabled(WKPreferencesRef);
 WK_EXPORT void WKPreferencesSetSimpleLineLayoutDebugBordersEnabled(WKPreferencesRef, bool);
 WK_EXPORT bool WKPreferencesGetSimpleLineLayoutDebugBordersEnabled(WKPreferencesRef);
 
+// Defaults to true.
+WK_EXPORT void WKPreferencesSetSubpixelCSSOMElementMetricsEnabled(WKPreferencesRef, bool);
+WK_EXPORT bool WKPreferencesGetSubpixelCSSOMElementMetricsEnabled(WKPreferencesRef);
+
 WK_EXPORT void WKPreferencesResetTestRunnerOverrides(WKPreferencesRef preferencesRef);
 
 // Defaults to false.
index 87fb6e7..81073eb 100644 (file)
@@ -2688,6 +2688,8 @@ void WebPage::updatePreferences(const WebPreferencesStore& store)
     settings.setSimpleLineLayoutEnabled(store.getBoolValueForKey(WebPreferencesKey::simpleLineLayoutEnabledKey()));
     settings.setSimpleLineLayoutDebugBordersEnabled(store.getBoolValueForKey(WebPreferencesKey::simpleLineLayoutDebugBordersEnabledKey()));
 
+    settings.setSubpixelCSSOMElementMetricsEnabled(store.getBoolValueForKey(WebPreferencesKey::subpixelCSSOMElementMetricsEnabledKey()));
+
     settings.setUseLegacyTextAlignPositionedElementBehavior(store.getBoolValueForKey(WebPreferencesKey::useLegacyTextAlignPositionedElementBehaviorKey()));
 
 #if ENABLE(MEDIA_SOURCE)